diff --git a/.github/workflows/Deploy.yml b/.github/workflows/Deploy.yml index d11c614..88ad5cc 100644 --- a/.github/workflows/Deploy.yml +++ b/.github/workflows/Deploy.yml @@ -1,50 +1,30 @@ -name: Build and Deploy +name: Build and deploy + on: + schedule: + - cron: "0 */6 * * *" # Run every 6 hours + pull_request: push: branches: - - main - paths: - - 'website/**' + - master + tags: "*" + workflow_dispatch: + +permissions: + actions: write + contents: write + jobs: - build-and-deploy: + docs: + name: Documentation runs-on: ubuntu-latest steps: - - name: Checkout - uses: actions/checkout@v2 - with: - persist-credentials: false - # NOTE: Python is necessary for the pre-rendering (minification) step - - name: Install python - uses: actions/setup-python@v2 - with: - python-version: '3.8' - # NOTE: Here you can install dependencies such as matplotlib if you use - # packages such as PyPlot. - # - run: pip install matplotlib - - name: Install Julia - uses: julia-actions/setup-julia@v1 - with: - version: 1.8 - # NOTE - # The steps below ensure that NodeJS and Franklin are loaded then it - # installs highlight.js which is needed for the prerendering step - # (code highlighting + katex prerendering). - # Then the environment is activated and instantiated to install all - # Julia packages which may be required to successfully build your site. - # The last line should be `optimize()` though you may want to give it - # specific arguments, see the documentation or ?optimize in the REPL. - - run: julia -e ' - cd("website"); - using Pkg; Pkg.activate("."); Pkg.instantiate(); - using NodeJS; run(`$(npm_cmd()) install highlight.js`); - run(`$(npm_cmd()) install lunr`); - run(`$(npm_cmd()) install cheerio`); - using Franklin; - lunr(); - optimize()' - - name: Build and Deploy - uses: JamesIves/github-pages-deploy-action@releases/v3 - with: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - BRANCH: gh-pages - FOLDER: website/__site + - uses: actions/checkout@v4 + - uses: julia-actions/setup-julia@v2 + - uses: julia-actions/cache@v2 + - run: | + julia --project=docs -e 'using Pkg; Pkg.instantiate()' + - run: | + git config user.name github-actions + git config user.email github-actions@github.com + julia --project=docs docs/make.jl deploy diff --git a/.gitignore b/.gitignore index 96d1a7d..9a2eec8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ .DS_Store .vscode/ -.ipynb_checkpoints/ \ No newline at end of file +.ipynb_checkpoints/ +docs/build +docs/clones +*/Manifest.toml \ No newline at end of file diff --git a/JuliaHPC/Project.toml b/JuliaHPC/Project.toml new file mode 100644 index 0000000..1d458e0 --- /dev/null +++ b/JuliaHPC/Project.toml @@ -0,0 +1,4 @@ +name = "JuliaHPC" +uuid = "785f4173-1021-4a9f-a8d5-3f9e0cca329a" +authors = ["JamesWrigley "] +version = "0.1.0" diff --git a/JuliaHPC/src/JuliaHPC.jl b/JuliaHPC/src/JuliaHPC.jl new file mode 100644 index 0000000..5bfda64 --- /dev/null +++ b/JuliaHPC/src/JuliaHPC.jl @@ -0,0 +1,5 @@ +module JuliaHPC + +greet() = print("Hello World!") + +end # module JuliaHPC diff --git a/website/LICENSE.md b/LICENSE.md similarity index 100% rename from website/LICENSE.md rename to LICENSE.md diff --git a/docs/Project.toml b/docs/Project.toml new file mode 100644 index 0000000..adce583 --- /dev/null +++ b/docs/Project.toml @@ -0,0 +1,4 @@ +[deps] +Documenter = "e30172f5-a6a5-5a46-863b-614d45cd2de4" +LiveServer = "16fef848-5104-11e9-1b77-fb7a48bbb589" +MultiDocumenter = "87ed4bf0-c935-4a67-83c3-2a03bee4197c" diff --git a/docs/make.jl b/docs/make.jl new file mode 100644 index 0000000..1aa0ce8 --- /dev/null +++ b/docs/make.jl @@ -0,0 +1,116 @@ +import Documenter +import MultiDocumenter + +clonedir = joinpath(@__DIR__, "clones") +deploying = "deploy" in ARGS + +# Build local docs +Documenter.makedocs( + sitename = "JuliaHPC", + pages = [ + "index.md", + "For Users" => [ + "user_gettingstarted.md", + "user_vscode.md", + "user_hpcprofiling/index.md", + "user_hpcsystems.md", + "user_faq.md" + ], + "For System Admins" => [ + "sysadmin_julia.md" + ] + ], + format = Documenter.HTML(assets = ["assets/favicon.ico"]) +) + +# Helper function stolen from DynamicalSystemsDocs.jl +function multidocref(package, descr = "") + name = "$(package).jl" + + MultiDocumenter.MultiDocRef(; + upstream = joinpath(clonedir, package), + path = lowercase(package), + name = isempty(descr) ? "$(name)" : "$(name) - $(descr)", + giturl = "https://github.com/JuliaParallel/$(name).git", + ) +end + +link(package) = MultiDocumenter.Link("$(package).jl", "https://github.com/JuliaParallel/$(package).jl") + +docs = [ + MultiDocumenter.MultiDocRef( + upstream = joinpath(@__DIR__, "build"), + path = "Overview", + name = "Home", + fix_canonical_url = false,), + MultiDocumenter.DropdownNav("HPC packages", [ + multidocref("MPI", "Julia bindings to MPI"), + multidocref("Dagger", "DAG-based computing"), + MultiDocumenter.MultiDocRef(; + upstream = joinpath(clonedir, "ParallelProcessingTools"), + path = "parallelprocessingtools", + name = "ParallelProcessingTools.jl - Utilities for doing parallel/distributed computing", + giturl = "https://github.com/oschulz/ParallelProcessingTools.jl.git") + ]), + MultiDocumenter.MegaDropdownNav("Distributed packages", [ + MultiDocumenter.Column("Implementations", [ + MultiDocumenter.Link("Distributed.jl - Stdlib for distributed computing", "https://docs.julialang.org/en/v1/stdlib/Distributed/"), + multidocref("DistributedNext", "Bleeding-edge fork of Distributed.jl") + ]), + MultiDocumenter.Column("Cluster managers", [ + link("SlurmClusterManager"), + link("MPIClusterManagers"), + link("ElasticClusterManager"), + link("LSFClusterManager") + ]) + ]) +] + +outpath = deploying ? mktempdir() : joinpath(@__DIR__, "build") + +MultiDocumenter.make( + outpath, + docs; + search_engine = MultiDocumenter.SearchConfig( + index_versions = ["stable"], + engine = MultiDocumenter.FlexSearch + ), + assets_dir = "docs/src/assets", + brand_image = MultiDocumenter.BrandImage("https://juliahpc.github.io", "assets/logo.png") +) + +if "deploy" in ARGS + @info "Deploying to GitHub" ARGS + gitroot = normpath(joinpath(@__DIR__, "..")) + run(`git pull`) + outbranch = "gh-pages" + has_outbranch = true + if !success(`git checkout $outbranch`) + has_outbranch = false + if !success(`git switch --orphan $outbranch`) + @error "Cannot create new orphaned branch $outbranch." + exit(1) + end + end + for file in readdir(gitroot; join = true) + endswith(file, ".git") && continue + rm(file; force = true, recursive = true) + end + for file in readdir(outpath) + cp(joinpath(outpath, file), joinpath(gitroot, file)) + end + run(`git add .`) + if success(`git commit -m 'Aggregate documentation'`) + @info "Pushing updated documentation." + if has_outbranch + run(`git push`) + else + run(`git push -u origin $outbranch`) + end + run(`git checkout master`) + else + @info "No changes to aggregated documentation." + end +else + @info "Skipping deployment, 'deploy' not passed. Generated files in $(outpath)." ARGS +end diff --git a/docs/src/assets/favicon.ico b/docs/src/assets/favicon.ico new file mode 100644 index 0000000..ff5be63 Binary files /dev/null and b/docs/src/assets/favicon.ico differ diff --git a/website/user_hpcprofiling/likwid.png b/docs/src/assets/likwid.png similarity index 100% rename from website/user_hpcprofiling/likwid.png rename to docs/src/assets/likwid.png diff --git a/docs/src/assets/logo.png b/docs/src/assets/logo.png new file mode 100644 index 0000000..ee40a9a Binary files /dev/null and b/docs/src/assets/logo.png differ diff --git a/website/user_hpcprofiling/nsys.png b/docs/src/assets/nsys.png similarity index 100% rename from website/user_hpcprofiling/nsys.png rename to docs/src/assets/nsys.png diff --git a/website/user_hpcprofiling/paraver_1.jpg b/docs/src/assets/paraver_1.jpg similarity index 100% rename from website/user_hpcprofiling/paraver_1.jpg rename to docs/src/assets/paraver_1.jpg diff --git a/website/user_hpcprofiling/paraver_2.gif b/docs/src/assets/paraver_2.gif similarity index 100% rename from website/user_hpcprofiling/paraver_2.gif rename to docs/src/assets/paraver_2.gif diff --git a/website/user_hpcprofiling/scorep_cube.png b/docs/src/assets/scorep_cube.png similarity index 100% rename from website/user_hpcprofiling/scorep_cube.png rename to docs/src/assets/scorep_cube.png diff --git a/website/user_hpcprofiling/scorep_vampir.png b/docs/src/assets/scorep_vampir.png similarity index 100% rename from website/user_hpcprofiling/scorep_vampir.png rename to docs/src/assets/scorep_vampir.png diff --git a/website/user_hpcprofiling/vtunes_saxpy_details.png b/docs/src/assets/vtunes_saxpy_details.png similarity index 100% rename from website/user_hpcprofiling/vtunes_saxpy_details.png rename to docs/src/assets/vtunes_saxpy_details.png diff --git a/website/user_hpcprofiling/vtunes_saxpy_remoteusage.png b/docs/src/assets/vtunes_saxpy_remoteusage.png similarity index 100% rename from website/user_hpcprofiling/vtunes_saxpy_remoteusage.png rename to docs/src/assets/vtunes_saxpy_remoteusage.png diff --git a/website/user_hpcprofiling/vtunes_saxpy_summary.png b/docs/src/assets/vtunes_saxpy_summary.png similarity index 100% rename from website/user_hpcprofiling/vtunes_saxpy_summary.png rename to docs/src/assets/vtunes_saxpy_summary.png diff --git a/docs/src/index.md b/docs/src/index.md new file mode 100644 index 0000000..71685b2 --- /dev/null +++ b/docs/src/index.md @@ -0,0 +1,24 @@ +# Julia on HPC clusters + +👋 Welcome to the notes about the [Julia programming +language](http://www.julialang.org/) on HPC clusters. + +## Objective +The goal of these notes is to offer good practices and tips and tricks about how +to use and set up Julia on HPC clusters. The target audiences are therefore +Julia users on clusters as well as HPC system administrators (see the respective +sections in the navigation bar on the left). + +## Acknowledgements + +These notes don't come out of nowhere but stem from endless conversations with +many people on the Julia discourse, over Slack and Discord, as well as in-person +discussions at Julia HPC minisymposia, BoFs, and workshops. + +They also build upon previous efforts to document best practices, most notably +[https://github.com/hlrs-tasc/julia-on-hpc-systems/](https://github.com/hlrs-tasc/julia-on-hpc-systems/), +from which we took (among other things) the [HPC systems with Julia +support](user_hpcsystems.md) information. + +The creator and main author is [Carsten Bauer](https://github.com/carstenbauer) +but many members of the Julia HPC community have made valuable contributions. diff --git a/docs/src/sysadmin_julia.md b/docs/src/sysadmin_julia.md new file mode 100644 index 0000000..5ac8ff2 --- /dev/null +++ b/docs/src/sysadmin_julia.md @@ -0,0 +1,218 @@ +# Admin: How to provide Julia to users? + +## Providing Julia itself + +It is generally best to just provide the regular, pre-built Julia binaries from +[https://julialang.org/downloads/](https://julialang.org/downloads/). They work +and are efficient. + +You might be tempted to build Julia from source but this is almost never +necessary or advantageous (and can be cumbersome). The reason is pretty simple: +Julia is a compiler in itself and user code is therefore barely influenced by +how you compiled Julia. Hence, unless you know exactly what you're doing and +have a good reason in mind, the pre-built binaries are the way to go. + +## Don't provide packages + +We strongly recommend against trying to provide Julia packages (e.g. MPI.jl or +CUDA.jl) in a central fashion. There are a few important technical reasons but +the two most important reasons to **not** do it are conceptual + +1) It conflicts with the idea of local, self-contained Julia environments. +2) Packages evolve too quickly (i.e. your central depot is out of date pretty quickly). + +**Short explanation:** To have people use your centrally provided version of a package you would have to instruct them to not add that package to their (local) Julia environment as otherwise they'll very(!) likely get a different version of the package and will end up not using your central version to begin with. To make `using PackageX` still work, you would then have to adjust `JULIA_LOAD_PATH` appropriately. However, not only doesn't the user not get the version of `PackageX` that they potentially want/need, the local `Project.toml`/`Manifest.toml` would not even contain `PackageX` and therefore severely undermine self-containedness and reproducibility - one of the nicest properties of Julia projects. + +Generally speaking, there is also little reason to provide regular Julia packages in a central fashion in the first place. After all, most of them don't take up that much disk space and a little bit of redundancy is acceptable on modern HPC clusters. In this regard, note that all packages only get installed **once per user** - and not per project as is the case for python - since Julia installs packages to a user-central depot and reuses them across projects. + +## Providing global package preferences + +What you might want to do is to globally override binary dependencies of Julia +packages, so-called [Julia +artifacts](https://pkgdocs.julialang.org/v1/artifacts/) +([JLLs](https://github.com/JuliaBinaryWrappers)), such that users automatically +get redirected to system binaries under the hood. This is especially relevant if +vendor specific binaries (e.g. a Cray MPI library) are the only ones that +function properly on the HPC cluster. Below we describe how to realize this by +overriding package +[preferences](https://github.com/JuliaPackaging/Preferences.jl). However, note +that JLLs have the big advantage that they are convenient and work nicely +together. You should hence only override preferences if there is a good reason +for it. + + +### Example: MPI.jl and CUDA.jl + +In this example we show how to make MPI.jl automatically use a system OpenMPI +installation as well as make CUDA.jl use a system CUDA installation. The two +steps are pretty straightforward: + +1) Create a global `Project.toml` that sets the preferences of the target packages. +2) Append the path to the global `Project.toml` to `JULIA_LOAD_PATH` (for all users). + +According to the documentation of MPI.jl ([relevant +section](https://juliaparallel.org/MPI.jl/stable/configuration/#Notes-to-HPC-cluster-administrators)) +and CUDA.jl ([relevant +section](https://cuda.juliagpu.org/stable/installation/overview/#Using-a-local-CUDA)) +the preferences that we need to modify are actually not in MPI.jl or CUDA.jl but +rather in MPIPreferences.jl and CUDA\_Runtime\_jll.jl. We thus create a +`Project.toml` like below: + +``` +[extras] +MPIPreferences = "3da0fdf6-3ccc-4f1b-acd9-58baa6c99267" +CUDA_Runtime_jll = "76a88914-d11a-5bdc-97e0-2f5a05c973a2" + +[preferences.MPIPreferences] +_format = "1.0" +abi = "OpenMPI" +binary = "system" +libmpi = "libmpi" +mpiexec = "mpiexec" + +[preferences.CUDA_Runtime_jll] +local = "true" +version = "11.7" +``` + +!!! note + + Tip: To obtain the correct preferences blocks you can use + `MPIPreferences.use_system_binary()` and `CUDA.set_runtime_version!(v"11.7"; + local_toolkit=true)` respectively. This will create the relevant blocks in a + `LocalPreferences.toml` file. The only thing you need to adjust is the block + header, e.g. `MPIPreferences` -> `preferences.MPIPreferences`. + +The only thing we then have to do is to append the path to this file to the +`JULIA_LOAD_PATH`. The way to do it is as follows: `export +JULIA_LOAD_PATH=:/path/to/projectoml/`. Note the critical colon (`:`) here which +implies *appending* rather than overwriting. + +### Providing everything in form of a Lmod module + +Since every user should get the modified `JULIA_LOAD_PATH` above, the +environment variable should best be set directly in the Lmod module that also +provides the Julia binaries as well as the MPI and CUDA installations we're +pointing to. This way, any user who loads the module and then adds MPI.jl and +CUDA.jl to one of their environments (i.e. `] add MPI CUDA`) will automatically +use the system MPI and system CUDA under the hood without having to do anything +else. That is to say that the global preference system is *opt-out* (the user +can always override the global preferences with local preferences, e.g. via a +`LocalPreferences.toml`, on a per-project basis). + +**Side note:** Speaking of setting environment variables in the module file, it +is recommended to set `JULIA_CUDA_MEMORY_POOL=none` to disable the [memory +pool](https://cuda.juliagpu.org/stable/usage/memory/#Memory-pool) that CUDA.jl +uses by default. This is particularly advisable when you use a system CUDA due +to incompatibility with certain CUDA APIs. + +!!! note + You might want to check out + [JuliaHPC_Installer](https://git.uni-paderborn.de/pc2-public/juliahpc_installer) + which is a Julia script that automates the installation of a new Julia + version via easybuild, including the global `Project.toml` setup discussed + above. It is used on [Noctua + 2](https://pc2.uni-paderborn.de/hpc-services/available-systems/noctua2) at + [PC2](https://pc2.uni-paderborn.de/). However, it is currently not portable + out of the box (since e.g. paths are hardcoded). + + +### Checking that things work es expected +To check that things are working you can `] add MPI CUDA` and then run +`CUDA.runtime_version()` and `CUDA.versioninfo()` which should give the version +of the system CUDA and say "local installation", respectively: +``` +julia> using CUDA + +julia> CUDA.runtime_version() +v"11.7.0" + +julia> CUDA.versioninfo() +CUDA runtime 11.7, local installation +CUDA driver 12.1 +NVIDIA driver 530.30.2 + +[...] +``` + +Similarly, you can use `MPI.identify_implementation()` and +`MPI.MPIPreferences.binary` which should show the version of the system MPI as +well as "system", respectively: + +``` +julia> using MPI + +julia> MPI.identify_implementation() +("OpenMPI", v"4.1.4") + +julia> MPI.MPIPreferences.binary +"system" +``` + +## Supporting Visual Studio Code + +One of the key features of Julia is that it is inherently dynamic. Users might +thus likely want to use Julia interactively and remotely on your HPC +cluster. One way to do so is through [VS Code](https://code.visualstudio.com/), +specifically via the [Julia VS Code +extension](https://www.julia-vscode.org/). The extension really only needs one +thing to work: the `julia` binary. However, if you provide Julia as a module, +this binary is only available if this module is already loaded (which it isn't +if the user just connects to the cluster via [Remote - +SSH](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh)). + +A good solution to this problem is to provide a script (e.g. called +`julia_vscode`), which serves as an in-place replacement for `julia` but takes +care of the module loading first (see below). + +```shell +#!/bin/bash +# Example script `julia_vscode` used on Noctua 2 at PC2 +# The Julia module used below is called "lang/JuliaHPC" +# Author: Carsten Bauer + +# ------ Set up the module system (HPC system specific) ------ +export MODULEPATH=/etc/modulefiles:/usr/share/modulefiles || : +source /usr/share/lmod/lmod/init/profile +if [ -f "/opt/software/pc2/lmod/modules/DefaultModules.lua" ];then + export MODULEPATH="$MODULEPATH:/opt/software/pc2/lmod/modules" + export LMOD_SYSTEM_DEFAULT_MODULES="DefaultModules" +else + if [ -f "/usr/share/modulefiles/StdEnv.lua" ];then + export LMOD_SYSTEM_DEFAULT_MODULES="StdEnv" + fi +fi +module --initial_load restore +# ------------------------------------------------------------ + +# Load a specific Julia module +module load lang/JuliaHPC/1.9.1-foss-2022a-CUDA-11.7.0 + +# Start Julia and pass on all command-line arguments +exec julia "${@}" +``` + +At PC2 such a script is provided for every Julia version / Julia module (see +[JuliaHPC_Installer](https://git.uni-paderborn.de/pc2-public/juliahpc_installer)) +as well as a generic one that only contains `module load lang/JuliaHPC` (without +a version number) and thus always loads the latest Julia module. + +## Potentially useful resources + +* [JuliaHPC_Installer](https://git.uni-paderborn.de/pc2-public/juliahpc_installer) + by [Carsten Bauer](https://carstenbauer.eu): a Julia script that automates the + installation of a new Julia version via easybuild, including the global + `Project.toml` setup discussed above. It is used on [Noctua + 2](https://pc2.uni-paderborn.de/hpc-services/available-systems/noctua2) at + [PC2](https://pc2.uni-paderborn.de/). However, it is currently not portable + out of the box (since e.g. paths are hardcoded). +* [Johannes Blaschke](https://github.com/jblaschke) provides [scripts and + templates](https://gitlab.blaschke.science/nersc/julia/-/tree/main/modulefiles) + to set up modules file for Julia on some of NERSC's systems (warning: + potentially outdated?) +* [Samuel Omlin](https://github.com/omlins) and colleagues from CSCS provide + their [Easybuild configuration + files](https://github.com/eth-cscs/production/tree/master/easybuild/easyconfigs/j/Julia) + used for Piz Daint (warning: potentially outdated?) +* [csc-env-julia](https://github.com/CSCfi/csc-env-julia) provides Ansible + playbooks for installing Julia enviroment on CSC's HPC clusters. diff --git a/docs/src/user_faq.md b/docs/src/user_faq.md new file mode 100644 index 0000000..163c032 --- /dev/null +++ b/docs/src/user_faq.md @@ -0,0 +1,198 @@ +# FAQ + +Contents: +```@contents +Pages = ["user_faq.md"] +Depth = 5 +``` + +## Julia isn't available on my cluster. Can I install and use it (without root privileges)? + +Yes, absolutely. You **do not** need root privileges to install Julia and its +packages. However, often times it's better to put the Julia depot - the place +where packages, artifacts, and other things will be stored - on the parallel +file system rather than into `$HOME`. See the [Getting +Started](user_gettingstarted.md) section for more information. + +[⤴ _**back to Content**_](#FAQ) + +## Should I compile Julia from source? + +**No, you should not.** Use the pre-built binaries from the website or, +preferably, a corresponding Lmod module provided by the cluster +admins. Compiling Julia from source will generally **not** improve the +performance of your code (Julia is a compiler in itself) but may very well be +cumbersome. Unless you know what you're doing and have a very good reason +(e.g. creating a debug build with flags like `USE_INTEL_JITEVENTS=1`) you should +not compile Julia yourself. + +[⤴ _**back to Content**_](#FAQ) + +## Julia installed from juliaup not found in a non-interactive job + +The installation path of the `julia` executable will be added to your +`~/.bashrc` by [juliaup](https://github.com/JuliaLang/juliaup). If the job +scheduler does not load `.bashrc` in non-interactive jobs, you must use the full +path to `julia` in your job script. You can find out the full path by starting +the Julia REPL and typing `Sys.BINDIR`. By default, it should be +`~/.juliaup/bin/julia`. + +[⤴ _**back to Content**_](#FAQ) + +## Where should I put the Julia depot? + +Ideally, you should set `JULIA_DEPOT_PATH` to point to a place with the following properties: + +* good (parallel) I/O +* no tight quotas +* read and write access +* no automatic deletion of unused files (or otherwise you have to find a workaround) + +As a rule of thumb: Put the Julia depot on the parallel file system (typically `$SCRATCH`). + +[⤴ _**back to Content**_](#FAQ) + +## How should I start Julia within a job script? + +Assuming that SLURM is used on your HPC cluster, you should generally start +Julia under `srun`, e.g. `srun julia --project mycode.jl`. This is especially +important if your code is MPI-parallel, in which case `srun` is a replacement +for `mpirun`/`mpiexec`, but also recommended for serial code (there are at least +[a few reasons](https://stackoverflow.com/a/53640511/2365675)). + +Note that you can use the slim `mpiexecjl` wrapper from `MPI.jl` to use the +"correct" MPI driver automatically. + +[⤴ _**back to Content**_](#FAQ) + +## How can I force Julia to compile code for a heterogeneous cluster? + +Set +[`JULIA_CPU_TARGET`](https://docs.julialang.org/en/v1.10-dev/manual/environment-variables/#JULIA_CPU_TARGET) +to a value that is generic enough to cover all the types of CPUs that you're +targeting. You can get the CPU target name for the current system with +`Sys.CPU_NAME`. + +**Example:** `JULIA_CPU_TARGET="generic;skylake-avx512,clone_all;znver2,clone_all"`. + +This compiles all functions (`clone_all`) for Intel Skylake (`skylake-avx512`), +AMD Zen 2 (`znver2`), and a generic fallback (`generic`). + +For more information, see [this section of the Julia +documentation](https://docs.julialang.org/en/v1/manual/environment-variables/#JULIA_CPU_TARGET) +and [this section of the developer +documentation](https://docs.julialang.org/en/v1/devdocs/sysimg/#Specifying-multiple-system-image-targets). + +[⤴ _**back to Content**_](#FAQ) + +## Should I use Distributed.jl or MPI.jl for large-scale parallelism? + +While the Distributed standard library provides some convenient tools and has +its use cases you should generally use MPI.jl to scale your code up (e.g. to +thousands of compute nodes). Not only is MPI the established standard for +distributed computing in any programming language, it also makes use of fast +interconnects in HPC clusters (which the Distributed standard library currently +doesn't). + +[⤴ _**back to Content**_](#FAQ) + +## Should I use Julia artifacts (JLLs) or system software? + +If JLLs work fine for you then use them. JLLs have the big advantage that they +are convenient and, in many cases, "just work" out of the box. System software +can (but doesn't necessarily) give better performance but overriding the +relevant bits of JLLs can be cumbersome. Generally speaking, we recommend to +only manually replace JLL libraries by system software if JLLs don't work +(e.g. if a vendor specific MPI is required). However, in such a case it would be +even better to nudge the HPC admins and make this setup permanent and generally +available in form of a Julia Lmod module. + +[⤴ _**back to Content**_](#FAQ) + +## How to cope with a large number of MPI processes accessing the same Julia depot? + +In a distributed computing scenario with, e.g., multiple thousands of Julia +(MPI) processes, accessing the same Julia depot on a shared file system - when +loading packages and precompiled cache files on `using PackageX` - can become +(very) time consuming. A workaround is to bundle up the Julia depot (e.g. as a +`.tar.gz`), distribute it to the local node storage (if available) or local +memory (often times mounted as `/tmp`) of all assigned compute nodes, and then +set the `JULIA_DEPOT_PATH` accordingly. + +[⤴ _**back to Content**_](#FAQ) + + +## How to avoid `LD_LIBRARY_PATH` issues? + +When using Julia on a system that uses an environment-variable based module +system (such as [modules](https://github.com/cea-hpc/modules) or +[Lmod](https://github.com/TACC/Lmod)), the `LD_LIBRARY_PATH` variable might +be filled with entries pointing to different packages and libraries. This might (or might not) lead to +issues stemming from Julia loading libraries other than the ones packaged with +it. If you encounter such problems, make sure that Julia's `lib` directory is always the *first* directory in +`LD_LIBRARY_PATH`. + +One possibility to achieve this is to create a wrapper shell script that +modifies `LD_LIBRARY_PATH` before calling the Julia executable. Inspired by a +[script](https://github.com/UCL-RITS/rcps-buildscripts/blob/04b2e2ccfe7e195fd0396b572e9f8ff426b37f0e/files/julia/julia.sh) +from UCL's [Owain Kenway](https://github.com/owainkenwayucl): +```shell +#!/usr/bin/env bash + +# This wrapper makes sure the julia binary distributions picks up the GCC +# libraries provided with it correctly meaning that it does not rely on +# the gcc-libs version. + +# Dr Owain Kenway, 20th of July, 2021 +# Source: https://github.com/UCL-RITS/rcps-buildscripts/blob/04b2e2ccfe7e195fd0396b572e9f8ff426b37f0e/files/julia/julia.sh + +location=$(readlink -f $0) +directory=$(readlink -f $(dirname ${location})/..) + +export LD_LIBRARY_PATH=${directory}/lib/julia:${LD_LIBRARY_PATH} +exec ${directory}/bin/julia "$@" +``` + +Note that using `readlink` might not be optimal from a performance perspective +if used in a massively parallel environment. Alternatively, hard-code the Julia +path or set an environment variable accordingly. + +[⤴ _**back to Content**_](#FAQ) + +## Julia unexpectedly killed for exceeding the requested memory limit + +If a job has non-exclusive access to a node and has a memory limit that is lower +than the total memory of the node, set the `--heap-size-hint` command line +option to an appropriate value when starting Julia in the job script, +e.g. `julia --heap-size-hint=4G my_script.jl` if you have requested a memory +limit of 4G for running `my_script.jl`. This communicates the memory limit to +Julia's garbage collector to enable more aggressive garbage collection when the +memory limit is approached. + +[⤴ _**back to Content**_](#FAQ) + +## I get memory-related issues when using CUDA.jl on a HPC cluster + +Try setting `JULIA_CUDA_MEMORY_POOL=none` (see the [CUDA.jl +documentation](https://cuda.juliagpu.org/stable/usage/memory/#Memory-pool) for +more information). + +[⤴ _**back to Content**_](#FAQ) + +## Precompilation on a login node fails (`Resource temporarily unavailable`) + +By default, Julia uses many parallel tasks during precompilation. On the login +nodes of some HPC clusters, parallel processes might be subject to resource +restrictions. In these cases, you might want to set +[`JULIA_NUM_PRECOMPILE_TASKS`](https://docs.julialang.org/en/v1/manual/environment-variables/#JULIA_NUM_PRECOMPILE_TASKS) +to a low value, e.g. `export JULIA_NUM_PRECOMPILE_TASKS=1` (single task). + +[⤴ _**back to Content**_](#FAQ) + +## Can I precompile GPU code on a login node without a GPU? + +Yes, at least for CUDA.jl. See [this +part](https://cuda.juliagpu.org/stable/installation/overview/#Precompiling-CUDA.jl-without-CUDA) +of the CUDA.jl documentation. + +[⤴ _**back to Content**_](#FAQ) diff --git a/docs/src/user_gettingstarted.md b/docs/src/user_gettingstarted.md new file mode 100644 index 0000000..1bf6140 --- /dev/null +++ b/docs/src/user_gettingstarted.md @@ -0,0 +1,72 @@ +# Getting started + +Getting started with Julia on a new cluster can sometimes be a challenge. Below +we provide some common tips that will hopefully help you with your onboarding +process. + +## Use the regular Julia binaries or a Julia module (if available) + +When starting on a new HPC cluster the first thing you should do is figure out +if there is a pre-configured Julia module ([Lmod +module](https://lmod.readthedocs.io/en/latest/010_user.html)) available on the +cluster. To that end, `module key julia` or `module spider julia` might be +helpful commands. + +If there is no Julia module available that you can load, you should download and +use the regular, precompiled Julia binaries. We strongly recommend to use +[juliaup](https://github.com/JuliaLang/juliaup) for this. Alternatively, you can +also manually download the binaries directly [from the +website](https://julialang.org/downloads/). In any case, you should generally +**not** build Julia from source (unless you have a very good reason). + +Note that you **do not** need root privileges. Julia, and its packages, works +great without special permissions in user space. + +## Place the Julia depot on the parallel file system. + +One you have Julia installed and you can run `julia` from the command line, you +should place the Julia depot - the `.julia` folder where Julia stores all +dependencies, logs, etc. - on an appropriate file system. By default, it will be +stored in `$HOME/.julia`. This may or may not be a good choice, but more often +than not it isn't. + +You want to choose a file system with the following properties +* no tight quotas (at least >= 20 GB) +* read and write access (ideally also from compute nodes) +* good (parallel) I/O +* no automatic deletion of unused files (or otherwise you have to find a workaround) + +**On most clusters these criterion are best fit on a parallel file system (often +`$SCRATCH`).** In this case, you should put `JULIA_DEPOT_PATH=$SCRATCH/.julia` +into your `.bashrc` (and your job scripts if `.bashrc` is not loaded by +non-interactive jobs). + +!!! note + If the last point (automatic deletion of unused files) is an issue for you, + a pragmatic workaround could be a cronjob that touches all files in the + Julia depot every once in a while. + +## Set `JULIA_CPU_TARGET` appropriately. + +On many clusters, the sections above are all you need to get a solid Julia +setup. However, if you're on a **heterogeneous HPC cluster**, that is, if +different nodes have different CPU (micro-)architectures, you should/need to do +a few more preparations. Otherwise, you might encounter nasty error messages +like "`Illegal instruction`". + +To make Julia produce efficient code that works on different CPUs, you need to +set +[`JULIA_CPU_TARGET`](https://docs.julialang.org/en/v1.10-dev/manual/environment-variables/#JULIA_CPU_TARGET). For +example, if you want Julia to compile all functions (`clone_all`) for Intel +Skylake (`skylake-avx512`), AMD Zen 2 (`znver2`), and a generic fallback +(`generic`), for safety, you could put the following into your `.bashrc`: + +``` +export JULIA_CPU_TARGET="generic;skylake-avx512,clone_all;znver2,clone_all" +``` + +You can get the CPU target name for the current system with `Sys.CPU_NAME`. For +more information, see [this section of the Julia +documentation](https://docs.julialang.org/en/v1/manual/environment-variables/#JULIA_CPU_TARGET) +and [this section of the developer +documentation](https://docs.julialang.org/en/v1/devdocs/sysimg/#Specifying-multiple-system-image-targets). diff --git a/website/user_hpcprofiling/index.md b/docs/src/user_hpcprofiling/index.md similarity index 68% rename from website/user_hpcprofiling/index.md rename to docs/src/user_hpcprofiling/index.md index aca7df0..8040012 100644 --- a/website/user_hpcprofiling/index.md +++ b/docs/src/user_hpcprofiling/index.md @@ -1,37 +1,27 @@ -+++ -title = "HPC Profiling Tools" -hascode = true -literate_mds = true -showall = false -noeval = true -+++ - # HPC Profiling Tools -There are plenty of HPC tools for profiling out there. Figuring out which one is good in what scenario and, more importantly, which one actually works with Julia is non-trivial. This page will try to provide helpful orientation. - ---- - -\label{content} -**Content** - -\toc - ---- +There are plenty of HPC tools for profiling out there. Figuring out which one is +good in what scenario and, more importantly, which one actually works with Julia +is non-trivial. This page will try to provide helpful orientation. ## NVIDIA Nsight Systems Good for: GPU, MPI -[NVIDIA Nsight Systems](https://developer.nvidia.com/nsight-systems) is a powerful profiling tool for analyzing (multi-)GPU and/or MPI-parallel applications (the latter might be somewhat surprising). Especially useful when combined with [NVTX.jl](https://github.com/JuliaGPU/NVTX.jl) for manual instrumentation (you can name and even color sections of your code). +[NVIDIA Nsight Systems](https://developer.nvidia.com/nsight-systems) is a +powerful profiling tool for analyzing (multi-)GPU and/or MPI-parallel +applications (the latter might be somewhat surprising). Especially useful when +combined with [NVTX.jl](https://github.com/JuliaGPU/NVTX.jl) for manual +instrumentation (you can name and even color sections of your code). Examples: -* [Relevant section](https://cuda.juliagpu.org/stable/development/profiling/#NVIDIA-Nsight-Systems) of the [CUDA.jl](https://github.com/JuliaGPU/CUDA.jl) documentation +* [Relevant + section](https://cuda.juliagpu.org/stable/development/profiling/#NVIDIA-Nsight-Systems) + of the [CUDA.jl](https://github.com/JuliaGPU/CUDA.jl) documentation Impressions: - -![](/user_hpcprofiling/nsys.png) +![](../assets/nsys.png) ## Extrae @@ -45,9 +35,8 @@ Noteworthy limitations: * Only works on Linux. Impressions (of Paraver): - -![](/user_hpcprofiling/paraver_1.jpg) -![](/user_hpcprofiling/paraver_2.gif) +![](../assets/paraver_1.jpg) +![](../assets/paraver_2.gif) ## Score-P @@ -65,9 +54,9 @@ Examples: * Only works on Linux. Impressions (of Cube and Vampir): - -![](/user_hpcprofiling/scorep_cube.png) -![](/user_hpcprofiling/scorep_vampir.png) +f +![](../assets/scorep_cube.png) +![](../assets/scorep_vampir.png) ## LIKWID @@ -87,13 +76,18 @@ Examples: Impressions: -![](/user_hpcprofiling/likwid.png) +![](../assets/likwid.png) ## Intel VTune Profiler Good for: serial, multithreading, GC -The [Intel VTune Profiler](https://www.intel.com/content/www/us/en/developer/tools/oneapi/vtune-profiler.html) is a nice tool, e.g., for finding hot spots in your code. It supports local and remote performance profiling. To make it work with Julia check out [IntelITT.jl](https://github.com/JuliaPerf/IntelITT.jl) and our dedicated [Intel VTune + Julia](/user_hpcprofiling/intel_vtune/) page. +The [Intel VTune +Profiler](https://www.intel.com/content/www/us/en/developer/tools/oneapi/vtune-profiler.html) +is a nice tool, e.g., for finding hot spots in your code. It supports local and +remote performance profiling. To make it work with Julia check out +[IntelITT.jl](https://github.com/JuliaPerf/IntelITT.jl) and our dedicated [Intel +VTune + Julia](intel_vtune.md) page. Noteworthy limitations: @@ -103,12 +97,12 @@ Noteworthy limitations: Examples: -* [Intel VTune + Julia](/user_hpcprofiling/intel_vtune/) (e.g. remote usage via GUI) +* [Intel VTune + Julia](intel_vtune.md) (e.g. remote usage via GUI) * [Basic CLI Example](https://github.com/carstenbauer/julia-intelvtune) Impressions: -![](/user_hpcprofiling/vtunes_saxpy_details.png) +![](../assets/vtunes_saxpy_details.png) ## Other tools @@ -118,5 +112,3 @@ If you know something about the following tools, in particular if and how it sup * [MUST](https://www.i12.rwth-aachen.de/go/id/nrbe) (MPI runtime correctness analysis) * [PAPI](https://icl.utk.edu/papi/) / [PAPI.jl](https://github.com/JuliaPerf/PAPI.jl) (to be compared to LIKWID) * [HPCToolkit](http://hpctoolkit.org/index.html) - -[⤴ _**back to Content**_](#content) diff --git a/website/user_hpcprofiling/intel_vtune.md b/docs/src/user_hpcprofiling/intel_vtune.md similarity index 61% rename from website/user_hpcprofiling/intel_vtune.md rename to docs/src/user_hpcprofiling/intel_vtune.md index 7354e37..bbd3f70 100644 --- a/website/user_hpcprofiling/intel_vtune.md +++ b/docs/src/user_hpcprofiling/intel_vtune.md @@ -1,22 +1,5 @@ -+++ -title = "Intel VTune Profiler + Julia" -hascode = false -literate_mds = true -showall = false -noeval = true -+++ - # Intel VTune Profiler + Julia ---- - -\label{content} -**Content** - -\toc - ---- - ## General notes * You need to set `ENABLE_JITPROFILING=1`. @@ -26,7 +9,7 @@ noeval = true ### Example code -``` +```julia using ThreadPinning using IntelITT @@ -90,14 +73,20 @@ measure_membw(; pin=:numa, init=:parallel) ### Profiling via the GUI -* Make sure that you have **password-less SSH access** to the remote machine (e.g. compute node) that you want to profile on. In this example, the name of the remote machine is `gpu-0002`. - +* Make sure that you have **password-less SSH access** to the remote machine + (e.g. compute node) that you want to profile on. In this example, the name of + the remote machine is `gpu-0002`. * Start a new analysis. The "Configure Analysis" page should look similar to this: -![](/user_hpcprofiling/vtunes_saxpy_remoteusage.png) +![](../assets/vtunes_saxpy_remoteusage.png) * Comments - * The first time, you need to tell Intel VTune to install the necessary software tools for remote profiling via SSH. Just click on the "Deploy" button in the "Remote Linux (SSH)" tile (not shown). Afterwards, it should look as in the image above. - * I use a little wrapper script `julia_vtunes.sh` under application. It loads the Julia module on the cluster, sets `ENABLE_JITPROFILING=1`, and then starts `julia`. + * The first time, you need to tell Intel VTune to install the necessary + software tools for remote profiling via SSH. Just click on the "Deploy" + button in the "Remote Linux (SSH)" tile (not shown). Afterwards, it should + look as in the image above. + * I use a little wrapper script `julia_vtunes.sh` under application. It loads + the Julia module on the cluster, sets `ENABLE_JITPROFILING=1`, and then + starts `julia`. ```shell # julia_vtunes.sh @@ -108,29 +97,45 @@ measure_membw(; pin=:numa, init=:parallel) ``` * Wheter you use a julia wrapper or not, **you must set `ENABLE_JITPROFILING=1`**. - * In the screenshot above, I've selected "Hotpots" as the analysis type (right pane). It's likely what you want to use. + * In the screenshot above, I've selected "Hotpots" as the analysis type (right + pane). It's likely what you want to use. -* Once everything is configured, press either on "Start" (play button) or on "Start Paused" (play + pause button). I recommend to use "Start Paused" in conjuction with using [IntelITT.jl](https://github.com/JuliaPerf/IntelITT.jl), i.e. `IntelITT.resume()` and `IntelITT.pause()`, in your code. This way, you can already pre-select the code region that you actually care about. +* Once everything is configured, press either on "Start" (play button) or on + "Start Paused" (play + pause button). I recommend to use "Start Paused" in + conjuction with using [IntelITT.jl](https://github.com/JuliaPerf/IntelITT.jl), + i.e. `IntelITT.resume()` and `IntelITT.pause()`, in your code. This way, you + can already pre-select the code region that you actually care about. ### Results * Summary -![](/user_hpcprofiling/vtunes_saxpy_summary.png) +![](../assets/vtunes_saxpy_summary.png) * Top-down Tree -![](/user_hpcprofiling/vtunes_saxpy_details.png) +![](../assets/vtunes_saxpy_details.png) * Comments - * Due to how Julia works internally, your Julia functions appear with the prefix `julia_` and a suffix `_XX`, where `XX` is a unique number, in the call stack. For example, the Julia function `mysquare(x) = x^2` might appear as `julia_mysquare_89`. - * In the SAXPY example above, we use `@threads`, which, under the hood, [creates a function `threadsfor_fun`](https://github.com/JuliaLang/julia/blob/feb2988b3a21968410267378b910ce67726a51d8/base/threadingconstructs.jl#L169-L204) that will then get run (see the top-down tree above). Unfortunately, this can also cause problems like "cutting off" the call stack information as well as hindering source code resolution. - * Source code resolution (i.e. "View Source") didn't work for me remotely. However, it gives you the option to point to the source file locally. This worked fine. + * Due to how Julia works internally, your Julia functions appear with the + prefix `julia_` and a suffix `_XX`, where `XX` is a unique number, in the + call stack. For example, the Julia function `mysquare(x) = x^2` might appear + as `julia_mysquare_89`. + * In the SAXPY example above, we use `@threads`, which, under the hood, + [creates a function + `threadsfor_fun`](https://github.com/JuliaLang/julia/blob/feb2988b3a21968410267378b910ce67726a51d8/base/threadingconstructs.jl#L169-L204) + that will then get run (see the top-down tree above). Unfortunately, this + can also cause problems like "cutting off" the call stack information as + well as hindering source code resolution. + * Source code resolution (i.e. "View Source") didn't work for me + remotely. However, it gives you the option to point to the source file + locally. This worked fine. ## Command-line interface (CLI) Useful commands: -* Profiling: `ENABLE_JITPROFILING=1 vtune -collect hotspots -start-paused -- julia --project mycode.jl` +* Profiling: `ENABLE_JITPROFILING=1 vtune -collect hotspots -start-paused -- + julia --project mycode.jl` * Open the results in the GUI: `vtune-gui r000hs` * Generating text reports: @@ -140,4 +145,6 @@ vtune -report top-down -r r000hs > reports/top_down.report vtune -report callstacks -r r000hs > reports/callstacks.report ``` -Check out the [julia-intelvtune repository](https://github.com/carstenbauer/julia-intelvtune) by Carsten Bauer which contains a basic demonstration. \ No newline at end of file +Check out the [julia-intelvtune +repository](https://github.com/carstenbauer/julia-intelvtune) by Carsten Bauer +which contains a basic demonstration. diff --git a/website/user_hpcsystems.md b/docs/src/user_hpcsystems.md similarity index 93% rename from website/user_hpcsystems.md rename to docs/src/user_hpcsystems.md index 6bf607a..ae01b2f 100644 --- a/website/user_hpcsystems.md +++ b/docs/src/user_hpcsystems.md @@ -1,23 +1,10 @@ -+++ -title = "HPC systems with Julia support" -hascode = true -literate_mds = true -showall = false -noeval = true -+++ - # HPC systems with Julia support -\note{It is difficult to keep the table below up-to-date. It is also almost certainly incomplete. We rely on people like you, so please [update the table](https://github.com/JuliaHPC/JuliaOnHPCClusters/edit/main/website/user_hpcsystems.md) if you think something can be improved!} - ---- - -\label{content} -**Content** - -\toc - ---- +!!! note + It is difficult to keep the table below up-to-date. It is also almost + certainly incomplete. We rely on people like you, so please [update the + table](https://github.com/JuliaHPC/JuliaOnHPCClusters/edit/main/website/user_hpcsystems.md) + if you think something can be improved! ## Description We try to maintain an (incomplete) list of HPC systems that provide a @@ -58,7 +45,7 @@ Julia installation and/or support for using Julia to its users. For this, we use [PC2, U Paderborn](https://pc2.uni-paderborn.de/) | [Noctua 2](https://pc2.uni-paderborn.de/hpc-services/available-systems/noctua2) | ✅ | ✅ | ✅ | [AMD EPYC Milan](https://pc2.uni-paderborn.de/hpc-services/available-systems/noctua2) | [Nvidia Ampere A100](https://pc2.uni-paderborn.de/hpc-services/available-systems/noctua2), [Xilinx Alveo U280](https://pc2.uni-paderborn.de/hpc-services/available-systems/noctua2) | [1](https://upb-pc2.atlassian.net/wiki/spaces/PC2DOK/pages/1902093/Julia) [ULHPC, U Luxembourg](https://hpc.uni.lu/) | [Aion](https://hpc-docs.uni.lu/systems/aion/), [Iris](https://hpc-docs.uni.lu/systems/iris/) | ✅ | ? | ✅ | [AMD EPYC Rome](https://hpc-docs.uni.lu/systems/aion/) + [Intel Xeon Broadwell/Skylake](https://hpc-docs.uni.lu/systems/iris/) | [Nvidia Tesla V100](https://hpc-docs.uni.lu/systems/iris/) | [1](https://hpc-docs.uni.lu/software/maths/julia/) [ZDV, U Mainz](https://hpc-en.uni-mainz.de/) | [MOGON II](https://hpc-en.uni-mainz.de/high-performance-computing/systeme/) | ✅ | ? | ? | [Intel Xeon Broadwell + Skylake](https://hpc-en.uni-mainz.de/high-performance-computing/systeme/) | no | [1](https://mogonwiki.zdv.uni-mainz.de/dokuwiki/start:development:scripting_languages:julia) -[ZIB](https://www.zib.de/) | [HLRN-IV](https://www.hlrn.de/supercomputer-e/hlrn-iv-system/?lang=en) | ✅ | ✅ | ? | [Intel Cascade Lake AP]((https://www.hlrn.de/supercomputer-e/hlrn-iv-system/?lang=en)) |[Nvidia Ampere A100](https://www.izum.si/en/vega-en/) (but there is no Julia module available on those nodes) | [1](https://user.nhr.zib.de/wiki/spaces/PUB/pages/429360/Julia) +[ZIB](https://www.zib.de/) | [HLRN-IV](https://www.hlrn.de/supercomputer-e/hlrn-iv-system/?lang=en) | ✅ | ✅ | ? | [Intel Cascade Lake AP](https://www.hlrn.de/supercomputer-e/hlrn-iv-system/?lang=en) |[Nvidia Ampere A100](https://www.izum.si/en/vega-en/) (but there is no Julia module available on those nodes) | [1](https://user.nhr.zib.de/wiki/spaces/PUB/pages/429360/Julia) ### North America diff --git a/docs/src/user_vscode.md b/docs/src/user_vscode.md new file mode 100644 index 0000000..e3b767d --- /dev/null +++ b/docs/src/user_vscode.md @@ -0,0 +1,153 @@ +# Visual Studio Code on HPC Clusters + +VS Code is a very popular IDE with a great [Julia +extension](https://marketplace.visualstudio.com/items?itemName=julialang.language-julia) +([website](https://www.julia-vscode.org/)). Running it on a cluster typically +isn't straightforward and we want to highlight the most important steps here. + +## What does "Running VS Code on a cluster" actually mean? + +To be clear: What it **does not** mean is to have VS Code running locally and +using its terminal (at the bottom) the `ssh` to the cluster and running `julia` +on it. + +Instead, we want to connect VS Code to a little server component that will run +on the cluster. Hence, only the GUI will run locally and everything else will +run on the cluster. This includes VS Code extensions, like the Julia extension +and will eventually give us an integrated REPL, a debugger, a plot pane, etc., +all working remotely on the cluster. + +## Running VS Code on a login node (SSH) + +!!! note + We assume that the hostname of the cluster is `mycluster`. + +1. Make sure that you have password-less SSH access to the cluster (`ssh + mycluster` should bring you to the cluster). +1. In VS Code, press `F1` and run the `Remote-SSH: Open SSH Host...` command. + - If the command isn't available, make sure that [Remote - SSH + extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh) + is installed. +1. Enter `mycluster` and press enter. + +After a second or two, you should have VS Code running on a login node! 🎉 + +## Installing the Julia extension + +1) Open the extensions view (press `CTRL/CMD + SHIFT + X`). +2) Search for `julia`. +3) Click on `install`. + +## Making the Julia extension work + +Typically, the `julia` command is not directly available on a cluster but one +must load a Julia module first (e.g. `module load julia`). Unfortunately, the +Julia extension doesn't know about this, so we need to teach it. + +1) Prepare a Julia wrapper script (`julia_wrapper.sh`) like the following: + +```bash +#!/bin/bash + +# Making module command available +# ------------------------------------------------------------ +export MODULEPATH=/etc/modulefiles:/usr/share/modulefiles +export LMOD_SYSTEM_DEFAULT_MODULES="DefaultModules" +source /usr/share/lmod/lmod/init/profile +module --initial_load restore +# ------------------------------------------------------------ + +# Load julia +module load julia + +# Pass on all arguments to julia +exec julia "${@}" +``` + +Note the module name as well as (at least) the first two lines of the block that +makes the `module` command available are system specific and must be +adjusted. To figure our the latter, you may run the following in a shell on the +cluster: `echo $MODULEPATH` and `echo $LMOD_SYSTEM_DEFAULT_MODULES`. + +2. Make the wrapper script executable: `chmod +x julia_wrapper.sh` + +3. Check that it works: `./julia_wrapper.sh` should open the Julia REPL. + +Once the wrapper is ready and functional, we need to point the Julia extension to it. + +4. Open the VS Code Settings (press `CTRL/CMD + ,`). +5. Click on the tab `Remote [SSH: mycluster]`. +6. Search for `Julia executable`. +7. Insert `/path/to/julia_wrapper.sh` into the text field under `Julia: Executable Path`. + +If `ALT/OPTION + J` followed by `ALT/OPTION + O` (**or** pressing `F1` and +executing the `Julia: Start REPL` command) successfully spins up the integrated +Julia REPL, you know that the setup is working! 🎉 + +!!! note + If you want all the nice features of the Julia extension - + like inline evaluation, plotting, debugging, etc. - you need to use the + **integrated REPL** started by the shortcuts mentioned above. If you just type + `julia` in a terminal (at the bottom), the resulting REPL will **not** be + connected to the extension! + +## Can I run VS Code on a compute node? (SSH) + +Maybe. The first thing you need to check is whether it is at all possible for +you to connect to a compute node via SSH, as not all HPC centers allow +this. (Note that typically you can only `ssh` to compute nodes that are part of +a job that you have currently running.) + +Given that you can `ssh` to compute nodes, what you want to do next is add a +generic (wildcard) entry, that covers all compute nodes, to your +`.ssh/config`. Assuming that the hostnames of the compute nodes start with `cn` +(e.g. `cn1201` and `cn2134` etc.) and assuming that you already have a ssh +config entry for `mycluster`, this could look like this: + +``` +Host cn* + HostName %h + ProxyJump mycluster + User [USERNAME] + IdentityFile [PATH TO PRIVATE KEY] + IdentitiesOnly yes +``` + +Afterwards, you can use the following steps to run VS Code on a compute node: + +1. Open a terminal (outside of VS Code) +1. Login to the cluster (`ssh mycluster`) +1. Get an interactive session on a compute node (and write down the name of the + node that has been assigend to you, say, `cn1201`). +1. Follow the steps under [Running VS Code on a login node + (SSH)](#running-vs-code-on-a-login-node-ssh) above but replace the hostname + `mycluster` by the name of the compute node (e.g. `cn1201`). + + +## Running VS Code remotely via "remote tunnels" + +Microsoft provides ["Remote +tunnels"](https://code.visualstudio.com/docs/remote/tunnels) as an alternative +to SSH to connect VS Code to remote systems. + +**Pro** + +* Allows you to connect to any machine with internet access (including cluster + compute nodes that you can't ssh to!). + +**Con** + +* Requires a GitHub / Microsoft account. +* Microsoft serves as the tunnel provider (man in the middle). + +**How to do it?** + +1. Download the VS Code command line interface from + [https://code.visualstudio.com/Download](https://code.visualstudio.com/Download) + (search for **CLI**). +1. Copy the single `code` binary to the cluster (and put the directory on `PATH`). +1. Run `code tunnel --verbose` and follow the steps (to connect to your GitHub account). +1. Afterwards, open VS Code and install the [Remote - + Tunnels](https://marketplace.visualstudio.com/items?itemName=ms-vscode.remote-server) + extension. +1. Run the command `Remote-Tunnels: Connect to Tunnel...` and connect to the remote node. diff --git a/website/.gitignore b/website/.gitignore deleted file mode 100644 index 7447087..0000000 --- a/website/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -__site/ -.DS_Store -franklin -franklin.pub -node_modules/ -Manifest.toml diff --git a/website/.nojekyll b/website/.nojekyll deleted file mode 100644 index e69de29..0000000 diff --git a/website/404.md b/website/404.md deleted file mode 100644 index ea858b9..0000000 --- a/website/404.md +++ /dev/null @@ -1,5 +0,0 @@ -# 404: File not found - -The requested file was not found. - -Please [click here](/) to go to the home page. diff --git a/website/Project.toml b/website/Project.toml deleted file mode 100644 index 240a3f1..0000000 --- a/website/Project.toml +++ /dev/null @@ -1,5 +0,0 @@ -[deps] -Franklin = "713c75ef-9fc9-4b05-94a9-213340da978e" -Literate = "98b081ad-f1c9-55d3-8b20-4c87d4299306" -LiveServer = "16fef848-5104-11e9-1b77-fb7a48bbb589" -NodeJS = "2bd173c7-0d6d-553b-b6af-13a54713934c" diff --git a/website/README.md b/website/README.md deleted file mode 100644 index 3895a8d..0000000 --- a/website/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Julia On HPC Clusters website - -Visit it under [https://juliahpc.github.io/JuliaOnHPCClusters/](https://juliahpc.github.io/JuliaOnHPCClusters/). diff --git a/website/_assets/favicon.png b/website/_assets/favicon.png deleted file mode 100644 index 6e79b48..0000000 Binary files a/website/_assets/favicon.png and /dev/null differ diff --git a/website/_assets/juliahpc_logo.png b/website/_assets/juliahpc_logo.png deleted file mode 100644 index dcfbc97..0000000 Binary files a/website/_assets/juliahpc_logo.png and /dev/null differ diff --git a/website/_css/custom.css b/website/_css/custom.css deleted file mode 100644 index 4ad36f4..0000000 --- a/website/_css/custom.css +++ /dev/null @@ -1,266 +0,0 @@ -@import url("https://fonts.googleapis.com/css2?family=PT+Sans+Caption:wght@700&family=PT+Sans:ital,wght@0,400;0,700;1,400;1,700&display=swap"); - -.im-10 {text-align: center;} -.im-10 img { - padding: 0; - width: 10%; -} - -h1 { - border-bottom: 1px solid #999 !important; - margin-bottom: 1em !important; -} - -h1, -h2 { - color: #555; - font-family: "PT Sans Caption"; - font-weight: bold; -} - -html, -body { - font-family: "PT Sans", sans-serif; - font-size: 18px; -} - -.sidebar { - z-index: 2; - overflow-y: auto; - overflow-x: hidden; - /* background-color: #00004d; */ - /* background-color: #00205b; */ - background-color: #013d5b; -} - -.content { - padding-top: 0; -} - -.frankin-content { - margin-top: 2em; -} -.franklin-content pre > code { - border: 1px solid #6b8e2340; - padding: 1.5em; - border-radius: 0; -} -pre.code-output { - background: #6b8e2340; - padding-left: 0.5em; -} - -.code-output code { - border-radius: 0; - padding-left: 1em !important; - background: white; -} - -.docstring { - border: 1px solid #f1f1f1; - padding: 1em; - margin-bottom: 2em; -} - -.franklin-content .docstring h2.doc-header { - font-size: 1.25em; - color: #008080; - margin: 16px 0; -} - -.franklin-content .docstring h1 { - font-size: 1.2em; -} -.franklin-content .docstring h2 { - font-size: 1em; -} - -.docstring .doc-type { - font-size: 1em; - color: #6b8e2350; - float: right; -} - -.franklin-content h1 { - margin-bottom: 0; - font-size: 1.66em; - border: none; -} -.franklin-content h2 { - border: none; - font-size: 1.33em; - font-style: normal; - font-weight: bold; -} - -.sidebar-about h1 { - font-family: "Recursive", sans-serif; - border-bottom: none !important; - font-size: 1.1em; - opacity: 0.95; -} - -.sidebar-about h2 { - font-family: "Recursive", sans-serif; - border-bottom: none !important; - font-size: 0.8em; - color: White; - font-style: italic; - font-weight: bold; - margin-top: -1em; -} - -@media (min-width: 768px) { - .sidebar-nav { - } -} -.sidebar .container.sidebar-sticky { - top: 1rem; -} -.sidebar-nav .sidebar-nav-item.active { - box-sizing: border-box; - background: #f0f8ff40; - margin-right: -1em; - margin-left: -0.5em; - padding-left: 0.5em; - color: white; - font-weight: normal !important; -} -.sidebar-nav .sidebar-nav-item { - /*font-size: 0.97em;*/ - color: #cccccc; - margin: 0.25em 0; -} - -.sidebar-nav .course-section { - /*font-style: italic;*/ - /*display: flex;*/ - align-items: center; - /* color: #ffff80; */ - color: #edae4a; - /* color: #fecf6e; */ - margin-top: 1em; -} -.sidebar-nav .course-section::before, -.sidebar-nav .course-section::after { - content: " "; - flex: 1; - border-bottom: 1px dashed #d9a200; -} -.sidebar-nav .course-section::before { - margin-right: 0.25em; -} -.sidebar-nav .course-section::after { - margin-left: 0.25em; -} - -.sidebar-nav .book-chapter { - align-items: center; - color: #d93d00; - margin-top: 1em; -} -.sidebar-nav .book-chapter::before, -.sidebar-nav .book-chapter::after { - content: " "; - flex: 1; - border-bottom: 1px dashed #d93d00; -} - -h1 { - margin-top: 2em; -} -h2 { - margin-top: 1em; -} - -.page-foot img.github-logo { - width: 1em; - height: 1em; - margin: 0; - padding: 0; - display: inline-block; - margin-bottom: -2px; -} - -.page-foot { - margin-bottom: 0; -} - -/* Extra Styling for Logo bagdes*/ -img[src*="#badge"] { - height: 100px; - width: auto; - display: inline-block; - padding: 25px; - align-items: center; -} - -/* Extra Styling for student feedback cards*/ -.column { - width: 100%; - float: left; - margin-bottom: 16px; - padding: 8px; -} - -@media (min-width: 768px) { - .column { - float: left; - width: 45%; - margin-bottom: 16px; - padding: 8px; - } -} - -.card { - box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2); -} -.card-container { - padding: 4px 16px; -} -.card-container::after, -.row::after { - content: ""; - clear: both; - display: table; -} -.title { - color: black; - font-weight: bold; - font-size: large; -} -.semester { - color: grey; -} -.feedback { - margin-top: 0.5em; -} - -.live-label { - font-size: 1.5rem; - font-family: monospace; - font-weight: 900; -} -.live-label::before { - content: " "; - width: 1em; - height: 1em; - margin-right: 0.5em; - margin-bottom: -0.2em; - border-radius: 0.5em; - background: rgb(212, 39, 39); - display: inline-block; - /* animation: pulsered 1.5s ease-in-out infinite; */ - /* animation: name duration timing-function delay iteration-count alternate fill-mode; */ - /* animation: pulsered 1.5s ease-in-out 0s infinite alternate; */ - opacity: 0.8; -} - -@keyframes pulsered { - 0% { - opacity: 1; - } - 100% { - opacity: 0.6; - } -} diff --git a/website/_css/franklin.css b/website/_css/franklin.css deleted file mode 100644 index ca129d1..0000000 --- a/website/_css/franklin.css +++ /dev/null @@ -1,388 +0,0 @@ -/* ================================================================== - VARIABLES -================================================================== */ - -:root { - --block-background: #f8f8f8; - --small: 14px; - --normal: 19px; - --text-color: hsv(0, 0%, 20%); -} - -/* ================================================================== - DEFAULT FONT AND LAYOUT -================================================================== */ - -html { - font-family: Helvetica, Arial, sans-serif; - font-size: var(--normal); - color: var(--text-color); -} - -/* ================================================================== - BASIC GRID FOR PROFILE PIC -================================================================== */ - -.franklin-content .row { - display: block; -} - -.franklin-content .left { - float: left; - margin-right: 15px; -} - -.franklin-content .right { - float: right; -} - -.franklin-content .container img { - width: auto; - padding-left: 0; - border-radius: 10px; -} - -.franklin-content .footnote { - position: relative; - top: -0.5em; - font-size: 70%; -} - -/* ================================================================== - FOOT / COPYRIGHT -================================================================== */ - -.franklin-content .page-foot a { - text-decoration: none; - color: #a6a2a0; - text-decoration: underline; -} - -.page-foot { - font-size: 80%; - font-family: Arial, serif; - color: #a6a2a0; - text-align: center; - margin-top: 6em; - border-top: 1px solid lightgrey; - padding-top: 2em; - margin-bottom: 4em; -} - -/* ================================================================== - TEXT GEOMETRY -================================================================== */ - -.franklin-toc li { - /* Avoid clickable elements being too close together. */ - margin: 0.6rem 0; -} - -.franklin-content { - position: relative; - padding-left: 12.5%; - padding-right: 12.5%; - line-height: 1.35em; -} - -/* On wide screens, fix content width to a max value. */ -@media (min-width: 940px) { - .franklin-content { - width: 705px; - margin-left: auto; - margin-right: auto; - } -} - -/* On narrow device, reduce margins. */ -@media (max-width: 480px) { - .franklin-content { - padding-left: 6%; - padding-right: 6%; - } -} - -/* ================================================================== - TITLES -================================================================== */ - -.franklin-content h1 { font-size: 24px; } -.franklin-content h2 { font-size: 22px; } -.franklin-content h3 { font-size: 20px; } - -.franklin-content h1, -h2, -h3, -h4, -h5, -h6 { - text-align: left; -} - -.franklin-content h1 { - padding-bottom: 0.5em; - border-bottom: 3px double lightgrey; - margin-top: 1.5em; - margin-bottom: 1em; -} - -.franklin-content h2 { - padding-bottom: 0.3em; - border-bottom: 1px solid lightgrey; - margin-top: 2em; - margin-bottom: 1em; -} - -.franklin-content h1 a { color: inherit; } -.franklin-content h1 a:hover { text-decoration: none; } -.franklin-content h2 a { color: inherit; } -.franklin-content h2 a:hover { text-decoration: none; } -.franklin-content h3 a { color: inherit; } -.franklin-content h3 a:hover { text-decoration: none; } -.franklin-content h4 a { color: inherit; } -.franklin-content h4 a:hover { text-decoration: none; } -.franklin-content h5 a { color: inherit; } -.franklin-content h5 a:hover { text-decoration: none; } -.franklin-content h6 a { color: inherit; } -.franklin-content h6 a:hover { text-decoration: none; } - -.franklin-content table { - margin-left: auto; - margin-right: auto; - border-collapse: collapse; - text-align: center; -} - -.franklin-toc ol ol { - list-style-type: lower-alpha; -} - -.franklin-content th, -td { - font-size: var(--small); - padding: 10px; - border: 1px solid black; -} - -.franklin-content blockquote { - background: var(--block-background); - border-left: 7px solid #a8a8a8; - margin: 1.5em 10px; - padding: 0.5em 10px; - font-style: italic; -} - -.franklin-content blockquote p { - display: inline; -} - -/* ================================================================== - GENERAL FORMATTING -================================================================== */ - -/* Spacing between bullet points. */ -.franklin-content li p { - margin: 10px 0; -} - -.franklin-content a { - color: #004de6; - text-decoration: none; -} - -.franklin-content a:hover { - text-decoration: underline; -} - -/* ================================================================== - HYPERREFS AND FOOTNOTES -================================================================== */ - -.franklin-content .eqref a { color: green; } -.franklin-content .bibref a { color: green; } - -.franklin-content sup { - font-size: 70%; - vertical-align: super; - line-height: 0; -} - -.franklin-content table.fndef { - margin: 0; - margin-bottom: 10px; -} - -.franklin-content .fndef tr, -td { - padding: 0; - border: 0; - text-align: left; -} - -.franklin-content .fndef tr { - border-left: 2px solid lightgray; -} - -.franklin-content .fndef td.fndef-backref { - vertical-align: top; - font-size: 70%; - padding-left: 5px; -} - -.franklin-content .fndef td.fndef-content { - font-size: 80%; - padding-left: 10px; - width: 100%; -} - -/* ================================================================== - IMAGES in CONTENT -================================================================== */ - -.franklin-content img { - width: 90%; - text-align: center; - padding-left: 5%; -} - -.franklin-content .img-med img { - width: 70%; - text-align: center; - padding-left: 20%; -} - -.franklin-content .img-small img { - width: 50%; - text-align: center; - padding-left: 20%; -} - -/* ================================================================== - KATEX -================================================================== */ - -body { counter-reset: eqnum; } - -.katex { font-size: 1em !important; } - -.katex-display .katex { - /* Overwrite KaTeX settings. */ - display: inline-block; - - /* Allow display equations to wrap on small screens. */ - white-space: normal; -} - -.katex-display::after { - counter-increment: eqnum; - content: "(" counter(eqnum) ")"; - position: relative; - float: right; - padding-right: 5px; -} - -/* ================================================================== - CODE & HIGHLIGHT.JS -================================================================== */ - -code { - background-color: var(--block-background); - padding: 0.1em 0.2em; - border-radius: 2px; - font-size: var(--small); -} - -/* .franklin-content code { */ - -/* background-color: rgba(27,31,35,0.05); */ - -/* padding: 0.1em 0.2em; */ - -/* border-radius: 2px; */ - -/* font-size: 90%; } */ - -.hljs { - font-size: var(--small); - line-height: 1.35em; - border-radius: 10px; -} - -.hljs-meta, -.hljs-metas, -.hljs-metap { font-weight: bold; } - -.hljs-meta { color: rgb(25, 179, 51); } - -.hljs-metas { color: red; } - -.hljs-metap { color: rgb(51, 131, 231); } - -/* ================================================================== - BOXES -================================================================== */ - -.franklin-content .colbox-blue { - background-color: #eef3f5; - padding-top: 5px; - padding-right: 10px; - padding-left: 10px; - padding-bottom: 5px; - margin-left: 5px; - margin-top: 5px; - margin-bottom: 5px; - border-radius: 0 10px 10px 0; - border-left: 5px solid #4c9cf1; -} - -.note { - margin-top: 1.5em; - width: 95%; - margin-left:auto; - margin-right:auto; - background-color: aliceblue; - border-radius: 5px; - margin-bottom: 1em; -} -.note .messg { - padding: 10px; - padding-left: 12px; -} -.note .title{ - font-size: 105%; - border-top-left-radius: 5px; - border-top-right-radius: 5px; - padding-left: 7px; - padding-top: 2px; - color: white; - background: cornflowerblue; -} - -.warning { - margin-top: 1.5em; - width: 95%; - margin-left:auto; - margin-right:auto; - background-color: #f1b3b1; - border-radius: 5px; - margin-bottom: 1em; -} -.warning .messg { - padding: 10px; - padding-left: 12px; -} -.warning .title{ - font-size: 105%; - border-top-left-radius: 5px; - border-top-right-radius: 5px; - padding-left: 7px; - padding-top: 2px; - color: white; - background: crimson; -} - -.important { - background-color: lemonchiffon; - padding: 0.5em; - margin-bottom: 1em; -} diff --git a/website/_css/poole_hyde.css b/website/_css/poole_hyde.css deleted file mode 100644 index 8a1df55..0000000 --- a/website/_css/poole_hyde.css +++ /dev/null @@ -1,340 +0,0 @@ -/* - * ___ - * /\_ \ - * _____ ___ ___\//\ \ __ - * /\ '__`\ / __`\ / __`\\ \ \ /'__`\ - * \ \ \_\ \/\ \_\ \/\ \_\ \\_\ \_/\ __/ - * \ \ ,__/\ \____/\ \____//\____\ \____\ - * \ \ \/ \/___/ \/___/ \/____/\/____/ - * \ \_\ - * \/_/ - * - * Designed, built, and released under MIT license by @mdo. Learn more at - * https://github.com/poole/poole. - */ - - -/* - * Contents - * - * Body resets - * Custom type - * Messages - * Container - * Masthead - * Posts and pages - * Pagination - * Reverse layout - * Themes - */ - - -/* - * Body resets - * - * Update the foundational and global aspects of the page. - */ - -* { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -html, -body { - margin: 0; - padding: 0; -} - -html { - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 16px; - line-height: 1.5; -} - -@media (min-width: 38em) { - html { - font-size: 20px; - } -} - -body { - color: #515151; - background-color: #fff; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; -} - -/* No `:visited` state is required by default (browsers will use `a`) */ -a { - color: #268bd2; - text-decoration: none; -} - -a strong { - color: inherit; -} - -/* `:focus` is linked to `:hover` for basic accessibility */ -a:hover, -a:focus { - text-decoration: underline; -} - -/* Headings */ -h1, -h2, -h3, -h4, -h5, -h6 { - margin-bottom: 0.5rem; - font-weight: bold; - line-height: 1.25; - color: #313131; - text-rendering: optimizeLegibility; -} - -h1 { - font-size: 2rem; -} - -h2 { - margin-top: 1rem; - font-size: 1.5rem; -} - -h3 { - margin-top: 1.5rem; - font-size: 1.25rem; -} - -h4, -h5, -h6 { - margin-top: 1rem; - font-size: 1rem; -} - -/* Body text */ -p { - margin-top: 0; - margin-bottom: 1rem; -} - -strong { - color: #303030; -} - - -/* Lists */ -ul, -ol, -dl { - margin-top: 0; - margin-bottom: 1rem; -} - -dt { - font-weight: bold; -} - -dd { - margin-bottom: 0.5rem; -} - -/* Misc */ -hr { - position: relative; - margin: 1.5rem 0; - border: 0; - border-top: 1px solid #eee; - border-bottom: 1px solid #fff; -} - -abbr { - font-size: 85%; - font-weight: bold; - color: #555; - text-transform: uppercase; -} - -abbr[title] { - cursor: help; - border-bottom: 1px dotted #e5e5e5; -} - -/* Quotes */ -blockquote { - padding: 0.5rem 1rem; - margin: 0.8rem 0; - color: #7a7a7a; - border-left: 0.25rem solid #e5e5e5; -} - -blockquote p:last-child { - margin-bottom: 0; -} - -@media (min-width: 30em) { - blockquote { - padding-right: 5rem; - padding-left: 1.25rem; - } -} - -img { - display: block; - max-width: 100%; - margin: 0 0 1rem; - border-radius: 5px; -} - -/* Tables */ -table { - margin-bottom: 1rem; - width: 100%; - border: 1px solid #e5e5e5; - border-collapse: collapse; -} - -td, -th { - padding: 0.25rem 0.5rem; - border: 1px solid #e5e5e5; -} - -tbody tr:nth-child(odd) td, -tbody tr:nth-child(odd) th { - background-color: #f9f9f9; -} - -/* - * __ __ - * /\ \ /\ \ - * \ \ \___ __ __ \_\ \ __ - * \ \ _ `\/\ \/\ \ /'_` \ /'__`\ - * \ \ \ \ \ \ \_\ \/\ \_\ \/\ __/ - * \ \_\ \_\/`____ \ \___,_\ \____\ - * \/_/\/_/`/___/> \/__,_ /\/____/ - * /\___/ - * \/__/ - * - * Designed, built, and released under MIT license by @mdo. Learn more at - * https://github.com/poole/hyde. - */ - - -/* - * Contents - * - * Global resets - * Sidebar - * Container - * Reverse layout - * Themes - */ - - -/* - * Global resets - * - * Update the foundational and global aspects of the page. - */ - -html { - font-family: "PT Sans", Helvetica, Arial, sans-serif; -} - -/* - * Sidebar - * - * Flexible banner for housing site name, intro, and "footer" content. Starts - * out above content in mobile and later moves to the side with wider viewports. - */ - -.sidebar { - text-align: center; - padding: 2rem 1rem; - color: rgba(255, 255, 255, 0.5); - background-color: #202020; -} - -@media (min-width: 768px) { - .sidebar { - position: fixed; - top: 0; - left: 0; - bottom: 0; - width: 19rem; - text-align: left; - } -} - -/* Sidebar links */ -.sidebar a { - color: #fff; -} - -/* About section */ -.sidebar-about h1 { - color: #fff; - margin-top: 0; - font-family: "Abril Fatface", serif; - font-size: 3.25rem; -} - -/* Sidebar nav */ -.sidebar-nav { - margin-bottom: 1rem; -} - -.sidebar-nav-item { - display: block; - line-height: 1.75; -} - -a.sidebar-nav-item:hover, -a.sidebar-nav-item:focus { - text-decoration: underline; -} - -.sidebar-nav-item.active { - font-weight: bold; -} - -/* Sticky sidebar - * - * Add the `sidebar-sticky` class to the sidebar's container to affix it the - * contents to the bottom of the sidebar in tablets and up. - */ - -@media (min-width: 768px) { - .sidebar-sticky { - position: absolute; - right: 1rem; - bottom: 1rem; - left: 1rem; - } -} - - -/* Container - * - * Align the contents of the site above the proper threshold with some margin-fu - * with a 25%-wide `.sidebar`. - */ - -.content { - padding-top: 4rem; - padding-bottom: 4rem; -} - -@media (min-width: 768px) { - .content { - max-width: 45rem; - margin-left: 23rem; - margin-right: 2rem; - } -} diff --git a/website/_layout/foot.html b/website/_layout/foot.html deleted file mode 100644 index a486191..0000000 --- a/website/_layout/foot.html +++ /dev/null @@ -1,10 +0,0 @@ - - - {{ if hasmath }} - {{ insert foot_katex.html }} - {{ end }} - {{ if hascode }} - {{ insert foot_highlight.html }} - {{ end }} - - diff --git a/website/_layout/foot_highlight.html b/website/_layout/foot_highlight.html deleted file mode 100644 index 616d9f4..0000000 --- a/website/_layout/foot_highlight.html +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/website/_layout/foot_katex.html b/website/_layout/foot_katex.html deleted file mode 100644 index 6c7e39f..0000000 --- a/website/_layout/foot_katex.html +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/website/_layout/head.html b/website/_layout/head.html deleted file mode 100644 index 05e6165..0000000 --- a/website/_layout/head.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - {{insert head_lunr.html}} - {{if hasmath}} {{insert head_katex.html }} {{end}} - {{if hascode}} {{insert head_highlight.html }} {{end}} - {{insert style.html}} - {{isdef title}} {{fill title}} {{end}} - - - -{{insert sidebar.html}} - diff --git a/website/_layout/head_highlight.html b/website/_layout/head_highlight.html deleted file mode 100644 index b0b9142..0000000 --- a/website/_layout/head_highlight.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/website/_layout/head_katex.html b/website/_layout/head_katex.html deleted file mode 100644 index 755f249..0000000 --- a/website/_layout/head_katex.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/website/_layout/head_lunr.html b/website/_layout/head_lunr.html deleted file mode 100644 index a4f463e..0000000 --- a/website/_layout/head_lunr.html +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/website/_layout/page_foot.html b/website/_layout/page_foot.html deleted file mode 100644 index 581640e..0000000 --- a/website/_layout/page_foot.html +++ /dev/null @@ -1,6 +0,0 @@ -
- -
diff --git a/website/_layout/sidebar.html b/website/_layout/sidebar.html deleted file mode 100644 index ed43fb6..0000000 --- a/website/_layout/sidebar.html +++ /dev/null @@ -1,46 +0,0 @@ - -
diff --git a/website/_layout/style.html b/website/_layout/style.html deleted file mode 100644 index b45efdd..0000000 --- a/website/_layout/style.html +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - diff --git a/website/_layout/tag.html b/website/_layout/tag.html deleted file mode 100644 index f9000b6..0000000 --- a/website/_layout/tag.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - {{insert style.html}} - Tag: {{fill fd_tag}} - - - {{insert sidebar.html}} -
-

Tag: {{fill fd_tag}}

- {{taglist}} - {{insert page_foot.html}} -
- - diff --git a/website/_libs/highlight/github.min.css b/website/_libs/highlight/github.min.css deleted file mode 100644 index 6bf39bd..0000000 --- a/website/_libs/highlight/github.min.css +++ /dev/null @@ -1,43 +0,0 @@ -.hljs { display: block; font-size: 14px; line-height: 1.45em; overflow-x: auto; padding: 0.5em; color: var(--text-color); background: var(--block-background); } - -.hljs-comment, -.hljs-quote { color: #998; font-style: italic; } - -.hljs-keyword, -.hljs-selector-tag, -.hljs-subst { color: var(--text-color); font-weight: 700; } - -.hljs-literal, -.hljs-number, -.hljs-tag .hljs-attr, -.hljs-template-variable, -.hljs-variable { color: teal; } - -.hljs-doctag, -.hljs-string { color: #d14; } - -.hljs-section, -.hljs-selector-id, -.hljs-title { color: #900; font-weight: 700; } -.hljs-subst { font-weight: 400; } - -.hljs-class .hljs-title, -.hljs-type { color: #458; font-weight: 700; } - -.hljs-attribute, -.hljs-name, -.hljs-tag { color: navy; font-weight: 400; } - -.hljs-link, -.hljs-regexp { color: #009926; } - -.hljs-bullet, -.hljs-symbol { color: #990073; } - -.hljs-built_in, -.hljs-builtin-name { color: #0086b3; } -.hljs-meta { color: var(--text-color); font-weight: 700; } -.hljs-deletion { background: #fdd; } -.hljs-addition { background: #dfd; } -.hljs-emphasis { font-style: italic; } -.hljs-strong { font-weight: 700; } diff --git a/website/_libs/highlight/highlight.pack.js b/website/_libs/highlight/highlight.pack.js deleted file mode 100644 index a8c9797..0000000 --- a/website/_libs/highlight/highlight.pack.js +++ /dev/null @@ -1,639 +0,0 @@ -/* - Highlight.js 10.5.0 (af20048d) - License: BSD-3-Clause - Copyright (c) 2006-2020, Ivan Sagalaev -*/ -var hljs=function(){"use strict";function e(t){ -return t instanceof Map?t.clear=t.delete=t.set=()=>{ -throw Error("map is read-only")}:t instanceof Set&&(t.add=t.clear=t.delete=()=>{ -throw Error("set is read-only") -}),Object.freeze(t),Object.getOwnPropertyNames(t).forEach((n=>{var s=t[n] -;"object"!=typeof s||Object.isFrozen(s)||e(s)})),t}var t=e,n=e;t.default=n -;class s{constructor(e){void 0===e.data&&(e.data={}),this.data=e.data} -ignoreMatch(){this.ignore=!0}}function r(e){ -return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'") -}function a(e,...t){const n=Object.create(null);for(const t in e)n[t]=e[t] -;return t.forEach((e=>{for(const t in e)n[t]=e[t]})),n}const i=e=>!!e.kind -;class o{constructor(e,t){ -this.buffer="",this.classPrefix=t.classPrefix,e.walk(this)}addText(e){ -this.buffer+=r(e)}openNode(e){if(!i(e))return;let t=e.kind -;e.sublanguage||(t=`${this.classPrefix}${t}`),this.span(t)}closeNode(e){ -i(e)&&(this.buffer+="")}value(){return this.buffer}span(e){ -this.buffer+=``}}class l{constructor(){this.rootNode={ -children:[]},this.stack=[this.rootNode]}get top(){ -return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){ -this.top.children.push(e)}openNode(e){const t={kind:e,children:[]} -;this.add(t),this.stack.push(t)}closeNode(){ -if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){ -for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)} -walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,t){ -return"string"==typeof t?e.addText(t):t.children&&(e.openNode(t), -t.children.forEach((t=>this._walk(e,t))),e.closeNode(t)),e}static _collapse(e){ -"string"!=typeof e&&e.children&&(e.children.every((e=>"string"==typeof e))?e.children=[e.children.join("")]:e.children.forEach((e=>{ -l._collapse(e)})))}}class c extends l{constructor(e){super(),this.options=e} -addKeyword(e,t){""!==e&&(this.openNode(t),this.addText(e),this.closeNode())} -addText(e){""!==e&&this.add(e)}addSublanguage(e,t){const n=e.root -;n.kind=t,n.sublanguage=!0,this.add(n)}toHTML(){ -return new o(this,this.options).value()}finalize(){return!0}}function u(e){ -return e?"string"==typeof e?e:e.source:null} -const g="[a-zA-Z]\\w*",d="[a-zA-Z_]\\w*",h="\\b\\d+(\\.\\d+)?",f="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",p="\\b(0b[01]+)",m={ -begin:"\\\\[\\s\\S]",relevance:0},b={className:"string",begin:"'",end:"'", -illegal:"\\n",contains:[m]},x={className:"string",begin:'"',end:'"', -illegal:"\\n",contains:[m]},E={ -begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/ -},v=(e,t,n={})=>{const s=a({className:"comment",begin:e,end:t,contains:[]},n) -;return s.contains.push(E),s.contains.push({className:"doctag", -begin:"(?:TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):",relevance:0}),s -},N=v("//","$"),w=v("/\\*","\\*/"),R=v("#","$");var y=Object.freeze({ -__proto__:null,IDENT_RE:g,UNDERSCORE_IDENT_RE:d,NUMBER_RE:h,C_NUMBER_RE:f, -BINARY_NUMBER_RE:p, -RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~", -SHEBANG:(e={})=>{const t=/^#![ ]*\// -;return e.binary&&(e.begin=((...e)=>e.map((e=>u(e))).join(""))(t,/.*\b/,e.binary,/\b.*/)), -a({className:"meta",begin:t,end:/$/,relevance:0,"on:begin":(e,t)=>{ -0!==e.index&&t.ignoreMatch()}},e)},BACKSLASH_ESCAPE:m,APOS_STRING_MODE:b, -QUOTE_STRING_MODE:x,PHRASAL_WORDS_MODE:E,COMMENT:v,C_LINE_COMMENT_MODE:N, -C_BLOCK_COMMENT_MODE:w,HASH_COMMENT_MODE:R,NUMBER_MODE:{className:"number", -begin:h,relevance:0},C_NUMBER_MODE:{className:"number",begin:f,relevance:0}, -BINARY_NUMBER_MODE:{className:"number",begin:p,relevance:0},CSS_NUMBER_MODE:{ -className:"number", -begin:h+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?", -relevance:0},REGEXP_MODE:{begin:/(?=\/[^/\n]*\/)/,contains:[{className:"regexp", -begin:/\//,end:/\/[gimuy]*/,illegal:/\n/,contains:[m,{begin:/\[/,end:/\]/, -relevance:0,contains:[m]}]}]},TITLE_MODE:{className:"title",begin:g,relevance:0 -},UNDERSCORE_TITLE_MODE:{className:"title",begin:d,relevance:0},METHOD_GUARD:{ -begin:"\\.\\s*[a-zA-Z_]\\w*",relevance:0},END_SAME_AS_BEGIN:e=>Object.assign(e,{ -"on:begin":(e,t)=>{t.data._beginMatch=e[1]},"on:end":(e,t)=>{ -t.data._beginMatch!==e[1]&&t.ignoreMatch()}})});function _(e,t){ -"."===e.input[e.index-1]&&t.ignoreMatch()}function k(e,t){ -t&&e.beginKeywords&&(e.begin="\\b("+e.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)", -e.__beforeBegin=_,e.keywords=e.keywords||e.beginKeywords,delete e.beginKeywords) -}function M(e,t){ -Array.isArray(e.illegal)&&(e.illegal=((...e)=>"("+e.map((e=>u(e))).join("|")+")")(...e.illegal)) -}function O(e,t){if(e.match){ -if(e.begin||e.end)throw Error("begin & end are not supported with match") -;e.begin=e.match,delete e.match}}function A(e,t){ -void 0===e.relevance&&(e.relevance=1)} -const L=["of","and","for","in","not","or","if","then","parent","list","value"] -;function B(e,t){return t?Number(t):(e=>L.includes(e.toLowerCase()))(e)?0:1} -function I(e,{plugins:t}){function n(t,n){ -return RegExp(u(t),"m"+(e.case_insensitive?"i":"")+(n?"g":""))}class s{ -constructor(){ -this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0} -addRule(e,t){ -t.position=this.position++,this.matchIndexes[this.matchAt]=t,this.regexes.push([t,e]), -this.matchAt+=(e=>RegExp(e.toString()+"|").exec("").length-1)(e)+1}compile(){ -0===this.regexes.length&&(this.exec=()=>null) -;const e=this.regexes.map((e=>e[1]));this.matcherRe=n(((e,t="|")=>{ -const n=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./;let s=0,r="" -;for(let a=0;a0&&(r+=t),r+="(";o.length>0;){const e=n.exec(o);if(null==e){r+=o;break} -r+=o.substring(0,e.index), -o=o.substring(e.index+e[0].length),"\\"===e[0][0]&&e[1]?r+="\\"+(Number(e[1])+i):(r+=e[0], -"("===e[0]&&s++)}r+=")"}return r})(e),!0),this.lastIndex=0}exec(e){ -this.matcherRe.lastIndex=this.lastIndex;const t=this.matcherRe.exec(e) -;if(!t)return null -;const n=t.findIndex(((e,t)=>t>0&&void 0!==e)),s=this.matchIndexes[n] -;return t.splice(0,n),Object.assign(t,s)}}class r{constructor(){ -this.rules=[],this.multiRegexes=[], -this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){ -if(this.multiRegexes[e])return this.multiRegexes[e];const t=new s -;return this.rules.slice(e).forEach((([e,n])=>t.addRule(e,n))), -t.compile(),this.multiRegexes[e]=t,t}resumingScanAtSamePosition(){ -return 0!==this.regexIndex}considerAll(){this.regexIndex=0}addRule(e,t){ -this.rules.push([e,t]),"begin"===t.type&&this.count++}exec(e){ -const t=this.getMatcher(this.regexIndex);t.lastIndex=this.lastIndex -;let n=t.exec(e) -;if(this.resumingScanAtSamePosition())if(n&&n.index===this.lastIndex);else{ -const t=this.getMatcher(0);t.lastIndex=this.lastIndex+1,n=t.exec(e)} -return n&&(this.regexIndex+=n.position+1, -this.regexIndex===this.count&&this.considerAll()),n}} -if(e.compilerExtensions||(e.compilerExtensions=[]), -e.contains&&e.contains.includes("self"))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.") -;return e.classNameAliases=a(e.classNameAliases||{}),function t(s,i){const o=s -;if(s.compiled)return o -;[O].forEach((e=>e(s,i))),e.compilerExtensions.forEach((e=>e(s,i))), -s.__beforeBegin=null,[k,M,A].forEach((e=>e(s,i))),s.compiled=!0;let l=null -;if("object"==typeof s.keywords&&(l=s.keywords.$pattern, -delete s.keywords.$pattern),s.keywords&&(s.keywords=((e,t)=>{const n={} -;return"string"==typeof e?s("keyword",e):Object.keys(e).forEach((t=>{s(t,e[t]) -})),n;function s(e,s){t&&(s=s.toLowerCase()),s.split(" ").forEach((t=>{ -const s=t.split("|");n[s[0]]=[e,B(s[0],s[1])]}))} -})(s.keywords,e.case_insensitive)), -s.lexemes&&l)throw Error("ERR: Prefer `keywords.$pattern` to `mode.lexemes`, BOTH are not allowed. (see mode reference) ") -;return l=l||s.lexemes||/\w+/, -o.keywordPatternRe=n(l,!0),i&&(s.begin||(s.begin=/\B|\b/), -o.beginRe=n(s.begin),s.endSameAsBegin&&(s.end=s.begin), -s.end||s.endsWithParent||(s.end=/\B|\b/), -s.end&&(o.endRe=n(s.end)),o.terminatorEnd=u(s.end)||"", -s.endsWithParent&&i.terminatorEnd&&(o.terminatorEnd+=(s.end?"|":"")+i.terminatorEnd)), -s.illegal&&(o.illegalRe=n(s.illegal)), -s.contains||(s.contains=[]),s.contains=[].concat(...s.contains.map((e=>(e=>(e.variants&&!e.cachedVariants&&(e.cachedVariants=e.variants.map((t=>a(e,{ -variants:null},t)))),e.cachedVariants?e.cachedVariants:T(e)?a(e,{ -starts:e.starts?a(e.starts):null -}):Object.isFrozen(e)?a(e):e))("self"===e?s:e)))),s.contains.forEach((e=>{t(e,o) -})),s.starts&&t(s.starts,i),o.matcher=(e=>{const t=new r -;return e.contains.forEach((e=>t.addRule(e.begin,{rule:e,type:"begin" -}))),e.terminatorEnd&&t.addRule(e.terminatorEnd,{type:"end" -}),e.illegal&&t.addRule(e.illegal,{type:"illegal"}),t})(o),o}(e)}function T(e){ -return!!e&&(e.endsWithParent||T(e.starts))}function j(e){const t={ -props:["language","code","autodetect"],data:()=>({detectedLanguage:"", -unknownLanguage:!1}),computed:{className(){ -return this.unknownLanguage?"":"hljs "+this.detectedLanguage},highlighted(){ -if(!this.autoDetect&&!e.getLanguage(this.language))return console.warn(`The language "${this.language}" you specified could not be found.`), -this.unknownLanguage=!0,r(this.code);let t={} -;return this.autoDetect?(t=e.highlightAuto(this.code), -this.detectedLanguage=t.language):(t=e.highlight(this.language,this.code,this.ignoreIllegals), -this.detectedLanguage=this.language),t.value},autoDetect(){ -return!(this.language&&(e=this.autodetect,!e&&""!==e));var e}, -ignoreIllegals:()=>!0},render(e){return e("pre",{},[e("code",{ -class:this.className,domProps:{innerHTML:this.highlighted}})])}};return{ -Component:t,VuePlugin:{install(e){e.component("highlightjs",t)}}}}const S={ -"after:highlightBlock":({block:e,result:t,text:n})=>{const s=D(e) -;if(!s.length)return;const a=document.createElement("div") -;a.innerHTML=t.value,t.value=((e,t,n)=>{let s=0,a="";const i=[];function o(){ -return e.length&&t.length?e[0].offset!==t[0].offset?e[0].offset"}function c(e){ -a+=""}function u(e){("start"===e.event?l:c)(e.node)} -for(;e.length||t.length;){let t=o() -;if(a+=r(n.substring(s,t[0].offset)),s=t[0].offset,t===e){i.reverse().forEach(c) -;do{u(t.splice(0,1)[0]),t=o()}while(t===e&&t.length&&t[0].offset===s) -;i.reverse().forEach(l) -}else"start"===t[0].event?i.push(t[0].node):i.pop(),u(t.splice(0,1)[0])} -return a+r(n.substr(s))})(s,D(a),n)}};function P(e){ -return e.nodeName.toLowerCase()}function D(e){const t=[];return function e(n,s){ -for(let r=n.firstChild;r;r=r.nextSibling)3===r.nodeType?s+=r.nodeValue.length:1===r.nodeType&&(t.push({ -event:"start",offset:s,node:r}),s=e(r,s),P(r).match(/br|hr|img|input/)||t.push({ -event:"stop",offset:s,node:r}));return s}(e,0),t}const C=e=>{console.error(e) -},H=(e,...t)=>{console.log("WARN: "+e,...t)},$=(e,t)=>{ -console.log(`Deprecated as of ${e}. ${t}`)},U=r,z=a,K=Symbol("nomatch") -;return(e=>{const n=Object.create(null),r=Object.create(null),a=[];let i=!0 -;const o=/(^(<[^>]+>|\t|)+|\n)/gm,l="Could not find the language '{}', did you forget to load/include a language module?",u={ -disableAutodetect:!0,name:"Plain text",contains:[]};let g={ -noHighlightRe:/^(no-?highlight)$/i, -languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-", -tabReplace:null,useBR:!1,languages:null,__emitter:c};function d(e){ -return g.noHighlightRe.test(e)}function h(e,t,n,s){const r={code:t,language:e} -;_("before:highlight",r);const a=r.result?r.result:f(r.language,r.code,n,s) -;return a.code=r.code,_("after:highlight",a),a}function f(e,t,r,o){const c=t -;function u(e,t){const n=w.case_insensitive?t[0].toLowerCase():t[0] -;return Object.prototype.hasOwnProperty.call(e.keywords,n)&&e.keywords[n]} -function d(){null!=_.subLanguage?(()=>{if(""===O)return;let e=null -;if("string"==typeof _.subLanguage){ -if(!n[_.subLanguage])return void M.addText(O) -;e=f(_.subLanguage,O,!0,k[_.subLanguage]),k[_.subLanguage]=e.top -}else e=p(O,_.subLanguage.length?_.subLanguage:null) -;_.relevance>0&&(A+=e.relevance),M.addSublanguage(e.emitter,e.language) -})():(()=>{if(!_.keywords)return void M.addText(O);let e=0 -;_.keywordPatternRe.lastIndex=0;let t=_.keywordPatternRe.exec(O),n="";for(;t;){ -n+=O.substring(e,t.index);const s=u(_,t);if(s){const[e,r]=s -;M.addText(n),n="",A+=r;const a=w.classNameAliases[e]||e;M.addKeyword(t[0],a) -}else n+=t[0];e=_.keywordPatternRe.lastIndex,t=_.keywordPatternRe.exec(O)} -n+=O.substr(e),M.addText(n)})(),O=""}function h(e){ -return e.className&&M.openNode(w.classNameAliases[e.className]||e.className), -_=Object.create(e,{parent:{value:_}}),_}function m(e,t,n){let r=((e,t)=>{ -const n=e&&e.exec(t);return n&&0===n.index})(e.endRe,n);if(r){if(e["on:end"]){ -const n=new s(e);e["on:end"](t,n),n.ignore&&(r=!1)}if(r){ -for(;e.endsParent&&e.parent;)e=e.parent;return e}} -if(e.endsWithParent)return m(e.parent,t,n)}function b(e){ -return 0===_.matcher.regexIndex?(O+=e[0],1):(T=!0,0)}function x(e){ -const t=e[0],n=c.substr(e.index),s=m(_,e,n);if(!s)return K;const r=_ -;r.skip?O+=t:(r.returnEnd||r.excludeEnd||(O+=t),d(),r.excludeEnd&&(O=t));do{ -_.className&&M.closeNode(),_.skip||_.subLanguage||(A+=_.relevance),_=_.parent -}while(_!==s.parent) -;return s.starts&&(s.endSameAsBegin&&(s.starts.endRe=s.endRe), -h(s.starts)),r.returnEnd?0:t.length}let E={};function v(t,n){const a=n&&n[0] -;if(O+=t,null==a)return d(),0 -;if("begin"===E.type&&"end"===n.type&&E.index===n.index&&""===a){ -if(O+=c.slice(n.index,n.index+1),!i){const t=Error("0 width match regex") -;throw t.languageName=e,t.badRule=E.rule,t}return 1} -if(E=n,"begin"===n.type)return function(e){ -const t=e[0],n=e.rule,r=new s(n),a=[n.__beforeBegin,n["on:begin"]] -;for(const n of a)if(n&&(n(e,r),r.ignore))return b(t) -;return n&&n.endSameAsBegin&&(n.endRe=RegExp(t.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),"m")), -n.skip?O+=t:(n.excludeBegin&&(O+=t), -d(),n.returnBegin||n.excludeBegin||(O=t)),h(n),n.returnBegin?0:t.length}(n) -;if("illegal"===n.type&&!r){ -const e=Error('Illegal lexeme "'+a+'" for mode "'+(_.className||"")+'"') -;throw e.mode=_,e}if("end"===n.type){const e=x(n);if(e!==K)return e} -if("illegal"===n.type&&""===a)return 1 -;if(B>1e5&&B>3*n.index)throw Error("potential infinite loop, way more iterations than matches") -;return O+=a,a.length}const w=N(e) -;if(!w)throw C(l.replace("{}",e)),Error('Unknown language: "'+e+'"') -;const R=I(w,{plugins:a});let y="",_=o||R;const k={},M=new g.__emitter(g);(()=>{ -const e=[];for(let t=_;t!==w;t=t.parent)t.className&&e.unshift(t.className) -;e.forEach((e=>M.openNode(e)))})();let O="",A=0,L=0,B=0,T=!1;try{ -for(_.matcher.considerAll();;){ -B++,T?T=!1:_.matcher.considerAll(),_.matcher.lastIndex=L -;const e=_.matcher.exec(c);if(!e)break;const t=v(c.substring(L,e.index),e) -;L=e.index+t}return v(c.substr(L)),M.closeAllNodes(),M.finalize(),y=M.toHTML(),{ -relevance:A,value:y,language:e,illegal:!1,emitter:M,top:_}}catch(t){ -if(t.message&&t.message.includes("Illegal"))return{illegal:!0,illegalBy:{ -msg:t.message,context:c.slice(L-100,L+100),mode:t.mode},sofar:y,relevance:0, -value:U(c),emitter:M};if(i)return{illegal:!1,relevance:0,value:U(c),emitter:M, -language:e,top:_,errorRaised:t};throw t}}function p(e,t){ -t=t||g.languages||Object.keys(n);const s=(e=>{const t={relevance:0, -emitter:new g.__emitter(g),value:U(e),illegal:!1,top:u} -;return t.emitter.addText(e),t})(e),r=t.filter(N).filter(R).map((t=>f(t,e,!1))) -;r.unshift(s);const a=r.sort(((e,t)=>{ -if(e.relevance!==t.relevance)return t.relevance-e.relevance -;if(e.language&&t.language){if(N(e.language).supersetOf===t.language)return 1 -;if(N(t.language).supersetOf===e.language)return-1}return 0})),[i,o]=a,l=i -;return l.second_best=o,l}const m={"before:highlightBlock":({block:e})=>{ -g.useBR&&(e.innerHTML=e.innerHTML.replace(/\n/g,"").replace(//g,"\n")) -},"after:highlightBlock":({result:e})=>{ -g.useBR&&(e.value=e.value.replace(/\n/g,"
"))}},b=/^(<[^>]+>|\t)+/gm,x={ -"after:highlightBlock":({result:e})=>{ -g.tabReplace&&(e.value=e.value.replace(b,(e=>e.replace(/\t/g,g.tabReplace))))}} -;function E(e){let t=null;const n=(e=>{let t=e.className+" " -;t+=e.parentNode?e.parentNode.className:"";const n=g.languageDetectRe.exec(t) -;if(n){const t=N(n[1]) -;return t||(H(l.replace("{}",n[1])),H("Falling back to no-highlight mode for this block.",e)), -t?n[1]:"no-highlight"}return t.split(/\s+/).find((e=>d(e)||N(e)))})(e) -;if(d(n))return;_("before:highlightBlock",{block:e,language:n}),t=e -;const s=t.textContent,a=n?h(n,s,!0):p(s);_("after:highlightBlock",{block:e, -result:a,text:s}),e.innerHTML=a.value,((e,t,n)=>{const s=t?r[t]:n -;e.classList.add("hljs"),s&&e.classList.add(s)})(e,n,a.language),e.result={ -language:a.language,re:a.relevance,relavance:a.relevance -},a.second_best&&(e.second_best={language:a.second_best.language, -re:a.second_best.relevance,relavance:a.second_best.relevance})}const v=()=>{ -v.called||(v.called=!0,document.querySelectorAll("pre code").forEach(E))} -;function N(e){return e=(e||"").toLowerCase(),n[e]||n[r[e]]} -function w(e,{languageName:t}){"string"==typeof e&&(e=[e]),e.forEach((e=>{r[e]=t -}))}function R(e){const t=N(e);return t&&!t.disableAutodetect}function _(e,t){ -const n=e;a.forEach((e=>{e[n]&&e[n](t)}))}Object.assign(e,{highlight:h, -highlightAuto:p,fixMarkup:e=>{ -return $("10.2.0","fixMarkup will be removed entirely in v11.0"), -$("10.2.0","Please see https://github.com/highlightjs/highlight.js/issues/2534"), -t=e, -g.tabReplace||g.useBR?t.replace(o,(e=>"\n"===e?g.useBR?"
":e:g.tabReplace?e.replace(/\t/g,g.tabReplace):e)):t -;var t},highlightBlock:E,configure:e=>{ -e.useBR&&($("10.3.0","'useBR' will be removed entirely in v11.0"), -$("10.3.0","Please see https://github.com/highlightjs/highlight.js/issues/2559")), -g=z(g,e)},initHighlighting:v,initHighlightingOnLoad:()=>{ -window.addEventListener("DOMContentLoaded",v,!1)},registerLanguage:(t,s)=>{ -let r=null;try{r=s(e)}catch(e){ -if(C("Language definition for '{}' could not be registered.".replace("{}",t)), -!i)throw e;C(e),r=u} -r.name||(r.name=t),n[t]=r,r.rawDefinition=s.bind(null,e),r.aliases&&w(r.aliases,{ -languageName:t})},listLanguages:()=>Object.keys(n),getLanguage:N, -registerAliases:w,requireLanguage:e=>{ -$("10.4.0","requireLanguage will be removed entirely in v11."), -$("10.4.0","Please see https://github.com/highlightjs/highlight.js/pull/2844") -;const t=N(e);if(t)return t -;throw Error("The '{}' language is required, but not loaded.".replace("{}",e))}, -autoDetection:R,inherit:z,addPlugin:e=>{a.push(e)},vuePlugin:j(e).VuePlugin -}),e.debugMode=()=>{i=!1},e.safeMode=()=>{i=!0},e.versionString="10.5.0" -;for(const e in y)"object"==typeof y[e]&&t(y[e]) -;return Object.assign(e,y),e.addPlugin(m),e.addPlugin(S),e.addPlugin(x),e})({}) -}();"object"==typeof exports&&"undefined"!=typeof module&&(module.exports=hljs);hljs.registerLanguage("xml",(()=>{"use strict";function e(e){ -return e?"string"==typeof e?e:e.source:null}function n(e){return a("(?=",e,")")} -function a(...n){return n.map((n=>e(n))).join("")}function s(...n){ -return"("+n.map((n=>e(n))).join("|")+")"}return e=>{ -const t=a(/[A-Z_]/,a("(",/[A-Z0-9_.-]+:/,")?"),/[A-Z0-9_.-]*/),i={ -className:"symbol",begin:/&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/},r={begin:/\s/, -contains:[{className:"meta-keyword",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}] -},c=e.inherit(r,{begin:/\(/,end:/\)/}),l=e.inherit(e.APOS_STRING_MODE,{ -className:"meta-string"}),g=e.inherit(e.QUOTE_STRING_MODE,{ -className:"meta-string"}),m={endsWithParent:!0,illegal:/`]+/}]}] -}]};return{name:"HTML, XML", -aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"], -case_insensitive:!0,contains:[{className:"meta",begin://, -relevance:10,contains:[r,g,l,c,{begin:/\[/,end:/\]/,contains:[{className:"meta", -begin://,contains:[r,c,g,l]}]}]},e.COMMENT(//,{ -relevance:10}),{begin://,relevance:10},i,{ -className:"meta",begin:/<\?xml/,end:/\?>/,relevance:10},{className:"tag", -begin:/)/,end:/>/,keywords:{name:"style"},contains:[m],starts:{ -end:/<\/style>/,returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag", -begin:/)/,end:/>/,keywords:{name:"script"},contains:[m],starts:{ -end:/<\/script>/,returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{ -className:"tag",begin:/<>|<\/>/},{className:"tag", -begin:a(//,/>/,/\s/)))),end:/\/?>/,contains:[{className:"name", -begin:t,relevance:0,starts:m}]},{className:"tag",begin:a(/<\//,n(a(t,/>/))), -contains:[{className:"name",begin:t,relevance:0},{begin:/>/,relevance:0}]}]}} -})());hljs.registerLanguage("markdown",(()=>{"use strict";function n(...n){ -return n.map((n=>{return(e=n)?"string"==typeof e?e:e.source:null;var e -})).join("")}return e=>{const a={begin:/<\/?[A-Za-z_]/,end:">", -subLanguage:"xml",relevance:0},i={variants:[{begin:/\[.+?\]\[.*?\]/,relevance:0 -},{begin:/\[.+?\]\(((data|javascript|mailto):|(?:http|ftp)s?:\/\/).*?\)/, -relevance:2},{begin:n(/\[.+?\]\(/,/[A-Za-z][A-Za-z0-9+.-]*/,/:\/\/.*?\)/), -relevance:2},{begin:/\[.+?\]\([./?&#].*?\)/,relevance:1},{ -begin:/\[.+?\]\(.*?\)/,relevance:0}],returnBegin:!0,contains:[{ -className:"string",relevance:0,begin:"\\[",end:"\\]",excludeBegin:!0, -returnEnd:!0},{className:"link",relevance:0,begin:"\\]\\(",end:"\\)", -excludeBegin:!0,excludeEnd:!0},{className:"symbol",relevance:0,begin:"\\]\\[", -end:"\\]",excludeBegin:!0,excludeEnd:!0}]},s={className:"strong",contains:[], -variants:[{begin:/_{2}/,end:/_{2}/},{begin:/\*{2}/,end:/\*{2}/}]},c={ -className:"emphasis",contains:[],variants:[{begin:/\*(?!\*)/,end:/\*/},{ -begin:/_(?!_)/,end:/_/,relevance:0}]};s.contains.push(c),c.contains.push(s) -;let t=[a,i] -;return s.contains=s.contains.concat(t),c.contains=c.contains.concat(t), -t=t.concat(s,c),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{ -className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:t},{ -begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n", -contains:t}]}]},a,{className:"bullet",begin:"^[ \t]*([*+-]|(\\d+\\.))(?=\\s+)", -end:"\\s+",excludeEnd:!0},s,c,{className:"quote",begin:"^>\\s+",contains:t, -end:"$"},{className:"code",variants:[{begin:"(`{3,})[^`](.|\\n)*?\\1`*[ ]*"},{ -begin:"(~{3,})[^~](.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{ -begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))", -contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},{ -begin:"^[-\\*]{3,}",end:"$"},i,{begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{ -className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{ -className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]}]}}})());hljs.registerLanguage("c",(()=>{"use strict";function e(e){ -return((...e)=>e.map((e=>(e=>e?"string"==typeof e?e:e.source:null)(e))).join(""))("(",e,")?") -}return t=>{const n=(t=>{const n=t.COMMENT("//","$",{contains:[{begin:/\\\n/}] -}),r="[a-zA-Z_]\\w*::",a="(decltype\\(auto\\)|"+e(r)+"[a-zA-Z_]\\w*"+e("<[^<>]+>")+")",s={ -className:"keyword",begin:"\\b[a-z\\d_]*_t\\b"},i={className:"string", -variants:[{begin:'(u8?|U|L)?"',end:'"',illegal:"\\n", -contains:[t.BACKSLASH_ESCAPE]},{ -begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)", -end:"'",illegal:"."},t.END_SAME_AS_BEGIN({ -begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},o={ -className:"number",variants:[{begin:"\\b(0b[01']+)"},{ -begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)" -},{ -begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)" -}],relevance:0},c={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{ -"meta-keyword":"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include" -},contains:[{begin:/\\\n/,relevance:0},t.inherit(i,{className:"meta-string"}),{ -className:"meta-string",begin:/<.*?>/,end:/$/,illegal:"\\n" -},n,t.C_BLOCK_COMMENT_MODE]},l={className:"title",begin:e(r)+t.IDENT_RE, -relevance:0},d=e(r)+t.IDENT_RE+"\\s*\\(",u={ -keyword:"int float while private char char8_t char16_t char32_t catch import module export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using asm case typeid wchar_t short reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignas alignof constexpr consteval constinit decltype concept co_await co_return co_yield requires noexcept static_assert thread_local restrict final override atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong new throw return and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq", -built_in:"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr _Bool complex _Complex imaginary _Imaginary", -literal:"true false nullptr NULL"},m=[c,s,n,t.C_BLOCK_COMMENT_MODE,o,i],p={ -variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{ -beginKeywords:"new throw return else",end:/;/}],keywords:u,contains:m.concat([{ -begin:/\(/,end:/\)/,keywords:u,contains:m.concat(["self"]),relevance:0}]), -relevance:0},_={className:"function",begin:"("+a+"[\\*&\\s]+)+"+d, -returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:u,illegal:/[^\w\s\*&:<>.]/, -contains:[{begin:"decltype\\(auto\\)",keywords:u,relevance:0},{begin:d, -returnBegin:!0,contains:[l],relevance:0},{className:"params",begin:/\(/, -end:/\)/,keywords:u,relevance:0,contains:[n,t.C_BLOCK_COMMENT_MODE,i,o,s,{ -begin:/\(/,end:/\)/,keywords:u,relevance:0, -contains:["self",n,t.C_BLOCK_COMMENT_MODE,i,o,s]}] -},s,n,t.C_BLOCK_COMMENT_MODE,c]};return{ -aliases:["c","cc","h","c++","h++","hpp","hh","hxx","cxx"],keywords:u, -disableAutodetect:!0,illegal:"",keywords:u,contains:["self",s]},{begin:t.IDENT_RE+"::",keywords:u},{ -className:"class",beginKeywords:"enum class struct union",end:/[{;:<>=]/, -contains:[{beginKeywords:"final class struct"},t.TITLE_MODE]}]),exports:{ -preprocessor:c,strings:i,keywords:u}}})(t) -;return n.name="C",n.aliases=["c","h"],n}})());hljs.registerLanguage("css",(()=>{"use strict";return e=>{ -var n="[a-zA-Z-][a-zA-Z0-9_-]*",a={ -begin:/([*]\s?)?(?:[A-Z_.\-\\]+|--[a-zA-Z0-9_-]+)\s*(\/\*\*\/)?:/, -returnBegin:!0,end:";",endsWithParent:!0,contains:[{className:"attribute", -begin:/\S/,end:":",excludeEnd:!0,starts:{endsWithParent:!0,excludeEnd:!0, -contains:[{begin:/[\w-]+\(/,returnBegin:!0,contains:[{className:"built_in", -begin:/[\w-]+/},{begin:/\(/,end:/\)/, -contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.CSS_NUMBER_MODE]}] -},e.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,e.C_BLOCK_COMMENT_MODE,{ -className:"number",begin:"#[0-9A-Fa-f]+"},{className:"meta",begin:"!important"}] -}}]};return{name:"CSS",case_insensitive:!0,illegal:/[=|'\$]/, -contains:[e.C_BLOCK_COMMENT_MODE,{className:"selector-id", -begin:/#[A-Za-z0-9_-]+/},{className:"selector-class",begin:"\\."+n},{ -className:"selector-attr",begin:/\[/,end:/\]/,illegal:"$", -contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},{className:"selector-pseudo", -begin:/:(:)?[a-zA-Z0-9_+()"'.-]+/},{begin:"@(page|font-face)", -lexemes:"@[a-z-]+",keywords:"@page @font-face"},{begin:"@",end:"[{;]", -illegal:/:/,returnBegin:!0,contains:[{className:"keyword", -begin:/@-?\w[\w]*(-\w+)*/},{begin:/\s/,endsWithParent:!0,excludeEnd:!0, -relevance:0,keywords:"and or not only",contains:[{begin:/[a-z-]+:/, -className:"attribute"},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.CSS_NUMBER_MODE] -}]},{className:"selector-tag",begin:n,relevance:0},{begin:/\{/,end:/\}/, -illegal:/\S/,contains:[e.C_BLOCK_COMMENT_MODE,{begin:/;/},a]}]}}})());hljs.registerLanguage("plaintext",(()=>{"use strict";return t=>({ -name:"Plain text",aliases:["text","txt"],disableAutodetect:!0})})());hljs.registerLanguage("cpp",(()=>{"use strict";function e(e){ -return((...e)=>e.map((e=>(e=>e?"string"==typeof e?e:e.source:null)(e))).join(""))("(",e,")?") -}return t=>{const n=(t=>{const n=t.COMMENT("//","$",{contains:[{begin:/\\\n/}] -}),r="[a-zA-Z_]\\w*::",a="(decltype\\(auto\\)|"+e(r)+"[a-zA-Z_]\\w*"+e("<[^<>]+>")+")",s={ -className:"keyword",begin:"\\b[a-z\\d_]*_t\\b"},i={className:"string", -variants:[{begin:'(u8?|U|L)?"',end:'"',illegal:"\\n", -contains:[t.BACKSLASH_ESCAPE]},{ -begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)", -end:"'",illegal:"."},t.END_SAME_AS_BEGIN({ -begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},c={ -className:"number",variants:[{begin:"\\b(0b[01']+)"},{ -begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)" -},{ -begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)" -}],relevance:0},o={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{ -"meta-keyword":"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include" -},contains:[{begin:/\\\n/,relevance:0},t.inherit(i,{className:"meta-string"}),{ -className:"meta-string",begin:/<.*?>/,end:/$/,illegal:"\\n" -},n,t.C_BLOCK_COMMENT_MODE]},l={className:"title",begin:e(r)+t.IDENT_RE, -relevance:0},d=e(r)+t.IDENT_RE+"\\s*\\(",u={ -keyword:"int float while private char char8_t char16_t char32_t catch import module export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using asm case typeid wchar_t short reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignas alignof constexpr consteval constinit decltype concept co_await co_return co_yield requires noexcept static_assert thread_local restrict final override atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong new throw return and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq", -built_in:"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr _Bool complex _Complex imaginary _Imaginary", -literal:"true false nullptr NULL"},p=[o,s,n,t.C_BLOCK_COMMENT_MODE,c,i],m={ -variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{ -beginKeywords:"new throw return else",end:/;/}],keywords:u,contains:p.concat([{ -begin:/\(/,end:/\)/,keywords:u,contains:p.concat(["self"]),relevance:0}]), -relevance:0},_={className:"function",begin:"("+a+"[\\*&\\s]+)+"+d, -returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:u,illegal:/[^\w\s\*&:<>.]/, -contains:[{begin:"decltype\\(auto\\)",keywords:u,relevance:0},{begin:d, -returnBegin:!0,contains:[l],relevance:0},{className:"params",begin:/\(/, -end:/\)/,keywords:u,relevance:0,contains:[n,t.C_BLOCK_COMMENT_MODE,i,c,s,{ -begin:/\(/,end:/\)/,keywords:u,relevance:0, -contains:["self",n,t.C_BLOCK_COMMENT_MODE,i,c,s]}] -},s,n,t.C_BLOCK_COMMENT_MODE,o]};return{ -aliases:["c","cc","h","c++","h++","hpp","hh","hxx","cxx"],keywords:u, -disableAutodetect:!0,illegal:"",keywords:u,contains:["self",s]},{begin:t.IDENT_RE+"::",keywords:u},{ -className:"class",beginKeywords:"enum class struct union",end:/[{;:<>=]/, -contains:[{beginKeywords:"final class struct"},t.TITLE_MODE]}]),exports:{ -preprocessor:o,strings:i,keywords:u}}})(t) -;return n.disableAutodetect=!1,n.name="C++", -n.aliases=["cc","c++","h++","hpp","hh","hxx","cxx"],n}})());hljs.registerLanguage("python",(()=>{"use strict";return e=>{const n={ -keyword:"and as assert async await break class continue def del elif else except finally for from global if import in is lambda nonlocal|10 not or pass raise return try while with yield", -built_in:"__import__ abs all any ascii bin bool breakpoint bytearray bytes callable chr classmethod compile complex delattr dict dir divmod enumerate eval exec filter float format frozenset getattr globals hasattr hash help hex id input int isinstance issubclass iter len list locals map max memoryview min next object oct open ord pow print property range repr reversed round set setattr slice sorted staticmethod str sum super tuple type vars zip", -literal:"__debug__ Ellipsis False None NotImplemented True"},a={ -className:"meta",begin:/^(>>>|\.\.\.) /},s={className:"subst",begin:/\{/, -end:/\}/,keywords:n,illegal:/#/},i={begin:/\{\{/,relevance:0},r={ -className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{ -begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/,end:/'''/, -contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{ -begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?"""/,end:/"""/, -contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{ -begin:/([fF][rR]|[rR][fF]|[fF])'''/,end:/'''/, -contains:[e.BACKSLASH_ESCAPE,a,i,s]},{begin:/([fF][rR]|[rR][fF]|[fF])"""/, -end:/"""/,contains:[e.BACKSLASH_ESCAPE,a,i,s]},{begin:/([uU]|[rR])'/,end:/'/, -relevance:10},{begin:/([uU]|[rR])"/,end:/"/,relevance:10},{ -begin:/([bB]|[bB][rR]|[rR][bB])'/,end:/'/},{begin:/([bB]|[bB][rR]|[rR][bB])"/, -end:/"/},{begin:/([fF][rR]|[rR][fF]|[fF])'/,end:/'/, -contains:[e.BACKSLASH_ESCAPE,i,s]},{begin:/([fF][rR]|[rR][fF]|[fF])"/,end:/"/, -contains:[e.BACKSLASH_ESCAPE,i,s]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE] -},t="[0-9](_?[0-9])*",l=`(\\b(${t}))?\\.(${t})|\\b(${t})\\.`,b={ -className:"number",relevance:0,variants:[{ -begin:`(\\b(${t})|(${l}))[eE][+-]?(${t})[jJ]?\\b`},{begin:`(${l})[jJ]?`},{ -begin:"\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?\\b"},{ -begin:"\\b0[bB](_?[01])+[lL]?\\b"},{begin:"\\b0[oO](_?[0-7])+[lL]?\\b"},{ -begin:"\\b0[xX](_?[0-9a-fA-F])+[lL]?\\b"},{begin:`\\b(${t})[jJ]\\b`}]},o={ -className:"params",variants:[{begin:/\(\s*\)/,skip:!0,className:null},{ -begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:n, -contains:["self",a,b,r,e.HASH_COMMENT_MODE]}]};return s.contains=[r,b,a],{ -name:"Python",aliases:["py","gyp","ipython"],keywords:n, -illegal:/(<\/|->|\?)|=>/,contains:[a,b,{begin:/\bself\b/},{beginKeywords:"if", -relevance:0},r,e.HASH_COMMENT_MODE,{variants:[{className:"function", -beginKeywords:"def"},{className:"class",beginKeywords:"class"}],end:/:/, -illegal:/[${=;\n,]/,contains:[e.UNDERSCORE_TITLE_MODE,o,{begin:/->/, -endsWithParent:!0,keywords:"None"}]},{className:"meta",begin:/^[\t ]*@/, -end:/(?=#)|$/,contains:[b,o,r]},{begin:/\b(print|exec)\(/}]}}})());hljs.registerLanguage("python-repl",(()=>{"use strict";return s=>({ -aliases:["pycon"],contains:[{className:"meta",starts:{end:/ |$/,starts:{end:"$", -subLanguage:"python"}},variants:[{begin:/^>>>(?=[ ]|$)/},{ -begin:/^\.\.\.(?=[ ]|$)/}]}]})})());hljs.registerLanguage("bash",(()=>{"use strict";function e(...e){ -return e.map((e=>{return(s=e)?"string"==typeof s?s:s.source:null;var s -})).join("")}return s=>{const n={},t={begin:/\$\{/,end:/\}/,contains:["self",{ -begin:/:-/,contains:[n]}]};Object.assign(n,{className:"variable",variants:[{ -begin:e(/\$[\w\d#@][\w\d_]*/,"(?![\\w\\d])(?![$])")},t]});const a={ -className:"subst",begin:/\$\(/,end:/\)/,contains:[s.BACKSLASH_ESCAPE]},i={ -begin:/<<-?\s*(?=\w+)/,starts:{contains:[s.END_SAME_AS_BEGIN({begin:/(\w+)/, -end:/(\w+)/,className:"string"})]}},c={className:"string",begin:/"/,end:/"/, -contains:[s.BACKSLASH_ESCAPE,n,a]};a.contains.push(c);const o={begin:/\$\(\(/, -end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},s.NUMBER_MODE,n] -},r=s.SHEBANG({binary:"(fish|bash|zsh|sh|csh|ksh|tcsh|dash|scsh)",relevance:10 -}),l={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0, -contains:[s.inherit(s.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{ -name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b[a-z._-]+\b/, -keyword:"if then else elif fi for while in do done case esac function", -literal:"true false", -built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp" -},contains:[r,s.SHEBANG(),l,o,s.HASH_COMMENT_MODE,i,c,{className:"",begin:/\\"/ -},{className:"string",begin:/'/,end:/'/},n]}}})());hljs.registerLanguage("shell",(()=>{"use strict";return s=>({ -name:"Shell Session",aliases:["console"],contains:[{className:"meta", -begin:/^\s{0,3}[/~\w\d[\]()@-]*[>%$#]/,starts:{end:/[^\\](?=\s*$)/, -subLanguage:"bash"}}]})})());hljs.registerLanguage("r",(()=>{"use strict";function e(...e){return e.map((e=>{ -return(a=e)?"string"==typeof a?a:a.source:null;var a})).join("")}return a=>{ -const n=/(?:(?:[a-zA-Z]|\.[._a-zA-Z])[._a-zA-Z0-9]*)|\.(?!\d)/;return{name:"R", -illegal:/->/,keywords:{$pattern:n, -keyword:"function if in break next repeat else for while", -literal:"NULL NA TRUE FALSE Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10", -built_in:"LETTERS letters month.abb month.name pi T F abs acos acosh all any anyNA Arg as.call as.character as.complex as.double as.environment as.integer as.logical as.null.default as.numeric as.raw asin asinh atan atanh attr attributes baseenv browser c call ceiling class Conj cos cosh cospi cummax cummin cumprod cumsum digamma dim dimnames emptyenv exp expression floor forceAndCall gamma gc.time globalenv Im interactive invisible is.array is.atomic is.call is.character is.complex is.double is.environment is.expression is.finite is.function is.infinite is.integer is.language is.list is.logical is.matrix is.na is.name is.nan is.null is.numeric is.object is.pairlist is.raw is.recursive is.single is.symbol lazyLoadDBfetch length lgamma list log max min missing Mod names nargs nzchar oldClass on.exit pos.to.env proc.time prod quote range Re rep retracemem return round seq_along seq_len seq.int sign signif sin sinh sinpi sqrt standardGeneric substitute sum switch tan tanh tanpi tracemem trigamma trunc unclass untracemem UseMethod xtfrm" -},compilerExtensions:[(a,n)=>{if(!a.beforeMatch)return -;if(a.starts)throw Error("beforeMatch cannot be used with starts") -;const i=Object.assign({},a);Object.keys(a).forEach((e=>{delete a[e] -})),a.begin=e(i.beforeMatch,e("(?=",i.begin,")")),a.starts={relevance:0, -contains:[Object.assign(i,{endsParent:!0})]},a.relevance=0,delete i.beforeMatch -}],contains:[a.COMMENT(/#'/,/$/,{contains:[{className:"doctag", -begin:"@examples",starts:{contains:[{begin:/\n/},{begin:/#'\s*(?=@[a-zA-Z]+)/, -endsParent:!0},{begin:/#'/,end:/$/,excludeBegin:!0}]}},{className:"doctag", -begin:"@param",end:/$/,contains:[{className:"variable",variants:[{begin:n},{ -begin:/`(?:\\.|[^`\\])+`/}],endsParent:!0}]},{className:"doctag", -begin:/@[a-zA-Z]+/},{className:"meta-keyword",begin:/\\[a-zA-Z]+/}] -}),a.HASH_COMMENT_MODE,{className:"string",contains:[a.BACKSLASH_ESCAPE], -variants:[a.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\(/,end:/\)(-*)"/ -}),a.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\{/,end:/\}(-*)"/ -}),a.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\[/,end:/\](-*)"/ -}),a.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\(/,end:/\)(-*)'/ -}),a.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\{/,end:/\}(-*)'/ -}),a.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\[/,end:/\](-*)'/}),{begin:'"',end:'"', -relevance:0},{begin:"'",end:"'",relevance:0}]},{className:"number",relevance:0, -beforeMatch:/([^a-zA-Z0-9._])/,variants:[{ -match:/0[xX][0-9a-fA-F]+\.[0-9a-fA-F]*[pP][+-]?\d+i?/},{ -match:/0[xX][0-9a-fA-F]+([pP][+-]?\d+)?[Li]?/},{ -match:/(\d+(\.\d*)?|\.\d+)([eE][+-]?\d+)?[Li]?/}]},{begin:"%",end:"%"},{ -begin:e(/[a-zA-Z][a-zA-Z_0-9]*/,"\\s+<-\\s+")},{begin:"`",end:"`",contains:[{ -begin:/\\./}]}]}}})());hljs.registerLanguage("ini",(()=>{"use strict";function e(e){ -return e?"string"==typeof e?e:e.source:null}function n(...n){ -return n.map((n=>e(n))).join("")}return s=>{const a={className:"number", -relevance:0,variants:[{begin:/([+-]+)?[\d]+_[\d_]+/},{begin:s.NUMBER_RE}] -},i=s.COMMENT();i.variants=[{begin:/;/,end:/$/},{begin:/#/,end:/$/}];const t={ -className:"variable",variants:[{begin:/\$[\w\d"][\w\d_]*/},{begin:/\$\{(.*?)\}/ -}]},r={className:"literal",begin:/\bon|off|true|false|yes|no\b/},l={ -className:"string",contains:[s.BACKSLASH_ESCAPE],variants:[{begin:"'''", -end:"'''",relevance:10},{begin:'"""',end:'"""',relevance:10},{begin:'"',end:'"' -},{begin:"'",end:"'"}]},c={begin:/\[/,end:/\]/,contains:[i,r,t,l,a,"self"], -relevance:0 -},g="("+[/[A-Za-z0-9_-]+/,/"(\\"|[^"])*"/,/'[^']*'/].map((n=>e(n))).join("|")+")" -;return{name:"TOML, also INI",aliases:["toml"],case_insensitive:!0,illegal:/\S/, -contains:[i,{className:"section",begin:/\[+/,end:/\]+/},{ -begin:n(g,"(\\s*\\.\\s*",g,")*",n("(?=",/\s*=\s*[^#\s]/,")")),className:"attr", -starts:{end:/$/,contains:[i,c,r,t,l,a]}}]}}})());hljs.registerLanguage("ruby",(()=>{"use strict";function e(...e){ -return e.map((e=>{return(n=e)?"string"==typeof n?n:n.source:null;var n -})).join("")}return n=>{ -var a,i="([a-zA-Z_]\\w*[!?=]?|[-+~]@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?)",s={ -keyword:"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor __FILE__", -built_in:"proc lambda",literal:"true false nil"},r={className:"doctag", -begin:"@[A-Za-z]+"},b={begin:"#<",end:">"},t=[n.COMMENT("#","$",{contains:[r] -}),n.COMMENT("^=begin","^=end",{contains:[r],relevance:10 -}),n.COMMENT("^__END__","\\n$")],c={className:"subst",begin:/#\{/,end:/\}/, -keywords:s},d={className:"string",contains:[n.BACKSLASH_ESCAPE,c],variants:[{ -begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/`/,end:/`/},{begin:/%[qQwWx]?\(/, -end:/\)/},{begin:/%[qQwWx]?\[/,end:/\]/},{begin:/%[qQwWx]?\{/,end:/\}/},{ -begin:/%[qQwWx]?/},{begin:/%[qQwWx]?\//,end:/\//},{begin:/%[qQwWx]?%/, -end:/%/},{begin:/%[qQwWx]?-/,end:/-/},{begin:/%[qQwWx]?\|/,end:/\|/},{ -begin:/\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/},{ -begin:/<<[-~]?'?(\w+)\n(?:[^\n]*\n)*?\s*\1\b/,returnBegin:!0,contains:[{ -begin:/<<[-~]?'?/},n.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/, -contains:[n.BACKSLASH_ESCAPE,c]})]}]},g="[0-9](_?[0-9])*",l={className:"number", -relevance:0,variants:[{ -begin:`\\b([1-9](_?[0-9])*|0)(\\.(${g}))?([eE][+-]?(${g})|r)?i?\\b`},{ -begin:"\\b0[dD][0-9](_?[0-9])*r?i?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*r?i?\\b" -},{begin:"\\b0[oO][0-7](_?[0-7])*r?i?\\b"},{ -begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*r?i?\\b"},{ -begin:"\\b0(_?[0-7])+r?i?\\b"}]},o={className:"params",begin:"\\(",end:"\\)", -endsParent:!0,keywords:s},_=[d,{className:"class",beginKeywords:"class module", -end:"$|;",illegal:/=/,contains:[n.inherit(n.TITLE_MODE,{ -begin:"[A-Za-z_]\\w*(::\\w+)*(\\?|!)?"}),{begin:"<\\s*",contains:[{ -begin:"("+n.IDENT_RE+"::)?"+n.IDENT_RE}]}].concat(t)},{className:"function", -begin:e(/def\s*/,(a=i+"\\s*(\\(|;|$)",e("(?=",a,")"))),keywords:"def",end:"$|;", -contains:[n.inherit(n.TITLE_MODE,{begin:i}),o].concat(t)},{begin:n.IDENT_RE+"::" -},{className:"symbol",begin:n.UNDERSCORE_IDENT_RE+"(!|\\?)?:",relevance:0},{ -className:"symbol",begin:":(?!\\s)",contains:[d,{begin:i}],relevance:0},l,{ -className:"variable", -begin:"(\\$\\W)|((\\$|@@?)(\\w+))(?=[^@$?])(?![A-Za-z])(?![@$?'])"},{ -className:"params",begin:/\|/,end:/\|/,relevance:0,keywords:s},{ -begin:"("+n.RE_STARTERS_RE+"|unless)\\s*",keywords:"unless",contains:[{ -className:"regexp",contains:[n.BACKSLASH_ESCAPE,c],illegal:/\n/,variants:[{ -begin:"/",end:"/[a-z]*"},{begin:/%r\{/,end:/\}[a-z]*/},{begin:"%r\\(", -end:"\\)[a-z]*"},{begin:"%r!",end:"![a-z]*"},{begin:"%r\\[",end:"\\][a-z]*"}] -}].concat(b,t),relevance:0}].concat(b,t);c.contains=_,o.contains=_;var E=[{ -begin:/^\s*=>/,starts:{end:"$",contains:_}},{className:"meta", -begin:"^([>?]>|[\\w#]+\\(\\w+\\):\\d+:\\d+>|(\\w+-)?\\d+\\.\\d+\\.\\d+(p\\d+)?[^\\d][^>]+>)(?=[ ])", -starts:{end:"$",contains:_}}];return t.unshift(b),{name:"Ruby", -aliases:["rb","gemspec","podspec","thor","irb"],keywords:s,illegal:/\/\*/, -contains:[n.SHEBANG({binary:"ruby"})].concat(E).concat(t).concat(_)}}})());hljs.registerLanguage("yaml",(()=>{"use strict";return e=>{ -var n="true false yes no null",a="[\\w#;/?:@&=+$,.~*'()[\\]]+",s={ -className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/ -},{begin:/\S+/}],contains:[e.BACKSLASH_ESCAPE,{className:"template-variable", -variants:[{begin:/\{\{/,end:/\}\}/},{begin:/%\{/,end:/\}/}]}]},i=e.inherit(s,{ -variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),l={ -end:",",endsWithParent:!0,excludeEnd:!0,contains:[],keywords:n,relevance:0},t={ -begin:/\{/,end:/\}/,contains:[l],illegal:"\\n",relevance:0},g={begin:"\\[", -end:"\\]",contains:[l],illegal:"\\n",relevance:0},b=[{className:"attr", -variants:[{begin:"\\w[\\w :\\/.-]*:(?=[ \t]|$)"},{ -begin:'"\\w[\\w :\\/.-]*":(?=[ \t]|$)'},{begin:"'\\w[\\w :\\/.-]*':(?=[ \t]|$)" -}]},{className:"meta",begin:"^---\\s*$",relevance:10},{className:"string", -begin:"[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*"},{ -begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0, -relevance:0},{className:"type",begin:"!\\w+!"+a},{className:"type", -begin:"!<"+a+">"},{className:"type",begin:"!"+a},{className:"type",begin:"!!"+a -},{className:"meta",begin:"&"+e.UNDERSCORE_IDENT_RE+"$"},{className:"meta", -begin:"\\*"+e.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"-(?=[ ]|$)", -relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:n,keywords:{literal:n}},{ -className:"number", -begin:"\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b" -},{className:"number",begin:e.C_NUMBER_RE+"\\b",relevance:0},t,g,s],r=[...b] -;return r.pop(),r.push(i),l.contains=r,{name:"YAML",case_insensitive:!0, -aliases:["yml","YAML"],contains:b}}})());hljs.registerLanguage("julia",(()=>{"use strict";return e=>{ -var r="[A-Za-z_\\u00A1-\\uFFFF][A-Za-z_0-9\\u00A1-\\uFFFF]*",t={$pattern:r, -keyword:"baremodule begin break catch ccall const continue do else elseif end export false finally for function global if import in isa let local macro module quote return true try using where while", -literal:"ARGS C_NULL DEPOT_PATH ENDIAN_BOM ENV Inf Inf16 Inf32 Inf64 InsertionSort LOAD_PATH MergeSort NaN NaN16 NaN32 NaN64 PROGRAM_FILE QuickSort RoundDown RoundFromZero RoundNearest RoundNearestTiesAway RoundNearestTiesUp RoundToZero RoundUp VERSION|0 devnull false im missing nothing pi stderr stdin stdout true undef \u03c0 \u212f", -built_in:"AbstractArray AbstractChannel AbstractChar AbstractDict AbstractDisplay AbstractFloat AbstractIrrational AbstractMatrix AbstractRange AbstractSet AbstractString AbstractUnitRange AbstractVecOrMat AbstractVector Any ArgumentError Array AssertionError BigFloat BigInt BitArray BitMatrix BitSet BitVector Bool BoundsError CapturedException CartesianIndex CartesianIndices Cchar Cdouble Cfloat Channel Char Cint Cintmax_t Clong Clonglong Cmd Colon Complex ComplexF16 ComplexF32 ComplexF64 CompositeException Condition Cptrdiff_t Cshort Csize_t Cssize_t Cstring Cuchar Cuint Cuintmax_t Culong Culonglong Cushort Cvoid Cwchar_t Cwstring DataType DenseArray DenseMatrix DenseVecOrMat DenseVector Dict DimensionMismatch Dims DivideError DomainError EOFError Enum ErrorException Exception ExponentialBackOff Expr Float16 Float32 Float64 Function GlobalRef HTML IO IOBuffer IOContext IOStream IdDict IndexCartesian IndexLinear IndexStyle InexactError InitError Int Int128 Int16 Int32 Int64 Int8 Integer InterruptException InvalidStateException Irrational KeyError LinRange LineNumberNode LinearIndices LoadError MIME Matrix Method MethodError Missing MissingException Module NTuple NamedTuple Nothing Number OrdinalRange OutOfMemoryError OverflowError Pair PartialQuickSort PermutedDimsArray Pipe ProcessFailedException Ptr QuoteNode Rational RawFD ReadOnlyMemoryError Real ReentrantLock Ref Regex RegexMatch RoundingMode SegmentationFault Set Signed Some StackOverflowError StepRange StepRangeLen StridedArray StridedMatrix StridedVecOrMat StridedVector String StringIndexError SubArray SubString SubstitutionString Symbol SystemError Task TaskFailedException Text TextDisplay Timer Tuple Type TypeError TypeVar UInt UInt128 UInt16 UInt32 UInt64 UInt8 UndefInitializer UndefKeywordError UndefRefError UndefVarError Union UnionAll UnitRange Unsigned Val Vararg VecElement VecOrMat Vector VersionNumber WeakKeyDict WeakRef" -},n={keywords:t,illegal:/<\//},a={className:"subst",begin:/\$\(/,end:/\)/, -keywords:t},i={className:"variable",begin:"\\$"+r},o={className:"string", -contains:[e.BACKSLASH_ESCAPE,a,i],variants:[{begin:/\w*"""/,end:/"""\w*/, -relevance:10},{begin:/\w*"/,end:/"\w*/}]},s={className:"string", -contains:[e.BACKSLASH_ESCAPE,a,i],begin:"`",end:"`"},l={className:"meta", -begin:"@"+r};return n.name="Julia",n.contains=[{className:"number", -begin:/(\b0x[\d_]*(\.[\d_]*)?|0x\.\d[\d_]*)p[-+]?\d+|\b0[box][a-fA-F0-9][a-fA-F0-9_]*|(\b\d[\d_]*(\.[\d_]*)?|\.\d[\d_]*)([eEfF][-+]?\d+)?/, -relevance:0},{className:"string",begin:/'(.|\\[xXuU][a-zA-Z0-9]+)'/},o,s,l,{ -className:"comment",variants:[{begin:"#=",end:"=#",relevance:10},{begin:"#", -end:"$"}]},e.HASH_COMMENT_MODE,{className:"keyword", -begin:"\\b(((abstract|primitive)\\s+)type|(mutable\\s+)?struct)\\b"},{begin:/<:/ -}],a.contains=n.contains,n}})());hljs.registerLanguage("julia-repl",(()=>{"use strict";return a=>({name:"Julia REPL",contains:[{className:"meta",begin:/^julia>/,relevance:10,starts:{end:/^(?![ ]{6})/,subLanguage:"julia"}},{className:"metas",begin:/^shell>/,relevance:10,starts:{end:/^(?![ ]{6})/,subLanguage:"bash"}},{className:"metap",begin:/^\(.*\)\spkg>/,relevance:10,starts:{end:/^(?![ ]{6})/,subLanguage:"julia"}}]})})()); diff --git a/website/_libs/katex/auto-render.min.js b/website/_libs/katex/auto-render.min.js deleted file mode 100644 index 840e74b..0000000 --- a/website/_libs/katex/auto-render.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("katex")):"function"==typeof define&&define.amd?define(["katex"],t):"object"==typeof exports?exports.renderMathInElement=t(require("katex")):e.renderMathInElement=t(e.katex)}("undefined"!=typeof self?self:this,function(e){return function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}return r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=1)}([function(t,r){t.exports=e},function(e,t,r){"use strict";r.r(t);var n=r(0),o=r.n(n),a=function(e,t,r){for(var n=r,o=0,a=e.length;n .newline { display: block; } -.katex .base { position: relative; white-space: nowrap; width: min-content; } - -.katex .base, -.katex .strut { display: inline-block; } -.katex .textbf { font-weight: 700; } -.katex .textit { font-style: italic; } -.katex .textrm { font-family: KaTeX_Main; } -.katex .textsf { font-family: KaTeX_SansSerif; } -.katex .texttt { font-family: KaTeX_Typewriter; } -.katex .mathnormal { font-family: KaTeX_Math; font-style: italic; } -.katex .mathit { font-family: KaTeX_Main; font-style: italic; } -.katex .mathrm { font-style: normal; } -.katex .mathbf { font-family: KaTeX_Main; font-weight: 700; } -.katex .boldsymbol { font-family: KaTeX_Math; font-weight: 700; font-style: italic; } - -.katex .amsrm, -.katex .mathbb, -.katex .textbb { font-family: KaTeX_AMS; } -.katex .mathcal { font-family: KaTeX_Caligraphic; } - -.katex .mathfrak, -.katex .textfrak { font-family: KaTeX_Fraktur; } -.katex .mathtt { font-family: KaTeX_Typewriter; } - -.katex .mathscr, -.katex .textscr { font-family: KaTeX_Script; } - -.katex .mathsf, -.katex .textsf { font-family: KaTeX_SansSerif; } - -.katex .mathboldsf, -.katex .textboldsf { font-family: KaTeX_SansSerif; font-weight: 700; } - -.katex .mathitsf, -.katex .textitsf { font-family: KaTeX_SansSerif; font-style: italic; } -.katex .mainrm { font-family: KaTeX_Main; font-style: normal; } -.katex .vlist-t { display: inline-table; table-layout: fixed; border-collapse: collapse; } -.katex .vlist-r { display: table-row; } -.katex .vlist { display: table-cell; vertical-align: bottom; position: relative; } -.katex .vlist > span { display: block; height: 0; position: relative; } -.katex .vlist > span > span { display: inline-block; } -.katex .vlist > span > .pstrut { overflow: hidden; width: 0; } -.katex .vlist-t2 { margin-right: -2px; } -.katex .vlist-s { display: table-cell; vertical-align: bottom; font-size: 1px; width: 2px; min-width: 2px; } -.katex .vbox { -ms-flex-direction: column; flex-direction: column; align-items: baseline; } - -.katex .hbox, -.katex .vbox { display: -ms-inline-flexbox; display: inline-flex; } -.katex .hbox { -ms-flex-direction: row; flex-direction: row; width: 100%; } -.katex .thinbox { display: inline-flex; flex-direction: row; width: 0; max-width: 0; } -.katex .msupsub { text-align: left; } -.katex .mfrac > span > span { text-align: center; } -.katex .mfrac .frac-line { display: inline-block; width: 100%; border-bottom-style: solid; } - -.katex .hdashline, -.katex .hline, -.katex .mfrac .frac-line, -.katex .overline .overline-line, -.katex .rule, -.katex .underline .underline-line { min-height: 1px; } -.katex .mspace { display: inline-block; } - -.katex .clap, -.katex .llap, -.katex .rlap { width: 0; position: relative; } - -.katex .clap > .inner, -.katex .llap > .inner, -.katex .rlap > .inner { position: absolute; } - -.katex .clap > .fix, -.katex .llap > .fix, -.katex .rlap > .fix { display: inline-block; } -.katex .llap > .inner { right: 0; } - -.katex .clap > .inner, -.katex .rlap > .inner { left: 0; } -.katex .clap > .inner > span { margin-left: -50%; margin-right: 50%; } -.katex .rule { display: inline-block; border: 0 solid; position: relative; } - -.katex .hline, -.katex .overline .overline-line, -.katex .underline .underline-line { display: inline-block; width: 100%; border-bottom-style: solid; } -.katex .hdashline { display: inline-block; width: 100%; border-bottom-style: dashed; } -.katex .sqrt > .root { margin-left: 0.27777778em; margin-right: -0.55555556em; } - -.katex .fontsize-ensurer.reset-size1.size1, -.katex .sizing.reset-size1.size1 { font-size: 1em; } - -.katex .fontsize-ensurer.reset-size1.size2, -.katex .sizing.reset-size1.size2 { font-size: 1.2em; } - -.katex .fontsize-ensurer.reset-size1.size3, -.katex .sizing.reset-size1.size3 { font-size: 1.4em; } - -.katex .fontsize-ensurer.reset-size1.size4, -.katex .sizing.reset-size1.size4 { font-size: 1.6em; } - -.katex .fontsize-ensurer.reset-size1.size5, -.katex .sizing.reset-size1.size5 { font-size: 1.8em; } - -.katex .fontsize-ensurer.reset-size1.size6, -.katex .sizing.reset-size1.size6 { font-size: 2em; } - -.katex .fontsize-ensurer.reset-size1.size7, -.katex .sizing.reset-size1.size7 { font-size: 2.4em; } - -.katex .fontsize-ensurer.reset-size1.size8, -.katex .sizing.reset-size1.size8 { font-size: 2.88em; } - -.katex .fontsize-ensurer.reset-size1.size9, -.katex .sizing.reset-size1.size9 { font-size: 3.456em; } - -.katex .fontsize-ensurer.reset-size1.size10, -.katex .sizing.reset-size1.size10 { font-size: 4.148em; } - -.katex .fontsize-ensurer.reset-size1.size11, -.katex .sizing.reset-size1.size11 { font-size: 4.976em; } - -.katex .fontsize-ensurer.reset-size2.size1, -.katex .sizing.reset-size2.size1 { font-size: 0.83333333em; } - -.katex .fontsize-ensurer.reset-size2.size2, -.katex .sizing.reset-size2.size2 { font-size: 1em; } - -.katex .fontsize-ensurer.reset-size2.size3, -.katex .sizing.reset-size2.size3 { font-size: 1.16666667em; } - -.katex .fontsize-ensurer.reset-size2.size4, -.katex .sizing.reset-size2.size4 { font-size: 1.33333333em; } - -.katex .fontsize-ensurer.reset-size2.size5, -.katex .sizing.reset-size2.size5 { font-size: 1.5em; } - -.katex .fontsize-ensurer.reset-size2.size6, -.katex .sizing.reset-size2.size6 { font-size: 1.66666667em; } - -.katex .fontsize-ensurer.reset-size2.size7, -.katex .sizing.reset-size2.size7 { font-size: 2em; } - -.katex .fontsize-ensurer.reset-size2.size8, -.katex .sizing.reset-size2.size8 { font-size: 2.4em; } - -.katex .fontsize-ensurer.reset-size2.size9, -.katex .sizing.reset-size2.size9 { font-size: 2.88em; } - -.katex .fontsize-ensurer.reset-size2.size10, -.katex .sizing.reset-size2.size10 { font-size: 3.45666667em; } - -.katex .fontsize-ensurer.reset-size2.size11, -.katex .sizing.reset-size2.size11 { font-size: 4.14666667em; } - -.katex .fontsize-ensurer.reset-size3.size1, -.katex .sizing.reset-size3.size1 { font-size: 0.71428571em; } - -.katex .fontsize-ensurer.reset-size3.size2, -.katex .sizing.reset-size3.size2 { font-size: 0.85714286em; } - -.katex .fontsize-ensurer.reset-size3.size3, -.katex .sizing.reset-size3.size3 { font-size: 1em; } - -.katex .fontsize-ensurer.reset-size3.size4, -.katex .sizing.reset-size3.size4 { font-size: 1.14285714em; } - -.katex .fontsize-ensurer.reset-size3.size5, -.katex .sizing.reset-size3.size5 { font-size: 1.28571429em; } - -.katex .fontsize-ensurer.reset-size3.size6, -.katex .sizing.reset-size3.size6 { font-size: 1.42857143em; } - -.katex .fontsize-ensurer.reset-size3.size7, -.katex .sizing.reset-size3.size7 { font-size: 1.71428571em; } - -.katex .fontsize-ensurer.reset-size3.size8, -.katex .sizing.reset-size3.size8 { font-size: 2.05714286em; } - -.katex .fontsize-ensurer.reset-size3.size9, -.katex .sizing.reset-size3.size9 { font-size: 2.46857143em; } - -.katex .fontsize-ensurer.reset-size3.size10, -.katex .sizing.reset-size3.size10 { font-size: 2.96285714em; } - -.katex .fontsize-ensurer.reset-size3.size11, -.katex .sizing.reset-size3.size11 { font-size: 3.55428571em; } - -.katex .fontsize-ensurer.reset-size4.size1, -.katex .sizing.reset-size4.size1 { font-size: 0.625em; } - -.katex .fontsize-ensurer.reset-size4.size2, -.katex .sizing.reset-size4.size2 { font-size: 0.75em; } - -.katex .fontsize-ensurer.reset-size4.size3, -.katex .sizing.reset-size4.size3 { font-size: 0.875em; } - -.katex .fontsize-ensurer.reset-size4.size4, -.katex .sizing.reset-size4.size4 { font-size: 1em; } - -.katex .fontsize-ensurer.reset-size4.size5, -.katex .sizing.reset-size4.size5 { font-size: 1.125em; } - -.katex .fontsize-ensurer.reset-size4.size6, -.katex .sizing.reset-size4.size6 { font-size: 1.25em; } - -.katex .fontsize-ensurer.reset-size4.size7, -.katex .sizing.reset-size4.size7 { font-size: 1.5em; } - -.katex .fontsize-ensurer.reset-size4.size8, -.katex .sizing.reset-size4.size8 { font-size: 1.8em; } - -.katex .fontsize-ensurer.reset-size4.size9, -.katex .sizing.reset-size4.size9 { font-size: 2.16em; } - -.katex .fontsize-ensurer.reset-size4.size10, -.katex .sizing.reset-size4.size10 { font-size: 2.5925em; } - -.katex .fontsize-ensurer.reset-size4.size11, -.katex .sizing.reset-size4.size11 { font-size: 3.11em; } - -.katex .fontsize-ensurer.reset-size5.size1, -.katex .sizing.reset-size5.size1 { font-size: 0.55555556em; } - -.katex .fontsize-ensurer.reset-size5.size2, -.katex .sizing.reset-size5.size2 { font-size: 0.66666667em; } - -.katex .fontsize-ensurer.reset-size5.size3, -.katex .sizing.reset-size5.size3 { font-size: 0.77777778em; } - -.katex .fontsize-ensurer.reset-size5.size4, -.katex .sizing.reset-size5.size4 { font-size: 0.88888889em; } - -.katex .fontsize-ensurer.reset-size5.size5, -.katex .sizing.reset-size5.size5 { font-size: 1em; } - -.katex .fontsize-ensurer.reset-size5.size6, -.katex .sizing.reset-size5.size6 { font-size: 1.11111111em; } - -.katex .fontsize-ensurer.reset-size5.size7, -.katex .sizing.reset-size5.size7 { font-size: 1.33333333em; } - -.katex .fontsize-ensurer.reset-size5.size8, -.katex .sizing.reset-size5.size8 { font-size: 1.6em; } - -.katex .fontsize-ensurer.reset-size5.size9, -.katex .sizing.reset-size5.size9 { font-size: 1.92em; } - -.katex .fontsize-ensurer.reset-size5.size10, -.katex .sizing.reset-size5.size10 { font-size: 2.30444444em; } - -.katex .fontsize-ensurer.reset-size5.size11, -.katex .sizing.reset-size5.size11 { font-size: 2.76444444em; } - -.katex .fontsize-ensurer.reset-size6.size1, -.katex .sizing.reset-size6.size1 { font-size: 0.5em; } - -.katex .fontsize-ensurer.reset-size6.size2, -.katex .sizing.reset-size6.size2 { font-size: 0.6em; } - -.katex .fontsize-ensurer.reset-size6.size3, -.katex .sizing.reset-size6.size3 { font-size: 0.7em; } - -.katex .fontsize-ensurer.reset-size6.size4, -.katex .sizing.reset-size6.size4 { font-size: 0.8em; } - -.katex .fontsize-ensurer.reset-size6.size5, -.katex .sizing.reset-size6.size5 { font-size: 0.9em; } - -.katex .fontsize-ensurer.reset-size6.size6, -.katex .sizing.reset-size6.size6 { font-size: 1em; } - -.katex .fontsize-ensurer.reset-size6.size7, -.katex .sizing.reset-size6.size7 { font-size: 1.2em; } - -.katex .fontsize-ensurer.reset-size6.size8, -.katex .sizing.reset-size6.size8 { font-size: 1.44em; } - -.katex .fontsize-ensurer.reset-size6.size9, -.katex .sizing.reset-size6.size9 { font-size: 1.728em; } - -.katex .fontsize-ensurer.reset-size6.size10, -.katex .sizing.reset-size6.size10 { font-size: 2.074em; } - -.katex .fontsize-ensurer.reset-size6.size11, -.katex .sizing.reset-size6.size11 { font-size: 2.488em; } - -.katex .fontsize-ensurer.reset-size7.size1, -.katex .sizing.reset-size7.size1 { font-size: 0.41666667em; } - -.katex .fontsize-ensurer.reset-size7.size2, -.katex .sizing.reset-size7.size2 { font-size: 0.5em; } - -.katex .fontsize-ensurer.reset-size7.size3, -.katex .sizing.reset-size7.size3 { font-size: 0.58333333em; } - -.katex .fontsize-ensurer.reset-size7.size4, -.katex .sizing.reset-size7.size4 { font-size: 0.66666667em; } - -.katex .fontsize-ensurer.reset-size7.size5, -.katex .sizing.reset-size7.size5 { font-size: 0.75em; } - -.katex .fontsize-ensurer.reset-size7.size6, -.katex .sizing.reset-size7.size6 { font-size: 0.83333333em; } - -.katex .fontsize-ensurer.reset-size7.size7, -.katex .sizing.reset-size7.size7 { font-size: 1em; } - -.katex .fontsize-ensurer.reset-size7.size8, -.katex .sizing.reset-size7.size8 { font-size: 1.2em; } - -.katex .fontsize-ensurer.reset-size7.size9, -.katex .sizing.reset-size7.size9 { font-size: 1.44em; } - -.katex .fontsize-ensurer.reset-size7.size10, -.katex .sizing.reset-size7.size10 { font-size: 1.72833333em; } - -.katex .fontsize-ensurer.reset-size7.size11, -.katex .sizing.reset-size7.size11 { font-size: 2.07333333em; } - -.katex .fontsize-ensurer.reset-size8.size1, -.katex .sizing.reset-size8.size1 { font-size: 0.34722222em; } - -.katex .fontsize-ensurer.reset-size8.size2, -.katex .sizing.reset-size8.size2 { font-size: 0.41666667em; } - -.katex .fontsize-ensurer.reset-size8.size3, -.katex .sizing.reset-size8.size3 { font-size: 0.48611111em; } - -.katex .fontsize-ensurer.reset-size8.size4, -.katex .sizing.reset-size8.size4 { font-size: 0.55555556em; } - -.katex .fontsize-ensurer.reset-size8.size5, -.katex .sizing.reset-size8.size5 { font-size: 0.625em; } - -.katex .fontsize-ensurer.reset-size8.size6, -.katex .sizing.reset-size8.size6 { font-size: 0.69444444em; } - -.katex .fontsize-ensurer.reset-size8.size7, -.katex .sizing.reset-size8.size7 { font-size: 0.83333333em; } - -.katex .fontsize-ensurer.reset-size8.size8, -.katex .sizing.reset-size8.size8 { font-size: 1em; } - -.katex .fontsize-ensurer.reset-size8.size9, -.katex .sizing.reset-size8.size9 { font-size: 1.2em; } - -.katex .fontsize-ensurer.reset-size8.size10, -.katex .sizing.reset-size8.size10 { font-size: 1.44027778em; } - -.katex .fontsize-ensurer.reset-size8.size11, -.katex .sizing.reset-size8.size11 { font-size: 1.72777778em; } - -.katex .fontsize-ensurer.reset-size9.size1, -.katex .sizing.reset-size9.size1 { font-size: 0.28935185em; } - -.katex .fontsize-ensurer.reset-size9.size2, -.katex .sizing.reset-size9.size2 { font-size: 0.34722222em; } - -.katex .fontsize-ensurer.reset-size9.size3, -.katex .sizing.reset-size9.size3 { font-size: 0.40509259em; } - -.katex .fontsize-ensurer.reset-size9.size4, -.katex .sizing.reset-size9.size4 { font-size: 0.46296296em; } - -.katex .fontsize-ensurer.reset-size9.size5, -.katex .sizing.reset-size9.size5 { font-size: 0.52083333em; } - -.katex .fontsize-ensurer.reset-size9.size6, -.katex .sizing.reset-size9.size6 { font-size: 0.5787037em; } - -.katex .fontsize-ensurer.reset-size9.size7, -.katex .sizing.reset-size9.size7 { font-size: 0.69444444em; } - -.katex .fontsize-ensurer.reset-size9.size8, -.katex .sizing.reset-size9.size8 { font-size: 0.83333333em; } - -.katex .fontsize-ensurer.reset-size9.size9, -.katex .sizing.reset-size9.size9 { font-size: 1em; } - -.katex .fontsize-ensurer.reset-size9.size10, -.katex .sizing.reset-size9.size10 { font-size: 1.20023148em; } - -.katex .fontsize-ensurer.reset-size9.size11, -.katex .sizing.reset-size9.size11 { font-size: 1.43981481em; } - -.katex .fontsize-ensurer.reset-size10.size1, -.katex .sizing.reset-size10.size1 { font-size: 0.24108004em; } - -.katex .fontsize-ensurer.reset-size10.size2, -.katex .sizing.reset-size10.size2 { font-size: 0.28929605em; } - -.katex .fontsize-ensurer.reset-size10.size3, -.katex .sizing.reset-size10.size3 { font-size: 0.33751205em; } - -.katex .fontsize-ensurer.reset-size10.size4, -.katex .sizing.reset-size10.size4 { font-size: 0.38572806em; } - -.katex .fontsize-ensurer.reset-size10.size5, -.katex .sizing.reset-size10.size5 { font-size: 0.43394407em; } - -.katex .fontsize-ensurer.reset-size10.size6, -.katex .sizing.reset-size10.size6 { font-size: 0.48216008em; } - -.katex .fontsize-ensurer.reset-size10.size7, -.katex .sizing.reset-size10.size7 { font-size: 0.57859209em; } - -.katex .fontsize-ensurer.reset-size10.size8, -.katex .sizing.reset-size10.size8 { font-size: 0.69431051em; } - -.katex .fontsize-ensurer.reset-size10.size9, -.katex .sizing.reset-size10.size9 { font-size: 0.83317261em; } - -.katex .fontsize-ensurer.reset-size10.size10, -.katex .sizing.reset-size10.size10 { font-size: 1em; } - -.katex .fontsize-ensurer.reset-size10.size11, -.katex .sizing.reset-size10.size11 { font-size: 1.19961427em; } - -.katex .fontsize-ensurer.reset-size11.size1, -.katex .sizing.reset-size11.size1 { font-size: 0.20096463em; } - -.katex .fontsize-ensurer.reset-size11.size2, -.katex .sizing.reset-size11.size2 { font-size: 0.24115756em; } - -.katex .fontsize-ensurer.reset-size11.size3, -.katex .sizing.reset-size11.size3 { font-size: 0.28135048em; } - -.katex .fontsize-ensurer.reset-size11.size4, -.katex .sizing.reset-size11.size4 { font-size: 0.32154341em; } - -.katex .fontsize-ensurer.reset-size11.size5, -.katex .sizing.reset-size11.size5 { font-size: 0.36173633em; } - -.katex .fontsize-ensurer.reset-size11.size6, -.katex .sizing.reset-size11.size6 { font-size: 0.40192926em; } - -.katex .fontsize-ensurer.reset-size11.size7, -.katex .sizing.reset-size11.size7 { font-size: 0.48231511em; } - -.katex .fontsize-ensurer.reset-size11.size8, -.katex .sizing.reset-size11.size8 { font-size: 0.57877814em; } - -.katex .fontsize-ensurer.reset-size11.size9, -.katex .sizing.reset-size11.size9 { font-size: 0.69453376em; } - -.katex .fontsize-ensurer.reset-size11.size10, -.katex .sizing.reset-size11.size10 { font-size: 0.83360129em; } - -.katex .fontsize-ensurer.reset-size11.size11, -.katex .sizing.reset-size11.size11 { font-size: 1em; } -.katex .delimsizing.size1 { font-family: KaTeX_Size1; } -.katex .delimsizing.size2 { font-family: KaTeX_Size2; } -.katex .delimsizing.size3 { font-family: KaTeX_Size3; } -.katex .delimsizing.size4 { font-family: KaTeX_Size4; } -.katex .delimsizing.mult .delim-size1 > span { font-family: KaTeX_Size1; } -.katex .delimsizing.mult .delim-size4 > span { font-family: KaTeX_Size4; } -.katex .nulldelimiter { display: inline-block; width: 0.12em; } - -.katex .delimcenter, -.katex .op-symbol { position: relative; } -.katex .op-symbol.small-op { font-family: KaTeX_Size1; } -.katex .op-symbol.large-op { font-family: KaTeX_Size2; } -.katex .op-limits > .vlist-t { text-align: center; } -.katex .accent > .vlist-t { text-align: center; } -.katex .accent .accent-body { position: relative; } -.katex .accent .accent-body:not(.accent-full) { width: 0; } -.katex .overlay { display: block; } -.katex .mtable .vertical-separator { display: inline-block; min-width: 1px; } -.katex .mtable .arraycolsep { display: inline-block; } -.katex .mtable .col-align-c > .vlist-t { text-align: center; } -.katex .mtable .col-align-l > .vlist-t { text-align: left; } -.katex .mtable .col-align-r > .vlist-t { text-align: right; } -.katex .svg-align { text-align: left; } -.katex svg { display: block; position: absolute; width: 100%; height: inherit; fill: currentColor; stroke: currentColor; fill-rule: nonzero; fill-opacity: 1; stroke-width: 1; stroke-linecap: butt; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-dasharray: none; stroke-dashoffset: 0; stroke-opacity: 1; } -.katex svg path { stroke: none; } -.katex img { border-style: none; min-width: 0; min-height: 0; max-width: none; max-height: none; } -.katex .stretchy { width: 100%; display: block; position: relative; overflow: hidden; } - -.katex .stretchy::after, -.katex .stretchy::before { content: ""; } -.katex .hide-tail { width: 100%; position: relative; overflow: hidden; } -.katex .halfarrow-left { position: absolute; left: 0; width: 50.2%; overflow: hidden; } -.katex .halfarrow-right { position: absolute; right: 0; width: 50.2%; overflow: hidden; } -.katex .brace-left { position: absolute; left: 0; width: 25.1%; overflow: hidden; } -.katex .brace-center { position: absolute; left: 25%; width: 50%; overflow: hidden; } -.katex .brace-right { position: absolute; right: 0; width: 25.1%; overflow: hidden; } -.katex .x-arrow-pad { padding: 0 0.5em; } - -.katex .mover, -.katex .munder, -.katex .x-arrow { text-align: center; } -.katex .boxpad { padding: 0 0.3em; } - -.katex .fbox, -.katex .fcolorbox { box-sizing: border-box; border: 0.04em solid; } -.katex .cancel-pad { padding: 0 0.2em; } -.katex .cancel-lap { margin-left: -0.2em; margin-right: -0.2em; } -.katex .sout { border-bottom-style: solid; border-bottom-width: 0.08em; } -.katex-display { display: block; margin: 1em 0; text-align: center; } -.katex-display > .katex { display: block; text-align: center; white-space: nowrap; } -.katex-display > .katex > .katex-html { display: block; position: relative; } -.katex-display > .katex > .katex-html > .tag { position: absolute; right: 0; } -.katex-display.leqno > .katex > .katex-html > .tag { left: 0; right: auto; } -.katex-display.fleqn > .katex { text-align: left; padding-left: 2em; } diff --git a/website/_libs/katex/katex.min.js b/website/_libs/katex/katex.min.js deleted file mode 100644 index 4df7e17..0000000 --- a/website/_libs/katex/katex.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.katex=e():t.katex=e()}("undefined"!=typeof self?self:this,function(){return function(t){var e={};function r(a){if(e[a])return e[a].exports;var n=e[a]={i:a,l:!1,exports:{}};return t[a].call(n.exports,n,n.exports,r),n.l=!0,n.exports}return r.m=t,r.c=e,r.d=function(t,e,a){r.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:a})},r.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},r.t=function(t,e){if(1&e&&(t=r(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var a=Object.create(null);if(r.r(a),Object.defineProperty(a,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var n in t)r.d(a,n,function(e){return t[e]}.bind(null,n));return a},r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,"a",e),e},r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r.p="",r(r.s=1)}([function(t,e,r){},function(t,e,r){"use strict";r.r(e);r(0);var a=function(){function t(t,e,r){this.lexer=void 0,this.start=void 0,this.end=void 0,this.lexer=t,this.start=e,this.end=r}return t.range=function(e,r){return r?e&&e.loc&&r.loc&&e.loc.lexer===r.loc.lexer?new t(e.loc.lexer,e.loc.start,r.loc.end):null:e&&e.loc},t}(),n=function(){function t(t,e){this.text=void 0,this.loc=void 0,this.noexpand=void 0,this.treatAsRelax=void 0,this.text=t,this.loc=e}return t.prototype.range=function(e,r){return new t(r,a.range(this,e))},t}(),i=function t(e,r){this.position=void 0;var a,n="KaTeX parse error: "+e,i=r&&r.loc;if(i&&i.start<=i.end){var o=i.lexer.input;a=i.start;var s=i.end;a===o.length?n+=" at end of input: ":n+=" at position "+(a+1)+": ";var l=o.slice(a,s).replace(/[^]/g,"$&\u0332");n+=(a>15?"\u2026"+o.slice(a-15,a):o.slice(0,a))+l+(s+15":">","<":"<",'"':""","'":"'"},h=/[&><"']/g;var m=function t(e){return"ordgroup"===e.type?1===e.body.length?t(e.body[0]):e:"color"===e.type?1===e.body.length?t(e.body[0]):e:"font"===e.type?t(e.body):e},c={contains:function(t,e){return-1!==t.indexOf(e)},deflt:function(t,e){return void 0===t?e:t},escape:function(t){return String(t).replace(h,function(t){return l[t]})},hyphenate:function(t){return t.replace(s,"-$1").toLowerCase()},getBaseElem:m,isCharacterBox:function(t){var e=m(t);return"mathord"===e.type||"textord"===e.type||"atom"===e.type},protocolFromUrl:function(t){var e=/^\s*([^\\/#]*?)(?::|�*58|�*3a)/i.exec(t);return null!=e?e[1]:"_relative"}},u=function(){function t(t){this.displayMode=void 0,this.output=void 0,this.leqno=void 0,this.fleqn=void 0,this.throwOnError=void 0,this.errorColor=void 0,this.macros=void 0,this.minRuleThickness=void 0,this.colorIsTextColor=void 0,this.strict=void 0,this.trust=void 0,this.maxSize=void 0,this.maxExpand=void 0,this.globalGroup=void 0,t=t||{},this.displayMode=c.deflt(t.displayMode,!1),this.output=c.deflt(t.output,"htmlAndMathml"),this.leqno=c.deflt(t.leqno,!1),this.fleqn=c.deflt(t.fleqn,!1),this.throwOnError=c.deflt(t.throwOnError,!0),this.errorColor=c.deflt(t.errorColor,"#cc0000"),this.macros=t.macros||{},this.minRuleThickness=Math.max(0,c.deflt(t.minRuleThickness,0)),this.colorIsTextColor=c.deflt(t.colorIsTextColor,!1),this.strict=c.deflt(t.strict,"warn"),this.trust=c.deflt(t.trust,!1),this.maxSize=Math.max(0,c.deflt(t.maxSize,1/0)),this.maxExpand=Math.max(0,c.deflt(t.maxExpand,1e3)),this.globalGroup=c.deflt(t.globalGroup,!1)}var e=t.prototype;return e.reportNonstrict=function(t,e,r){var a=this.strict;if("function"==typeof a&&(a=a(t,e,r)),a&&"ignore"!==a){if(!0===a||"error"===a)throw new o("LaTeX-incompatible input and strict mode is set to 'error': "+e+" ["+t+"]",r);"warn"===a?"undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+e+" ["+t+"]"):"undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to unrecognized '"+a+"': "+e+" ["+t+"]")}},e.useStrictBehavior=function(t,e,r){var a=this.strict;if("function"==typeof a)try{a=a(t,e,r)}catch(t){a="error"}return!(!a||"ignore"===a)&&(!0===a||"error"===a||("warn"===a?("undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+e+" ["+t+"]"),!1):("undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to unrecognized '"+a+"': "+e+" ["+t+"]"),!1)))},e.isTrusted=function(t){t.url&&!t.protocol&&(t.protocol=c.protocolFromUrl(t.url));var e="function"==typeof this.trust?this.trust(t):this.trust;return Boolean(e)},t}(),p=function(){function t(t,e,r){this.id=void 0,this.size=void 0,this.cramped=void 0,this.id=t,this.size=e,this.cramped=r}var e=t.prototype;return e.sup=function(){return d[f[this.id]]},e.sub=function(){return d[g[this.id]]},e.fracNum=function(){return d[x[this.id]]},e.fracDen=function(){return d[v[this.id]]},e.cramp=function(){return d[b[this.id]]},e.text=function(){return d[y[this.id]]},e.isTight=function(){return this.size>=2},t}(),d=[new p(0,0,!1),new p(1,0,!0),new p(2,1,!1),new p(3,1,!0),new p(4,2,!1),new p(5,2,!0),new p(6,3,!1),new p(7,3,!0)],f=[4,5,4,5,6,7,6,7],g=[5,5,5,5,7,7,7,7],x=[2,3,4,5,6,7,6,7],v=[3,3,5,5,7,7,7,7],b=[1,1,3,3,5,5,7,7],y=[0,1,2,3,2,3,2,3],w={DISPLAY:d[0],TEXT:d[2],SCRIPT:d[4],SCRIPTSCRIPT:d[6]},k=[{name:"latin",blocks:[[256,591],[768,879]]},{name:"cyrillic",blocks:[[1024,1279]]},{name:"brahmic",blocks:[[2304,4255]]},{name:"georgian",blocks:[[4256,4351]]},{name:"cjk",blocks:[[12288,12543],[19968,40879],[65280,65376]]},{name:"hangul",blocks:[[44032,55215]]}];var S=[];function M(t){for(var e=0;e=S[e]&&t<=S[e+1])return!0;return!1}k.forEach(function(t){return t.blocks.forEach(function(t){return S.push.apply(S,t)})});var z={leftParenInner:"M291 0 H417 V300 H291 z",rightParenInner:"M457 0 H583 V300 H457 z",doubleleftarrow:"M262 157\nl10-10c34-36 62.7-77 86-123 3.3-8 5-13.3 5-16 0-5.3-6.7-8-20-8-7.3\n 0-12.2.5-14.5 1.5-2.3 1-4.8 4.5-7.5 10.5-49.3 97.3-121.7 169.3-217 216-28\n 14-57.3 25-88 33-6.7 2-11 3.8-13 5.5-2 1.7-3 4.2-3 7.5s1 5.8 3 7.5\nc2 1.7 6.3 3.5 13 5.5 68 17.3 128.2 47.8 180.5 91.5 52.3 43.7 93.8 96.2 124.5\n 157.5 9.3 8 15.3 12.3 18 13h6c12-.7 18-4 18-10 0-2-1.7-7-5-15-23.3-46-52-87\n-86-123l-10-10h399738v-40H218c328 0 0 0 0 0l-10-8c-26.7-20-65.7-43-117-69 2.7\n-2 6-3.7 10-5 36.7-16 72.3-37.3 107-64l10-8h399782v-40z\nm8 0v40h399730v-40zm0 194v40h399730v-40z",doublerightarrow:"M399738 392l\n-10 10c-34 36-62.7 77-86 123-3.3 8-5 13.3-5 16 0 5.3 6.7 8 20 8 7.3 0 12.2-.5\n 14.5-1.5 2.3-1 4.8-4.5 7.5-10.5 49.3-97.3 121.7-169.3 217-216 28-14 57.3-25 88\n-33 6.7-2 11-3.8 13-5.5 2-1.7 3-4.2 3-7.5s-1-5.8-3-7.5c-2-1.7-6.3-3.5-13-5.5-68\n-17.3-128.2-47.8-180.5-91.5-52.3-43.7-93.8-96.2-124.5-157.5-9.3-8-15.3-12.3-18\n-13h-6c-12 .7-18 4-18 10 0 2 1.7 7 5 15 23.3 46 52 87 86 123l10 10H0v40h399782\nc-328 0 0 0 0 0l10 8c26.7 20 65.7 43 117 69-2.7 2-6 3.7-10 5-36.7 16-72.3 37.3\n-107 64l-10 8H0v40zM0 157v40h399730v-40zm0 194v40h399730v-40z",leftarrow:"M400000 241H110l3-3c68.7-52.7 113.7-120\n 135-202 4-14.7 6-23 6-25 0-7.3-7-11-21-11-8 0-13.2.8-15.5 2.5-2.3 1.7-4.2 5.8\n-5.5 12.5-1.3 4.7-2.7 10.3-4 17-12 48.7-34.8 92-68.5 130S65.3 228.3 18 247\nc-10 4-16 7.7-18 11 0 8.7 6 14.3 18 17 47.3 18.7 87.8 47 121.5 85S196 441.3 208\n 490c.7 2 1.3 5 2 9s1.2 6.7 1.5 8c.3 1.3 1 3.3 2 6s2.2 4.5 3.5 5.5c1.3 1 3.3\n 1.8 6 2.5s6 1 10 1c14 0 21-3.7 21-11 0-2-2-10.3-6-25-20-79.3-65-146.7-135-202\n l-3-3h399890zM100 241v40h399900v-40z",leftbrace:"M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117\n-45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7\n 5-6 9-10 13-.7 1-7.3 1-20 1H6z",leftbraceunder:"M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13\n 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688\n 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7\n-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z",leftgroup:"M400000 80\nH435C64 80 168.3 229.4 21 260c-5.9 1.2-18 0-18 0-2 0-3-1-3-3v-38C76 61 257 0\n 435 0h399565z",leftgroupunder:"M400000 262\nH435C64 262 168.3 112.6 21 82c-5.9-1.2-18 0-18 0-2 0-3 1-3 3v38c76 158 257 219\n 435 219h399565z",leftharpoon:"M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3\n-3.3 10.2-9.5 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5\n-18.3 3-21-1.3-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7\n-196 228-6.7 4.7-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40z",leftharpoonplus:"M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3-3.3 10.2-9.5\n 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5-18.3 3-21-1.3\n-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7-196 228-6.7 4.7\n-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40zM0 435v40h400000v-40z\nm0 0v40h400000v-40z",leftharpoondown:"M7 241c-4 4-6.333 8.667-7 14 0 5.333.667 9 2 11s5.333\n 5.333 12 10c90.667 54 156 130 196 228 3.333 10.667 6.333 16.333 9 17 2 .667 5\n 1 9 1h5c10.667 0 16.667-2 18-6 2-2.667 1-9.667-3-21-32-87.333-82.667-157.667\n-152-211l-3-3h399907v-40zM93 281 H400000 v-40L7 241z",leftharpoondownplus:"M7 435c-4 4-6.3 8.7-7 14 0 5.3.7 9 2 11s5.3 5.3 12\n 10c90.7 54 156 130 196 228 3.3 10.7 6.3 16.3 9 17 2 .7 5 1 9 1h5c10.7 0 16.7\n-2 18-6 2-2.7 1-9.7-3-21-32-87.3-82.7-157.7-152-211l-3-3h399907v-40H7zm93 0\nv40h399900v-40zM0 241v40h399900v-40zm0 0v40h399900v-40z",lefthook:"M400000 281 H103s-33-11.2-61-33.5S0 197.3 0 164s14.2-61.2 42.5\n-83.5C70.8 58.2 104 47 142 47 c16.7 0 25 6.7 25 20 0 12-8.7 18.7-26 20-40 3.3\n-68.7 15.7-86 37-10 12-15 25.3-15 40 0 22.7 9.8 40.7 29.5 54 19.7 13.3 43.5 21\n 71.5 23h399859zM103 281v-40h399897v40z",leftlinesegment:"M40 281 V428 H0 V94 H40 V241 H400000 v40z\nM40 281 V428 H0 V94 H40 V241 H400000 v40z",leftmapsto:"M40 281 V448H0V74H40V241H400000v40z\nM40 281 V448H0V74H40V241H400000v40z",leftToFrom:"M0 147h400000v40H0zm0 214c68 40 115.7 95.7 143 167h22c15.3 0 23\n-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69-70-101l-7-8h399905v-40H95l7-8\nc28.7-32 52-65.7 70-101 10.7-23.3 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 265.3\n 68 321 0 361zm0-174v-40h399900v40zm100 154v40h399900v-40z",longequal:"M0 50 h400000 v40H0z m0 194h40000v40H0z\nM0 50 h400000 v40H0z m0 194h40000v40H0z",midbrace:"M200428 334\nc-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14\n-53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7\n 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11\n 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z",midbraceunder:"M199572 214\nc100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14\n 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3\n 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0\n-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z",oiintSize1:"M512.6 71.6c272.6 0 320.3 106.8 320.3 178.2 0 70.8-47.7 177.6\n-320.3 177.6S193.1 320.6 193.1 249.8c0-71.4 46.9-178.2 319.5-178.2z\nm368.1 178.2c0-86.4-60.9-215.4-368.1-215.4-306.4 0-367.3 129-367.3 215.4 0 85.8\n60.9 214.8 367.3 214.8 307.2 0 368.1-129 368.1-214.8z",oiintSize2:"M757.8 100.1c384.7 0 451.1 137.6 451.1 230 0 91.3-66.4 228.8\n-451.1 228.8-386.3 0-452.7-137.5-452.7-228.8 0-92.4 66.4-230 452.7-230z\nm502.4 230c0-111.2-82.4-277.2-502.4-277.2s-504 166-504 277.2\nc0 110 84 276 504 276s502.4-166 502.4-276z",oiiintSize1:"M681.4 71.6c408.9 0 480.5 106.8 480.5 178.2 0 70.8-71.6 177.6\n-480.5 177.6S202.1 320.6 202.1 249.8c0-71.4 70.5-178.2 479.3-178.2z\nm525.8 178.2c0-86.4-86.8-215.4-525.7-215.4-437.9 0-524.7 129-524.7 215.4 0\n85.8 86.8 214.8 524.7 214.8 438.9 0 525.7-129 525.7-214.8z",oiiintSize2:"M1021.2 53c603.6 0 707.8 165.8 707.8 277.2 0 110-104.2 275.8\n-707.8 275.8-606 0-710.2-165.8-710.2-275.8C311 218.8 415.2 53 1021.2 53z\nm770.4 277.1c0-131.2-126.4-327.6-770.5-327.6S248.4 198.9 248.4 330.1\nc0 130 128.8 326.4 772.7 326.4s770.5-196.4 770.5-326.4z",rightarrow:"M0 241v40h399891c-47.3 35.3-84 78-110 128\n-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20\n 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7\n 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85\n-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\n 151.7 139 205zm0 0v40h399900v-40z",rightbrace:"M400000 542l\n-6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5\ns-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1\nc124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z",rightbraceunder:"M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3\n 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237\n-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z",rightgroup:"M0 80h399565c371 0 266.7 149.4 414 180 5.9 1.2 18 0 18 0 2 0\n 3-1 3-3v-38c-76-158-257-219-435-219H0z",rightgroupunder:"M0 262h399565c371 0 266.7-149.4 414-180 5.9-1.2 18 0 18\n 0 2 0 3 1 3 3v38c-76 158-257 219-435 219H0z",rightharpoon:"M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3\n-3.7-15.3-11-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2\n-10.7 0-16.7 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58\n 69.2 92 94.5zm0 0v40h399900v-40z",rightharpoonplus:"M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3-3.7-15.3-11\n-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2-10.7 0-16.7\n 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 69.2 92 94.5z\nm0 0v40h399900v-40z m100 194v40h399900v-40zm0 0v40h399900v-40z",rightharpoondown:"M399747 511c0 7.3 6.7 11 20 11 8 0 13-.8 15-2.5s4.7-6.8\n 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 8.5-5.8 9.5\n-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3-64.7 57-92 95\n-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 241v40h399900v-40z",rightharpoondownplus:"M399747 705c0 7.3 6.7 11 20 11 8 0 13-.8\n 15-2.5s4.7-6.8 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3\n 8.5-5.8 9.5-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3\n-64.7 57-92 95-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 435v40h399900v-40z\nm0-194v40h400000v-40zm0 0v40h400000v-40z",righthook:"M399859 241c-764 0 0 0 0 0 40-3.3 68.7-15.7 86-37 10-12 15-25.3\n 15-40 0-22.7-9.8-40.7-29.5-54-19.7-13.3-43.5-21-71.5-23-17.3-1.3-26-8-26-20 0\n-13.3 8.7-20 26-20 38 0 71 11.2 99 33.5 0 0 7 5.6 21 16.7 14 11.2 21 33.5 21\n 66.8s-14 61.2-42 83.5c-28 22.3-61 33.5-99 33.5L0 241z M0 281v-40h399859v40z",rightlinesegment:"M399960 241 V94 h40 V428 h-40 V281 H0 v-40z\nM399960 241 V94 h40 V428 h-40 V281 H0 v-40z",rightToFrom:"M400000 167c-70.7-42-118-97.7-142-167h-23c-15.3 0-23 .3-23\n 1 0 1.3 5.3 13.7 16 37 18 35.3 41.3 69 70 101l7 8H0v40h399905l-7 8c-28.7 32\n-52 65.7-70 101-10.7 23.3-16 35.7-16 37 0 .7 7.7 1 23 1h23c24-69.3 71.3-125 142\n-167z M100 147v40h399900v-40zM0 341v40h399900v-40z",twoheadleftarrow:"M0 167c68 40\n 115.7 95.7 143 167h22c15.3 0 23-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69\n-70-101l-7-8h125l9 7c50.7 39.3 85 86 103 140h46c0-4.7-6.3-18.7-19-42-18-35.3\n-40-67.3-66-96l-9-9h399716v-40H284l9-9c26-28.7 48-60.7 66-96 12.7-23.333 19\n-37.333 19-42h-46c-18 54-52.3 100.7-103 140l-9 7H95l7-8c28.7-32 52-65.7 70-101\n 10.7-23.333 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 71.3 68 127 0 167z",twoheadrightarrow:"M400000 167\nc-68-40-115.7-95.7-143-167h-22c-15.3 0-23 .3-23 1 0 1.3 5.3 13.7 16 37 18 35.3\n 41.3 69 70 101l7 8h-125l-9-7c-50.7-39.3-85-86-103-140h-46c0 4.7 6.3 18.7 19 42\n 18 35.3 40 67.3 66 96l9 9H0v40h399716l-9 9c-26 28.7-48 60.7-66 96-12.7 23.333\n-19 37.333-19 42h46c18-54 52.3-100.7 103-140l9-7h125l-7 8c-28.7 32-52 65.7-70\n 101-10.7 23.333-16 35.7-16 37 0 .7 7.7 1 23 1h22c27.3-71.3 75-127 143-167z",tilde1:"M200 55.538c-77 0-168 73.953-177 73.953-3 0-7\n-2.175-9-5.437L2 97c-1-2-2-4-2-6 0-4 2-7 5-9l20-12C116 12 171 0 207 0c86 0\n 114 68 191 68 78 0 168-68 177-68 4 0 7 2 9 5l12 19c1 2.175 2 4.35 2 6.525 0\n 4.35-2 7.613-5 9.788l-19 13.05c-92 63.077-116.937 75.308-183 76.128\n-68.267.847-113-73.952-191-73.952z",tilde2:"M344 55.266c-142 0-300.638 81.316-311.5 86.418\n-8.01 3.762-22.5 10.91-23.5 5.562L1 120c-1-2-1-3-1-4 0-5 3-9 8-10l18.4-9C160.9\n 31.9 283 0 358 0c148 0 188 122 331 122s314-97 326-97c4 0 8 2 10 7l7 21.114\nc1 2.14 1 3.21 1 4.28 0 5.347-3 9.626-7 10.696l-22.3 12.622C852.6 158.372 751\n 181.476 676 181.476c-149 0-189-126.21-332-126.21z",tilde3:"M786 59C457 59 32 175.242 13 175.242c-6 0-10-3.457\n-11-10.37L.15 138c-1-7 3-12 10-13l19.2-6.4C378.4 40.7 634.3 0 804.3 0c337 0\n 411.8 157 746.8 157 328 0 754-112 773-112 5 0 10 3 11 9l1 14.075c1 8.066-.697\n 16.595-6.697 17.492l-21.052 7.31c-367.9 98.146-609.15 122.696-778.15 122.696\n -338 0-409-156.573-744-156.573z",tilde4:"M786 58C457 58 32 177.487 13 177.487c-6 0-10-3.345\n-11-10.035L.15 143c-1-7 3-12 10-13l22-6.7C381.2 35 637.15 0 807.15 0c337 0 409\n 177 744 177 328 0 754-127 773-127 5 0 10 3 11 9l1 14.794c1 7.805-3 13.38-9\n 14.495l-20.7 5.574c-366.85 99.79-607.3 139.372-776.3 139.372-338 0-409\n -175.236-744-175.236z",vec:"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z",widehat1:"M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22\nc-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z",widehat2:"M1181 0h2l1171 176c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 220h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widehat3:"M1181 0h2l1171 236c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 280h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widehat4:"M1181 0h2l1171 296c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 340h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widecheck1:"M529,159h5l519,-115c5,-1,9,-5,9,-10c0,-1,-1,-2,-1,-3l-4,-22c-1,\n-5,-5,-9,-11,-9h-2l-512,92l-513,-92h-2c-5,0,-9,4,-11,9l-5,22c-1,6,2,12,8,13z",widecheck2:"M1181,220h2l1171,-176c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,153l-1167,-153h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",widecheck3:"M1181,280h2l1171,-236c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,213l-1167,-213h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",widecheck4:"M1181,340h2l1171,-296c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,273l-1167,-273h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",baraboveleftarrow:"M400000 620h-399890l3 -3c68.7 -52.7 113.7 -120 135 -202\nc4 -14.7 6 -23 6 -25c0 -7.3 -7 -11 -21 -11c-8 0 -13.2 0.8 -15.5 2.5\nc-2.3 1.7 -4.2 5.8 -5.5 12.5c-1.3 4.7 -2.7 10.3 -4 17c-12 48.7 -34.8 92 -68.5 130\ns-74.2 66.3 -121.5 85c-10 4 -16 7.7 -18 11c0 8.7 6 14.3 18 17c47.3 18.7 87.8 47\n121.5 85s56.5 81.3 68.5 130c0.7 2 1.3 5 2 9s1.2 6.7 1.5 8c0.3 1.3 1 3.3 2 6\ns2.2 4.5 3.5 5.5c1.3 1 3.3 1.8 6 2.5s6 1 10 1c14 0 21 -3.7 21 -11\nc0 -2 -2 -10.3 -6 -25c-20 -79.3 -65 -146.7 -135 -202l-3 -3h399890z\nM100 620v40h399900v-40z M0 241v40h399900v-40zM0 241v40h399900v-40z",rightarrowabovebar:"M0 241v40h399891c-47.3 35.3-84 78-110 128-16.7 32\n-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 11 8 0\n13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 39\n-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85-40.5\n-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\n151.7 139 205zm96 379h399894v40H0zm0 0h399904v40H0z",baraboveshortleftharpoon:"M507,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17\nc2,0.7,5,1,9,1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21\nc-32,-87.3,-82.7,-157.7,-152,-211c0,0,-3,-3,-3,-3l399351,0l0,-40\nc-398570,0,-399437,0,-399437,0z M593 435 v40 H399500 v-40z\nM0 281 v-40 H399908 v40z M0 281 v-40 H399908 v40z",rightharpoonaboveshortbar:"M0,241 l0,40c399126,0,399993,0,399993,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM0 241 v40 H399908 v-40z M0 475 v-40 H399500 v40z M0 475 v-40 H399500 v40z",shortbaraboveleftharpoon:"M7,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17c2,0.7,5,1,9,\n1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21c-32,-87.3,-82.7,-157.7,\n-152,-211c0,0,-3,-3,-3,-3l399907,0l0,-40c-399126,0,-399993,0,-399993,0z\nM93 435 v40 H400000 v-40z M500 241 v40 H400000 v-40z M500 241 v40 H400000 v-40z",shortrightharpoonabovebar:"M53,241l0,40c398570,0,399437,0,399437,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM500 241 v40 H399408 v-40z M500 435 v40 H400000 v-40z"},A=function(){function t(t){this.children=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.children=t,this.classes=[],this.height=0,this.depth=0,this.maxFontSize=0,this.style={}}var e=t.prototype;return e.hasClass=function(t){return c.contains(this.classes,t)},e.toNode=function(){for(var t=document.createDocumentFragment(),e=0;e"},N=function(){function t(t,e,r,a){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.width=void 0,this.maxFontSize=void 0,this.style=void 0,B.call(this,t,r,a),this.children=e||[]}var e=t.prototype;return e.setAttribute=function(t,e){this.attributes[t]=e},e.hasClass=function(t){return c.contains(this.classes,t)},e.toNode=function(){return C.call(this,"span")},e.toMarkup=function(){return q.call(this,"span")},t}(),I=function(){function t(t,e,r,a){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,B.call(this,e,a),this.children=r||[],this.setAttribute("href",t)}var e=t.prototype;return e.setAttribute=function(t,e){this.attributes[t]=e},e.hasClass=function(t){return c.contains(this.classes,t)},e.toNode=function(){return C.call(this,"a")},e.toMarkup=function(){return q.call(this,"a")},t}(),O=function(){function t(t,e,r){this.src=void 0,this.alt=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.alt=e,this.src=t,this.classes=["mord"],this.style=r}var e=t.prototype;return e.hasClass=function(t){return c.contains(this.classes,t)},e.toNode=function(){var t=document.createElement("img");for(var e in t.src=this.src,t.alt=this.alt,t.className="mord",this.style)this.style.hasOwnProperty(e)&&(t.style[e]=this.style[e]);return t},e.toMarkup=function(){var t=""+this.alt+"=n[0]&&t<=n[1])return r.name}return null}(this.text.charCodeAt(0));l&&this.classes.push(l+"_fallback"),/[\xee\xef\xed\xec]/.test(this.text)&&(this.text=R[this.text])}var e=t.prototype;return e.hasClass=function(t){return c.contains(this.classes,t)},e.toNode=function(){var t=document.createTextNode(this.text),e=null;for(var r in this.italic>0&&((e=document.createElement("span")).style.marginRight=this.italic+"em"),this.classes.length>0&&((e=e||document.createElement("span")).className=T(this.classes)),this.style)this.style.hasOwnProperty(r)&&((e=e||document.createElement("span")).style[r]=this.style[r]);return e?(e.appendChild(t),e):t},e.toMarkup=function(){var t=!1,e="0&&(r+="margin-right:"+this.italic+"em;"),this.style)this.style.hasOwnProperty(a)&&(r+=c.hyphenate(a)+":"+this.style[a]+";");r&&(t=!0,e+=' style="'+c.escape(r)+'"');var n=c.escape(this.text);return t?(e+=">",e+=n,e+="
"):n},t}(),L=function(){function t(t,e){this.children=void 0,this.attributes=void 0,this.children=t||[],this.attributes=e||{}}var e=t.prototype;return e.toNode=function(){var t=document.createElementNS("http://www.w3.org/2000/svg","svg");for(var e in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,e)&&t.setAttribute(e,this.attributes[e]);for(var r=0;r":""},t}(),D=function(){function t(t){this.attributes=void 0,this.attributes=t||{}}var e=t.prototype;return e.toNode=function(){var t=document.createElementNS("http://www.w3.org/2000/svg","line");for(var e in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,e)&&t.setAttribute(e,this.attributes[e]);return t},e.toMarkup=function(){var t="","\\gt",!0),$("math",Z,et,"\u2208","\\in",!0),$("math",Z,et,"\ue020","\\@not"),$("math",Z,et,"\u2282","\\subset",!0),$("math",Z,et,"\u2283","\\supset",!0),$("math",Z,et,"\u2286","\\subseteq",!0),$("math",Z,et,"\u2287","\\supseteq",!0),$("math",K,et,"\u2288","\\nsubseteq",!0),$("math",K,et,"\u2289","\\nsupseteq",!0),$("math",Z,et,"\u22a8","\\models"),$("math",Z,et,"\u2190","\\leftarrow",!0),$("math",Z,et,"\u2264","\\le"),$("math",Z,et,"\u2264","\\leq",!0),$("math",Z,et,"<","\\lt",!0),$("math",Z,et,"\u2192","\\rightarrow",!0),$("math",Z,et,"\u2192","\\to"),$("math",K,et,"\u2271","\\ngeq",!0),$("math",K,et,"\u2270","\\nleq",!0),$("math",Z,"spacing","\xa0","\\ "),$("math",Z,"spacing","\xa0","~"),$("math",Z,"spacing","\xa0","\\space"),$("math",Z,"spacing","\xa0","\\nobreakspace"),$("text",Z,"spacing","\xa0","\\ "),$("text",Z,"spacing","\xa0"," "),$("text",Z,"spacing","\xa0","~"),$("text",Z,"spacing","\xa0","\\space"),$("text",Z,"spacing","\xa0","\\nobreakspace"),$("math",Z,"spacing",null,"\\nobreak"),$("math",Z,"spacing",null,"\\allowbreak"),$("math",Z,"punct",",",","),$("math",Z,"punct",";",";"),$("math",K,J,"\u22bc","\\barwedge",!0),$("math",K,J,"\u22bb","\\veebar",!0),$("math",Z,J,"\u2299","\\odot",!0),$("math",Z,J,"\u2295","\\oplus",!0),$("math",Z,J,"\u2297","\\otimes",!0),$("math",Z,"textord","\u2202","\\partial",!0),$("math",Z,J,"\u2298","\\oslash",!0),$("math",K,J,"\u229a","\\circledcirc",!0),$("math",K,J,"\u22a1","\\boxdot",!0),$("math",Z,J,"\u25b3","\\bigtriangleup"),$("math",Z,J,"\u25bd","\\bigtriangledown"),$("math",Z,J,"\u2020","\\dagger"),$("math",Z,J,"\u22c4","\\diamond"),$("math",Z,J,"\u22c6","\\star"),$("math",Z,J,"\u25c3","\\triangleleft"),$("math",Z,J,"\u25b9","\\triangleright"),$("math",Z,"open","{","\\{"),$("text",Z,"textord","{","\\{"),$("text",Z,"textord","{","\\textbraceleft"),$("math",Z,"close","}","\\}"),$("text",Z,"textord","}","\\}"),$("text",Z,"textord","}","\\textbraceright"),$("math",Z,"open","{","\\lbrace"),$("math",Z,"close","}","\\rbrace"),$("math",Z,"open","[","\\lbrack",!0),$("text",Z,"textord","[","\\lbrack",!0),$("math",Z,"close","]","\\rbrack",!0),$("text",Z,"textord","]","\\rbrack",!0),$("math",Z,"open","(","\\lparen",!0),$("math",Z,"close",")","\\rparen",!0),$("text",Z,"textord","<","\\textless",!0),$("text",Z,"textord",">","\\textgreater",!0),$("math",Z,"open","\u230a","\\lfloor",!0),$("math",Z,"close","\u230b","\\rfloor",!0),$("math",Z,"open","\u2308","\\lceil",!0),$("math",Z,"close","\u2309","\\rceil",!0),$("math",Z,"textord","\\","\\backslash"),$("math",Z,"textord","\u2223","|"),$("math",Z,"textord","\u2223","\\vert"),$("text",Z,"textord","|","\\textbar",!0),$("math",Z,"textord","\u2225","\\|"),$("math",Z,"textord","\u2225","\\Vert"),$("text",Z,"textord","\u2225","\\textbardbl"),$("text",Z,"textord","~","\\textasciitilde"),$("text",Z,"textord","\\","\\textbackslash"),$("text",Z,"textord","^","\\textasciicircum"),$("math",Z,et,"\u2191","\\uparrow",!0),$("math",Z,et,"\u21d1","\\Uparrow",!0),$("math",Z,et,"\u2193","\\downarrow",!0),$("math",Z,et,"\u21d3","\\Downarrow",!0),$("math",Z,et,"\u2195","\\updownarrow",!0),$("math",Z,et,"\u21d5","\\Updownarrow",!0),$("math",Z,tt,"\u2210","\\coprod"),$("math",Z,tt,"\u22c1","\\bigvee"),$("math",Z,tt,"\u22c0","\\bigwedge"),$("math",Z,tt,"\u2a04","\\biguplus"),$("math",Z,tt,"\u22c2","\\bigcap"),$("math",Z,tt,"\u22c3","\\bigcup"),$("math",Z,tt,"\u222b","\\int"),$("math",Z,tt,"\u222b","\\intop"),$("math",Z,tt,"\u222c","\\iint"),$("math",Z,tt,"\u222d","\\iiint"),$("math",Z,tt,"\u220f","\\prod"),$("math",Z,tt,"\u2211","\\sum"),$("math",Z,tt,"\u2a02","\\bigotimes"),$("math",Z,tt,"\u2a01","\\bigoplus"),$("math",Z,tt,"\u2a00","\\bigodot"),$("math",Z,tt,"\u222e","\\oint"),$("math",Z,tt,"\u2a06","\\bigsqcup"),$("math",Z,tt,"\u222b","\\smallint"),$("text",Z,"inner","\u2026","\\textellipsis"),$("math",Z,"inner","\u2026","\\mathellipsis"),$("text",Z,"inner","\u2026","\\ldots",!0),$("math",Z,"inner","\u2026","\\ldots",!0),$("math",Z,"inner","\u22ef","\\@cdots",!0),$("math",Z,"inner","\u22f1","\\ddots",!0),$("math",Z,"textord","\u22ee","\\varvdots"),$("math",Z,"accent-token","\u02ca","\\acute"),$("math",Z,"accent-token","\u02cb","\\grave"),$("math",Z,"accent-token","\xa8","\\ddot"),$("math",Z,"accent-token","~","\\tilde"),$("math",Z,"accent-token","\u02c9","\\bar"),$("math",Z,"accent-token","\u02d8","\\breve"),$("math",Z,"accent-token","\u02c7","\\check"),$("math",Z,"accent-token","^","\\hat"),$("math",Z,"accent-token","\u20d7","\\vec"),$("math",Z,"accent-token","\u02d9","\\dot"),$("math",Z,"accent-token","\u02da","\\mathring"),$("math",Z,Q,"\ue131","\\@imath"),$("math",Z,Q,"\ue237","\\@jmath"),$("math",Z,"textord","\u0131","\u0131"),$("math",Z,"textord","\u0237","\u0237"),$("text",Z,"textord","\u0131","\\i",!0),$("text",Z,"textord","\u0237","\\j",!0),$("text",Z,"textord","\xdf","\\ss",!0),$("text",Z,"textord","\xe6","\\ae",!0),$("text",Z,"textord","\u0153","\\oe",!0),$("text",Z,"textord","\xf8","\\o",!0),$("text",Z,"textord","\xc6","\\AE",!0),$("text",Z,"textord","\u0152","\\OE",!0),$("text",Z,"textord","\xd8","\\O",!0),$("text",Z,"accent-token","\u02ca","\\'"),$("text",Z,"accent-token","\u02cb","\\`"),$("text",Z,"accent-token","\u02c6","\\^"),$("text",Z,"accent-token","\u02dc","\\~"),$("text",Z,"accent-token","\u02c9","\\="),$("text",Z,"accent-token","\u02d8","\\u"),$("text",Z,"accent-token","\u02d9","\\."),$("text",Z,"accent-token","\u02da","\\r"),$("text",Z,"accent-token","\u02c7","\\v"),$("text",Z,"accent-token","\xa8",'\\"'),$("text",Z,"accent-token","\u02dd","\\H"),$("text",Z,"accent-token","\u25ef","\\textcircled");var rt={"--":!0,"---":!0,"``":!0,"''":!0};$("text",Z,"textord","\u2013","--",!0),$("text",Z,"textord","\u2013","\\textendash"),$("text",Z,"textord","\u2014","---",!0),$("text",Z,"textord","\u2014","\\textemdash"),$("text",Z,"textord","\u2018","`",!0),$("text",Z,"textord","\u2018","\\textquoteleft"),$("text",Z,"textord","\u2019","'",!0),$("text",Z,"textord","\u2019","\\textquoteright"),$("text",Z,"textord","\u201c","``",!0),$("text",Z,"textord","\u201c","\\textquotedblleft"),$("text",Z,"textord","\u201d","''",!0),$("text",Z,"textord","\u201d","\\textquotedblright"),$("math",Z,"textord","\xb0","\\degree",!0),$("text",Z,"textord","\xb0","\\degree"),$("text",Z,"textord","\xb0","\\textdegree",!0),$("math",Z,"textord","\xa3","\\pounds"),$("math",Z,"textord","\xa3","\\mathsterling",!0),$("text",Z,"textord","\xa3","\\pounds"),$("text",Z,"textord","\xa3","\\textsterling",!0),$("math",K,"textord","\u2720","\\maltese"),$("text",K,"textord","\u2720","\\maltese");for(var at=0;at<'0123456789/@."'.length;at++){var nt='0123456789/@."'.charAt(at);$("math",Z,"textord",nt,nt)}for(var it=0;it<'0123456789!@*()-=+";:?/.,'.length;it++){var ot='0123456789!@*()-=+";:?/.,'.charAt(it);$("text",Z,"textord",ot,ot)}for(var st="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",lt=0;lt=5?0:t>=3?1:2]){var r=Y[e]={cssEmPerMu:V.quad[e]/18};for(var a in V)V.hasOwnProperty(a)&&(r[a]=V[a][e])}return Y[e]}(this.size)),this._fontMetrics},e.getColor=function(){return this.phantom?"transparent":this.color},t}();kt.BASESIZE=6;var St=kt,Mt={pt:1,mm:7227/2540,cm:7227/254,in:72.27,bp:1.00375,pc:12,dd:1238/1157,cc:14856/1157,nd:685/642,nc:1370/107,sp:1/65536,px:1.00375},zt={ex:!0,em:!0,mu:!0},At=function(t){return"string"!=typeof t&&(t=t.unit),t in Mt||t in zt||"ex"===t},Tt=function(t,e){var r;if(t.unit in Mt)r=Mt[t.unit]/e.fontMetrics().ptPerEm/e.sizeMultiplier;else if("mu"===t.unit)r=e.fontMetrics().cssEmPerMu;else{var a;if(a=e.style.isTight()?e.havingStyle(e.style.text()):e,"ex"===t.unit)r=a.fontMetrics().xHeight;else{if("em"!==t.unit)throw new o("Invalid unit: '"+t.unit+"'");r=a.fontMetrics().quad}a!==e&&(r*=a.sizeMultiplier/e.sizeMultiplier)}return Math.min(t.number*r,e.maxSize)},Bt=function(t,e,r){return j[r][t]&&j[r][t].replace&&(t=j[r][t].replace),{value:t,metrics:G(t,e,r)}},Ct=function(t,e,r,a,n){var i,o=Bt(t,e,r),s=o.metrics;if(t=o.value,s){var l=s.italic;("text"===r||a&&"mathit"===a.font)&&(l=0),i=new E(t,s.height,s.depth,l,s.skew,s.width,n)}else"undefined"!=typeof console&&console.warn("No character metrics for '"+t+"' in style '"+e+"' and mode '"+r+"'"),i=new E(t,0,0,0,0,0,n);if(a){i.maxFontSize=a.sizeMultiplier,a.style.isTight()&&i.classes.push("mtight");var h=a.getColor();h&&(i.style.color=h)}return i},qt=function(t,e){if(T(t.classes)!==T(e.classes)||t.skew!==e.skew||t.maxFontSize!==e.maxFontSize)return!1;for(var r in t.style)if(t.style.hasOwnProperty(r)&&t.style[r]!==e.style[r])return!1;for(var a in e.style)if(e.style.hasOwnProperty(a)&&t.style[a]!==e.style[a])return!1;return!0},Nt=function(t){for(var e=0,r=0,a=0,n=0;ne&&(e=i.height),i.depth>r&&(r=i.depth),i.maxFontSize>a&&(a=i.maxFontSize)}t.height=e,t.depth=r,t.maxFontSize=a},It=function(t,e,r,a){var n=new N(t,e,r,a);return Nt(n),n},Ot=function(t,e,r,a){return new N(t,e,r,a)},Rt=function(t){var e=new A(t);return Nt(e),e},Et=function(t,e,r){var a="";switch(t){case"amsrm":a="AMS";break;case"textrm":a="Main";break;case"textsf":a="SansSerif";break;case"texttt":a="Typewriter";break;default:a=t}return a+"-"+("textbf"===e&&"textit"===r?"BoldItalic":"textbf"===e?"Bold":"textit"===e?"Italic":"Regular")},Lt={mathbf:{variant:"bold",fontName:"Main-Bold"},mathrm:{variant:"normal",fontName:"Main-Regular"},textit:{variant:"italic",fontName:"Main-Italic"},mathit:{variant:"italic",fontName:"Main-Italic"},mathnormal:{variant:"italic",fontName:"Math-Italic"},mathbb:{variant:"double-struck",fontName:"AMS-Regular"},mathcal:{variant:"script",fontName:"Caligraphic-Regular"},mathfrak:{variant:"fraktur",fontName:"Fraktur-Regular"},mathscr:{variant:"script",fontName:"Script-Regular"},mathsf:{variant:"sans-serif",fontName:"SansSerif-Regular"},mathtt:{variant:"monospace",fontName:"Typewriter-Regular"}},Pt={vec:["vec",.471,.714],oiintSize1:["oiintSize1",.957,.499],oiintSize2:["oiintSize2",1.472,.659],oiiintSize1:["oiiintSize1",1.304,.499],oiiintSize2:["oiiintSize2",1.98,.659],leftParenInner:["leftParenInner",.875,.3],rightParenInner:["rightParenInner",.875,.3]},Dt={fontMap:Lt,makeSymbol:Ct,mathsym:function(t,e,r,a){return void 0===a&&(a=[]),"boldsymbol"===r.font&&Bt(t,"Main-Bold",e).metrics?Ct(t,"Main-Bold",e,r,a.concat(["mathbf"])):"\\"===t||"main"===j[e][t].font?Ct(t,"Main-Regular",e,r,a):Ct(t,"AMS-Regular",e,r,a.concat(["amsrm"]))},makeSpan:It,makeSvgSpan:Ot,makeLineSpan:function(t,e,r){var a=It([t],[],e);return a.height=Math.max(r||e.fontMetrics().defaultRuleThickness,e.minRuleThickness),a.style.borderBottomWidth=a.height+"em",a.maxFontSize=1,a},makeAnchor:function(t,e,r,a){var n=new I(t,e,r,a);return Nt(n),n},makeFragment:Rt,wrapFragment:function(t,e){return t instanceof A?It([],[t],e):t},makeVList:function(t,e){for(var r=function(t){if("individualShift"===t.positionType){for(var e=t.children,r=[e[0]],a=-e[0].shift-e[0].elem.depth,n=a,i=1;i0&&(i.push(se(o,e)),o=[]),i.push(n[s]));o.length>0&&i.push(se(o,e)),r&&((a=se(ee(r,e,!0))).classes=["tag"],i.push(a));var h=Zt(["katex-html"],i);if(h.setAttribute("aria-hidden","true"),a){var m=a.children[0];m.style.height=h.height+h.depth+"em",m.style.verticalAlign=-h.depth+"em"}return h}function he(t){return new A(t)}var me=function(){function t(t,e){this.type=void 0,this.attributes=void 0,this.children=void 0,this.type=t,this.attributes={},this.children=e||[]}var e=t.prototype;return e.setAttribute=function(t,e){this.attributes[t]=e},e.getAttribute=function(t){return this.attributes[t]},e.toNode=function(){var t=document.createElementNS("http://www.w3.org/1998/Math/MathML",this.type);for(var e in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,e)&&t.setAttribute(e,this.attributes[e]);for(var r=0;r"},e.toText=function(){return this.children.map(function(t){return t.toText()}).join("")},t}(),ce=function(){function t(t){this.text=void 0,this.text=t}var e=t.prototype;return e.toNode=function(){return document.createTextNode(this.text)},e.toMarkup=function(){return c.escape(this.toText())},e.toText=function(){return this.text},t}(),ue={MathNode:me,TextNode:ce,SpaceNode:function(){function t(t){this.width=void 0,this.character=void 0,this.width=t,this.character=t>=.05555&&t<=.05556?"\u200a":t>=.1666&&t<=.1667?"\u2009":t>=.2222&&t<=.2223?"\u2005":t>=.2777&&t<=.2778?"\u2005\u200a":t>=-.05556&&t<=-.05555?"\u200a\u2063":t>=-.1667&&t<=-.1666?"\u2009\u2063":t>=-.2223&&t<=-.2222?"\u205f\u2063":t>=-.2778&&t<=-.2777?"\u2005\u2063":null}var e=t.prototype;return e.toNode=function(){if(this.character)return document.createTextNode(this.character);var t=document.createElementNS("http://www.w3.org/1998/Math/MathML","mspace");return t.setAttribute("width",this.width+"em"),t},e.toMarkup=function(){return this.character?""+this.character+"":''},e.toText=function(){return this.character?this.character:" "},t}(),newDocumentFragment:he},pe=function(t,e,r){return!j[e][t]||!j[e][t].replace||55349===t.charCodeAt(0)||rt.hasOwnProperty(t)&&r&&(r.fontFamily&&"tt"===r.fontFamily.substr(4,2)||r.font&&"tt"===r.font.substr(4,2))||(t=j[e][t].replace),new ue.TextNode(t)},de=function(t){return 1===t.length?t[0]:new ue.MathNode("mrow",t)},fe=function(t,e){if("texttt"===e.fontFamily)return"monospace";if("textsf"===e.fontFamily)return"textit"===e.fontShape&&"textbf"===e.fontWeight?"sans-serif-bold-italic":"textit"===e.fontShape?"sans-serif-italic":"textbf"===e.fontWeight?"bold-sans-serif":"sans-serif";if("textit"===e.fontShape&&"textbf"===e.fontWeight)return"bold-italic";if("textit"===e.fontShape)return"italic";if("textbf"===e.fontWeight)return"bold";var r=e.font;if(!r||"mathnormal"===r)return null;var a=t.mode;if("mathit"===r)return"italic";if("boldsymbol"===r)return"textord"===t.type?"bold":"bold-italic";if("mathbf"===r)return"bold";if("mathbb"===r)return"double-struck";if("mathfrak"===r)return"fraktur";if("mathscr"===r||"mathcal"===r)return"script";if("mathsf"===r)return"sans-serif";if("mathtt"===r)return"monospace";var n=t.text;return c.contains(["\\imath","\\jmath"],n)?null:(j[a][n]&&j[a][n].replace&&(n=j[a][n].replace),G(n,Dt.fontMap[r].fontName,a)?Dt.fontMap[r].variant:null)},ge=function(t,e,r){if(1===t.length){var a=ve(t[0],e);return r&&a instanceof me&&"mo"===a.type&&(a.setAttribute("lspace","0em"),a.setAttribute("rspace","0em")),[a]}for(var n,i=[],o=0;o0&&(p.text=p.text.slice(0,1)+"\u0338"+p.text.slice(1),i.pop())}}}i.push(s),n=s}return i},xe=function(t,e,r){return de(ge(t,e,r))},ve=function(t,e){if(!t)return new ue.MathNode("mrow");if(Xt[t.type])return Xt[t.type](t,e);throw new o("Got group of unknown type: '"+t.type+"'")};function be(t,e,r,a,n){var i,o=ge(t,r);i=1===o.length&&o[0]instanceof me&&c.contains(["mrow","mtable"],o[0].type)?o[0]:new ue.MathNode("mrow",o);var s=new ue.MathNode("annotation",[new ue.TextNode(e)]);s.setAttribute("encoding","application/x-tex");var l=new ue.MathNode("semantics",[i,s]),h=new ue.MathNode("math",[l]);h.setAttribute("xmlns","http://www.w3.org/1998/Math/MathML"),a&&h.setAttribute("display","block");var m=n?"katex":"katex-mathml";return Dt.makeSpan([m],[h])}var ye=function(t){return new St({style:t.displayMode?w.DISPLAY:w.TEXT,maxSize:t.maxSize,minRuleThickness:t.minRuleThickness})},we=function(t,e){if(e.displayMode){var r=["katex-display"];e.leqno&&r.push("leqno"),e.fleqn&&r.push("fleqn"),t=Dt.makeSpan(r,[t])}return t},ke=function(t,e,r){var a,n=ye(r);if("mathml"===r.output)return be(t,e,n,r.displayMode,!0);if("html"===r.output){var i=le(t,n);a=Dt.makeSpan(["katex"],[i])}else{var o=be(t,e,n,r.displayMode,!1),s=le(t,n);a=Dt.makeSpan(["katex"],[o,s])}return we(a,r)},Se={widehat:"^",widecheck:"\u02c7",widetilde:"~",utilde:"~",overleftarrow:"\u2190",underleftarrow:"\u2190",xleftarrow:"\u2190",overrightarrow:"\u2192",underrightarrow:"\u2192",xrightarrow:"\u2192",underbrace:"\u23df",overbrace:"\u23de",overgroup:"\u23e0",undergroup:"\u23e1",overleftrightarrow:"\u2194",underleftrightarrow:"\u2194",xleftrightarrow:"\u2194",Overrightarrow:"\u21d2",xRightarrow:"\u21d2",overleftharpoon:"\u21bc",xleftharpoonup:"\u21bc",overrightharpoon:"\u21c0",xrightharpoonup:"\u21c0",xLeftarrow:"\u21d0",xLeftrightarrow:"\u21d4",xhookleftarrow:"\u21a9",xhookrightarrow:"\u21aa",xmapsto:"\u21a6",xrightharpoondown:"\u21c1",xleftharpoondown:"\u21bd",xrightleftharpoons:"\u21cc",xleftrightharpoons:"\u21cb",xtwoheadleftarrow:"\u219e",xtwoheadrightarrow:"\u21a0",xlongequal:"=",xtofrom:"\u21c4",xrightleftarrows:"\u21c4",xrightequilibrium:"\u21cc",xleftequilibrium:"\u21cb"},Me={overrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],overleftarrow:[["leftarrow"],.888,522,"xMinYMin"],underrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],underleftarrow:[["leftarrow"],.888,522,"xMinYMin"],xrightarrow:[["rightarrow"],1.469,522,"xMaxYMin"],xleftarrow:[["leftarrow"],1.469,522,"xMinYMin"],Overrightarrow:[["doublerightarrow"],.888,560,"xMaxYMin"],xRightarrow:[["doublerightarrow"],1.526,560,"xMaxYMin"],xLeftarrow:[["doubleleftarrow"],1.526,560,"xMinYMin"],overleftharpoon:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoonup:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoondown:[["leftharpoondown"],.888,522,"xMinYMin"],overrightharpoon:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoonup:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoondown:[["rightharpoondown"],.888,522,"xMaxYMin"],xlongequal:[["longequal"],.888,334,"xMinYMin"],xtwoheadleftarrow:[["twoheadleftarrow"],.888,334,"xMinYMin"],xtwoheadrightarrow:[["twoheadrightarrow"],.888,334,"xMaxYMin"],overleftrightarrow:[["leftarrow","rightarrow"],.888,522],overbrace:[["leftbrace","midbrace","rightbrace"],1.6,548],underbrace:[["leftbraceunder","midbraceunder","rightbraceunder"],1.6,548],underleftrightarrow:[["leftarrow","rightarrow"],.888,522],xleftrightarrow:[["leftarrow","rightarrow"],1.75,522],xLeftrightarrow:[["doubleleftarrow","doublerightarrow"],1.75,560],xrightleftharpoons:[["leftharpoondownplus","rightharpoonplus"],1.75,716],xleftrightharpoons:[["leftharpoonplus","rightharpoondownplus"],1.75,716],xhookleftarrow:[["leftarrow","righthook"],1.08,522],xhookrightarrow:[["lefthook","rightarrow"],1.08,522],overlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],underlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],overgroup:[["leftgroup","rightgroup"],.888,342],undergroup:[["leftgroupunder","rightgroupunder"],.888,342],xmapsto:[["leftmapsto","rightarrow"],1.5,522],xtofrom:[["leftToFrom","rightToFrom"],1.75,528],xrightleftarrows:[["baraboveleftarrow","rightarrowabovebar"],1.75,901],xrightequilibrium:[["baraboveshortleftharpoon","rightharpoonaboveshortbar"],1.75,716],xleftequilibrium:[["shortbaraboveleftharpoon","shortrightharpoonabovebar"],1.75,716]},ze=function(t){return"ordgroup"===t.type?t.body.length:1},Ae=function(t,e,r,a){var n,i=t.height+t.depth+2*r;if(/fbox|color/.test(e)){if(n=Dt.makeSpan(["stretchy",e],[],a),"fbox"===e){var o=a.color&&a.getColor();o&&(n.style.borderColor=o)}}else{var s=[];/^[bx]cancel$/.test(e)&&s.push(new D({x1:"0",y1:"0",x2:"100%",y2:"100%","stroke-width":"0.046em"})),/^x?cancel$/.test(e)&&s.push(new D({x1:"0",y1:"100%",x2:"100%",y2:"0","stroke-width":"0.046em"}));var l=new L(s,{width:"100%",height:i+"em"});n=Dt.makeSvgSpan([],[l],a)}return n.height=i,n.style.height=i+"em",n},Te=function(t){var e=new ue.MathNode("mo",[new ue.TextNode(Se[t.substr(1)])]);return e.setAttribute("stretchy","true"),e},Be=function(t,e){var r=function(){var r=4e5,a=t.label.substr(1);if(c.contains(["widehat","widecheck","widetilde","utilde"],a)){var n,i,o,s=ze(t.base);if(s>5)"widehat"===a||"widecheck"===a?(n=420,r=2364,o=.42,i=a+"4"):(n=312,r=2340,o=.34,i="tilde4");else{var l=[1,1,2,2,3,3][s];"widehat"===a||"widecheck"===a?(r=[0,1062,2364,2364,2364][l],n=[0,239,300,360,420][l],o=[0,.24,.3,.3,.36,.42][l],i=a+l):(r=[0,600,1033,2339,2340][l],n=[0,260,286,306,312][l],o=[0,.26,.286,.3,.306,.34][l],i="tilde"+l)}var h=new P(i),m=new L([h],{width:"100%",height:o+"em",viewBox:"0 0 "+r+" "+n,preserveAspectRatio:"none"});return{span:Dt.makeSvgSpan([],[m],e),minWidth:0,height:o}}var u,p,d=[],f=Me[a],g=f[0],x=f[1],v=f[2],b=v/1e3,y=g.length;if(1===y)u=["hide-tail"],p=[f[3]];else if(2===y)u=["halfarrow-left","halfarrow-right"],p=["xMinYMin","xMaxYMin"];else{if(3!==y)throw new Error("Correct katexImagesData or update code here to support\n "+y+" children.");u=["brace-left","brace-center","brace-right"],p=["xMinYMin","xMidYMin","xMaxYMin"]}for(var w=0;w0&&(a.style.minWidth=n+"em"),a};function Ce(t,e){if(!t||t.type!==e)throw new Error("Expected node of type "+e+", but got "+(t?"node of type "+t.type:String(t)));return t}function qe(t){var e=Ne(t);if(!e)throw new Error("Expected node of symbol group type, but got "+(t?"node of type "+t.type:String(t)));return e}function Ne(t){return t&&("atom"===t.type||X.hasOwnProperty(t.type))?t:null}var Ie=function(t,e){var r,a,n;t&&"supsub"===t.type?(r=(a=Ce(t.base,"accent")).base,t.base=r,n=function(t){if(t instanceof N)return t;throw new Error("Expected span but got "+String(t)+".")}(oe(t,e)),t.base=a):r=(a=Ce(t,"accent")).base;var i=oe(r,e.havingCrampedStyle()),o=0;if(a.isShifty&&c.isCharacterBox(r)){var s=c.getBaseElem(r);o=H(oe(s,e.havingCrampedStyle())).skew}var l,h=Math.min(i.height,e.fontMetrics().xHeight);if(a.isStretchy)l=Be(a,e),l=Dt.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:i},{type:"elem",elem:l,wrapperClasses:["svg-align"],wrapperStyle:o>0?{width:"calc(100% - "+2*o+"em)",marginLeft:2*o+"em"}:void 0}]},e);else{var m,u;"\\vec"===a.label?(m=Dt.staticSvg("vec",e),u=Dt.svgData.vec[1]):((m=H(m=Dt.makeOrd({mode:a.mode,text:a.label},e,"textord"))).italic=0,u=m.width),l=Dt.makeSpan(["accent-body"],[m]);var p="\\textcircled"===a.label;p&&(l.classes.push("accent-full"),h=i.height);var d=o;p||(d-=u/2),l.style.left=d+"em","\\textcircled"===a.label&&(l.style.top=".2em"),l=Dt.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:i},{type:"kern",size:-h},{type:"elem",elem:l}]},e)}var f=Dt.makeSpan(["mord","accent"],[l],e);return n?(n.children[0]=f,n.height=Math.max(f.height,n.height),n.classes[0]="mord",n):f},Oe=function(t,e){var r=t.isStretchy?Te(t.label):new ue.MathNode("mo",[pe(t.label,t.mode)]),a=new ue.MathNode("mover",[ve(t.base,e),r]);return a.setAttribute("accent","true"),a},Re=new RegExp(["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring"].map(function(t){return"\\"+t}).join("|"));_t({type:"accent",names:["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring","\\widecheck","\\widehat","\\widetilde","\\overrightarrow","\\overleftarrow","\\Overrightarrow","\\overleftrightarrow","\\overgroup","\\overlinesegment","\\overleftharpoon","\\overrightharpoon"],props:{numArgs:1},handler:function(t,e){var r=e[0],a=!Re.test(t.funcName),n=!a||"\\widehat"===t.funcName||"\\widetilde"===t.funcName||"\\widecheck"===t.funcName;return{type:"accent",mode:t.parser.mode,label:t.funcName,isStretchy:a,isShifty:n,base:r}},htmlBuilder:Ie,mathmlBuilder:Oe}),_t({type:"accent",names:["\\'","\\`","\\^","\\~","\\=","\\u","\\.",'\\"',"\\r","\\H","\\v","\\textcircled"],props:{numArgs:1,allowedInText:!0,allowedInMath:!1},handler:function(t,e){var r=e[0];return{type:"accent",mode:t.parser.mode,label:t.funcName,isStretchy:!1,isShifty:!0,base:r}},htmlBuilder:Ie,mathmlBuilder:Oe}),_t({type:"accentUnder",names:["\\underleftarrow","\\underrightarrow","\\underleftrightarrow","\\undergroup","\\underlinesegment","\\utilde"],props:{numArgs:1},handler:function(t,e){var r=t.parser,a=t.funcName,n=e[0];return{type:"accentUnder",mode:r.mode,label:a,base:n}},htmlBuilder:function(t,e){var r=oe(t.base,e),a=Be(t,e),n="\\utilde"===t.label?.12:0,i=Dt.makeVList({positionType:"top",positionData:r.height,children:[{type:"elem",elem:a,wrapperClasses:["svg-align"]},{type:"kern",size:n},{type:"elem",elem:r}]},e);return Dt.makeSpan(["mord","accentunder"],[i],e)},mathmlBuilder:function(t,e){var r=Te(t.label),a=new ue.MathNode("munder",[ve(t.base,e),r]);return a.setAttribute("accentunder","true"),a}});var Ee=function(t){var e=new ue.MathNode("mpadded",t?[t]:[]);return e.setAttribute("width","+0.6em"),e.setAttribute("lspace","0.3em"),e};_t({type:"xArrow",names:["\\xleftarrow","\\xrightarrow","\\xLeftarrow","\\xRightarrow","\\xleftrightarrow","\\xLeftrightarrow","\\xhookleftarrow","\\xhookrightarrow","\\xmapsto","\\xrightharpoondown","\\xrightharpoonup","\\xleftharpoondown","\\xleftharpoonup","\\xrightleftharpoons","\\xleftrightharpoons","\\xlongequal","\\xtwoheadrightarrow","\\xtwoheadleftarrow","\\xtofrom","\\xrightleftarrows","\\xrightequilibrium","\\xleftequilibrium"],props:{numArgs:1,numOptionalArgs:1},handler:function(t,e,r){var a=t.parser,n=t.funcName;return{type:"xArrow",mode:a.mode,label:n,body:e[0],below:r[0]}},htmlBuilder:function(t,e){var r,a=e.style,n=e.havingStyle(a.sup()),i=Dt.wrapFragment(oe(t.body,n,e),e);i.classes.push("x-arrow-pad"),t.below&&(n=e.havingStyle(a.sub()),(r=Dt.wrapFragment(oe(t.below,n,e),e)).classes.push("x-arrow-pad"));var o,s=Be(t,e),l=-e.fontMetrics().axisHeight+.5*s.height,h=-e.fontMetrics().axisHeight-.5*s.height-.111;if((i.depth>.25||"\\xleftequilibrium"===t.label)&&(h-=i.depth),r){var m=-e.fontMetrics().axisHeight+r.height+.5*s.height+.111;o=Dt.makeVList({positionType:"individualShift",children:[{type:"elem",elem:i,shift:h},{type:"elem",elem:s,shift:l},{type:"elem",elem:r,shift:m}]},e)}else o=Dt.makeVList({positionType:"individualShift",children:[{type:"elem",elem:i,shift:h},{type:"elem",elem:s,shift:l}]},e);return o.children[0].children[0].children[1].classes.push("svg-align"),Dt.makeSpan(["mrel","x-arrow"],[o],e)},mathmlBuilder:function(t,e){var r,a=Te(t.label);if(t.body){var n=Ee(ve(t.body,e));if(t.below){var i=Ee(ve(t.below,e));r=new ue.MathNode("munderover",[a,i,n])}else r=new ue.MathNode("mover",[a,n])}else if(t.below){var o=Ee(ve(t.below,e));r=new ue.MathNode("munder",[a,o])}else r=Ee(),r=new ue.MathNode("mover",[a,r]);return r}}),_t({type:"textord",names:["\\@char"],props:{numArgs:1,allowedInText:!0},handler:function(t,e){for(var r=t.parser,a=Ce(e[0],"ordgroup").body,n="",i=0;i","\\langle","\\rangle","/","\\backslash","\\lt","\\gt"],Je=[0,1.2,1.8,2.4,3],Qe=[{type:"small",style:w.SCRIPTSCRIPT},{type:"small",style:w.SCRIPT},{type:"small",style:w.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4}],tr=[{type:"small",style:w.SCRIPTSCRIPT},{type:"small",style:w.SCRIPT},{type:"small",style:w.TEXT},{type:"stack"}],er=[{type:"small",style:w.SCRIPTSCRIPT},{type:"small",style:w.SCRIPT},{type:"small",style:w.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4},{type:"stack"}],rr=function(t){if("small"===t.type)return"Main-Regular";if("large"===t.type)return"Size"+t.size+"-Regular";if("stack"===t.type)return"Size4-Regular";throw new Error("Add support for delim type '"+t.type+"' here.")},ar=function(t,e,r,a){for(var n=Math.min(2,3-a.style.size);ne)return r[n]}return r[r.length-1]},nr=function(t,e,r,a,n,i){var o;"<"===t||"\\lt"===t||"\u27e8"===t?t="\\langle":">"!==t&&"\\gt"!==t&&"\u27e9"!==t||(t="\\rangle"),o=c.contains(Ke,t)?Qe:c.contains($e,t)?er:tr;var s=ar(t,e,o,a);return"small"===s.type?function(t,e,r,a,n,i){var o=Dt.makeSymbol(t,"Main-Regular",n,a),s=Ue(o,e,a,i);return r&&Ge(s,a,e),s}(t,s.style,r,a,n,i):"large"===s.type?Ye(t,s.size,r,a,n,i):_e(t,e,r,a,n,i)},ir=function(t,e){var r,a,n=e.havingBaseSizing(),i=ar("\\surd",t*n.sizeMultiplier,er,n),o=n.sizeMultiplier,s=Math.max(0,e.minRuleThickness-e.fontMetrics().sqrtRuleThickness),l=0,h=0,m=0;return"small"===i.type?(t<1?o=1:t<1.4&&(o=.7),h=(1+s)/o,(r=je("sqrtMain",l=(1+s+.08)/o,m=1e3+1e3*s+80,s,e)).style.minWidth="0.853em",a=.833/o):"large"===i.type?(m=1080*Je[i.size],h=(Je[i.size]+s)/o,l=(Je[i.size]+s+.08)/o,(r=je("sqrtSize"+i.size,l,m,s,e)).style.minWidth="1.02em",a=1/o):(l=t+s+.08,h=t+s,m=Math.floor(1e3*t+s)+80,(r=je("sqrtTall",l,m,s,e)).style.minWidth="0.742em",a=1.056),r.height=h,r.style.height=l+"em",{span:r,advanceWidth:a,ruleWidth:(e.fontMetrics().sqrtRuleThickness+s)*o}},or=function(t,e,r,a,n){if("<"===t||"\\lt"===t||"\u27e8"===t?t="\\langle":">"!==t&&"\\gt"!==t&&"\u27e9"!==t||(t="\\rangle"),c.contains($e,t)||c.contains(Ke,t))return Ye(t,e,!1,r,a,n);if(c.contains(Ze,t))return _e(t,Je[e],!1,r,a,n);throw new o("Illegal delimiter: '"+t+"'")},sr=nr,lr=function(t,e,r,a,n,i){var o=a.fontMetrics().axisHeight*a.sizeMultiplier,s=5/a.fontMetrics().ptPerEm,l=Math.max(e-o,r+o),h=Math.max(l/500*901,2*l-s);return nr(t,h,!0,a,n,i)},hr={"\\bigl":{mclass:"mopen",size:1},"\\Bigl":{mclass:"mopen",size:2},"\\biggl":{mclass:"mopen",size:3},"\\Biggl":{mclass:"mopen",size:4},"\\bigr":{mclass:"mclose",size:1},"\\Bigr":{mclass:"mclose",size:2},"\\biggr":{mclass:"mclose",size:3},"\\Biggr":{mclass:"mclose",size:4},"\\bigm":{mclass:"mrel",size:1},"\\Bigm":{mclass:"mrel",size:2},"\\biggm":{mclass:"mrel",size:3},"\\Biggm":{mclass:"mrel",size:4},"\\big":{mclass:"mord",size:1},"\\Big":{mclass:"mord",size:2},"\\bigg":{mclass:"mord",size:3},"\\Bigg":{mclass:"mord",size:4}},mr=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","\u230a","\u230b","\\lceil","\\rceil","\u2308","\u2309","<",">","\\langle","\u27e8","\\rangle","\u27e9","\\lt","\\gt","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","\u27ee","\u27ef","\\lmoustache","\\rmoustache","\u23b0","\u23b1","/","\\backslash","|","\\vert","\\|","\\Vert","\\uparrow","\\Uparrow","\\downarrow","\\Downarrow","\\updownarrow","\\Updownarrow","."];function cr(t,e){var r=Ne(t);if(r&&c.contains(mr,r.text))return r;throw new o(r?"Invalid delimiter '"+r.text+"' after '"+e.funcName+"'":"Invalid delimiter type '"+t.type+"'",t)}function ur(t){if(!t.body)throw new Error("Bug: The leftright ParseNode wasn't fully parsed.")}_t({type:"delimsizing",names:["\\bigl","\\Bigl","\\biggl","\\Biggl","\\bigr","\\Bigr","\\biggr","\\Biggr","\\bigm","\\Bigm","\\biggm","\\Biggm","\\big","\\Big","\\bigg","\\Bigg"],props:{numArgs:1},handler:function(t,e){var r=cr(e[0],t);return{type:"delimsizing",mode:t.parser.mode,size:hr[t.funcName].size,mclass:hr[t.funcName].mclass,delim:r.text}},htmlBuilder:function(t,e){return"."===t.delim?Dt.makeSpan([t.mclass]):or(t.delim,t.size,e,t.mode,[t.mclass])},mathmlBuilder:function(t){var e=[];"."!==t.delim&&e.push(pe(t.delim,t.mode));var r=new ue.MathNode("mo",e);return"mopen"===t.mclass||"mclose"===t.mclass?r.setAttribute("fence","true"):r.setAttribute("fence","false"),r}}),_t({type:"leftright-right",names:["\\right"],props:{numArgs:1},handler:function(t,e){var r=t.parser.gullet.macros.get("\\current@color");if(r&&"string"!=typeof r)throw new o("\\current@color set to non-string in \\right");return{type:"leftright-right",mode:t.parser.mode,delim:cr(e[0],t).text,color:r}}}),_t({type:"leftright",names:["\\left"],props:{numArgs:1},handler:function(t,e){var r=cr(e[0],t),a=t.parser;++a.leftrightDepth;var n=a.parseExpression(!1);--a.leftrightDepth,a.expect("\\right",!1);var i=Ce(a.parseFunction(),"leftright-right");return{type:"leftright",mode:a.mode,body:n,left:r.text,right:i.delim,rightColor:i.color}},htmlBuilder:function(t,e){ur(t);for(var r,a,n=ee(t.body,e,!0,["mopen","mclose"]),i=0,o=0,s=!1,l=0;l-1?"mpadded":"menclose",[ve(t.body,e)]);switch(t.label){case"\\cancel":a.setAttribute("notation","updiagonalstrike");break;case"\\bcancel":a.setAttribute("notation","downdiagonalstrike");break;case"\\sout":a.setAttribute("notation","horizontalstrike");break;case"\\fbox":a.setAttribute("notation","box");break;case"\\fcolorbox":case"\\colorbox":if(r=e.fontMetrics().fboxsep*e.fontMetrics().ptPerEm,a.setAttribute("width","+"+2*r+"pt"),a.setAttribute("height","+"+2*r+"pt"),a.setAttribute("lspace",r+"pt"),a.setAttribute("voffset",r+"pt"),"\\fcolorbox"===t.label){var n=Math.max(e.fontMetrics().fboxrule,e.minRuleThickness);a.setAttribute("style","border: "+n+"em solid "+String(t.borderColor))}break;case"\\xcancel":a.setAttribute("notation","updiagonalstrike downdiagonalstrike")}return t.backgroundColor&&a.setAttribute("mathbackground",t.backgroundColor),a};_t({type:"enclose",names:["\\colorbox"],props:{numArgs:2,allowedInText:!0,greediness:3,argTypes:["color","text"]},handler:function(t,e,r){var a=t.parser,n=t.funcName,i=Ce(e[0],"color-token").color,o=e[1];return{type:"enclose",mode:a.mode,label:n,backgroundColor:i,body:o}},htmlBuilder:pr,mathmlBuilder:dr}),_t({type:"enclose",names:["\\fcolorbox"],props:{numArgs:3,allowedInText:!0,greediness:3,argTypes:["color","color","text"]},handler:function(t,e,r){var a=t.parser,n=t.funcName,i=Ce(e[0],"color-token").color,o=Ce(e[1],"color-token").color,s=e[2];return{type:"enclose",mode:a.mode,label:n,backgroundColor:o,borderColor:i,body:s}},htmlBuilder:pr,mathmlBuilder:dr}),_t({type:"enclose",names:["\\fbox"],props:{numArgs:1,argTypes:["hbox"],allowedInText:!0},handler:function(t,e){return{type:"enclose",mode:t.parser.mode,label:"\\fbox",body:e[0]}}}),_t({type:"enclose",names:["\\cancel","\\bcancel","\\xcancel","\\sout"],props:{numArgs:1},handler:function(t,e,r){var a=t.parser,n=t.funcName,i=e[0];return{type:"enclose",mode:a.mode,label:n,body:i}},htmlBuilder:pr,mathmlBuilder:dr});var fr={};function gr(t){for(var e=t.type,r=t.names,a=t.props,n=t.handler,i=t.htmlBuilder,o=t.mathmlBuilder,s={type:e,numArgs:a.numArgs||0,greediness:1,allowedInText:!1,numOptionalArgs:0,handler:n},l=0;l0&&(b+=.25),h.push({pos:b,isDashed:t[e]})}for(y(i[0]),r=0;r0&&(M<(B+=v)&&(M=B),B=0),t.addJot&&(M+=f),z.height=S,z.depth=M,b+=S,z.pos=b,b+=M+B,l[r]=z,y(i[r+1])}var C,q,N=b/2+e.fontMetrics().axisHeight,I=t.cols||[],O=[];for(a=0,q=0;a=s)){var D=void 0;(a>0||t.hskipBeforeAndAfter)&&0!==(D=c.deflt(R.pregap,p))&&((C=Dt.makeSpan(["arraycolsep"],[])).style.width=D+"em",O.push(C));var H=[];for(r=0;r0){for(var G=Dt.makeLineSpan("hline",e,m),Y=Dt.makeLineSpan("hdashline",e,m),W=[{type:"elem",elem:l,shift:0}];h.length>0;){var X=h.pop(),_=X.pos-N;X.isDashed?W.push({type:"elem",elem:Y,shift:_}):W.push({type:"elem",elem:G,shift:_})}l=Dt.makeVList({positionType:"individualShift",children:W},e)}return Dt.makeSpan(["mord"],[l],e)},wr={c:"center ",l:"left ",r:"right "},kr=function(t,e){var r=new ue.MathNode("mtable",t.body.map(function(t){return new ue.MathNode("mtr",t.map(function(t){return new ue.MathNode("mtd",[ve(t,e)])}))})),a=.5===t.arraystretch?.1:.16+t.arraystretch-1+(t.addJot?.09:0);r.setAttribute("rowspacing",a+"em");var n="",i="";if(t.cols&&t.cols.length>0){var o=t.cols,s="",l=!1,h=0,m=o.length;"separator"===o[0].type&&(n+="top ",h=1),"separator"===o[o.length-1].type&&(n+="bottom ",m-=1);for(var c=h;c0?"left ":"",n+=g[g.length-1].length>0?"right ":"";for(var x=1;x0&&m&&(p=1),a[c]={type:"align",align:u,pregap:p,postgap:0}}return n.colSeparationType=m?"align":"alignat",n};gr({type:"array",names:["array","darray"],props:{numArgs:1},handler:function(t,e){var r={cols:(Ne(e[0])?[e[0]]:Ce(e[0],"ordgroup").body).map(function(t){var e=qe(t).text;if(-1!=="lcr".indexOf(e))return{type:"align",align:e};if("|"===e)return{type:"separator",separator:"|"};if(":"===e)return{type:"separator",separator:":"};throw new o("Unknown column alignment: "+e,t)}),hskipBeforeAndAfter:!0};return vr(t.parser,r,br(t.envName))},htmlBuilder:yr,mathmlBuilder:kr}),gr({type:"array",names:["matrix","pmatrix","bmatrix","Bmatrix","vmatrix","Vmatrix"],props:{numArgs:0},handler:function(t){var e={matrix:null,pmatrix:["(",")"],bmatrix:["[","]"],Bmatrix:["\\{","\\}"],vmatrix:["|","|"],Vmatrix:["\\Vert","\\Vert"]}[t.envName],r=vr(t.parser,{hskipBeforeAndAfter:!1},br(t.envName));return e?{type:"leftright",mode:t.mode,body:[r],left:e[0],right:e[1],rightColor:void 0}:r},htmlBuilder:yr,mathmlBuilder:kr}),gr({type:"array",names:["smallmatrix"],props:{numArgs:0},handler:function(t){var e=vr(t.parser,{arraystretch:.5},"script");return e.colSeparationType="small",e},htmlBuilder:yr,mathmlBuilder:kr}),gr({type:"array",names:["subarray"],props:{numArgs:1},handler:function(t,e){var r=(Ne(e[0])?[e[0]]:Ce(e[0],"ordgroup").body).map(function(t){var e=qe(t).text;if(-1!=="lc".indexOf(e))return{type:"align",align:e};throw new o("Unknown column alignment: "+e,t)});if(r.length>1)throw new o("{subarray} can contain only one column");var a={cols:r,hskipBeforeAndAfter:!1,arraystretch:.5};if((a=vr(t.parser,a,"script")).body.length>0&&a.body[0].length>1)throw new o("{subarray} can contain only one column");return a},htmlBuilder:yr,mathmlBuilder:kr}),gr({type:"array",names:["cases","dcases","rcases","drcases"],props:{numArgs:0},handler:function(t){var e=vr(t.parser,{arraystretch:1.2,cols:[{type:"align",align:"l",pregap:0,postgap:1},{type:"align",align:"l",pregap:0,postgap:0}]},br(t.envName));return{type:"leftright",mode:t.mode,body:[e],left:t.envName.indexOf("r")>-1?".":"\\{",right:t.envName.indexOf("r")>-1?"\\}":".",rightColor:void 0}},htmlBuilder:yr,mathmlBuilder:kr}),gr({type:"array",names:["aligned"],props:{numArgs:0},handler:Sr,htmlBuilder:yr,mathmlBuilder:kr}),gr({type:"array",names:["gathered"],props:{numArgs:0},handler:function(t){return vr(t.parser,{cols:[{type:"align",align:"c"}],addJot:!0},"display")},htmlBuilder:yr,mathmlBuilder:kr}),gr({type:"array",names:["alignedat"],props:{numArgs:1},handler:Sr,htmlBuilder:yr,mathmlBuilder:kr}),_t({type:"text",names:["\\hline","\\hdashline"],props:{numArgs:0,allowedInText:!0,allowedInMath:!0},handler:function(t,e){throw new o(t.funcName+" valid only within array environment")}});var Mr=fr;_t({type:"environment",names:["\\begin","\\end"],props:{numArgs:1,argTypes:["text"]},handler:function(t,e){var r=t.parser,a=t.funcName,n=e[0];if("ordgroup"!==n.type)throw new o("Invalid environment name",n);for(var i="",s=0;s=w.SCRIPT.id?r.text():w.DISPLAY:"text"===t&&r.size===w.DISPLAY.size?r=w.TEXT:"script"===t?r=w.SCRIPT:"scriptscript"===t&&(r=w.SCRIPTSCRIPT),r},Or=function(t,e){var r,a=Ir(t.size,e.style),n=a.fracNum(),i=a.fracDen();r=e.havingStyle(n);var o=oe(t.numer,r,e);if(t.continued){var s=8.5/e.fontMetrics().ptPerEm,l=3.5/e.fontMetrics().ptPerEm;o.height=o.height0?3*c:7*c,d=e.fontMetrics().denom1):(m>0?(u=e.fontMetrics().num2,p=c):(u=e.fontMetrics().num3,p=3*c),d=e.fontMetrics().denom2),h){var y=e.fontMetrics().axisHeight;u-o.depth-(y+.5*m)0&&(e="."===(e=t)?null:e),e};_t({type:"genfrac",names:["\\genfrac"],props:{numArgs:6,greediness:6,argTypes:["math","math","size","text","math","math"]},handler:function(t,e){var r,a=t.parser,n=e[4],i=e[5],o="atom"===e[0].type&&"open"===e[0].family?Lr(e[0].text):null,s="atom"===e[1].type&&"close"===e[1].family?Lr(e[1].text):null,l=Ce(e[2],"size"),h=null;r=!!l.isBlank||(h=l.value).number>0;var m="auto",c=e[3];if("ordgroup"===c.type){if(c.body.length>0){var u=Ce(c.body[0],"textord");m=Er[Number(u.text)]}}else c=Ce(c,"textord"),m=Er[Number(c.text)];return{type:"genfrac",mode:a.mode,numer:n,denom:i,continued:!1,hasBarLine:r,barSize:h,leftDelim:o,rightDelim:s,size:m}},htmlBuilder:Or,mathmlBuilder:Rr}),_t({type:"infix",names:["\\above"],props:{numArgs:1,argTypes:["size"],infix:!0},handler:function(t,e){var r=t.parser,a=(t.funcName,t.token);return{type:"infix",mode:r.mode,replaceWith:"\\\\abovefrac",size:Ce(e[0],"size").value,token:a}}}),_t({type:"genfrac",names:["\\\\abovefrac"],props:{numArgs:3,argTypes:["math","size","math"]},handler:function(t,e){var r=t.parser,a=(t.funcName,e[0]),n=function(t){if(!t)throw new Error("Expected non-null, but got "+String(t));return t}(Ce(e[1],"infix").size),i=e[2],o=n.number>0;return{type:"genfrac",mode:r.mode,numer:a,denom:i,continued:!1,hasBarLine:o,barSize:n,leftDelim:null,rightDelim:null,size:"auto"}},htmlBuilder:Or,mathmlBuilder:Rr});var Pr=function(t,e){var r,a,n=e.style;"supsub"===t.type?(r=t.sup?oe(t.sup,e.havingStyle(n.sup()),e):oe(t.sub,e.havingStyle(n.sub()),e),a=Ce(t.base,"horizBrace")):a=Ce(t,"horizBrace");var i,o=oe(a.base,e.havingBaseStyle(w.DISPLAY)),s=Be(a,e);if(a.isOver?(i=Dt.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:o},{type:"kern",size:.1},{type:"elem",elem:s}]},e)).children[0].children[0].children[1].classes.push("svg-align"):(i=Dt.makeVList({positionType:"bottom",positionData:o.depth+.1+s.height,children:[{type:"elem",elem:s},{type:"kern",size:.1},{type:"elem",elem:o}]},e)).children[0].children[0].children[0].classes.push("svg-align"),r){var l=Dt.makeSpan(["mord",a.isOver?"mover":"munder"],[i],e);i=a.isOver?Dt.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:l},{type:"kern",size:.2},{type:"elem",elem:r}]},e):Dt.makeVList({positionType:"bottom",positionData:l.depth+.2+r.height+r.depth,children:[{type:"elem",elem:r},{type:"kern",size:.2},{type:"elem",elem:l}]},e)}return Dt.makeSpan(["mord",a.isOver?"mover":"munder"],[i],e)};_t({type:"horizBrace",names:["\\overbrace","\\underbrace"],props:{numArgs:1},handler:function(t,e){var r=t.parser,a=t.funcName;return{type:"horizBrace",mode:r.mode,label:a,isOver:/^\\over/.test(a),base:e[0]}},htmlBuilder:Pr,mathmlBuilder:function(t,e){var r=Te(t.label);return new ue.MathNode(t.isOver?"mover":"munder",[ve(t.base,e),r])}}),_t({type:"href",names:["\\href"],props:{numArgs:2,argTypes:["url","original"],allowedInText:!0},handler:function(t,e){var r=t.parser,a=e[1],n=Ce(e[0],"url").url;return r.settings.isTrusted({command:"\\href",url:n})?{type:"href",mode:r.mode,href:n,body:$t(a)}:r.formatUnsupportedCmd("\\href")},htmlBuilder:function(t,e){var r=ee(t.body,e,!1);return Dt.makeAnchor(t.href,[],r,e)},mathmlBuilder:function(t,e){var r=xe(t.body,e);return r instanceof me||(r=new me("mrow",[r])),r.setAttribute("href",t.href),r}}),_t({type:"href",names:["\\url"],props:{numArgs:1,argTypes:["url"],allowedInText:!0},handler:function(t,e){var r=t.parser,a=Ce(e[0],"url").url;if(!r.settings.isTrusted({command:"\\url",url:a}))return r.formatUnsupportedCmd("\\url");for(var n=[],i=0;i0&&(a=Tt(t.totalheight,e)-r,a=Number(a.toFixed(2)));var n=0;t.width.number>0&&(n=Tt(t.width,e));var i={height:r+a+"em"};n>0&&(i.width=n+"em"),a>0&&(i.verticalAlign=-a+"em");var o=new O(t.src,t.alt,i);return o.height=r,o.depth=a,o},mathmlBuilder:function(t,e){var r=new ue.MathNode("mglyph",[]);r.setAttribute("alt",t.alt);var a=Tt(t.height,e),n=0;if(t.totalheight.number>0&&(n=(n=Tt(t.totalheight,e)-a).toFixed(2),r.setAttribute("valign","-"+n+"em")),r.setAttribute("height",a+n+"em"),t.width.number>0){var i=Tt(t.width,e);r.setAttribute("width",i+"em")}return r.setAttribute("src",t.src),r}}),_t({type:"kern",names:["\\kern","\\mkern","\\hskip","\\mskip"],props:{numArgs:1,argTypes:["size"],allowedInText:!0},handler:function(t,e){var r=t.parser,a=t.funcName,n=Ce(e[0],"size");if(r.settings.strict){var i="m"===a[1],o="mu"===n.value.unit;i?(o||r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+a+" supports only mu units, not "+n.value.unit+" units"),"math"!==r.mode&&r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+a+" works only in math mode")):o&&r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+a+" doesn't support mu units")}return{type:"kern",mode:r.mode,dimension:n.value}},htmlBuilder:function(t,e){return Dt.makeGlue(t.dimension,e)},mathmlBuilder:function(t,e){var r=Tt(t.dimension,e);return new ue.SpaceNode(r)}}),_t({type:"lap",names:["\\mathllap","\\mathrlap","\\mathclap"],props:{numArgs:1,allowedInText:!0},handler:function(t,e){var r=t.parser,a=t.funcName,n=e[0];return{type:"lap",mode:r.mode,alignment:a.slice(5),body:n}},htmlBuilder:function(t,e){var r;"clap"===t.alignment?(r=Dt.makeSpan([],[oe(t.body,e)]),r=Dt.makeSpan(["inner"],[r],e)):r=Dt.makeSpan(["inner"],[oe(t.body,e)]);var a=Dt.makeSpan(["fix"],[]),n=Dt.makeSpan([t.alignment],[r,a],e),i=Dt.makeSpan(["strut"]);return i.style.height=n.height+n.depth+"em",i.style.verticalAlign=-n.depth+"em",n.children.unshift(i),n=Dt.makeSpan(["thinbox"],[n],e),Dt.makeSpan(["mord","vbox"],[n],e)},mathmlBuilder:function(t,e){var r=new ue.MathNode("mpadded",[ve(t.body,e)]);if("rlap"!==t.alignment){var a="llap"===t.alignment?"-1":"-0.5";r.setAttribute("lspace",a+"width")}return r.setAttribute("width","0px"),r}}),_t({type:"styling",names:["\\(","$"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler:function(t,e){var r=t.funcName,a=t.parser,n=a.mode;a.switchMode("math");var i="\\("===r?"\\)":"$",o=a.parseExpression(!1,i);return a.expect(i),a.switchMode(n),{type:"styling",mode:a.mode,style:"text",body:o}}}),_t({type:"text",names:["\\)","\\]"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler:function(t,e){throw new o("Mismatched "+t.funcName)}});var Hr=function(t,e){switch(e.style.size){case w.DISPLAY.size:return t.display;case w.TEXT.size:return t.text;case w.SCRIPT.size:return t.script;case w.SCRIPTSCRIPT.size:return t.scriptscript;default:return t.text}};_t({type:"mathchoice",names:["\\mathchoice"],props:{numArgs:4},handler:function(t,e){return{type:"mathchoice",mode:t.parser.mode,display:$t(e[0]),text:$t(e[1]),script:$t(e[2]),scriptscript:$t(e[3])}},htmlBuilder:function(t,e){var r=Hr(t,e),a=ee(r,e,!1);return Dt.makeFragment(a)},mathmlBuilder:function(t,e){var r=Hr(t,e);return xe(r,e)}});var Fr=function(t,e,r,a,n,i,o){var s,l,h;if(t=Dt.makeSpan([],[t]),e){var m=oe(e,a.havingStyle(n.sup()),a);l={elem:m,kern:Math.max(a.fontMetrics().bigOpSpacing1,a.fontMetrics().bigOpSpacing3-m.depth)}}if(r){var c=oe(r,a.havingStyle(n.sub()),a);s={elem:c,kern:Math.max(a.fontMetrics().bigOpSpacing2,a.fontMetrics().bigOpSpacing4-c.height)}}if(l&&s){var u=a.fontMetrics().bigOpSpacing5+s.elem.height+s.elem.depth+s.kern+t.depth+o;h=Dt.makeVList({positionType:"bottom",positionData:u,children:[{type:"kern",size:a.fontMetrics().bigOpSpacing5},{type:"elem",elem:s.elem,marginLeft:-i+"em"},{type:"kern",size:s.kern},{type:"elem",elem:t},{type:"kern",size:l.kern},{type:"elem",elem:l.elem,marginLeft:i+"em"},{type:"kern",size:a.fontMetrics().bigOpSpacing5}]},a)}else if(s){var p=t.height-o;h=Dt.makeVList({positionType:"top",positionData:p,children:[{type:"kern",size:a.fontMetrics().bigOpSpacing5},{type:"elem",elem:s.elem,marginLeft:-i+"em"},{type:"kern",size:s.kern},{type:"elem",elem:t}]},a)}else{if(!l)return t;var d=t.depth+o;h=Dt.makeVList({positionType:"bottom",positionData:d,children:[{type:"elem",elem:t},{type:"kern",size:l.kern},{type:"elem",elem:l.elem,marginLeft:i+"em"},{type:"kern",size:a.fontMetrics().bigOpSpacing5}]},a)}return Dt.makeSpan(["mop","op-limits"],[h],a)},Vr=["\\smallint"],Ur=function(t,e){var r,a,n,i=!1;"supsub"===t.type?(r=t.sup,a=t.sub,n=Ce(t.base,"op"),i=!0):n=Ce(t,"op");var o,s=e.style,l=!1;if(s.size===w.DISPLAY.size&&n.symbol&&!c.contains(Vr,n.name)&&(l=!0),n.symbol){var h=l?"Size2-Regular":"Size1-Regular",m="";if("\\oiint"!==n.name&&"\\oiiint"!==n.name||(m=n.name.substr(1),n.name="oiint"===m?"\\iint":"\\iiint"),o=Dt.makeSymbol(n.name,h,"math",e,["mop","op-symbol",l?"large-op":"small-op"]),m.length>0){var u=o.italic,p=Dt.staticSvg(m+"Size"+(l?"2":"1"),e);o=Dt.makeVList({positionType:"individualShift",children:[{type:"elem",elem:o,shift:0},{type:"elem",elem:p,shift:l?.08:0}]},e),n.name="\\"+m,o.classes.unshift("mop"),o.italic=u}}else if(n.body){var d=ee(n.body,e,!0);1===d.length&&d[0]instanceof E?(o=d[0]).classes[0]="mop":o=Dt.makeSpan(["mop"],Dt.tryCombineChars(d),e)}else{for(var f=[],g=1;g0){for(var s=n.body.map(function(t){var e=t.text;return"string"==typeof e?{type:"textord",mode:t.mode,text:e}:t}),l=ee(s,e.withFont("mathrm"),!0),h=0;h=0?s.setAttribute("height","+"+n+"em"):(s.setAttribute("height",n+"em"),s.setAttribute("depth","+"+-n+"em")),s.setAttribute("voffset",n+"em"),s}});var jr=["\\tiny","\\sixptsize","\\scriptsize","\\footnotesize","\\small","\\normalsize","\\large","\\Large","\\LARGE","\\huge","\\Huge"];_t({type:"sizing",names:jr,props:{numArgs:0,allowedInText:!0},handler:function(t,e){var r=t.breakOnTokenText,a=t.funcName,n=t.parser,i=n.parseExpression(!1,r);return{type:"sizing",mode:n.mode,size:jr.indexOf(a)+1,body:i}},htmlBuilder:function(t,e){var r=e.havingSize(t.size);return _r(t.body,r,e)},mathmlBuilder:function(t,e){var r=e.havingSize(t.size),a=ge(t.body,r),n=new ue.MathNode("mstyle",a);return n.setAttribute("mathsize",r.sizeMultiplier+"em"),n}}),_t({type:"smash",names:["\\smash"],props:{numArgs:1,numOptionalArgs:1,allowedInText:!0},handler:function(t,e,r){var a=t.parser,n=!1,i=!1,o=r[0]&&Ce(r[0],"ordgroup");if(o)for(var s="",l=0;lr.height+r.depth+i&&(i=(i+c-r.height-r.depth)/2);var u=l.height-r.height-i-h;r.style.paddingLeft=m+"em";var p=Dt.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:r,wrapperClasses:["svg-align"]},{type:"kern",size:-(r.height+u)},{type:"elem",elem:l},{type:"kern",size:h}]},e);if(t.index){var d=e.havingStyle(w.SCRIPTSCRIPT),f=oe(t.index,d,e),g=.6*(p.height-p.depth),x=Dt.makeVList({positionType:"shift",positionData:-g,children:[{type:"elem",elem:f}]},e),v=Dt.makeSpan(["root"],[x]);return Dt.makeSpan(["mord","sqrt"],[v,p],e)}return Dt.makeSpan(["mord","sqrt"],[p],e)},mathmlBuilder:function(t,e){var r=t.body,a=t.index;return a?new ue.MathNode("mroot",[ve(r,e),ve(a,e)]):new ue.MathNode("msqrt",[ve(r,e)])}});var $r={display:w.DISPLAY,text:w.TEXT,script:w.SCRIPT,scriptscript:w.SCRIPTSCRIPT};_t({type:"styling",names:["\\displaystyle","\\textstyle","\\scriptstyle","\\scriptscriptstyle"],props:{numArgs:0,allowedInText:!0},handler:function(t,e){var r=t.breakOnTokenText,a=t.funcName,n=t.parser,i=n.parseExpression(!0,r),o=a.slice(1,a.length-5);return{type:"styling",mode:n.mode,style:o,body:i}},htmlBuilder:function(t,e){var r=$r[t.style],a=e.havingStyle(r).withFont("");return _r(t.body,a,e)},mathmlBuilder:function(t,e){var r=$r[t.style],a=e.havingStyle(r),n=ge(t.body,a),i=new ue.MathNode("mstyle",n),o={display:["0","true"],text:["0","false"],script:["1","false"],scriptscript:["2","false"]}[t.style];return i.setAttribute("scriptlevel",o[0]),i.setAttribute("displaystyle",o[1]),i}});jt({type:"supsub",htmlBuilder:function(t,e){var r=function(t,e){var r=t.base;return r?"op"===r.type?r.limits&&(e.style.size===w.DISPLAY.size||r.alwaysHandleSupSub)?Ur:null:"operatorname"===r.type?r.alwaysHandleSupSub&&(e.style.size===w.DISPLAY.size||r.limits)?Xr:null:"accent"===r.type?c.isCharacterBox(r.base)?Ie:null:"horizBrace"===r.type&&!t.sub===r.isOver?Pr:null:null}(t,e);if(r)return r(t,e);var a,n,i,o=t.base,s=t.sup,l=t.sub,h=oe(o,e),m=e.fontMetrics(),u=0,p=0,d=o&&c.isCharacterBox(o);if(s){var f=e.havingStyle(e.style.sup());a=oe(s,f,e),d||(u=h.height-f.fontMetrics().supDrop*f.sizeMultiplier/e.sizeMultiplier)}if(l){var g=e.havingStyle(e.style.sub());n=oe(l,g,e),d||(p=h.depth+g.fontMetrics().subDrop*g.sizeMultiplier/e.sizeMultiplier)}i=e.style===w.DISPLAY?m.sup1:e.style.cramped?m.sup3:m.sup2;var x,v=e.sizeMultiplier,b=.5/m.ptPerEm/v+"em",y=null;if(n){var k=t.base&&"op"===t.base.type&&t.base.name&&("\\oiint"===t.base.name||"\\oiiint"===t.base.name);(h instanceof E||k)&&(y=-h.italic+"em")}if(a&&n){u=Math.max(u,i,a.depth+.25*m.xHeight),p=Math.max(p,m.sub2);var S=4*m.defaultRuleThickness;if(u-a.depth-(n.height-p)0&&(u+=M,p-=M)}var z=[{type:"elem",elem:n,shift:p,marginRight:b,marginLeft:y},{type:"elem",elem:a,shift:-u,marginRight:b}];x=Dt.makeVList({positionType:"individualShift",children:z},e)}else if(n){p=Math.max(p,m.sub1,n.height-.8*m.xHeight);var A=[{type:"elem",elem:n,marginLeft:y,marginRight:b}];x=Dt.makeVList({positionType:"shift",positionData:p,children:A},e)}else{if(!a)throw new Error("supsub must have either sup or sub.");u=Math.max(u,i,a.depth+.25*m.xHeight),x=Dt.makeVList({positionType:"shift",positionData:-u,children:[{type:"elem",elem:a,marginRight:b}]},e)}var T=ne(h,"right")||"mord";return Dt.makeSpan([T],[h,Dt.makeSpan(["msupsub"],[x])],e)},mathmlBuilder:function(t,e){var r,a=!1;t.base&&"horizBrace"===t.base.type&&!!t.sup===t.base.isOver&&(a=!0,r=t.base.isOver),!t.base||"op"!==t.base.type&&"operatorname"!==t.base.type||(t.base.parentIsSupSub=!0);var n,i=[ve(t.base,e)];if(t.sub&&i.push(ve(t.sub,e)),t.sup&&i.push(ve(t.sup,e)),a)n=r?"mover":"munder";else if(t.sub)if(t.sup){var o=t.base;n=o&&"op"===o.type&&o.limits&&e.style===w.DISPLAY?"munderover":o&&"operatorname"===o.type&&o.alwaysHandleSupSub&&(e.style===w.DISPLAY||o.limits)?"munderover":"msubsup"}else{var s=t.base;n=s&&"op"===s.type&&s.limits&&(e.style===w.DISPLAY||s.alwaysHandleSupSub)?"munder":s&&"operatorname"===s.type&&s.alwaysHandleSupSub&&(s.limits||e.style===w.DISPLAY)?"munder":"msub"}else{var l=t.base;n=l&&"op"===l.type&&l.limits&&(e.style===w.DISPLAY||l.alwaysHandleSupSub)?"mover":l&&"operatorname"===l.type&&l.alwaysHandleSupSub&&(l.limits||e.style===w.DISPLAY)?"mover":"msup"}return new ue.MathNode(n,i)}}),jt({type:"atom",htmlBuilder:function(t,e){return Dt.mathsym(t.text,t.mode,e,["m"+t.family])},mathmlBuilder:function(t,e){var r=new ue.MathNode("mo",[pe(t.text,t.mode)]);if("bin"===t.family){var a=fe(t,e);"bold-italic"===a&&r.setAttribute("mathvariant",a)}else"punct"===t.family?r.setAttribute("separator","true"):"open"!==t.family&&"close"!==t.family||r.setAttribute("stretchy","false");return r}});var Zr={mi:"italic",mn:"normal",mtext:"normal"};jt({type:"mathord",htmlBuilder:function(t,e){return Dt.makeOrd(t,e,"mathord")},mathmlBuilder:function(t,e){var r=new ue.MathNode("mi",[pe(t.text,t.mode,e)]),a=fe(t,e)||"italic";return a!==Zr[r.type]&&r.setAttribute("mathvariant",a),r}}),jt({type:"textord",htmlBuilder:function(t,e){return Dt.makeOrd(t,e,"textord")},mathmlBuilder:function(t,e){var r,a=pe(t.text,t.mode,e),n=fe(t,e)||"normal";return r="text"===t.mode?new ue.MathNode("mtext",[a]):/[0-9]/.test(t.text)?new ue.MathNode("mn",[a]):"\\prime"===t.text?new ue.MathNode("mo",[a]):new ue.MathNode("mi",[a]),n!==Zr[r.type]&&r.setAttribute("mathvariant",n),r}});var Kr={"\\nobreak":"nobreak","\\allowbreak":"allowbreak"},Jr={" ":{},"\\ ":{},"~":{className:"nobreak"},"\\space":{},"\\nobreakspace":{className:"nobreak"}};jt({type:"spacing",htmlBuilder:function(t,e){if(Jr.hasOwnProperty(t.text)){var r=Jr[t.text].className||"";if("text"===t.mode){var a=Dt.makeOrd(t,e,"textord");return a.classes.push(r),a}return Dt.makeSpan(["mspace",r],[Dt.mathsym(t.text,t.mode,e)],e)}if(Kr.hasOwnProperty(t.text))return Dt.makeSpan(["mspace",Kr[t.text]],[],e);throw new o('Unknown type of space "'+t.text+'"')},mathmlBuilder:function(t,e){if(!Jr.hasOwnProperty(t.text)){if(Kr.hasOwnProperty(t.text))return new ue.MathNode("mspace");throw new o('Unknown type of space "'+t.text+'"')}return new ue.MathNode("mtext",[new ue.TextNode("\xa0")])}});var Qr=function(){var t=new ue.MathNode("mtd",[]);return t.setAttribute("width","50%"),t};jt({type:"tag",mathmlBuilder:function(t,e){var r=new ue.MathNode("mtable",[new ue.MathNode("mtr",[Qr(),new ue.MathNode("mtd",[xe(t.body,e)]),Qr(),new ue.MathNode("mtd",[xe(t.tag,e)])])]);return r.setAttribute("width","100%"),r}});var ta={"\\text":void 0,"\\textrm":"textrm","\\textsf":"textsf","\\texttt":"texttt","\\textnormal":"textrm"},ea={"\\textbf":"textbf","\\textmd":"textmd"},ra={"\\textit":"textit","\\textup":"textup"},aa=function(t,e){var r=t.font;return r?ta[r]?e.withTextFontFamily(ta[r]):ea[r]?e.withTextFontWeight(ea[r]):e.withTextFontShape(ra[r]):e};_t({type:"text",names:["\\text","\\textrm","\\textsf","\\texttt","\\textnormal","\\textbf","\\textmd","\\textit","\\textup"],props:{numArgs:1,argTypes:["text"],greediness:2,allowedInText:!0},handler:function(t,e){var r=t.parser,a=t.funcName,n=e[0];return{type:"text",mode:r.mode,body:$t(n),font:a}},htmlBuilder:function(t,e){var r=aa(t,e),a=ee(t.body,r,!0);return Dt.makeSpan(["mord","text"],Dt.tryCombineChars(a),r)},mathmlBuilder:function(t,e){var r=aa(t,e);return xe(t.body,r)}}),_t({type:"underline",names:["\\underline"],props:{numArgs:1,allowedInText:!0},handler:function(t,e){return{type:"underline",mode:t.parser.mode,body:e[0]}},htmlBuilder:function(t,e){var r=oe(t.body,e),a=Dt.makeLineSpan("underline-line",e),n=e.fontMetrics().defaultRuleThickness,i=Dt.makeVList({positionType:"top",positionData:r.height,children:[{type:"kern",size:n},{type:"elem",elem:a},{type:"kern",size:3*n},{type:"elem",elem:r}]},e);return Dt.makeSpan(["mord","underline"],[i],e)},mathmlBuilder:function(t,e){var r=new ue.MathNode("mo",[new ue.TextNode("\u203e")]);r.setAttribute("stretchy","true");var a=new ue.MathNode("munder",[ve(t.body,e),r]);return a.setAttribute("accentunder","true"),a}}),_t({type:"verb",names:["\\verb"],props:{numArgs:0,allowedInText:!0},handler:function(t,e,r){throw new o("\\verb ended by end of line instead of matching delimiter")},htmlBuilder:function(t,e){for(var r=na(t),a=[],n=e.havingStyle(e.style.text()),i=0;i0&&(this.undefStack[this.undefStack.length-1][t]=e)}else{var n=this.undefStack[this.undefStack.length-1];n&&!n.hasOwnProperty(t)&&(n[t]=this.current[t])}this.current[t]=e},t}(),ca={},ua=ca;function pa(t,e){ca[t]=e}pa("\\noexpand",function(t){var e=t.popToken();return t.isExpandable(e.text)&&(e.noexpand=!0,e.treatAsRelax=!0),{tokens:[e],numArgs:0}}),pa("\\expandafter",function(t){var e=t.popToken();return t.expandOnce(!0),{tokens:[e],numArgs:0}}),pa("\\@firstoftwo",function(t){return{tokens:t.consumeArgs(2)[0],numArgs:0}}),pa("\\@secondoftwo",function(t){return{tokens:t.consumeArgs(2)[1],numArgs:0}}),pa("\\@ifnextchar",function(t){var e=t.consumeArgs(3);t.consumeSpaces();var r=t.future();return 1===e[0].length&&e[0][0].text===r.text?{tokens:e[1],numArgs:0}:{tokens:e[2],numArgs:0}}),pa("\\@ifstar","\\@ifnextchar *{\\@firstoftwo{#1}}"),pa("\\TextOrMath",function(t){var e=t.consumeArgs(2);return"text"===t.mode?{tokens:e[0],numArgs:0}:{tokens:e[1],numArgs:0}});var da={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,a:10,A:10,b:11,B:11,c:12,C:12,d:13,D:13,e:14,E:14,f:15,F:15};pa("\\char",function(t){var e,r=t.popToken(),a="";if("'"===r.text)e=8,r=t.popToken();else if('"'===r.text)e=16,r=t.popToken();else if("`"===r.text)if("\\"===(r=t.popToken()).text[0])a=r.text.charCodeAt(1);else{if("EOF"===r.text)throw new o("\\char` missing argument");a=r.text.charCodeAt(0)}else e=10;if(e){if(null==(a=da[r.text])||a>=e)throw new o("Invalid base-"+e+" digit "+r.text);for(var n;null!=(n=da[t.future().text])&&n":"\\dotsb","-":"\\dotsb","*":"\\dotsb",":":"\\dotsb","\\DOTSB":"\\dotsb","\\coprod":"\\dotsb","\\bigvee":"\\dotsb","\\bigwedge":"\\dotsb","\\biguplus":"\\dotsb","\\bigcap":"\\dotsb","\\bigcup":"\\dotsb","\\prod":"\\dotsb","\\sum":"\\dotsb","\\bigotimes":"\\dotsb","\\bigoplus":"\\dotsb","\\bigodot":"\\dotsb","\\bigsqcup":"\\dotsb","\\And":"\\dotsb","\\longrightarrow":"\\dotsb","\\Longrightarrow":"\\dotsb","\\longleftarrow":"\\dotsb","\\Longleftarrow":"\\dotsb","\\longleftrightarrow":"\\dotsb","\\Longleftrightarrow":"\\dotsb","\\mapsto":"\\dotsb","\\longmapsto":"\\dotsb","\\hookrightarrow":"\\dotsb","\\doteq":"\\dotsb","\\mathbin":"\\dotsb","\\mathrel":"\\dotsb","\\relbar":"\\dotsb","\\Relbar":"\\dotsb","\\xrightarrow":"\\dotsb","\\xleftarrow":"\\dotsb","\\DOTSI":"\\dotsi","\\int":"\\dotsi","\\oint":"\\dotsi","\\iint":"\\dotsi","\\iiint":"\\dotsi","\\iiiint":"\\dotsi","\\idotsint":"\\dotsi","\\DOTSX":"\\dotsx"};pa("\\dots",function(t){var e="\\dotso",r=t.expandAfterFuture().text;return r in ga?e=ga[r]:"\\not"===r.substr(0,4)?e="\\dotsb":r in j.math&&c.contains(["bin","rel"],j.math[r].group)&&(e="\\dotsb"),e});var xa={")":!0,"]":!0,"\\rbrack":!0,"\\}":!0,"\\rbrace":!0,"\\rangle":!0,"\\rceil":!0,"\\rfloor":!0,"\\rgroup":!0,"\\rmoustache":!0,"\\right":!0,"\\bigr":!0,"\\biggr":!0,"\\Bigr":!0,"\\Biggr":!0,$:!0,";":!0,".":!0,",":!0};pa("\\dotso",function(t){return t.future().text in xa?"\\ldots\\,":"\\ldots"}),pa("\\dotsc",function(t){var e=t.future().text;return e in xa&&","!==e?"\\ldots\\,":"\\ldots"}),pa("\\cdots",function(t){return t.future().text in xa?"\\@cdots\\,":"\\@cdots"}),pa("\\dotsb","\\cdots"),pa("\\dotsm","\\cdots"),pa("\\dotsi","\\!\\cdots"),pa("\\dotsx","\\ldots\\,"),pa("\\DOTSI","\\relax"),pa("\\DOTSB","\\relax"),pa("\\DOTSX","\\relax"),pa("\\tmspace","\\TextOrMath{\\kern#1#3}{\\mskip#1#2}\\relax"),pa("\\,","\\tmspace+{3mu}{.1667em}"),pa("\\thinspace","\\,"),pa("\\>","\\mskip{4mu}"),pa("\\:","\\tmspace+{4mu}{.2222em}"),pa("\\medspace","\\:"),pa("\\;","\\tmspace+{5mu}{.2777em}"),pa("\\thickspace","\\;"),pa("\\!","\\tmspace-{3mu}{.1667em}"),pa("\\negthinspace","\\!"),pa("\\negmedspace","\\tmspace-{4mu}{.2222em}"),pa("\\negthickspace","\\tmspace-{5mu}{.277em}"),pa("\\enspace","\\kern.5em "),pa("\\enskip","\\hskip.5em\\relax"),pa("\\quad","\\hskip1em\\relax"),pa("\\qquad","\\hskip2em\\relax"),pa("\\tag","\\@ifstar\\tag@literal\\tag@paren"),pa("\\tag@paren","\\tag@literal{({#1})}"),pa("\\tag@literal",function(t){if(t.macros.get("\\df@tag"))throw new o("Multiple \\tag");return"\\gdef\\df@tag{\\text{#1}}"}),pa("\\bmod","\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}\\mathbin{\\rm mod}\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}"),pa("\\pod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern8mu}{\\mkern8mu}{\\mkern8mu}(#1)"),pa("\\pmod","\\pod{{\\rm mod}\\mkern6mu#1}"),pa("\\mod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern12mu}{\\mkern12mu}{\\mkern12mu}{\\rm mod}\\,\\,#1"),pa("\\pmb","\\html@mathml{\\@binrel{#1}{\\mathrlap{#1}\\kern0.5px#1}}{\\mathbf{#1}}"),pa("\\\\","\\newline"),pa("\\TeX","\\textrm{\\html@mathml{T\\kern-.1667em\\raisebox{-.5ex}{E}\\kern-.125emX}{TeX}}");var va=F["Main-Regular"]["T".charCodeAt(0)][1]-.7*F["Main-Regular"]["A".charCodeAt(0)][1]+"em";pa("\\LaTeX","\\textrm{\\html@mathml{L\\kern-.36em\\raisebox{"+va+"}{\\scriptstyle A}\\kern-.15em\\TeX}{LaTeX}}"),pa("\\KaTeX","\\textrm{\\html@mathml{K\\kern-.17em\\raisebox{"+va+"}{\\scriptstyle A}\\kern-.15em\\TeX}{KaTeX}}"),pa("\\hspace","\\@ifstar\\@hspacer\\@hspace"),pa("\\@hspace","\\hskip #1\\relax"),pa("\\@hspacer","\\rule{0pt}{0pt}\\hskip #1\\relax"),pa("\\ordinarycolon",":"),pa("\\vcentcolon","\\mathrel{\\mathop\\ordinarycolon}"),pa("\\dblcolon",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-.9mu}\\vcentcolon}}{\\mathop{\\char"2237}}'),pa("\\coloneqq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2254}}'),pa("\\Coloneqq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2237\\char"3d}}'),pa("\\coloneq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"3a\\char"2212}}'),pa("\\Coloneq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"2237\\char"2212}}'),pa("\\eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2255}}'),pa("\\Eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"3d\\char"2237}}'),pa("\\eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2239}}'),pa("\\Eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"2212\\char"2237}}'),pa("\\colonapprox",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"3a\\char"2248}}'),pa("\\Colonapprox",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"2237\\char"2248}}'),pa("\\colonsim",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"3a\\char"223c}}'),pa("\\Colonsim",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"2237\\char"223c}}'),pa("\u2237","\\dblcolon"),pa("\u2239","\\eqcolon"),pa("\u2254","\\coloneqq"),pa("\u2255","\\eqqcolon"),pa("\u2a74","\\Coloneqq"),pa("\\ratio","\\vcentcolon"),pa("\\coloncolon","\\dblcolon"),pa("\\colonequals","\\coloneqq"),pa("\\coloncolonequals","\\Coloneqq"),pa("\\equalscolon","\\eqqcolon"),pa("\\equalscoloncolon","\\Eqqcolon"),pa("\\colonminus","\\coloneq"),pa("\\coloncolonminus","\\Coloneq"),pa("\\minuscolon","\\eqcolon"),pa("\\minuscoloncolon","\\Eqcolon"),pa("\\coloncolonapprox","\\Colonapprox"),pa("\\coloncolonsim","\\Colonsim"),pa("\\simcolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\vcentcolon}"),pa("\\simcoloncolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\dblcolon}"),pa("\\approxcolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\vcentcolon}"),pa("\\approxcoloncolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\dblcolon}"),pa("\\notni","\\html@mathml{\\not\\ni}{\\mathrel{\\char`\u220c}}"),pa("\\limsup","\\DOTSB\\operatorname*{lim\\,sup}"),pa("\\liminf","\\DOTSB\\operatorname*{lim\\,inf}"),pa("\\gvertneqq","\\html@mathml{\\@gvertneqq}{\u2269}"),pa("\\lvertneqq","\\html@mathml{\\@lvertneqq}{\u2268}"),pa("\\ngeqq","\\html@mathml{\\@ngeqq}{\u2271}"),pa("\\ngeqslant","\\html@mathml{\\@ngeqslant}{\u2271}"),pa("\\nleqq","\\html@mathml{\\@nleqq}{\u2270}"),pa("\\nleqslant","\\html@mathml{\\@nleqslant}{\u2270}"),pa("\\nshortmid","\\html@mathml{\\@nshortmid}{\u2224}"),pa("\\nshortparallel","\\html@mathml{\\@nshortparallel}{\u2226}"),pa("\\nsubseteqq","\\html@mathml{\\@nsubseteqq}{\u2288}"),pa("\\nsupseteqq","\\html@mathml{\\@nsupseteqq}{\u2289}"),pa("\\varsubsetneq","\\html@mathml{\\@varsubsetneq}{\u228a}"),pa("\\varsubsetneqq","\\html@mathml{\\@varsubsetneqq}{\u2acb}"),pa("\\varsupsetneq","\\html@mathml{\\@varsupsetneq}{\u228b}"),pa("\\varsupsetneqq","\\html@mathml{\\@varsupsetneqq}{\u2acc}"),pa("\\imath","\\html@mathml{\\@imath}{\u0131}"),pa("\\jmath","\\html@mathml{\\@jmath}{\u0237}"),pa("\\llbracket","\\html@mathml{\\mathopen{[\\mkern-3.2mu[}}{\\mathopen{\\char`\u27e6}}"),pa("\\rrbracket","\\html@mathml{\\mathclose{]\\mkern-3.2mu]}}{\\mathclose{\\char`\u27e7}}"),pa("\u27e6","\\llbracket"),pa("\u27e7","\\rrbracket"),pa("\\lBrace","\\html@mathml{\\mathopen{\\{\\mkern-3.2mu[}}{\\mathopen{\\char`\u2983}}"),pa("\\rBrace","\\html@mathml{\\mathclose{]\\mkern-3.2mu\\}}}{\\mathclose{\\char`\u2984}}"),pa("\u2983","\\lBrace"),pa("\u2984","\\rBrace"),pa("\\minuso","\\mathbin{\\html@mathml{{\\mathrlap{\\mathchoice{\\kern{0.145em}}{\\kern{0.145em}}{\\kern{0.1015em}}{\\kern{0.0725em}}\\circ}{-}}}{\\char`\u29b5}}"),pa("\u29b5","\\minuso"),pa("\\darr","\\downarrow"),pa("\\dArr","\\Downarrow"),pa("\\Darr","\\Downarrow"),pa("\\lang","\\langle"),pa("\\rang","\\rangle"),pa("\\uarr","\\uparrow"),pa("\\uArr","\\Uparrow"),pa("\\Uarr","\\Uparrow"),pa("\\N","\\mathbb{N}"),pa("\\R","\\mathbb{R}"),pa("\\Z","\\mathbb{Z}"),pa("\\alef","\\aleph"),pa("\\alefsym","\\aleph"),pa("\\Alpha","\\mathrm{A}"),pa("\\Beta","\\mathrm{B}"),pa("\\bull","\\bullet"),pa("\\Chi","\\mathrm{X}"),pa("\\clubs","\\clubsuit"),pa("\\cnums","\\mathbb{C}"),pa("\\Complex","\\mathbb{C}"),pa("\\Dagger","\\ddagger"),pa("\\diamonds","\\diamondsuit"),pa("\\empty","\\emptyset"),pa("\\Epsilon","\\mathrm{E}"),pa("\\Eta","\\mathrm{H}"),pa("\\exist","\\exists"),pa("\\harr","\\leftrightarrow"),pa("\\hArr","\\Leftrightarrow"),pa("\\Harr","\\Leftrightarrow"),pa("\\hearts","\\heartsuit"),pa("\\image","\\Im"),pa("\\infin","\\infty"),pa("\\Iota","\\mathrm{I}"),pa("\\isin","\\in"),pa("\\Kappa","\\mathrm{K}"),pa("\\larr","\\leftarrow"),pa("\\lArr","\\Leftarrow"),pa("\\Larr","\\Leftarrow"),pa("\\lrarr","\\leftrightarrow"),pa("\\lrArr","\\Leftrightarrow"),pa("\\Lrarr","\\Leftrightarrow"),pa("\\Mu","\\mathrm{M}"),pa("\\natnums","\\mathbb{N}"),pa("\\Nu","\\mathrm{N}"),pa("\\Omicron","\\mathrm{O}"),pa("\\plusmn","\\pm"),pa("\\rarr","\\rightarrow"),pa("\\rArr","\\Rightarrow"),pa("\\Rarr","\\Rightarrow"),pa("\\real","\\Re"),pa("\\reals","\\mathbb{R}"),pa("\\Reals","\\mathbb{R}"),pa("\\Rho","\\mathrm{P}"),pa("\\sdot","\\cdot"),pa("\\sect","\\S"),pa("\\spades","\\spadesuit"),pa("\\sub","\\subset"),pa("\\sube","\\subseteq"),pa("\\supe","\\supseteq"),pa("\\Tau","\\mathrm{T}"),pa("\\thetasym","\\vartheta"),pa("\\weierp","\\wp"),pa("\\Zeta","\\mathrm{Z}"),pa("\\argmin","\\DOTSB\\operatorname*{arg\\,min}"),pa("\\argmax","\\DOTSB\\operatorname*{arg\\,max}"),pa("\\plim","\\DOTSB\\mathop{\\operatorname{plim}}\\limits"),pa("\\bra","\\mathinner{\\langle{#1}|}"),pa("\\ket","\\mathinner{|{#1}\\rangle}"),pa("\\braket","\\mathinner{\\langle{#1}\\rangle}"),pa("\\Bra","\\left\\langle#1\\right|"),pa("\\Ket","\\left|#1\\right\\rangle"),pa("\\blue","\\textcolor{##6495ed}{#1}"),pa("\\orange","\\textcolor{##ffa500}{#1}"),pa("\\pink","\\textcolor{##ff00af}{#1}"),pa("\\red","\\textcolor{##df0030}{#1}"),pa("\\green","\\textcolor{##28ae7b}{#1}"),pa("\\gray","\\textcolor{gray}{#1}"),pa("\\purple","\\textcolor{##9d38bd}{#1}"),pa("\\blueA","\\textcolor{##ccfaff}{#1}"),pa("\\blueB","\\textcolor{##80f6ff}{#1}"),pa("\\blueC","\\textcolor{##63d9ea}{#1}"),pa("\\blueD","\\textcolor{##11accd}{#1}"),pa("\\blueE","\\textcolor{##0c7f99}{#1}"),pa("\\tealA","\\textcolor{##94fff5}{#1}"),pa("\\tealB","\\textcolor{##26edd5}{#1}"),pa("\\tealC","\\textcolor{##01d1c1}{#1}"),pa("\\tealD","\\textcolor{##01a995}{#1}"),pa("\\tealE","\\textcolor{##208170}{#1}"),pa("\\greenA","\\textcolor{##b6ffb0}{#1}"),pa("\\greenB","\\textcolor{##8af281}{#1}"),pa("\\greenC","\\textcolor{##74cf70}{#1}"),pa("\\greenD","\\textcolor{##1fab54}{#1}"),pa("\\greenE","\\textcolor{##0d923f}{#1}"),pa("\\goldA","\\textcolor{##ffd0a9}{#1}"),pa("\\goldB","\\textcolor{##ffbb71}{#1}"),pa("\\goldC","\\textcolor{##ff9c39}{#1}"),pa("\\goldD","\\textcolor{##e07d10}{#1}"),pa("\\goldE","\\textcolor{##a75a05}{#1}"),pa("\\redA","\\textcolor{##fca9a9}{#1}"),pa("\\redB","\\textcolor{##ff8482}{#1}"),pa("\\redC","\\textcolor{##f9685d}{#1}"),pa("\\redD","\\textcolor{##e84d39}{#1}"),pa("\\redE","\\textcolor{##bc2612}{#1}"),pa("\\maroonA","\\textcolor{##ffbde0}{#1}"),pa("\\maroonB","\\textcolor{##ff92c6}{#1}"),pa("\\maroonC","\\textcolor{##ed5fa6}{#1}"),pa("\\maroonD","\\textcolor{##ca337c}{#1}"),pa("\\maroonE","\\textcolor{##9e034e}{#1}"),pa("\\purpleA","\\textcolor{##ddd7ff}{#1}"),pa("\\purpleB","\\textcolor{##c6b9fc}{#1}"),pa("\\purpleC","\\textcolor{##aa87ff}{#1}"),pa("\\purpleD","\\textcolor{##7854ab}{#1}"),pa("\\purpleE","\\textcolor{##543b78}{#1}"),pa("\\mintA","\\textcolor{##f5f9e8}{#1}"),pa("\\mintB","\\textcolor{##edf2df}{#1}"),pa("\\mintC","\\textcolor{##e0e5cc}{#1}"),pa("\\grayA","\\textcolor{##f6f7f7}{#1}"),pa("\\grayB","\\textcolor{##f0f1f2}{#1}"),pa("\\grayC","\\textcolor{##e3e5e6}{#1}"),pa("\\grayD","\\textcolor{##d6d8da}{#1}"),pa("\\grayE","\\textcolor{##babec2}{#1}"),pa("\\grayF","\\textcolor{##888d93}{#1}"),pa("\\grayG","\\textcolor{##626569}{#1}"),pa("\\grayH","\\textcolor{##3b3e40}{#1}"),pa("\\grayI","\\textcolor{##21242c}{#1}"),pa("\\kaBlue","\\textcolor{##314453}{#1}"),pa("\\kaGreen","\\textcolor{##71B307}{#1}");var ba={"\\relax":!0,"^":!0,_:!0,"\\limits":!0,"\\nolimits":!0},ya=function(){function t(t,e,r){this.settings=void 0,this.expansionCount=void 0,this.lexer=void 0,this.macros=void 0,this.stack=void 0,this.mode=void 0,this.settings=e,this.expansionCount=0,this.feed(t),this.macros=new ma(ua,e.macros),this.mode=r,this.stack=[]}var e=t.prototype;return e.feed=function(t){this.lexer=new ha(t,this.settings)},e.switchMode=function(t){this.mode=t},e.beginGroup=function(){this.macros.beginGroup()},e.endGroup=function(){this.macros.endGroup()},e.future=function(){return 0===this.stack.length&&this.pushToken(this.lexer.lex()),this.stack[this.stack.length-1]},e.popToken=function(){return this.future(),this.stack.pop()},e.pushToken=function(t){this.stack.push(t)},e.pushTokens=function(t){var e;(e=this.stack).push.apply(e,t)},e.consumeSpaces=function(){for(;;){if(" "!==this.future().text)break;this.stack.pop()}},e.consumeArgs=function(t){for(var e=[],r=0;rthis.settings.maxExpand)throw new o("Too many expansions: infinite loop or need to increase maxExpand setting");var n=a.tokens;if(a.numArgs)for(var i=this.consumeArgs(a.numArgs),s=(n=n.slice()).length-1;s>=0;--s){var l=n[s];if("#"===l.text){if(0===s)throw new o("Incomplete placeholder at end of macro body",l);if("#"===(l=n[--s]).text)n.splice(s+1,1);else{if(!/^[1-9]$/.test(l.text))throw new o("Not a valid argument number",l);var h;(h=n).splice.apply(h,[s,2].concat(i[+l.text-1]))}}}return this.pushTokens(n),n},e.expandAfterFuture=function(){return this.expandOnce(),this.future()},e.expandNextToken=function(){for(;;){var t=this.expandOnce();if(t instanceof n){if("\\relax"!==t.text&&!t.treatAsRelax)return this.stack.pop();this.stack.pop()}}throw new Error},e.expandMacro=function(t){return this.macros.has(t)?this.expandTokens([new n(t)]):void 0},e.expandTokens=function(t){var e=[],r=this.stack.length;for(this.pushTokens(t);this.stack.length>r;){var a=this.expandOnce(!0);a instanceof n&&(a.treatAsRelax&&(a.noexpand=!1,a.treatAsRelax=!1),e.push(this.stack.pop()))}return e},e.expandMacroAsText=function(t){var e=this.expandMacro(t);return e?e.map(function(t){return t.text}).join(""):e},e._getExpansion=function(t){var e=this.macros.get(t);if(null==e)return e;var r="function"==typeof e?e(this):e;if("string"==typeof r){var a=0;if(-1!==r.indexOf("#"))for(var n=r.replace(/##/g,"");-1!==n.indexOf("#"+(a+1));)++a;for(var i=new ha(r,this.settings),o=[],s=i.lex();"EOF"!==s.text;)o.push(s),s=i.lex();return o.reverse(),{tokens:o,numArgs:a}}return r},e.isDefined=function(t){return this.macros.has(t)||ia.hasOwnProperty(t)||j.math.hasOwnProperty(t)||j.text.hasOwnProperty(t)||ba.hasOwnProperty(t)},e.isExpandable=function(t){var e=this.macros.get(t);return null!=e?"string"==typeof e||"function"==typeof e||!e.unexpandable:ia.hasOwnProperty(t)},t}(),wa={"\u0301":{text:"\\'",math:"\\acute"},"\u0300":{text:"\\`",math:"\\grave"},"\u0308":{text:'\\"',math:"\\ddot"},"\u0303":{text:"\\~",math:"\\tilde"},"\u0304":{text:"\\=",math:"\\bar"},"\u0306":{text:"\\u",math:"\\breve"},"\u030c":{text:"\\v",math:"\\check"},"\u0302":{text:"\\^",math:"\\hat"},"\u0307":{text:"\\.",math:"\\dot"},"\u030a":{text:"\\r",math:"\\mathring"},"\u030b":{text:"\\H"}},ka={"\xe1":"a\u0301","\xe0":"a\u0300","\xe4":"a\u0308","\u01df":"a\u0308\u0304","\xe3":"a\u0303","\u0101":"a\u0304","\u0103":"a\u0306","\u1eaf":"a\u0306\u0301","\u1eb1":"a\u0306\u0300","\u1eb5":"a\u0306\u0303","\u01ce":"a\u030c","\xe2":"a\u0302","\u1ea5":"a\u0302\u0301","\u1ea7":"a\u0302\u0300","\u1eab":"a\u0302\u0303","\u0227":"a\u0307","\u01e1":"a\u0307\u0304","\xe5":"a\u030a","\u01fb":"a\u030a\u0301","\u1e03":"b\u0307","\u0107":"c\u0301","\u010d":"c\u030c","\u0109":"c\u0302","\u010b":"c\u0307","\u010f":"d\u030c","\u1e0b":"d\u0307","\xe9":"e\u0301","\xe8":"e\u0300","\xeb":"e\u0308","\u1ebd":"e\u0303","\u0113":"e\u0304","\u1e17":"e\u0304\u0301","\u1e15":"e\u0304\u0300","\u0115":"e\u0306","\u011b":"e\u030c","\xea":"e\u0302","\u1ebf":"e\u0302\u0301","\u1ec1":"e\u0302\u0300","\u1ec5":"e\u0302\u0303","\u0117":"e\u0307","\u1e1f":"f\u0307","\u01f5":"g\u0301","\u1e21":"g\u0304","\u011f":"g\u0306","\u01e7":"g\u030c","\u011d":"g\u0302","\u0121":"g\u0307","\u1e27":"h\u0308","\u021f":"h\u030c","\u0125":"h\u0302","\u1e23":"h\u0307","\xed":"i\u0301","\xec":"i\u0300","\xef":"i\u0308","\u1e2f":"i\u0308\u0301","\u0129":"i\u0303","\u012b":"i\u0304","\u012d":"i\u0306","\u01d0":"i\u030c","\xee":"i\u0302","\u01f0":"j\u030c","\u0135":"j\u0302","\u1e31":"k\u0301","\u01e9":"k\u030c","\u013a":"l\u0301","\u013e":"l\u030c","\u1e3f":"m\u0301","\u1e41":"m\u0307","\u0144":"n\u0301","\u01f9":"n\u0300","\xf1":"n\u0303","\u0148":"n\u030c","\u1e45":"n\u0307","\xf3":"o\u0301","\xf2":"o\u0300","\xf6":"o\u0308","\u022b":"o\u0308\u0304","\xf5":"o\u0303","\u1e4d":"o\u0303\u0301","\u1e4f":"o\u0303\u0308","\u022d":"o\u0303\u0304","\u014d":"o\u0304","\u1e53":"o\u0304\u0301","\u1e51":"o\u0304\u0300","\u014f":"o\u0306","\u01d2":"o\u030c","\xf4":"o\u0302","\u1ed1":"o\u0302\u0301","\u1ed3":"o\u0302\u0300","\u1ed7":"o\u0302\u0303","\u022f":"o\u0307","\u0231":"o\u0307\u0304","\u0151":"o\u030b","\u1e55":"p\u0301","\u1e57":"p\u0307","\u0155":"r\u0301","\u0159":"r\u030c","\u1e59":"r\u0307","\u015b":"s\u0301","\u1e65":"s\u0301\u0307","\u0161":"s\u030c","\u1e67":"s\u030c\u0307","\u015d":"s\u0302","\u1e61":"s\u0307","\u1e97":"t\u0308","\u0165":"t\u030c","\u1e6b":"t\u0307","\xfa":"u\u0301","\xf9":"u\u0300","\xfc":"u\u0308","\u01d8":"u\u0308\u0301","\u01dc":"u\u0308\u0300","\u01d6":"u\u0308\u0304","\u01da":"u\u0308\u030c","\u0169":"u\u0303","\u1e79":"u\u0303\u0301","\u016b":"u\u0304","\u1e7b":"u\u0304\u0308","\u016d":"u\u0306","\u01d4":"u\u030c","\xfb":"u\u0302","\u016f":"u\u030a","\u0171":"u\u030b","\u1e7d":"v\u0303","\u1e83":"w\u0301","\u1e81":"w\u0300","\u1e85":"w\u0308","\u0175":"w\u0302","\u1e87":"w\u0307","\u1e98":"w\u030a","\u1e8d":"x\u0308","\u1e8b":"x\u0307","\xfd":"y\u0301","\u1ef3":"y\u0300","\xff":"y\u0308","\u1ef9":"y\u0303","\u0233":"y\u0304","\u0177":"y\u0302","\u1e8f":"y\u0307","\u1e99":"y\u030a","\u017a":"z\u0301","\u017e":"z\u030c","\u1e91":"z\u0302","\u017c":"z\u0307","\xc1":"A\u0301","\xc0":"A\u0300","\xc4":"A\u0308","\u01de":"A\u0308\u0304","\xc3":"A\u0303","\u0100":"A\u0304","\u0102":"A\u0306","\u1eae":"A\u0306\u0301","\u1eb0":"A\u0306\u0300","\u1eb4":"A\u0306\u0303","\u01cd":"A\u030c","\xc2":"A\u0302","\u1ea4":"A\u0302\u0301","\u1ea6":"A\u0302\u0300","\u1eaa":"A\u0302\u0303","\u0226":"A\u0307","\u01e0":"A\u0307\u0304","\xc5":"A\u030a","\u01fa":"A\u030a\u0301","\u1e02":"B\u0307","\u0106":"C\u0301","\u010c":"C\u030c","\u0108":"C\u0302","\u010a":"C\u0307","\u010e":"D\u030c","\u1e0a":"D\u0307","\xc9":"E\u0301","\xc8":"E\u0300","\xcb":"E\u0308","\u1ebc":"E\u0303","\u0112":"E\u0304","\u1e16":"E\u0304\u0301","\u1e14":"E\u0304\u0300","\u0114":"E\u0306","\u011a":"E\u030c","\xca":"E\u0302","\u1ebe":"E\u0302\u0301","\u1ec0":"E\u0302\u0300","\u1ec4":"E\u0302\u0303","\u0116":"E\u0307","\u1e1e":"F\u0307","\u01f4":"G\u0301","\u1e20":"G\u0304","\u011e":"G\u0306","\u01e6":"G\u030c","\u011c":"G\u0302","\u0120":"G\u0307","\u1e26":"H\u0308","\u021e":"H\u030c","\u0124":"H\u0302","\u1e22":"H\u0307","\xcd":"I\u0301","\xcc":"I\u0300","\xcf":"I\u0308","\u1e2e":"I\u0308\u0301","\u0128":"I\u0303","\u012a":"I\u0304","\u012c":"I\u0306","\u01cf":"I\u030c","\xce":"I\u0302","\u0130":"I\u0307","\u0134":"J\u0302","\u1e30":"K\u0301","\u01e8":"K\u030c","\u0139":"L\u0301","\u013d":"L\u030c","\u1e3e":"M\u0301","\u1e40":"M\u0307","\u0143":"N\u0301","\u01f8":"N\u0300","\xd1":"N\u0303","\u0147":"N\u030c","\u1e44":"N\u0307","\xd3":"O\u0301","\xd2":"O\u0300","\xd6":"O\u0308","\u022a":"O\u0308\u0304","\xd5":"O\u0303","\u1e4c":"O\u0303\u0301","\u1e4e":"O\u0303\u0308","\u022c":"O\u0303\u0304","\u014c":"O\u0304","\u1e52":"O\u0304\u0301","\u1e50":"O\u0304\u0300","\u014e":"O\u0306","\u01d1":"O\u030c","\xd4":"O\u0302","\u1ed0":"O\u0302\u0301","\u1ed2":"O\u0302\u0300","\u1ed6":"O\u0302\u0303","\u022e":"O\u0307","\u0230":"O\u0307\u0304","\u0150":"O\u030b","\u1e54":"P\u0301","\u1e56":"P\u0307","\u0154":"R\u0301","\u0158":"R\u030c","\u1e58":"R\u0307","\u015a":"S\u0301","\u1e64":"S\u0301\u0307","\u0160":"S\u030c","\u1e66":"S\u030c\u0307","\u015c":"S\u0302","\u1e60":"S\u0307","\u0164":"T\u030c","\u1e6a":"T\u0307","\xda":"U\u0301","\xd9":"U\u0300","\xdc":"U\u0308","\u01d7":"U\u0308\u0301","\u01db":"U\u0308\u0300","\u01d5":"U\u0308\u0304","\u01d9":"U\u0308\u030c","\u0168":"U\u0303","\u1e78":"U\u0303\u0301","\u016a":"U\u0304","\u1e7a":"U\u0304\u0308","\u016c":"U\u0306","\u01d3":"U\u030c","\xdb":"U\u0302","\u016e":"U\u030a","\u0170":"U\u030b","\u1e7c":"V\u0303","\u1e82":"W\u0301","\u1e80":"W\u0300","\u1e84":"W\u0308","\u0174":"W\u0302","\u1e86":"W\u0307","\u1e8c":"X\u0308","\u1e8a":"X\u0307","\xdd":"Y\u0301","\u1ef2":"Y\u0300","\u0178":"Y\u0308","\u1ef8":"Y\u0303","\u0232":"Y\u0304","\u0176":"Y\u0302","\u1e8e":"Y\u0307","\u0179":"Z\u0301","\u017d":"Z\u030c","\u1e90":"Z\u0302","\u017b":"Z\u0307","\u03ac":"\u03b1\u0301","\u1f70":"\u03b1\u0300","\u1fb1":"\u03b1\u0304","\u1fb0":"\u03b1\u0306","\u03ad":"\u03b5\u0301","\u1f72":"\u03b5\u0300","\u03ae":"\u03b7\u0301","\u1f74":"\u03b7\u0300","\u03af":"\u03b9\u0301","\u1f76":"\u03b9\u0300","\u03ca":"\u03b9\u0308","\u0390":"\u03b9\u0308\u0301","\u1fd2":"\u03b9\u0308\u0300","\u1fd1":"\u03b9\u0304","\u1fd0":"\u03b9\u0306","\u03cc":"\u03bf\u0301","\u1f78":"\u03bf\u0300","\u03cd":"\u03c5\u0301","\u1f7a":"\u03c5\u0300","\u03cb":"\u03c5\u0308","\u03b0":"\u03c5\u0308\u0301","\u1fe2":"\u03c5\u0308\u0300","\u1fe1":"\u03c5\u0304","\u1fe0":"\u03c5\u0306","\u03ce":"\u03c9\u0301","\u1f7c":"\u03c9\u0300","\u038e":"\u03a5\u0301","\u1fea":"\u03a5\u0300","\u03ab":"\u03a5\u0308","\u1fe9":"\u03a5\u0304","\u1fe8":"\u03a5\u0306","\u038f":"\u03a9\u0301","\u1ffa":"\u03a9\u0300"},Sa=function(){function t(t,e){this.mode=void 0,this.gullet=void 0,this.settings=void 0,this.leftrightDepth=void 0,this.nextToken=void 0,this.mode="math",this.gullet=new ya(t,e,this.mode),this.settings=e,this.leftrightDepth=0}var e=t.prototype;return e.expect=function(t,e){if(void 0===e&&(e=!0),this.fetch().text!==t)throw new o("Expected '"+t+"', got '"+this.fetch().text+"'",this.fetch());e&&this.consume()},e.consume=function(){this.nextToken=null},e.fetch=function(){return null==this.nextToken&&(this.nextToken=this.gullet.expandNextToken()),this.nextToken},e.switchMode=function(t){this.mode=t,this.gullet.switchMode(t)},e.parse=function(){this.settings.globalGroup||this.gullet.beginGroup(),this.settings.colorIsTextColor&&this.gullet.macros.set("\\color","\\textcolor");var t=this.parseExpression(!1);return this.expect("EOF"),this.settings.globalGroup||this.gullet.endGroup(),t},e.parseExpression=function(e,r){for(var a=[];;){"math"===this.mode&&this.consumeSpaces();var n=this.fetch();if(-1!==t.endOfExpression.indexOf(n.text))break;if(r&&n.text===r)break;if(e&&ia[n.text]&&ia[n.text].infix)break;var i=this.parseAtom(r);if(!i)break;"internal"!==i.type&&a.push(i)}return"text"===this.mode&&this.formLigatures(a),this.handleInfixNodes(a)},e.handleInfixNodes=function(t){for(var e,r=-1,a=0;a0&&!h||0===s&&!h&&"math"===this.mode,c=this.parseGroupOfType("argument to '"+t+"'",l,h,a,m);if(!c){if(h){i.push(null);continue}throw new o("Expected group after '"+t+"'",this.fetch())}(h?i:n).push(c)}return{args:n,optArgs:i}},e.parseGroupOfType=function(t,e,r,a,n){switch(e){case"color":return n&&this.consumeSpaces(),this.parseColorGroup(r);case"size":return n&&this.consumeSpaces(),this.parseSizeGroup(r);case"url":return this.parseUrlGroup(r,n);case"math":case"text":return this.parseGroup(t,r,a,void 0,e,n);case"hbox":var i=this.parseGroup(t,r,a,void 0,"text",n);return i?{type:"styling",mode:i.mode,body:[i],style:"text"}:i;case"raw":if(n&&this.consumeSpaces(),r&&"{"===this.fetch().text)return null;var s=this.parseStringGroup("raw",r,!0);if(s)return{type:"raw",mode:"text",string:s.text};throw new o("Expected raw group",this.fetch());case"original":case null:case void 0:return this.parseGroup(t,r,a,void 0,void 0,n);default:throw new o("Unknown group type as "+t,this.fetch())}},e.consumeSpaces=function(){for(;" "===this.fetch().text;)this.consume()},e.parseStringGroup=function(t,e,r){var a=e?"[":"{",n=e?"]":"}",i=this.fetch();if(i.text!==a){if(e)return null;if(r&&"EOF"!==i.text&&/[^{}[\]]/.test(i.text))return this.consume(),i}var s=this.mode;this.mode="text",this.expect(a);for(var l,h="",m=this.fetch(),c=0,u=m;(l=this.fetch()).text!==n||r&&c>0;){switch(l.text){case"EOF":throw new o("Unexpected end of input in "+t,m.range(u,h));case a:c++;break;case n:c--}h+=(u=l).text,this.consume()}return this.expect(n),this.mode=s,m.range(u,h)},e.parseRegexGroup=function(t,e){var r=this.mode;this.mode="text";for(var a,n=this.fetch(),i=n,s="";"EOF"!==(a=this.fetch()).text&&t.test(s+a.text);)s+=(i=a).text,this.consume();if(""===s)throw new o("Invalid "+e+": '"+n.text+"'",n);return this.mode=r,n.range(i,s)},e.parseColorGroup=function(t){var e=this.parseStringGroup("color",t);if(!e)return null;var r=/^(#[a-f0-9]{3}|#?[a-f0-9]{6}|[a-z]+)$/i.exec(e.text);if(!r)throw new o("Invalid color: '"+e.text+"'",e);var a=r[0];return/^[0-9a-f]{6}$/i.test(a)&&(a="#"+a),{type:"color-token",mode:this.mode,color:a}},e.parseSizeGroup=function(t){var e,r=!1;if(!(e=t||"{"===this.fetch().text?this.parseStringGroup("size",t):this.parseRegexGroup(/^[-+]? *(?:$|\d+|\d+\.\d*|\.\d*) *[a-z]{0,2} *$/,"size")))return null;t||0!==e.text.length||(e.text="0pt",r=!0);var a=/([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(e.text);if(!a)throw new o("Invalid size: '"+e.text+"'",e);var n={number:+(a[1]+a[2]),unit:a[3]};if(!At(n))throw new o("Invalid unit: '"+n.unit+"'",e);return{type:"size",mode:this.mode,value:n,isBlank:r}},e.parseUrlGroup=function(t,e){this.gullet.lexer.setCatcode("%",13);var r=this.parseStringGroup("url",t,!0);if(this.gullet.lexer.setCatcode("%",14),!r)return null;var a=r.text.replace(/\\([#$%&~_^{}])/g,"$1");return{type:"url",mode:this.mode,url:a}},e.parseGroup=function(e,r,n,i,s,l){var h=this.mode;s&&this.switchMode(s),l&&this.consumeSpaces();var m,c=this.fetch(),u=c.text;if(r?"["===u:"{"===u||"\\begingroup"===u){this.consume();var p=t.endOfGroup[u];this.gullet.beginGroup();var d=this.parseExpression(!1,p),f=this.fetch();this.expect(p),this.gullet.endGroup(),m={type:"ordgroup",mode:this.mode,loc:a.range(c,f),body:d,semisimple:"\\begingroup"===u||void 0}}else if(r)m=null;else if(null==(m=this.parseFunction(i,e,n)||this.parseSymbol())&&"\\"===u[0]&&!ba.hasOwnProperty(u)){if(this.settings.throwOnError)throw new o("Undefined control sequence: "+u,c);m=this.formatUnsupportedCmd(u),this.consume()}return s&&this.switchMode(h),m},e.formLigatures=function(t){for(var e=t.length-1,r=0;r=0&&this.settings.reportNonstrict("unicodeTextInMathMode",'Latin-1/Unicode text character "'+e[0]+'" used in math mode',t);var l,h=j[this.mode][e].group,m=a.range(t);if(W.hasOwnProperty(h)){var c=h;l={type:"atom",mode:this.mode,family:c,loc:m,text:e}}else l={type:h,mode:this.mode,loc:m,text:e};i=l}else{if(!(e.charCodeAt(0)>=128))return null;this.settings.strict&&(M(e.charCodeAt(0))?"math"===this.mode&&this.settings.reportNonstrict("unicodeTextInMathMode",'Unicode text character "'+e[0]+'" used in math mode',t):this.settings.reportNonstrict("unknownSymbol",'Unrecognized Unicode character "'+e[0]+'" ('+e.charCodeAt(0)+")",t)),i={type:"textord",mode:"text",loc:a.range(t),text:e}}if(this.consume(),s)for(var u=0;u=this.length)return z.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},z.QueryLexer.prototype.width=function(){return this.pos-this.start},z.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},z.QueryLexer.prototype.backup=function(){--this.pos},z.QueryLexer.prototype.acceptDigitRun=function(){for(var e,t;47<(t=(e=this.next()).charCodeAt(0))&&t<58;);e!=z.QueryLexer.EOS&&this.backup()},z.QueryLexer.prototype.more=function(){return this.pos' - + title + ''); - html.push(result); - } - if (html.length) { - html.join(""); - return '
    '+html+'
' - } - else { - return ""; - } -} - - -function escapeHtml(unsafe) { - return unsafe - .replace(/&/g, "&") - .replace(//g, ">") - .replace(/"/g, """) - .replace(/'/g, "'"); -} - - -function showResultCount(total) { - var element = document.getElementById(LUNR_CONFIG["countElementId"]) - if (element !== null) { - element.innerHTML = total + "."; - } -} - - -function searchLunr(query) { - var idx = lunr.Index.load(LUNR_DATA); - // Write results to page - var results = idx.search(query); - var resultHtml = parseLunrResults(results); - var elementId = LUNR_CONFIG["resultsElementId"]; - document.getElementById(elementId).innerHTML = resultHtml; - // Write the number of results - showResultCount(results.length); -} - - -// When the window loads, read query parameters and perform search -window.onload = function() { - var query = getParameterByName("q"); - if (query != "" && query != null) { - document.forms.lunrSearchForm.q.value = query; - searchLunr(query); - } else { - // empty query: show 0 results (no query) - showResultCount("0 (empty query)"); - } - document.getElementById("focus").focus(); -}; diff --git a/website/_libs/lunr/lunrclient.min.js b/website/_libs/lunr/lunrclient.min.js deleted file mode 100644 index 0b71842..0000000 --- a/website/_libs/lunr/lunrclient.min.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";var LUNR_CONFIG={"resultsElementId":"searchResults","countElementId":"resultCount"};function getParameterByName(name){var url=window.location.href;name=name.replace(/[\[\]]/g,"\\$&");var regex=new RegExp("[?&]"+name+"(=([^&#]*)|&|#|$)"),results=regex.exec(url);if(!results){return null}if(!results[2]){return ""}return decodeURIComponent(results[2].replace(/\+/g," "))}function parseLunrResults(results){var html=[];for(var i=0;i'+title+'');html.push(result)}if(html.length){html.join("");return '
    '+html+'
'}else{return ""}}function escapeHtml(unsafe){return unsafe.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function showResultCount(total){var element=document.getElementById(LUNR_CONFIG["countElementId"]);if(element!==null){element.innerHTML=total+"."}}function searchLunr(query){var idx=lunr.Index.load(LUNR_DATA);var results=idx.search(query);var resultHtml=parseLunrResults(results);var elementId=LUNR_CONFIG["resultsElementId"];document.getElementById(elementId).innerHTML=resultHtml;showResultCount(results.length)}window.onload=function(){var query=getParameterByName("q");if(query!=""&&query!=null){document.forms.lunrSearchForm.q.value=query;searchLunr(query)}else{showResultCount("0 (empty query)")}document.getElementById("focus").focus()}; diff --git a/website/_rss/head.xml b/website/_rss/head.xml deleted file mode 100644 index 4c9f62b..0000000 --- a/website/_rss/head.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - <![CDATA[ {{fd2rss website_title}} ]]> - - {{website_url}} - - - - - diff --git a/website/_rss/item.xml b/website/_rss/item.xml deleted file mode 100644 index 07f6506..0000000 --- a/website/_rss/item.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - - <![CDATA[ {{fd2rss rss_title}} ]]> - - {{fd_full_url}} - {{fd_full_url}} - - - - - - {{if rss_full_content}} - - - - {{end}} - - - {{RFC822 rss_pubdate}} - - - {{isnotempty rss_author}} - {{rss_author}} - {{end}} - {{isnotempty author}} - - {{author}} - - {{end}} - - {{isnotempty rss_category}} - {{rss_category}} - {{end}} - - {{isnotempty rss_comments}} - {{rss_comments}} - {{end}} - - {{isnotempty rss_enclosure}} - {{rss_enclosure}} - {{end}} - diff --git a/website/config.md b/website/config.md deleted file mode 100644 index a5c8c30..0000000 --- a/website/config.md +++ /dev/null @@ -1,31 +0,0 @@ - -@def website_title = "Julia On HPC Clusters" -@def website_descr = "Learn how to use and/or set up Julia on HPC clusters" -@def website_url = "https://juliahpc.github.io/" - -@def author = "Carsten Bauer" - -@def mintoclevel = 2 -@def maxtoclevel = 3 - - -@def ignore = ["node_modules/", "franklin", "franklin.pub"] - - -\newcommand{\R}{\mathbb R} -\newcommand{\scal}[1]{\langle #1 \rangle} - -\newcommand{\note}[1]{@@note @@title :bulb: Note@@ @@messg #1 @@ @@} -\newcommand{\warn}[1]{@@warning @@title ⚠️ Warning!@@ @@messg #1 @@ @@} diff --git a/website/index.md b/website/index.md deleted file mode 100644 index a075e0a..0000000 --- a/website/index.md +++ /dev/null @@ -1,18 +0,0 @@ -+++ -title = "Julia On HPC Clusters" -+++ - -# Julia on HPC clusters - -👋 Welcome to the notes about the [Julia programming language](http://www.julialang.org/) on HPC clusters. - -## Objective -The goal of these notes is to offer good practices and tips and tricks about how to use and set up Julia on HPC clusters. The target audiences are therefore Julia users on clusters as well as HPC system administrators (see the respective sections in the navigation bar on the left). - -## Acknowledgements - -These notes don't come out of nowhere but stem from endless conversations with many people on the Julia discourse, over Slack and Discord, as well as in-person discussions at Julia HPC minisymposia, BoFs, and workshops. - -They also build upon previous efforts to document best practices, most notably [https://github.com/hlrs-tasc/julia-on-hpc-systems/](https://github.com/hlrs-tasc/julia-on-hpc-systems/), from which we took (among other things) the [HPC systems with Julia support](/user_hpcsystems/) information. - -The creator and main author is [Carsten Bauer](https://github.com/carstenbauer) but many members of the Julia HPC community have made valuable contributions. \ No newline at end of file diff --git a/website/package-lock.json b/website/package-lock.json deleted file mode 100644 index dc01fbc..0000000 --- a/website/package-lock.json +++ /dev/null @@ -1,139 +0,0 @@ -{ - "requires": true, - "lockfileVersion": 1, - "dependencies": { - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" - }, - "cheerio": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", - "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", - "requires": { - "cheerio-select": "^2.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "htmlparser2": "^8.0.1", - "parse5": "^7.0.0", - "parse5-htmlparser2-tree-adapter": "^7.0.0" - } - }, - "cheerio-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", - "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", - "requires": { - "boolbase": "^1.0.0", - "css-select": "^5.1.0", - "css-what": "^6.1.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1" - } - }, - "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==", - "requires": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.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==" - }, - "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==", - "requires": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - } - }, - "domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" - }, - "domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "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==", - "requires": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - } - }, - "entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" - }, - "highlight.js": { - "version": "11.8.0", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.8.0.tgz", - "integrity": "sha512-MedQhoqVdr0U6SSnWPzfiadUcDHfN/Wzq25AkXiQv9oiOO/sG0S7XkvpFIqWBl9Yq1UYyYOOVORs5UW2XlPyzg==" - }, - "htmlparser2": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", - "requires": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "entities": "^4.4.0" - } - }, - "lunr": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==" - }, - "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==", - "requires": { - "boolbase": "^1.0.0" - } - }, - "parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "requires": { - "entities": "^4.4.0" - } - }, - "parse5-htmlparser2-tree-adapter": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", - "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", - "requires": { - "domhandler": "^5.0.2", - "parse5": "^7.0.0" - } - } - } -} diff --git a/website/search.md b/website/search.md deleted file mode 100644 index 0f0a063..0000000 --- a/website/search.md +++ /dev/null @@ -1,9 +0,0 @@ -@def title = "Search ⋅ YourWebsite" - -## Search - -Number of results found: ~~~~~~ - -~~~ -
-~~~ \ No newline at end of file diff --git a/website/sysadmin_julia.md b/website/sysadmin_julia.md deleted file mode 100644 index fc0abf5..0000000 --- a/website/sysadmin_julia.md +++ /dev/null @@ -1,159 +0,0 @@ -+++ -title = "Admin: How to provide Julia to users?" -hascode = true -literate_mds = true -showall = false -noeval = true -+++ - -# Admin: How to provide Julia to users? - ---- - -\label{content} -**Content** - -\toc - ---- - -## Providing Julia itself - -It is generally best to just provide the regular, pre-built Julia binaries from [https://julialang.org/downloads/](https://julialang.org/downloads/). They work and are efficient. - -You might be tempted to build Julia from source but this is almost never necessary or advantageous (and can be cumbersome). The reason is pretty simple: Julia is a compiler in itself and user code is therefore barely influenced by how you compiled Julia. Hence, unless you know exactly what you're doing and have a good reason in mind, the pre-built binaries are the way to go. - -[⤴ _**back to Content**_](#content) - -## Don't provide packages - -We strongly recommend against trying to provide Julia packages (e.g. MPI.jl or CUDA.jl) in a central fashion. There are a few important technical reasons but the two most important reasons to **not** do it are conceptual - -1) It conflicts with the idea of local, self-contained Julia environments. -2) Packages evolve too quickly (i.e. your central depot is out of date pretty quickly). - -**Short explanation:** To have people use your centrally provided version of a package you would have to instruct them to not add that package to their (local) Julia environment as otherwise they'll very(!) likely get a different version of the package and will end up not using your central version to begin with. To make `using PackageX` still work, you would then have to adjust `JULIA_LOAD_PATH` appropriately. However, not only doesn't the user not get the version of `PackageX` that they potentially want/need, the local `Project.toml`/`Manifest.toml` would not even contain `PackageX` and therefore severely undermine self-containedness and reproducibility - one of the nicest properties of Julia projects. - -Generally speaking, there is also little reason to provide regular Julia packages in a central fashion in the first place. After all, most of them don't take up that much disk space and a little bit of redundancy is acceptable on modern HPC clusters. In this regard, note that all packages only get installed **once per user** - and not per project as is the case for python - since Julia installs packages to a user-central depot and reuses them across projects. - -[⤴ _**back to Content**_](#content) - -## Providing global package preferences - -What you might want to do is to globally override binary dependencies of Julia packages, so-called [Julia artifacts](https://pkgdocs.julialang.org/v1/artifacts/) ([JLLs](https://github.com/JuliaBinaryWrappers)), such that users automatically get redirected to system binaries under the hood. This is especially relevant if vendor specific binaries (e.g. a Cray MPI library) are the only ones that function properly on the HPC cluster. Below we describe how to realize this by overriding package [preferences](https://github.com/JuliaPackaging/Preferences.jl). However, note that JLLs have the big advantage that they are convenient and work nicely together. You should hence only override preferences if there is a good reason for it. - - -### Example: MPI.jl and CUDA.jl - -In this example we show how to make MPI.jl automatically use a system OpenMPI installation as well as make CUDA.jl use a system CUDA installation. The two steps are pretty straightforward: - -1) Create a global `Project.toml` that sets the preferences of the target packages. -2) Append the path to the global `Project.toml` to `JULIA_LOAD_PATH` (for all users). - -According to the documentation of MPI.jl ([relevant section](https://juliaparallel.org/MPI.jl/stable/configuration/#Notes-to-HPC-cluster-administrators)) and CUDA.jl ([relevant section](https://cuda.juliagpu.org/stable/installation/overview/#Using-a-local-CUDA)) the preferences that we need to modify are actually not in MPI.jl or CUDA.jl but rather in MPIPreferences.jl and CUDA\_Runtime\_jll.jl. We thus create a `Project.toml` like below: - -\note{Tip: To obtain the correct preferences blocks you can use `MPIPreferences.use_system_binary()` and `CUDA.set_runtime_version!(v"11.7"; local_toolkit=true)` respectively. This will create the relevant blocks in a `LocalPreferences.toml` file. The only thing you need to adjust is the block header, e.g. `MPIPreferences` -> `preferences.MPIPreferences`.} - -``` -[extras] -MPIPreferences = "3da0fdf6-3ccc-4f1b-acd9-58baa6c99267" -CUDA_Runtime_jll = "76a88914-d11a-5bdc-97e0-2f5a05c973a2" - -[preferences.MPIPreferences] -_format = "1.0" -abi = "OpenMPI" -binary = "system" -libmpi = "libmpi" -mpiexec = "mpiexec" - -[preferences.CUDA_Runtime_jll] -local = "true" -version = "11.7" -``` - -The only thing we then have to do is to append the path to this file to the `JULIA_LOAD_PATH`. The way to do it is as follows: `export JULIA_LOAD_PATH=:/path/to/projectoml/`. Note the critical colon (`:`) here which implies *appending* rather than overwriting. - -### Providing everything in form of a Lmod module - -Since every user should get the modified `JULIA_LOAD_PATH` above, the environment variable should best be set directly in the Lmod module that also provides the Julia binaries as well as the MPI and CUDA installations we're pointing to. This way, any user who loads the module and then adds MPI.jl and CUDA.jl to one of their environments (i.e. `] add MPI CUDA`) will automatically use the system MPI and system CUDA under the hood without having to do anything else. That is to say that the global preference system is *opt-out* (the user can always override the global preferences with local preferences, e.g. via a `LocalPreferences.toml`, on a per-project basis). - -**Side note:** Speaking of setting environment variables in the module file, it is recommended to set `JULIA_CUDA_MEMORY_POOL=none` to disable the [memory pool](https://cuda.juliagpu.org/stable/usage/memory/#Memory-pool) that CUDA.jl uses by default. This is particularly advisable when you use a system CUDA due to incompatibility with certain CUDA APIs. - -\note{You might want to check out [JuliaHPC_Installer](https://git.uni-paderborn.de/pc2-public/juliahpc_installer) which is a Julia script that automates the installation of a new Julia version via easybuild, including the global `Project.toml` setup discussed above. It is used on [Noctua 2](https://pc2.uni-paderborn.de/hpc-services/available-systems/noctua2) at [PC2](https://pc2.uni-paderborn.de/). However, it is currently not portable out of the box (since e.g. paths are hardcoded).} - - -### Checking that things work es expected -To check that things are working you can `] add MPI CUDA` and then run `CUDA.runtime_version()` and `CUDA.versioninfo()` which should give the version of the system CUDA and say "local installation", respectively: -``` -julia> using CUDA - -julia> CUDA.runtime_version() -v"11.7.0" - -julia> CUDA.versioninfo() -CUDA runtime 11.7, local installation -CUDA driver 12.1 -NVIDIA driver 530.30.2 - -[...] -``` - -Similarly, you can use `MPI.identify_implementation()` and `MPI.MPIPreferences.binary` which should show the version of the system MPI as well as "system", respectively: - -``` -julia> using MPI - -julia> MPI.identify_implementation() -("OpenMPI", v"4.1.4") - -julia> MPI.MPIPreferences.binary -"system" -``` - -[⤴ _**back to Content**_](#content) - -## Supporting Visual Studio Code - -One of the key features of Julia is that it is inherently dynamic. Users might thus likely want to use Julia interactively and remotely on your HPC cluster. One way to do so is through [VS Code](https://code.visualstudio.com/), specifically via the [Julia VS Code extension](https://www.julia-vscode.org/). The extension really only needs one thing to work: the `julia` binary. However, if you provide Julia as a module, this binary is only available if this module is already loaded (which it isn't if the user just connects to the cluster via [Remote - SSH](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh)). - -A good solution to this problem is to provide a script (e.g. called `julia_vscode`), which serves as an in-place replacement for `julia` but takes care of the module loading first (see below). - -```shell -#!/bin/bash -# Example script `julia_vscode` used on Noctua 2 at PC2 -# The Julia module used below is called "lang/JuliaHPC" -# Author: Carsten Bauer - -# ------ Set up the module system (HPC system specific) ------ -export MODULEPATH=/etc/modulefiles:/usr/share/modulefiles || : -source /usr/share/lmod/lmod/init/profile -if [ -f "/opt/software/pc2/lmod/modules/DefaultModules.lua" ];then - export MODULEPATH="$MODULEPATH:/opt/software/pc2/lmod/modules" - export LMOD_SYSTEM_DEFAULT_MODULES="DefaultModules" -else - if [ -f "/usr/share/modulefiles/StdEnv.lua" ];then - export LMOD_SYSTEM_DEFAULT_MODULES="StdEnv" - fi -fi -module --initial_load restore -# ------------------------------------------------------------ - -# Load a specific Julia module -module load lang/JuliaHPC/1.9.1-foss-2022a-CUDA-11.7.0 - -# Start Julia and pass on all command-line arguments -exec julia "${@}" -``` - -At PC2 such a script is provided for every Julia version / Julia module (see [JuliaHPC_Installer](https://git.uni-paderborn.de/pc2-public/juliahpc_installer)) as well as a generic one that only contains `module load lang/JuliaHPC` (without a version number) and thus always loads the latest Julia module. - -[⤴ _**back to Content**_](#content) - -## Potentially useful resources - -* [JuliaHPC_Installer](https://git.uni-paderborn.de/pc2-public/juliahpc_installer) by [Carsten Bauer](https://carstenbauer.eu): a Julia script that automates the installation of a new Julia version via easybuild, including the global `Project.toml` setup discussed above. It is used on [Noctua 2](https://pc2.uni-paderborn.de/hpc-services/available-systems/noctua2) at [PC2](https://pc2.uni-paderborn.de/). However, it is currently not portable out of the box (since e.g. paths are hardcoded). -* [Johannes Blaschke](https://github.com/jblaschke) provides [scripts and templates](https://gitlab.blaschke.science/nersc/julia/-/tree/main/modulefiles) to set up modules file for Julia on some of NERSC's systems (warning: potentially outdated?) -* [Samuel Omlin](https://github.com/omlins) and colleagues from CSCS provide their [Easybuild configuration files](https://github.com/eth-cscs/production/tree/master/easybuild/easyconfigs/j/Julia) used for Piz Daint (warning: potentially outdated?) -* [csc-env-julia](https://github.com/CSCfi/csc-env-julia) provides Ansible playbooks for installing Julia enviroment on CSC's HPC clusters. - -[⤴ _**back to Content**_](#content) diff --git a/website/user_faq.md b/website/user_faq.md deleted file mode 100644 index 645fe91..0000000 --- a/website/user_faq.md +++ /dev/null @@ -1,145 +0,0 @@ -+++ -title = "FAQ" -hascode = true -literate_mds = true -showall = false -noeval = true -+++ - -# FAQ - -\label{content} -**Content** - -\toc - ---- - -## Julia isn't available on my cluster. Can I install and use it (without root privileges)? - -Yes, absolutely. You **do not** need root privileges to install Julia and its packages. However, often times it's better to put the Julia depot - the place where packages, artifacts, and other things will be stored - on the parallel file system rather than into `$HOME`. See the [Getting Started](/user_gettingstarted/) section for more information. - -## Should I compile Julia from source? - -**No, you should not.** Use the pre-built binaries from the website or, preferably, a corresponding Lmod module provided by the cluster admins. Compiling Julia from source will generally **not** improve the performance of your code (Julia is a compiler in itself) but may very well be cumbersome. Unless you know what you're doing and have a very good reason (e.g. creating a debug build with flags like `USE_INTEL_JITEVENTS=1`) you should not compile Julia yourself. - -[⤴ _**back to Content**_](#content) - -## Julia installed from juliaup not found in a non-interactive job - -The installation path of the `julia` executable will be added to your `~/.bashrc` by [juliaup](https://github.com/JuliaLang/juliaup). If the job scheduler does not load `.bashrc` in non-interactive jobs, you must use the full path to `julia` in your job script. You can find out the full path by starting the Julia REPL and typing `Sys.BINDIR`. By default, it should be `~/.juliaup/bin/julia`. - -[⤴ _**back to Content**_](#content) - -## Where should I put the Julia depot? - -Ideally, you should set `JULIA_DEPOT_PATH` to point to a place with the following properties: - -* good (parallel) I/O -* no tight quotas -* read and write access -* no automatic deletion of unused files (or otherwise you have to find a workaround) - -As a rule of thumb: Put the Julia depot on the parallel file system (typically `$SCRATCH`). - -[⤴ _**back to Content**_](#content) - -## How should I start Julia within a job script? - -Assuming that SLURM is used on your HPC cluster, you should generally start Julia under `srun`, e.g. `srun julia --project mycode.jl`. This is especially important if your code is MPI-parallel, in which case `srun` is a replacement for `mpirun`/`mpiexec`, but also recommended for serial code (there are at least [a few reasons](https://stackoverflow.com/a/53640511/2365675)). - -Note that you can use the slim `mpiexecjl` wrapper from `MPI.jl` to use the "correct" MPI driver automatically. - -[⤴ _**back to Content**_](#content) - -## How can I force Julia to compile code for a heterogeneous cluster? - -Set [`JULIA_CPU_TARGET`](https://docs.julialang.org/en/v1.10-dev/manual/environment-variables/#JULIA_CPU_TARGET) to a value that is generic enough to cover all the types of CPUs that you're targeting. You can get the CPU target name for the current system with `Sys.CPU_NAME`. - -**Example:** `JULIA_CPU_TARGET="generic;skylake-avx512,clone_all;znver2,clone_all"`. - -This compiles all functions (`clone_all`) for Intel Skylake (`skylake-avx512`), AMD Zen 2 (`znver2`), and a generic fallback (`generic`). - -For more information, see [this section of the Julia documentation](https://docs.julialang.org/en/v1/manual/environment-variables/#JULIA_CPU_TARGET) and [this section of the developer documentation](https://docs.julialang.org/en/v1/devdocs/sysimg/#Specifying-multiple-system-image-targets). - -[⤴ _**back to Content**_](#content) - -## Should I use Distributed.jl or MPI.jl for large-scale parallelism? - -While the Distributed standard library provides some convenient tools and has its use cases you should generally use MPI.jl to scale your code up (e.g. to thousands of compute nodes). Not only is MPI the established standard for distributed computing in any programming language, it also makes use of fast interconnects in HPC clusters (which the Distributed standard library currently doesn't). - -[⤴ _**back to Content**_](#content) - -## Should I use Julia artifacts (JLLs) or system software? - -If JLLs work fine for you then use them. JLLs have the big advantage that they are convenient and, in many cases, "just work" out of the box. System software can (but doesn't necessarily) give better performance but overriding the relevant bits of JLLs can be cumbersome. Generally speaking, we recommend to only manually replace JLL libraries by system software if JLLs don't work (e.g. if a vendor specific MPI is required). However, in such a case it would be even better to nudge the HPC admins and make this setup permanent and generally available in form of a Julia Lmod module. - -[⤴ _**back to Content**_](#content) - -## How to cope with a large number of MPI processes accessing the same Julia depot? - -In a distributed computing scenario with, e.g., multiple thousands of Julia (MPI) processes, accessing the same Julia depot on a shared file system - when loading packages and precompiled cache files on `using PackageX` - can become (very) time consuming. A workaround is to bundle up the Julia depot (e.g. as a `.tar.gz`), distribute it to the local node storage (if available) or local memory (often times mounted as `/tmp`) of all assigned compute nodes, and then set the `JULIA_DEPOT_PATH` accordingly. - -[⤴ _**back to Content**_](#content) - - -## How to avoid `LD_LIBRARY_PATH` issues? - -When using Julia on a system that uses an environment-variable based module -system (such as [modules](https://github.com/cea-hpc/modules) or -[Lmod](https://github.com/TACC/Lmod)), the `LD_LIBRARY_PATH` variable might -be filled with entries pointing to different packages and libraries. This might (or might not) lead to -issues stemming from Julia loading libraries other than the ones packaged with -it. If you encounter such problems, make sure that Julia's `lib` directory is always the *first* directory in -`LD_LIBRARY_PATH`. - -One possibility to achieve this is to create a wrapper shell script that -modifies `LD_LIBRARY_PATH` before calling the Julia executable. Inspired by a -[script](https://github.com/UCL-RITS/rcps-buildscripts/blob/04b2e2ccfe7e195fd0396b572e9f8ff426b37f0e/files/julia/julia.sh) -from UCL's [Owain Kenway](https://github.com/owainkenwayucl): -```shell -#!/usr/bin/env bash - -# This wrapper makes sure the julia binary distributions picks up the GCC -# libraries provided with it correctly meaning that it does not rely on -# the gcc-libs version. - -# Dr Owain Kenway, 20th of July, 2021 -# Source: https://github.com/UCL-RITS/rcps-buildscripts/blob/04b2e2ccfe7e195fd0396b572e9f8ff426b37f0e/files/julia/julia.sh - -location=$(readlink -f $0) -directory=$(readlink -f $(dirname ${location})/..) - -export LD_LIBRARY_PATH=${directory}/lib/julia:${LD_LIBRARY_PATH} -exec ${directory}/bin/julia "$@" -``` - -Note that using `readlink` might not be optimal from a performance perspective -if used in a massively parallel environment. Alternatively, hard-code the Julia -path or set an environment variable accordingly. - -[⤴ _**back to Content**_](#content) - -## Julia unexpectedly killed for exceeding the requested memory limit - -If a job has non-exclusive access to a node and has a memory limit that is lower than the total memory of the node, set the `--heap-size-hint` command line option to an appropriate value when starting Julia in the job script, e.g. `julia --heap-size-hint=4G my_script.jl` if you have requested a memory limit of 4G for running `my_script.jl`. This communicates the memory limit to Julia's garbage collector to enable more aggressive garbage collection when the memory limit is approached. - -[⤴ _**back to Content**_](#content) - -## I get memory-related issues when using CUDA.jl on a HPC cluster - -Try setting `JULIA_CUDA_MEMORY_POOL=none` (see the [CUDA.jl documentation](https://cuda.juliagpu.org/stable/usage/memory/#Memory-pool) for more information). - -[⤴ _**back to Content**_](#content) - -## Precompilation on a login node fails (`Resource temporarily unavailable`) - -By default, Julia uses many parallel tasks during precompilation. On the login nodes of some HPC clusters, parallel processes might be subject to resource restrictions. In these cases, you might want to set [`JULIA_NUM_PRECOMPILE_TASKS`](https://docs.julialang.org/en/v1/manual/environment-variables/#JULIA_NUM_PRECOMPILE_TASKS) to a low value, e.g. `export JULIA_NUM_PRECOMPILE_TASKS=1` (single task). - -[⤴ _**back to Content**_](#content) - -## Can I precompile GPU code on a login node without a GPU? - -Yes, at least for CUDA.jl. See [this part](https://cuda.juliagpu.org/stable/installation/overview/#Precompiling-CUDA.jl-without-CUDA) of the CUDA.jl documentation. - -[⤴ _**back to Content**_](#content) diff --git a/website/user_gettingstarted.md b/website/user_gettingstarted.md deleted file mode 100644 index b5b6214..0000000 --- a/website/user_gettingstarted.md +++ /dev/null @@ -1,59 +0,0 @@ -+++ -title = "Getting started" -hascode = true -literate_mds = true -showall = false -noeval = true -+++ - -# Getting started - -Getting started with Julia on a new cluster can sometimes be a challenge. Below we provide some common tips that will hopefully help you with your onboarding process. - ---- - -\label{content} -**Content** - -\toc - ---- - -## Use the regular Julia binaries or a Julia module (if available) - -When starting on a new HPC cluster the first thing you should do is figure out if there is a pre-configured Julia module ([Lmod module](https://lmod.readthedocs.io/en/latest/010_user.html)) available on the cluster. To that end, `module key julia` or `module spider julia` might be helpful commands. - -If there is no Julia module available that you can load, you should download and use the regular, precompiled Julia binaries. We strongly recommend to use [juliaup](https://github.com/JuliaLang/juliaup) for this. Alternatively, you can also manually download the binaries directly [from the website](https://julialang.org/downloads/). In any case, you should generally **not** build Julia from source (unless you have a very good reason). - -Note that you **do not** need root privileges. Julia, and its packages, works great without special permissions in user space. - -[⤴ _**back to Content**_](#content) - -## Place the Julia depot on the parallel file system. - -One you have Julia installed and you can run `julia` from the command line, you should place the Julia depot - the `.julia` folder where Julia stores all dependencies, logs, etc. - on an appropriate file system. By default, it will be stored in `$HOME/.julia`. This may or may not be a good choice, but more often than not it isn't. - -You want to choose a file system with the following properties -* no tight quotas (at least >= 20 GB) -* read and write access (ideally also from compute nodes) -* good (parallel) I/O -* no automatic deletion of unused files (or otherwise you have to find a workaround) - -**On most clusters these criterion are best fit on a parallel file system (often `$SCRATCH`).** In this case, you should put `JULIA_DEPOT_PATH=$SCRATCH/.julia` into your `.bashrc` (and your job scripts if `.bashrc` is not loaded by non-interactive jobs). - -**Note:** If the last point (automatic deletion of unused files) is an issue for you, a pragmatic workaround could be a cronjob that touches all files in the Julia depot every once in a while. - -[⤴ _**back to Content**_](#content) - - -## Set `JULIA_CPU_TARGET` appropriately. - -On many clusters, the sections above are all you need to get a solid Julia setup. However, if you're on a **heterogeneous HPC cluster**, that is, if different nodes have different CPU (micro-)architectures, you should/need to do a few more preparations. Otherwise, you might encounter nasty error messages like "`Illegal instruction`". - -To make Julia produce efficient code that works on different CPUs, you need to set [`JULIA_CPU_TARGET`](https://docs.julialang.org/en/v1.10-dev/manual/environment-variables/#JULIA_CPU_TARGET). For example, if you want Julia to compile all functions (`clone_all`) for Intel Skylake (`skylake-avx512`), AMD Zen 2 (`znver2`), and a generic fallback (`generic`), for safety, you could put the following into your `.bashrc`: - -`export JULIA_CPU_TARGET="generic;skylake-avx512,clone_all;znver2,clone_all"`. - -You can get the CPU target name for the current system with `Sys.CPU_NAME`. For more information, see [this section of the Julia documentation](https://docs.julialang.org/en/v1/manual/environment-variables/#JULIA_CPU_TARGET) and [this section of the developer documentation](https://docs.julialang.org/en/v1/devdocs/sysimg/#Specifying-multiple-system-image-targets). - -[⤴ _**back to Content**_](#content) diff --git a/website/user_jlls.md b/website/user_jlls.md deleted file mode 100644 index 4190c2d..0000000 --- a/website/user_jlls.md +++ /dev/null @@ -1,20 +0,0 @@ -+++ -title = "JLLs vs system software" -hascode = true -literate_mds = true -showall = false -noeval = true -+++ - -# JLLs vs system software - -\label{content} -**Content** - -\toc - ---- - -TBD - -[⤴ _**back to Content**_](#content) \ No newline at end of file diff --git a/website/user_vscode.md b/website/user_vscode.md deleted file mode 100644 index 7e76676..0000000 --- a/website/user_vscode.md +++ /dev/null @@ -1,143 +0,0 @@ -+++ -title = "Visual Studio Code on HPC Clusters" -hascode = true -literate_mds = true -showall = false -noeval = true -+++ - -# Visual Studio Code on HPC Clusters - -VS Code is a very popular IDE with a great [Julia extension](https://marketplace.visualstudio.com/items?itemName=julialang.language-julia) ([website](https://www.julia-vscode.org/)). Running it on a cluster typically isn't straightforward and we want to highlight the most important steps here. - ---- - -\label{content} -**Content** - -\toc - ---- - -## What does "Running VS Code on a cluster" actually mean? - -To be clear: What it **does not** mean is to have VS Code running locally and using its terminal (at the bottom) the `ssh` to the cluster and running `julia` on it. - -Instead, we want to connect VS Code to a little server component that will run on the cluster. Hence, only the GUI will run locally and everything else will run on the cluster. This includes VS Code extensions, like the Julia extension and will eventually give us an integrated REPL, a debugger, a plot pane, etc., all working remotely on the cluster. - -## Running VS Code on a login node (SSH) - -**Note:** We assume that the hostname of the cluster is `mycluster`. - -1) Make sure that you have password-less SSH access to the cluster (`ssh mycluster` should bring you to the cluster). - -2) In VS Code, press `F1` and run the `Remote-SSH: Open SSH Host...` command. - - If the command isn't available, make sure that [Remote - SSH extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh) is installed. -3) Enter `mycluster` and press enter. - -After a second or two, you should have VS Code running on a login node! 🎉 - -[⤴ _**back to Content**_](#content) - -## Installing the Julia extension - -1) Open the extensions view (press `CTRL/CMD + SHIFT + X`). -2) Search for `julia`. -3) Click on `install`. - -## Making the Julia extension work - -Typically, the `julia` command is not directly available on a cluster but one must load a Julia module first (e.g. `module load julia`). Unfortunately, the Julia extension doesn't know about this, so we need to teach it. - -1) Prepare a Julia wrapper script (`julia_wrapper.sh`) like the following: - -```bash -#!/bin/bash - -# Making module command available -# ------------------------------------------------------------ -export MODULEPATH=/etc/modulefiles:/usr/share/modulefiles -export LMOD_SYSTEM_DEFAULT_MODULES="DefaultModules" -source /usr/share/lmod/lmod/init/profile -module --initial_load restore -# ------------------------------------------------------------ - -# Load julia -module load julia - -# Pass on all arguments to julia -exec julia "${@}" -``` - -Note the module name as well as (at least) the first two lines of the block that makes the `module` command available are system specific and must be adjusted. To figure our the latter, you may run the following in a shell on the cluster: `echo $MODULEPATH` and `echo $LMOD_SYSTEM_DEFAULT_MODULES`. - -2. Make the wrapper script executable: `chmod +x julia_wrapper.sh` - -3. Check that it works: `./julia_wrapper.sh` should open the Julia REPL. - -Once the wrapper is ready and functional, we need to point the Julia extension to it. - -4. Open the VS Code Settings (press `CTRL/CMD + ,`). -5. Click on the tab `Remote [SSH: mycluster]`. -6. Search for `Julia executable`. -7. Insert `/path/to/julia_wrapper.sh` into the text field under `Julia: Executable Path`. - -If `ALT/OPTION + J` followed by `ALT/OPTION + O` (**or** pressing `F1` and executing the `Julia: Start REPL` command) successfully spins up the integrated Julia REPL, you know that the setup is working! 🎉 - -**Important note:** If you want all the nice features of the Julia extension - like inline evaluation, plotting, debugging, etc. - you need to use the **integrated REPL** started by the shortcuts mentioned above. If you just type `julia` in a terminal (at the bottom), the resulting REPL will **not** be connected to the extension! - -[⤴ _**back to Content**_](#content) - -## Can I run VS Code on a compute node? (SSH) - -Maybe. The first thing you need to check is whether it is at all possible for you to connect to a compute node via SSH, as not all HPC centers allow this. (Note that typically you can only `ssh` to compute nodes that are part of a job that you have currently running.) - -Given that you can `ssh` to compute nodes, what you want to do next is add a generic (wildcard) entry, that covers all compute nodes, to your `.ssh/config`. Assuming that the hostnames of the compute nodes start with `cn` (e.g. `cn1201` and `cn2134` etc.) and assuming that you already have a ssh config entry for `mycluster`, this could look like this: - -``` -Host cn* - HostName %h - ProxyJump mycluster - User [USERNAME] - IdentityFile [PATH TO PRIVATE KEY] - IdentitiesOnly yes -``` - -Afterwards, you can use the following steps to run VS Code on a compute node: - -1. Open a terminal (outside of VS Code) - -2. Login to the cluster (`ssh mycluster`) - -3. Get an interactive session on a compute node (and write down the name of the node that has been assigend to you, say, `cn1201`). - -4. Follow the steps under [Running VS Code on a login node (SSH)](#running-vs-code-on-a-login-node-ssh) above but replace the hostname `mycluster` by the name of the compute node (e.g. `cn1201`). - -[⤴ _**back to Content**_](#content) - -## Running VS Code remotely via "remote tunnels" - -Microsoft provides ["Remote tunnels"](https://code.visualstudio.com/docs/remote/tunnels) as an alternative to SSH to connect VS Code to remote systems. - -**Pro** - -* Allows you to connect to any machine with internet access (including cluster compute nodes that you can't ssh to!). - -**Con** - -* Requires a GitHub / Microsoft account. -* Microsoft serves as the tunnel provider (man in the middle). - -**How to do it?** - -1. Download the VS Code command line interface from [https://code.visualstudio.com/Download](https://code.visualstudio.com/Download) (search for **CLI**). - -2. Copy the single `code` binary to the cluster (and put the directory on `PATH`). - -3. Run `code tunnel --verbose` and follow the steps (to connect to your GitHub account). - -4. Afterwards, open VS Code and install the [Remote - Tunnels](https://marketplace.visualstudio.com/items?itemName=ms-vscode.remote-server) extension. - -5. Run the command `Remote-Tunnels: Connect to Tunnel...` and connect to the remote node. - -[⤴ _**back to Content**_](#content) \ No newline at end of file diff --git a/website/utils.jl b/website/utils.jl deleted file mode 100644 index c3fa6b1..0000000 --- a/website/utils.jl +++ /dev/null @@ -1,16 +0,0 @@ -function hfun_bar(vname) - val = Meta.parse(vname[1]) - return round(sqrt(val), digits=2) -end - -function hfun_m1fill(vname) - var = vname[1] - return pagevar("index", var) -end - -function lx_baz(com, _) - # keep this first line - brace_content = Franklin.content(com.braces[1]) # input string - # do whatever you want here - return uppercase(brace_content) -end