From cb10a68d7d05692bf8a3ddf4a6e029cf6d795cb7 Mon Sep 17 00:00:00 2001 From: "Documenter.jl" Date: Tue, 15 Aug 2023 20:26:16 +0000 Subject: [PATCH] build based on 6131924 --- dev/NQCDistributions/overview/index.html | 12 +- dev/NQCModels/analyticmodels/index.html | 800 +- dev/NQCModels/ase/index.html | 10 +- dev/NQCModels/frictionmodels/index.html | 2 +- dev/NQCModels/neuralnetworkmodels/index.html | 4 +- dev/NQCModels/overview/index.html | 4 +- dev/api/NQCBase/nqcbase/index.html | 4 +- .../nqcdistributions/index.html | 4 +- dev/api/NQCDynamics/calculators/index.html | 2 +- .../NQCDynamics/dynamicsmethods/index.html | 18 +- .../NQCDynamics/dynamicsoutputs/index.html | 2 +- dev/api/NQCDynamics/dynamicsutils/index.html | 4 +- dev/api/NQCDynamics/ensembles/index.html | 4 +- dev/api/NQCDynamics/estimators/index.html | 2 +- .../NQCDynamics/initialconditions/index.html | 10 +- .../nonadiabaticmoleculardynamics/index.html | 4 +- dev/api/NQCDynamics/numericutils/index.html | 2 +- dev/api/NQCDynamics/ringpolymers/index.html | 2 +- .../timecorrelationfunctions/index.html | 2 +- dev/api/NQCModels/adiabaticmodels/index.html | 4 +- dev/api/NQCModels/cubeldfamodel/index.html | 4 +- dev/api/NQCModels/diabaticmodels/index.html | 4 +- dev/api/NQCModels/frictionmodels/index.html | 2 +- dev/api/NQCModels/nninterfaces/index.html | 2 +- .../NQCModels/nonadiabaticmodels/index.html | 2 +- dev/assets/citations.css | 18 + dev/assets/themes/documenter-dark.css | 7699 +--------------- dev/assets/themes/documenter-light.css | 7733 +---------------- dev/atoms/index.html | 4 +- dev/devdocs/diffeq/index.html | 112 +- dev/devdocs/models/index.html | 2 +- dev/devdocs/new_methods/index.html | 90 +- .../dynamicsmethods/classical/index.html | 72 +- .../dynamicsmethods/ehrenfest/index.html | 94 +- .../dynamicsmethods/fssh/index.html | 128 +- .../dynamicsmethods/langevin/index.html | 142 +- .../dynamicsmethods/mdef/index.html | 116 +- .../dynamicsmethods/nrpmd/index.html | 8 +- .../dynamicsmethods/rpmd/index.html | 8 +- .../dynamicsmethods/rpsh/index.html | 74 +- .../dynamicssimulations/index.html | 118 +- dev/ensemble_simulations/index.html | 164 +- dev/examples/reactive_scattering/index.html | 710 +- dev/examples/spinboson/index.html | 80 +- dev/examples/threestatemorse/index.html | 4 +- dev/examples/tully_scattering/index.html | 6 +- dev/getting_started/index.html | 134 +- dev/index.html | 2 +- dev/initialconditions/ebk/index.html | 4 +- dev/initialconditions/hamiltonian/index.html | 34 +- dev/initialconditions/langevin/index.html | 2 +- .../metropolishastings/index.html | 136 +- dev/integration_algorithms/index.html | 2 +- dev/parameters.jld2 | Bin 6998 -> 6998 bytes dev/references/index.html | 114 +- dev/saving_loading/index.html | 4 +- dev/search/index.html | 2 +- dev/search_index.js | 2 +- 58 files changed, 1661 insertions(+), 17067 deletions(-) create mode 100644 dev/assets/citations.css diff --git a/dev/NQCDistributions/overview/index.html b/dev/NQCDistributions/overview/index.html index ad0c43fe8..1cd65f01a 100644 --- a/dev/NQCDistributions/overview/index.html +++ b/dev/NQCDistributions/overview/index.html @@ -1,15 +1,15 @@ -NQCDistributions.jl · NQCDynamics.jl

NQCDistributions.jl

Storing and sampling distributions

In order to perform ensembles of trajectories, it is useful to have a convenient way to generate distributions of velocities and positions which can be sampled to initialise trajectories. The NQCDistributions.jl package contains the types and functions that seek to address this requirement as painlessly as possible.

For quantum classical nonadiabatic dynamics simulations, the initial distributions contain both nuclear and electronic degrees of freedom.

Note

Currently, we allow for product distributions only, where the nuclear and electronic distributions are separable. In the future it would be great to remove this restriction, if you are interested, please open an issue on GitHub.

This page describes the types that can be used to represent nuclear and electronic distributions and demonstrates how they can be combined into a product distribution.

Nuclear Distributions

DynamicalDistribution

When handling distributions for the nuclear degrees of freedom, the DynamicalDistribution type can be used to store initial velocities and positions:

d = DynamicalDistribution(10, 5, (3, 2))

Here, we have created a delta distribution with fixed velocities and positions, the final argument specifies the size of each sample. The (3, 2) case shown here would be appropriate when using 2 atoms each with 3 degrees of freedom.

julia> rand(d)ComponentVector{Int64}(v = [10 10; 10 10; 10 10], r = [5 5; 5 5; 5 5])

DynamicalDistribution is flexible and each of the first two arguments can be Real, Vector or Sampleable.

Note
  • Reals are used whenever the same value is desired for every sample, as above.
  • Vectors can be provided when sampling a provided vector of configurations.
  • Sampleables are provided by Distributions.jl and can be used when specifying an analytic distribution such as the Maxwell-Boltzmann distribution for velocities.

Each of these options can be composed in any combination, let's see the case where we have an analytic distribution of positions and a preset collection of velocities:

using Distributions
+NQCDistributions.jl · NQCDynamics.jl

NQCDistributions.jl

Storing and sampling distributions

In order to perform ensembles of trajectories, it is useful to have a convenient way to generate distributions of velocities and positions which can be sampled to initialise trajectories. The NQCDistributions.jl package contains the types and functions that seek to address this requirement as painlessly as possible.

For quantum classical nonadiabatic dynamics simulations, the initial distributions contain both nuclear and electronic degrees of freedom.

Note

Currently, we allow for product distributions only, where the nuclear and electronic distributions are separable. In the future it would be great to remove this restriction, if you are interested, please open an issue on GitHub.

This page describes the types that can be used to represent nuclear and electronic distributions and demonstrates how they can be combined into a product distribution.

Nuclear Distributions

DynamicalDistribution

When handling distributions for the nuclear degrees of freedom, the DynamicalDistribution type can be used to store initial velocities and positions:

d = DynamicalDistribution(10, 5, (3, 2))

Here, we have created a delta distribution with fixed velocities and positions, the final argument specifies the size of each sample. The (3, 2) case shown here would be appropriate when using 2 atoms each with 3 degrees of freedom.

julia> rand(d)ComponentVector{Int64}(v = [10 10; 10 10; 10 10], r = [5 5; 5 5; 5 5])

DynamicalDistribution is flexible and each of the first two arguments can be Real, Vector or Sampleable.

Note
  • Reals are used whenever the same value is desired for every sample, as above.
  • Vectors can be provided when sampling a provided vector of configurations.
  • Sampleables are provided by Distributions.jl and can be used when specifying an analytic distribution such as the Maxwell-Boltzmann distribution for velocities.

Each of these options can be composed in any combination, let's see the case where we have an analytic distribution of positions and a preset collection of velocities:

using Distributions
 
 velocity = [[1.0 1.0;1.0 1.0], [2.0 2.0; 2.0 2.0], [3.0 3.0; 3.0 3.0]]
 position = Normal()
 d = DynamicalDistribution(velocity, position, (2, 2))
-rand(d)
ComponentVector{Float64}(v = [3.0 3.0; 3.0 3.0], r = [-0.6637635515551271 0.7174105899241786; 1.3632084599735597 0.6787430624233933])

This has generated normally distributed positions along with one of the three velocities we provided.

VelocityBoltzmann

When performing equilibrium simulations it is often desirable to initialise trajectories when thermal velocities. These can be obtained for each atom from a gaussian distribution of the appropriate width, or alternatively, using the VelocityBoltzmann distribution which simplifies the process. This takes the temperature, masses and size of the system and ensures the samples you obtain are of the correct shape:

using NQCDynamics
+rand(d)
ComponentVector{Float64}(v = [2.0 2.0; 2.0 2.0], r = [-0.005737244600260246 -1.0499249292429236; 1.7353762138709008 0.5753709361353411])

This has generated normally distributed positions along with one of the three velocities we provided.

VelocityBoltzmann

When performing equilibrium simulations it is often desirable to initialise trajectories when thermal velocities. These can be obtained for each atom from a gaussian distribution of the appropriate width, or alternatively, using the VelocityBoltzmann distribution which simplifies the process. This takes the temperature, masses and size of the system and ensures the samples you obtain are of the correct shape:

using NQCDynamics
 using Unitful
 
 velocity = VelocityBoltzmann(300u"K", rand(10), (3, 10))
 rand(velocity)
3×10 Matrix{Float64}:
-  0.116047    -0.0283833  -0.0210352   …  -0.0344595   -0.0772092  -0.0192462
- -0.00621842   0.0447871  -0.00524435     -0.00597418   0.0310334   0.0507551
- -0.317413    -0.0279084  -0.00260537     -0.0275021    0.0283206  -0.138324

This can be handed directly to the DynamicalDistribution when Boltzmann velocities are required.

distribution = DynamicalDistribution(velocity, 1, (3, 10))
-rand(distribution)
ComponentVector{Float64}(v = [0.04647729852683027 -0.030006079092740834 … -0.04975415160034094 -0.05746078488358261; -0.23147989243780698 -0.0029879581185335183 … 0.009417214566329532 0.1168019778307787; 0.09543756922281332 -0.04308135425199247 … 0.02896473523670334 0.01570147456151828], r = [1.0 1.0 … 1.0 1.0; 1.0 1.0 … 1.0 1.0; 1.0 1.0 … 1.0 1.0])

Wigner distributions

For harmonic oscillator systems, we have implemented the analytic Wigner distribution. These are just mormal distributions of the appropriate width but can be accessed easily as in the following:

julia> using NQCDistributions
julia> omega = 1.0;
julia> beta = 1e-3;
julia> mass = 10;
julia> dist = PositionHarmonicWigner(omega, beta, mass, centre=0.0)Distributions.Normal{Float64}(μ=0.0, σ=10.000000416666651)
julia> rand(dist)7.530523953029417
julia> dist = VelocityHarmonicWigner(omega, beta, mass)Distributions.Normal{Float64}(μ=0.0, σ=10.000000416666651)
julia> rand(dist)1.736699483841532

These can also be given to the DynamicalDistribution since they are just univariate normal distributions.

Electronic distributions

For nonadiabatic dynamics, the initial electronic variables must also be sampled. For this, we can use an ElectronicDistribution which will tell our simulation how we want to sample the initial variables. Currently, two of these are provided, the PureState and the MixedState. The PureState is used for nonequilibrium simulations when the population is confined to a single state, whereas MixedState allows for a mixed state distribution.

julia> using NQCDistributions
julia> PureState(1, Diabatic())PureState{Diabatic}(1, Diabatic())
julia> PureState(2, Adiabatic())PureState{Adiabatic}(2, Adiabatic())
julia> MixedState([1, 2], Diabatic())MixedState{Int64, Diabatic}([1, 2], Diabatic())

These structs contain only the minimal information about the distributions, whereas the sampling of the distribution is handled separately by each of the different methods.

Sampling the nuclear distribution

To learn how to generate configurations to use with the DynamicalDistribution, read on to the next sections about the included sampling methods.

+ 0.0431768 -0.00721433 0.0229998 … -0.0447256 0.0218641 -0.0228162 + 0.00248087 0.0264589 -0.000291852 -0.0282252 0.00801069 0.0619272 + 0.0567604 0.0213497 -0.0868398 -0.0382039 0.0471074 -0.0431438

This can be handed directly to the DynamicalDistribution when Boltzmann velocities are required.

distribution = DynamicalDistribution(velocity, 1, (3, 10))
+rand(distribution)
ComponentVector{Float64}(v = [0.010693208829782041 0.0668468595612907 … -0.023035999961692744 0.007891916594039377; 0.02584988242230623 0.05262932861323089 … -0.007851670412026055 -0.011571744150117162; -0.029762479329246475 0.009506536964503732 … 0.024423132449824067 0.03490700152015903], r = [1.0 1.0 … 1.0 1.0; 1.0 1.0 … 1.0 1.0; 1.0 1.0 … 1.0 1.0])

Wigner distributions

For harmonic oscillator systems, we have implemented the analytic Wigner distribution. These are just mormal distributions of the appropriate width but can be accessed easily as in the following:

julia> using NQCDistributions
julia> omega = 1.0;
julia> beta = 1e-3;
julia> mass = 10;
julia> dist = PositionHarmonicWigner(omega, beta, mass, centre=0.0)Distributions.Normal{Float64}(μ=0.0, σ=10.000000416666651)
julia> rand(dist)1.5688395805415631
julia> dist = VelocityHarmonicWigner(omega, beta, mass)Distributions.Normal{Float64}(μ=0.0, σ=10.000000416666651)
julia> rand(dist)-7.328146197174884

These can also be given to the DynamicalDistribution since they are just univariate normal distributions.

Electronic distributions

For nonadiabatic dynamics, the initial electronic variables must also be sampled. For this, we can use an ElectronicDistribution which will tell our simulation how we want to sample the initial variables. Currently, two of these are provided, the PureState and the MixedState. The PureState is used for nonequilibrium simulations when the population is confined to a single state, whereas MixedState allows for a mixed state distribution.

julia> using NQCDistributions
julia> PureState(1, Diabatic())PureState{Diabatic}(1, Diabatic())
julia> PureState(2, Adiabatic())PureState{Adiabatic}(2, Adiabatic())
julia> MixedState([1, 2], Diabatic())MixedState{Int64, Diabatic}([1, 2], Diabatic())

These structs contain only the minimal information about the distributions, whereas the sampling of the distribution is handled separately by each of the different methods.

Sampling the nuclear distribution

To learn how to generate configurations to use with the DynamicalDistribution, read on to the next sections about the included sampling methods.

diff --git a/dev/NQCModels/analyticmodels/index.html b/dev/NQCModels/analyticmodels/index.html index 6cd5af057..e7f98f890 100644 --- a/dev/NQCModels/analyticmodels/index.html +++ b/dev/NQCModels/analyticmodels/index.html @@ -1,57 +1,57 @@ -Analytic model library · NQCDynamics.jl

Analytic model library

This page plots many of the analytic models included in NQCDynamics.

Tip

To produce the plots we use two of Julia's plotting options Plots and Makie. Plots has a mature recipe system that allows us to define custom plots for the 1D models but we use Makie to produce the more complex images. Each of these has their pros and cons and if you are interested in producing plots using Julia you should visit their documentation to decide which is best for you.

AdiabaticModels

These models are used for classical dynamics and provide a single potential energy surface.

Harmonic

using NQCModels, Plots
+Analytic model library · NQCDynamics.jl

Analytic model library

This page plots many of the analytic models included in NQCDynamics.

Tip

To produce the plots we use two of Julia's plotting options Plots and Makie. Plots has a mature recipe system that allows us to define custom plots for the 1D models but we use Makie to produce the more complex images. Each of these has their pros and cons and if you are interested in producing plots using Julia you should visit their documentation to decide which is best for you.

AdiabaticModels

These models are used for classical dynamics and provide a single potential energy surface.

Harmonic

using NQCModels, Plots
 plot(-10:0.1:10, Harmonic())
- + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

DiatomicHarmonic

using NQCModels
 using Plots
 
@@ -62,128 +62,128 @@ 

- + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + +

DarlingHollowayElbow

using NQCModels
 using NQCBase: eV_to_au
@@ -204,348 +204,348 @@ 

DiabaticModels

These models define a Hermitian potential operator in a diabatic basis. These can be used for various forms of nonadiabatic dynamics.

TullyModelOne

using NQCModels, Plots
+f

DiabaticModels

These models define a Hermitian potential operator in a diabatic basis. These can be used for various forms of nonadiabatic dynamics.

TullyModelOne

using NQCModels, Plots
 plot(-10:0.1:10, TullyModelOne(); coupling=true)
- + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

TullyModelTwo

using NQCModels, Plots
 plot(-10:0.1:10, TullyModelTwo(); coupling=true)
- + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

TullyModelThree

using NQCModels, Plots
 plot(-10:0.1:10, TullyModelThree(); coupling=true)
- + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

ThreeStateMorse

using NQCModels, Plots
 plot(2:0.01:12, ThreeStateMorse(), ylims=(0, 0.06), coupling=true)
- + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

OuyangModelOne

using NQCModels, Plots
 plot(-10:0.1:10, OuyangModelOne())
- + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

DoubleWell

using NQCModels, Plots
 plot(-5:0.1:5, DoubleWell(); coupling=true)
- + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

GatesHollowayElbow

using NQCModels
 using CairoMakie
 
@@ -563,4 +563,4 @@ 

+f
diff --git a/dev/NQCModels/ase/index.html b/dev/NQCModels/ase/index.html index e8bcb4669..1a2d0d21e 100644 --- a/dev/NQCModels/ase/index.html +++ b/dev/NQCModels/ase/index.html @@ -1,11 +1,11 @@ -ASE interface · NQCDynamics.jl

ASE interface

The easiest way to obtain potentials and forces from established codes is to use the interfaces implemented in ASE.

We provide the AdiabaticASEModel which wraps an ASE atoms object and its associated calculator to implement the required potential and derivative functions.

Note

The interface works by calling the relevant Python functions using PyCall. To use PyCall, you must make sure that your python version contains all the relevant packages, such as ase. PyCall can be configured to use a particular pre-installed Python or install its own. Refer to the PyCall README for installation and configuration instructions.

Example

First, it is necessary to import ase and create the ase.Atoms object and attach the desired calculator. This works exactly as in Python:

using PyCall
+ASE interface · NQCDynamics.jl

ASE interface

The easiest way to obtain potentials and forces from established codes is to use the interfaces implemented in ASE.

We provide the AdiabaticASEModel which wraps an ASE atoms object and its associated calculator to implement the required potential and derivative functions.

Note

The interface works by calling the relevant Python functions using PyCall. To use PyCall, you must make sure that your python version contains all the relevant packages, such as ase. PyCall can be configured to use a particular pre-installed Python or install its own. Refer to the PyCall README for installation and configuration instructions.

Example

First, it is necessary to import ase and create the ase.Atoms object and attach the desired calculator. This works exactly as in Python:

using PyCall
 
 ase = pyimport("ase")
 emt = pyimport("ase.calculators.emt")
 
 h2 = ase.Atoms("H2", [(0, 0, 0), (0, 0, 0.74)])
-h2.calc = emt.EMT()

Next, the AdiabaticASEModel is created by passing the ase.Atoms object directly to the model:

julia> using NQCModels
julia> model = AdiabaticASEModel(h2)AdiabaticASEModel{PyCall.PyObject}(PyObject Atoms(symbols='H2', pbc=False, calculator=EMT(...)))

Now the model can be used in the same way as any of the previously introduced analytic models.

julia> potential(model, rand(3, 2))3.0963575587020813
julia> derivative(model, rand(3, 2))3×2 Matrix{Float64}: - -2.77347 2.77347 - -0.254181 0.254181 - -2.67138 2.67138
Tip

In theory, this should work with any of the ASE calculators that correctly implement the get_potential_energy and get_forces functions. For instance, you can use SchNetPack (SPK) by passing their ASE calculator to the AdiabaticASEModel. Take a look at Neural network models to learn more.

+h2.calc = emt.EMT()

Next, the AdiabaticASEModel is created by passing the ase.Atoms object directly to the model:

julia> using NQCModels
julia> model = AdiabaticASEModel(h2)AdiabaticASEModel{PyCall.PyObject}(PyObject Atoms(symbols='H2', pbc=False, calculator=EMT(...)))

Now the model can be used in the same way as any of the previously introduced analytic models.

julia> potential(model, rand(3, 2))1.518189358460228
julia> derivative(model, rand(3, 2))3×2 Matrix{Float64}: + 5.1598 -5.1598 + -1.35218 1.35218 + -0.513787 0.513787
Tip

In theory, this should work with any of the ASE calculators that correctly implement the get_potential_energy and get_forces functions. For instance, you can use SchNetPack (SPK) by passing their ASE calculator to the AdiabaticASEModel. Take a look at Neural network models to learn more.

diff --git a/dev/NQCModels/frictionmodels/index.html b/dev/NQCModels/frictionmodels/index.html index 0a4818d42..808dd5233 100644 --- a/dev/NQCModels/frictionmodels/index.html +++ b/dev/NQCModels/frictionmodels/index.html @@ -1,2 +1,2 @@ -Electronic friction models · NQCDynamics.jl

Electronic friction models

To perform molecular dynamics with electronic friction (MDEF) a specific type of model must be used that provides the friction tensor used to propagate the dynamics.

As detailed in the MDEF page, there are two ways to obtain friction values, either from the local density friction approximation (LDFA), or from time-dependent perturbation theory (TDPT). The models on this page describe our existing implementations.

Analytic models

Since ab initio friction calculations are often expensive it is useful to have some models that we can use to test different friction methods. The DiabaticFrictionModel is the abstract type that groups together the diabatic models for which electronic friction can be evaluated. These have many electronic states, modelling the electronic structure characteristic of a metal. The friction is calculated for these models directly from the nonadiabatic couplings with the equation:

\[γ = 2\pi\hbar \sum_j <1|dH|j><j|dH|1> \delta(\omega_j) / \omega_j\]

where the delta function is approximated by a normalised Gaussian function and the sum runs over the adiabatic states (Connor L. Box, Yaolong Zhang, Rongrong Yin, Bin Jiang, Reinhard J. Maurer (2021)). The matrix elements in this equation are the position derivatives of the diabatic hamiltonian converted to the adiabatic representation.

Warning

The analytic friction models and the equation above are experimental and subject to change.

CubeLDFAModel.jl

Our LDFA implementation is given in CubeLDFAModel.jl which takes a .cube file containing the electron density and evaluates the friction based upon this local density.

The model works by fitting the LDA data provided by Nick Gerrits, J. I\~naki Juaristi, J\"org Meyer (2020) that provides the LDFA friction coefficient as a function of the Wigner-Seitz radius. When the model is initialised, the LDA data from Nick Gerrits, J. I\~naki Juaristi, J\"org Meyer (2020) is interpolated using DataInterpolations.jl with a cubic spline. Then, whenever required, the density at the current position is taken directly from the .cube file and converted to the Wigner-Seitz radius with the following relation:

\[r_s(\rho) = (\frac{3}{4\pi \rho (\mathbf{r_{i}})})^{1/3}.\]

Then, the interpolation function is evaluated with this value for the radius, which gives the LDA friction. Optimally, this would be done via an ab initio calculation to get the electron density, but this model instead uses a pre-computed .cube file to get the density with minimal cost. This makes the assumption that the density does not change throughout the dynamics, or that the surface is assumed to be frozen in place.

This graph shows how we interpolate the LDA data and evaluate the friction coefficient as a function of the Wigner-Seitz radius. ldfa graph

The reactive scattering example uses this model to investigate the scattering of a diatomic molecule from a metal surface.

NNInterfaces.jl

Another way to perform MDEF simulations is the use one of the models from NNInterfaces.jl that uses a neural network to obtain the time-dependent perturbation theory friction from the atomic positions. As with LDFA, one of these models is used in the reactive scattering example.

+Electronic friction models · NQCDynamics.jl

Electronic friction models

To perform molecular dynamics with electronic friction (MDEF) a specific type of model must be used that provides the friction tensor used to propagate the dynamics.

As detailed in the MDEF page, there are two ways to obtain friction values, either from the local density friction approximation (LDFA), or from time-dependent perturbation theory (TDPT). The models on this page describe our existing implementations.

Analytic models

Since ab initio friction calculations are often expensive it is useful to have some models that we can use to test different friction methods. The DiabaticFrictionModel is the abstract type that groups together the diabatic models for which electronic friction can be evaluated. These have many electronic states, modelling the electronic structure characteristic of a metal. The friction is calculated for these models directly from the nonadiabatic couplings with the equation:

\[γ = 2\pi\hbar \sum_j <1|dH|j><j|dH|1> \delta(\omega_j) / \omega_j\]

where the delta function is approximated by a normalised Gaussian function and the sum runs over the adiabatic states ([2]). The matrix elements in this equation are the position derivatives of the diabatic hamiltonian converted to the adiabatic representation.

Warning

The analytic friction models and the equation above are experimental and subject to change.

CubeLDFAModel.jl

Our LDFA implementation is given in CubeLDFAModel.jl which takes a .cube file containing the electron density and evaluates the friction based upon this local density.

The model works by fitting the LDA data provided by [3] that provides the LDFA friction coefficient as a function of the Wigner-Seitz radius. When the model is initialised, the LDA data from [3] is interpolated using DataInterpolations.jl with a cubic spline. Then, whenever required, the density at the current position is taken directly from the .cube file and converted to the Wigner-Seitz radius with the following relation:

\[r_s(\rho) = (\frac{3}{4\pi \rho (\mathbf{r_{i}})})^{1/3}.\]

Then, the interpolation function is evaluated with this value for the radius, which gives the LDA friction. Optimally, this would be done via an ab initio calculation to get the electron density, but this model instead uses a pre-computed .cube file to get the density with minimal cost. This makes the assumption that the density does not change throughout the dynamics, or that the surface is assumed to be frozen in place.

This graph shows how we interpolate the LDA data and evaluate the friction coefficient as a function of the Wigner-Seitz radius. ldfa graph

The reactive scattering example uses this model to investigate the scattering of a diatomic molecule from a metal surface.

NNInterfaces.jl

Another way to perform MDEF simulations is the use one of the models from NNInterfaces.jl that uses a neural network to obtain the time-dependent perturbation theory friction from the atomic positions. As with LDFA, one of these models is used in the reactive scattering example.

diff --git a/dev/NQCModels/neuralnetworkmodels/index.html b/dev/NQCModels/neuralnetworkmodels/index.html index 06fc20623..ae4468ae0 100644 --- a/dev/NQCModels/neuralnetworkmodels/index.html +++ b/dev/NQCModels/neuralnetworkmodels/index.html @@ -1,5 +1,5 @@ -Neural network models · NQCDynamics.jl

Neural network models

Using the ASE interface we can directly use models trained using SchNetPack.

Danger

The examples on this page do not run during the documentation build due to schnetpack causing segfaults when installed in the build environment. The causes of this is not currently clear but we have temporarily disabled these examples in the build.

However, the examples should still be correct and you are welcome to try them with your own schnetpack trained models.

To use a SchNet model, please load any pre-trained model into a given path you can access. Here, our SchNet model is named "best_model" as is common in SchNet and provide the relative path.

First we load the model into an ase calculator and attach it to our diatomic hydrogen molecule.

using PyCall
+Neural network models · NQCDynamics.jl

Neural network models

Using the ASE interface we can directly use models trained using SchNetPack.

Danger

The examples on this page do not run during the documentation build due to schnetpack causing segfaults when installed in the build environment. The causes of this is not currently clear but we have temporarily disabled these examples in the build.

However, the examples should still be correct and you are welcome to try them with your own schnetpack trained models.

To use a SchNet model, please load any pre-trained model into a given path you can access. Here, our SchNet model is named "best_model" as is common in SchNet and provide the relative path.

First we load the model into an ase calculator and attach it to our diatomic hydrogen molecule.

using PyCall
 
 ase = pyimport("ase")
 spkutils = pyimport("schnetpack.utils")
@@ -18,4 +18,4 @@
 r = [0 0; 0 0; 0 ustrip(auconvert(0.74u"Å"))]
 
 potential(model, r)
-derivative(model, r)
+derivative(model, r)
diff --git a/dev/NQCModels/overview/index.html b/dev/NQCModels/overview/index.html index fe2a0ba92..6d1a93ca9 100644 --- a/dev/NQCModels/overview/index.html +++ b/dev/NQCModels/overview/index.html @@ -1,5 +1,5 @@ -NQCModels.jl · NQCDynamics.jl

NQCModels.jl

To perform nonadiabatic molecular dynamics simulations, it is necessary to define the system Hamiltonian. For simple models, this often comes in the form of small matrix in the diabatic representation but equally the electronic Hamiltonian could be obtained directly from ab initio electronic structure theory.

NQCModels.jl is a package that aims to provide a common interface for defining these models that is flexible enough to allow for a wide range of specifications and requirements. NQCDynamics.jl uses this interface to obtain the potentials and couplings necessary to perform the dynamics simulations. Along with the minimal interface, NQCModels.jl also provides a small set of popular models often used in the field of nonadiabatic dynamics.

Note

Taking advantages of Julia's seamless modularity, NQCModels.jl is designed as a separate package so that it can also be used independently from the main package.

Depending on the quantities provided by the Model, we use Julia's abstract type system to group models that provide the same quantities. Currently, there are two top-level abstract types: AdiabaticModel and DiabaticModel. The AdiabaticModel is used for adiabatic dynamics, providing only the potential and force used in classical mechanics. The DiabaticModel is used for nonadiabatic dynamics, where the potential is instead a Hermitian matrix.

In the Getting started section we briefly touched on how the AdiabaticModel works and introduced one of the included models. Here let's take a look at a DiabaticModel, which is more appropriate for nonadiabatic dynamics.

The DoubleWell is a two state, 1 dimensional model where each state is harmonic with linear coupling to the single degree of freedom.

using NQCModels
+NQCModels.jl · NQCDynamics.jl

NQCModels.jl

To perform nonadiabatic molecular dynamics simulations, it is necessary to define the system Hamiltonian. For simple models, this often comes in the form of small matrix in the diabatic representation but equally the electronic Hamiltonian could be obtained directly from ab initio electronic structure theory.

NQCModels.jl is a package that aims to provide a common interface for defining these models that is flexible enough to allow for a wide range of specifications and requirements. NQCDynamics.jl uses this interface to obtain the potentials and couplings necessary to perform the dynamics simulations. Along with the minimal interface, NQCModels.jl also provides a small set of popular models often used in the field of nonadiabatic dynamics.

Note

Taking advantages of Julia's seamless modularity, NQCModels.jl is designed as a separate package so that it can also be used independently from the main package.

Depending on the quantities provided by the Model, we use Julia's abstract type system to group models that provide the same quantities. Currently, there are two top-level abstract types: AdiabaticModel and DiabaticModel. The AdiabaticModel is used for adiabatic dynamics, providing only the potential and force used in classical mechanics. The DiabaticModel is used for nonadiabatic dynamics, where the potential is instead a Hermitian matrix.

In the Getting started section we briefly touched on how the AdiabaticModel works and introduced one of the included models. Here let's take a look at a DiabaticModel, which is more appropriate for nonadiabatic dynamics.

The DoubleWell is a two state, 1 dimensional model where each state is harmonic with linear coupling to the single degree of freedom.

using NQCModels
 
 model = DoubleWell()
DoubleWell{Int64, Int64, Int64, Int64}
   mass: Int64 1
@@ -56,4 +56,4 @@
    │  ├─ TullyModelThree
    │  └─ TullyModelTwo
    ├─ SpinBoson
-   └─ ThreeStateMorse
Contributing new models

To learn more about NQCModels.jl and learn how to implement new models, visit the developer documentation.

+ └─ ThreeStateMorse
Contributing new models

To learn more about NQCModels.jl and learn how to implement new models, visit the developer documentation.

diff --git a/dev/api/NQCBase/nqcbase/index.html b/dev/api/NQCBase/nqcbase/index.html index f620a10de..42b48d179 100644 --- a/dev/api/NQCBase/nqcbase/index.html +++ b/dev/api/NQCBase/nqcbase/index.html @@ -1,9 +1,9 @@ -NQCBase · NQCDynamics.jl

NQCBase

NQCBase.AtomsType
Atoms{T<:AbstractFloat}

Basic atomic parameters: element symbols, numbers and masses

Masses are converted to atomic units. Constructed using either element symbols or masses.

julia> Atoms(:H)
+NQCBase · NQCDynamics.jl

NQCBase

NQCBase.AtomsType
Atoms{T<:AbstractFloat}

Basic atomic parameters: element symbols, numbers and masses

Masses are converted to atomic units. Constructed using either element symbols or masses.

julia> Atoms(:H)
 Atoms{Float64}([:H], [1], [1837.4715941070515])
 
 julia> Atoms([:H, :H, :H, :C])
 Atoms{Float64}([:H, :H, :H, :C], [1, 1, 1, 6], [1837.4715941070515, 1837.4715941070515, 1837.4715941070515, 21894.713607956142])
 
 julia> Atoms([100, 200])
-Atoms{Float64}([:X, :X], [0, 0], [100.0, 200.0])
NQCBase.check_atoms_in_cellMethod
check_atoms_in_cell(cell::PeriodicCell, R::AbstractMatrix)::Bool

True if all atoms are inside the cell, false otherwise.

NQCBase.write_extxyzMethod
write_extxyz(file, atoms, R, cell)

Uses ExtXYZ.jl to write a .extxyz file

R can be either a single configuration (Matrix) or many (Vector{<:Matrix}).

+Atoms{Float64}([:X, :X], [0, 0], [100.0, 200.0])
NQCBase.check_atoms_in_cellMethod
check_atoms_in_cell(cell::PeriodicCell, R::AbstractMatrix)::Bool

True if all atoms are inside the cell, false otherwise.

NQCBase.write_extxyzMethod
write_extxyz(file, atoms, R, cell)

Uses ExtXYZ.jl to write a .extxyz file

R can be either a single configuration (Matrix) or many (Vector{<:Matrix}).

diff --git a/dev/api/NQCDistributions/nqcdistributions/index.html b/dev/api/NQCDistributions/nqcdistributions/index.html index d7135af7a..27f5975f8 100644 --- a/dev/api/NQCDistributions/nqcdistributions/index.html +++ b/dev/api/NQCDistributions/nqcdistributions/index.html @@ -1,5 +1,5 @@ -NQCDistributions · NQCDynamics.jl

NQCDistributions

NQCDistributions.DynamicalDistributionType
DynamicalDistribution(velocity, position, dims)

Sampleable struct containing distributions for velocity and position. dims determines the size of each sample and should match the size of the system: (ndofs, natoms).

Example

julia> using NQCDistributions: DynamicalDistribution;
+NQCDistributions · NQCDynamics.jl

NQCDistributions

NQCDistributions.DynamicalDistributionType
DynamicalDistribution(velocity, position, dims)

Sampleable struct containing distributions for velocity and position. dims determines the size of each sample and should match the size of the system: (ndofs, natoms).

Example

julia> using NQCDistributions: DynamicalDistribution;
 
 julia> d = DynamicalDistribution([[1.0;;], [2.0;;], [3.0;;]], 0.1, (1, 1));
 
@@ -7,4 +7,4 @@
 ComponentVector{Float64}(v = [1.0;;], r = [0.1;;])
 
 julia> d[2]
-ComponentVector{Float64}(v = [2.0;;], r = [0.1;;])
NQCDistributions.FermiDiracStateType
FermiDiracState{S,T,A} <: ElectronicDistribution{S}

Electronic distribution for Fermions following Fermi-Dirac distribution.

NQCDistributions.MixedStateType
MixedState{T,S} <: ElectronicDistribution{S}

Electronic distribution for representing a mixed state with non-zero population in multiple states.

NQCDistributions.PureStateType
PureState{S} <: ElectronicDistribution{S}

Electronic distribution for representing a system confined to a single state.

NQCDistributions.SampleableComponentType
SampleableComponent(sampleable, dims)

Converts a general sampleable that provides configurations into one of the component types defined below. dims should be the size of the desired samples and must be consistent with the provided sampleable.

NQCDistributions.UnivariateArrayType
UnivariateArray{N,S<:Sampleable{Univariate}}

Fill each degree of freedom from a different Univariate distribution.

The size of the matrix of sampleables should match the system size.

NQCDistributions.VelocityBoltzmannMethod
VelocityBoltzmann(temperature, masses::AbstractVector, dims::Dims{2})

Generate a Boltzmann of velocities for each degree of freedom.

Arguments

  • temperature - Atomic units or Unitful
  • masses - Vector of masses for each atom
  • dims - (ndofs, natoms). natoms must equal length(masses)
+ComponentVector{Float64}(v = [2.0;;], r = [0.1;;])
NQCDistributions.FermiDiracStateType
FermiDiracState{S,T,A} <: ElectronicDistribution{S}

Electronic distribution for Fermions following Fermi-Dirac distribution.

NQCDistributions.MixedStateType
MixedState{T,S} <: ElectronicDistribution{S}

Electronic distribution for representing a mixed state with non-zero population in multiple states.

NQCDistributions.PureStateType
PureState{S} <: ElectronicDistribution{S}

Electronic distribution for representing a system confined to a single state.

NQCDistributions.SampleableComponentType
SampleableComponent(sampleable, dims)

Converts a general sampleable that provides configurations into one of the component types defined below. dims should be the size of the desired samples and must be consistent with the provided sampleable.

NQCDistributions.UnivariateArrayType
UnivariateArray{N,S<:Sampleable{Univariate}}

Fill each degree of freedom from a different Univariate distribution.

The size of the matrix of sampleables should match the system size.

NQCDistributions.VelocityBoltzmannMethod
VelocityBoltzmann(temperature, masses::AbstractVector, dims::Dims{2})

Generate a Boltzmann of velocities for each degree of freedom.

Arguments

  • temperature - Atomic units or Unitful
  • masses - Vector of masses for each atom
  • dims - (ndofs, natoms). natoms must equal length(masses)
diff --git a/dev/api/NQCDynamics/calculators/index.html b/dev/api/NQCDynamics/calculators/index.html index 75526f014..ecbfcb741 100644 --- a/dev/api/NQCDynamics/calculators/index.html +++ b/dev/api/NQCDynamics/calculators/index.html @@ -1,2 +1,2 @@ -Calculators · NQCDynamics.jl

Calculators

NQCDynamics.CalculatorsModule
Calculators

This module exists to bridge the gap between the Models and the Dynamics.

Here, we provide functions and types for evaluating and storing quantities obtained from the Models. In addition any further manipulation of those quantities, such as computing eigenvalues, is included here.

This module is largely needed to facilitate integration of both ring polymer and classical dynamics to allow using the same models and functions for both. Specific ring polymer types are provided that have the extra fields and methods needed to evaluate the quantities for each bead.

source
NQCDynamics.Calculators.quantitiesConstant

Each of the quantities specified here has functions: get_quantity(calculator, r) evaluate_quantity!(calculator, r)!

The user should access only the former. This will ensure quantities are correctly evaluated and cached accordingly.

The latter is called by the former and is where the details required to calculate the quantity are found.

source
NQCDynamics.Calculators.update_electronics!Method

Evaluates all electronic properties for the current position r.

Properties evaluated:

  • Diabatic potential
  • Diabatic derivative
  • Eigenvalues and eigenvectors
  • Adiabatic derivative
  • Nonadiabatic coupling

This should no longer be used, instead access the quantities directly with get_quantity(calc, r).

source
+Calculators · NQCDynamics.jl

Calculators

NQCDynamics.CalculatorsModule
Calculators

This module exists to bridge the gap between the Models and the Dynamics.

Here, we provide functions and types for evaluating and storing quantities obtained from the Models. In addition any further manipulation of those quantities, such as computing eigenvalues, is included here.

This module is largely needed to facilitate integration of both ring polymer and classical dynamics to allow using the same models and functions for both. Specific ring polymer types are provided that have the extra fields and methods needed to evaluate the quantities for each bead.

source
NQCDynamics.Calculators.quantitiesConstant

Each of the quantities specified here has functions: get_quantity(calculator, r) evaluate_quantity!(calculator, r)!

The user should access only the former. This will ensure quantities are correctly evaluated and cached accordingly.

The latter is called by the former and is where the details required to calculate the quantity are found.

source
NQCDynamics.Calculators.update_electronics!Method

Evaluates all electronic properties for the current position r.

Properties evaluated:

  • Diabatic potential
  • Diabatic derivative
  • Eigenvalues and eigenvectors
  • Adiabatic derivative
  • Nonadiabatic coupling

This should no longer be used, instead access the quantities directly with get_quantity(calc, r).

source
diff --git a/dev/api/NQCDynamics/dynamicsmethods/index.html b/dev/api/NQCDynamics/dynamicsmethods/index.html index 4247ec833..646b382a5 100644 --- a/dev/api/NQCDynamics/dynamicsmethods/index.html +++ b/dev/api/NQCDynamics/dynamicsmethods/index.html @@ -1,5 +1,5 @@ -DynamicsMethods · NQCDynamics.jl

DynamicsMethods

NQCDynamics.DynamicsMethodsModule

This module contains functions and types necessary for performing nonadiabatic molecular dynamics.

Dynamics is performed using DifferentialEquations.jl. As such, this module is centered around the implementation of the functions necessary to integrate the dynamics.

For deterministic Hamiltonian methods, the central function is DynamicsMethods.motion!, which is the inplace form of the function to be integrated by DifferentialEquations.jl.

Further, methods that have discontinuities, such as surface hopping, use the callback interface provided by DifferentialEquations.jl.

source
NQCDynamics.DynamicsMethods.DynamicsVariablesMethod
DynamicsVariables(::AbstractSimulation, args...)

For each dynamics method this function is implemented to provide the variables for the dynamics in the appropriate format.

By default, DynamicsVariables is set up for the classical case and takes sim, v, r as arguments and returns a ComponentVector(v=v, r=r) which is used as a container for the velocities and positions during classical dynamics.

source
NQCDynamics.DynamicsMethods.motion!Function
motion!(du, u, sim, t)

As per DifferentialEquations.jl, this function is implemented for each method and defines the time derivatives of the DynamicalVariables.

We require that each implementation ensures du and u are subtypes of DynamicalVariables and sim subtypes AbstractSimulation.

source

ClassicalMethods

NQCDynamics.DynamicsMethods.ClassicalMethods.ClassicalType
Classical <: DynamicsMethods.Method

Type for performing classical molecular dynamics.

sim = Simulation{Classical}(Atoms(:H), Harmonic())
+DynamicsMethods · NQCDynamics.jl

DynamicsMethods

NQCDynamics.DynamicsMethodsModule

This module contains functions and types necessary for performing nonadiabatic molecular dynamics.

Dynamics is performed using DifferentialEquations.jl. As such, this module is centered around the implementation of the functions necessary to integrate the dynamics.

For deterministic Hamiltonian methods, the central function is DynamicsMethods.motion!, which is the inplace form of the function to be integrated by DifferentialEquations.jl.

Further, methods that have discontinuities, such as surface hopping, use the callback interface provided by DifferentialEquations.jl.

source
NQCDynamics.DynamicsMethods.DynamicsVariablesMethod
DynamicsVariables(::AbstractSimulation, args...)

For each dynamics method this function is implemented to provide the variables for the dynamics in the appropriate format.

By default, DynamicsVariables is set up for the classical case and takes sim, v, r as arguments and returns a ComponentVector(v=v, r=r) which is used as a container for the velocities and positions during classical dynamics.

source
NQCDynamics.DynamicsMethods.motion!Function
motion!(du, u, sim, t)

As per DifferentialEquations.jl, this function is implemented for each method and defines the time derivatives of the DynamicalVariables.

We require that each implementation ensures du and u are subtypes of DynamicalVariables and sim subtypes AbstractSimulation.

source

ClassicalMethods

NQCDynamics.DynamicsMethods.ClassicalMethods.LangevinType

Type for performing Langevin molecular dynamics.

using Unitful
 sim = Simulation{Langevin}(Atoms(:H), Free(); γ=2.5, temperature=100u"K")
 
 # output
 
 Simulation{Langevin{Float64}}:
   Atoms{Float64}([:H], [1], [1837.4715941070515])
-  Free(1)
source
NQCDynamics.DynamicsMethods.ClassicalMethods.MDEFType

\[dr = v dt\\ -dv = -\Delta U/M dt - \Gamma v dt + \sigma \sqrt{2\Gamma} dW\]

$\Gamma$ is the friction tensor with units of inverse time. For thermal dynamics we set $\sigma = \sqrt{kT / M}$, where $T$ is the electronic temperature.

This is integrated using the BAOAB algorithm where the friction "O" step is performed in the tensor's eigenbasis. See src/dynamics/mdef_baoab.jl for details.

source
NQCDynamics.DynamicsMethods.ClassicalMethods.ThermalLangevinType

Type for performing Langevin ring polymer molecular dynamics.

Currently there are separate types for classical and ring polymer versions of Langevin dynamics but they should be combined. The reason they are not at the moment is that they use different integration algorithms and require slightly different fields.

using Unitful
+  Free(1)
source
NQCDynamics.DynamicsMethods.ClassicalMethods.MDEFType

\[dr = v dt\\ +dv = -\Delta U/M dt - \Gamma v dt + \sigma \sqrt{2\Gamma} dW\]

$\Gamma$ is the friction tensor with units of inverse time. For thermal dynamics we set $\sigma = \sqrt{kT / M}$, where $T$ is the electronic temperature.

This is integrated using the BAOAB algorithm where the friction "O" step is performed in the tensor's eigenbasis. See src/dynamics/mdef_baoab.jl for details.

source
NQCDynamics.DynamicsMethods.ClassicalMethods.ThermalLangevinType

Type for performing Langevin ring polymer molecular dynamics.

Currently there are separate types for classical and ring polymer versions of Langevin dynamics but they should be combined. The reason they are not at the moment is that they use different integration algorithms and require slightly different fields.

using Unitful
 RingPolymerSimulation{ThermalLangevin}(Atoms(:H), Free(), 10; γ=0.1, temperature=25u"K")
 
 # output
@@ -27,7 +27,7 @@
   Atoms{Float64}([:H], [1], [1837.4715941070515])
  
   Free(1)
-  with 10 beads.
source

MappingVariableMethods

NQCDynamics.DynamicsMethods.MappingVariableMethods.NRPMDType
NRPMD{T} <: DynamicsMethods.Method

Nonadiabatic ring polymer molecular dynamics Uses Meyer-Miller-Stock-Thoss mapping variables for electronic degrees of freedom and ring polymer formalism for nuclear degrees of freedom.

RingPolymerSimulation{NRPMD}(Atoms(:H), DoubleWell(), 10)
+  with 10 beads.
source

MappingVariableMethods

NQCDynamics.DynamicsMethods.MappingVariableMethods.NRPMDType
NRPMD{T} <: DynamicsMethods.Method

Nonadiabatic ring polymer molecular dynamics Uses Meyer-Miller-Stock-Thoss mapping variables for electronic degrees of freedom and ring polymer formalism for nuclear degrees of freedom.

RingPolymerSimulation{NRPMD}(Atoms(:H), DoubleWell(), 10)
 
 # output
 
@@ -41,15 +41,15 @@
   γ: Int64 1
   Δ: Int64 1
  
-  with 10 beads.
source

SurfaceHoppingMethods

NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.BCMEType
BCME{T} <: ClassicalMasterEquation

Extension to CME that incorporates broadening in the potential energy surfaces.

Note that we do not rescale the velocity as this is not mentioned only in the 2016 paper, not any of the later ones, so I presume they later decided not to do it and instead keep it the same as the original CME.

  • Dou, Subotnik, J. Chem. Phys. 144, 024116 (2016)
  • Dou, Subotnik, J. Phys. Chem. A, 24, 757-771 (2020)
source

SurfaceHoppingMethods

NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.BCMEType
BCME{T} <: ClassicalMasterEquation

Extension to CME that incorporates broadening in the potential energy surfaces.

Note that we do not rescale the velocity as this is not mentioned only in the 2016 paper, not any of the later ones, so I presume they later decided not to do it and instead keep it the same as the original CME.

  • Dou, Subotnik, J. Chem. Phys. 144, 024116 (2016)
  • Dou, Subotnik, J. Phys. Chem. A, 24, 757-771 (2020)
source
NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.SurfaceHoppingType

Abstract type for all surface hopping methods.

Surface hopping methods follow the structure set out in this file. The nuclear and electronic variables are propagated by the motion! function. The surface hopping procedure is handled by the HoppingCallback which uses the functions check_hop! and execute_hop! as its condition and affect!.

To add a new surface hopping scheme, you must create a new struct and define methods for evaluate_hopping_probability!, select_new_state, and rescale_velocity!.

See fssh.jl for an example implementation.

source
NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.SurfaceHoppingType

Abstract type for all surface hopping methods.

Surface hopping methods follow the structure set out in this file. The nuclear and electronic variables are propagated by the motion! function. The surface hopping procedure is handled by the HoppingCallback which uses the functions check_hop! and execute_hop! as its condition and affect!.

To add a new surface hopping scheme, you must create a new struct and define methods for evaluate_hopping_probability!, select_new_state, and rescale_velocity!.

See fssh.jl for an example implementation.

source
NQCDynamics.DynamicsUtils.set_quantum_derivative!Method

Propagation of electronic wave function happens according to Eq. (14) in the Shenvi, Tully paper (JCP 2009)

In IESH each electron is independent so we can loop through electrons and set the derivative one at a time, in the standard way for FSSH.

source

EhrenfestMethods

NQCDynamics.DynamicsUtils.set_quantum_derivative!Method

Propagation of electronic wave function happens according to Eq. (14) in the Shenvi, Tully paper (JCP 2009)

In IESH each electron is independent so we can loop through electrons and set the derivative one at a time, in the standard way for FSSH.

source

EhrenfestMethods

NQCDynamics.DynamicsMethods.EhrenfestMethods.EhrenfestType
Ehrenfest{T} <: AbstractEhrenfest

Ehrenfest molecular dynamics. Classical molecular dynamics where the force is derived by averaging contributions from multiple electronic states.

Simulation{Ehrenfest}(Atoms(:H), DoubleWell())
 
 # output
 
@@ -59,4 +59,4 @@
   mass: Int64 1
   ω: Int64 1
   γ: Int64 1
-  Δ: Int64 1
source

IntegrationAlgorithms

+ Δ: Int64 1
source

IntegrationAlgorithms

diff --git a/dev/api/NQCDynamics/dynamicsoutputs/index.html b/dev/api/NQCDynamics/dynamicsoutputs/index.html index f597a1559..a8167e3dc 100644 --- a/dev/api/NQCDynamics/dynamicsoutputs/index.html +++ b/dev/api/NQCDynamics/dynamicsoutputs/index.html @@ -1,2 +1,2 @@ -DynamicsOutputs · NQCDynamics.jl

DynamicsOutputs

Here are all the functions that you can specify in the output tuple when using run_dynamics. To add more, simply add a new function in the DynamicsOutputs module.

Internals

+DynamicsOutputs · NQCDynamics.jl

DynamicsOutputs

Here are all the functions that you can specify in the output tuple when using run_dynamics. To add more, simply add a new function in the DynamicsOutputs module.

Internals

diff --git a/dev/api/NQCDynamics/dynamicsutils/index.html b/dev/api/NQCDynamics/dynamicsutils/index.html index 722c22d78..74f610e45 100644 --- a/dev/api/NQCDynamics/dynamicsutils/index.html +++ b/dev/api/NQCDynamics/dynamicsutils/index.html @@ -1,3 +1,3 @@ -DynamicsUtils · NQCDynamics.jl

DynamicsUtils

NQCDynamics.DynamicsUtilsModule
DynamicsUtils

Utilities for dynamics simulations. Includes:

  • Basic dynamics variables functions
  • Density matrix dynamics functions
  • Standard callbacks to use during dynamics
  • Plotting recipes for outputs
source
NQCDynamics.DynamicsUtils.apply_interbead_coupling!Method
apply_interbead_coupling!(du::DynamicalVariables, u::DynamicalVariables,
-                          sim::RingPolymerSimulation)

Applies the force that arises from the harmonic springs between adjacent beads.

Only applies the force for atoms labelled as quantum within the RingPolymerParameters.

source
NQCDynamics.DynamicsUtils.divide_by_mass!Method
divide_by_mass!(dv, masses)

Divide the contents of dv by the masses. Assumes dv is an array of size (dofs, atoms) or (dofs, atoms, beads). masses is the vector of masses for each atom that matches length with the second dimension.

source
+DynamicsUtils · NQCDynamics.jl

DynamicsUtils

NQCDynamics.DynamicsUtilsModule
DynamicsUtils

Utilities for dynamics simulations. Includes:

  • Basic dynamics variables functions
  • Density matrix dynamics functions
  • Standard callbacks to use during dynamics
  • Plotting recipes for outputs
source
NQCDynamics.DynamicsUtils.apply_interbead_coupling!Method
apply_interbead_coupling!(du::DynamicalVariables, u::DynamicalVariables,
+                          sim::RingPolymerSimulation)

Applies the force that arises from the harmonic springs between adjacent beads.

Only applies the force for atoms labelled as quantum within the RingPolymerParameters.

source
NQCDynamics.DynamicsUtils.divide_by_mass!Method
divide_by_mass!(dv, masses)

Divide the contents of dv by the masses. Assumes dv is an array of size (dofs, atoms) or (dofs, atoms, beads). masses is the vector of masses for each atom that matches length with the second dimension.

source
diff --git a/dev/api/NQCDynamics/ensembles/index.html b/dev/api/NQCDynamics/ensembles/index.html index 63636bea9..4c2b9c5a0 100644 --- a/dev/api/NQCDynamics/ensembles/index.html +++ b/dev/api/NQCDynamics/ensembles/index.html @@ -1,5 +1,5 @@ -Ensembles · NQCDynamics.jl

Ensembles

NQCDynamics.EnsemblesModule
Ensembles

This module provides the main function run_dynamics. This serves to run multiple trajectories for a given simulation type, sampling from an initial distribution.

source
NQCDynamics.Ensembles.EnsembleSaverType
EnsembleSaver{F<:Tuple}

Store a tuple of functions with the signature f(sol) where sol is a DiffEq solution object. EnsembleSaver will evaluate each of these functions and return the result in a Dictionary.

source
NQCDynamics.Ensembles.run_dynamicsMethod
run_dynamics(sim::AbstractSimulation, tspan, distribution;
+Ensembles · NQCDynamics.jl

Ensembles

NQCDynamics.EnsemblesModule
Ensembles

This module provides the main function run_dynamics. This serves to run multiple trajectories for a given simulation type, sampling from an initial distribution.

source
NQCDynamics.Ensembles.EnsembleSaverType
EnsembleSaver{F<:Tuple}

Store a tuple of functions with the signature f(sol) where sol is a DiffEq solution object. EnsembleSaver will evaluate each of these functions and return the result in a Dictionary.

source
NQCDynamics.Ensembles.run_dynamicsMethod
run_dynamics(sim::AbstractSimulation, tspan, distribution;
     output,
     selection::Union{Nothing,AbstractVector}=nothing,
     reduction=AppendReduction(),
@@ -7,4 +7,4 @@
     algorithm=DynamicsMethods.select_algorithm(sim),
     trajectories=1,
     kwargs...
-    )

Run trajectories for timespan tspan sampling from distribution.

Keywords

  • output either a single function or a Tuple of functions with the signature f(sol, i) that takes the DifferentialEquations solution and returns the desired output quantity.
  • selection should be an AbstractVector containing the indices to sample from the distribution. By default, nothing leads to random sampling.
  • reduction defines how the data is reduced across trajectories. Options are AppendReduction(), MeanReduction(), SumReduction and FileReduction(filename).
  • ensemble_algorithm is the algorithm from DifferentialEquations which determines which form of parallelism is used.
  • algorithm is the algorithm used to integrate the equations of motion.
  • trajectories is the number of trajectories to perform.
  • kwargs... any additional keywords are passed to DifferentialEquations solve`.
source
+ )

Run trajectories for timespan tspan sampling from distribution.

Keywords

  • output either a single function or a Tuple of functions with the signature f(sol, i) that takes the DifferentialEquations solution and returns the desired output quantity.
  • selection should be an AbstractVector containing the indices to sample from the distribution. By default, nothing leads to random sampling.
  • reduction defines how the data is reduced across trajectories. Options are AppendReduction(), MeanReduction(), SumReduction and FileReduction(filename).
  • ensemble_algorithm is the algorithm from DifferentialEquations which determines which form of parallelism is used.
  • algorithm is the algorithm used to integrate the equations of motion.
  • trajectories is the number of trajectories to perform.
  • kwargs... any additional keywords are passed to DifferentialEquations solve`.
source
diff --git a/dev/api/NQCDynamics/estimators/index.html b/dev/api/NQCDynamics/estimators/index.html index 76c8703ea..b702a9178 100644 --- a/dev/api/NQCDynamics/estimators/index.html +++ b/dev/api/NQCDynamics/estimators/index.html @@ -1,2 +1,2 @@ -Estimators · NQCDynamics.jl

Estimators

NQCDynamics.Estimators.@estimateMacro
@estimate f(simulation, vector)

Evaluate f(simulation, vector[i]) for all i and return the average.

Can be used for any function defined in Estimators.jl.

source
+Estimators · NQCDynamics.jl

Estimators

NQCDynamics.Estimators.@estimateMacro
@estimate f(simulation, vector)

Evaluate f(simulation, vector[i]) for all i and return the average.

Can be used for any function defined in Estimators.jl.

source
diff --git a/dev/api/NQCDynamics/initialconditions/index.html b/dev/api/NQCDynamics/initialconditions/index.html index 7a0853c0d..574a1a6ca 100644 --- a/dev/api/NQCDynamics/initialconditions/index.html +++ b/dev/api/NQCDynamics/initialconditions/index.html @@ -1,6 +1,6 @@ -InitialConditions · NQCDynamics.jl

InitialConditions

ThermalMonteCarlo

NQCDynamics.InitialConditions.ThermalMonteCarlo.run_advancedmh_samplingMethod
run_advancedhmc_sampling(sim, r, steps, σ; move_ratio=0.0, internal_ratio=0.0)

Sample the configuration space for the simulation sim starting from r.

Total number of steps is given by steps and σ is the dictionary of step sizes for each species.

move_ratio defaults to 0.0 and denotes the fraction of system moved each step. If move_ratio = 0, every degree of freedom is moved at each step. If move_ratio = 1, then nothing will happen. Experiment with this parameter to achieve optimal sampling.

internal_ratio works as for move_ratio but for the internal modes of the ring polymer.

source

QuantisedDiatomic

NQCDynamics.InitialConditions.QuantisedDiatomicModule
QuantisedDiatomic

This module exports two user facing functions:

  • generate_configurations Creates a set of velocities and positions for diatomic molecule with specified vibrational ν and rotational J quantum numbers.

  • quantise_diatomic Obtains vibrational ν and rotational J quantum numbers for a diatomic molecule with a given set of velocities and positions.

The central concept of this module is the EBK procedure which is nicely detailed here: Andrew J. Larkoski, David G. Ellis, Lorenzo J. Curtis (2006)

Inspired by VENUS96: William L Hase, Ronald J Duchovic, Xiche Hu, Andrew Komornicki, Kieran F Lim, Da-hong Lu, Gilles H Peslherbe, Kandadai N Swamy, SR Vande Linde, Antonio Varandas, others (1996)

source
NQCDynamics.InitialConditions.QuantisedDiatomic.calculate_diatomic_energyMethod
calculate_diatomic_energy(model::AdiabaticModel, bond_length::Real;
-    height=10, normal_vector=[0, 0, 1])

Returns potential energy of diatomic with bond_length at height from surface.

Orients molecule parallel to the surface at the specified height, the surface is assumed to intersect the origin. This requires that the model implicitly provides the surface, or works fine without one.

source
NQCDynamics.InitialConditions.QuantisedDiatomic.generate_configurationsMethod
generate_configurations(sim, ν, J; samples=1000, height=10, normal_vector=[0, 0, 1],
-    translational_energy=0, direction=[0, 0, -1], position=[0, 0, height])

Generate positions and momenta for given quantum numbers

translational_energy, direction and position specify the kinetic energy in a specific direction with the molecule placed with centre of mass at position.

Keyword arguments height and normal_vector become relevant if the potential requires specific placement of the molecule. These allow the molecule to be placed at a distance height in the direction normal_vector when performing potential evaluations.

source
NQCDynamics.InitialConditions.QuantisedDiatomic.quantise_diatomicMethod
quantise_diatomic(sim::Simulation, v::Matrix, r::Matrix;
-    height=10, normal_vector=[0, 0, 1])

Quantise the vibrational and rotational degrees of freedom for the specified positions and velocities

When evaluating the potential, the molecule is moved to height in direction normal_vector. If the potential is independent of centre of mass position, this has no effect. Otherwise, be sure to modify these parameters to give the intended behaviour.

source

MetropolisHastings

NQCDynamics.InitialConditions.MetropolisHastingsModule
MetropolisHastings

Sampling of the initial conditions using the Metropolis-Hastings Markov chain Monte Carlo method.

Included within is the ability to sample the canonical distribution for adiabatic classical and ring polymer systems.

Usage involves creating an instance of an AbstractSystem{MonteCarlo} and calling run_monte_carlo_sampling.

source
+InitialConditions · NQCDynamics.jl

InitialConditions

ThermalMonteCarlo

NQCDynamics.InitialConditions.ThermalMonteCarlo.run_advancedmh_samplingMethod
run_advancedhmc_sampling(sim, r, steps, σ; move_ratio=0.0, internal_ratio=0.0)

Sample the configuration space for the simulation sim starting from r.

Total number of steps is given by steps and σ is the dictionary of step sizes for each species.

move_ratio defaults to 0.0 and denotes the fraction of system moved each step. If move_ratio = 0, every degree of freedom is moved at each step. If move_ratio = 1, then nothing will happen. Experiment with this parameter to achieve optimal sampling.

internal_ratio works as for move_ratio but for the internal modes of the ring polymer.

source

QuantisedDiatomic

NQCDynamics.InitialConditions.QuantisedDiatomicModule
QuantisedDiatomic

This module exports two user facing functions:

  • generate_configurations Creates a set of velocities and positions for diatomic molecule with specified vibrational ν and rotational J quantum numbers.

  • quantise_diatomic Obtains vibrational ν and rotational J quantum numbers for a diatomic molecule with a given set of velocities and positions.

The central concept of this module is the EBK procedure which is nicely detailed here: [4]

Inspired by VENUS96: [28]

source
NQCDynamics.InitialConditions.QuantisedDiatomic.calculate_diatomic_energyMethod
calculate_diatomic_energy(model::AdiabaticModel, bond_length::Real;
+    height=10, normal_vector=[0, 0, 1])

Returns potential energy of diatomic with bond_length at height from surface.

Orients molecule parallel to the surface at the specified height, the surface is assumed to intersect the origin. This requires that the model implicitly provides the surface, or works fine without one.

source
NQCDynamics.InitialConditions.QuantisedDiatomic.generate_configurationsMethod
generate_configurations(sim, ν, J; samples=1000, height=10, normal_vector=[0, 0, 1],
+    translational_energy=0, direction=[0, 0, -1], position=[0, 0, height])

Generate positions and momenta for given quantum numbers

translational_energy, direction and position specify the kinetic energy in a specific direction with the molecule placed with centre of mass at position.

Keyword arguments height and normal_vector become relevant if the potential requires specific placement of the molecule. These allow the molecule to be placed at a distance height in the direction normal_vector when performing potential evaluations.

source
NQCDynamics.InitialConditions.QuantisedDiatomic.quantise_diatomicMethod
quantise_diatomic(sim::Simulation, v::Matrix, r::Matrix;
+    height=10, normal_vector=[0, 0, 1])

Quantise the vibrational and rotational degrees of freedom for the specified positions and velocities

When evaluating the potential, the molecule is moved to height in direction normal_vector. If the potential is independent of centre of mass position, this has no effect. Otherwise, be sure to modify these parameters to give the intended behaviour.

source

MetropolisHastings

NQCDynamics.InitialConditions.MetropolisHastingsModule
MetropolisHastings

Sampling of the initial conditions using the Metropolis-Hastings Markov chain Monte Carlo method.

Included within is the ability to sample the canonical distribution for adiabatic classical and ring polymer systems.

Usage involves creating an instance of an AbstractSystem{MonteCarlo} and calling run_monte_carlo_sampling.

source
diff --git a/dev/api/NQCDynamics/nonadiabaticmoleculardynamics/index.html b/dev/api/NQCDynamics/nonadiabaticmoleculardynamics/index.html index ac5a3249c..fff0ff4b9 100644 --- a/dev/api/NQCDynamics/nonadiabaticmoleculardynamics/index.html +++ b/dev/api/NQCDynamics/nonadiabaticmoleculardynamics/index.html @@ -1,3 +1,3 @@ -NQCDynamics · NQCDynamics.jl

NQCDynamics

NQCDynamics.SimulationMethod
Simulation(atoms::Atoms{T}, model::Model, method::M;
-    temperature=0u"K", cell::AbstractCell=InfiniteCell()) where {M,S,T}

Simulation parameters that controls the types of atoms, interactions, dynamics method, temperature and simulation cell.

source
+NQCDynamics · NQCDynamics.jl

NQCDynamics

NQCDynamics.SimulationMethod
Simulation(atoms::Atoms{T}, model::Model, method::M;
+    temperature=0u"K", cell::AbstractCell=InfiniteCell()) where {M,S,T}

Simulation parameters that controls the types of atoms, interactions, dynamics method, temperature and simulation cell.

source
diff --git a/dev/api/NQCDynamics/numericutils/index.html b/dev/api/NQCDynamics/numericutils/index.html index 9665f6af8..61159b85d 100644 --- a/dev/api/NQCDynamics/numericutils/index.html +++ b/dev/api/NQCDynamics/numericutils/index.html @@ -1,2 +1,2 @@ -Numerical utilities · NQCDynamics.jl

Numerical utilities

NQCDynamics.FastDeterminantModule
FastDeterminant

When computing many determinants in a loop the allocation and GC of the temporary arrays for the pivots and workspace can contribute a large portion of the total runtime.

Using FastLapackInterface we can reduce the allocations and improve the runtime performance.

source
+Numerical utilities · NQCDynamics.jl

Numerical utilities

NQCDynamics.FastDeterminantModule
FastDeterminant

When computing many determinants in a loop the allocation and GC of the temporary arrays for the pivots and workspace can contribute a large portion of the total runtime.

Using FastLapackInterface we can reduce the allocations and improve the runtime performance.

source
diff --git a/dev/api/NQCDynamics/ringpolymers/index.html b/dev/api/NQCDynamics/ringpolymers/index.html index 465b6b9b5..1c24a64bc 100644 --- a/dev/api/NQCDynamics/ringpolymers/index.html +++ b/dev/api/NQCDynamics/ringpolymers/index.html @@ -1,2 +1,2 @@ -RingPolymers · NQCDynamics.jl

RingPolymers

+RingPolymers · NQCDynamics.jl

RingPolymers

diff --git a/dev/api/NQCDynamics/timecorrelationfunctions/index.html b/dev/api/NQCDynamics/timecorrelationfunctions/index.html index 8a2b2cfc5..a84fd871b 100644 --- a/dev/api/NQCDynamics/timecorrelationfunctions/index.html +++ b/dev/api/NQCDynamics/timecorrelationfunctions/index.html @@ -1,2 +1,2 @@ -TimeCorrelationFunctions · NQCDynamics.jl

TimeCorrelationFunctions

NQCDynamics.TimeCorrelationFunctionsModule
TimeCorrelationFunctions

This module defines extra types that can be used as Ensemble outputs when computing time-correlation functions. It hopes to provide a minimal interface that reduces code repetition when implementing different correlation functions.

source
NQCDynamics.TimeCorrelationFunctions.PopulationCorrelationFunctionType
PopulationCorrelationFunction{T,S<:AbstractSimulation} <: TimeCorrelationFunction

Output type for computing the population correlation function. The statetype determines the population type (diabatic or adiabatic). sim must also be provided to access the parameters to compute the population.

source
+TimeCorrelationFunctions · NQCDynamics.jl

TimeCorrelationFunctions

NQCDynamics.TimeCorrelationFunctionsModule
TimeCorrelationFunctions

This module defines extra types that can be used as Ensemble outputs when computing time-correlation functions. It hopes to provide a minimal interface that reduces code repetition when implementing different correlation functions.

source
NQCDynamics.TimeCorrelationFunctions.PopulationCorrelationFunctionType
PopulationCorrelationFunction{T,S<:AbstractSimulation} <: TimeCorrelationFunction

Output type for computing the population correlation function. The statetype determines the population type (diabatic or adiabatic). sim must also be provided to access the parameters to compute the population.

source
diff --git a/dev/api/NQCModels/adiabaticmodels/index.html b/dev/api/NQCModels/adiabaticmodels/index.html index d2bc9a303..aa99b836f 100644 --- a/dev/api/NQCModels/adiabaticmodels/index.html +++ b/dev/api/NQCModels/adiabaticmodels/index.html @@ -1,5 +1,5 @@ -AdiabaticModels · NQCDynamics.jl

AdiabaticModels

NQCModels.AdiabaticModelsModule
AdiabaticModels

All models defined within this module have only a single electronic state and return potentials as scalars and derivatives as simple arrays.

The central abstract type is the AdiabaticModel, which all models should subtype.

source
NQCModels.AdiabaticModels.AdiabaticASEModelType
AdiabaticASEModel{A} <: AdiabaticModel

Wrapper for an ase.Atoms object that has a calculator attached. This will synchronise the positions with the ase object and handle the unit conversions.

Implements both potential and derivative!.

source
NQCModels.AdiabaticModels.AdiabaticModelType
AdiabaticModel <: Model

AdiabaticModels represent the potentials from classical molecular dynamics where the potential is a function of the position.

Implementation

AdiabaticModels should implement:

  • potential(model, R)
  • derivative!(model, D, R) (this is the derivative of the potential energy with respect to the positions)
  • ndofs(model) (these are the degrees of freedom)

Example

This example creates a 2 dimensional adiabatic model MyModel. We implement the 3 compulsory functions then evaluate the potential. Here, the argument R is an AbstractMatrix since this is a 2D model that can accept multiple atoms.

struct MyModel{P} <: NQCModels.AdiabaticModels.AdiabaticModel
+AdiabaticModels · NQCDynamics.jl

AdiabaticModels

NQCModels.AdiabaticModelsModule
AdiabaticModels

All models defined within this module have only a single electronic state and return potentials as scalars and derivatives as simple arrays.

The central abstract type is the AdiabaticModel, which all models should subtype.

source
NQCModels.AdiabaticModels.AdiabaticASEModelType
AdiabaticASEModel{A} <: AdiabaticModel

Wrapper for an ase.Atoms object that has a calculator attached. This will synchronise the positions with the ase object and handle the unit conversions.

Implements both potential and derivative!.

source
NQCModels.AdiabaticModels.AdiabaticModelType
AdiabaticModel <: Model

AdiabaticModels represent the potentials from classical molecular dynamics where the potential is a function of the position.

Implementation

AdiabaticModels should implement:

  • potential(model, R)
  • derivative!(model, D, R) (this is the derivative of the potential energy with respect to the positions)
  • ndofs(model) (these are the degrees of freedom)

Example

This example creates a 2 dimensional adiabatic model MyModel. We implement the 3 compulsory functions then evaluate the potential. Here, the argument R is an AbstractMatrix since this is a 2D model that can accept multiple atoms.

struct MyModel{P} <: NQCModels.AdiabaticModels.AdiabaticModel
     param::P
 end
 
@@ -35,4 +35,4 @@
 
 julia> derivative(model, hcat(x))
 1×1 Matrix{Num}:
- m*(x - r₀)*(ω^2)
source
+ m*(x - r₀)*(ω^2)
source
diff --git a/dev/api/NQCModels/cubeldfamodel/index.html b/dev/api/NQCModels/cubeldfamodel/index.html index 872e8d168..b52c1c1c3 100644 --- a/dev/api/NQCModels/cubeldfamodel/index.html +++ b/dev/api/NQCModels/cubeldfamodel/index.html @@ -1,4 +1,4 @@ -CubeLDFAModel · NQCDynamics.jl

CubeLDFAModel

CubeLDFAModel.CubeLDFAModelModule

This uses a cube file to attach friction coefficients to existing models by fitting the data provided by Gerrits et al. in PHYSICAL REVIEW B 102, 155130 (2020).

CubeLDFAModel.LDFAModelType
LDFAModel(model::Model, filename, atoms, cell;
+CubeLDFAModel · NQCDynamics.jl

CubeLDFAModel

CubeLDFAModel.CubeLDFAModelModule

This uses a cube file to attach friction coefficients to existing models by fitting the data provided by Gerrits et al. in PHYSICAL REVIEW B 102, 155130 (2020).

CubeLDFAModel.LDFAModelType
LDFAModel(model::Model, filename, atoms, cell;
           friction_atoms=collect(range(atoms)),
-          )

Wrapper for existing models that adds LDFA friction.

This model uses a cube file to evaluate the electron density used to calculate the friction. This model assumes that the cube file has units of bohr for the grid and cell distances, but provides the density in $Å^{-3}$, as is the default in FHI-aims.

+ )

Wrapper for existing models that adds LDFA friction.

This model uses a cube file to evaluate the electron density used to calculate the friction. This model assumes that the cube file has units of bohr for the grid and cell distances, but provides the density in $Å^{-3}$, as is the default in FHI-aims.

diff --git a/dev/api/NQCModels/diabaticmodels/index.html b/dev/api/NQCModels/diabaticmodels/index.html index 564b06543..736228c1d 100644 --- a/dev/api/NQCModels/diabaticmodels/index.html +++ b/dev/api/NQCModels/diabaticmodels/index.html @@ -1,5 +1,5 @@ -DiabaticModels · NQCDynamics.jl

DiabaticModels

NQCModels.DiabaticModels.BosonBathType
BosonBath(density::SpectralDensity, N::Integer)

Bosonic bath with given spectral density.

Useful for sampling the bath uncoupled from the spin for spin-boson dynamics.

source
NQCModels.DiabaticModels.DiabaticFrictionModelType
DiabaticFrictionModel <: LargeDiabaticModel

These models are defined identically to the LargeDiabaticModel but allocate extra temporary arrays when used with NQCDynamics.jl.

This allows for the calculation of electronic friction internally from the diabatic potential after diagonalisation and calculation of nonadiabatic couplings.

source
NQCModels.DiabaticModels.DiabaticModelType
DiabaticModel <: Model

DiabaticModels are used when a system has multiple electronic states that are presented in the diabatic representation. This is the case for the majority of model systems.

Implementation

DiabaticModels should implement:

  • potential(model, R)
  • derivative!(model, D, R)
  • nstates(model)
  • ndofs(model)

Example

In this example we create a simple 2 state, 1 dimensional diabatic model MyModel. As noted above, we implement the 4 relevant functions then evaluate the potential. Since this is a 1D model the argument R accepts a Real value.

using StaticArrays: SMatrix
+DiabaticModels · NQCDynamics.jl

DiabaticModels

NQCModels.DiabaticModels.BosonBathType
BosonBath(density::SpectralDensity, N::Integer)

Bosonic bath with given spectral density.

Useful for sampling the bath uncoupled from the spin for spin-boson dynamics.

source
NQCModels.DiabaticModels.DiabaticFrictionModelType
DiabaticFrictionModel <: LargeDiabaticModel

These models are defined identically to the LargeDiabaticModel but allocate extra temporary arrays when used with NQCDynamics.jl.

This allows for the calculation of electronic friction internally from the diabatic potential after diagonalisation and calculation of nonadiabatic couplings.

source
NQCModels.DiabaticModels.DiabaticModelType
DiabaticModel <: Model

DiabaticModels are used when a system has multiple electronic states that are presented in the diabatic representation. This is the case for the majority of model systems.

Implementation

DiabaticModels should implement:

  • potential(model, R)
  • derivative!(model, D, R)
  • nstates(model)
  • ndofs(model)

Example

In this example we create a simple 2 state, 1 dimensional diabatic model MyModel. As noted above, we implement the 4 relevant functions then evaluate the potential. Since this is a 1D model the argument R accepts a Real value.

using StaticArrays: SMatrix
 using LinearAlgebra: Hermitian
 
 struct MyModel <: NQCModels.DiabaticModels.DiabaticModel end
@@ -25,4 +25,4 @@
 
 2×2 Hermitian{Int64, SMatrix{2, 2, Int64, 4}}:
  10    1
-  1  -10
source
NQCModels.DiabaticModels.ErpenbeckThossType
struct ErpenbeckThoss{T<:AbstractFloat} <: DiabaticModel

1D two-state diabatic system capable of modelling a molecule adsorbed on a metal surface or a single-molecule junction.

In the two references, all of the parameters are identical except for the particle mass m and the vertical shift c applied to the ϵ₀ state. Both references modify the shift to ensure the quantum ground-state has an energy of 0 eV. Note that the mass m is specified in atomic mass units (amu) not atomic units. We calculate the offset automatically in the constructor from the Morse potential zero-point energy.

References

  • PHYSICAL REVIEW B 97, 235452 (2018)
  • J. Chem. Phys. 151, 191101 (2019)
source
NQCModels.DiabaticModels.FullGaussLegendreType
FullGaussLegendre{T} <: WideBandBathDiscretisation

Use Gauss-Legendre quadrature to discretise the continuum across the entire band width. This is similar to the ShenviGaussLegendre except that splits the continuum at the Fermi level into two halves.

source
NQCModels.DiabaticModels.LargeDiabaticModelType
LargeDiabaticModel <: DiabaticModel

Same as the DiabaticModels but uses normal Julia arrays instead of StaticArrays and must implement the inplace potential! rather than potential. This is useful when nstates is very large and StaticArrays are no longer efficient.

source
NQCModels.DiabaticModels.MiaoSubotnikType
MiaoSubotnik{T<:AbstractFloat} <: DiabaticModel

Double well model with parameters matching those of Miao and Subotnik in the reference. This model should be paired with the AndersonHolstein model to couple to the bath of metallic states.

References

  • J. Chem. Phys. 150, 041711 (2019)
source
NQCModels.DiabaticModels.ReferenceGaussLegendreType
ReferenceGaussLegendre{T}

Implementation translated from Fortran code used for simulations of Shenvi et al. in J. Chem. Phys. 130, 174107 (2009). Two differences from ShenviGaussLegendre:

  • Position of minus sign in energy levels has been corrected.
  • Division by sqrt(ΔE) in the coupling.
source
NQCModels.DiabaticModels.ShenviGaussLegendreType
ShenviGaussLegendre{T}

Defined as described by Shenvi et al. in J. Chem. Phys. 130, 174107 (2009). The position of the negative sign for the state energy level has been moved to ensure the states are sorted from lowest to highest.

source
+ 1 -10
source
NQCModels.DiabaticModels.ErpenbeckThossType
struct ErpenbeckThoss{T<:AbstractFloat} <: DiabaticModel

1D two-state diabatic system capable of modelling a molecule adsorbed on a metal surface or a single-molecule junction.

In the two references, all of the parameters are identical except for the particle mass m and the vertical shift c applied to the ϵ₀ state. Both references modify the shift to ensure the quantum ground-state has an energy of 0 eV. Note that the mass m is specified in atomic mass units (amu) not atomic units. We calculate the offset automatically in the constructor from the Morse potential zero-point energy.

References

  • PHYSICAL REVIEW B 97, 235452 (2018)
  • J. Chem. Phys. 151, 191101 (2019)
source
NQCModels.DiabaticModels.FullGaussLegendreType
FullGaussLegendre{T} <: WideBandBathDiscretisation

Use Gauss-Legendre quadrature to discretise the continuum across the entire band width. This is similar to the ShenviGaussLegendre except that splits the continuum at the Fermi level into two halves.

source
NQCModels.DiabaticModels.LargeDiabaticModelType
LargeDiabaticModel <: DiabaticModel

Same as the DiabaticModels but uses normal Julia arrays instead of StaticArrays and must implement the inplace potential! rather than potential. This is useful when nstates is very large and StaticArrays are no longer efficient.

source
NQCModels.DiabaticModels.MiaoSubotnikType
MiaoSubotnik{T<:AbstractFloat} <: DiabaticModel

Double well model with parameters matching those of Miao and Subotnik in the reference. This model should be paired with the AndersonHolstein model to couple to the bath of metallic states.

References

  • J. Chem. Phys. 150, 041711 (2019)
source
NQCModels.DiabaticModels.ReferenceGaussLegendreType
ReferenceGaussLegendre{T}

Implementation translated from Fortran code used for simulations of Shenvi et al. in J. Chem. Phys. 130, 174107 (2009). Two differences from ShenviGaussLegendre:

  • Position of minus sign in energy levels has been corrected.
  • Division by sqrt(ΔE) in the coupling.
source
NQCModels.DiabaticModels.ShenviGaussLegendreType
ShenviGaussLegendre{T}

Defined as described by Shenvi et al. in J. Chem. Phys. 130, 174107 (2009). The position of the negative sign for the state energy level has been moved to ensure the states are sorted from lowest to highest.

source
diff --git a/dev/api/NQCModels/frictionmodels/index.html b/dev/api/NQCModels/frictionmodels/index.html index 4cf38c22c..f9693c3d5 100644 --- a/dev/api/NQCModels/frictionmodels/index.html +++ b/dev/api/NQCModels/frictionmodels/index.html @@ -1,2 +1,2 @@ -FrictionModels · NQCDynamics.jl

FrictionModels

NQCModels.FrictionModels.ASEFrictionProviderType
ASEFrictionProvider{A} <: ElectronicFrictionProvider

Obtain the electronic friction from an ASE calculator that implements get_friction_tensor. Assumes that the units of friction are "eV/Å/Å". Construct by passing the ase atoms object with the calculator already attached.

source
NQCModels.FrictionModels.AdiabaticFrictionModelType
AdiabaticFrictionModel <: AdiabaticModel

AdiabaticFrictionModels must implement potential!, derivative!, and friction!

potential! and friction! should be the same as for the AdiabaticModel.

friction! must fill an AbstractMatrix with size = (ndofs*natoms, ndofs*natoms).

source
NQCModels.FrictionModels.CompositeFrictionModelType
CompositeFrictionModel{M,F} <: AdiabaticFrictionModel

Combine an AdiabaticModel with an ElectronicFrictionProvider.

This allows for arbitrary composition of potentials and friction providers, such that any adiabatic model can be augmented with any form of electronic friction.

source
NQCModels.FrictionModels.friction!Function
friction!(model::AdiabaticFrictionModel, F, R:AbstractMatrix)

Fill F with the electronic friction as a function of the positions R.

This need only be implemented for AdiabaticFrictionModels.

source
+FrictionModels · NQCDynamics.jl

FrictionModels

NQCModels.FrictionModels.ASEFrictionProviderType
ASEFrictionProvider{A} <: ElectronicFrictionProvider

Obtain the electronic friction from an ASE calculator that implements get_friction_tensor. Assumes that the units of friction are "eV/Å/Å". Construct by passing the ase atoms object with the calculator already attached.

source
NQCModels.FrictionModels.AdiabaticFrictionModelType
AdiabaticFrictionModel <: AdiabaticModel

AdiabaticFrictionModels must implement potential!, derivative!, and friction!

potential! and friction! should be the same as for the AdiabaticModel.

friction! must fill an AbstractMatrix with size = (ndofs*natoms, ndofs*natoms).

source
NQCModels.FrictionModels.CompositeFrictionModelType
CompositeFrictionModel{M,F} <: AdiabaticFrictionModel

Combine an AdiabaticModel with an ElectronicFrictionProvider.

This allows for arbitrary composition of potentials and friction providers, such that any adiabatic model can be augmented with any form of electronic friction.

source
NQCModels.FrictionModels.friction!Function
friction!(model::AdiabaticFrictionModel, F, R:AbstractMatrix)

Fill F with the electronic friction as a function of the positions R.

This need only be implemented for AdiabaticFrictionModels.

source
diff --git a/dev/api/NQCModels/nninterfaces/index.html b/dev/api/NQCModels/nninterfaces/index.html index 7e10fec9b..0b69d1d41 100644 --- a/dev/api/NQCModels/nninterfaces/index.html +++ b/dev/api/NQCModels/nninterfaces/index.html @@ -1,2 +1,2 @@ -NNInterfaces · NQCDynamics.jl
+NNInterfaces · NQCDynamics.jl
diff --git a/dev/api/NQCModels/nonadiabaticmodels/index.html b/dev/api/NQCModels/nonadiabaticmodels/index.html index b9e6bc1a7..5f79e1917 100644 --- a/dev/api/NQCModels/nonadiabaticmodels/index.html +++ b/dev/api/NQCModels/nonadiabaticmodels/index.html @@ -1,2 +1,2 @@ -NQCModels · NQCDynamics.jl

NQCModels

NQCModels.NQCModelsModule

NQCModels define the potentials and derivatives that govern the dynamics of the particles. These can exist as analytic models or as interfaces to other codes.

source
NQCModels.ModelType

Top-level type for models.

Implementation

When adding new models, this should not be directly subtyped. Instead, depending on the intended functionality of the model, one of the child abstract types should be subtyped. If an appropriate type is not already available, a new abstract subtype should be created.

source
NQCModels.derivative!Method
derivative!(model::Model, D, R::AbstractMatrix)

Fill D with the derivative of the electronic potential as a function of the positions R.

This must be implemented for all models.

source
NQCModels.derivativeMethod
derivative(model::Model, R)

Allocating version of derivative!, this definition should be suitable for all models.

Implement zero_derivative to allocate an appropriate array then implement derivative! to fill the array.

source
NQCModels.ndofsMethod
ndofs(::Model)

Get the number of degrees of freedom for every atom in the model. Usually 1 or 3.

source
NQCModels.potential!Method
potential!(model::Model, V, R::AbstractMatrix)

In-place version of potential, used only when mutable arrays are preferred.

Currently used only for LargeDiabaticModels, see diabatic/DiabaticModels.jl.

source
NQCModels.potentialMethod
potential(model::Model, R::AbstractMatrix)

Evaluate the potential at position R for the given model.

source
+NQCModels · NQCDynamics.jl

NQCModels

NQCModels.NQCModelsModule

NQCModels define the potentials and derivatives that govern the dynamics of the particles. These can exist as analytic models or as interfaces to other codes.

source
NQCModels.ModelType

Top-level type for models.

Implementation

When adding new models, this should not be directly subtyped. Instead, depending on the intended functionality of the model, one of the child abstract types should be subtyped. If an appropriate type is not already available, a new abstract subtype should be created.

source
NQCModels.derivative!Method
derivative!(model::Model, D, R::AbstractMatrix)

Fill D with the derivative of the electronic potential as a function of the positions R.

This must be implemented for all models.

source
NQCModels.derivativeMethod
derivative(model::Model, R)

Allocating version of derivative!, this definition should be suitable for all models.

Implement zero_derivative to allocate an appropriate array then implement derivative! to fill the array.

source
NQCModels.ndofsMethod
ndofs(::Model)

Get the number of degrees of freedom for every atom in the model. Usually 1 or 3.

source
NQCModels.potential!Method
potential!(model::Model, V, R::AbstractMatrix)

In-place version of potential, used only when mutable arrays are preferred.

Currently used only for LargeDiabaticModels, see diabatic/DiabaticModels.jl.

source
NQCModels.potentialMethod
potential(model::Model, R::AbstractMatrix)

Evaluate the potential at position R for the given model.

source
diff --git a/dev/assets/citations.css b/dev/assets/citations.css new file mode 100644 index 000000000..4c6af0bb2 --- /dev/null +++ b/dev/assets/citations.css @@ -0,0 +1,18 @@ +.citation dl { + display: grid; + grid-template-columns: max-content auto; } +.citation dt { + grid-column-start: 1; } +.citation dd { + grid-column-start: 2; + margin-bottom: 0.75em; } +.citation ul { + padding: 0 0 2.25em 0; + margin: 0; + list-style: none;} +.citation ul li { + text-indent: -2.25em; + margin: 0.33em 0.5em 0.5em 2.25em;} +.citation ol li { + padding-left:0.75em;} + diff --git a/dev/assets/themes/documenter-dark.css b/dev/assets/themes/documenter-dark.css index 0bf1af7d5..c94a294dc 100644 --- a/dev/assets/themes/documenter-dark.css +++ b/dev/assets/themes/documenter-dark.css @@ -1,7702 +1,7 @@ -@charset "UTF-8"; -/* Font Awesome 5 mixin. Can be included in any rule that should render Font Awesome icons. */ -@keyframes spinAround { - from { - transform: rotate(0deg); } - to { - transform: rotate(359deg); } } - -html.theme--documenter-dark .tabs, html.theme--documenter-dark .pagination-previous, -html.theme--documenter-dark .pagination-next, -html.theme--documenter-dark .pagination-link, -html.theme--documenter-dark .pagination-ellipsis, html.theme--documenter-dark .breadcrumb, html.theme--documenter-dark .file, html.theme--documenter-dark .button, .is-unselectable, html.theme--documenter-dark .modal-close, html.theme--documenter-dark .delete { - -webkit-touch-callout: none; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; } - -html.theme--documenter-dark .navbar-link:not(.is-arrowless)::after, html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading)::after { - border: 3px solid transparent; - border-radius: 2px; - border-right: 0; - border-top: 0; - content: " "; - display: block; - height: 0.625em; - margin-top: -0.4375em; - pointer-events: none; - position: absolute; - top: 50%; - transform: rotate(-45deg); - transform-origin: center; - width: 0.625em; } - -html.theme--documenter-dark .admonition:not(:last-child), html.theme--documenter-dark .tabs:not(:last-child), html.theme--documenter-dark .message:not(:last-child), html.theme--documenter-dark .list:not(:last-child), html.theme--documenter-dark .level:not(:last-child), html.theme--documenter-dark .breadcrumb:not(:last-child), html.theme--documenter-dark .highlight:not(:last-child), html.theme--documenter-dark .block:not(:last-child), html.theme--documenter-dark .title:not(:last-child), -html.theme--documenter-dark .subtitle:not(:last-child), html.theme--documenter-dark .table-container:not(:last-child), html.theme--documenter-dark .table:not(:last-child), html.theme--documenter-dark .progress:not(:last-child), html.theme--documenter-dark .notification:not(:last-child), html.theme--documenter-dark .content:not(:last-child), html.theme--documenter-dark .box:not(:last-child) { - margin-bottom: 1.5rem; } - -html.theme--documenter-dark .modal-close, html.theme--documenter-dark .delete { - -moz-appearance: none; - -webkit-appearance: none; - background-color: rgba(10, 10, 10, 0.2); - border: none; - border-radius: 290486px; - cursor: pointer; - pointer-events: auto; - display: inline-block; - flex-grow: 0; - flex-shrink: 0; - font-size: 0; - height: 20px; - max-height: 20px; - max-width: 20px; - min-height: 20px; - min-width: 20px; - outline: none; - position: relative; - vertical-align: top; - width: 20px; } - html.theme--documenter-dark .modal-close::before, html.theme--documenter-dark .delete::before, html.theme--documenter-dark .modal-close::after, html.theme--documenter-dark .delete::after { - background-color: white; - content: ""; - display: block; - left: 50%; - position: absolute; - top: 50%; - transform: translateX(-50%) translateY(-50%) rotate(45deg); - transform-origin: center center; } - html.theme--documenter-dark .modal-close::before, html.theme--documenter-dark .delete::before { - height: 2px; - width: 50%; } - html.theme--documenter-dark .modal-close::after, html.theme--documenter-dark .delete::after { - height: 50%; - width: 2px; } - html.theme--documenter-dark .modal-close:hover, html.theme--documenter-dark .delete:hover, html.theme--documenter-dark .modal-close:focus, html.theme--documenter-dark .delete:focus { - background-color: rgba(10, 10, 10, 0.3); } - html.theme--documenter-dark .modal-close:active, html.theme--documenter-dark .delete:active { - background-color: rgba(10, 10, 10, 0.4); } - html.theme--documenter-dark .is-small.modal-close, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.modal-close, html.theme--documenter-dark .is-small.delete, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.delete { - height: 16px; - max-height: 16px; - max-width: 16px; - min-height: 16px; - min-width: 16px; - width: 16px; } - html.theme--documenter-dark .is-medium.modal-close, html.theme--documenter-dark .is-medium.delete { - height: 24px; - max-height: 24px; - max-width: 24px; - min-height: 24px; - min-width: 24px; - width: 24px; } - html.theme--documenter-dark .is-large.modal-close, html.theme--documenter-dark .is-large.delete { - height: 32px; - max-height: 32px; - max-width: 32px; - min-height: 32px; - min-width: 32px; - width: 32px; } - -html.theme--documenter-dark .control.is-loading::after, html.theme--documenter-dark .select.is-loading::after, html.theme--documenter-dark .loader, html.theme--documenter-dark .button.is-loading::after { - animation: spinAround 500ms infinite linear; - border: 2px solid #dbdee0; - border-radius: 290486px; - border-right-color: transparent; - border-top-color: transparent; - content: ""; - display: block; - height: 1em; - position: relative; - width: 1em; } - -html.theme--documenter-dark .hero-video, html.theme--documenter-dark .modal-background, html.theme--documenter-dark .modal, html.theme--documenter-dark .image.is-square img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-square img, -html.theme--documenter-dark .image.is-square .has-ratio, -html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-square .has-ratio, html.theme--documenter-dark .image.is-1by1 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by1 img, -html.theme--documenter-dark .image.is-1by1 .has-ratio, -html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by1 .has-ratio, html.theme--documenter-dark .image.is-5by4 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by4 img, -html.theme--documenter-dark .image.is-5by4 .has-ratio, -html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by4 .has-ratio, html.theme--documenter-dark .image.is-4by3 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by3 img, -html.theme--documenter-dark .image.is-4by3 .has-ratio, -html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by3 .has-ratio, html.theme--documenter-dark .image.is-3by2 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by2 img, -html.theme--documenter-dark .image.is-3by2 .has-ratio, -html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by2 .has-ratio, html.theme--documenter-dark .image.is-5by3 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by3 img, -html.theme--documenter-dark .image.is-5by3 .has-ratio, -html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by3 .has-ratio, html.theme--documenter-dark .image.is-16by9 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-16by9 img, -html.theme--documenter-dark .image.is-16by9 .has-ratio, -html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-16by9 .has-ratio, html.theme--documenter-dark .image.is-2by1 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by1 img, -html.theme--documenter-dark .image.is-2by1 .has-ratio, -html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by1 .has-ratio, html.theme--documenter-dark .image.is-3by1 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by1 img, -html.theme--documenter-dark .image.is-3by1 .has-ratio, -html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by1 .has-ratio, html.theme--documenter-dark .image.is-4by5 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by5 img, -html.theme--documenter-dark .image.is-4by5 .has-ratio, -html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by5 .has-ratio, html.theme--documenter-dark .image.is-3by4 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by4 img, -html.theme--documenter-dark .image.is-3by4 .has-ratio, -html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by4 .has-ratio, html.theme--documenter-dark .image.is-2by3 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by3 img, -html.theme--documenter-dark .image.is-2by3 .has-ratio, -html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by3 .has-ratio, html.theme--documenter-dark .image.is-3by5 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by5 img, -html.theme--documenter-dark .image.is-3by5 .has-ratio, -html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by5 .has-ratio, html.theme--documenter-dark .image.is-9by16 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-9by16 img, -html.theme--documenter-dark .image.is-9by16 .has-ratio, -html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-9by16 .has-ratio, html.theme--documenter-dark .image.is-1by2 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by2 img, -html.theme--documenter-dark .image.is-1by2 .has-ratio, -html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by2 .has-ratio, html.theme--documenter-dark .image.is-1by3 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by3 img, -html.theme--documenter-dark .image.is-1by3 .has-ratio, -html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by3 .has-ratio, .is-overlay { - bottom: 0; - left: 0; - position: absolute; - right: 0; - top: 0; } - -html.theme--documenter-dark .pagination-previous, -html.theme--documenter-dark .pagination-next, -html.theme--documenter-dark .pagination-link, -html.theme--documenter-dark .pagination-ellipsis, html.theme--documenter-dark .file-cta, -html.theme--documenter-dark .file-name, html.theme--documenter-dark .select select, html.theme--documenter-dark .textarea, html.theme--documenter-dark .input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input, html.theme--documenter-dark .button { - -moz-appearance: none; - -webkit-appearance: none; - align-items: center; - border: 1px solid transparent; - border-radius: 0.4em; - box-shadow: none; - display: inline-flex; - font-size: 15px; - height: 2.25em; - justify-content: flex-start; - line-height: 1.5; - padding-bottom: calc(0.375em - 1px); - padding-left: calc(0.625em - 1px); - padding-right: calc(0.625em - 1px); - padding-top: calc(0.375em - 1px); - position: relative; - vertical-align: top; } - html.theme--documenter-dark .pagination-previous:focus, - html.theme--documenter-dark .pagination-next:focus, - html.theme--documenter-dark .pagination-link:focus, - html.theme--documenter-dark .pagination-ellipsis:focus, html.theme--documenter-dark .file-cta:focus, - html.theme--documenter-dark .file-name:focus, html.theme--documenter-dark .select select:focus, html.theme--documenter-dark .textarea:focus, html.theme--documenter-dark .input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:focus, html.theme--documenter-dark .button:focus, html.theme--documenter-dark .is-focused.pagination-previous, - html.theme--documenter-dark .is-focused.pagination-next, - html.theme--documenter-dark .is-focused.pagination-link, - html.theme--documenter-dark .is-focused.pagination-ellipsis, html.theme--documenter-dark .is-focused.file-cta, - html.theme--documenter-dark .is-focused.file-name, html.theme--documenter-dark .select select.is-focused, html.theme--documenter-dark .is-focused.textarea, html.theme--documenter-dark .is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .is-focused.button, html.theme--documenter-dark .pagination-previous:active, - html.theme--documenter-dark .pagination-next:active, - html.theme--documenter-dark .pagination-link:active, - html.theme--documenter-dark .pagination-ellipsis:active, html.theme--documenter-dark .file-cta:active, - html.theme--documenter-dark .file-name:active, html.theme--documenter-dark .select select:active, html.theme--documenter-dark .textarea:active, html.theme--documenter-dark .input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:active, html.theme--documenter-dark .button:active, html.theme--documenter-dark .is-active.pagination-previous, - html.theme--documenter-dark .is-active.pagination-next, - html.theme--documenter-dark .is-active.pagination-link, - html.theme--documenter-dark .is-active.pagination-ellipsis, html.theme--documenter-dark .is-active.file-cta, - html.theme--documenter-dark .is-active.file-name, html.theme--documenter-dark .select select.is-active, html.theme--documenter-dark .is-active.textarea, html.theme--documenter-dark .is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active, html.theme--documenter-dark .is-active.button { - outline: none; } - html.theme--documenter-dark .pagination-previous[disabled], - html.theme--documenter-dark .pagination-next[disabled], - html.theme--documenter-dark .pagination-link[disabled], - html.theme--documenter-dark .pagination-ellipsis[disabled], html.theme--documenter-dark .file-cta[disabled], - html.theme--documenter-dark .file-name[disabled], html.theme--documenter-dark .select select[disabled], html.theme--documenter-dark .textarea[disabled], html.theme--documenter-dark .input[disabled], html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input[disabled], html.theme--documenter-dark .button[disabled], fieldset[disabled] html.theme--documenter-dark .pagination-previous, html.theme--documenter-dark fieldset[disabled] .pagination-previous, - fieldset[disabled] html.theme--documenter-dark .pagination-next, - html.theme--documenter-dark fieldset[disabled] .pagination-next, - fieldset[disabled] html.theme--documenter-dark .pagination-link, - html.theme--documenter-dark fieldset[disabled] .pagination-link, - fieldset[disabled] html.theme--documenter-dark .pagination-ellipsis, - html.theme--documenter-dark fieldset[disabled] .pagination-ellipsis, fieldset[disabled] html.theme--documenter-dark .file-cta, html.theme--documenter-dark fieldset[disabled] .file-cta, - fieldset[disabled] html.theme--documenter-dark .file-name, - html.theme--documenter-dark fieldset[disabled] .file-name, fieldset[disabled] html.theme--documenter-dark .select select, fieldset[disabled] html.theme--documenter-dark .textarea, fieldset[disabled] html.theme--documenter-dark .input, fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input, html.theme--documenter-dark fieldset[disabled] .select select, html.theme--documenter-dark .select fieldset[disabled] select, html.theme--documenter-dark fieldset[disabled] .textarea, html.theme--documenter-dark fieldset[disabled] .input, html.theme--documenter-dark fieldset[disabled] #documenter .docs-sidebar form.docs-search > input, html.theme--documenter-dark #documenter .docs-sidebar fieldset[disabled] form.docs-search > input, fieldset[disabled] html.theme--documenter-dark .button, html.theme--documenter-dark fieldset[disabled] .button { - cursor: not-allowed; } - -/*! minireset.css v0.0.4 | MIT License | github.com/jgthms/minireset.css */ -html, -body, -p, -ol, -ul, -li, -dl, -dt, -dd, -blockquote, -figure, -fieldset, -legend, -textarea, -pre, -iframe, -hr, -h1, -h2, -h3, -h4, -h5, -h6 { - margin: 0; - padding: 0; } - -h1, -h2, -h3, -h4, -h5, -h6 { - font-size: 100%; - font-weight: normal; } - -ul { - list-style: none; } - -button, -input, -select, -textarea { - margin: 0; } - -html { - box-sizing: border-box; } - -*, *::before, *::after { - box-sizing: inherit; } - -img, -embed, -iframe, -object, -video { - height: auto; - max-width: 100%; } - -audio { - max-width: 100%; } - -iframe { - border: 0; } - -table { - border-collapse: collapse; - border-spacing: 0; } - -td, -th { - padding: 0; } - td:not([align]), - th:not([align]) { - text-align: left; } - -.is-clearfix::after { - clear: both; - content: " "; - display: table; } - -.is-pulled-left { - float: left !important; } - -.is-pulled-right { - float: right !important; } - -.is-clipped { - overflow: hidden !important; } - -.is-size-1 { - font-size: 3rem !important; } - -.is-size-2 { - font-size: 2.5rem !important; } - -.is-size-3 { - font-size: 2rem !important; } - -.is-size-4 { - font-size: 1.5rem !important; } - -.is-size-5 { - font-size: 1.25rem !important; } - -.is-size-6 { - font-size: 15px !important; } - -.is-size-7, html.theme--documenter-dark .docstring > section > a.docs-sourcelink { - font-size: 0.85em !important; } - -@media screen and (max-width: 768px) { - .is-size-1-mobile { - font-size: 3rem !important; } - .is-size-2-mobile { - font-size: 2.5rem !important; } - .is-size-3-mobile { - font-size: 2rem !important; } - .is-size-4-mobile { - font-size: 1.5rem !important; } - .is-size-5-mobile { - font-size: 1.25rem !important; } - .is-size-6-mobile { - font-size: 15px !important; } - .is-size-7-mobile { - font-size: 0.85em !important; } } - -@media screen and (min-width: 769px), print { - .is-size-1-tablet { - font-size: 3rem !important; } - .is-size-2-tablet { - font-size: 2.5rem !important; } - .is-size-3-tablet { - font-size: 2rem !important; } - .is-size-4-tablet { - font-size: 1.5rem !important; } - .is-size-5-tablet { - font-size: 1.25rem !important; } - .is-size-6-tablet { - font-size: 15px !important; } - .is-size-7-tablet { - font-size: 0.85em !important; } } - -@media screen and (max-width: 1055px) { - .is-size-1-touch { - font-size: 3rem !important; } - .is-size-2-touch { - font-size: 2.5rem !important; } - .is-size-3-touch { - font-size: 2rem !important; } - .is-size-4-touch { - font-size: 1.5rem !important; } - .is-size-5-touch { - font-size: 1.25rem !important; } - .is-size-6-touch { - font-size: 15px !important; } - .is-size-7-touch { - font-size: 0.85em !important; } } - -@media screen and (min-width: 1056px) { - .is-size-1-desktop { - font-size: 3rem !important; } - .is-size-2-desktop { - font-size: 2.5rem !important; } - .is-size-3-desktop { - font-size: 2rem !important; } - .is-size-4-desktop { - font-size: 1.5rem !important; } - .is-size-5-desktop { - font-size: 1.25rem !important; } - .is-size-6-desktop { - font-size: 15px !important; } - .is-size-7-desktop { - font-size: 0.85em !important; } } - -@media screen and (min-width: 1216px) { - .is-size-1-widescreen { - font-size: 3rem !important; } - .is-size-2-widescreen { - font-size: 2.5rem !important; } - .is-size-3-widescreen { - font-size: 2rem !important; } - .is-size-4-widescreen { - font-size: 1.5rem !important; } - .is-size-5-widescreen { - font-size: 1.25rem !important; } - .is-size-6-widescreen { - font-size: 15px !important; } - .is-size-7-widescreen { - font-size: 0.85em !important; } } - -@media screen and (min-width: 1408px) { - .is-size-1-fullhd { - font-size: 3rem !important; } - .is-size-2-fullhd { - font-size: 2.5rem !important; } - .is-size-3-fullhd { - font-size: 2rem !important; } - .is-size-4-fullhd { - font-size: 1.5rem !important; } - .is-size-5-fullhd { - font-size: 1.25rem !important; } - .is-size-6-fullhd { - font-size: 15px !important; } - .is-size-7-fullhd { - font-size: 0.85em !important; } } - -.has-text-centered { - text-align: center !important; } - -.has-text-justified { - text-align: justify !important; } - -.has-text-left { - text-align: left !important; } - -.has-text-right { - text-align: right !important; } - -@media screen and (max-width: 768px) { - .has-text-centered-mobile { - text-align: center !important; } } - -@media screen and (min-width: 769px), print { - .has-text-centered-tablet { - text-align: center !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .has-text-centered-tablet-only { - text-align: center !important; } } - -@media screen and (max-width: 1055px) { - .has-text-centered-touch { - text-align: center !important; } } - -@media screen and (min-width: 1056px) { - .has-text-centered-desktop { - text-align: center !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .has-text-centered-desktop-only { - text-align: center !important; } } - -@media screen and (min-width: 1216px) { - .has-text-centered-widescreen { - text-align: center !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .has-text-centered-widescreen-only { - text-align: center !important; } } - -@media screen and (min-width: 1408px) { - .has-text-centered-fullhd { - text-align: center !important; } } - -@media screen and (max-width: 768px) { - .has-text-justified-mobile { - text-align: justify !important; } } - -@media screen and (min-width: 769px), print { - .has-text-justified-tablet { - text-align: justify !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .has-text-justified-tablet-only { - text-align: justify !important; } } - -@media screen and (max-width: 1055px) { - .has-text-justified-touch { - text-align: justify !important; } } - -@media screen and (min-width: 1056px) { - .has-text-justified-desktop { - text-align: justify !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .has-text-justified-desktop-only { - text-align: justify !important; } } - -@media screen and (min-width: 1216px) { - .has-text-justified-widescreen { - text-align: justify !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .has-text-justified-widescreen-only { - text-align: justify !important; } } - -@media screen and (min-width: 1408px) { - .has-text-justified-fullhd { - text-align: justify !important; } } - -@media screen and (max-width: 768px) { - .has-text-left-mobile { - text-align: left !important; } } - -@media screen and (min-width: 769px), print { - .has-text-left-tablet { - text-align: left !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .has-text-left-tablet-only { - text-align: left !important; } } - -@media screen and (max-width: 1055px) { - .has-text-left-touch { - text-align: left !important; } } - -@media screen and (min-width: 1056px) { - .has-text-left-desktop { - text-align: left !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .has-text-left-desktop-only { - text-align: left !important; } } - -@media screen and (min-width: 1216px) { - .has-text-left-widescreen { - text-align: left !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .has-text-left-widescreen-only { - text-align: left !important; } } - -@media screen and (min-width: 1408px) { - .has-text-left-fullhd { - text-align: left !important; } } - -@media screen and (max-width: 768px) { - .has-text-right-mobile { - text-align: right !important; } } - -@media screen and (min-width: 769px), print { - .has-text-right-tablet { - text-align: right !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .has-text-right-tablet-only { - text-align: right !important; } } - -@media screen and (max-width: 1055px) { - .has-text-right-touch { - text-align: right !important; } } - -@media screen and (min-width: 1056px) { - .has-text-right-desktop { - text-align: right !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .has-text-right-desktop-only { - text-align: right !important; } } - -@media screen and (min-width: 1216px) { - .has-text-right-widescreen { - text-align: right !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .has-text-right-widescreen-only { - text-align: right !important; } } - -@media screen and (min-width: 1408px) { - .has-text-right-fullhd { - text-align: right !important; } } - -.is-capitalized { - text-transform: capitalize !important; } - -.is-lowercase { - text-transform: lowercase !important; } - -.is-uppercase { - text-transform: uppercase !important; } - -.is-italic { - font-style: italic !important; } - -.has-text-white { - color: white !important; } - -a.has-text-white:hover, a.has-text-white:focus { - color: #e6e6e6 !important; } - -.has-background-white { - background-color: white !important; } - -.has-text-black { - color: #0a0a0a !important; } - -a.has-text-black:hover, a.has-text-black:focus { - color: black !important; } - -.has-background-black { - background-color: #0a0a0a !important; } - -.has-text-light { - color: #ecf0f1 !important; } - -a.has-text-light:hover, a.has-text-light:focus { - color: #cfd9db !important; } - -.has-background-light { - background-color: #ecf0f1 !important; } - -.has-text-dark { - color: #282f2f !important; } - -a.has-text-dark:hover, a.has-text-dark:focus { - color: #111414 !important; } - -.has-background-dark { - background-color: #282f2f !important; } - -.has-text-primary { - color: #375a7f !important; } - -a.has-text-primary:hover, a.has-text-primary:focus { - color: #28415b !important; } - -.has-background-primary { - background-color: #375a7f !important; } - -.has-text-link { - color: #1abc9c !important; } - -a.has-text-link:hover, a.has-text-link:focus { - color: #148f77 !important; } - -.has-background-link { - background-color: #1abc9c !important; } - -.has-text-info { - color: #024c7d !important; } - -a.has-text-info:hover, a.has-text-info:focus { - color: #012d4b !important; } - -.has-background-info { - background-color: #024c7d !important; } - -.has-text-success { - color: #008438 !important; } - -a.has-text-success:hover, a.has-text-success:focus { - color: #005122 !important; } - -.has-background-success { - background-color: #008438 !important; } - -.has-text-warning { - color: #ad8100 !important; } - -a.has-text-warning:hover, a.has-text-warning:focus { - color: #7a5b00 !important; } - -.has-background-warning { - background-color: #ad8100 !important; } - -.has-text-danger { - color: #9e1b0d !important; } - -a.has-text-danger:hover, a.has-text-danger:focus { - color: #6f1309 !important; } - -.has-background-danger { - background-color: #9e1b0d !important; } - -.has-text-black-bis { - color: #121212 !important; } - -.has-background-black-bis { - background-color: #121212 !important; } - -.has-text-black-ter { - color: #242424 !important; } - -.has-background-black-ter { - background-color: #242424 !important; } - -.has-text-grey-darker { - color: #282f2f !important; } - -.has-background-grey-darker { - background-color: #282f2f !important; } - -.has-text-grey-dark { - color: #343c3d !important; } - -.has-background-grey-dark { - background-color: #343c3d !important; } - -.has-text-grey { - color: #5e6d6f !important; } - -.has-background-grey { - background-color: #5e6d6f !important; } - -.has-text-grey-light { - color: #8c9b9d !important; } - -.has-background-grey-light { - background-color: #8c9b9d !important; } - -.has-text-grey-lighter { - color: #dbdee0 !important; } - -.has-background-grey-lighter { - background-color: #dbdee0 !important; } - -.has-text-white-ter { - color: #ecf0f1 !important; } - -.has-background-white-ter { - background-color: #ecf0f1 !important; } - -.has-text-white-bis { - color: #fafafa !important; } - -.has-background-white-bis { - background-color: #fafafa !important; } - -.has-text-weight-light { - font-weight: 300 !important; } - -.has-text-weight-normal { - font-weight: 400 !important; } - -.has-text-weight-medium { - font-weight: 500 !important; } - -.has-text-weight-semibold { - font-weight: 600 !important; } - -.has-text-weight-bold { - font-weight: 700 !important; } - -.is-family-primary { - font-family: "Lato Medium", -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", "Helvetica", "Arial", sans-serif !important; } - -.is-family-secondary { - font-family: "Lato Medium", -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", "Helvetica", "Arial", sans-serif !important; } - -.is-family-sans-serif { - font-family: "Lato Medium", -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", "Helvetica", "Arial", sans-serif !important; } - -.is-family-monospace { - font-family: "JuliaMono", "SFMono-Regular", "Menlo", "Consolas", "Liberation Mono", "DejaVu Sans Mono", monospace !important; } - -.is-family-code { - font-family: "JuliaMono", "SFMono-Regular", "Menlo", "Consolas", "Liberation Mono", "DejaVu Sans Mono", monospace !important; } - -.is-block { - display: block !important; } - -@media screen and (max-width: 768px) { - .is-block-mobile { - display: block !important; } } - -@media screen and (min-width: 769px), print { - .is-block-tablet { - display: block !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .is-block-tablet-only { - display: block !important; } } - -@media screen and (max-width: 1055px) { - .is-block-touch { - display: block !important; } } - -@media screen and (min-width: 1056px) { - .is-block-desktop { - display: block !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .is-block-desktop-only { - display: block !important; } } - -@media screen and (min-width: 1216px) { - .is-block-widescreen { - display: block !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .is-block-widescreen-only { - display: block !important; } } - -@media screen and (min-width: 1408px) { - .is-block-fullhd { - display: block !important; } } - -.is-flex { - display: flex !important; } - -@media screen and (max-width: 768px) { - .is-flex-mobile { - display: flex !important; } } - -@media screen and (min-width: 769px), print { - .is-flex-tablet { - display: flex !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .is-flex-tablet-only { - display: flex !important; } } - -@media screen and (max-width: 1055px) { - .is-flex-touch { - display: flex !important; } } - -@media screen and (min-width: 1056px) { - .is-flex-desktop { - display: flex !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .is-flex-desktop-only { - display: flex !important; } } - -@media screen and (min-width: 1216px) { - .is-flex-widescreen { - display: flex !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .is-flex-widescreen-only { - display: flex !important; } } - -@media screen and (min-width: 1408px) { - .is-flex-fullhd { - display: flex !important; } } - -.is-inline { - display: inline !important; } - -@media screen and (max-width: 768px) { - .is-inline-mobile { - display: inline !important; } } - -@media screen and (min-width: 769px), print { - .is-inline-tablet { - display: inline !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .is-inline-tablet-only { - display: inline !important; } } - -@media screen and (max-width: 1055px) { - .is-inline-touch { - display: inline !important; } } - -@media screen and (min-width: 1056px) { - .is-inline-desktop { - display: inline !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .is-inline-desktop-only { - display: inline !important; } } - -@media screen and (min-width: 1216px) { - .is-inline-widescreen { - display: inline !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .is-inline-widescreen-only { - display: inline !important; } } - -@media screen and (min-width: 1408px) { - .is-inline-fullhd { - display: inline !important; } } - -.is-inline-block { - display: inline-block !important; } - -@media screen and (max-width: 768px) { - .is-inline-block-mobile { - display: inline-block !important; } } - -@media screen and (min-width: 769px), print { - .is-inline-block-tablet { - display: inline-block !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .is-inline-block-tablet-only { - display: inline-block !important; } } - -@media screen and (max-width: 1055px) { - .is-inline-block-touch { - display: inline-block !important; } } - -@media screen and (min-width: 1056px) { - .is-inline-block-desktop { - display: inline-block !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .is-inline-block-desktop-only { - display: inline-block !important; } } - -@media screen and (min-width: 1216px) { - .is-inline-block-widescreen { - display: inline-block !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .is-inline-block-widescreen-only { - display: inline-block !important; } } - -@media screen and (min-width: 1408px) { - .is-inline-block-fullhd { - display: inline-block !important; } } - -.is-inline-flex { - display: inline-flex !important; } - -@media screen and (max-width: 768px) { - .is-inline-flex-mobile { - display: inline-flex !important; } } - -@media screen and (min-width: 769px), print { - .is-inline-flex-tablet { - display: inline-flex !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .is-inline-flex-tablet-only { - display: inline-flex !important; } } - -@media screen and (max-width: 1055px) { - .is-inline-flex-touch { - display: inline-flex !important; } } - -@media screen and (min-width: 1056px) { - .is-inline-flex-desktop { - display: inline-flex !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .is-inline-flex-desktop-only { - display: inline-flex !important; } } - -@media screen and (min-width: 1216px) { - .is-inline-flex-widescreen { - display: inline-flex !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .is-inline-flex-widescreen-only { - display: inline-flex !important; } } - -@media screen and (min-width: 1408px) { - .is-inline-flex-fullhd { - display: inline-flex !important; } } - -.is-hidden { - display: none !important; } - -.is-sr-only { - border: none !important; - clip: rect(0, 0, 0, 0) !important; - height: 0.01em !important; - overflow: hidden !important; - padding: 0 !important; - position: absolute !important; - white-space: nowrap !important; - width: 0.01em !important; } - -@media screen and (max-width: 768px) { - .is-hidden-mobile { - display: none !important; } } - -@media screen and (min-width: 769px), print { - .is-hidden-tablet { - display: none !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .is-hidden-tablet-only { - display: none !important; } } - -@media screen and (max-width: 1055px) { - .is-hidden-touch { - display: none !important; } } - -@media screen and (min-width: 1056px) { - .is-hidden-desktop { - display: none !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .is-hidden-desktop-only { - display: none !important; } } - -@media screen and (min-width: 1216px) { - .is-hidden-widescreen { - display: none !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .is-hidden-widescreen-only { - display: none !important; } } - -@media screen and (min-width: 1408px) { - .is-hidden-fullhd { - display: none !important; } } - -.is-invisible { - visibility: hidden !important; } - -@media screen and (max-width: 768px) { - .is-invisible-mobile { - visibility: hidden !important; } } - -@media screen and (min-width: 769px), print { - .is-invisible-tablet { - visibility: hidden !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .is-invisible-tablet-only { - visibility: hidden !important; } } - -@media screen and (max-width: 1055px) { - .is-invisible-touch { - visibility: hidden !important; } } - -@media screen and (min-width: 1056px) { - .is-invisible-desktop { - visibility: hidden !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .is-invisible-desktop-only { - visibility: hidden !important; } } - -@media screen and (min-width: 1216px) { - .is-invisible-widescreen { - visibility: hidden !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .is-invisible-widescreen-only { - visibility: hidden !important; } } - -@media screen and (min-width: 1408px) { - .is-invisible-fullhd { - visibility: hidden !important; } } - -.is-marginless { - margin: 0 !important; } - -.is-paddingless { - padding: 0 !important; } - -.is-radiusless { - border-radius: 0 !important; } - -.is-shadowless { - box-shadow: none !important; } - -.is-relative { - position: relative !important; } - -html.theme--documenter-dark { - /* This file contain the overall layout. - * - * The main container is
that is identified by id #documenter. - */ - /*! +@keyframes spinAround{from{transform:rotate(0deg)}to{transform:rotate(359deg)}}html.theme--documenter-dark .tabs,html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark .breadcrumb,html.theme--documenter-dark .file,html.theme--documenter-dark .button,.is-unselectable,html.theme--documenter-dark .modal-close,html.theme--documenter-dark .delete{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}html.theme--documenter-dark .navbar-link:not(.is-arrowless)::after,html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading)::after{border:3px solid rgba(0,0,0,0);border-radius:2px;border-right:0;border-top:0;content:" ";display:block;height:0.625em;margin-top:-0.4375em;pointer-events:none;position:absolute;top:50%;transform:rotate(-45deg);transform-origin:center;width:0.625em}html.theme--documenter-dark .admonition:not(:last-child),html.theme--documenter-dark .tabs:not(:last-child),html.theme--documenter-dark .message:not(:last-child),html.theme--documenter-dark .list:not(:last-child),html.theme--documenter-dark .level:not(:last-child),html.theme--documenter-dark .breadcrumb:not(:last-child),html.theme--documenter-dark .highlight:not(:last-child),html.theme--documenter-dark .block:not(:last-child),html.theme--documenter-dark .title:not(:last-child),html.theme--documenter-dark .subtitle:not(:last-child),html.theme--documenter-dark .table-container:not(:last-child),html.theme--documenter-dark .table:not(:last-child),html.theme--documenter-dark .progress:not(:last-child),html.theme--documenter-dark .notification:not(:last-child),html.theme--documenter-dark .content:not(:last-child),html.theme--documenter-dark .box:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .modal-close,html.theme--documenter-dark .delete{-moz-appearance:none;-webkit-appearance:none;background-color:rgba(10,10,10,0.2);border:none;border-radius:290486px;cursor:pointer;pointer-events:auto;display:inline-block;flex-grow:0;flex-shrink:0;font-size:0;height:20px;max-height:20px;max-width:20px;min-height:20px;min-width:20px;outline:none;position:relative;vertical-align:top;width:20px}html.theme--documenter-dark .modal-close::before,html.theme--documenter-dark .delete::before,html.theme--documenter-dark .modal-close::after,html.theme--documenter-dark .delete::after{background-color:#fff;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}html.theme--documenter-dark .modal-close::before,html.theme--documenter-dark .delete::before{height:2px;width:50%}html.theme--documenter-dark .modal-close::after,html.theme--documenter-dark .delete::after{height:50%;width:2px}html.theme--documenter-dark .modal-close:hover,html.theme--documenter-dark .delete:hover,html.theme--documenter-dark .modal-close:focus,html.theme--documenter-dark .delete:focus{background-color:rgba(10,10,10,0.3)}html.theme--documenter-dark .modal-close:active,html.theme--documenter-dark .delete:active{background-color:rgba(10,10,10,0.4)}html.theme--documenter-dark .is-small.modal-close,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.modal-close,html.theme--documenter-dark .is-small.delete,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.delete{height:16px;max-height:16px;max-width:16px;min-height:16px;min-width:16px;width:16px}html.theme--documenter-dark .is-medium.modal-close,html.theme--documenter-dark .is-medium.delete{height:24px;max-height:24px;max-width:24px;min-height:24px;min-width:24px;width:24px}html.theme--documenter-dark .is-large.modal-close,html.theme--documenter-dark .is-large.delete{height:32px;max-height:32px;max-width:32px;min-height:32px;min-width:32px;width:32px}html.theme--documenter-dark .control.is-loading::after,html.theme--documenter-dark .select.is-loading::after,html.theme--documenter-dark .loader,html.theme--documenter-dark .button.is-loading::after{animation:spinAround 500ms infinite linear;border:2px solid #dbdee0;border-radius:290486px;border-right-color:transparent;border-top-color:transparent;content:"";display:block;height:1em;position:relative;width:1em}html.theme--documenter-dark .hero-video,html.theme--documenter-dark .modal-background,html.theme--documenter-dark .modal,html.theme--documenter-dark .image.is-square img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square img,html.theme--documenter-dark .image.is-square .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,html.theme--documenter-dark .image.is-1by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 img,html.theme--documenter-dark .image.is-1by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,html.theme--documenter-dark .image.is-5by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 img,html.theme--documenter-dark .image.is-5by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,html.theme--documenter-dark .image.is-4by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 img,html.theme--documenter-dark .image.is-4by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,html.theme--documenter-dark .image.is-3by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 img,html.theme--documenter-dark .image.is-3by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,html.theme--documenter-dark .image.is-5by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 img,html.theme--documenter-dark .image.is-5by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,html.theme--documenter-dark .image.is-16by9 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 img,html.theme--documenter-dark .image.is-16by9 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,html.theme--documenter-dark .image.is-2by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 img,html.theme--documenter-dark .image.is-2by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,html.theme--documenter-dark .image.is-3by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 img,html.theme--documenter-dark .image.is-3by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,html.theme--documenter-dark .image.is-4by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 img,html.theme--documenter-dark .image.is-4by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,html.theme--documenter-dark .image.is-3by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 img,html.theme--documenter-dark .image.is-3by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,html.theme--documenter-dark .image.is-2by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 img,html.theme--documenter-dark .image.is-2by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,html.theme--documenter-dark .image.is-3by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 img,html.theme--documenter-dark .image.is-3by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,html.theme--documenter-dark .image.is-9by16 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 img,html.theme--documenter-dark .image.is-9by16 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,html.theme--documenter-dark .image.is-1by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 img,html.theme--documenter-dark .image.is-1by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,html.theme--documenter-dark .image.is-1by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 img,html.theme--documenter-dark .image.is-1by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio,.is-overlay{bottom:0;left:0;position:absolute;right:0;top:0}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark .file-cta,html.theme--documenter-dark .file-name,html.theme--documenter-dark .select select,html.theme--documenter-dark .textarea,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark .button{-moz-appearance:none;-webkit-appearance:none;align-items:center;border:1px solid transparent;border-radius:.4em;box-shadow:none;display:inline-flex;font-size:15px;height:2.25em;justify-content:flex-start;line-height:1.5;padding-bottom:calc(0.375em - 1px);padding-left:calc(0.625em - 1px);padding-right:calc(0.625em - 1px);padding-top:calc(0.375em - 1px);position:relative;vertical-align:top}html.theme--documenter-dark .pagination-previous:focus,html.theme--documenter-dark .pagination-next:focus,html.theme--documenter-dark .pagination-link:focus,html.theme--documenter-dark .pagination-ellipsis:focus,html.theme--documenter-dark .file-cta:focus,html.theme--documenter-dark .file-name:focus,html.theme--documenter-dark .select select:focus,html.theme--documenter-dark .textarea:focus,html.theme--documenter-dark .input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:focus,html.theme--documenter-dark .button:focus,html.theme--documenter-dark .is-focused.pagination-previous,html.theme--documenter-dark .is-focused.pagination-next,html.theme--documenter-dark .is-focused.pagination-link,html.theme--documenter-dark .is-focused.pagination-ellipsis,html.theme--documenter-dark .is-focused.file-cta,html.theme--documenter-dark .is-focused.file-name,html.theme--documenter-dark .select select.is-focused,html.theme--documenter-dark .is-focused.textarea,html.theme--documenter-dark .is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-focused.button,html.theme--documenter-dark .pagination-previous:active,html.theme--documenter-dark .pagination-next:active,html.theme--documenter-dark .pagination-link:active,html.theme--documenter-dark .pagination-ellipsis:active,html.theme--documenter-dark .file-cta:active,html.theme--documenter-dark .file-name:active,html.theme--documenter-dark .select select:active,html.theme--documenter-dark .textarea:active,html.theme--documenter-dark .input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:active,html.theme--documenter-dark .button:active,html.theme--documenter-dark .is-active.pagination-previous,html.theme--documenter-dark .is-active.pagination-next,html.theme--documenter-dark .is-active.pagination-link,html.theme--documenter-dark .is-active.pagination-ellipsis,html.theme--documenter-dark .is-active.file-cta,html.theme--documenter-dark .is-active.file-name,html.theme--documenter-dark .select select.is-active,html.theme--documenter-dark .is-active.textarea,html.theme--documenter-dark .is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active,html.theme--documenter-dark .is-active.button{outline:none}html.theme--documenter-dark .pagination-previous[disabled],html.theme--documenter-dark .pagination-next[disabled],html.theme--documenter-dark .pagination-link[disabled],html.theme--documenter-dark .pagination-ellipsis[disabled],html.theme--documenter-dark .file-cta[disabled],html.theme--documenter-dark .file-name[disabled],html.theme--documenter-dark .select select[disabled],html.theme--documenter-dark .textarea[disabled],html.theme--documenter-dark .input[disabled],html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled],html.theme--documenter-dark .button[disabled],fieldset[disabled] html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark fieldset[disabled] .pagination-previous,fieldset[disabled] html.theme--documenter-dark .pagination-next,html.theme--documenter-dark fieldset[disabled] .pagination-next,fieldset[disabled] html.theme--documenter-dark .pagination-link,html.theme--documenter-dark fieldset[disabled] .pagination-link,fieldset[disabled] html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark fieldset[disabled] .pagination-ellipsis,fieldset[disabled] html.theme--documenter-dark .file-cta,html.theme--documenter-dark fieldset[disabled] .file-cta,fieldset[disabled] html.theme--documenter-dark .file-name,html.theme--documenter-dark fieldset[disabled] .file-name,fieldset[disabled] html.theme--documenter-dark .select select,fieldset[disabled] html.theme--documenter-dark .textarea,fieldset[disabled] html.theme--documenter-dark .input,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark fieldset[disabled] .select select,html.theme--documenter-dark .select fieldset[disabled] select,html.theme--documenter-dark fieldset[disabled] .textarea,html.theme--documenter-dark fieldset[disabled] .input,html.theme--documenter-dark fieldset[disabled] #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar fieldset[disabled] form.docs-search>input,fieldset[disabled] html.theme--documenter-dark .button,html.theme--documenter-dark fieldset[disabled] .button{cursor:not-allowed}/*! minireset.css v0.0.4 | MIT License | github.com/jgthms/minireset.css */html,body,p,ol,ul,li,dl,dt,dd,blockquote,figure,fieldset,legend,textarea,pre,iframe,hr,h1,h2,h3,h4,h5,h6{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}ul{list-style:none}button,input,select,textarea{margin:0}html{box-sizing:border-box}*,*::before,*::after{box-sizing:inherit}img,embed,iframe,object,video{height:auto;max-width:100%}audio{max-width:100%}iframe{border:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}td:not([align]),th:not([align]){text-align:left}.is-clearfix::after{clear:both;content:" ";display:table}.is-pulled-left{float:left !important}.is-pulled-right{float:right !important}.is-clipped{overflow:hidden !important}.is-size-1{font-size:3rem !important}.is-size-2{font-size:2.5rem !important}.is-size-3{font-size:2rem !important}.is-size-4{font-size:1.5rem !important}.is-size-5{font-size:1.25rem !important}.is-size-6{font-size:15px !important}.is-size-7,html.theme--documenter-dark .docstring>section>a.docs-sourcelink{font-size:.85em !important}@media screen and (max-width: 768px){.is-size-1-mobile{font-size:3rem !important}.is-size-2-mobile{font-size:2.5rem !important}.is-size-3-mobile{font-size:2rem !important}.is-size-4-mobile{font-size:1.5rem !important}.is-size-5-mobile{font-size:1.25rem !important}.is-size-6-mobile{font-size:15px !important}.is-size-7-mobile{font-size:.85em !important}}@media screen and (min-width: 769px),print{.is-size-1-tablet{font-size:3rem !important}.is-size-2-tablet{font-size:2.5rem !important}.is-size-3-tablet{font-size:2rem !important}.is-size-4-tablet{font-size:1.5rem !important}.is-size-5-tablet{font-size:1.25rem !important}.is-size-6-tablet{font-size:15px !important}.is-size-7-tablet{font-size:.85em !important}}@media screen and (max-width: 1055px){.is-size-1-touch{font-size:3rem !important}.is-size-2-touch{font-size:2.5rem !important}.is-size-3-touch{font-size:2rem !important}.is-size-4-touch{font-size:1.5rem !important}.is-size-5-touch{font-size:1.25rem !important}.is-size-6-touch{font-size:15px !important}.is-size-7-touch{font-size:.85em !important}}@media screen and (min-width: 1056px){.is-size-1-desktop{font-size:3rem !important}.is-size-2-desktop{font-size:2.5rem !important}.is-size-3-desktop{font-size:2rem !important}.is-size-4-desktop{font-size:1.5rem !important}.is-size-5-desktop{font-size:1.25rem !important}.is-size-6-desktop{font-size:15px !important}.is-size-7-desktop{font-size:.85em !important}}@media screen and (min-width: 1216px){.is-size-1-widescreen{font-size:3rem !important}.is-size-2-widescreen{font-size:2.5rem !important}.is-size-3-widescreen{font-size:2rem !important}.is-size-4-widescreen{font-size:1.5rem !important}.is-size-5-widescreen{font-size:1.25rem !important}.is-size-6-widescreen{font-size:15px !important}.is-size-7-widescreen{font-size:.85em !important}}@media screen and (min-width: 1408px){.is-size-1-fullhd{font-size:3rem !important}.is-size-2-fullhd{font-size:2.5rem !important}.is-size-3-fullhd{font-size:2rem !important}.is-size-4-fullhd{font-size:1.5rem !important}.is-size-5-fullhd{font-size:1.25rem !important}.is-size-6-fullhd{font-size:15px !important}.is-size-7-fullhd{font-size:.85em !important}}.has-text-centered{text-align:center !important}.has-text-justified{text-align:justify !important}.has-text-left{text-align:left !important}.has-text-right{text-align:right !important}@media screen and (max-width: 768px){.has-text-centered-mobile{text-align:center !important}}@media screen and (min-width: 769px),print{.has-text-centered-tablet{text-align:center !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-centered-tablet-only{text-align:center !important}}@media screen and (max-width: 1055px){.has-text-centered-touch{text-align:center !important}}@media screen and (min-width: 1056px){.has-text-centered-desktop{text-align:center !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-centered-desktop-only{text-align:center !important}}@media screen and (min-width: 1216px){.has-text-centered-widescreen{text-align:center !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-centered-widescreen-only{text-align:center !important}}@media screen and (min-width: 1408px){.has-text-centered-fullhd{text-align:center !important}}@media screen and (max-width: 768px){.has-text-justified-mobile{text-align:justify !important}}@media screen and (min-width: 769px),print{.has-text-justified-tablet{text-align:justify !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-justified-tablet-only{text-align:justify !important}}@media screen and (max-width: 1055px){.has-text-justified-touch{text-align:justify !important}}@media screen and (min-width: 1056px){.has-text-justified-desktop{text-align:justify !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-justified-desktop-only{text-align:justify !important}}@media screen and (min-width: 1216px){.has-text-justified-widescreen{text-align:justify !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-justified-widescreen-only{text-align:justify !important}}@media screen and (min-width: 1408px){.has-text-justified-fullhd{text-align:justify !important}}@media screen and (max-width: 768px){.has-text-left-mobile{text-align:left !important}}@media screen and (min-width: 769px),print{.has-text-left-tablet{text-align:left !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-left-tablet-only{text-align:left !important}}@media screen and (max-width: 1055px){.has-text-left-touch{text-align:left !important}}@media screen and (min-width: 1056px){.has-text-left-desktop{text-align:left !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-left-desktop-only{text-align:left !important}}@media screen and (min-width: 1216px){.has-text-left-widescreen{text-align:left !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-left-widescreen-only{text-align:left !important}}@media screen and (min-width: 1408px){.has-text-left-fullhd{text-align:left !important}}@media screen and (max-width: 768px){.has-text-right-mobile{text-align:right !important}}@media screen and (min-width: 769px),print{.has-text-right-tablet{text-align:right !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-right-tablet-only{text-align:right !important}}@media screen and (max-width: 1055px){.has-text-right-touch{text-align:right !important}}@media screen and (min-width: 1056px){.has-text-right-desktop{text-align:right !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-right-desktop-only{text-align:right !important}}@media screen and (min-width: 1216px){.has-text-right-widescreen{text-align:right !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-right-widescreen-only{text-align:right !important}}@media screen and (min-width: 1408px){.has-text-right-fullhd{text-align:right !important}}.is-capitalized{text-transform:capitalize !important}.is-lowercase{text-transform:lowercase !important}.is-uppercase{text-transform:uppercase !important}.is-italic{font-style:italic !important}.has-text-white{color:#fff !important}a.has-text-white:hover,a.has-text-white:focus{color:#e6e6e6 !important}.has-background-white{background-color:#fff !important}.has-text-black{color:#0a0a0a !important}a.has-text-black:hover,a.has-text-black:focus{color:#000 !important}.has-background-black{background-color:#0a0a0a !important}.has-text-light{color:#ecf0f1 !important}a.has-text-light:hover,a.has-text-light:focus{color:#cfd9db !important}.has-background-light{background-color:#ecf0f1 !important}.has-text-dark{color:#282f2f !important}a.has-text-dark:hover,a.has-text-dark:focus{color:#111414 !important}.has-background-dark{background-color:#282f2f !important}.has-text-primary{color:#375a7f !important}a.has-text-primary:hover,a.has-text-primary:focus{color:#28415b !important}.has-background-primary{background-color:#375a7f !important}.has-text-link{color:#1abc9c !important}a.has-text-link:hover,a.has-text-link:focus{color:#148f77 !important}.has-background-link{background-color:#1abc9c !important}.has-text-info{color:#024c7d !important}a.has-text-info:hover,a.has-text-info:focus{color:#012d4b !important}.has-background-info{background-color:#024c7d !important}.has-text-success{color:#008438 !important}a.has-text-success:hover,a.has-text-success:focus{color:#005122 !important}.has-background-success{background-color:#008438 !important}.has-text-warning{color:#ad8100 !important}a.has-text-warning:hover,a.has-text-warning:focus{color:#7a5b00 !important}.has-background-warning{background-color:#ad8100 !important}.has-text-danger{color:#9e1b0d !important}a.has-text-danger:hover,a.has-text-danger:focus{color:#6f1309 !important}.has-background-danger{background-color:#9e1b0d !important}.has-text-black-bis{color:#121212 !important}.has-background-black-bis{background-color:#121212 !important}.has-text-black-ter{color:#242424 !important}.has-background-black-ter{background-color:#242424 !important}.has-text-grey-darker{color:#282f2f !important}.has-background-grey-darker{background-color:#282f2f !important}.has-text-grey-dark{color:#343c3d !important}.has-background-grey-dark{background-color:#343c3d !important}.has-text-grey{color:#5e6d6f !important}.has-background-grey{background-color:#5e6d6f !important}.has-text-grey-light{color:#8c9b9d !important}.has-background-grey-light{background-color:#8c9b9d !important}.has-text-grey-lighter{color:#dbdee0 !important}.has-background-grey-lighter{background-color:#dbdee0 !important}.has-text-white-ter{color:#ecf0f1 !important}.has-background-white-ter{background-color:#ecf0f1 !important}.has-text-white-bis{color:#fafafa !important}.has-background-white-bis{background-color:#fafafa !important}.has-text-weight-light{font-weight:300 !important}.has-text-weight-normal{font-weight:400 !important}.has-text-weight-medium{font-weight:500 !important}.has-text-weight-semibold{font-weight:600 !important}.has-text-weight-bold{font-weight:700 !important}.is-family-primary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-secondary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-sans-serif{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-monospace{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-family-code{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-block{display:block !important}@media screen and (max-width: 768px){.is-block-mobile{display:block !important}}@media screen and (min-width: 769px),print{.is-block-tablet{display:block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-block-tablet-only{display:block !important}}@media screen and (max-width: 1055px){.is-block-touch{display:block !important}}@media screen and (min-width: 1056px){.is-block-desktop{display:block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-block-desktop-only{display:block !important}}@media screen and (min-width: 1216px){.is-block-widescreen{display:block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-block-widescreen-only{display:block !important}}@media screen and (min-width: 1408px){.is-block-fullhd{display:block !important}}.is-flex{display:flex !important}@media screen and (max-width: 768px){.is-flex-mobile{display:flex !important}}@media screen and (min-width: 769px),print{.is-flex-tablet{display:flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-flex-tablet-only{display:flex !important}}@media screen and (max-width: 1055px){.is-flex-touch{display:flex !important}}@media screen and (min-width: 1056px){.is-flex-desktop{display:flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-flex-desktop-only{display:flex !important}}@media screen and (min-width: 1216px){.is-flex-widescreen{display:flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-flex-widescreen-only{display:flex !important}}@media screen and (min-width: 1408px){.is-flex-fullhd{display:flex !important}}.is-inline{display:inline !important}@media screen and (max-width: 768px){.is-inline-mobile{display:inline !important}}@media screen and (min-width: 769px),print{.is-inline-tablet{display:inline !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-tablet-only{display:inline !important}}@media screen and (max-width: 1055px){.is-inline-touch{display:inline !important}}@media screen and (min-width: 1056px){.is-inline-desktop{display:inline !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-desktop-only{display:inline !important}}@media screen and (min-width: 1216px){.is-inline-widescreen{display:inline !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-widescreen-only{display:inline !important}}@media screen and (min-width: 1408px){.is-inline-fullhd{display:inline !important}}.is-inline-block{display:inline-block !important}@media screen and (max-width: 768px){.is-inline-block-mobile{display:inline-block !important}}@media screen and (min-width: 769px),print{.is-inline-block-tablet{display:inline-block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-block-tablet-only{display:inline-block !important}}@media screen and (max-width: 1055px){.is-inline-block-touch{display:inline-block !important}}@media screen and (min-width: 1056px){.is-inline-block-desktop{display:inline-block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-block-desktop-only{display:inline-block !important}}@media screen and (min-width: 1216px){.is-inline-block-widescreen{display:inline-block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-block-widescreen-only{display:inline-block !important}}@media screen and (min-width: 1408px){.is-inline-block-fullhd{display:inline-block !important}}.is-inline-flex{display:inline-flex !important}@media screen and (max-width: 768px){.is-inline-flex-mobile{display:inline-flex !important}}@media screen and (min-width: 769px),print{.is-inline-flex-tablet{display:inline-flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-flex-tablet-only{display:inline-flex !important}}@media screen and (max-width: 1055px){.is-inline-flex-touch{display:inline-flex !important}}@media screen and (min-width: 1056px){.is-inline-flex-desktop{display:inline-flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-flex-desktop-only{display:inline-flex !important}}@media screen and (min-width: 1216px){.is-inline-flex-widescreen{display:inline-flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-flex-widescreen-only{display:inline-flex !important}}@media screen and (min-width: 1408px){.is-inline-flex-fullhd{display:inline-flex !important}}.is-hidden{display:none !important}.is-sr-only{border:none !important;clip:rect(0, 0, 0, 0) !important;height:0.01em !important;overflow:hidden !important;padding:0 !important;position:absolute !important;white-space:nowrap !important;width:0.01em !important}@media screen and (max-width: 768px){.is-hidden-mobile{display:none !important}}@media screen and (min-width: 769px),print{.is-hidden-tablet{display:none !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-hidden-tablet-only{display:none !important}}@media screen and (max-width: 1055px){.is-hidden-touch{display:none !important}}@media screen and (min-width: 1056px){.is-hidden-desktop{display:none !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-hidden-desktop-only{display:none !important}}@media screen and (min-width: 1216px){.is-hidden-widescreen{display:none !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-hidden-widescreen-only{display:none !important}}@media screen and (min-width: 1408px){.is-hidden-fullhd{display:none !important}}.is-invisible{visibility:hidden !important}@media screen and (max-width: 768px){.is-invisible-mobile{visibility:hidden !important}}@media screen and (min-width: 769px),print{.is-invisible-tablet{visibility:hidden !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-invisible-tablet-only{visibility:hidden !important}}@media screen and (max-width: 1055px){.is-invisible-touch{visibility:hidden !important}}@media screen and (min-width: 1056px){.is-invisible-desktop{visibility:hidden !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-invisible-desktop-only{visibility:hidden !important}}@media screen and (min-width: 1216px){.is-invisible-widescreen{visibility:hidden !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-invisible-widescreen-only{visibility:hidden !important}}@media screen and (min-width: 1408px){.is-invisible-fullhd{visibility:hidden !important}}.is-marginless{margin:0 !important}.is-paddingless{padding:0 !important}.is-radiusless{border-radius:0 !important}.is-shadowless{box-shadow:none !important}.is-relative{position:relative !important}html.theme--documenter-dark{/*! Theme: a11y-dark Author: @ericwbailey Maintainer: @ericwbailey Based on the Tomorrow Night Eighties theme: https://github.com/isagalaev/highlight.js/blob/master/src/styles/tomorrow-night-eighties.css -*/ - /* Comment */ - /* Red */ - /* Orange */ - /* Yellow */ - /* Green */ - /* Blue */ - /* Purple */ } - html.theme--documenter-dark html { - background-color: #1f2424; - font-size: 16px; - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; - min-width: 300px; - overflow-x: auto; - overflow-y: scroll; - text-rendering: optimizeLegibility; - text-size-adjust: 100%; } - html.theme--documenter-dark article, - html.theme--documenter-dark aside, - html.theme--documenter-dark figure, - html.theme--documenter-dark footer, - html.theme--documenter-dark header, - html.theme--documenter-dark hgroup, - html.theme--documenter-dark section { - display: block; } - html.theme--documenter-dark body, - html.theme--documenter-dark button, - html.theme--documenter-dark input, - html.theme--documenter-dark select, - html.theme--documenter-dark textarea { - font-family: "Lato Medium", -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", "Helvetica", "Arial", sans-serif; } - html.theme--documenter-dark code, - html.theme--documenter-dark pre { - -moz-osx-font-smoothing: auto; - -webkit-font-smoothing: auto; - font-family: "JuliaMono", "SFMono-Regular", "Menlo", "Consolas", "Liberation Mono", "DejaVu Sans Mono", monospace; } - html.theme--documenter-dark body { - color: #fff; - font-size: 1em; - font-weight: 400; - line-height: 1.5; } - html.theme--documenter-dark a { - color: #1abc9c; - cursor: pointer; - text-decoration: none; } - html.theme--documenter-dark a strong { - color: currentColor; } - html.theme--documenter-dark a:hover { - color: #1dd2af; } - html.theme--documenter-dark code { - background-color: rgba(255, 255, 255, 0.05); - color: #ececec; - font-size: 0.875em; - font-weight: normal; - padding: 0.1em; } - html.theme--documenter-dark hr { - background-color: #282f2f; - border: none; - display: block; - height: 2px; - margin: 1.5rem 0; } - html.theme--documenter-dark img { - height: auto; - max-width: 100%; } - html.theme--documenter-dark input[type="checkbox"], - html.theme--documenter-dark input[type="radio"] { - vertical-align: baseline; } - html.theme--documenter-dark small { - font-size: 0.875em; } - html.theme--documenter-dark span { - font-style: inherit; - font-weight: inherit; } - html.theme--documenter-dark strong { - color: #f2f2f2; - font-weight: 700; } - html.theme--documenter-dark fieldset { - border: none; } - html.theme--documenter-dark pre { - -webkit-overflow-scrolling: touch; - background-color: #282f2f; - color: #fff; - font-size: 0.875em; - overflow-x: auto; - padding: 1.25rem 1.5rem; - white-space: pre; - word-wrap: normal; } - html.theme--documenter-dark pre code { - background-color: transparent; - color: currentColor; - font-size: 1em; - padding: 0; } - html.theme--documenter-dark table td, - html.theme--documenter-dark table th { - vertical-align: top; } - html.theme--documenter-dark table td:not([align]), - html.theme--documenter-dark table th:not([align]) { - text-align: left; } - html.theme--documenter-dark table th { - color: #f2f2f2; } - html.theme--documenter-dark .box { - background-color: #343c3d; - border-radius: 8px; - box-shadow: none; - color: #fff; - display: block; - padding: 1.25rem; } - html.theme--documenter-dark a.box:hover, html.theme--documenter-dark a.box:focus { - box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px #1abc9c; } - html.theme--documenter-dark a.box:active { - box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2), 0 0 0 1px #1abc9c; } - html.theme--documenter-dark .button { - background-color: #282f2f; - border-color: #4c5759; - border-width: 1px; - color: #375a7f; - cursor: pointer; - justify-content: center; - padding-bottom: calc(0.375em - 1px); - padding-left: 0.75em; - padding-right: 0.75em; - padding-top: calc(0.375em - 1px); - text-align: center; - white-space: nowrap; } - html.theme--documenter-dark .button strong { - color: inherit; } - html.theme--documenter-dark .button .icon, html.theme--documenter-dark .button .icon.is-small, html.theme--documenter-dark .button #documenter .docs-sidebar form.docs-search > input.icon, html.theme--documenter-dark #documenter .docs-sidebar .button form.docs-search > input.icon, html.theme--documenter-dark .button .icon.is-medium, html.theme--documenter-dark .button .icon.is-large { - height: 1.5em; - width: 1.5em; } - html.theme--documenter-dark .button .icon:first-child:not(:last-child) { - margin-left: calc(-0.375em - 1px); - margin-right: 0.1875em; } - html.theme--documenter-dark .button .icon:last-child:not(:first-child) { - margin-left: 0.1875em; - margin-right: calc(-0.375em - 1px); } - html.theme--documenter-dark .button .icon:first-child:last-child { - margin-left: calc(-0.375em - 1px); - margin-right: calc(-0.375em - 1px); } - html.theme--documenter-dark .button:hover, html.theme--documenter-dark .button.is-hovered { - border-color: #8c9b9d; - color: #f2f2f2; } - html.theme--documenter-dark .button:focus, html.theme--documenter-dark .button.is-focused { - border-color: #8c9b9d; - color: #17a689; } - html.theme--documenter-dark .button:focus:not(:active), html.theme--documenter-dark .button.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(26, 188, 156, 0.25); } - html.theme--documenter-dark .button:active, html.theme--documenter-dark .button.is-active { - border-color: #343c3d; - color: #f2f2f2; } - html.theme--documenter-dark .button.is-text { - background-color: transparent; - border-color: transparent; - color: #fff; - text-decoration: underline; } - html.theme--documenter-dark .button.is-text:hover, html.theme--documenter-dark .button.is-text.is-hovered, html.theme--documenter-dark .button.is-text:focus, html.theme--documenter-dark .button.is-text.is-focused { - background-color: #282f2f; - color: #f2f2f2; } - html.theme--documenter-dark .button.is-text:active, html.theme--documenter-dark .button.is-text.is-active { - background-color: #1d2122; - color: #f2f2f2; } - html.theme--documenter-dark .button.is-text[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-text { - background-color: transparent; - border-color: transparent; - box-shadow: none; } - html.theme--documenter-dark .button.is-white { - background-color: white; - border-color: transparent; - color: #0a0a0a; } - html.theme--documenter-dark .button.is-white:hover, html.theme--documenter-dark .button.is-white.is-hovered { - background-color: #f9f9f9; - border-color: transparent; - color: #0a0a0a; } - html.theme--documenter-dark .button.is-white:focus, html.theme--documenter-dark .button.is-white.is-focused { - border-color: transparent; - color: #0a0a0a; } - html.theme--documenter-dark .button.is-white:focus:not(:active), html.theme--documenter-dark .button.is-white.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); } - html.theme--documenter-dark .button.is-white:active, html.theme--documenter-dark .button.is-white.is-active { - background-color: #f2f2f2; - border-color: transparent; - color: #0a0a0a; } - html.theme--documenter-dark .button.is-white[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-white { - background-color: white; - border-color: transparent; - box-shadow: none; } - html.theme--documenter-dark .button.is-white.is-inverted { - background-color: #0a0a0a; - color: white; } - html.theme--documenter-dark .button.is-white.is-inverted:hover, html.theme--documenter-dark .button.is-white.is-inverted.is-hovered { - background-color: black; } - html.theme--documenter-dark .button.is-white.is-inverted[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-white.is-inverted { - background-color: #0a0a0a; - border-color: transparent; - box-shadow: none; - color: white; } - html.theme--documenter-dark .button.is-white.is-loading::after { - border-color: transparent transparent #0a0a0a #0a0a0a !important; } - html.theme--documenter-dark .button.is-white.is-outlined { - background-color: transparent; - border-color: white; - color: white; } - html.theme--documenter-dark .button.is-white.is-outlined:hover, html.theme--documenter-dark .button.is-white.is-outlined.is-hovered, html.theme--documenter-dark .button.is-white.is-outlined:focus, html.theme--documenter-dark .button.is-white.is-outlined.is-focused { - background-color: white; - border-color: white; - color: #0a0a0a; } - html.theme--documenter-dark .button.is-white.is-outlined.is-loading::after { - border-color: transparent transparent white white !important; } - html.theme--documenter-dark .button.is-white.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-white.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-white.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-white.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #0a0a0a #0a0a0a !important; } - html.theme--documenter-dark .button.is-white.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-white.is-outlined { - background-color: transparent; - border-color: white; - box-shadow: none; - color: white; } - html.theme--documenter-dark .button.is-white.is-inverted.is-outlined { - background-color: transparent; - border-color: #0a0a0a; - color: #0a0a0a; } - html.theme--documenter-dark .button.is-white.is-inverted.is-outlined:hover, html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .button.is-white.is-inverted.is-outlined:focus, html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-focused { - background-color: #0a0a0a; - color: white; } - html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent white white !important; } - html.theme--documenter-dark .button.is-white.is-inverted.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-white.is-inverted.is-outlined { - background-color: transparent; - border-color: #0a0a0a; - box-shadow: none; - color: #0a0a0a; } - html.theme--documenter-dark .button.is-black { - background-color: #0a0a0a; - border-color: transparent; - color: white; } - html.theme--documenter-dark .button.is-black:hover, html.theme--documenter-dark .button.is-black.is-hovered { - background-color: #040404; - border-color: transparent; - color: white; } - html.theme--documenter-dark .button.is-black:focus, html.theme--documenter-dark .button.is-black.is-focused { - border-color: transparent; - color: white; } - html.theme--documenter-dark .button.is-black:focus:not(:active), html.theme--documenter-dark .button.is-black.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); } - html.theme--documenter-dark .button.is-black:active, html.theme--documenter-dark .button.is-black.is-active { - background-color: black; - border-color: transparent; - color: white; } - html.theme--documenter-dark .button.is-black[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-black { - background-color: #0a0a0a; - border-color: transparent; - box-shadow: none; } - html.theme--documenter-dark .button.is-black.is-inverted { - background-color: white; - color: #0a0a0a; } - html.theme--documenter-dark .button.is-black.is-inverted:hover, html.theme--documenter-dark .button.is-black.is-inverted.is-hovered { - background-color: #f2f2f2; } - html.theme--documenter-dark .button.is-black.is-inverted[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-black.is-inverted { - background-color: white; - border-color: transparent; - box-shadow: none; - color: #0a0a0a; } - html.theme--documenter-dark .button.is-black.is-loading::after { - border-color: transparent transparent white white !important; } - html.theme--documenter-dark .button.is-black.is-outlined { - background-color: transparent; - border-color: #0a0a0a; - color: #0a0a0a; } - html.theme--documenter-dark .button.is-black.is-outlined:hover, html.theme--documenter-dark .button.is-black.is-outlined.is-hovered, html.theme--documenter-dark .button.is-black.is-outlined:focus, html.theme--documenter-dark .button.is-black.is-outlined.is-focused { - background-color: #0a0a0a; - border-color: #0a0a0a; - color: white; } - html.theme--documenter-dark .button.is-black.is-outlined.is-loading::after { - border-color: transparent transparent #0a0a0a #0a0a0a !important; } - html.theme--documenter-dark .button.is-black.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-black.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-black.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-black.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent white white !important; } - html.theme--documenter-dark .button.is-black.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-black.is-outlined { - background-color: transparent; - border-color: #0a0a0a; - box-shadow: none; - color: #0a0a0a; } - html.theme--documenter-dark .button.is-black.is-inverted.is-outlined { - background-color: transparent; - border-color: white; - color: white; } - html.theme--documenter-dark .button.is-black.is-inverted.is-outlined:hover, html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .button.is-black.is-inverted.is-outlined:focus, html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-focused { - background-color: white; - color: #0a0a0a; } - html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #0a0a0a #0a0a0a !important; } - html.theme--documenter-dark .button.is-black.is-inverted.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-black.is-inverted.is-outlined { - background-color: transparent; - border-color: white; - box-shadow: none; - color: white; } - html.theme--documenter-dark .button.is-light { - background-color: #ecf0f1; - border-color: transparent; - color: #282f2f; } - html.theme--documenter-dark .button.is-light:hover, html.theme--documenter-dark .button.is-light.is-hovered { - background-color: #e5eaec; - border-color: transparent; - color: #282f2f; } - html.theme--documenter-dark .button.is-light:focus, html.theme--documenter-dark .button.is-light.is-focused { - border-color: transparent; - color: #282f2f; } - html.theme--documenter-dark .button.is-light:focus:not(:active), html.theme--documenter-dark .button.is-light.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(236, 240, 241, 0.25); } - html.theme--documenter-dark .button.is-light:active, html.theme--documenter-dark .button.is-light.is-active { - background-color: #dde4e6; - border-color: transparent; - color: #282f2f; } - html.theme--documenter-dark .button.is-light[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-light { - background-color: #ecf0f1; - border-color: transparent; - box-shadow: none; } - html.theme--documenter-dark .button.is-light.is-inverted { - background-color: #282f2f; - color: #ecf0f1; } - html.theme--documenter-dark .button.is-light.is-inverted:hover, html.theme--documenter-dark .button.is-light.is-inverted.is-hovered { - background-color: #1d2122; } - html.theme--documenter-dark .button.is-light.is-inverted[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-light.is-inverted { - background-color: #282f2f; - border-color: transparent; - box-shadow: none; - color: #ecf0f1; } - html.theme--documenter-dark .button.is-light.is-loading::after { - border-color: transparent transparent #282f2f #282f2f !important; } - html.theme--documenter-dark .button.is-light.is-outlined { - background-color: transparent; - border-color: #ecf0f1; - color: #ecf0f1; } - html.theme--documenter-dark .button.is-light.is-outlined:hover, html.theme--documenter-dark .button.is-light.is-outlined.is-hovered, html.theme--documenter-dark .button.is-light.is-outlined:focus, html.theme--documenter-dark .button.is-light.is-outlined.is-focused { - background-color: #ecf0f1; - border-color: #ecf0f1; - color: #282f2f; } - html.theme--documenter-dark .button.is-light.is-outlined.is-loading::after { - border-color: transparent transparent #ecf0f1 #ecf0f1 !important; } - html.theme--documenter-dark .button.is-light.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-light.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-light.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-light.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #282f2f #282f2f !important; } - html.theme--documenter-dark .button.is-light.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-light.is-outlined { - background-color: transparent; - border-color: #ecf0f1; - box-shadow: none; - color: #ecf0f1; } - html.theme--documenter-dark .button.is-light.is-inverted.is-outlined { - background-color: transparent; - border-color: #282f2f; - color: #282f2f; } - html.theme--documenter-dark .button.is-light.is-inverted.is-outlined:hover, html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .button.is-light.is-inverted.is-outlined:focus, html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-focused { - background-color: #282f2f; - color: #ecf0f1; } - html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #ecf0f1 #ecf0f1 !important; } - html.theme--documenter-dark .button.is-light.is-inverted.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-light.is-inverted.is-outlined { - background-color: transparent; - border-color: #282f2f; - box-shadow: none; - color: #282f2f; } - html.theme--documenter-dark .button.is-dark, html.theme--documenter-dark .content kbd.button { - background-color: #282f2f; - border-color: transparent; - color: #ecf0f1; } - html.theme--documenter-dark .button.is-dark:hover, html.theme--documenter-dark .content kbd.button:hover, html.theme--documenter-dark .button.is-dark.is-hovered, html.theme--documenter-dark .content kbd.button.is-hovered { - background-color: #232829; - border-color: transparent; - color: #ecf0f1; } - html.theme--documenter-dark .button.is-dark:focus, html.theme--documenter-dark .content kbd.button:focus, html.theme--documenter-dark .button.is-dark.is-focused, html.theme--documenter-dark .content kbd.button.is-focused { - border-color: transparent; - color: #ecf0f1; } - html.theme--documenter-dark .button.is-dark:focus:not(:active), html.theme--documenter-dark .content kbd.button:focus:not(:active), html.theme--documenter-dark .button.is-dark.is-focused:not(:active), html.theme--documenter-dark .content kbd.button.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(40, 47, 47, 0.25); } - html.theme--documenter-dark .button.is-dark:active, html.theme--documenter-dark .content kbd.button:active, html.theme--documenter-dark .button.is-dark.is-active, html.theme--documenter-dark .content kbd.button.is-active { - background-color: #1d2122; - border-color: transparent; - color: #ecf0f1; } - html.theme--documenter-dark .button.is-dark[disabled], html.theme--documenter-dark .content kbd.button[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-dark, fieldset[disabled] html.theme--documenter-dark .content kbd.button { - background-color: #282f2f; - border-color: transparent; - box-shadow: none; } - html.theme--documenter-dark .button.is-dark.is-inverted, html.theme--documenter-dark .content kbd.button.is-inverted { - background-color: #ecf0f1; - color: #282f2f; } - html.theme--documenter-dark .button.is-dark.is-inverted:hover, html.theme--documenter-dark .content kbd.button.is-inverted:hover, html.theme--documenter-dark .button.is-dark.is-inverted.is-hovered, html.theme--documenter-dark .content kbd.button.is-inverted.is-hovered { - background-color: #dde4e6; } - html.theme--documenter-dark .button.is-dark.is-inverted[disabled], html.theme--documenter-dark .content kbd.button.is-inverted[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-inverted, fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-inverted { - background-color: #ecf0f1; - border-color: transparent; - box-shadow: none; - color: #282f2f; } - html.theme--documenter-dark .button.is-dark.is-loading::after, html.theme--documenter-dark .content kbd.button.is-loading::after { - border-color: transparent transparent #ecf0f1 #ecf0f1 !important; } - html.theme--documenter-dark .button.is-dark.is-outlined, html.theme--documenter-dark .content kbd.button.is-outlined { - background-color: transparent; - border-color: #282f2f; - color: #282f2f; } - html.theme--documenter-dark .button.is-dark.is-outlined:hover, html.theme--documenter-dark .content kbd.button.is-outlined:hover, html.theme--documenter-dark .button.is-dark.is-outlined.is-hovered, html.theme--documenter-dark .content kbd.button.is-outlined.is-hovered, html.theme--documenter-dark .button.is-dark.is-outlined:focus, html.theme--documenter-dark .content kbd.button.is-outlined:focus, html.theme--documenter-dark .button.is-dark.is-outlined.is-focused, html.theme--documenter-dark .content kbd.button.is-outlined.is-focused { - background-color: #282f2f; - border-color: #282f2f; - color: #ecf0f1; } - html.theme--documenter-dark .button.is-dark.is-outlined.is-loading::after, html.theme--documenter-dark .content kbd.button.is-outlined.is-loading::after { - border-color: transparent transparent #282f2f #282f2f !important; } - html.theme--documenter-dark .button.is-dark.is-outlined.is-loading:hover::after, html.theme--documenter-dark .content kbd.button.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-dark.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .content kbd.button.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-dark.is-outlined.is-loading:focus::after, html.theme--documenter-dark .content kbd.button.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-dark.is-outlined.is-loading.is-focused::after, html.theme--documenter-dark .content kbd.button.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #ecf0f1 #ecf0f1 !important; } - html.theme--documenter-dark .button.is-dark.is-outlined[disabled], html.theme--documenter-dark .content kbd.button.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-outlined, fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-outlined { - background-color: transparent; - border-color: #282f2f; - box-shadow: none; - color: #282f2f; } - html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined, html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined { - background-color: transparent; - border-color: #ecf0f1; - color: #ecf0f1; } - html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined:hover, html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined:hover, html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined:focus, html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined:focus, html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-focused, html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-focused { - background-color: #ecf0f1; - color: #282f2f; } - html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after, html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #282f2f #282f2f !important; } - html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined[disabled], html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined, fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined { - background-color: transparent; - border-color: #ecf0f1; - box-shadow: none; - color: #ecf0f1; } - html.theme--documenter-dark .button.is-primary, html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink { - background-color: #375a7f; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-primary:hover, html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink:hover, html.theme--documenter-dark .button.is-primary.is-hovered, html.theme--documenter-dark .docstring > section > a.button.is-hovered.docs-sourcelink { - background-color: #335476; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-primary:focus, html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink:focus, html.theme--documenter-dark .button.is-primary.is-focused, html.theme--documenter-dark .docstring > section > a.button.is-focused.docs-sourcelink { - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-primary:focus:not(:active), html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink:focus:not(:active), html.theme--documenter-dark .button.is-primary.is-focused:not(:active), html.theme--documenter-dark .docstring > section > a.button.is-focused.docs-sourcelink:not(:active) { - box-shadow: 0 0 0 0.125em rgba(55, 90, 127, 0.25); } - html.theme--documenter-dark .button.is-primary:active, html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink:active, html.theme--documenter-dark .button.is-primary.is-active, html.theme--documenter-dark .docstring > section > a.button.is-active.docs-sourcelink { - background-color: #2f4d6d; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-primary[disabled], html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-primary, fieldset[disabled] html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink { - background-color: #375a7f; - border-color: transparent; - box-shadow: none; } - html.theme--documenter-dark .button.is-primary.is-inverted, html.theme--documenter-dark .docstring > section > a.button.is-inverted.docs-sourcelink { - background-color: #fff; - color: #375a7f; } - html.theme--documenter-dark .button.is-primary.is-inverted:hover, html.theme--documenter-dark .docstring > section > a.button.is-inverted.docs-sourcelink:hover, html.theme--documenter-dark .button.is-primary.is-inverted.is-hovered, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-hovered.docs-sourcelink { - background-color: #f2f2f2; } - html.theme--documenter-dark .button.is-primary.is-inverted[disabled], html.theme--documenter-dark .docstring > section > a.button.is-inverted.docs-sourcelink[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-inverted, fieldset[disabled] html.theme--documenter-dark .docstring > section > a.button.is-inverted.docs-sourcelink { - background-color: #fff; - border-color: transparent; - box-shadow: none; - color: #375a7f; } - html.theme--documenter-dark .button.is-primary.is-loading::after, html.theme--documenter-dark .docstring > section > a.button.is-loading.docs-sourcelink::after { - border-color: transparent transparent #fff #fff !important; } - html.theme--documenter-dark .button.is-primary.is-outlined, html.theme--documenter-dark .docstring > section > a.button.is-outlined.docs-sourcelink { - background-color: transparent; - border-color: #375a7f; - color: #375a7f; } - html.theme--documenter-dark .button.is-primary.is-outlined:hover, html.theme--documenter-dark .docstring > section > a.button.is-outlined.docs-sourcelink:hover, html.theme--documenter-dark .button.is-primary.is-outlined.is-hovered, html.theme--documenter-dark .docstring > section > a.button.is-outlined.is-hovered.docs-sourcelink, html.theme--documenter-dark .button.is-primary.is-outlined:focus, html.theme--documenter-dark .docstring > section > a.button.is-outlined.docs-sourcelink:focus, html.theme--documenter-dark .button.is-primary.is-outlined.is-focused, html.theme--documenter-dark .docstring > section > a.button.is-outlined.is-focused.docs-sourcelink { - background-color: #375a7f; - border-color: #375a7f; - color: #fff; } - html.theme--documenter-dark .button.is-primary.is-outlined.is-loading::after, html.theme--documenter-dark .docstring > section > a.button.is-outlined.is-loading.docs-sourcelink::after { - border-color: transparent transparent #375a7f #375a7f !important; } - html.theme--documenter-dark .button.is-primary.is-outlined.is-loading:hover::after, html.theme--documenter-dark .docstring > section > a.button.is-outlined.is-loading.docs-sourcelink:hover::after, html.theme--documenter-dark .button.is-primary.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .docstring > section > a.button.is-outlined.is-loading.is-hovered.docs-sourcelink::after, html.theme--documenter-dark .button.is-primary.is-outlined.is-loading:focus::after, html.theme--documenter-dark .docstring > section > a.button.is-outlined.is-loading.docs-sourcelink:focus::after, html.theme--documenter-dark .button.is-primary.is-outlined.is-loading.is-focused::after, html.theme--documenter-dark .docstring > section > a.button.is-outlined.is-loading.is-focused.docs-sourcelink::after { - border-color: transparent transparent #fff #fff !important; } - html.theme--documenter-dark .button.is-primary.is-outlined[disabled], html.theme--documenter-dark .docstring > section > a.button.is-outlined.docs-sourcelink[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-outlined, fieldset[disabled] html.theme--documenter-dark .docstring > section > a.button.is-outlined.docs-sourcelink { - background-color: transparent; - border-color: #375a7f; - box-shadow: none; - color: #375a7f; } - html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink { - background-color: transparent; - border-color: #fff; - color: #fff; } - html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined:hover, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink:hover, html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.is-hovered.docs-sourcelink, html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined:focus, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink:focus, html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-focused, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.is-focused.docs-sourcelink { - background-color: #fff; - color: #375a7f; } - html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:hover::after, html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.is-loading.is-hovered.docs-sourcelink::after, html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:focus::after, html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.is-loading.is-focused.docs-sourcelink::after { - border-color: transparent transparent #375a7f #375a7f !important; } - html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined[disabled], html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined, fieldset[disabled] html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink { - background-color: transparent; - border-color: #fff; - box-shadow: none; - color: #fff; } - html.theme--documenter-dark .button.is-link { - background-color: #1abc9c; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-link:hover, html.theme--documenter-dark .button.is-link.is-hovered { - background-color: #18b193; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-link:focus, html.theme--documenter-dark .button.is-link.is-focused { - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-link:focus:not(:active), html.theme--documenter-dark .button.is-link.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(26, 188, 156, 0.25); } - html.theme--documenter-dark .button.is-link:active, html.theme--documenter-dark .button.is-link.is-active { - background-color: #17a689; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-link[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-link { - background-color: #1abc9c; - border-color: transparent; - box-shadow: none; } - html.theme--documenter-dark .button.is-link.is-inverted { - background-color: #fff; - color: #1abc9c; } - html.theme--documenter-dark .button.is-link.is-inverted:hover, html.theme--documenter-dark .button.is-link.is-inverted.is-hovered { - background-color: #f2f2f2; } - html.theme--documenter-dark .button.is-link.is-inverted[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-link.is-inverted { - background-color: #fff; - border-color: transparent; - box-shadow: none; - color: #1abc9c; } - html.theme--documenter-dark .button.is-link.is-loading::after { - border-color: transparent transparent #fff #fff !important; } - html.theme--documenter-dark .button.is-link.is-outlined { - background-color: transparent; - border-color: #1abc9c; - color: #1abc9c; } - html.theme--documenter-dark .button.is-link.is-outlined:hover, html.theme--documenter-dark .button.is-link.is-outlined.is-hovered, html.theme--documenter-dark .button.is-link.is-outlined:focus, html.theme--documenter-dark .button.is-link.is-outlined.is-focused { - background-color: #1abc9c; - border-color: #1abc9c; - color: #fff; } - html.theme--documenter-dark .button.is-link.is-outlined.is-loading::after { - border-color: transparent transparent #1abc9c #1abc9c !important; } - html.theme--documenter-dark .button.is-link.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-link.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-link.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-link.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #fff #fff !important; } - html.theme--documenter-dark .button.is-link.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-link.is-outlined { - background-color: transparent; - border-color: #1abc9c; - box-shadow: none; - color: #1abc9c; } - html.theme--documenter-dark .button.is-link.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - color: #fff; } - html.theme--documenter-dark .button.is-link.is-inverted.is-outlined:hover, html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .button.is-link.is-inverted.is-outlined:focus, html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-focused { - background-color: #fff; - color: #1abc9c; } - html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #1abc9c #1abc9c !important; } - html.theme--documenter-dark .button.is-link.is-inverted.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-link.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - box-shadow: none; - color: #fff; } - html.theme--documenter-dark .button.is-info { - background-color: #024c7d; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-info:hover, html.theme--documenter-dark .button.is-info.is-hovered { - background-color: #024470; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-info:focus, html.theme--documenter-dark .button.is-info.is-focused { - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-info:focus:not(:active), html.theme--documenter-dark .button.is-info.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(2, 76, 125, 0.25); } - html.theme--documenter-dark .button.is-info:active, html.theme--documenter-dark .button.is-info.is-active { - background-color: #023d64; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-info[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-info { - background-color: #024c7d; - border-color: transparent; - box-shadow: none; } - html.theme--documenter-dark .button.is-info.is-inverted { - background-color: #fff; - color: #024c7d; } - html.theme--documenter-dark .button.is-info.is-inverted:hover, html.theme--documenter-dark .button.is-info.is-inverted.is-hovered { - background-color: #f2f2f2; } - html.theme--documenter-dark .button.is-info.is-inverted[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-info.is-inverted { - background-color: #fff; - border-color: transparent; - box-shadow: none; - color: #024c7d; } - html.theme--documenter-dark .button.is-info.is-loading::after { - border-color: transparent transparent #fff #fff !important; } - html.theme--documenter-dark .button.is-info.is-outlined { - background-color: transparent; - border-color: #024c7d; - color: #024c7d; } - html.theme--documenter-dark .button.is-info.is-outlined:hover, html.theme--documenter-dark .button.is-info.is-outlined.is-hovered, html.theme--documenter-dark .button.is-info.is-outlined:focus, html.theme--documenter-dark .button.is-info.is-outlined.is-focused { - background-color: #024c7d; - border-color: #024c7d; - color: #fff; } - html.theme--documenter-dark .button.is-info.is-outlined.is-loading::after { - border-color: transparent transparent #024c7d #024c7d !important; } - html.theme--documenter-dark .button.is-info.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-info.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-info.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-info.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #fff #fff !important; } - html.theme--documenter-dark .button.is-info.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-info.is-outlined { - background-color: transparent; - border-color: #024c7d; - box-shadow: none; - color: #024c7d; } - html.theme--documenter-dark .button.is-info.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - color: #fff; } - html.theme--documenter-dark .button.is-info.is-inverted.is-outlined:hover, html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .button.is-info.is-inverted.is-outlined:focus, html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-focused { - background-color: #fff; - color: #024c7d; } - html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #024c7d #024c7d !important; } - html.theme--documenter-dark .button.is-info.is-inverted.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-info.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - box-shadow: none; - color: #fff; } - html.theme--documenter-dark .button.is-success { - background-color: #008438; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-success:hover, html.theme--documenter-dark .button.is-success.is-hovered { - background-color: #007733; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-success:focus, html.theme--documenter-dark .button.is-success.is-focused { - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-success:focus:not(:active), html.theme--documenter-dark .button.is-success.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(0, 132, 56, 0.25); } - html.theme--documenter-dark .button.is-success:active, html.theme--documenter-dark .button.is-success.is-active { - background-color: #006b2d; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-success[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-success { - background-color: #008438; - border-color: transparent; - box-shadow: none; } - html.theme--documenter-dark .button.is-success.is-inverted { - background-color: #fff; - color: #008438; } - html.theme--documenter-dark .button.is-success.is-inverted:hover, html.theme--documenter-dark .button.is-success.is-inverted.is-hovered { - background-color: #f2f2f2; } - html.theme--documenter-dark .button.is-success.is-inverted[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-success.is-inverted { - background-color: #fff; - border-color: transparent; - box-shadow: none; - color: #008438; } - html.theme--documenter-dark .button.is-success.is-loading::after { - border-color: transparent transparent #fff #fff !important; } - html.theme--documenter-dark .button.is-success.is-outlined { - background-color: transparent; - border-color: #008438; - color: #008438; } - html.theme--documenter-dark .button.is-success.is-outlined:hover, html.theme--documenter-dark .button.is-success.is-outlined.is-hovered, html.theme--documenter-dark .button.is-success.is-outlined:focus, html.theme--documenter-dark .button.is-success.is-outlined.is-focused { - background-color: #008438; - border-color: #008438; - color: #fff; } - html.theme--documenter-dark .button.is-success.is-outlined.is-loading::after { - border-color: transparent transparent #008438 #008438 !important; } - html.theme--documenter-dark .button.is-success.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-success.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-success.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-success.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #fff #fff !important; } - html.theme--documenter-dark .button.is-success.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-success.is-outlined { - background-color: transparent; - border-color: #008438; - box-shadow: none; - color: #008438; } - html.theme--documenter-dark .button.is-success.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - color: #fff; } - html.theme--documenter-dark .button.is-success.is-inverted.is-outlined:hover, html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .button.is-success.is-inverted.is-outlined:focus, html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-focused { - background-color: #fff; - color: #008438; } - html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #008438 #008438 !important; } - html.theme--documenter-dark .button.is-success.is-inverted.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-success.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - box-shadow: none; - color: #fff; } - html.theme--documenter-dark .button.is-warning { - background-color: #ad8100; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-warning:hover, html.theme--documenter-dark .button.is-warning.is-hovered { - background-color: #a07700; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-warning:focus, html.theme--documenter-dark .button.is-warning.is-focused { - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-warning:focus:not(:active), html.theme--documenter-dark .button.is-warning.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(173, 129, 0, 0.25); } - html.theme--documenter-dark .button.is-warning:active, html.theme--documenter-dark .button.is-warning.is-active { - background-color: #946e00; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-warning[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-warning { - background-color: #ad8100; - border-color: transparent; - box-shadow: none; } - html.theme--documenter-dark .button.is-warning.is-inverted { - background-color: #fff; - color: #ad8100; } - html.theme--documenter-dark .button.is-warning.is-inverted:hover, html.theme--documenter-dark .button.is-warning.is-inverted.is-hovered { - background-color: #f2f2f2; } - html.theme--documenter-dark .button.is-warning.is-inverted[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-inverted { - background-color: #fff; - border-color: transparent; - box-shadow: none; - color: #ad8100; } - html.theme--documenter-dark .button.is-warning.is-loading::after { - border-color: transparent transparent #fff #fff !important; } - html.theme--documenter-dark .button.is-warning.is-outlined { - background-color: transparent; - border-color: #ad8100; - color: #ad8100; } - html.theme--documenter-dark .button.is-warning.is-outlined:hover, html.theme--documenter-dark .button.is-warning.is-outlined.is-hovered, html.theme--documenter-dark .button.is-warning.is-outlined:focus, html.theme--documenter-dark .button.is-warning.is-outlined.is-focused { - background-color: #ad8100; - border-color: #ad8100; - color: #fff; } - html.theme--documenter-dark .button.is-warning.is-outlined.is-loading::after { - border-color: transparent transparent #ad8100 #ad8100 !important; } - html.theme--documenter-dark .button.is-warning.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-warning.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-warning.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-warning.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #fff #fff !important; } - html.theme--documenter-dark .button.is-warning.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-outlined { - background-color: transparent; - border-color: #ad8100; - box-shadow: none; - color: #ad8100; } - html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - color: #fff; } - html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined:hover, html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined:focus, html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-focused { - background-color: #fff; - color: #ad8100; } - html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #ad8100 #ad8100 !important; } - html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - box-shadow: none; - color: #fff; } - html.theme--documenter-dark .button.is-danger { - background-color: #9e1b0d; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-danger:hover, html.theme--documenter-dark .button.is-danger.is-hovered { - background-color: #92190c; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-danger:focus, html.theme--documenter-dark .button.is-danger.is-focused { - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-danger:focus:not(:active), html.theme--documenter-dark .button.is-danger.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(158, 27, 13, 0.25); } - html.theme--documenter-dark .button.is-danger:active, html.theme--documenter-dark .button.is-danger.is-active { - background-color: #86170b; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-danger[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-danger { - background-color: #9e1b0d; - border-color: transparent; - box-shadow: none; } - html.theme--documenter-dark .button.is-danger.is-inverted { - background-color: #fff; - color: #9e1b0d; } - html.theme--documenter-dark .button.is-danger.is-inverted:hover, html.theme--documenter-dark .button.is-danger.is-inverted.is-hovered { - background-color: #f2f2f2; } - html.theme--documenter-dark .button.is-danger.is-inverted[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-inverted { - background-color: #fff; - border-color: transparent; - box-shadow: none; - color: #9e1b0d; } - html.theme--documenter-dark .button.is-danger.is-loading::after { - border-color: transparent transparent #fff #fff !important; } - html.theme--documenter-dark .button.is-danger.is-outlined { - background-color: transparent; - border-color: #9e1b0d; - color: #9e1b0d; } - html.theme--documenter-dark .button.is-danger.is-outlined:hover, html.theme--documenter-dark .button.is-danger.is-outlined.is-hovered, html.theme--documenter-dark .button.is-danger.is-outlined:focus, html.theme--documenter-dark .button.is-danger.is-outlined.is-focused { - background-color: #9e1b0d; - border-color: #9e1b0d; - color: #fff; } - html.theme--documenter-dark .button.is-danger.is-outlined.is-loading::after { - border-color: transparent transparent #9e1b0d #9e1b0d !important; } - html.theme--documenter-dark .button.is-danger.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-danger.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-danger.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-danger.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #fff #fff !important; } - html.theme--documenter-dark .button.is-danger.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-outlined { - background-color: transparent; - border-color: #9e1b0d; - box-shadow: none; - color: #9e1b0d; } - html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - color: #fff; } - html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined:hover, html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined:focus, html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-focused { - background-color: #fff; - color: #9e1b0d; } - html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #9e1b0d #9e1b0d !important; } - html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - box-shadow: none; - color: #fff; } - html.theme--documenter-dark .button.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.button { - border-radius: 3px; - font-size: 0.85em; } - html.theme--documenter-dark .button.is-normal { - font-size: 15px; } - html.theme--documenter-dark .button.is-medium { - font-size: 1.25rem; } - html.theme--documenter-dark .button.is-large { - font-size: 1.5rem; } - html.theme--documenter-dark .button[disabled], fieldset[disabled] html.theme--documenter-dark .button { - background-color: #8c9b9d; - border-color: #dbdee0; - box-shadow: none; - opacity: 0.5; } - html.theme--documenter-dark .button.is-fullwidth { - display: flex; - width: 100%; } - html.theme--documenter-dark .button.is-loading { - color: transparent !important; - pointer-events: none; } - html.theme--documenter-dark .button.is-loading::after { - position: absolute; - left: calc(50% - (1em / 2)); - top: calc(50% - (1em / 2)); - position: absolute !important; } - html.theme--documenter-dark .button.is-static { - background-color: #282f2f; - border-color: #5e6d6f; - color: #dbdee0; - box-shadow: none; - pointer-events: none; } - html.theme--documenter-dark .button.is-rounded, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.button { - border-radius: 290486px; - padding-left: 1em; - padding-right: 1em; } - html.theme--documenter-dark .buttons { - align-items: center; - display: flex; - flex-wrap: wrap; - justify-content: flex-start; } - html.theme--documenter-dark .buttons .button { - margin-bottom: 0.5rem; } - html.theme--documenter-dark .buttons .button:not(:last-child):not(.is-fullwidth) { - margin-right: 0.5rem; } - html.theme--documenter-dark .buttons:last-child { - margin-bottom: -0.5rem; } - html.theme--documenter-dark .buttons:not(:last-child) { - margin-bottom: 1rem; } - html.theme--documenter-dark .buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large) { - border-radius: 3px; - font-size: 0.85em; } - html.theme--documenter-dark .buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large) { - font-size: 1.25rem; } - html.theme--documenter-dark .buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium) { - font-size: 1.5rem; } - html.theme--documenter-dark .buttons.has-addons .button:not(:first-child) { - border-bottom-left-radius: 0; - border-top-left-radius: 0; } - html.theme--documenter-dark .buttons.has-addons .button:not(:last-child) { - border-bottom-right-radius: 0; - border-top-right-radius: 0; - margin-right: -1px; } - html.theme--documenter-dark .buttons.has-addons .button:last-child { - margin-right: 0; } - html.theme--documenter-dark .buttons.has-addons .button:hover, html.theme--documenter-dark .buttons.has-addons .button.is-hovered { - z-index: 2; } - html.theme--documenter-dark .buttons.has-addons .button:focus, html.theme--documenter-dark .buttons.has-addons .button.is-focused, html.theme--documenter-dark .buttons.has-addons .button:active, html.theme--documenter-dark .buttons.has-addons .button.is-active, html.theme--documenter-dark .buttons.has-addons .button.is-selected { - z-index: 3; } - html.theme--documenter-dark .buttons.has-addons .button:focus:hover, html.theme--documenter-dark .buttons.has-addons .button.is-focused:hover, html.theme--documenter-dark .buttons.has-addons .button:active:hover, html.theme--documenter-dark .buttons.has-addons .button.is-active:hover, html.theme--documenter-dark .buttons.has-addons .button.is-selected:hover { - z-index: 4; } - html.theme--documenter-dark .buttons.has-addons .button.is-expanded { - flex-grow: 1; - flex-shrink: 1; } - html.theme--documenter-dark .buttons.is-centered { - justify-content: center; } - html.theme--documenter-dark .buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth) { - margin-left: 0.25rem; - margin-right: 0.25rem; } - html.theme--documenter-dark .buttons.is-right { - justify-content: flex-end; } - html.theme--documenter-dark .buttons.is-right:not(.has-addons) .button:not(.is-fullwidth) { - margin-left: 0.25rem; - margin-right: 0.25rem; } - html.theme--documenter-dark .container { - flex-grow: 1; - margin: 0 auto; - position: relative; - width: auto; } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .container { - max-width: 992px; } - html.theme--documenter-dark .container.is-fluid { - margin-left: 32px; - margin-right: 32px; - max-width: none; } } - @media screen and (max-width: 1215px) { - html.theme--documenter-dark .container.is-widescreen { - max-width: 1152px; } } - @media screen and (max-width: 1407px) { - html.theme--documenter-dark .container.is-fullhd { - max-width: 1344px; } } - @media screen and (min-width: 1216px) { - html.theme--documenter-dark .container { - max-width: 1152px; } } - @media screen and (min-width: 1408px) { - html.theme--documenter-dark .container { - max-width: 1344px; } } - html.theme--documenter-dark .content li + li { - margin-top: 0.25em; } - html.theme--documenter-dark .content p:not(:last-child), - html.theme--documenter-dark .content dl:not(:last-child), - html.theme--documenter-dark .content ol:not(:last-child), - html.theme--documenter-dark .content ul:not(:last-child), - html.theme--documenter-dark .content blockquote:not(:last-child), - html.theme--documenter-dark .content pre:not(:last-child), - html.theme--documenter-dark .content table:not(:last-child) { - margin-bottom: 1em; } - html.theme--documenter-dark .content h1, - html.theme--documenter-dark .content h2, - html.theme--documenter-dark .content h3, - html.theme--documenter-dark .content h4, - html.theme--documenter-dark .content h5, - html.theme--documenter-dark .content h6 { - color: #f2f2f2; - font-weight: 600; - line-height: 1.125; } - html.theme--documenter-dark .content h1 { - font-size: 2em; - margin-bottom: 0.5em; } - html.theme--documenter-dark .content h1:not(:first-child) { - margin-top: 1em; } - html.theme--documenter-dark .content h2 { - font-size: 1.75em; - margin-bottom: 0.5714em; } - html.theme--documenter-dark .content h2:not(:first-child) { - margin-top: 1.1428em; } - html.theme--documenter-dark .content h3 { - font-size: 1.5em; - margin-bottom: 0.6666em; } - html.theme--documenter-dark .content h3:not(:first-child) { - margin-top: 1.3333em; } - html.theme--documenter-dark .content h4 { - font-size: 1.25em; - margin-bottom: 0.8em; } - html.theme--documenter-dark .content h5 { - font-size: 1.125em; - margin-bottom: 0.8888em; } - html.theme--documenter-dark .content h6 { - font-size: 1em; - margin-bottom: 1em; } - html.theme--documenter-dark .content blockquote { - background-color: #282f2f; - border-left: 5px solid #5e6d6f; - padding: 1.25em 1.5em; } - html.theme--documenter-dark .content ol { - list-style-position: outside; - margin-left: 2em; - margin-top: 1em; } - html.theme--documenter-dark .content ol:not([type]) { - list-style-type: decimal; } - html.theme--documenter-dark .content ol.is-lower-alpha:not([type]) { - list-style-type: lower-alpha; } - html.theme--documenter-dark .content ol.is-lower-roman:not([type]) { - list-style-type: lower-roman; } - html.theme--documenter-dark .content ol.is-upper-alpha:not([type]) { - list-style-type: upper-alpha; } - html.theme--documenter-dark .content ol.is-upper-roman:not([type]) { - list-style-type: upper-roman; } - html.theme--documenter-dark .content ul { - list-style: disc outside; - margin-left: 2em; - margin-top: 1em; } - html.theme--documenter-dark .content ul ul { - list-style-type: circle; - margin-top: 0.5em; } - html.theme--documenter-dark .content ul ul ul { - list-style-type: square; } - html.theme--documenter-dark .content dd { - margin-left: 2em; } - html.theme--documenter-dark .content figure { - margin-left: 2em; - margin-right: 2em; - text-align: center; } - html.theme--documenter-dark .content figure:not(:first-child) { - margin-top: 2em; } - html.theme--documenter-dark .content figure:not(:last-child) { - margin-bottom: 2em; } - html.theme--documenter-dark .content figure img { - display: inline-block; } - html.theme--documenter-dark .content figure figcaption { - font-style: italic; } - html.theme--documenter-dark .content pre { - -webkit-overflow-scrolling: touch; - overflow-x: auto; - padding: 0; - white-space: pre; - word-wrap: normal; } - html.theme--documenter-dark .content sup, - html.theme--documenter-dark .content sub { - font-size: 75%; } - html.theme--documenter-dark .content table { - width: 100%; } - html.theme--documenter-dark .content table td, - html.theme--documenter-dark .content table th { - border: 1px solid #5e6d6f; - border-width: 0 0 1px; - padding: 0.5em 0.75em; - vertical-align: top; } - html.theme--documenter-dark .content table th { - color: #f2f2f2; } - html.theme--documenter-dark .content table th:not([align]) { - text-align: left; } - html.theme--documenter-dark .content table thead td, - html.theme--documenter-dark .content table thead th { - border-width: 0 0 2px; - color: #f2f2f2; } - html.theme--documenter-dark .content table tfoot td, - html.theme--documenter-dark .content table tfoot th { - border-width: 2px 0 0; - color: #f2f2f2; } - html.theme--documenter-dark .content table tbody tr:last-child td, - html.theme--documenter-dark .content table tbody tr:last-child th { - border-bottom-width: 0; } - html.theme--documenter-dark .content .tabs li + li { - margin-top: 0; } - html.theme--documenter-dark .content.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.content { - font-size: 0.85em; } - html.theme--documenter-dark .content.is-medium { - font-size: 1.25rem; } - html.theme--documenter-dark .content.is-large { - font-size: 1.5rem; } - html.theme--documenter-dark .icon { - align-items: center; - display: inline-flex; - justify-content: center; - height: 1.5rem; - width: 1.5rem; } - html.theme--documenter-dark .icon.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.icon { - height: 1rem; - width: 1rem; } - html.theme--documenter-dark .icon.is-medium { - height: 2rem; - width: 2rem; } - html.theme--documenter-dark .icon.is-large { - height: 3rem; - width: 3rem; } - html.theme--documenter-dark .image, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img { - display: block; - position: relative; } - html.theme--documenter-dark .image img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img img { - display: block; - height: auto; - width: 100%; } - html.theme--documenter-dark .image img.is-rounded, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img img.is-rounded { - border-radius: 290486px; } - html.theme--documenter-dark .image.is-square img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-square img, - html.theme--documenter-dark .image.is-square .has-ratio, - html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-square .has-ratio, html.theme--documenter-dark .image.is-1by1 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by1 img, - html.theme--documenter-dark .image.is-1by1 .has-ratio, - html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by1 .has-ratio, html.theme--documenter-dark .image.is-5by4 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by4 img, - html.theme--documenter-dark .image.is-5by4 .has-ratio, - html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by4 .has-ratio, html.theme--documenter-dark .image.is-4by3 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by3 img, - html.theme--documenter-dark .image.is-4by3 .has-ratio, - html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by3 .has-ratio, html.theme--documenter-dark .image.is-3by2 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by2 img, - html.theme--documenter-dark .image.is-3by2 .has-ratio, - html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by2 .has-ratio, html.theme--documenter-dark .image.is-5by3 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by3 img, - html.theme--documenter-dark .image.is-5by3 .has-ratio, - html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by3 .has-ratio, html.theme--documenter-dark .image.is-16by9 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-16by9 img, - html.theme--documenter-dark .image.is-16by9 .has-ratio, - html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-16by9 .has-ratio, html.theme--documenter-dark .image.is-2by1 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by1 img, - html.theme--documenter-dark .image.is-2by1 .has-ratio, - html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by1 .has-ratio, html.theme--documenter-dark .image.is-3by1 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by1 img, - html.theme--documenter-dark .image.is-3by1 .has-ratio, - html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by1 .has-ratio, html.theme--documenter-dark .image.is-4by5 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by5 img, - html.theme--documenter-dark .image.is-4by5 .has-ratio, - html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by5 .has-ratio, html.theme--documenter-dark .image.is-3by4 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by4 img, - html.theme--documenter-dark .image.is-3by4 .has-ratio, - html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by4 .has-ratio, html.theme--documenter-dark .image.is-2by3 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by3 img, - html.theme--documenter-dark .image.is-2by3 .has-ratio, - html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by3 .has-ratio, html.theme--documenter-dark .image.is-3by5 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by5 img, - html.theme--documenter-dark .image.is-3by5 .has-ratio, - html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by5 .has-ratio, html.theme--documenter-dark .image.is-9by16 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-9by16 img, - html.theme--documenter-dark .image.is-9by16 .has-ratio, - html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-9by16 .has-ratio, html.theme--documenter-dark .image.is-1by2 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by2 img, - html.theme--documenter-dark .image.is-1by2 .has-ratio, - html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by2 .has-ratio, html.theme--documenter-dark .image.is-1by3 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by3 img, - html.theme--documenter-dark .image.is-1by3 .has-ratio, - html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by3 .has-ratio { - height: 100%; - width: 100%; } - html.theme--documenter-dark .image.is-square, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-square, html.theme--documenter-dark .image.is-1by1, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by1 { - padding-top: 100%; } - html.theme--documenter-dark .image.is-5by4, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by4 { - padding-top: 80%; } - html.theme--documenter-dark .image.is-4by3, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by3 { - padding-top: 75%; } - html.theme--documenter-dark .image.is-3by2, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by2 { - padding-top: 66.6666%; } - html.theme--documenter-dark .image.is-5by3, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by3 { - padding-top: 60%; } - html.theme--documenter-dark .image.is-16by9, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-16by9 { - padding-top: 56.25%; } - html.theme--documenter-dark .image.is-2by1, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by1 { - padding-top: 50%; } - html.theme--documenter-dark .image.is-3by1, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by1 { - padding-top: 33.3333%; } - html.theme--documenter-dark .image.is-4by5, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by5 { - padding-top: 125%; } - html.theme--documenter-dark .image.is-3by4, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by4 { - padding-top: 133.3333%; } - html.theme--documenter-dark .image.is-2by3, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by3 { - padding-top: 150%; } - html.theme--documenter-dark .image.is-3by5, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by5 { - padding-top: 166.6666%; } - html.theme--documenter-dark .image.is-9by16, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-9by16 { - padding-top: 177.7777%; } - html.theme--documenter-dark .image.is-1by2, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by2 { - padding-top: 200%; } - html.theme--documenter-dark .image.is-1by3, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by3 { - padding-top: 300%; } - html.theme--documenter-dark .image.is-16x16, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-16x16 { - height: 16px; - width: 16px; } - html.theme--documenter-dark .image.is-24x24, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-24x24 { - height: 24px; - width: 24px; } - html.theme--documenter-dark .image.is-32x32, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-32x32 { - height: 32px; - width: 32px; } - html.theme--documenter-dark .image.is-48x48, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-48x48 { - height: 48px; - width: 48px; } - html.theme--documenter-dark .image.is-64x64, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-64x64 { - height: 64px; - width: 64px; } - html.theme--documenter-dark .image.is-96x96, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-96x96 { - height: 96px; - width: 96px; } - html.theme--documenter-dark .image.is-128x128, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-128x128 { - height: 128px; - width: 128px; } - html.theme--documenter-dark .notification { - background-color: #282f2f; - border-radius: 0.4em; - padding: 1.25rem 2.5rem 1.25rem 1.5rem; - position: relative; } - html.theme--documenter-dark .notification a:not(.button):not(.dropdown-item) { - color: currentColor; - text-decoration: underline; } - html.theme--documenter-dark .notification strong { - color: currentColor; } - html.theme--documenter-dark .notification code, - html.theme--documenter-dark .notification pre { - background: white; } - html.theme--documenter-dark .notification pre code { - background: transparent; } - html.theme--documenter-dark .notification > .delete { - position: absolute; - right: 0.5rem; - top: 0.5rem; } - html.theme--documenter-dark .notification .title, - html.theme--documenter-dark .notification .subtitle, - html.theme--documenter-dark .notification .content { - color: currentColor; } - html.theme--documenter-dark .notification.is-white { - background-color: white; - color: #0a0a0a; } - html.theme--documenter-dark .notification.is-black { - background-color: #0a0a0a; - color: white; } - html.theme--documenter-dark .notification.is-light { - background-color: #ecf0f1; - color: #282f2f; } - html.theme--documenter-dark .notification.is-dark, html.theme--documenter-dark .content kbd.notification { - background-color: #282f2f; - color: #ecf0f1; } - html.theme--documenter-dark .notification.is-primary, html.theme--documenter-dark .docstring > section > a.notification.docs-sourcelink { - background-color: #375a7f; - color: #fff; } - html.theme--documenter-dark .notification.is-link { - background-color: #1abc9c; - color: #fff; } - html.theme--documenter-dark .notification.is-info { - background-color: #024c7d; - color: #fff; } - html.theme--documenter-dark .notification.is-success { - background-color: #008438; - color: #fff; } - html.theme--documenter-dark .notification.is-warning { - background-color: #ad8100; - color: #fff; } - html.theme--documenter-dark .notification.is-danger { - background-color: #9e1b0d; - color: #fff; } - html.theme--documenter-dark .progress { - -moz-appearance: none; - -webkit-appearance: none; - border: none; - border-radius: 290486px; - display: block; - height: 15px; - overflow: hidden; - padding: 0; - width: 100%; } - html.theme--documenter-dark .progress::-webkit-progress-bar { - background-color: #5e6d6f; } - html.theme--documenter-dark .progress::-webkit-progress-value { - background-color: #dbdee0; } - html.theme--documenter-dark .progress::-moz-progress-bar { - background-color: #dbdee0; } - html.theme--documenter-dark .progress::-ms-fill { - background-color: #dbdee0; - border: none; } - html.theme--documenter-dark .progress.is-white::-webkit-progress-value { - background-color: white; } - html.theme--documenter-dark .progress.is-white::-moz-progress-bar { - background-color: white; } - html.theme--documenter-dark .progress.is-white::-ms-fill { - background-color: white; } - html.theme--documenter-dark .progress.is-white:indeterminate { - background-image: linear-gradient(to right, white 30%, #5e6d6f 30%); } - html.theme--documenter-dark .progress.is-black::-webkit-progress-value { - background-color: #0a0a0a; } - html.theme--documenter-dark .progress.is-black::-moz-progress-bar { - background-color: #0a0a0a; } - html.theme--documenter-dark .progress.is-black::-ms-fill { - background-color: #0a0a0a; } - html.theme--documenter-dark .progress.is-black:indeterminate { - background-image: linear-gradient(to right, #0a0a0a 30%, #5e6d6f 30%); } - html.theme--documenter-dark .progress.is-light::-webkit-progress-value { - background-color: #ecf0f1; } - html.theme--documenter-dark .progress.is-light::-moz-progress-bar { - background-color: #ecf0f1; } - html.theme--documenter-dark .progress.is-light::-ms-fill { - background-color: #ecf0f1; } - html.theme--documenter-dark .progress.is-light:indeterminate { - background-image: linear-gradient(to right, #ecf0f1 30%, #5e6d6f 30%); } - html.theme--documenter-dark .progress.is-dark::-webkit-progress-value, html.theme--documenter-dark .content kbd.progress::-webkit-progress-value { - background-color: #282f2f; } - html.theme--documenter-dark .progress.is-dark::-moz-progress-bar, html.theme--documenter-dark .content kbd.progress::-moz-progress-bar { - background-color: #282f2f; } - html.theme--documenter-dark .progress.is-dark::-ms-fill, html.theme--documenter-dark .content kbd.progress::-ms-fill { - background-color: #282f2f; } - html.theme--documenter-dark .progress.is-dark:indeterminate, html.theme--documenter-dark .content kbd.progress:indeterminate { - background-image: linear-gradient(to right, #282f2f 30%, #5e6d6f 30%); } - html.theme--documenter-dark .progress.is-primary::-webkit-progress-value, html.theme--documenter-dark .docstring > section > a.progress.docs-sourcelink::-webkit-progress-value { - background-color: #375a7f; } - html.theme--documenter-dark .progress.is-primary::-moz-progress-bar, html.theme--documenter-dark .docstring > section > a.progress.docs-sourcelink::-moz-progress-bar { - background-color: #375a7f; } - html.theme--documenter-dark .progress.is-primary::-ms-fill, html.theme--documenter-dark .docstring > section > a.progress.docs-sourcelink::-ms-fill { - background-color: #375a7f; } - html.theme--documenter-dark .progress.is-primary:indeterminate, html.theme--documenter-dark .docstring > section > a.progress.docs-sourcelink:indeterminate { - background-image: linear-gradient(to right, #375a7f 30%, #5e6d6f 30%); } - html.theme--documenter-dark .progress.is-link::-webkit-progress-value { - background-color: #1abc9c; } - html.theme--documenter-dark .progress.is-link::-moz-progress-bar { - background-color: #1abc9c; } - html.theme--documenter-dark .progress.is-link::-ms-fill { - background-color: #1abc9c; } - html.theme--documenter-dark .progress.is-link:indeterminate { - background-image: linear-gradient(to right, #1abc9c 30%, #5e6d6f 30%); } - html.theme--documenter-dark .progress.is-info::-webkit-progress-value { - background-color: #024c7d; } - html.theme--documenter-dark .progress.is-info::-moz-progress-bar { - background-color: #024c7d; } - html.theme--documenter-dark .progress.is-info::-ms-fill { - background-color: #024c7d; } - html.theme--documenter-dark .progress.is-info:indeterminate { - background-image: linear-gradient(to right, #024c7d 30%, #5e6d6f 30%); } - html.theme--documenter-dark .progress.is-success::-webkit-progress-value { - background-color: #008438; } - html.theme--documenter-dark .progress.is-success::-moz-progress-bar { - background-color: #008438; } - html.theme--documenter-dark .progress.is-success::-ms-fill { - background-color: #008438; } - html.theme--documenter-dark .progress.is-success:indeterminate { - background-image: linear-gradient(to right, #008438 30%, #5e6d6f 30%); } - html.theme--documenter-dark .progress.is-warning::-webkit-progress-value { - background-color: #ad8100; } - html.theme--documenter-dark .progress.is-warning::-moz-progress-bar { - background-color: #ad8100; } - html.theme--documenter-dark .progress.is-warning::-ms-fill { - background-color: #ad8100; } - html.theme--documenter-dark .progress.is-warning:indeterminate { - background-image: linear-gradient(to right, #ad8100 30%, #5e6d6f 30%); } - html.theme--documenter-dark .progress.is-danger::-webkit-progress-value { - background-color: #9e1b0d; } - html.theme--documenter-dark .progress.is-danger::-moz-progress-bar { - background-color: #9e1b0d; } - html.theme--documenter-dark .progress.is-danger::-ms-fill { - background-color: #9e1b0d; } - html.theme--documenter-dark .progress.is-danger:indeterminate { - background-image: linear-gradient(to right, #9e1b0d 30%, #5e6d6f 30%); } - html.theme--documenter-dark .progress:indeterminate { - animation-duration: 1.5s; - animation-iteration-count: infinite; - animation-name: moveIndeterminate; - animation-timing-function: linear; - background-color: #5e6d6f; - background-image: linear-gradient(to right, #fff 30%, #5e6d6f 30%); - background-position: top left; - background-repeat: no-repeat; - background-size: 150% 150%; } - html.theme--documenter-dark .progress:indeterminate::-webkit-progress-bar { - background-color: transparent; } - html.theme--documenter-dark .progress:indeterminate::-moz-progress-bar { - background-color: transparent; } - html.theme--documenter-dark .progress.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.progress { - height: 0.85em; } - html.theme--documenter-dark .progress.is-medium { - height: 1.25rem; } - html.theme--documenter-dark .progress.is-large { - height: 1.5rem; } - -@keyframes moveIndeterminate { - from { - background-position: 200% 0; } - to { - background-position: -200% 0; } } - html.theme--documenter-dark .table { - background-color: #343c3d; - color: #fff; } - html.theme--documenter-dark .table td, - html.theme--documenter-dark .table th { - border: 1px solid #5e6d6f; - border-width: 0 0 1px; - padding: 0.5em 0.75em; - vertical-align: top; } - html.theme--documenter-dark .table td.is-white, - html.theme--documenter-dark .table th.is-white { - background-color: white; - border-color: white; - color: #0a0a0a; } - html.theme--documenter-dark .table td.is-black, - html.theme--documenter-dark .table th.is-black { - background-color: #0a0a0a; - border-color: #0a0a0a; - color: white; } - html.theme--documenter-dark .table td.is-light, - html.theme--documenter-dark .table th.is-light { - background-color: #ecf0f1; - border-color: #ecf0f1; - color: #282f2f; } - html.theme--documenter-dark .table td.is-dark, - html.theme--documenter-dark .table th.is-dark { - background-color: #282f2f; - border-color: #282f2f; - color: #ecf0f1; } - html.theme--documenter-dark .table td.is-primary, - html.theme--documenter-dark .table th.is-primary { - background-color: #375a7f; - border-color: #375a7f; - color: #fff; } - html.theme--documenter-dark .table td.is-link, - html.theme--documenter-dark .table th.is-link { - background-color: #1abc9c; - border-color: #1abc9c; - color: #fff; } - html.theme--documenter-dark .table td.is-info, - html.theme--documenter-dark .table th.is-info { - background-color: #024c7d; - border-color: #024c7d; - color: #fff; } - html.theme--documenter-dark .table td.is-success, - html.theme--documenter-dark .table th.is-success { - background-color: #008438; - border-color: #008438; - color: #fff; } - html.theme--documenter-dark .table td.is-warning, - html.theme--documenter-dark .table th.is-warning { - background-color: #ad8100; - border-color: #ad8100; - color: #fff; } - html.theme--documenter-dark .table td.is-danger, - html.theme--documenter-dark .table th.is-danger { - background-color: #9e1b0d; - border-color: #9e1b0d; - color: #fff; } - html.theme--documenter-dark .table td.is-narrow, - html.theme--documenter-dark .table th.is-narrow { - white-space: nowrap; - width: 1%; } - html.theme--documenter-dark .table td.is-selected, - html.theme--documenter-dark .table th.is-selected { - background-color: #375a7f; - color: #fff; } - html.theme--documenter-dark .table td.is-selected a, - html.theme--documenter-dark .table td.is-selected strong, - html.theme--documenter-dark .table th.is-selected a, - html.theme--documenter-dark .table th.is-selected strong { - color: currentColor; } - html.theme--documenter-dark .table th { - color: #f2f2f2; } - html.theme--documenter-dark .table th:not([align]) { - text-align: left; } - html.theme--documenter-dark .table tr.is-selected { - background-color: #375a7f; - color: #fff; } - html.theme--documenter-dark .table tr.is-selected a, - html.theme--documenter-dark .table tr.is-selected strong { - color: currentColor; } - html.theme--documenter-dark .table tr.is-selected td, - html.theme--documenter-dark .table tr.is-selected th { - border-color: #fff; - color: currentColor; } - html.theme--documenter-dark .table thead { - background-color: transparent; } - html.theme--documenter-dark .table thead td, - html.theme--documenter-dark .table thead th { - border-width: 0 0 2px; - color: #f2f2f2; } - html.theme--documenter-dark .table tfoot { - background-color: transparent; } - html.theme--documenter-dark .table tfoot td, - html.theme--documenter-dark .table tfoot th { - border-width: 2px 0 0; - color: #f2f2f2; } - html.theme--documenter-dark .table tbody { - background-color: transparent; } - html.theme--documenter-dark .table tbody tr:last-child td, - html.theme--documenter-dark .table tbody tr:last-child th { - border-bottom-width: 0; } - html.theme--documenter-dark .table.is-bordered td, - html.theme--documenter-dark .table.is-bordered th { - border-width: 1px; } - html.theme--documenter-dark .table.is-bordered tr:last-child td, - html.theme--documenter-dark .table.is-bordered tr:last-child th { - border-bottom-width: 1px; } - html.theme--documenter-dark .table.is-fullwidth { - width: 100%; } - html.theme--documenter-dark .table.is-hoverable tbody tr:not(.is-selected):hover { - background-color: #282f2f; } - html.theme--documenter-dark .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover { - background-color: #282f2f; } - html.theme--documenter-dark .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(even) { - background-color: #2d3435; } - html.theme--documenter-dark .table.is-narrow td, - html.theme--documenter-dark .table.is-narrow th { - padding: 0.25em 0.5em; } - html.theme--documenter-dark .table.is-striped tbody tr:not(.is-selected):nth-child(even) { - background-color: #282f2f; } - html.theme--documenter-dark .table-container { - -webkit-overflow-scrolling: touch; - overflow: auto; - overflow-y: hidden; - max-width: 100%; } - html.theme--documenter-dark .tags { - align-items: center; - display: flex; - flex-wrap: wrap; - justify-content: flex-start; } - html.theme--documenter-dark .tags .tag, html.theme--documenter-dark .tags .content kbd, html.theme--documenter-dark .content .tags kbd, html.theme--documenter-dark .tags .docstring > section > a.docs-sourcelink { - margin-bottom: 0.5rem; } - html.theme--documenter-dark .tags .tag:not(:last-child), html.theme--documenter-dark .tags .content kbd:not(:last-child), html.theme--documenter-dark .content .tags kbd:not(:last-child), html.theme--documenter-dark .tags .docstring > section > a.docs-sourcelink:not(:last-child) { - margin-right: 0.5rem; } - html.theme--documenter-dark .tags:last-child { - margin-bottom: -0.5rem; } - html.theme--documenter-dark .tags:not(:last-child) { - margin-bottom: 1rem; } - html.theme--documenter-dark .tags.are-medium .tag:not(.is-normal):not(.is-large), html.theme--documenter-dark .tags.are-medium .content kbd:not(.is-normal):not(.is-large), html.theme--documenter-dark .content .tags.are-medium kbd:not(.is-normal):not(.is-large), html.theme--documenter-dark .tags.are-medium .docstring > section > a.docs-sourcelink:not(.is-normal):not(.is-large) { - font-size: 15px; } - html.theme--documenter-dark .tags.are-large .tag:not(.is-normal):not(.is-medium), html.theme--documenter-dark .tags.are-large .content kbd:not(.is-normal):not(.is-medium), html.theme--documenter-dark .content .tags.are-large kbd:not(.is-normal):not(.is-medium), html.theme--documenter-dark .tags.are-large .docstring > section > a.docs-sourcelink:not(.is-normal):not(.is-medium) { - font-size: 1.25rem; } - html.theme--documenter-dark .tags.is-centered { - justify-content: center; } - html.theme--documenter-dark .tags.is-centered .tag, html.theme--documenter-dark .tags.is-centered .content kbd, html.theme--documenter-dark .content .tags.is-centered kbd, html.theme--documenter-dark .tags.is-centered .docstring > section > a.docs-sourcelink { - margin-right: 0.25rem; - margin-left: 0.25rem; } - html.theme--documenter-dark .tags.is-right { - justify-content: flex-end; } - html.theme--documenter-dark .tags.is-right .tag:not(:first-child), html.theme--documenter-dark .tags.is-right .content kbd:not(:first-child), html.theme--documenter-dark .content .tags.is-right kbd:not(:first-child), html.theme--documenter-dark .tags.is-right .docstring > section > a.docs-sourcelink:not(:first-child) { - margin-left: 0.5rem; } - html.theme--documenter-dark .tags.is-right .tag:not(:last-child), html.theme--documenter-dark .tags.is-right .content kbd:not(:last-child), html.theme--documenter-dark .content .tags.is-right kbd:not(:last-child), html.theme--documenter-dark .tags.is-right .docstring > section > a.docs-sourcelink:not(:last-child) { - margin-right: 0; } - html.theme--documenter-dark .tags.has-addons .tag, html.theme--documenter-dark .tags.has-addons .content kbd, html.theme--documenter-dark .content .tags.has-addons kbd, html.theme--documenter-dark .tags.has-addons .docstring > section > a.docs-sourcelink { - margin-right: 0; } - html.theme--documenter-dark .tags.has-addons .tag:not(:first-child), html.theme--documenter-dark .tags.has-addons .content kbd:not(:first-child), html.theme--documenter-dark .content .tags.has-addons kbd:not(:first-child), html.theme--documenter-dark .tags.has-addons .docstring > section > a.docs-sourcelink:not(:first-child) { - margin-left: 0; - border-bottom-left-radius: 0; - border-top-left-radius: 0; } - html.theme--documenter-dark .tags.has-addons .tag:not(:last-child), html.theme--documenter-dark .tags.has-addons .content kbd:not(:last-child), html.theme--documenter-dark .content .tags.has-addons kbd:not(:last-child), html.theme--documenter-dark .tags.has-addons .docstring > section > a.docs-sourcelink:not(:last-child) { - border-bottom-right-radius: 0; - border-top-right-radius: 0; } - html.theme--documenter-dark .tag:not(body), html.theme--documenter-dark .content kbd:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink:not(body) { - align-items: center; - background-color: #282f2f; - border-radius: 0.4em; - color: #fff; - display: inline-flex; - font-size: 0.85em; - height: 2em; - justify-content: center; - line-height: 1.5; - padding-left: 0.75em; - padding-right: 0.75em; - white-space: nowrap; } - html.theme--documenter-dark .tag:not(body) .delete, html.theme--documenter-dark .content kbd:not(body) .delete, html.theme--documenter-dark .docstring > section > a.docs-sourcelink:not(body) .delete { - margin-left: 0.25rem; - margin-right: -0.375rem; } - html.theme--documenter-dark .tag.is-white:not(body), html.theme--documenter-dark .content kbd.is-white:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-white:not(body) { - background-color: white; - color: #0a0a0a; } - html.theme--documenter-dark .tag.is-black:not(body), html.theme--documenter-dark .content kbd.is-black:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-black:not(body) { - background-color: #0a0a0a; - color: white; } - html.theme--documenter-dark .tag.is-light:not(body), html.theme--documenter-dark .content kbd.is-light:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-light:not(body) { - background-color: #ecf0f1; - color: #282f2f; } - html.theme--documenter-dark .tag.is-dark:not(body), html.theme--documenter-dark .content kbd:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-dark:not(body), html.theme--documenter-dark .content .docstring > section > kbd:not(body) { - background-color: #282f2f; - color: #ecf0f1; } - html.theme--documenter-dark .tag.is-primary:not(body), html.theme--documenter-dark .content kbd.is-primary:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink:not(body) { - background-color: #375a7f; - color: #fff; } - html.theme--documenter-dark .tag.is-link:not(body), html.theme--documenter-dark .content kbd.is-link:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-link:not(body) { - background-color: #1abc9c; - color: #fff; } - html.theme--documenter-dark .tag.is-info:not(body), html.theme--documenter-dark .content kbd.is-info:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-info:not(body) { - background-color: #024c7d; - color: #fff; } - html.theme--documenter-dark .tag.is-success:not(body), html.theme--documenter-dark .content kbd.is-success:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-success:not(body) { - background-color: #008438; - color: #fff; } - html.theme--documenter-dark .tag.is-warning:not(body), html.theme--documenter-dark .content kbd.is-warning:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-warning:not(body) { - background-color: #ad8100; - color: #fff; } - html.theme--documenter-dark .tag.is-danger:not(body), html.theme--documenter-dark .content kbd.is-danger:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-danger:not(body) { - background-color: #9e1b0d; - color: #fff; } - html.theme--documenter-dark .tag.is-normal:not(body), html.theme--documenter-dark .content kbd.is-normal:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-normal:not(body) { - font-size: 0.85em; } - html.theme--documenter-dark .tag.is-medium:not(body), html.theme--documenter-dark .content kbd.is-medium:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-medium:not(body) { - font-size: 15px; } - html.theme--documenter-dark .tag.is-large:not(body), html.theme--documenter-dark .content kbd.is-large:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-large:not(body) { - font-size: 1.25rem; } - html.theme--documenter-dark .tag:not(body) .icon:first-child:not(:last-child), html.theme--documenter-dark .content kbd:not(body) .icon:first-child:not(:last-child), html.theme--documenter-dark .docstring > section > a.docs-sourcelink:not(body) .icon:first-child:not(:last-child) { - margin-left: -0.375em; - margin-right: 0.1875em; } - html.theme--documenter-dark .tag:not(body) .icon:last-child:not(:first-child), html.theme--documenter-dark .content kbd:not(body) .icon:last-child:not(:first-child), html.theme--documenter-dark .docstring > section > a.docs-sourcelink:not(body) .icon:last-child:not(:first-child) { - margin-left: 0.1875em; - margin-right: -0.375em; } - html.theme--documenter-dark .tag:not(body) .icon:first-child:last-child, html.theme--documenter-dark .content kbd:not(body) .icon:first-child:last-child, html.theme--documenter-dark .docstring > section > a.docs-sourcelink:not(body) .icon:first-child:last-child { - margin-left: -0.375em; - margin-right: -0.375em; } - html.theme--documenter-dark .tag.is-delete:not(body), html.theme--documenter-dark .content kbd.is-delete:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-delete:not(body) { - margin-left: 1px; - padding: 0; - position: relative; - width: 2em; } - html.theme--documenter-dark .tag.is-delete:not(body)::before, html.theme--documenter-dark .content kbd.is-delete:not(body)::before, html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-delete:not(body)::before, html.theme--documenter-dark .tag.is-delete:not(body)::after, html.theme--documenter-dark .content kbd.is-delete:not(body)::after, html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-delete:not(body)::after { - background-color: currentColor; - content: ""; - display: block; - left: 50%; - position: absolute; - top: 50%; - transform: translateX(-50%) translateY(-50%) rotate(45deg); - transform-origin: center center; } - html.theme--documenter-dark .tag.is-delete:not(body)::before, html.theme--documenter-dark .content kbd.is-delete:not(body)::before, html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-delete:not(body)::before { - height: 1px; - width: 50%; } - html.theme--documenter-dark .tag.is-delete:not(body)::after, html.theme--documenter-dark .content kbd.is-delete:not(body)::after, html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-delete:not(body)::after { - height: 50%; - width: 1px; } - html.theme--documenter-dark .tag.is-delete:not(body):hover, html.theme--documenter-dark .content kbd.is-delete:not(body):hover, html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-delete:not(body):hover, html.theme--documenter-dark .tag.is-delete:not(body):focus, html.theme--documenter-dark .content kbd.is-delete:not(body):focus, html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-delete:not(body):focus { - background-color: #1d2122; } - html.theme--documenter-dark .tag.is-delete:not(body):active, html.theme--documenter-dark .content kbd.is-delete:not(body):active, html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-delete:not(body):active { - background-color: #111414; } - html.theme--documenter-dark .tag.is-rounded:not(body), html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:not(body), html.theme--documenter-dark .content kbd.is-rounded:not(body), html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search > input:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-rounded:not(body) { - border-radius: 290486px; } - html.theme--documenter-dark a.tag:hover, html.theme--documenter-dark .docstring > section > a.docs-sourcelink:hover { - text-decoration: underline; } - html.theme--documenter-dark .title, - html.theme--documenter-dark .subtitle { - word-break: break-word; } - html.theme--documenter-dark .title em, - html.theme--documenter-dark .title span, - html.theme--documenter-dark .subtitle em, - html.theme--documenter-dark .subtitle span { - font-weight: inherit; } - html.theme--documenter-dark .title sub, - html.theme--documenter-dark .subtitle sub { - font-size: 0.75em; } - html.theme--documenter-dark .title sup, - html.theme--documenter-dark .subtitle sup { - font-size: 0.75em; } - html.theme--documenter-dark .title .tag, html.theme--documenter-dark .title .content kbd, html.theme--documenter-dark .content .title kbd, html.theme--documenter-dark .title .docstring > section > a.docs-sourcelink, - html.theme--documenter-dark .subtitle .tag, - html.theme--documenter-dark .subtitle .content kbd, - html.theme--documenter-dark .content .subtitle kbd, - html.theme--documenter-dark .subtitle .docstring > section > a.docs-sourcelink { - vertical-align: middle; } - html.theme--documenter-dark .title { - color: #fff; - font-size: 2rem; - font-weight: 500; - line-height: 1.125; } - html.theme--documenter-dark .title strong { - color: inherit; - font-weight: inherit; } - html.theme--documenter-dark .title + .highlight { - margin-top: -0.75rem; } - html.theme--documenter-dark .title:not(.is-spaced) + .subtitle { - margin-top: -1.25rem; } - html.theme--documenter-dark .title.is-1 { - font-size: 3rem; } - html.theme--documenter-dark .title.is-2 { - font-size: 2.5rem; } - html.theme--documenter-dark .title.is-3 { - font-size: 2rem; } - html.theme--documenter-dark .title.is-4 { - font-size: 1.5rem; } - html.theme--documenter-dark .title.is-5 { - font-size: 1.25rem; } - html.theme--documenter-dark .title.is-6 { - font-size: 15px; } - html.theme--documenter-dark .title.is-7 { - font-size: 0.85em; } - html.theme--documenter-dark .subtitle { - color: #8c9b9d; - font-size: 1.25rem; - font-weight: 400; - line-height: 1.25; } - html.theme--documenter-dark .subtitle strong { - color: #8c9b9d; - font-weight: 600; } - html.theme--documenter-dark .subtitle:not(.is-spaced) + .title { - margin-top: -1.25rem; } - html.theme--documenter-dark .subtitle.is-1 { - font-size: 3rem; } - html.theme--documenter-dark .subtitle.is-2 { - font-size: 2.5rem; } - html.theme--documenter-dark .subtitle.is-3 { - font-size: 2rem; } - html.theme--documenter-dark .subtitle.is-4 { - font-size: 1.5rem; } - html.theme--documenter-dark .subtitle.is-5 { - font-size: 1.25rem; } - html.theme--documenter-dark .subtitle.is-6 { - font-size: 15px; } - html.theme--documenter-dark .subtitle.is-7 { - font-size: 0.85em; } - html.theme--documenter-dark .heading { - display: block; - font-size: 11px; - letter-spacing: 1px; - margin-bottom: 5px; - text-transform: uppercase; } - html.theme--documenter-dark .highlight { - font-weight: 400; - max-width: 100%; - overflow: hidden; - padding: 0; } - html.theme--documenter-dark .highlight pre { - overflow: auto; - max-width: 100%; } - html.theme--documenter-dark .number { - align-items: center; - background-color: #282f2f; - border-radius: 290486px; - display: inline-flex; - font-size: 1.25rem; - height: 2em; - justify-content: center; - margin-right: 1.5rem; - min-width: 2.5em; - padding: 0.25rem 0.5rem; - text-align: center; - vertical-align: top; } - html.theme--documenter-dark .select select, html.theme--documenter-dark .textarea, html.theme--documenter-dark .input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input { - background-color: #1f2424; - border-color: #5e6d6f; - border-radius: 0.4em; - color: #dbdee0; } - html.theme--documenter-dark .select select::-moz-placeholder, html.theme--documenter-dark .textarea::-moz-placeholder, html.theme--documenter-dark .input::-moz-placeholder, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input::-moz-placeholder { - color: rgba(219, 222, 224, 0.3); } - html.theme--documenter-dark .select select::-webkit-input-placeholder, html.theme--documenter-dark .textarea::-webkit-input-placeholder, html.theme--documenter-dark .input::-webkit-input-placeholder, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input::-webkit-input-placeholder { - color: rgba(219, 222, 224, 0.3); } - html.theme--documenter-dark .select select:-moz-placeholder, html.theme--documenter-dark .textarea:-moz-placeholder, html.theme--documenter-dark .input:-moz-placeholder, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:-moz-placeholder { - color: rgba(219, 222, 224, 0.3); } - html.theme--documenter-dark .select select:-ms-input-placeholder, html.theme--documenter-dark .textarea:-ms-input-placeholder, html.theme--documenter-dark .input:-ms-input-placeholder, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:-ms-input-placeholder { - color: rgba(219, 222, 224, 0.3); } - html.theme--documenter-dark .select select:hover, html.theme--documenter-dark .textarea:hover, html.theme--documenter-dark .input:hover, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:hover, html.theme--documenter-dark .select select.is-hovered, html.theme--documenter-dark .is-hovered.textarea, html.theme--documenter-dark .is-hovered.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-hovered { - border-color: #8c9b9d; } - html.theme--documenter-dark .select select:focus, html.theme--documenter-dark .textarea:focus, html.theme--documenter-dark .input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:focus, html.theme--documenter-dark .select select.is-focused, html.theme--documenter-dark .is-focused.textarea, html.theme--documenter-dark .is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .select select:active, html.theme--documenter-dark .textarea:active, html.theme--documenter-dark .input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:active, html.theme--documenter-dark .select select.is-active, html.theme--documenter-dark .is-active.textarea, html.theme--documenter-dark .is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active { - border-color: #1abc9c; - box-shadow: 0 0 0 0.125em rgba(26, 188, 156, 0.25); } - html.theme--documenter-dark .select select[disabled], html.theme--documenter-dark .textarea[disabled], html.theme--documenter-dark .input[disabled], html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input[disabled], fieldset[disabled] html.theme--documenter-dark .select select, fieldset[disabled] html.theme--documenter-dark .textarea, fieldset[disabled] html.theme--documenter-dark .input, fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input { - background-color: #8c9b9d; - border-color: #282f2f; - box-shadow: none; - color: white; } - html.theme--documenter-dark .select select[disabled]::-moz-placeholder, html.theme--documenter-dark .textarea[disabled]::-moz-placeholder, html.theme--documenter-dark .input[disabled]::-moz-placeholder, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input[disabled]::-moz-placeholder, fieldset[disabled] html.theme--documenter-dark .select select::-moz-placeholder, fieldset[disabled] html.theme--documenter-dark .textarea::-moz-placeholder, fieldset[disabled] html.theme--documenter-dark .input::-moz-placeholder, fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input::-moz-placeholder { - color: rgba(255, 255, 255, 0.3); } - html.theme--documenter-dark .select select[disabled]::-webkit-input-placeholder, html.theme--documenter-dark .textarea[disabled]::-webkit-input-placeholder, html.theme--documenter-dark .input[disabled]::-webkit-input-placeholder, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input[disabled]::-webkit-input-placeholder, fieldset[disabled] html.theme--documenter-dark .select select::-webkit-input-placeholder, fieldset[disabled] html.theme--documenter-dark .textarea::-webkit-input-placeholder, fieldset[disabled] html.theme--documenter-dark .input::-webkit-input-placeholder, fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input::-webkit-input-placeholder { - color: rgba(255, 255, 255, 0.3); } - html.theme--documenter-dark .select select[disabled]:-moz-placeholder, html.theme--documenter-dark .textarea[disabled]:-moz-placeholder, html.theme--documenter-dark .input[disabled]:-moz-placeholder, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input[disabled]:-moz-placeholder, fieldset[disabled] html.theme--documenter-dark .select select:-moz-placeholder, fieldset[disabled] html.theme--documenter-dark .textarea:-moz-placeholder, fieldset[disabled] html.theme--documenter-dark .input:-moz-placeholder, fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:-moz-placeholder { - color: rgba(255, 255, 255, 0.3); } - html.theme--documenter-dark .select select[disabled]:-ms-input-placeholder, html.theme--documenter-dark .textarea[disabled]:-ms-input-placeholder, html.theme--documenter-dark .input[disabled]:-ms-input-placeholder, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input[disabled]:-ms-input-placeholder, fieldset[disabled] html.theme--documenter-dark .select select:-ms-input-placeholder, fieldset[disabled] html.theme--documenter-dark .textarea:-ms-input-placeholder, fieldset[disabled] html.theme--documenter-dark .input:-ms-input-placeholder, fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:-ms-input-placeholder { - color: rgba(255, 255, 255, 0.3); } - html.theme--documenter-dark .textarea, html.theme--documenter-dark .input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input { - box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.1); - max-width: 100%; - width: 100%; } - html.theme--documenter-dark .textarea[readonly], html.theme--documenter-dark .input[readonly], html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input[readonly] { - box-shadow: none; } - html.theme--documenter-dark .is-white.textarea, html.theme--documenter-dark .is-white.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-white { - border-color: white; } - html.theme--documenter-dark .is-white.textarea:focus, html.theme--documenter-dark .is-white.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-white:focus, html.theme--documenter-dark .is-white.is-focused.textarea, html.theme--documenter-dark .is-white.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .is-white.textarea:active, html.theme--documenter-dark .is-white.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-white:active, html.theme--documenter-dark .is-white.is-active.textarea, html.theme--documenter-dark .is-white.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active { - box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); } - html.theme--documenter-dark .is-black.textarea, html.theme--documenter-dark .is-black.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-black { - border-color: #0a0a0a; } - html.theme--documenter-dark .is-black.textarea:focus, html.theme--documenter-dark .is-black.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-black:focus, html.theme--documenter-dark .is-black.is-focused.textarea, html.theme--documenter-dark .is-black.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .is-black.textarea:active, html.theme--documenter-dark .is-black.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-black:active, html.theme--documenter-dark .is-black.is-active.textarea, html.theme--documenter-dark .is-black.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active { - box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); } - html.theme--documenter-dark .is-light.textarea, html.theme--documenter-dark .is-light.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-light { - border-color: #ecf0f1; } - html.theme--documenter-dark .is-light.textarea:focus, html.theme--documenter-dark .is-light.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-light:focus, html.theme--documenter-dark .is-light.is-focused.textarea, html.theme--documenter-dark .is-light.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .is-light.textarea:active, html.theme--documenter-dark .is-light.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-light:active, html.theme--documenter-dark .is-light.is-active.textarea, html.theme--documenter-dark .is-light.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active { - box-shadow: 0 0 0 0.125em rgba(236, 240, 241, 0.25); } - html.theme--documenter-dark .is-dark.textarea, html.theme--documenter-dark .content kbd.textarea, html.theme--documenter-dark .is-dark.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-dark, html.theme--documenter-dark .content kbd.input { - border-color: #282f2f; } - html.theme--documenter-dark .is-dark.textarea:focus, html.theme--documenter-dark .content kbd.textarea:focus, html.theme--documenter-dark .is-dark.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-dark:focus, html.theme--documenter-dark .content kbd.input:focus, html.theme--documenter-dark .is-dark.is-focused.textarea, html.theme--documenter-dark .content kbd.is-focused.textarea, html.theme--documenter-dark .is-dark.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .content kbd.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search > input.is-focused, html.theme--documenter-dark .is-dark.textarea:active, html.theme--documenter-dark .content kbd.textarea:active, html.theme--documenter-dark .is-dark.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-dark:active, html.theme--documenter-dark .content kbd.input:active, html.theme--documenter-dark .is-dark.is-active.textarea, html.theme--documenter-dark .content kbd.is-active.textarea, html.theme--documenter-dark .is-dark.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active, html.theme--documenter-dark .content kbd.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search > input.is-active { - box-shadow: 0 0 0 0.125em rgba(40, 47, 47, 0.25); } - html.theme--documenter-dark .is-primary.textarea, html.theme--documenter-dark .docstring > section > a.textarea.docs-sourcelink, html.theme--documenter-dark .is-primary.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-primary, html.theme--documenter-dark .docstring > section > a.input.docs-sourcelink { - border-color: #375a7f; } - html.theme--documenter-dark .is-primary.textarea:focus, html.theme--documenter-dark .docstring > section > a.textarea.docs-sourcelink:focus, html.theme--documenter-dark .is-primary.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-primary:focus, html.theme--documenter-dark .docstring > section > a.input.docs-sourcelink:focus, html.theme--documenter-dark .is-primary.is-focused.textarea, html.theme--documenter-dark .docstring > section > a.is-focused.textarea.docs-sourcelink, html.theme--documenter-dark .is-primary.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .docstring > section > a.is-focused.input.docs-sourcelink, html.theme--documenter-dark .is-primary.textarea:active, html.theme--documenter-dark .docstring > section > a.textarea.docs-sourcelink:active, html.theme--documenter-dark .is-primary.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-primary:active, html.theme--documenter-dark .docstring > section > a.input.docs-sourcelink:active, html.theme--documenter-dark .is-primary.is-active.textarea, html.theme--documenter-dark .docstring > section > a.is-active.textarea.docs-sourcelink, html.theme--documenter-dark .is-primary.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active, html.theme--documenter-dark .docstring > section > a.is-active.input.docs-sourcelink { - box-shadow: 0 0 0 0.125em rgba(55, 90, 127, 0.25); } - html.theme--documenter-dark .is-link.textarea, html.theme--documenter-dark .is-link.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-link { - border-color: #1abc9c; } - html.theme--documenter-dark .is-link.textarea:focus, html.theme--documenter-dark .is-link.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-link:focus, html.theme--documenter-dark .is-link.is-focused.textarea, html.theme--documenter-dark .is-link.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .is-link.textarea:active, html.theme--documenter-dark .is-link.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-link:active, html.theme--documenter-dark .is-link.is-active.textarea, html.theme--documenter-dark .is-link.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active { - box-shadow: 0 0 0 0.125em rgba(26, 188, 156, 0.25); } - html.theme--documenter-dark .is-info.textarea, html.theme--documenter-dark .is-info.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-info { - border-color: #024c7d; } - html.theme--documenter-dark .is-info.textarea:focus, html.theme--documenter-dark .is-info.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-info:focus, html.theme--documenter-dark .is-info.is-focused.textarea, html.theme--documenter-dark .is-info.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .is-info.textarea:active, html.theme--documenter-dark .is-info.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-info:active, html.theme--documenter-dark .is-info.is-active.textarea, html.theme--documenter-dark .is-info.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active { - box-shadow: 0 0 0 0.125em rgba(2, 76, 125, 0.25); } - html.theme--documenter-dark .is-success.textarea, html.theme--documenter-dark .is-success.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-success { - border-color: #008438; } - html.theme--documenter-dark .is-success.textarea:focus, html.theme--documenter-dark .is-success.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-success:focus, html.theme--documenter-dark .is-success.is-focused.textarea, html.theme--documenter-dark .is-success.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .is-success.textarea:active, html.theme--documenter-dark .is-success.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-success:active, html.theme--documenter-dark .is-success.is-active.textarea, html.theme--documenter-dark .is-success.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active { - box-shadow: 0 0 0 0.125em rgba(0, 132, 56, 0.25); } - html.theme--documenter-dark .is-warning.textarea, html.theme--documenter-dark .is-warning.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-warning { - border-color: #ad8100; } - html.theme--documenter-dark .is-warning.textarea:focus, html.theme--documenter-dark .is-warning.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-warning:focus, html.theme--documenter-dark .is-warning.is-focused.textarea, html.theme--documenter-dark .is-warning.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .is-warning.textarea:active, html.theme--documenter-dark .is-warning.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-warning:active, html.theme--documenter-dark .is-warning.is-active.textarea, html.theme--documenter-dark .is-warning.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active { - box-shadow: 0 0 0 0.125em rgba(173, 129, 0, 0.25); } - html.theme--documenter-dark .is-danger.textarea, html.theme--documenter-dark .is-danger.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-danger { - border-color: #9e1b0d; } - html.theme--documenter-dark .is-danger.textarea:focus, html.theme--documenter-dark .is-danger.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-danger:focus, html.theme--documenter-dark .is-danger.is-focused.textarea, html.theme--documenter-dark .is-danger.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .is-danger.textarea:active, html.theme--documenter-dark .is-danger.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-danger:active, html.theme--documenter-dark .is-danger.is-active.textarea, html.theme--documenter-dark .is-danger.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active { - box-shadow: 0 0 0 0.125em rgba(158, 27, 13, 0.25); } - html.theme--documenter-dark .is-small.textarea, html.theme--documenter-dark .is-small.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input { - border-radius: 3px; - font-size: 0.85em; } - html.theme--documenter-dark .is-medium.textarea, html.theme--documenter-dark .is-medium.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-medium { - font-size: 1.25rem; } - html.theme--documenter-dark .is-large.textarea, html.theme--documenter-dark .is-large.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-large { - font-size: 1.5rem; } - html.theme--documenter-dark .is-fullwidth.textarea, html.theme--documenter-dark .is-fullwidth.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-fullwidth { - display: block; - width: 100%; } - html.theme--documenter-dark .is-inline.textarea, html.theme--documenter-dark .is-inline.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-inline { - display: inline; - width: auto; } - html.theme--documenter-dark .input.is-rounded, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input { - border-radius: 290486px; - padding-left: 1em; - padding-right: 1em; } - html.theme--documenter-dark .input.is-static, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-static { - background-color: transparent; - border-color: transparent; - box-shadow: none; - padding-left: 0; - padding-right: 0; } - html.theme--documenter-dark .textarea { - display: block; - max-width: 100%; - min-width: 100%; - padding: 0.625em; - resize: vertical; } - html.theme--documenter-dark .textarea:not([rows]) { - max-height: 600px; - min-height: 120px; } - html.theme--documenter-dark .textarea[rows] { - height: initial; } - html.theme--documenter-dark .textarea.has-fixed-size { - resize: none; } - html.theme--documenter-dark .radio, html.theme--documenter-dark .checkbox { - cursor: pointer; - display: inline-block; - line-height: 1.25; - position: relative; } - html.theme--documenter-dark .radio input, html.theme--documenter-dark .checkbox input { - cursor: pointer; } - html.theme--documenter-dark .radio:hover, html.theme--documenter-dark .checkbox:hover { - color: #8c9b9d; } - html.theme--documenter-dark .radio[disabled], html.theme--documenter-dark .checkbox[disabled], fieldset[disabled] html.theme--documenter-dark .radio, fieldset[disabled] html.theme--documenter-dark .checkbox { - color: white; - cursor: not-allowed; } - html.theme--documenter-dark .radio + .radio { - margin-left: 0.5em; } - html.theme--documenter-dark .select { - display: inline-block; - max-width: 100%; - position: relative; - vertical-align: top; } - html.theme--documenter-dark .select:not(.is-multiple) { - height: 2.25em; } - html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading)::after { - border-color: #1abc9c; - right: 1.125em; - z-index: 4; } - html.theme--documenter-dark .select.is-rounded select, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.select select { - border-radius: 290486px; - padding-left: 1em; } - html.theme--documenter-dark .select select { - cursor: pointer; - display: block; - font-size: 1em; - max-width: 100%; - outline: none; } - html.theme--documenter-dark .select select::-ms-expand { - display: none; } - html.theme--documenter-dark .select select[disabled]:hover, fieldset[disabled] html.theme--documenter-dark .select select:hover { - border-color: #282f2f; } - html.theme--documenter-dark .select select:not([multiple]) { - padding-right: 2.5em; } - html.theme--documenter-dark .select select[multiple] { - height: auto; - padding: 0; } - html.theme--documenter-dark .select select[multiple] option { - padding: 0.5em 1em; } - html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading):hover::after { - border-color: #8c9b9d; } - html.theme--documenter-dark .select.is-white:not(:hover)::after { - border-color: white; } - html.theme--documenter-dark .select.is-white select { - border-color: white; } - html.theme--documenter-dark .select.is-white select:hover, html.theme--documenter-dark .select.is-white select.is-hovered { - border-color: #f2f2f2; } - html.theme--documenter-dark .select.is-white select:focus, html.theme--documenter-dark .select.is-white select.is-focused, html.theme--documenter-dark .select.is-white select:active, html.theme--documenter-dark .select.is-white select.is-active { - box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); } - html.theme--documenter-dark .select.is-black:not(:hover)::after { - border-color: #0a0a0a; } - html.theme--documenter-dark .select.is-black select { - border-color: #0a0a0a; } - html.theme--documenter-dark .select.is-black select:hover, html.theme--documenter-dark .select.is-black select.is-hovered { - border-color: black; } - html.theme--documenter-dark .select.is-black select:focus, html.theme--documenter-dark .select.is-black select.is-focused, html.theme--documenter-dark .select.is-black select:active, html.theme--documenter-dark .select.is-black select.is-active { - box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); } - html.theme--documenter-dark .select.is-light:not(:hover)::after { - border-color: #ecf0f1; } - html.theme--documenter-dark .select.is-light select { - border-color: #ecf0f1; } - html.theme--documenter-dark .select.is-light select:hover, html.theme--documenter-dark .select.is-light select.is-hovered { - border-color: #dde4e6; } - html.theme--documenter-dark .select.is-light select:focus, html.theme--documenter-dark .select.is-light select.is-focused, html.theme--documenter-dark .select.is-light select:active, html.theme--documenter-dark .select.is-light select.is-active { - box-shadow: 0 0 0 0.125em rgba(236, 240, 241, 0.25); } - html.theme--documenter-dark .select.is-dark:not(:hover)::after, html.theme--documenter-dark .content kbd.select:not(:hover)::after { - border-color: #282f2f; } - html.theme--documenter-dark .select.is-dark select, html.theme--documenter-dark .content kbd.select select { - border-color: #282f2f; } - html.theme--documenter-dark .select.is-dark select:hover, html.theme--documenter-dark .content kbd.select select:hover, html.theme--documenter-dark .select.is-dark select.is-hovered, html.theme--documenter-dark .content kbd.select select.is-hovered { - border-color: #1d2122; } - html.theme--documenter-dark .select.is-dark select:focus, html.theme--documenter-dark .content kbd.select select:focus, html.theme--documenter-dark .select.is-dark select.is-focused, html.theme--documenter-dark .content kbd.select select.is-focused, html.theme--documenter-dark .select.is-dark select:active, html.theme--documenter-dark .content kbd.select select:active, html.theme--documenter-dark .select.is-dark select.is-active, html.theme--documenter-dark .content kbd.select select.is-active { - box-shadow: 0 0 0 0.125em rgba(40, 47, 47, 0.25); } - html.theme--documenter-dark .select.is-primary:not(:hover)::after, html.theme--documenter-dark .docstring > section > a.select.docs-sourcelink:not(:hover)::after { - border-color: #375a7f; } - html.theme--documenter-dark .select.is-primary select, html.theme--documenter-dark .docstring > section > a.select.docs-sourcelink select { - border-color: #375a7f; } - html.theme--documenter-dark .select.is-primary select:hover, html.theme--documenter-dark .docstring > section > a.select.docs-sourcelink select:hover, html.theme--documenter-dark .select.is-primary select.is-hovered, html.theme--documenter-dark .docstring > section > a.select.docs-sourcelink select.is-hovered { - border-color: #2f4d6d; } - html.theme--documenter-dark .select.is-primary select:focus, html.theme--documenter-dark .docstring > section > a.select.docs-sourcelink select:focus, html.theme--documenter-dark .select.is-primary select.is-focused, html.theme--documenter-dark .docstring > section > a.select.docs-sourcelink select.is-focused, html.theme--documenter-dark .select.is-primary select:active, html.theme--documenter-dark .docstring > section > a.select.docs-sourcelink select:active, html.theme--documenter-dark .select.is-primary select.is-active, html.theme--documenter-dark .docstring > section > a.select.docs-sourcelink select.is-active { - box-shadow: 0 0 0 0.125em rgba(55, 90, 127, 0.25); } - html.theme--documenter-dark .select.is-link:not(:hover)::after { - border-color: #1abc9c; } - html.theme--documenter-dark .select.is-link select { - border-color: #1abc9c; } - html.theme--documenter-dark .select.is-link select:hover, html.theme--documenter-dark .select.is-link select.is-hovered { - border-color: #17a689; } - html.theme--documenter-dark .select.is-link select:focus, html.theme--documenter-dark .select.is-link select.is-focused, html.theme--documenter-dark .select.is-link select:active, html.theme--documenter-dark .select.is-link select.is-active { - box-shadow: 0 0 0 0.125em rgba(26, 188, 156, 0.25); } - html.theme--documenter-dark .select.is-info:not(:hover)::after { - border-color: #024c7d; } - html.theme--documenter-dark .select.is-info select { - border-color: #024c7d; } - html.theme--documenter-dark .select.is-info select:hover, html.theme--documenter-dark .select.is-info select.is-hovered { - border-color: #023d64; } - html.theme--documenter-dark .select.is-info select:focus, html.theme--documenter-dark .select.is-info select.is-focused, html.theme--documenter-dark .select.is-info select:active, html.theme--documenter-dark .select.is-info select.is-active { - box-shadow: 0 0 0 0.125em rgba(2, 76, 125, 0.25); } - html.theme--documenter-dark .select.is-success:not(:hover)::after { - border-color: #008438; } - html.theme--documenter-dark .select.is-success select { - border-color: #008438; } - html.theme--documenter-dark .select.is-success select:hover, html.theme--documenter-dark .select.is-success select.is-hovered { - border-color: #006b2d; } - html.theme--documenter-dark .select.is-success select:focus, html.theme--documenter-dark .select.is-success select.is-focused, html.theme--documenter-dark .select.is-success select:active, html.theme--documenter-dark .select.is-success select.is-active { - box-shadow: 0 0 0 0.125em rgba(0, 132, 56, 0.25); } - html.theme--documenter-dark .select.is-warning:not(:hover)::after { - border-color: #ad8100; } - html.theme--documenter-dark .select.is-warning select { - border-color: #ad8100; } - html.theme--documenter-dark .select.is-warning select:hover, html.theme--documenter-dark .select.is-warning select.is-hovered { - border-color: #946e00; } - html.theme--documenter-dark .select.is-warning select:focus, html.theme--documenter-dark .select.is-warning select.is-focused, html.theme--documenter-dark .select.is-warning select:active, html.theme--documenter-dark .select.is-warning select.is-active { - box-shadow: 0 0 0 0.125em rgba(173, 129, 0, 0.25); } - html.theme--documenter-dark .select.is-danger:not(:hover)::after { - border-color: #9e1b0d; } - html.theme--documenter-dark .select.is-danger select { - border-color: #9e1b0d; } - html.theme--documenter-dark .select.is-danger select:hover, html.theme--documenter-dark .select.is-danger select.is-hovered { - border-color: #86170b; } - html.theme--documenter-dark .select.is-danger select:focus, html.theme--documenter-dark .select.is-danger select.is-focused, html.theme--documenter-dark .select.is-danger select:active, html.theme--documenter-dark .select.is-danger select.is-active { - box-shadow: 0 0 0 0.125em rgba(158, 27, 13, 0.25); } - html.theme--documenter-dark .select.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.select { - border-radius: 3px; - font-size: 0.85em; } - html.theme--documenter-dark .select.is-medium { - font-size: 1.25rem; } - html.theme--documenter-dark .select.is-large { - font-size: 1.5rem; } - html.theme--documenter-dark .select.is-disabled::after { - border-color: white; } - html.theme--documenter-dark .select.is-fullwidth { - width: 100%; } - html.theme--documenter-dark .select.is-fullwidth select { - width: 100%; } - html.theme--documenter-dark .select.is-loading::after { - margin-top: 0; - position: absolute; - right: 0.625em; - top: 0.625em; - transform: none; } - html.theme--documenter-dark .select.is-loading.is-small:after, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-loading:after { - font-size: 0.85em; } - html.theme--documenter-dark .select.is-loading.is-medium:after { - font-size: 1.25rem; } - html.theme--documenter-dark .select.is-loading.is-large:after { - font-size: 1.5rem; } - html.theme--documenter-dark .file { - align-items: stretch; - display: flex; - justify-content: flex-start; - position: relative; } - html.theme--documenter-dark .file.is-white .file-cta { - background-color: white; - border-color: transparent; - color: #0a0a0a; } - html.theme--documenter-dark .file.is-white:hover .file-cta, html.theme--documenter-dark .file.is-white.is-hovered .file-cta { - background-color: #f9f9f9; - border-color: transparent; - color: #0a0a0a; } - html.theme--documenter-dark .file.is-white:focus .file-cta, html.theme--documenter-dark .file.is-white.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(255, 255, 255, 0.25); - color: #0a0a0a; } - html.theme--documenter-dark .file.is-white:active .file-cta, html.theme--documenter-dark .file.is-white.is-active .file-cta { - background-color: #f2f2f2; - border-color: transparent; - color: #0a0a0a; } - html.theme--documenter-dark .file.is-black .file-cta { - background-color: #0a0a0a; - border-color: transparent; - color: white; } - html.theme--documenter-dark .file.is-black:hover .file-cta, html.theme--documenter-dark .file.is-black.is-hovered .file-cta { - background-color: #040404; - border-color: transparent; - color: white; } - html.theme--documenter-dark .file.is-black:focus .file-cta, html.theme--documenter-dark .file.is-black.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(10, 10, 10, 0.25); - color: white; } - html.theme--documenter-dark .file.is-black:active .file-cta, html.theme--documenter-dark .file.is-black.is-active .file-cta { - background-color: black; - border-color: transparent; - color: white; } - html.theme--documenter-dark .file.is-light .file-cta { - background-color: #ecf0f1; - border-color: transparent; - color: #282f2f; } - html.theme--documenter-dark .file.is-light:hover .file-cta, html.theme--documenter-dark .file.is-light.is-hovered .file-cta { - background-color: #e5eaec; - border-color: transparent; - color: #282f2f; } - html.theme--documenter-dark .file.is-light:focus .file-cta, html.theme--documenter-dark .file.is-light.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(236, 240, 241, 0.25); - color: #282f2f; } - html.theme--documenter-dark .file.is-light:active .file-cta, html.theme--documenter-dark .file.is-light.is-active .file-cta { - background-color: #dde4e6; - border-color: transparent; - color: #282f2f; } - html.theme--documenter-dark .file.is-dark .file-cta, html.theme--documenter-dark .content kbd.file .file-cta { - background-color: #282f2f; - border-color: transparent; - color: #ecf0f1; } - html.theme--documenter-dark .file.is-dark:hover .file-cta, html.theme--documenter-dark .content kbd.file:hover .file-cta, html.theme--documenter-dark .file.is-dark.is-hovered .file-cta, html.theme--documenter-dark .content kbd.file.is-hovered .file-cta { - background-color: #232829; - border-color: transparent; - color: #ecf0f1; } - html.theme--documenter-dark .file.is-dark:focus .file-cta, html.theme--documenter-dark .content kbd.file:focus .file-cta, html.theme--documenter-dark .file.is-dark.is-focused .file-cta, html.theme--documenter-dark .content kbd.file.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(40, 47, 47, 0.25); - color: #ecf0f1; } - html.theme--documenter-dark .file.is-dark:active .file-cta, html.theme--documenter-dark .content kbd.file:active .file-cta, html.theme--documenter-dark .file.is-dark.is-active .file-cta, html.theme--documenter-dark .content kbd.file.is-active .file-cta { - background-color: #1d2122; - border-color: transparent; - color: #ecf0f1; } - html.theme--documenter-dark .file.is-primary .file-cta, html.theme--documenter-dark .docstring > section > a.file.docs-sourcelink .file-cta { - background-color: #375a7f; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .file.is-primary:hover .file-cta, html.theme--documenter-dark .docstring > section > a.file.docs-sourcelink:hover .file-cta, html.theme--documenter-dark .file.is-primary.is-hovered .file-cta, html.theme--documenter-dark .docstring > section > a.file.is-hovered.docs-sourcelink .file-cta { - background-color: #335476; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .file.is-primary:focus .file-cta, html.theme--documenter-dark .docstring > section > a.file.docs-sourcelink:focus .file-cta, html.theme--documenter-dark .file.is-primary.is-focused .file-cta, html.theme--documenter-dark .docstring > section > a.file.is-focused.docs-sourcelink .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(55, 90, 127, 0.25); - color: #fff; } - html.theme--documenter-dark .file.is-primary:active .file-cta, html.theme--documenter-dark .docstring > section > a.file.docs-sourcelink:active .file-cta, html.theme--documenter-dark .file.is-primary.is-active .file-cta, html.theme--documenter-dark .docstring > section > a.file.is-active.docs-sourcelink .file-cta { - background-color: #2f4d6d; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .file.is-link .file-cta { - background-color: #1abc9c; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .file.is-link:hover .file-cta, html.theme--documenter-dark .file.is-link.is-hovered .file-cta { - background-color: #18b193; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .file.is-link:focus .file-cta, html.theme--documenter-dark .file.is-link.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(26, 188, 156, 0.25); - color: #fff; } - html.theme--documenter-dark .file.is-link:active .file-cta, html.theme--documenter-dark .file.is-link.is-active .file-cta { - background-color: #17a689; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .file.is-info .file-cta { - background-color: #024c7d; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .file.is-info:hover .file-cta, html.theme--documenter-dark .file.is-info.is-hovered .file-cta { - background-color: #024470; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .file.is-info:focus .file-cta, html.theme--documenter-dark .file.is-info.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(2, 76, 125, 0.25); - color: #fff; } - html.theme--documenter-dark .file.is-info:active .file-cta, html.theme--documenter-dark .file.is-info.is-active .file-cta { - background-color: #023d64; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .file.is-success .file-cta { - background-color: #008438; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .file.is-success:hover .file-cta, html.theme--documenter-dark .file.is-success.is-hovered .file-cta { - background-color: #007733; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .file.is-success:focus .file-cta, html.theme--documenter-dark .file.is-success.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(0, 132, 56, 0.25); - color: #fff; } - html.theme--documenter-dark .file.is-success:active .file-cta, html.theme--documenter-dark .file.is-success.is-active .file-cta { - background-color: #006b2d; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .file.is-warning .file-cta { - background-color: #ad8100; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .file.is-warning:hover .file-cta, html.theme--documenter-dark .file.is-warning.is-hovered .file-cta { - background-color: #a07700; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .file.is-warning:focus .file-cta, html.theme--documenter-dark .file.is-warning.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(173, 129, 0, 0.25); - color: #fff; } - html.theme--documenter-dark .file.is-warning:active .file-cta, html.theme--documenter-dark .file.is-warning.is-active .file-cta { - background-color: #946e00; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .file.is-danger .file-cta { - background-color: #9e1b0d; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .file.is-danger:hover .file-cta, html.theme--documenter-dark .file.is-danger.is-hovered .file-cta { - background-color: #92190c; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .file.is-danger:focus .file-cta, html.theme--documenter-dark .file.is-danger.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(158, 27, 13, 0.25); - color: #fff; } - html.theme--documenter-dark .file.is-danger:active .file-cta, html.theme--documenter-dark .file.is-danger.is-active .file-cta { - background-color: #86170b; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .file.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.file { - font-size: 0.85em; } - html.theme--documenter-dark .file.is-medium { - font-size: 1.25rem; } - html.theme--documenter-dark .file.is-medium .file-icon .fa { - font-size: 21px; } - html.theme--documenter-dark .file.is-large { - font-size: 1.5rem; } - html.theme--documenter-dark .file.is-large .file-icon .fa { - font-size: 28px; } - html.theme--documenter-dark .file.has-name .file-cta { - border-bottom-right-radius: 0; - border-top-right-radius: 0; } - html.theme--documenter-dark .file.has-name .file-name { - border-bottom-left-radius: 0; - border-top-left-radius: 0; } - html.theme--documenter-dark .file.has-name.is-empty .file-cta { - border-radius: 0.4em; } - html.theme--documenter-dark .file.has-name.is-empty .file-name { - display: none; } - html.theme--documenter-dark .file.is-boxed .file-label { - flex-direction: column; } - html.theme--documenter-dark .file.is-boxed .file-cta { - flex-direction: column; - height: auto; - padding: 1em 3em; } - html.theme--documenter-dark .file.is-boxed .file-name { - border-width: 0 1px 1px; } - html.theme--documenter-dark .file.is-boxed .file-icon { - height: 1.5em; - width: 1.5em; } - html.theme--documenter-dark .file.is-boxed .file-icon .fa { - font-size: 21px; } - html.theme--documenter-dark .file.is-boxed.is-small .file-icon .fa, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-boxed .file-icon .fa { - font-size: 14px; } - html.theme--documenter-dark .file.is-boxed.is-medium .file-icon .fa { - font-size: 28px; } - html.theme--documenter-dark .file.is-boxed.is-large .file-icon .fa { - font-size: 35px; } - html.theme--documenter-dark .file.is-boxed.has-name .file-cta { - border-radius: 0.4em 0.4em 0 0; } - html.theme--documenter-dark .file.is-boxed.has-name .file-name { - border-radius: 0 0 0.4em 0.4em; - border-width: 0 1px 1px; } - html.theme--documenter-dark .file.is-centered { - justify-content: center; } - html.theme--documenter-dark .file.is-fullwidth .file-label { - width: 100%; } - html.theme--documenter-dark .file.is-fullwidth .file-name { - flex-grow: 1; - max-width: none; } - html.theme--documenter-dark .file.is-right { - justify-content: flex-end; } - html.theme--documenter-dark .file.is-right .file-cta { - border-radius: 0 0.4em 0.4em 0; } - html.theme--documenter-dark .file.is-right .file-name { - border-radius: 0.4em 0 0 0.4em; - border-width: 1px 0 1px 1px; - order: -1; } - html.theme--documenter-dark .file-label { - align-items: stretch; - display: flex; - cursor: pointer; - justify-content: flex-start; - overflow: hidden; - position: relative; } - html.theme--documenter-dark .file-label:hover .file-cta { - background-color: #e5eaec; - color: #282f2f; } - html.theme--documenter-dark .file-label:hover .file-name { - border-color: #596668; } - html.theme--documenter-dark .file-label:active .file-cta { - background-color: #dde4e6; - color: #282f2f; } - html.theme--documenter-dark .file-label:active .file-name { - border-color: #535f61; } - html.theme--documenter-dark .file-input { - height: 100%; - left: 0; - opacity: 0; - outline: none; - position: absolute; - top: 0; - width: 100%; } - html.theme--documenter-dark .file-cta, - html.theme--documenter-dark .file-name { - border-color: #5e6d6f; - border-radius: 0.4em; - font-size: 1em; - padding-left: 1em; - padding-right: 1em; - white-space: nowrap; } - html.theme--documenter-dark .file-cta { - background-color: #ecf0f1; - color: #343c3d; } - html.theme--documenter-dark .file-name { - border-color: #5e6d6f; - border-style: solid; - border-width: 1px 1px 1px 0; - display: block; - max-width: 16em; - overflow: hidden; - text-align: left; - text-overflow: ellipsis; } - html.theme--documenter-dark .file-icon { - align-items: center; - display: flex; - height: 1em; - justify-content: center; - margin-right: 0.5em; - width: 1em; } - html.theme--documenter-dark .file-icon .fa { - font-size: 14px; } - html.theme--documenter-dark .label { - color: #282f2f; - display: block; - font-size: 15px; - font-weight: 700; } - html.theme--documenter-dark .label:not(:last-child) { - margin-bottom: 0.5em; } - html.theme--documenter-dark .label.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.label { - font-size: 0.85em; } - html.theme--documenter-dark .label.is-medium { - font-size: 1.25rem; } - html.theme--documenter-dark .label.is-large { - font-size: 1.5rem; } - html.theme--documenter-dark .help { - display: block; - font-size: 0.85em; - margin-top: 0.25rem; } - html.theme--documenter-dark .help.is-white { - color: white; } - html.theme--documenter-dark .help.is-black { - color: #0a0a0a; } - html.theme--documenter-dark .help.is-light { - color: #ecf0f1; } - html.theme--documenter-dark .help.is-dark, html.theme--documenter-dark .content kbd.help { - color: #282f2f; } - html.theme--documenter-dark .help.is-primary, html.theme--documenter-dark .docstring > section > a.help.docs-sourcelink { - color: #375a7f; } - html.theme--documenter-dark .help.is-link { - color: #1abc9c; } - html.theme--documenter-dark .help.is-info { - color: #024c7d; } - html.theme--documenter-dark .help.is-success { - color: #008438; } - html.theme--documenter-dark .help.is-warning { - color: #ad8100; } - html.theme--documenter-dark .help.is-danger { - color: #9e1b0d; } - html.theme--documenter-dark .field:not(:last-child) { - margin-bottom: 0.75rem; } - html.theme--documenter-dark .field.has-addons { - display: flex; - justify-content: flex-start; } - html.theme--documenter-dark .field.has-addons .control:not(:last-child) { - margin-right: -1px; } - html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .button, - html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .input, - html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) #documenter .docs-sidebar form.docs-search > input, - html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:not(:first-child):not(:last-child) form.docs-search > input, - html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .select select { - border-radius: 0; } - html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .button, - html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .input, - html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) #documenter .docs-sidebar form.docs-search > input, - html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:first-child:not(:only-child) form.docs-search > input, - html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .select select { - border-bottom-right-radius: 0; - border-top-right-radius: 0; } - html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .button, - html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .input, - html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) #documenter .docs-sidebar form.docs-search > input, - html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:last-child:not(:only-child) form.docs-search > input, - html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .select select { - border-bottom-left-radius: 0; - border-top-left-radius: 0; } - html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):hover, html.theme--documenter-dark .field.has-addons .control .button.is-hovered:not([disabled]), - html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):hover, - html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):hover, - html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):hover, - html.theme--documenter-dark .field.has-addons .control .input.is-hovered:not([disabled]), - html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-hovered:not([disabled]), - html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-hovered:not([disabled]), - html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):hover, - html.theme--documenter-dark .field.has-addons .control .select select.is-hovered:not([disabled]) { - z-index: 2; } - html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):focus, html.theme--documenter-dark .field.has-addons .control .button.is-focused:not([disabled]), html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):active, html.theme--documenter-dark .field.has-addons .control .button.is-active:not([disabled]), - html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):focus, - html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):focus, - html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):focus, - html.theme--documenter-dark .field.has-addons .control .input.is-focused:not([disabled]), - html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-focused:not([disabled]), - html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-focused:not([disabled]), - html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):active, - html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):active, - html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):active, - html.theme--documenter-dark .field.has-addons .control .input.is-active:not([disabled]), - html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-active:not([disabled]), - html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-active:not([disabled]), - html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):focus, - html.theme--documenter-dark .field.has-addons .control .select select.is-focused:not([disabled]), - html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):active, - html.theme--documenter-dark .field.has-addons .control .select select.is-active:not([disabled]) { - z-index: 3; } - html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):focus:hover, html.theme--documenter-dark .field.has-addons .control .button.is-focused:not([disabled]):hover, html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):active:hover, html.theme--documenter-dark .field.has-addons .control .button.is-active:not([disabled]):hover, - html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):focus:hover, - html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):focus:hover, - html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):focus:hover, - html.theme--documenter-dark .field.has-addons .control .input.is-focused:not([disabled]):hover, - html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-focused:not([disabled]):hover, - html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-focused:not([disabled]):hover, - html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):active:hover, - html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):active:hover, - html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):active:hover, - html.theme--documenter-dark .field.has-addons .control .input.is-active:not([disabled]):hover, - html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-active:not([disabled]):hover, - html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-active:not([disabled]):hover, - html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):focus:hover, - html.theme--documenter-dark .field.has-addons .control .select select.is-focused:not([disabled]):hover, - html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):active:hover, - html.theme--documenter-dark .field.has-addons .control .select select.is-active:not([disabled]):hover { - z-index: 4; } - html.theme--documenter-dark .field.has-addons .control.is-expanded { - flex-grow: 1; - flex-shrink: 1; } - html.theme--documenter-dark .field.has-addons.has-addons-centered { - justify-content: center; } - html.theme--documenter-dark .field.has-addons.has-addons-right { - justify-content: flex-end; } - html.theme--documenter-dark .field.has-addons.has-addons-fullwidth .control { - flex-grow: 1; - flex-shrink: 0; } - html.theme--documenter-dark .field.is-grouped { - display: flex; - justify-content: flex-start; } - html.theme--documenter-dark .field.is-grouped > .control { - flex-shrink: 0; } - html.theme--documenter-dark .field.is-grouped > .control:not(:last-child) { - margin-bottom: 0; - margin-right: 0.75rem; } - html.theme--documenter-dark .field.is-grouped > .control.is-expanded { - flex-grow: 1; - flex-shrink: 1; } - html.theme--documenter-dark .field.is-grouped.is-grouped-centered { - justify-content: center; } - html.theme--documenter-dark .field.is-grouped.is-grouped-right { - justify-content: flex-end; } - html.theme--documenter-dark .field.is-grouped.is-grouped-multiline { - flex-wrap: wrap; } - html.theme--documenter-dark .field.is-grouped.is-grouped-multiline > .control:last-child, html.theme--documenter-dark .field.is-grouped.is-grouped-multiline > .control:not(:last-child) { - margin-bottom: 0.75rem; } - html.theme--documenter-dark .field.is-grouped.is-grouped-multiline:last-child { - margin-bottom: -0.75rem; } - html.theme--documenter-dark .field.is-grouped.is-grouped-multiline:not(:last-child) { - margin-bottom: 0; } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .field.is-horizontal { - display: flex; } } - html.theme--documenter-dark .field-label .label { - font-size: inherit; } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .field-label { - margin-bottom: 0.5rem; } } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .field-label { - flex-basis: 0; - flex-grow: 1; - flex-shrink: 0; - margin-right: 1.5rem; - text-align: right; } - html.theme--documenter-dark .field-label.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.field-label { - font-size: 0.85em; - padding-top: 0.375em; } - html.theme--documenter-dark .field-label.is-normal { - padding-top: 0.375em; } - html.theme--documenter-dark .field-label.is-medium { - font-size: 1.25rem; - padding-top: 0.375em; } - html.theme--documenter-dark .field-label.is-large { - font-size: 1.5rem; - padding-top: 0.375em; } } - html.theme--documenter-dark .field-body .field .field { - margin-bottom: 0; } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .field-body { - display: flex; - flex-basis: 0; - flex-grow: 5; - flex-shrink: 1; } - html.theme--documenter-dark .field-body .field { - margin-bottom: 0; } - html.theme--documenter-dark .field-body > .field { - flex-shrink: 1; } - html.theme--documenter-dark .field-body > .field:not(.is-narrow) { - flex-grow: 1; } - html.theme--documenter-dark .field-body > .field:not(:last-child) { - margin-right: 0.75rem; } } - html.theme--documenter-dark .control { - box-sizing: border-box; - clear: both; - font-size: 15px; - position: relative; - text-align: left; } - html.theme--documenter-dark .control.has-icons-left .input:focus ~ .icon, html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search > input:focus ~ .icon, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search > input:focus ~ .icon, - html.theme--documenter-dark .control.has-icons-left .select:focus ~ .icon, html.theme--documenter-dark .control.has-icons-right .input:focus ~ .icon, html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search > input:focus ~ .icon, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search > input:focus ~ .icon, - html.theme--documenter-dark .control.has-icons-right .select:focus ~ .icon { - color: #5e6d6f; } - html.theme--documenter-dark .control.has-icons-left .input.is-small ~ .icon, html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search > input ~ .icon, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search > input ~ .icon, - html.theme--documenter-dark .control.has-icons-left .select.is-small ~ .icon, html.theme--documenter-dark .control.has-icons-right .input.is-small ~ .icon, html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search > input ~ .icon, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search > input ~ .icon, - html.theme--documenter-dark .control.has-icons-right .select.is-small ~ .icon { - font-size: 0.85em; } - html.theme--documenter-dark .control.has-icons-left .input.is-medium ~ .icon, html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search > input.is-medium ~ .icon, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search > input.is-medium ~ .icon, - html.theme--documenter-dark .control.has-icons-left .select.is-medium ~ .icon, html.theme--documenter-dark .control.has-icons-right .input.is-medium ~ .icon, html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search > input.is-medium ~ .icon, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search > input.is-medium ~ .icon, - html.theme--documenter-dark .control.has-icons-right .select.is-medium ~ .icon { - font-size: 1.25rem; } - html.theme--documenter-dark .control.has-icons-left .input.is-large ~ .icon, html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search > input.is-large ~ .icon, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search > input.is-large ~ .icon, - html.theme--documenter-dark .control.has-icons-left .select.is-large ~ .icon, html.theme--documenter-dark .control.has-icons-right .input.is-large ~ .icon, html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search > input.is-large ~ .icon, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search > input.is-large ~ .icon, - html.theme--documenter-dark .control.has-icons-right .select.is-large ~ .icon { - font-size: 1.5rem; } - html.theme--documenter-dark .control.has-icons-left .icon, html.theme--documenter-dark .control.has-icons-right .icon { - color: #dbdee0; - height: 2.25em; - pointer-events: none; - position: absolute; - top: 0; - width: 2.25em; - z-index: 4; } - html.theme--documenter-dark .control.has-icons-left .input, html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search > input, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search > input, - html.theme--documenter-dark .control.has-icons-left .select select { - padding-left: 2.25em; } - html.theme--documenter-dark .control.has-icons-left .icon.is-left { - left: 0; } - html.theme--documenter-dark .control.has-icons-right .input, html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search > input, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search > input, - html.theme--documenter-dark .control.has-icons-right .select select { - padding-right: 2.25em; } - html.theme--documenter-dark .control.has-icons-right .icon.is-right { - right: 0; } - html.theme--documenter-dark .control.is-loading::after { - position: absolute !important; - right: 0.625em; - top: 0.625em; - z-index: 4; } - html.theme--documenter-dark .control.is-loading.is-small:after, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-loading:after { - font-size: 0.85em; } - html.theme--documenter-dark .control.is-loading.is-medium:after { - font-size: 1.25rem; } - html.theme--documenter-dark .control.is-loading.is-large:after { - font-size: 1.5rem; } - html.theme--documenter-dark .breadcrumb { - font-size: 15px; - white-space: nowrap; } - html.theme--documenter-dark .breadcrumb a { - align-items: center; - color: #1abc9c; - display: flex; - justify-content: center; - padding: 0 0.75em; } - html.theme--documenter-dark .breadcrumb a:hover { - color: #1dd2af; } - html.theme--documenter-dark .breadcrumb li { - align-items: center; - display: flex; } - html.theme--documenter-dark .breadcrumb li:first-child a { - padding-left: 0; } - html.theme--documenter-dark .breadcrumb li.is-active a { - color: #f2f2f2; - cursor: default; - pointer-events: none; } - html.theme--documenter-dark .breadcrumb li + li::before { - color: #8c9b9d; - content: "\0002f"; } - html.theme--documenter-dark .breadcrumb ul, - html.theme--documenter-dark .breadcrumb ol { - align-items: flex-start; - display: flex; - flex-wrap: wrap; - justify-content: flex-start; } - html.theme--documenter-dark .breadcrumb .icon:first-child { - margin-right: 0.5em; } - html.theme--documenter-dark .breadcrumb .icon:last-child { - margin-left: 0.5em; } - html.theme--documenter-dark .breadcrumb.is-centered ol, - html.theme--documenter-dark .breadcrumb.is-centered ul { - justify-content: center; } - html.theme--documenter-dark .breadcrumb.is-right ol, - html.theme--documenter-dark .breadcrumb.is-right ul { - justify-content: flex-end; } - html.theme--documenter-dark .breadcrumb.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.breadcrumb { - font-size: 0.85em; } - html.theme--documenter-dark .breadcrumb.is-medium { - font-size: 1.25rem; } - html.theme--documenter-dark .breadcrumb.is-large { - font-size: 1.5rem; } - html.theme--documenter-dark .breadcrumb.has-arrow-separator li + li::before { - content: "\02192"; } - html.theme--documenter-dark .breadcrumb.has-bullet-separator li + li::before { - content: "\02022"; } - html.theme--documenter-dark .breadcrumb.has-dot-separator li + li::before { - content: "\000b7"; } - html.theme--documenter-dark .breadcrumb.has-succeeds-separator li + li::before { - content: "\0227B"; } - html.theme--documenter-dark .card { - background-color: white; - box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); - color: #fff; - max-width: 100%; - position: relative; } - html.theme--documenter-dark .card-header { - background-color: transparent; - align-items: stretch; - box-shadow: 0 1px 2px rgba(10, 10, 10, 0.1); - display: flex; } - html.theme--documenter-dark .card-header-title { - align-items: center; - color: #f2f2f2; - display: flex; - flex-grow: 1; - font-weight: 700; - padding: 0.75rem; } - html.theme--documenter-dark .card-header-title.is-centered { - justify-content: center; } - html.theme--documenter-dark .card-header-icon { - align-items: center; - cursor: pointer; - display: flex; - justify-content: center; - padding: 0.75rem; } - html.theme--documenter-dark .card-image { - display: block; - position: relative; } - html.theme--documenter-dark .card-content { - background-color: transparent; - padding: 1.5rem; } - html.theme--documenter-dark .card-footer { - background-color: transparent; - border-top: 1px solid #5e6d6f; - align-items: stretch; - display: flex; } - html.theme--documenter-dark .card-footer-item { - align-items: center; - display: flex; - flex-basis: 0; - flex-grow: 1; - flex-shrink: 0; - justify-content: center; - padding: 0.75rem; } - html.theme--documenter-dark .card-footer-item:not(:last-child) { - border-right: 1px solid #5e6d6f; } - html.theme--documenter-dark .card .media:not(:last-child) { - margin-bottom: 1.5rem; } - html.theme--documenter-dark .dropdown { - display: inline-flex; - position: relative; - vertical-align: top; } - html.theme--documenter-dark .dropdown.is-active .dropdown-menu, html.theme--documenter-dark .dropdown.is-hoverable:hover .dropdown-menu { - display: block; } - html.theme--documenter-dark .dropdown.is-right .dropdown-menu { - left: auto; - right: 0; } - html.theme--documenter-dark .dropdown.is-up .dropdown-menu { - bottom: 100%; - padding-bottom: 4px; - padding-top: initial; - top: auto; } - html.theme--documenter-dark .dropdown-menu { - display: none; - left: 0; - min-width: 12rem; - padding-top: 4px; - position: absolute; - top: 100%; - z-index: 20; } - html.theme--documenter-dark .dropdown-content { - background-color: #282f2f; - border-radius: 0.4em; - box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); - padding-bottom: 0.5rem; - padding-top: 0.5rem; } - html.theme--documenter-dark .dropdown-item { - color: #fff; - display: block; - font-size: 0.875rem; - line-height: 1.5; - padding: 0.375rem 1rem; - position: relative; } - html.theme--documenter-dark a.dropdown-item, - html.theme--documenter-dark button.dropdown-item { - padding-right: 3rem; - text-align: left; - white-space: nowrap; - width: 100%; } - html.theme--documenter-dark a.dropdown-item:hover, - html.theme--documenter-dark button.dropdown-item:hover { - background-color: #282f2f; - color: #0a0a0a; } - html.theme--documenter-dark a.dropdown-item.is-active, - html.theme--documenter-dark button.dropdown-item.is-active { - background-color: #1abc9c; - color: #fff; } - html.theme--documenter-dark .dropdown-divider { - background-color: #5e6d6f; - border: none; - display: block; - height: 1px; - margin: 0.5rem 0; } - html.theme--documenter-dark .level { - align-items: center; - justify-content: space-between; } - html.theme--documenter-dark .level code { - border-radius: 0.4em; } - html.theme--documenter-dark .level img { - display: inline-block; - vertical-align: top; } - html.theme--documenter-dark .level.is-mobile { - display: flex; } - html.theme--documenter-dark .level.is-mobile .level-left, - html.theme--documenter-dark .level.is-mobile .level-right { - display: flex; } - html.theme--documenter-dark .level.is-mobile .level-left + .level-right { - margin-top: 0; } - html.theme--documenter-dark .level.is-mobile .level-item:not(:last-child) { - margin-bottom: 0; - margin-right: 0.75rem; } - html.theme--documenter-dark .level.is-mobile .level-item:not(.is-narrow) { - flex-grow: 1; } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .level { - display: flex; } - html.theme--documenter-dark .level > .level-item:not(.is-narrow) { - flex-grow: 1; } } - html.theme--documenter-dark .level-item { - align-items: center; - display: flex; - flex-basis: auto; - flex-grow: 0; - flex-shrink: 0; - justify-content: center; } - html.theme--documenter-dark .level-item .title, - html.theme--documenter-dark .level-item .subtitle { - margin-bottom: 0; } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .level-item:not(:last-child) { - margin-bottom: 0.75rem; } } - html.theme--documenter-dark .level-left, - html.theme--documenter-dark .level-right { - flex-basis: auto; - flex-grow: 0; - flex-shrink: 0; } - html.theme--documenter-dark .level-left .level-item.is-flexible, - html.theme--documenter-dark .level-right .level-item.is-flexible { - flex-grow: 1; } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .level-left .level-item:not(:last-child), - html.theme--documenter-dark .level-right .level-item:not(:last-child) { - margin-right: 0.75rem; } } - html.theme--documenter-dark .level-left { - align-items: center; - justify-content: flex-start; } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .level-left + .level-right { - margin-top: 1.5rem; } } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .level-left { - display: flex; } } - html.theme--documenter-dark .level-right { - align-items: center; - justify-content: flex-end; } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .level-right { - display: flex; } } - html.theme--documenter-dark .list { - background-color: white; - border-radius: 0.4em; - box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); } - html.theme--documenter-dark .list-item { - display: block; - padding: 0.5em 1em; } - html.theme--documenter-dark .list-item:not(a) { - color: #fff; } - html.theme--documenter-dark .list-item:first-child { - border-top-left-radius: 0.4em; - border-top-right-radius: 0.4em; } - html.theme--documenter-dark .list-item:last-child { - border-bottom-left-radius: 0.4em; - border-bottom-right-radius: 0.4em; } - html.theme--documenter-dark .list-item:not(:last-child) { - border-bottom: 1px solid #5e6d6f; } - html.theme--documenter-dark .list-item.is-active { - background-color: #1abc9c; - color: #fff; } - html.theme--documenter-dark a.list-item { - background-color: #282f2f; - cursor: pointer; } - html.theme--documenter-dark .media { - align-items: flex-start; - display: flex; - text-align: left; } - html.theme--documenter-dark .media .content:not(:last-child) { - margin-bottom: 0.75rem; } - html.theme--documenter-dark .media .media { - border-top: 1px solid rgba(94, 109, 111, 0.5); - display: flex; - padding-top: 0.75rem; } - html.theme--documenter-dark .media .media .content:not(:last-child), - html.theme--documenter-dark .media .media .control:not(:last-child) { - margin-bottom: 0.5rem; } - html.theme--documenter-dark .media .media .media { - padding-top: 0.5rem; } - html.theme--documenter-dark .media .media .media + .media { - margin-top: 0.5rem; } - html.theme--documenter-dark .media + .media { - border-top: 1px solid rgba(94, 109, 111, 0.5); - margin-top: 1rem; - padding-top: 1rem; } - html.theme--documenter-dark .media.is-large + .media { - margin-top: 1.5rem; - padding-top: 1.5rem; } - html.theme--documenter-dark .media-left, - html.theme--documenter-dark .media-right { - flex-basis: auto; - flex-grow: 0; - flex-shrink: 0; } - html.theme--documenter-dark .media-left { - margin-right: 1rem; } - html.theme--documenter-dark .media-right { - margin-left: 1rem; } - html.theme--documenter-dark .media-content { - flex-basis: auto; - flex-grow: 1; - flex-shrink: 1; - text-align: left; } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .media-content { - overflow-x: auto; } } - html.theme--documenter-dark .menu { - font-size: 15px; } - html.theme--documenter-dark .menu.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.menu { - font-size: 0.85em; } - html.theme--documenter-dark .menu.is-medium { - font-size: 1.25rem; } - html.theme--documenter-dark .menu.is-large { - font-size: 1.5rem; } - html.theme--documenter-dark .menu-list { - line-height: 1.25; } - html.theme--documenter-dark .menu-list a { - border-radius: 3px; - color: #fff; - display: block; - padding: 0.5em 0.75em; } - html.theme--documenter-dark .menu-list a:hover { - background-color: #282f2f; - color: #f2f2f2; } - html.theme--documenter-dark .menu-list a.is-active { - background-color: #1abc9c; - color: #fff; } - html.theme--documenter-dark .menu-list li ul { - border-left: 1px solid #5e6d6f; - margin: 0.75em; - padding-left: 0.75em; } - html.theme--documenter-dark .menu-label { - color: white; - font-size: 0.75em; - letter-spacing: 0.1em; - text-transform: uppercase; } - html.theme--documenter-dark .menu-label:not(:first-child) { - margin-top: 1em; } - html.theme--documenter-dark .menu-label:not(:last-child) { - margin-bottom: 1em; } - html.theme--documenter-dark .message { - background-color: #282f2f; - border-radius: 0.4em; - font-size: 15px; } - html.theme--documenter-dark .message strong { - color: currentColor; } - html.theme--documenter-dark .message a:not(.button):not(.tag):not(.dropdown-item) { - color: currentColor; - text-decoration: underline; } - html.theme--documenter-dark .message.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.message { - font-size: 0.85em; } - html.theme--documenter-dark .message.is-medium { - font-size: 1.25rem; } - html.theme--documenter-dark .message.is-large { - font-size: 1.5rem; } - html.theme--documenter-dark .message.is-white { - background-color: white; } - html.theme--documenter-dark .message.is-white .message-header { - background-color: white; - color: #0a0a0a; } - html.theme--documenter-dark .message.is-white .message-body { - border-color: white; - color: #4d4d4d; } - html.theme--documenter-dark .message.is-black { - background-color: #fafafa; } - html.theme--documenter-dark .message.is-black .message-header { - background-color: #0a0a0a; - color: white; } - html.theme--documenter-dark .message.is-black .message-body { - border-color: #0a0a0a; - color: #090909; } - html.theme--documenter-dark .message.is-light { - background-color: #f9fafb; } - html.theme--documenter-dark .message.is-light .message-header { - background-color: #ecf0f1; - color: #282f2f; } - html.theme--documenter-dark .message.is-light .message-body { - border-color: #ecf0f1; - color: #505050; } - html.theme--documenter-dark .message.is-dark, html.theme--documenter-dark .content kbd.message { - background-color: #f9fafa; } - html.theme--documenter-dark .message.is-dark .message-header, html.theme--documenter-dark .content kbd.message .message-header { - background-color: #282f2f; - color: #ecf0f1; } - html.theme--documenter-dark .message.is-dark .message-body, html.theme--documenter-dark .content kbd.message .message-body { - border-color: #282f2f; - color: #212526; } - html.theme--documenter-dark .message.is-primary, html.theme--documenter-dark .docstring > section > a.message.docs-sourcelink { - background-color: #f8fafc; } - html.theme--documenter-dark .message.is-primary .message-header, html.theme--documenter-dark .docstring > section > a.message.docs-sourcelink .message-header { - background-color: #375a7f; - color: #fff; } - html.theme--documenter-dark .message.is-primary .message-body, html.theme--documenter-dark .docstring > section > a.message.docs-sourcelink .message-body { - border-color: #375a7f; - color: #2b4159; } - html.theme--documenter-dark .message.is-link { - background-color: #f6fefc; } - html.theme--documenter-dark .message.is-link .message-header { - background-color: #1abc9c; - color: #fff; } - html.theme--documenter-dark .message.is-link .message-body { - border-color: #1abc9c; - color: #0b2f28; } - html.theme--documenter-dark .message.is-info { - background-color: #f5fbff; } - html.theme--documenter-dark .message.is-info .message-header { - background-color: #024c7d; - color: #fff; } - html.theme--documenter-dark .message.is-info .message-body { - border-color: #024c7d; - color: #033659; } - html.theme--documenter-dark .message.is-success { - background-color: #f5fff9; } - html.theme--documenter-dark .message.is-success .message-header { - background-color: #008438; - color: #fff; } - html.theme--documenter-dark .message.is-success .message-body { - border-color: #008438; - color: #023518; } - html.theme--documenter-dark .message.is-warning { - background-color: #fffcf5; } - html.theme--documenter-dark .message.is-warning .message-header { - background-color: #ad8100; - color: #fff; } - html.theme--documenter-dark .message.is-warning .message-body { - border-color: #ad8100; - color: #3d2e03; } - html.theme--documenter-dark .message.is-danger { - background-color: #fef6f6; } - html.theme--documenter-dark .message.is-danger .message-header { - background-color: #9e1b0d; - color: #fff; } - html.theme--documenter-dark .message.is-danger .message-body { - border-color: #9e1b0d; - color: #7a170c; } - html.theme--documenter-dark .message-header { - align-items: center; - background-color: #fff; - border-radius: 0.4em 0.4em 0 0; - color: rgba(0, 0, 0, 0.7); - display: flex; - font-weight: 700; - justify-content: space-between; - line-height: 1.25; - padding: 0.75em 1em; - position: relative; } - html.theme--documenter-dark .message-header .delete { - flex-grow: 0; - flex-shrink: 0; - margin-left: 0.75em; } - html.theme--documenter-dark .message-header + .message-body { - border-width: 0; - border-top-left-radius: 0; - border-top-right-radius: 0; } - html.theme--documenter-dark .message-body { - border-color: #5e6d6f; - border-radius: 0.4em; - border-style: solid; - border-width: 0 0 0 4px; - color: #fff; - padding: 1.25em 1.5em; } - html.theme--documenter-dark .message-body code, - html.theme--documenter-dark .message-body pre { - background-color: white; } - html.theme--documenter-dark .message-body pre code { - background-color: transparent; } - html.theme--documenter-dark .modal { - align-items: center; - display: none; - flex-direction: column; - justify-content: center; - overflow: hidden; - position: fixed; - z-index: 40; } - html.theme--documenter-dark .modal.is-active { - display: flex; } - html.theme--documenter-dark .modal-background { - background-color: rgba(10, 10, 10, 0.86); } - html.theme--documenter-dark .modal-content, - html.theme--documenter-dark .modal-card { - margin: 0 20px; - max-height: calc(100vh - 160px); - overflow: auto; - position: relative; - width: 100%; } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .modal-content, - html.theme--documenter-dark .modal-card { - margin: 0 auto; - max-height: calc(100vh - 40px); - width: 640px; } } - html.theme--documenter-dark .modal-close { - background: none; - height: 40px; - position: fixed; - right: 20px; - top: 20px; - width: 40px; } - html.theme--documenter-dark .modal-card { - display: flex; - flex-direction: column; - max-height: calc(100vh - 40px); - overflow: hidden; - -ms-overflow-y: visible; } - html.theme--documenter-dark .modal-card-head, - html.theme--documenter-dark .modal-card-foot { - align-items: center; - background-color: #282f2f; - display: flex; - flex-shrink: 0; - justify-content: flex-start; - padding: 20px; - position: relative; } - html.theme--documenter-dark .modal-card-head { - border-bottom: 1px solid #5e6d6f; - border-top-left-radius: 8px; - border-top-right-radius: 8px; } - html.theme--documenter-dark .modal-card-title { - color: #f2f2f2; - flex-grow: 1; - flex-shrink: 0; - font-size: 1.5rem; - line-height: 1; } - html.theme--documenter-dark .modal-card-foot { - border-bottom-left-radius: 8px; - border-bottom-right-radius: 8px; - border-top: 1px solid #5e6d6f; } - html.theme--documenter-dark .modal-card-foot .button:not(:last-child) { - margin-right: 0.5em; } - html.theme--documenter-dark .modal-card-body { - -webkit-overflow-scrolling: touch; - background-color: white; - flex-grow: 1; - flex-shrink: 1; - overflow: auto; - padding: 20px; } - html.theme--documenter-dark .navbar { - background-color: #375a7f; - min-height: 4rem; - position: relative; - z-index: 30; } - html.theme--documenter-dark .navbar.is-white { - background-color: white; - color: #0a0a0a; } - html.theme--documenter-dark .navbar.is-white .navbar-brand > .navbar-item, - html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link { - color: #0a0a0a; } - html.theme--documenter-dark .navbar.is-white .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-white .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-white .navbar-brand > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link:focus, - html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link:hover, - html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link.is-active { - background-color: #f2f2f2; - color: #0a0a0a; } - html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link::after { - border-color: #0a0a0a; } - html.theme--documenter-dark .navbar.is-white .navbar-burger { - color: #0a0a0a; } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .navbar.is-white .navbar-start > .navbar-item, - html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link, - html.theme--documenter-dark .navbar.is-white .navbar-end > .navbar-item, - html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link { - color: #0a0a0a; } - html.theme--documenter-dark .navbar.is-white .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-white .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-white .navbar-start > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link:focus, - html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link:hover, - html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link.is-active, - html.theme--documenter-dark .navbar.is-white .navbar-end > a.navbar-item:focus, - html.theme--documenter-dark .navbar.is-white .navbar-end > a.navbar-item:hover, - html.theme--documenter-dark .navbar.is-white .navbar-end > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link:focus, - html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link:hover, - html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link.is-active { - background-color: #f2f2f2; - color: #0a0a0a; } - html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link::after, - html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link::after { - border-color: #0a0a0a; } - html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown:focus .navbar-link, - html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown:hover .navbar-link, - html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #f2f2f2; - color: #0a0a0a; } - html.theme--documenter-dark .navbar.is-white .navbar-dropdown a.navbar-item.is-active { - background-color: white; - color: #0a0a0a; } } - html.theme--documenter-dark .navbar.is-black { - background-color: #0a0a0a; - color: white; } - html.theme--documenter-dark .navbar.is-black .navbar-brand > .navbar-item, - html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link { - color: white; } - html.theme--documenter-dark .navbar.is-black .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-black .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-black .navbar-brand > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link:focus, - html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link:hover, - html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link.is-active { - background-color: black; - color: white; } - html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link::after { - border-color: white; } - html.theme--documenter-dark .navbar.is-black .navbar-burger { - color: white; } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .navbar.is-black .navbar-start > .navbar-item, - html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link, - html.theme--documenter-dark .navbar.is-black .navbar-end > .navbar-item, - html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link { - color: white; } - html.theme--documenter-dark .navbar.is-black .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-black .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-black .navbar-start > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link:focus, - html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link:hover, - html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link.is-active, - html.theme--documenter-dark .navbar.is-black .navbar-end > a.navbar-item:focus, - html.theme--documenter-dark .navbar.is-black .navbar-end > a.navbar-item:hover, - html.theme--documenter-dark .navbar.is-black .navbar-end > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link:focus, - html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link:hover, - html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link.is-active { - background-color: black; - color: white; } - html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link::after, - html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link::after { - border-color: white; } - html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown:focus .navbar-link, - html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown:hover .navbar-link, - html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link { - background-color: black; - color: white; } - html.theme--documenter-dark .navbar.is-black .navbar-dropdown a.navbar-item.is-active { - background-color: #0a0a0a; - color: white; } } - html.theme--documenter-dark .navbar.is-light { - background-color: #ecf0f1; - color: #282f2f; } - html.theme--documenter-dark .navbar.is-light .navbar-brand > .navbar-item, - html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link { - color: #282f2f; } - html.theme--documenter-dark .navbar.is-light .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-light .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-light .navbar-brand > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link:focus, - html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link:hover, - html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link.is-active { - background-color: #dde4e6; - color: #282f2f; } - html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link::after { - border-color: #282f2f; } - html.theme--documenter-dark .navbar.is-light .navbar-burger { - color: #282f2f; } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .navbar.is-light .navbar-start > .navbar-item, - html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link, - html.theme--documenter-dark .navbar.is-light .navbar-end > .navbar-item, - html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link { - color: #282f2f; } - html.theme--documenter-dark .navbar.is-light .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-light .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-light .navbar-start > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link:focus, - html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link:hover, - html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link.is-active, - html.theme--documenter-dark .navbar.is-light .navbar-end > a.navbar-item:focus, - html.theme--documenter-dark .navbar.is-light .navbar-end > a.navbar-item:hover, - html.theme--documenter-dark .navbar.is-light .navbar-end > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link:focus, - html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link:hover, - html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link.is-active { - background-color: #dde4e6; - color: #282f2f; } - html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link::after, - html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link::after { - border-color: #282f2f; } - html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown:focus .navbar-link, - html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown:hover .navbar-link, - html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #dde4e6; - color: #282f2f; } - html.theme--documenter-dark .navbar.is-light .navbar-dropdown a.navbar-item.is-active { - background-color: #ecf0f1; - color: #282f2f; } } - html.theme--documenter-dark .navbar.is-dark, html.theme--documenter-dark .content kbd.navbar { - background-color: #282f2f; - color: #ecf0f1; } - html.theme--documenter-dark .navbar.is-dark .navbar-brand > .navbar-item, html.theme--documenter-dark .content kbd.navbar .navbar-brand > .navbar-item, - html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link, - html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link { - color: #ecf0f1; } - html.theme--documenter-dark .navbar.is-dark .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .content kbd.navbar .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-dark .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .content kbd.navbar .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-dark .navbar-brand > a.navbar-item.is-active, html.theme--documenter-dark .content kbd.navbar .navbar-brand > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link:focus, - html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link:focus, - html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link:hover, - html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link:hover, - html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link.is-active, - html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link.is-active { - background-color: #1d2122; - color: #ecf0f1; } - html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link::after, html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link::after { - border-color: #ecf0f1; } - html.theme--documenter-dark .navbar.is-dark .navbar-burger, html.theme--documenter-dark .content kbd.navbar .navbar-burger { - color: #ecf0f1; } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .navbar.is-dark .navbar-start > .navbar-item, html.theme--documenter-dark .content kbd.navbar .navbar-start > .navbar-item, - html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link, - html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link, - html.theme--documenter-dark .navbar.is-dark .navbar-end > .navbar-item, - html.theme--documenter-dark .content kbd.navbar .navbar-end > .navbar-item, - html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link, - html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link { - color: #ecf0f1; } - html.theme--documenter-dark .navbar.is-dark .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .content kbd.navbar .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-dark .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .content kbd.navbar .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-dark .navbar-start > a.navbar-item.is-active, html.theme--documenter-dark .content kbd.navbar .navbar-start > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link:focus, - html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link:focus, - html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link:hover, - html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link:hover, - html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link.is-active, - html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link.is-active, - html.theme--documenter-dark .navbar.is-dark .navbar-end > a.navbar-item:focus, - html.theme--documenter-dark .content kbd.navbar .navbar-end > a.navbar-item:focus, - html.theme--documenter-dark .navbar.is-dark .navbar-end > a.navbar-item:hover, - html.theme--documenter-dark .content kbd.navbar .navbar-end > a.navbar-item:hover, - html.theme--documenter-dark .navbar.is-dark .navbar-end > a.navbar-item.is-active, - html.theme--documenter-dark .content kbd.navbar .navbar-end > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link:focus, - html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link:focus, - html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link:hover, - html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link:hover, - html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link.is-active, - html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link.is-active { - background-color: #1d2122; - color: #ecf0f1; } - html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link::after, html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link::after, - html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link::after, - html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link::after { - border-color: #ecf0f1; } - html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link, html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown:focus .navbar-link, - html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link, - html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown:hover .navbar-link, - html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link, - html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #1d2122; - color: #ecf0f1; } - html.theme--documenter-dark .navbar.is-dark .navbar-dropdown a.navbar-item.is-active, html.theme--documenter-dark .content kbd.navbar .navbar-dropdown a.navbar-item.is-active { - background-color: #282f2f; - color: #ecf0f1; } } - html.theme--documenter-dark .navbar.is-primary, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink { - background-color: #375a7f; - color: #fff; } - html.theme--documenter-dark .navbar.is-primary .navbar-brand > .navbar-item, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-brand > .navbar-item, - html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link, - html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link { - color: #fff; } - html.theme--documenter-dark .navbar.is-primary .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-primary .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-primary .navbar-brand > a.navbar-item.is-active, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-brand > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link:focus, - html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link:focus, - html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link:hover, - html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link:hover, - html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link.is-active, - html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link.is-active { - background-color: #2f4d6d; - color: #fff; } - html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link::after, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link::after { - border-color: #fff; } - html.theme--documenter-dark .navbar.is-primary .navbar-burger, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-burger { - color: #fff; } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .navbar.is-primary .navbar-start > .navbar-item, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-start > .navbar-item, - html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link, - html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link, - html.theme--documenter-dark .navbar.is-primary .navbar-end > .navbar-item, - html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-end > .navbar-item, - html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link, - html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link { - color: #fff; } - html.theme--documenter-dark .navbar.is-primary .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-primary .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-primary .navbar-start > a.navbar-item.is-active, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-start > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link:focus, - html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link:focus, - html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link:hover, - html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link:hover, - html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link.is-active, - html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link.is-active, - html.theme--documenter-dark .navbar.is-primary .navbar-end > a.navbar-item:focus, - html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-end > a.navbar-item:focus, - html.theme--documenter-dark .navbar.is-primary .navbar-end > a.navbar-item:hover, - html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-end > a.navbar-item:hover, - html.theme--documenter-dark .navbar.is-primary .navbar-end > a.navbar-item.is-active, - html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-end > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link:focus, - html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link:focus, - html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link:hover, - html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link:hover, - html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link.is-active, - html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link.is-active { - background-color: #2f4d6d; - color: #fff; } - html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link::after, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link::after, - html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link::after, - html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link::after { - border-color: #fff; } - html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-item.has-dropdown:focus .navbar-link, - html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link, - html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-item.has-dropdown:hover .navbar-link, - html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link, - html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #2f4d6d; - color: #fff; } - html.theme--documenter-dark .navbar.is-primary .navbar-dropdown a.navbar-item.is-active, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active { - background-color: #375a7f; - color: #fff; } } - html.theme--documenter-dark .navbar.is-link { - background-color: #1abc9c; - color: #fff; } - html.theme--documenter-dark .navbar.is-link .navbar-brand > .navbar-item, - html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link { - color: #fff; } - html.theme--documenter-dark .navbar.is-link .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-link .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-link .navbar-brand > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link:focus, - html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link:hover, - html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link.is-active { - background-color: #17a689; - color: #fff; } - html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link::after { - border-color: #fff; } - html.theme--documenter-dark .navbar.is-link .navbar-burger { - color: #fff; } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .navbar.is-link .navbar-start > .navbar-item, - html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link, - html.theme--documenter-dark .navbar.is-link .navbar-end > .navbar-item, - html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link { - color: #fff; } - html.theme--documenter-dark .navbar.is-link .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-link .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-link .navbar-start > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link:focus, - html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link:hover, - html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link.is-active, - html.theme--documenter-dark .navbar.is-link .navbar-end > a.navbar-item:focus, - html.theme--documenter-dark .navbar.is-link .navbar-end > a.navbar-item:hover, - html.theme--documenter-dark .navbar.is-link .navbar-end > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link:focus, - html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link:hover, - html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link.is-active { - background-color: #17a689; - color: #fff; } - html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link::after, - html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link::after { - border-color: #fff; } - html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown:focus .navbar-link, - html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown:hover .navbar-link, - html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #17a689; - color: #fff; } - html.theme--documenter-dark .navbar.is-link .navbar-dropdown a.navbar-item.is-active { - background-color: #1abc9c; - color: #fff; } } - html.theme--documenter-dark .navbar.is-info { - background-color: #024c7d; - color: #fff; } - html.theme--documenter-dark .navbar.is-info .navbar-brand > .navbar-item, - html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link { - color: #fff; } - html.theme--documenter-dark .navbar.is-info .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-info .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-info .navbar-brand > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link:focus, - html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link:hover, - html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link.is-active { - background-color: #023d64; - color: #fff; } - html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link::after { - border-color: #fff; } - html.theme--documenter-dark .navbar.is-info .navbar-burger { - color: #fff; } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .navbar.is-info .navbar-start > .navbar-item, - html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link, - html.theme--documenter-dark .navbar.is-info .navbar-end > .navbar-item, - html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link { - color: #fff; } - html.theme--documenter-dark .navbar.is-info .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-info .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-info .navbar-start > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link:focus, - html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link:hover, - html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link.is-active, - html.theme--documenter-dark .navbar.is-info .navbar-end > a.navbar-item:focus, - html.theme--documenter-dark .navbar.is-info .navbar-end > a.navbar-item:hover, - html.theme--documenter-dark .navbar.is-info .navbar-end > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link:focus, - html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link:hover, - html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link.is-active { - background-color: #023d64; - color: #fff; } - html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link::after, - html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link::after { - border-color: #fff; } - html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown:focus .navbar-link, - html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown:hover .navbar-link, - html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #023d64; - color: #fff; } - html.theme--documenter-dark .navbar.is-info .navbar-dropdown a.navbar-item.is-active { - background-color: #024c7d; - color: #fff; } } - html.theme--documenter-dark .navbar.is-success { - background-color: #008438; - color: #fff; } - html.theme--documenter-dark .navbar.is-success .navbar-brand > .navbar-item, - html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link { - color: #fff; } - html.theme--documenter-dark .navbar.is-success .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-success .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-success .navbar-brand > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link:focus, - html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link:hover, - html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link.is-active { - background-color: #006b2d; - color: #fff; } - html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link::after { - border-color: #fff; } - html.theme--documenter-dark .navbar.is-success .navbar-burger { - color: #fff; } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .navbar.is-success .navbar-start > .navbar-item, - html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link, - html.theme--documenter-dark .navbar.is-success .navbar-end > .navbar-item, - html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link { - color: #fff; } - html.theme--documenter-dark .navbar.is-success .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-success .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-success .navbar-start > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link:focus, - html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link:hover, - html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link.is-active, - html.theme--documenter-dark .navbar.is-success .navbar-end > a.navbar-item:focus, - html.theme--documenter-dark .navbar.is-success .navbar-end > a.navbar-item:hover, - html.theme--documenter-dark .navbar.is-success .navbar-end > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link:focus, - html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link:hover, - html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link.is-active { - background-color: #006b2d; - color: #fff; } - html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link::after, - html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link::after { - border-color: #fff; } - html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown:focus .navbar-link, - html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown:hover .navbar-link, - html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #006b2d; - color: #fff; } - html.theme--documenter-dark .navbar.is-success .navbar-dropdown a.navbar-item.is-active { - background-color: #008438; - color: #fff; } } - html.theme--documenter-dark .navbar.is-warning { - background-color: #ad8100; - color: #fff; } - html.theme--documenter-dark .navbar.is-warning .navbar-brand > .navbar-item, - html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link { - color: #fff; } - html.theme--documenter-dark .navbar.is-warning .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-warning .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-warning .navbar-brand > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link:focus, - html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link:hover, - html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link.is-active { - background-color: #946e00; - color: #fff; } - html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link::after { - border-color: #fff; } - html.theme--documenter-dark .navbar.is-warning .navbar-burger { - color: #fff; } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .navbar.is-warning .navbar-start > .navbar-item, - html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link, - html.theme--documenter-dark .navbar.is-warning .navbar-end > .navbar-item, - html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link { - color: #fff; } - html.theme--documenter-dark .navbar.is-warning .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-warning .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-warning .navbar-start > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link:focus, - html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link:hover, - html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link.is-active, - html.theme--documenter-dark .navbar.is-warning .navbar-end > a.navbar-item:focus, - html.theme--documenter-dark .navbar.is-warning .navbar-end > a.navbar-item:hover, - html.theme--documenter-dark .navbar.is-warning .navbar-end > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link:focus, - html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link:hover, - html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link.is-active { - background-color: #946e00; - color: #fff; } - html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link::after, - html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link::after { - border-color: #fff; } - html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link, - html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link, - html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #946e00; - color: #fff; } - html.theme--documenter-dark .navbar.is-warning .navbar-dropdown a.navbar-item.is-active { - background-color: #ad8100; - color: #fff; } } - html.theme--documenter-dark .navbar.is-danger { - background-color: #9e1b0d; - color: #fff; } - html.theme--documenter-dark .navbar.is-danger .navbar-brand > .navbar-item, - html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link { - color: #fff; } - html.theme--documenter-dark .navbar.is-danger .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-danger .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-danger .navbar-brand > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link:focus, - html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link:hover, - html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link.is-active { - background-color: #86170b; - color: #fff; } - html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link::after { - border-color: #fff; } - html.theme--documenter-dark .navbar.is-danger .navbar-burger { - color: #fff; } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .navbar.is-danger .navbar-start > .navbar-item, - html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link, - html.theme--documenter-dark .navbar.is-danger .navbar-end > .navbar-item, - html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link { - color: #fff; } - html.theme--documenter-dark .navbar.is-danger .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-danger .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-danger .navbar-start > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link:focus, - html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link:hover, - html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link.is-active, - html.theme--documenter-dark .navbar.is-danger .navbar-end > a.navbar-item:focus, - html.theme--documenter-dark .navbar.is-danger .navbar-end > a.navbar-item:hover, - html.theme--documenter-dark .navbar.is-danger .navbar-end > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link:focus, - html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link:hover, - html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link.is-active { - background-color: #86170b; - color: #fff; } - html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link::after, - html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link::after { - border-color: #fff; } - html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link, - html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link, - html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #86170b; - color: #fff; } - html.theme--documenter-dark .navbar.is-danger .navbar-dropdown a.navbar-item.is-active { - background-color: #9e1b0d; - color: #fff; } } - html.theme--documenter-dark .navbar > .container { - align-items: stretch; - display: flex; - min-height: 4rem; - width: 100%; } - html.theme--documenter-dark .navbar.has-shadow { - box-shadow: 0 2px 0 0 #282f2f; } - html.theme--documenter-dark .navbar.is-fixed-bottom, html.theme--documenter-dark .navbar.is-fixed-top { - left: 0; - position: fixed; - right: 0; - z-index: 30; } - html.theme--documenter-dark .navbar.is-fixed-bottom { - bottom: 0; } - html.theme--documenter-dark .navbar.is-fixed-bottom.has-shadow { - box-shadow: 0 -2px 0 0 #282f2f; } - html.theme--documenter-dark .navbar.is-fixed-top { - top: 0; } - html.theme--documenter-dark html.has-navbar-fixed-top, - html.theme--documenter-dark body.has-navbar-fixed-top { - padding-top: 4rem; } - html.theme--documenter-dark html.has-navbar-fixed-bottom, - html.theme--documenter-dark body.has-navbar-fixed-bottom { - padding-bottom: 4rem; } - html.theme--documenter-dark .navbar-brand, - html.theme--documenter-dark .navbar-tabs { - align-items: stretch; - display: flex; - flex-shrink: 0; - min-height: 4rem; } - html.theme--documenter-dark .navbar-brand a.navbar-item:focus, html.theme--documenter-dark .navbar-brand a.navbar-item:hover { - background-color: transparent; } - html.theme--documenter-dark .navbar-tabs { - -webkit-overflow-scrolling: touch; - max-width: 100vw; - overflow-x: auto; - overflow-y: hidden; } - html.theme--documenter-dark .navbar-burger { - color: #fff; - cursor: pointer; - display: block; - height: 4rem; - position: relative; - width: 4rem; - margin-left: auto; } - html.theme--documenter-dark .navbar-burger span { - background-color: currentColor; - display: block; - height: 1px; - left: calc(50% - 8px); - position: absolute; - transform-origin: center; - transition-duration: 86ms; - transition-property: background-color, opacity, transform; - transition-timing-function: ease-out; - width: 16px; } - html.theme--documenter-dark .navbar-burger span:nth-child(1) { - top: calc(50% - 6px); } - html.theme--documenter-dark .navbar-burger span:nth-child(2) { - top: calc(50% - 1px); } - html.theme--documenter-dark .navbar-burger span:nth-child(3) { - top: calc(50% + 4px); } - html.theme--documenter-dark .navbar-burger:hover { - background-color: rgba(0, 0, 0, 0.05); } - html.theme--documenter-dark .navbar-burger.is-active span:nth-child(1) { - transform: translateY(5px) rotate(45deg); } - html.theme--documenter-dark .navbar-burger.is-active span:nth-child(2) { - opacity: 0; } - html.theme--documenter-dark .navbar-burger.is-active span:nth-child(3) { - transform: translateY(-5px) rotate(-45deg); } - html.theme--documenter-dark .navbar-menu { - display: none; } - html.theme--documenter-dark .navbar-item, - html.theme--documenter-dark .navbar-link { - color: #fff; - display: block; - line-height: 1.5; - padding: 0.5rem 0.75rem; - position: relative; } - html.theme--documenter-dark .navbar-item .icon:only-child, - html.theme--documenter-dark .navbar-link .icon:only-child { - margin-left: -0.25rem; - margin-right: -0.25rem; } - html.theme--documenter-dark a.navbar-item, - html.theme--documenter-dark .navbar-link { - cursor: pointer; } - html.theme--documenter-dark a.navbar-item:focus, html.theme--documenter-dark a.navbar-item:focus-within, html.theme--documenter-dark a.navbar-item:hover, html.theme--documenter-dark a.navbar-item.is-active, - html.theme--documenter-dark .navbar-link:focus, - html.theme--documenter-dark .navbar-link:focus-within, - html.theme--documenter-dark .navbar-link:hover, - html.theme--documenter-dark .navbar-link.is-active { - background-color: transparent; - color: #1abc9c; } - html.theme--documenter-dark .navbar-item { - display: block; - flex-grow: 0; - flex-shrink: 0; } - html.theme--documenter-dark .navbar-item img { - max-height: 1.75rem; } - html.theme--documenter-dark .navbar-item.has-dropdown { - padding: 0; } - html.theme--documenter-dark .navbar-item.is-expanded { - flex-grow: 1; - flex-shrink: 1; } - html.theme--documenter-dark .navbar-item.is-tab { - border-bottom: 1px solid transparent; - min-height: 4rem; - padding-bottom: calc(0.5rem - 1px); } - html.theme--documenter-dark .navbar-item.is-tab:focus, html.theme--documenter-dark .navbar-item.is-tab:hover { - background-color: transparent; - border-bottom-color: #1abc9c; } - html.theme--documenter-dark .navbar-item.is-tab.is-active { - background-color: transparent; - border-bottom-color: #1abc9c; - border-bottom-style: solid; - border-bottom-width: 3px; - color: #1abc9c; - padding-bottom: calc(0.5rem - 3px); } - html.theme--documenter-dark .navbar-content { - flex-grow: 1; - flex-shrink: 1; } - html.theme--documenter-dark .navbar-link:not(.is-arrowless) { - padding-right: 2.5em; } - html.theme--documenter-dark .navbar-link:not(.is-arrowless)::after { - border-color: #fff; - margin-top: -0.375em; - right: 1.125em; } - html.theme--documenter-dark .navbar-dropdown { - font-size: 0.875rem; - padding-bottom: 0.5rem; - padding-top: 0.5rem; } - html.theme--documenter-dark .navbar-dropdown .navbar-item { - padding-left: 1.5rem; - padding-right: 1.5rem; } - html.theme--documenter-dark .navbar-divider { - background-color: rgba(0, 0, 0, 0.2); - border: none; - display: none; - height: 2px; - margin: 0.5rem 0; } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .navbar > .container { - display: block; } - html.theme--documenter-dark .navbar-brand .navbar-item, - html.theme--documenter-dark .navbar-tabs .navbar-item { - align-items: center; - display: flex; } - html.theme--documenter-dark .navbar-link::after { - display: none; } - html.theme--documenter-dark .navbar-menu { - background-color: #375a7f; - box-shadow: 0 8px 16px rgba(10, 10, 10, 0.1); - padding: 0.5rem 0; } - html.theme--documenter-dark .navbar-menu.is-active { - display: block; } - html.theme--documenter-dark .navbar.is-fixed-bottom-touch, html.theme--documenter-dark .navbar.is-fixed-top-touch { - left: 0; - position: fixed; - right: 0; - z-index: 30; } - html.theme--documenter-dark .navbar.is-fixed-bottom-touch { - bottom: 0; } - html.theme--documenter-dark .navbar.is-fixed-bottom-touch.has-shadow { - box-shadow: 0 -2px 3px rgba(10, 10, 10, 0.1); } - html.theme--documenter-dark .navbar.is-fixed-top-touch { - top: 0; } - html.theme--documenter-dark .navbar.is-fixed-top .navbar-menu, html.theme--documenter-dark .navbar.is-fixed-top-touch .navbar-menu { - -webkit-overflow-scrolling: touch; - max-height: calc(100vh - 4rem); - overflow: auto; } - html.theme--documenter-dark html.has-navbar-fixed-top-touch, - html.theme--documenter-dark body.has-navbar-fixed-top-touch { - padding-top: 4rem; } - html.theme--documenter-dark html.has-navbar-fixed-bottom-touch, - html.theme--documenter-dark body.has-navbar-fixed-bottom-touch { - padding-bottom: 4rem; } } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .navbar, - html.theme--documenter-dark .navbar-menu, - html.theme--documenter-dark .navbar-start, - html.theme--documenter-dark .navbar-end { - align-items: stretch; - display: flex; } - html.theme--documenter-dark .navbar { - min-height: 4rem; } - html.theme--documenter-dark .navbar.is-spaced { - padding: 1rem 2rem; } - html.theme--documenter-dark .navbar.is-spaced .navbar-start, - html.theme--documenter-dark .navbar.is-spaced .navbar-end { - align-items: center; } - html.theme--documenter-dark .navbar.is-spaced a.navbar-item, - html.theme--documenter-dark .navbar.is-spaced .navbar-link { - border-radius: 0.4em; } - html.theme--documenter-dark .navbar.is-transparent a.navbar-item:focus, html.theme--documenter-dark .navbar.is-transparent a.navbar-item:hover, html.theme--documenter-dark .navbar.is-transparent a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-transparent .navbar-link:focus, - html.theme--documenter-dark .navbar.is-transparent .navbar-link:hover, - html.theme--documenter-dark .navbar.is-transparent .navbar-link.is-active { - background-color: transparent !important; } - html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link, html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link, html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link, html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link { - background-color: transparent !important; } - html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item:focus, html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item:hover { - background-color: transparent; - color: #dbdee0; } - html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item.is-active { - background-color: transparent; - color: #1abc9c; } - html.theme--documenter-dark .navbar-burger { - display: none; } - html.theme--documenter-dark .navbar-item, - html.theme--documenter-dark .navbar-link { - align-items: center; - display: flex; } - html.theme--documenter-dark .navbar-item { - display: flex; } - html.theme--documenter-dark .navbar-item.has-dropdown { - align-items: stretch; } - html.theme--documenter-dark .navbar-item.has-dropdown-up .navbar-link::after { - transform: rotate(135deg) translate(0.25em, -0.25em); } - html.theme--documenter-dark .navbar-item.has-dropdown-up .navbar-dropdown { - border-bottom: 1px solid rgba(0, 0, 0, 0.2); - border-radius: 8px 8px 0 0; - border-top: none; - bottom: 100%; - box-shadow: 0 -8px 8px rgba(10, 10, 10, 0.1); - top: auto; } - html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown, html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown, html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown, html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown { - display: block; } - .navbar.is-spaced html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown, html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown.is-boxed, .navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown, html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed, .navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown, html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed, .navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown, html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed { - opacity: 1; - pointer-events: auto; - transform: translateY(0); } - html.theme--documenter-dark .navbar-menu { - flex-grow: 1; - flex-shrink: 0; } - html.theme--documenter-dark .navbar-start { - justify-content: flex-start; - margin-right: auto; } - html.theme--documenter-dark .navbar-end { - justify-content: flex-end; - margin-left: auto; } - html.theme--documenter-dark .navbar-dropdown { - background-color: #375a7f; - border-bottom-left-radius: 8px; - border-bottom-right-radius: 8px; - border-top: 1px solid rgba(0, 0, 0, 0.2); - box-shadow: 0 8px 8px rgba(10, 10, 10, 0.1); - display: none; - font-size: 0.875rem; - left: 0; - min-width: 100%; - position: absolute; - top: 100%; - z-index: 20; } - html.theme--documenter-dark .navbar-dropdown .navbar-item { - padding: 0.375rem 1rem; - white-space: nowrap; } - html.theme--documenter-dark .navbar-dropdown a.navbar-item { - padding-right: 3rem; } - html.theme--documenter-dark .navbar-dropdown a.navbar-item:focus, html.theme--documenter-dark .navbar-dropdown a.navbar-item:hover { - background-color: transparent; - color: #dbdee0; } - html.theme--documenter-dark .navbar-dropdown a.navbar-item.is-active { - background-color: transparent; - color: #1abc9c; } - .navbar.is-spaced html.theme--documenter-dark .navbar-dropdown, html.theme--documenter-dark .navbar-dropdown.is-boxed { - border-radius: 8px; - border-top: none; - box-shadow: 0 8px 8px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); - display: block; - opacity: 0; - pointer-events: none; - top: calc(100% + (-4px)); - transform: translateY(-5px); - transition-duration: 86ms; - transition-property: opacity, transform; } - html.theme--documenter-dark .navbar-dropdown.is-right { - left: auto; - right: 0; } - html.theme--documenter-dark .navbar-divider { - display: block; } - html.theme--documenter-dark .navbar > .container .navbar-brand, - html.theme--documenter-dark .container > .navbar .navbar-brand { - margin-left: -.75rem; } - html.theme--documenter-dark .navbar > .container .navbar-menu, - html.theme--documenter-dark .container > .navbar .navbar-menu { - margin-right: -.75rem; } - html.theme--documenter-dark .navbar.is-fixed-bottom-desktop, html.theme--documenter-dark .navbar.is-fixed-top-desktop { - left: 0; - position: fixed; - right: 0; - z-index: 30; } - html.theme--documenter-dark .navbar.is-fixed-bottom-desktop { - bottom: 0; } - html.theme--documenter-dark .navbar.is-fixed-bottom-desktop.has-shadow { - box-shadow: 0 -2px 3px rgba(10, 10, 10, 0.1); } - html.theme--documenter-dark .navbar.is-fixed-top-desktop { - top: 0; } - html.theme--documenter-dark html.has-navbar-fixed-top-desktop, - html.theme--documenter-dark body.has-navbar-fixed-top-desktop { - padding-top: 4rem; } - html.theme--documenter-dark html.has-navbar-fixed-bottom-desktop, - html.theme--documenter-dark body.has-navbar-fixed-bottom-desktop { - padding-bottom: 4rem; } - html.theme--documenter-dark html.has-spaced-navbar-fixed-top, - html.theme--documenter-dark body.has-spaced-navbar-fixed-top { - padding-top: 6rem; } - html.theme--documenter-dark html.has-spaced-navbar-fixed-bottom, - html.theme--documenter-dark body.has-spaced-navbar-fixed-bottom { - padding-bottom: 6rem; } - html.theme--documenter-dark a.navbar-item.is-active, - html.theme--documenter-dark .navbar-link.is-active { - color: #1abc9c; } - html.theme--documenter-dark a.navbar-item.is-active:not(:focus):not(:hover), - html.theme--documenter-dark .navbar-link.is-active:not(:focus):not(:hover) { - background-color: transparent; } - html.theme--documenter-dark .navbar-item.has-dropdown:focus .navbar-link, html.theme--documenter-dark .navbar-item.has-dropdown:hover .navbar-link, html.theme--documenter-dark .navbar-item.has-dropdown.is-active .navbar-link { - background-color: transparent; } } - html.theme--documenter-dark .hero.is-fullheight-with-navbar { - min-height: calc(100vh - 4rem); } - html.theme--documenter-dark .pagination { - font-size: 15px; - margin: -0.25rem; } - html.theme--documenter-dark .pagination.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.pagination { - font-size: 0.85em; } - html.theme--documenter-dark .pagination.is-medium { - font-size: 1.25rem; } - html.theme--documenter-dark .pagination.is-large { - font-size: 1.5rem; } - html.theme--documenter-dark .pagination.is-rounded .pagination-previous, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.pagination .pagination-previous, - html.theme--documenter-dark .pagination.is-rounded .pagination-next, - html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.pagination .pagination-next { - padding-left: 1em; - padding-right: 1em; - border-radius: 290486px; } - html.theme--documenter-dark .pagination.is-rounded .pagination-link, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.pagination .pagination-link { - border-radius: 290486px; } - html.theme--documenter-dark .pagination, - html.theme--documenter-dark .pagination-list { - align-items: center; - display: flex; - justify-content: center; - text-align: center; } - html.theme--documenter-dark .pagination-previous, - html.theme--documenter-dark .pagination-next, - html.theme--documenter-dark .pagination-link, - html.theme--documenter-dark .pagination-ellipsis { - font-size: 1em; - justify-content: center; - margin: 0.25rem; - padding-left: 0.5em; - padding-right: 0.5em; - text-align: center; } - html.theme--documenter-dark .pagination-previous, - html.theme--documenter-dark .pagination-next, - html.theme--documenter-dark .pagination-link { - border-color: #5e6d6f; - color: #1abc9c; - min-width: 2.25em; } - html.theme--documenter-dark .pagination-previous:hover, - html.theme--documenter-dark .pagination-next:hover, - html.theme--documenter-dark .pagination-link:hover { - border-color: #8c9b9d; - color: #1dd2af; } - html.theme--documenter-dark .pagination-previous:focus, - html.theme--documenter-dark .pagination-next:focus, - html.theme--documenter-dark .pagination-link:focus { - border-color: #8c9b9d; } - html.theme--documenter-dark .pagination-previous:active, - html.theme--documenter-dark .pagination-next:active, - html.theme--documenter-dark .pagination-link:active { - box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2); } - html.theme--documenter-dark .pagination-previous[disabled], - html.theme--documenter-dark .pagination-next[disabled], - html.theme--documenter-dark .pagination-link[disabled] { - background-color: #dbdee0; - border-color: #dbdee0; - box-shadow: none; - color: #5e6d6f; - opacity: 0.5; } - html.theme--documenter-dark .pagination-previous, - html.theme--documenter-dark .pagination-next { - padding-left: 0.75em; - padding-right: 0.75em; - white-space: nowrap; } - html.theme--documenter-dark .pagination-link.is-current { - background-color: #1abc9c; - border-color: #1abc9c; - color: #fff; } - html.theme--documenter-dark .pagination-ellipsis { - color: #8c9b9d; - pointer-events: none; } - html.theme--documenter-dark .pagination-list { - flex-wrap: wrap; } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .pagination { - flex-wrap: wrap; } - html.theme--documenter-dark .pagination-previous, - html.theme--documenter-dark .pagination-next { - flex-grow: 1; - flex-shrink: 1; } - html.theme--documenter-dark .pagination-list li { - flex-grow: 1; - flex-shrink: 1; } } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .pagination-list { - flex-grow: 1; - flex-shrink: 1; - justify-content: flex-start; - order: 1; } - html.theme--documenter-dark .pagination-previous { - order: 2; } - html.theme--documenter-dark .pagination-next { - order: 3; } - html.theme--documenter-dark .pagination { - justify-content: space-between; } - html.theme--documenter-dark .pagination.is-centered .pagination-previous { - order: 1; } - html.theme--documenter-dark .pagination.is-centered .pagination-list { - justify-content: center; - order: 2; } - html.theme--documenter-dark .pagination.is-centered .pagination-next { - order: 3; } - html.theme--documenter-dark .pagination.is-right .pagination-previous { - order: 1; } - html.theme--documenter-dark .pagination.is-right .pagination-next { - order: 2; } - html.theme--documenter-dark .pagination.is-right .pagination-list { - justify-content: flex-end; - order: 3; } } - html.theme--documenter-dark .panel { - font-size: 15px; } - html.theme--documenter-dark .panel:not(:last-child) { - margin-bottom: 1.5rem; } - html.theme--documenter-dark .panel-heading, - html.theme--documenter-dark .panel-tabs, - html.theme--documenter-dark .panel-block { - border-bottom: 1px solid #5e6d6f; - border-left: 1px solid #5e6d6f; - border-right: 1px solid #5e6d6f; } - html.theme--documenter-dark .panel-heading:first-child, - html.theme--documenter-dark .panel-tabs:first-child, - html.theme--documenter-dark .panel-block:first-child { - border-top: 1px solid #5e6d6f; } - html.theme--documenter-dark .panel-heading { - background-color: #282f2f; - border-radius: 0.4em 0.4em 0 0; - color: #f2f2f2; - font-size: 1.25em; - font-weight: 300; - line-height: 1.25; - padding: 0.5em 0.75em; } - html.theme--documenter-dark .panel-tabs { - align-items: flex-end; - display: flex; - font-size: 0.875em; - justify-content: center; } - html.theme--documenter-dark .panel-tabs a { - border-bottom: 1px solid #5e6d6f; - margin-bottom: -1px; - padding: 0.5em; } - html.theme--documenter-dark .panel-tabs a.is-active { - border-bottom-color: #343c3d; - color: #17a689; } - html.theme--documenter-dark .panel-list a { - color: #fff; } - html.theme--documenter-dark .panel-list a:hover { - color: #1abc9c; } - html.theme--documenter-dark .panel-block { - align-items: center; - color: #f2f2f2; - display: flex; - justify-content: flex-start; - padding: 0.5em 0.75em; } - html.theme--documenter-dark .panel-block input[type="checkbox"] { - margin-right: 0.75em; } - html.theme--documenter-dark .panel-block > .control { - flex-grow: 1; - flex-shrink: 1; - width: 100%; } - html.theme--documenter-dark .panel-block.is-wrapped { - flex-wrap: wrap; } - html.theme--documenter-dark .panel-block.is-active { - border-left-color: #1abc9c; - color: #17a689; } - html.theme--documenter-dark .panel-block.is-active .panel-icon { - color: #1abc9c; } - html.theme--documenter-dark a.panel-block, - html.theme--documenter-dark label.panel-block { - cursor: pointer; } - html.theme--documenter-dark a.panel-block:hover, - html.theme--documenter-dark label.panel-block:hover { - background-color: #282f2f; } - html.theme--documenter-dark .panel-icon { - display: inline-block; - font-size: 14px; - height: 1em; - line-height: 1em; - text-align: center; - vertical-align: top; - width: 1em; - color: white; - margin-right: 0.75em; } - html.theme--documenter-dark .panel-icon .fa { - font-size: inherit; - line-height: inherit; } - html.theme--documenter-dark .tabs { - -webkit-overflow-scrolling: touch; - align-items: stretch; - display: flex; - font-size: 15px; - justify-content: space-between; - overflow: hidden; - overflow-x: auto; - white-space: nowrap; } - html.theme--documenter-dark .tabs a { - align-items: center; - border-bottom-color: #5e6d6f; - border-bottom-style: solid; - border-bottom-width: 1px; - color: #fff; - display: flex; - justify-content: center; - margin-bottom: -1px; - padding: 0.5em 1em; - vertical-align: top; } - html.theme--documenter-dark .tabs a:hover { - border-bottom-color: #f2f2f2; - color: #f2f2f2; } - html.theme--documenter-dark .tabs li { - display: block; } - html.theme--documenter-dark .tabs li.is-active a { - border-bottom-color: #1abc9c; - color: #1abc9c; } - html.theme--documenter-dark .tabs ul { - align-items: center; - border-bottom-color: #5e6d6f; - border-bottom-style: solid; - border-bottom-width: 1px; - display: flex; - flex-grow: 1; - flex-shrink: 0; - justify-content: flex-start; } - html.theme--documenter-dark .tabs ul.is-left { - padding-right: 0.75em; } - html.theme--documenter-dark .tabs ul.is-center { - flex: none; - justify-content: center; - padding-left: 0.75em; - padding-right: 0.75em; } - html.theme--documenter-dark .tabs ul.is-right { - justify-content: flex-end; - padding-left: 0.75em; } - html.theme--documenter-dark .tabs .icon:first-child { - margin-right: 0.5em; } - html.theme--documenter-dark .tabs .icon:last-child { - margin-left: 0.5em; } - html.theme--documenter-dark .tabs.is-centered ul { - justify-content: center; } - html.theme--documenter-dark .tabs.is-right ul { - justify-content: flex-end; } - html.theme--documenter-dark .tabs.is-boxed a { - border: 1px solid transparent; - border-radius: 0.4em 0.4em 0 0; } - html.theme--documenter-dark .tabs.is-boxed a:hover { - background-color: #282f2f; - border-bottom-color: #5e6d6f; } - html.theme--documenter-dark .tabs.is-boxed li.is-active a { - background-color: white; - border-color: #5e6d6f; - border-bottom-color: transparent !important; } - html.theme--documenter-dark .tabs.is-fullwidth li { - flex-grow: 1; - flex-shrink: 0; } - html.theme--documenter-dark .tabs.is-toggle a { - border-color: #5e6d6f; - border-style: solid; - border-width: 1px; - margin-bottom: 0; - position: relative; } - html.theme--documenter-dark .tabs.is-toggle a:hover { - background-color: #282f2f; - border-color: #8c9b9d; - z-index: 2; } - html.theme--documenter-dark .tabs.is-toggle li + li { - margin-left: -1px; } - html.theme--documenter-dark .tabs.is-toggle li:first-child a { - border-radius: 0.4em 0 0 0.4em; } - html.theme--documenter-dark .tabs.is-toggle li:last-child a { - border-radius: 0 0.4em 0.4em 0; } - html.theme--documenter-dark .tabs.is-toggle li.is-active a { - background-color: #1abc9c; - border-color: #1abc9c; - color: #fff; - z-index: 1; } - html.theme--documenter-dark .tabs.is-toggle ul { - border-bottom: none; } - html.theme--documenter-dark .tabs.is-toggle.is-toggle-rounded li:first-child a { - border-bottom-left-radius: 290486px; - border-top-left-radius: 290486px; - padding-left: 1.25em; } - html.theme--documenter-dark .tabs.is-toggle.is-toggle-rounded li:last-child a { - border-bottom-right-radius: 290486px; - border-top-right-radius: 290486px; - padding-right: 1.25em; } - html.theme--documenter-dark .tabs.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.tabs { - font-size: 0.85em; } - html.theme--documenter-dark .tabs.is-medium { - font-size: 1.25rem; } - html.theme--documenter-dark .tabs.is-large { - font-size: 1.5rem; } - html.theme--documenter-dark .column { - display: block; - flex-basis: 0; - flex-grow: 1; - flex-shrink: 1; - padding: 0.75rem; } - .columns.is-mobile > html.theme--documenter-dark .column.is-narrow { - flex: none; } - .columns.is-mobile > html.theme--documenter-dark .column.is-full { - flex: none; - width: 100%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-three-quarters { - flex: none; - width: 75%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-two-thirds { - flex: none; - width: 66.6666%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-half { - flex: none; - width: 50%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-one-third { - flex: none; - width: 33.3333%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-one-quarter { - flex: none; - width: 25%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-one-fifth { - flex: none; - width: 20%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-two-fifths { - flex: none; - width: 40%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-three-fifths { - flex: none; - width: 60%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-four-fifths { - flex: none; - width: 80%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-three-quarters { - margin-left: 75%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-two-thirds { - margin-left: 66.6666%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-half { - margin-left: 50%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-one-third { - margin-left: 33.3333%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-one-quarter { - margin-left: 25%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-one-fifth { - margin-left: 20%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-two-fifths { - margin-left: 40%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-three-fifths { - margin-left: 60%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-four-fifths { - margin-left: 80%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-0 { - flex: none; - width: 0%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-0 { - margin-left: 0%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-1 { - flex: none; - width: 8.3333333333%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-1 { - margin-left: 8.3333333333%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-2 { - flex: none; - width: 16.6666666667%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-2 { - margin-left: 16.6666666667%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-3 { - flex: none; - width: 25%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-3 { - margin-left: 25%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-4 { - flex: none; - width: 33.3333333333%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-4 { - margin-left: 33.3333333333%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-5 { - flex: none; - width: 41.6666666667%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-5 { - margin-left: 41.6666666667%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-6 { - flex: none; - width: 50%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-6 { - margin-left: 50%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-7 { - flex: none; - width: 58.3333333333%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-7 { - margin-left: 58.3333333333%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-8 { - flex: none; - width: 66.6666666667%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-8 { - margin-left: 66.6666666667%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-9 { - flex: none; - width: 75%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-9 { - margin-left: 75%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-10 { - flex: none; - width: 83.3333333333%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-10 { - margin-left: 83.3333333333%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-11 { - flex: none; - width: 91.6666666667%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-11 { - margin-left: 91.6666666667%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-12 { - flex: none; - width: 100%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-12 { - margin-left: 100%; } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .column.is-narrow-mobile { - flex: none; } - html.theme--documenter-dark .column.is-full-mobile { - flex: none; - width: 100%; } - html.theme--documenter-dark .column.is-three-quarters-mobile { - flex: none; - width: 75%; } - html.theme--documenter-dark .column.is-two-thirds-mobile { - flex: none; - width: 66.6666%; } - html.theme--documenter-dark .column.is-half-mobile { - flex: none; - width: 50%; } - html.theme--documenter-dark .column.is-one-third-mobile { - flex: none; - width: 33.3333%; } - html.theme--documenter-dark .column.is-one-quarter-mobile { - flex: none; - width: 25%; } - html.theme--documenter-dark .column.is-one-fifth-mobile { - flex: none; - width: 20%; } - html.theme--documenter-dark .column.is-two-fifths-mobile { - flex: none; - width: 40%; } - html.theme--documenter-dark .column.is-three-fifths-mobile { - flex: none; - width: 60%; } - html.theme--documenter-dark .column.is-four-fifths-mobile { - flex: none; - width: 80%; } - html.theme--documenter-dark .column.is-offset-three-quarters-mobile { - margin-left: 75%; } - html.theme--documenter-dark .column.is-offset-two-thirds-mobile { - margin-left: 66.6666%; } - html.theme--documenter-dark .column.is-offset-half-mobile { - margin-left: 50%; } - html.theme--documenter-dark .column.is-offset-one-third-mobile { - margin-left: 33.3333%; } - html.theme--documenter-dark .column.is-offset-one-quarter-mobile { - margin-left: 25%; } - html.theme--documenter-dark .column.is-offset-one-fifth-mobile { - margin-left: 20%; } - html.theme--documenter-dark .column.is-offset-two-fifths-mobile { - margin-left: 40%; } - html.theme--documenter-dark .column.is-offset-three-fifths-mobile { - margin-left: 60%; } - html.theme--documenter-dark .column.is-offset-four-fifths-mobile { - margin-left: 80%; } - html.theme--documenter-dark .column.is-0-mobile { - flex: none; - width: 0%; } - html.theme--documenter-dark .column.is-offset-0-mobile { - margin-left: 0%; } - html.theme--documenter-dark .column.is-1-mobile { - flex: none; - width: 8.3333333333%; } - html.theme--documenter-dark .column.is-offset-1-mobile { - margin-left: 8.3333333333%; } - html.theme--documenter-dark .column.is-2-mobile { - flex: none; - width: 16.6666666667%; } - html.theme--documenter-dark .column.is-offset-2-mobile { - margin-left: 16.6666666667%; } - html.theme--documenter-dark .column.is-3-mobile { - flex: none; - width: 25%; } - html.theme--documenter-dark .column.is-offset-3-mobile { - margin-left: 25%; } - html.theme--documenter-dark .column.is-4-mobile { - flex: none; - width: 33.3333333333%; } - html.theme--documenter-dark .column.is-offset-4-mobile { - margin-left: 33.3333333333%; } - html.theme--documenter-dark .column.is-5-mobile { - flex: none; - width: 41.6666666667%; } - html.theme--documenter-dark .column.is-offset-5-mobile { - margin-left: 41.6666666667%; } - html.theme--documenter-dark .column.is-6-mobile { - flex: none; - width: 50%; } - html.theme--documenter-dark .column.is-offset-6-mobile { - margin-left: 50%; } - html.theme--documenter-dark .column.is-7-mobile { - flex: none; - width: 58.3333333333%; } - html.theme--documenter-dark .column.is-offset-7-mobile { - margin-left: 58.3333333333%; } - html.theme--documenter-dark .column.is-8-mobile { - flex: none; - width: 66.6666666667%; } - html.theme--documenter-dark .column.is-offset-8-mobile { - margin-left: 66.6666666667%; } - html.theme--documenter-dark .column.is-9-mobile { - flex: none; - width: 75%; } - html.theme--documenter-dark .column.is-offset-9-mobile { - margin-left: 75%; } - html.theme--documenter-dark .column.is-10-mobile { - flex: none; - width: 83.3333333333%; } - html.theme--documenter-dark .column.is-offset-10-mobile { - margin-left: 83.3333333333%; } - html.theme--documenter-dark .column.is-11-mobile { - flex: none; - width: 91.6666666667%; } - html.theme--documenter-dark .column.is-offset-11-mobile { - margin-left: 91.6666666667%; } - html.theme--documenter-dark .column.is-12-mobile { - flex: none; - width: 100%; } - html.theme--documenter-dark .column.is-offset-12-mobile { - margin-left: 100%; } } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .column.is-narrow, html.theme--documenter-dark .column.is-narrow-tablet { - flex: none; } - html.theme--documenter-dark .column.is-full, html.theme--documenter-dark .column.is-full-tablet { - flex: none; - width: 100%; } - html.theme--documenter-dark .column.is-three-quarters, html.theme--documenter-dark .column.is-three-quarters-tablet { - flex: none; - width: 75%; } - html.theme--documenter-dark .column.is-two-thirds, html.theme--documenter-dark .column.is-two-thirds-tablet { - flex: none; - width: 66.6666%; } - html.theme--documenter-dark .column.is-half, html.theme--documenter-dark .column.is-half-tablet { - flex: none; - width: 50%; } - html.theme--documenter-dark .column.is-one-third, html.theme--documenter-dark .column.is-one-third-tablet { - flex: none; - width: 33.3333%; } - html.theme--documenter-dark .column.is-one-quarter, html.theme--documenter-dark .column.is-one-quarter-tablet { - flex: none; - width: 25%; } - html.theme--documenter-dark .column.is-one-fifth, html.theme--documenter-dark .column.is-one-fifth-tablet { - flex: none; - width: 20%; } - html.theme--documenter-dark .column.is-two-fifths, html.theme--documenter-dark .column.is-two-fifths-tablet { - flex: none; - width: 40%; } - html.theme--documenter-dark .column.is-three-fifths, html.theme--documenter-dark .column.is-three-fifths-tablet { - flex: none; - width: 60%; } - html.theme--documenter-dark .column.is-four-fifths, html.theme--documenter-dark .column.is-four-fifths-tablet { - flex: none; - width: 80%; } - html.theme--documenter-dark .column.is-offset-three-quarters, html.theme--documenter-dark .column.is-offset-three-quarters-tablet { - margin-left: 75%; } - html.theme--documenter-dark .column.is-offset-two-thirds, html.theme--documenter-dark .column.is-offset-two-thirds-tablet { - margin-left: 66.6666%; } - html.theme--documenter-dark .column.is-offset-half, html.theme--documenter-dark .column.is-offset-half-tablet { - margin-left: 50%; } - html.theme--documenter-dark .column.is-offset-one-third, html.theme--documenter-dark .column.is-offset-one-third-tablet { - margin-left: 33.3333%; } - html.theme--documenter-dark .column.is-offset-one-quarter, html.theme--documenter-dark .column.is-offset-one-quarter-tablet { - margin-left: 25%; } - html.theme--documenter-dark .column.is-offset-one-fifth, html.theme--documenter-dark .column.is-offset-one-fifth-tablet { - margin-left: 20%; } - html.theme--documenter-dark .column.is-offset-two-fifths, html.theme--documenter-dark .column.is-offset-two-fifths-tablet { - margin-left: 40%; } - html.theme--documenter-dark .column.is-offset-three-fifths, html.theme--documenter-dark .column.is-offset-three-fifths-tablet { - margin-left: 60%; } - html.theme--documenter-dark .column.is-offset-four-fifths, html.theme--documenter-dark .column.is-offset-four-fifths-tablet { - margin-left: 80%; } - html.theme--documenter-dark .column.is-0, html.theme--documenter-dark .column.is-0-tablet { - flex: none; - width: 0%; } - html.theme--documenter-dark .column.is-offset-0, html.theme--documenter-dark .column.is-offset-0-tablet { - margin-left: 0%; } - html.theme--documenter-dark .column.is-1, html.theme--documenter-dark .column.is-1-tablet { - flex: none; - width: 8.3333333333%; } - html.theme--documenter-dark .column.is-offset-1, html.theme--documenter-dark .column.is-offset-1-tablet { - margin-left: 8.3333333333%; } - html.theme--documenter-dark .column.is-2, html.theme--documenter-dark .column.is-2-tablet { - flex: none; - width: 16.6666666667%; } - html.theme--documenter-dark .column.is-offset-2, html.theme--documenter-dark .column.is-offset-2-tablet { - margin-left: 16.6666666667%; } - html.theme--documenter-dark .column.is-3, html.theme--documenter-dark .column.is-3-tablet { - flex: none; - width: 25%; } - html.theme--documenter-dark .column.is-offset-3, html.theme--documenter-dark .column.is-offset-3-tablet { - margin-left: 25%; } - html.theme--documenter-dark .column.is-4, html.theme--documenter-dark .column.is-4-tablet { - flex: none; - width: 33.3333333333%; } - html.theme--documenter-dark .column.is-offset-4, html.theme--documenter-dark .column.is-offset-4-tablet { - margin-left: 33.3333333333%; } - html.theme--documenter-dark .column.is-5, html.theme--documenter-dark .column.is-5-tablet { - flex: none; - width: 41.6666666667%; } - html.theme--documenter-dark .column.is-offset-5, html.theme--documenter-dark .column.is-offset-5-tablet { - margin-left: 41.6666666667%; } - html.theme--documenter-dark .column.is-6, html.theme--documenter-dark .column.is-6-tablet { - flex: none; - width: 50%; } - html.theme--documenter-dark .column.is-offset-6, html.theme--documenter-dark .column.is-offset-6-tablet { - margin-left: 50%; } - html.theme--documenter-dark .column.is-7, html.theme--documenter-dark .column.is-7-tablet { - flex: none; - width: 58.3333333333%; } - html.theme--documenter-dark .column.is-offset-7, html.theme--documenter-dark .column.is-offset-7-tablet { - margin-left: 58.3333333333%; } - html.theme--documenter-dark .column.is-8, html.theme--documenter-dark .column.is-8-tablet { - flex: none; - width: 66.6666666667%; } - html.theme--documenter-dark .column.is-offset-8, html.theme--documenter-dark .column.is-offset-8-tablet { - margin-left: 66.6666666667%; } - html.theme--documenter-dark .column.is-9, html.theme--documenter-dark .column.is-9-tablet { - flex: none; - width: 75%; } - html.theme--documenter-dark .column.is-offset-9, html.theme--documenter-dark .column.is-offset-9-tablet { - margin-left: 75%; } - html.theme--documenter-dark .column.is-10, html.theme--documenter-dark .column.is-10-tablet { - flex: none; - width: 83.3333333333%; } - html.theme--documenter-dark .column.is-offset-10, html.theme--documenter-dark .column.is-offset-10-tablet { - margin-left: 83.3333333333%; } - html.theme--documenter-dark .column.is-11, html.theme--documenter-dark .column.is-11-tablet { - flex: none; - width: 91.6666666667%; } - html.theme--documenter-dark .column.is-offset-11, html.theme--documenter-dark .column.is-offset-11-tablet { - margin-left: 91.6666666667%; } - html.theme--documenter-dark .column.is-12, html.theme--documenter-dark .column.is-12-tablet { - flex: none; - width: 100%; } - html.theme--documenter-dark .column.is-offset-12, html.theme--documenter-dark .column.is-offset-12-tablet { - margin-left: 100%; } } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .column.is-narrow-touch { - flex: none; } - html.theme--documenter-dark .column.is-full-touch { - flex: none; - width: 100%; } - html.theme--documenter-dark .column.is-three-quarters-touch { - flex: none; - width: 75%; } - html.theme--documenter-dark .column.is-two-thirds-touch { - flex: none; - width: 66.6666%; } - html.theme--documenter-dark .column.is-half-touch { - flex: none; - width: 50%; } - html.theme--documenter-dark .column.is-one-third-touch { - flex: none; - width: 33.3333%; } - html.theme--documenter-dark .column.is-one-quarter-touch { - flex: none; - width: 25%; } - html.theme--documenter-dark .column.is-one-fifth-touch { - flex: none; - width: 20%; } - html.theme--documenter-dark .column.is-two-fifths-touch { - flex: none; - width: 40%; } - html.theme--documenter-dark .column.is-three-fifths-touch { - flex: none; - width: 60%; } - html.theme--documenter-dark .column.is-four-fifths-touch { - flex: none; - width: 80%; } - html.theme--documenter-dark .column.is-offset-three-quarters-touch { - margin-left: 75%; } - html.theme--documenter-dark .column.is-offset-two-thirds-touch { - margin-left: 66.6666%; } - html.theme--documenter-dark .column.is-offset-half-touch { - margin-left: 50%; } - html.theme--documenter-dark .column.is-offset-one-third-touch { - margin-left: 33.3333%; } - html.theme--documenter-dark .column.is-offset-one-quarter-touch { - margin-left: 25%; } - html.theme--documenter-dark .column.is-offset-one-fifth-touch { - margin-left: 20%; } - html.theme--documenter-dark .column.is-offset-two-fifths-touch { - margin-left: 40%; } - html.theme--documenter-dark .column.is-offset-three-fifths-touch { - margin-left: 60%; } - html.theme--documenter-dark .column.is-offset-four-fifths-touch { - margin-left: 80%; } - html.theme--documenter-dark .column.is-0-touch { - flex: none; - width: 0%; } - html.theme--documenter-dark .column.is-offset-0-touch { - margin-left: 0%; } - html.theme--documenter-dark .column.is-1-touch { - flex: none; - width: 8.3333333333%; } - html.theme--documenter-dark .column.is-offset-1-touch { - margin-left: 8.3333333333%; } - html.theme--documenter-dark .column.is-2-touch { - flex: none; - width: 16.6666666667%; } - html.theme--documenter-dark .column.is-offset-2-touch { - margin-left: 16.6666666667%; } - html.theme--documenter-dark .column.is-3-touch { - flex: none; - width: 25%; } - html.theme--documenter-dark .column.is-offset-3-touch { - margin-left: 25%; } - html.theme--documenter-dark .column.is-4-touch { - flex: none; - width: 33.3333333333%; } - html.theme--documenter-dark .column.is-offset-4-touch { - margin-left: 33.3333333333%; } - html.theme--documenter-dark .column.is-5-touch { - flex: none; - width: 41.6666666667%; } - html.theme--documenter-dark .column.is-offset-5-touch { - margin-left: 41.6666666667%; } - html.theme--documenter-dark .column.is-6-touch { - flex: none; - width: 50%; } - html.theme--documenter-dark .column.is-offset-6-touch { - margin-left: 50%; } - html.theme--documenter-dark .column.is-7-touch { - flex: none; - width: 58.3333333333%; } - html.theme--documenter-dark .column.is-offset-7-touch { - margin-left: 58.3333333333%; } - html.theme--documenter-dark .column.is-8-touch { - flex: none; - width: 66.6666666667%; } - html.theme--documenter-dark .column.is-offset-8-touch { - margin-left: 66.6666666667%; } - html.theme--documenter-dark .column.is-9-touch { - flex: none; - width: 75%; } - html.theme--documenter-dark .column.is-offset-9-touch { - margin-left: 75%; } - html.theme--documenter-dark .column.is-10-touch { - flex: none; - width: 83.3333333333%; } - html.theme--documenter-dark .column.is-offset-10-touch { - margin-left: 83.3333333333%; } - html.theme--documenter-dark .column.is-11-touch { - flex: none; - width: 91.6666666667%; } - html.theme--documenter-dark .column.is-offset-11-touch { - margin-left: 91.6666666667%; } - html.theme--documenter-dark .column.is-12-touch { - flex: none; - width: 100%; } - html.theme--documenter-dark .column.is-offset-12-touch { - margin-left: 100%; } } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .column.is-narrow-desktop { - flex: none; } - html.theme--documenter-dark .column.is-full-desktop { - flex: none; - width: 100%; } - html.theme--documenter-dark .column.is-three-quarters-desktop { - flex: none; - width: 75%; } - html.theme--documenter-dark .column.is-two-thirds-desktop { - flex: none; - width: 66.6666%; } - html.theme--documenter-dark .column.is-half-desktop { - flex: none; - width: 50%; } - html.theme--documenter-dark .column.is-one-third-desktop { - flex: none; - width: 33.3333%; } - html.theme--documenter-dark .column.is-one-quarter-desktop { - flex: none; - width: 25%; } - html.theme--documenter-dark .column.is-one-fifth-desktop { - flex: none; - width: 20%; } - html.theme--documenter-dark .column.is-two-fifths-desktop { - flex: none; - width: 40%; } - html.theme--documenter-dark .column.is-three-fifths-desktop { - flex: none; - width: 60%; } - html.theme--documenter-dark .column.is-four-fifths-desktop { - flex: none; - width: 80%; } - html.theme--documenter-dark .column.is-offset-three-quarters-desktop { - margin-left: 75%; } - html.theme--documenter-dark .column.is-offset-two-thirds-desktop { - margin-left: 66.6666%; } - html.theme--documenter-dark .column.is-offset-half-desktop { - margin-left: 50%; } - html.theme--documenter-dark .column.is-offset-one-third-desktop { - margin-left: 33.3333%; } - html.theme--documenter-dark .column.is-offset-one-quarter-desktop { - margin-left: 25%; } - html.theme--documenter-dark .column.is-offset-one-fifth-desktop { - margin-left: 20%; } - html.theme--documenter-dark .column.is-offset-two-fifths-desktop { - margin-left: 40%; } - html.theme--documenter-dark .column.is-offset-three-fifths-desktop { - margin-left: 60%; } - html.theme--documenter-dark .column.is-offset-four-fifths-desktop { - margin-left: 80%; } - html.theme--documenter-dark .column.is-0-desktop { - flex: none; - width: 0%; } - html.theme--documenter-dark .column.is-offset-0-desktop { - margin-left: 0%; } - html.theme--documenter-dark .column.is-1-desktop { - flex: none; - width: 8.3333333333%; } - html.theme--documenter-dark .column.is-offset-1-desktop { - margin-left: 8.3333333333%; } - html.theme--documenter-dark .column.is-2-desktop { - flex: none; - width: 16.6666666667%; } - html.theme--documenter-dark .column.is-offset-2-desktop { - margin-left: 16.6666666667%; } - html.theme--documenter-dark .column.is-3-desktop { - flex: none; - width: 25%; } - html.theme--documenter-dark .column.is-offset-3-desktop { - margin-left: 25%; } - html.theme--documenter-dark .column.is-4-desktop { - flex: none; - width: 33.3333333333%; } - html.theme--documenter-dark .column.is-offset-4-desktop { - margin-left: 33.3333333333%; } - html.theme--documenter-dark .column.is-5-desktop { - flex: none; - width: 41.6666666667%; } - html.theme--documenter-dark .column.is-offset-5-desktop { - margin-left: 41.6666666667%; } - html.theme--documenter-dark .column.is-6-desktop { - flex: none; - width: 50%; } - html.theme--documenter-dark .column.is-offset-6-desktop { - margin-left: 50%; } - html.theme--documenter-dark .column.is-7-desktop { - flex: none; - width: 58.3333333333%; } - html.theme--documenter-dark .column.is-offset-7-desktop { - margin-left: 58.3333333333%; } - html.theme--documenter-dark .column.is-8-desktop { - flex: none; - width: 66.6666666667%; } - html.theme--documenter-dark .column.is-offset-8-desktop { - margin-left: 66.6666666667%; } - html.theme--documenter-dark .column.is-9-desktop { - flex: none; - width: 75%; } - html.theme--documenter-dark .column.is-offset-9-desktop { - margin-left: 75%; } - html.theme--documenter-dark .column.is-10-desktop { - flex: none; - width: 83.3333333333%; } - html.theme--documenter-dark .column.is-offset-10-desktop { - margin-left: 83.3333333333%; } - html.theme--documenter-dark .column.is-11-desktop { - flex: none; - width: 91.6666666667%; } - html.theme--documenter-dark .column.is-offset-11-desktop { - margin-left: 91.6666666667%; } - html.theme--documenter-dark .column.is-12-desktop { - flex: none; - width: 100%; } - html.theme--documenter-dark .column.is-offset-12-desktop { - margin-left: 100%; } } - @media screen and (min-width: 1216px) { - html.theme--documenter-dark .column.is-narrow-widescreen { - flex: none; } - html.theme--documenter-dark .column.is-full-widescreen { - flex: none; - width: 100%; } - html.theme--documenter-dark .column.is-three-quarters-widescreen { - flex: none; - width: 75%; } - html.theme--documenter-dark .column.is-two-thirds-widescreen { - flex: none; - width: 66.6666%; } - html.theme--documenter-dark .column.is-half-widescreen { - flex: none; - width: 50%; } - html.theme--documenter-dark .column.is-one-third-widescreen { - flex: none; - width: 33.3333%; } - html.theme--documenter-dark .column.is-one-quarter-widescreen { - flex: none; - width: 25%; } - html.theme--documenter-dark .column.is-one-fifth-widescreen { - flex: none; - width: 20%; } - html.theme--documenter-dark .column.is-two-fifths-widescreen { - flex: none; - width: 40%; } - html.theme--documenter-dark .column.is-three-fifths-widescreen { - flex: none; - width: 60%; } - html.theme--documenter-dark .column.is-four-fifths-widescreen { - flex: none; - width: 80%; } - html.theme--documenter-dark .column.is-offset-three-quarters-widescreen { - margin-left: 75%; } - html.theme--documenter-dark .column.is-offset-two-thirds-widescreen { - margin-left: 66.6666%; } - html.theme--documenter-dark .column.is-offset-half-widescreen { - margin-left: 50%; } - html.theme--documenter-dark .column.is-offset-one-third-widescreen { - margin-left: 33.3333%; } - html.theme--documenter-dark .column.is-offset-one-quarter-widescreen { - margin-left: 25%; } - html.theme--documenter-dark .column.is-offset-one-fifth-widescreen { - margin-left: 20%; } - html.theme--documenter-dark .column.is-offset-two-fifths-widescreen { - margin-left: 40%; } - html.theme--documenter-dark .column.is-offset-three-fifths-widescreen { - margin-left: 60%; } - html.theme--documenter-dark .column.is-offset-four-fifths-widescreen { - margin-left: 80%; } - html.theme--documenter-dark .column.is-0-widescreen { - flex: none; - width: 0%; } - html.theme--documenter-dark .column.is-offset-0-widescreen { - margin-left: 0%; } - html.theme--documenter-dark .column.is-1-widescreen { - flex: none; - width: 8.3333333333%; } - html.theme--documenter-dark .column.is-offset-1-widescreen { - margin-left: 8.3333333333%; } - html.theme--documenter-dark .column.is-2-widescreen { - flex: none; - width: 16.6666666667%; } - html.theme--documenter-dark .column.is-offset-2-widescreen { - margin-left: 16.6666666667%; } - html.theme--documenter-dark .column.is-3-widescreen { - flex: none; - width: 25%; } - html.theme--documenter-dark .column.is-offset-3-widescreen { - margin-left: 25%; } - html.theme--documenter-dark .column.is-4-widescreen { - flex: none; - width: 33.3333333333%; } - html.theme--documenter-dark .column.is-offset-4-widescreen { - margin-left: 33.3333333333%; } - html.theme--documenter-dark .column.is-5-widescreen { - flex: none; - width: 41.6666666667%; } - html.theme--documenter-dark .column.is-offset-5-widescreen { - margin-left: 41.6666666667%; } - html.theme--documenter-dark .column.is-6-widescreen { - flex: none; - width: 50%; } - html.theme--documenter-dark .column.is-offset-6-widescreen { - margin-left: 50%; } - html.theme--documenter-dark .column.is-7-widescreen { - flex: none; - width: 58.3333333333%; } - html.theme--documenter-dark .column.is-offset-7-widescreen { - margin-left: 58.3333333333%; } - html.theme--documenter-dark .column.is-8-widescreen { - flex: none; - width: 66.6666666667%; } - html.theme--documenter-dark .column.is-offset-8-widescreen { - margin-left: 66.6666666667%; } - html.theme--documenter-dark .column.is-9-widescreen { - flex: none; - width: 75%; } - html.theme--documenter-dark .column.is-offset-9-widescreen { - margin-left: 75%; } - html.theme--documenter-dark .column.is-10-widescreen { - flex: none; - width: 83.3333333333%; } - html.theme--documenter-dark .column.is-offset-10-widescreen { - margin-left: 83.3333333333%; } - html.theme--documenter-dark .column.is-11-widescreen { - flex: none; - width: 91.6666666667%; } - html.theme--documenter-dark .column.is-offset-11-widescreen { - margin-left: 91.6666666667%; } - html.theme--documenter-dark .column.is-12-widescreen { - flex: none; - width: 100%; } - html.theme--documenter-dark .column.is-offset-12-widescreen { - margin-left: 100%; } } - @media screen and (min-width: 1408px) { - html.theme--documenter-dark .column.is-narrow-fullhd { - flex: none; } - html.theme--documenter-dark .column.is-full-fullhd { - flex: none; - width: 100%; } - html.theme--documenter-dark .column.is-three-quarters-fullhd { - flex: none; - width: 75%; } - html.theme--documenter-dark .column.is-two-thirds-fullhd { - flex: none; - width: 66.6666%; } - html.theme--documenter-dark .column.is-half-fullhd { - flex: none; - width: 50%; } - html.theme--documenter-dark .column.is-one-third-fullhd { - flex: none; - width: 33.3333%; } - html.theme--documenter-dark .column.is-one-quarter-fullhd { - flex: none; - width: 25%; } - html.theme--documenter-dark .column.is-one-fifth-fullhd { - flex: none; - width: 20%; } - html.theme--documenter-dark .column.is-two-fifths-fullhd { - flex: none; - width: 40%; } - html.theme--documenter-dark .column.is-three-fifths-fullhd { - flex: none; - width: 60%; } - html.theme--documenter-dark .column.is-four-fifths-fullhd { - flex: none; - width: 80%; } - html.theme--documenter-dark .column.is-offset-three-quarters-fullhd { - margin-left: 75%; } - html.theme--documenter-dark .column.is-offset-two-thirds-fullhd { - margin-left: 66.6666%; } - html.theme--documenter-dark .column.is-offset-half-fullhd { - margin-left: 50%; } - html.theme--documenter-dark .column.is-offset-one-third-fullhd { - margin-left: 33.3333%; } - html.theme--documenter-dark .column.is-offset-one-quarter-fullhd { - margin-left: 25%; } - html.theme--documenter-dark .column.is-offset-one-fifth-fullhd { - margin-left: 20%; } - html.theme--documenter-dark .column.is-offset-two-fifths-fullhd { - margin-left: 40%; } - html.theme--documenter-dark .column.is-offset-three-fifths-fullhd { - margin-left: 60%; } - html.theme--documenter-dark .column.is-offset-four-fifths-fullhd { - margin-left: 80%; } - html.theme--documenter-dark .column.is-0-fullhd { - flex: none; - width: 0%; } - html.theme--documenter-dark .column.is-offset-0-fullhd { - margin-left: 0%; } - html.theme--documenter-dark .column.is-1-fullhd { - flex: none; - width: 8.3333333333%; } - html.theme--documenter-dark .column.is-offset-1-fullhd { - margin-left: 8.3333333333%; } - html.theme--documenter-dark .column.is-2-fullhd { - flex: none; - width: 16.6666666667%; } - html.theme--documenter-dark .column.is-offset-2-fullhd { - margin-left: 16.6666666667%; } - html.theme--documenter-dark .column.is-3-fullhd { - flex: none; - width: 25%; } - html.theme--documenter-dark .column.is-offset-3-fullhd { - margin-left: 25%; } - html.theme--documenter-dark .column.is-4-fullhd { - flex: none; - width: 33.3333333333%; } - html.theme--documenter-dark .column.is-offset-4-fullhd { - margin-left: 33.3333333333%; } - html.theme--documenter-dark .column.is-5-fullhd { - flex: none; - width: 41.6666666667%; } - html.theme--documenter-dark .column.is-offset-5-fullhd { - margin-left: 41.6666666667%; } - html.theme--documenter-dark .column.is-6-fullhd { - flex: none; - width: 50%; } - html.theme--documenter-dark .column.is-offset-6-fullhd { - margin-left: 50%; } - html.theme--documenter-dark .column.is-7-fullhd { - flex: none; - width: 58.3333333333%; } - html.theme--documenter-dark .column.is-offset-7-fullhd { - margin-left: 58.3333333333%; } - html.theme--documenter-dark .column.is-8-fullhd { - flex: none; - width: 66.6666666667%; } - html.theme--documenter-dark .column.is-offset-8-fullhd { - margin-left: 66.6666666667%; } - html.theme--documenter-dark .column.is-9-fullhd { - flex: none; - width: 75%; } - html.theme--documenter-dark .column.is-offset-9-fullhd { - margin-left: 75%; } - html.theme--documenter-dark .column.is-10-fullhd { - flex: none; - width: 83.3333333333%; } - html.theme--documenter-dark .column.is-offset-10-fullhd { - margin-left: 83.3333333333%; } - html.theme--documenter-dark .column.is-11-fullhd { - flex: none; - width: 91.6666666667%; } - html.theme--documenter-dark .column.is-offset-11-fullhd { - margin-left: 91.6666666667%; } - html.theme--documenter-dark .column.is-12-fullhd { - flex: none; - width: 100%; } - html.theme--documenter-dark .column.is-offset-12-fullhd { - margin-left: 100%; } } - html.theme--documenter-dark .columns { - margin-left: -0.75rem; - margin-right: -0.75rem; - margin-top: -0.75rem; } - html.theme--documenter-dark .columns:last-child { - margin-bottom: -0.75rem; } - html.theme--documenter-dark .columns:not(:last-child) { - margin-bottom: calc(1.5rem - 0.75rem); } - html.theme--documenter-dark .columns.is-centered { - justify-content: center; } - html.theme--documenter-dark .columns.is-gapless { - margin-left: 0; - margin-right: 0; - margin-top: 0; } - html.theme--documenter-dark .columns.is-gapless > .column { - margin: 0; - padding: 0 !important; } - html.theme--documenter-dark .columns.is-gapless:not(:last-child) { - margin-bottom: 1.5rem; } - html.theme--documenter-dark .columns.is-gapless:last-child { - margin-bottom: 0; } - html.theme--documenter-dark .columns.is-mobile { - display: flex; } - html.theme--documenter-dark .columns.is-multiline { - flex-wrap: wrap; } - html.theme--documenter-dark .columns.is-vcentered { - align-items: center; } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .columns:not(.is-desktop) { - display: flex; } } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .columns.is-desktop { - display: flex; } } - html.theme--documenter-dark .columns.is-variable { - --columnGap: 0.75rem; - margin-left: calc(-1 * var(--columnGap)); - margin-right: calc(-1 * var(--columnGap)); } - html.theme--documenter-dark .columns.is-variable .column { - padding-left: var(--columnGap); - padding-right: var(--columnGap); } - html.theme--documenter-dark .columns.is-variable.is-0 { - --columnGap: 0rem; } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .columns.is-variable.is-0-mobile { - --columnGap: 0rem; } } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .columns.is-variable.is-0-tablet { - --columnGap: 0rem; } } - @media screen and (min-width: 769px) and (max-width: 1055px) { - html.theme--documenter-dark .columns.is-variable.is-0-tablet-only { - --columnGap: 0rem; } } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .columns.is-variable.is-0-touch { - --columnGap: 0rem; } } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .columns.is-variable.is-0-desktop { - --columnGap: 0rem; } } - @media screen and (min-width: 1056px) and (max-width: 1215px) { - html.theme--documenter-dark .columns.is-variable.is-0-desktop-only { - --columnGap: 0rem; } } - @media screen and (min-width: 1216px) { - html.theme--documenter-dark .columns.is-variable.is-0-widescreen { - --columnGap: 0rem; } } - @media screen and (min-width: 1216px) and (max-width: 1407px) { - html.theme--documenter-dark .columns.is-variable.is-0-widescreen-only { - --columnGap: 0rem; } } - @media screen and (min-width: 1408px) { - html.theme--documenter-dark .columns.is-variable.is-0-fullhd { - --columnGap: 0rem; } } - html.theme--documenter-dark .columns.is-variable.is-1 { - --columnGap: 0.25rem; } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .columns.is-variable.is-1-mobile { - --columnGap: 0.25rem; } } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .columns.is-variable.is-1-tablet { - --columnGap: 0.25rem; } } - @media screen and (min-width: 769px) and (max-width: 1055px) { - html.theme--documenter-dark .columns.is-variable.is-1-tablet-only { - --columnGap: 0.25rem; } } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .columns.is-variable.is-1-touch { - --columnGap: 0.25rem; } } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .columns.is-variable.is-1-desktop { - --columnGap: 0.25rem; } } - @media screen and (min-width: 1056px) and (max-width: 1215px) { - html.theme--documenter-dark .columns.is-variable.is-1-desktop-only { - --columnGap: 0.25rem; } } - @media screen and (min-width: 1216px) { - html.theme--documenter-dark .columns.is-variable.is-1-widescreen { - --columnGap: 0.25rem; } } - @media screen and (min-width: 1216px) and (max-width: 1407px) { - html.theme--documenter-dark .columns.is-variable.is-1-widescreen-only { - --columnGap: 0.25rem; } } - @media screen and (min-width: 1408px) { - html.theme--documenter-dark .columns.is-variable.is-1-fullhd { - --columnGap: 0.25rem; } } - html.theme--documenter-dark .columns.is-variable.is-2 { - --columnGap: 0.5rem; } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .columns.is-variable.is-2-mobile { - --columnGap: 0.5rem; } } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .columns.is-variable.is-2-tablet { - --columnGap: 0.5rem; } } - @media screen and (min-width: 769px) and (max-width: 1055px) { - html.theme--documenter-dark .columns.is-variable.is-2-tablet-only { - --columnGap: 0.5rem; } } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .columns.is-variable.is-2-touch { - --columnGap: 0.5rem; } } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .columns.is-variable.is-2-desktop { - --columnGap: 0.5rem; } } - @media screen and (min-width: 1056px) and (max-width: 1215px) { - html.theme--documenter-dark .columns.is-variable.is-2-desktop-only { - --columnGap: 0.5rem; } } - @media screen and (min-width: 1216px) { - html.theme--documenter-dark .columns.is-variable.is-2-widescreen { - --columnGap: 0.5rem; } } - @media screen and (min-width: 1216px) and (max-width: 1407px) { - html.theme--documenter-dark .columns.is-variable.is-2-widescreen-only { - --columnGap: 0.5rem; } } - @media screen and (min-width: 1408px) { - html.theme--documenter-dark .columns.is-variable.is-2-fullhd { - --columnGap: 0.5rem; } } - html.theme--documenter-dark .columns.is-variable.is-3 { - --columnGap: 0.75rem; } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .columns.is-variable.is-3-mobile { - --columnGap: 0.75rem; } } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .columns.is-variable.is-3-tablet { - --columnGap: 0.75rem; } } - @media screen and (min-width: 769px) and (max-width: 1055px) { - html.theme--documenter-dark .columns.is-variable.is-3-tablet-only { - --columnGap: 0.75rem; } } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .columns.is-variable.is-3-touch { - --columnGap: 0.75rem; } } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .columns.is-variable.is-3-desktop { - --columnGap: 0.75rem; } } - @media screen and (min-width: 1056px) and (max-width: 1215px) { - html.theme--documenter-dark .columns.is-variable.is-3-desktop-only { - --columnGap: 0.75rem; } } - @media screen and (min-width: 1216px) { - html.theme--documenter-dark .columns.is-variable.is-3-widescreen { - --columnGap: 0.75rem; } } - @media screen and (min-width: 1216px) and (max-width: 1407px) { - html.theme--documenter-dark .columns.is-variable.is-3-widescreen-only { - --columnGap: 0.75rem; } } - @media screen and (min-width: 1408px) { - html.theme--documenter-dark .columns.is-variable.is-3-fullhd { - --columnGap: 0.75rem; } } - html.theme--documenter-dark .columns.is-variable.is-4 { - --columnGap: 1rem; } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .columns.is-variable.is-4-mobile { - --columnGap: 1rem; } } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .columns.is-variable.is-4-tablet { - --columnGap: 1rem; } } - @media screen and (min-width: 769px) and (max-width: 1055px) { - html.theme--documenter-dark .columns.is-variable.is-4-tablet-only { - --columnGap: 1rem; } } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .columns.is-variable.is-4-touch { - --columnGap: 1rem; } } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .columns.is-variable.is-4-desktop { - --columnGap: 1rem; } } - @media screen and (min-width: 1056px) and (max-width: 1215px) { - html.theme--documenter-dark .columns.is-variable.is-4-desktop-only { - --columnGap: 1rem; } } - @media screen and (min-width: 1216px) { - html.theme--documenter-dark .columns.is-variable.is-4-widescreen { - --columnGap: 1rem; } } - @media screen and (min-width: 1216px) and (max-width: 1407px) { - html.theme--documenter-dark .columns.is-variable.is-4-widescreen-only { - --columnGap: 1rem; } } - @media screen and (min-width: 1408px) { - html.theme--documenter-dark .columns.is-variable.is-4-fullhd { - --columnGap: 1rem; } } - html.theme--documenter-dark .columns.is-variable.is-5 { - --columnGap: 1.25rem; } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .columns.is-variable.is-5-mobile { - --columnGap: 1.25rem; } } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .columns.is-variable.is-5-tablet { - --columnGap: 1.25rem; } } - @media screen and (min-width: 769px) and (max-width: 1055px) { - html.theme--documenter-dark .columns.is-variable.is-5-tablet-only { - --columnGap: 1.25rem; } } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .columns.is-variable.is-5-touch { - --columnGap: 1.25rem; } } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .columns.is-variable.is-5-desktop { - --columnGap: 1.25rem; } } - @media screen and (min-width: 1056px) and (max-width: 1215px) { - html.theme--documenter-dark .columns.is-variable.is-5-desktop-only { - --columnGap: 1.25rem; } } - @media screen and (min-width: 1216px) { - html.theme--documenter-dark .columns.is-variable.is-5-widescreen { - --columnGap: 1.25rem; } } - @media screen and (min-width: 1216px) and (max-width: 1407px) { - html.theme--documenter-dark .columns.is-variable.is-5-widescreen-only { - --columnGap: 1.25rem; } } - @media screen and (min-width: 1408px) { - html.theme--documenter-dark .columns.is-variable.is-5-fullhd { - --columnGap: 1.25rem; } } - html.theme--documenter-dark .columns.is-variable.is-6 { - --columnGap: 1.5rem; } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .columns.is-variable.is-6-mobile { - --columnGap: 1.5rem; } } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .columns.is-variable.is-6-tablet { - --columnGap: 1.5rem; } } - @media screen and (min-width: 769px) and (max-width: 1055px) { - html.theme--documenter-dark .columns.is-variable.is-6-tablet-only { - --columnGap: 1.5rem; } } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .columns.is-variable.is-6-touch { - --columnGap: 1.5rem; } } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .columns.is-variable.is-6-desktop { - --columnGap: 1.5rem; } } - @media screen and (min-width: 1056px) and (max-width: 1215px) { - html.theme--documenter-dark .columns.is-variable.is-6-desktop-only { - --columnGap: 1.5rem; } } - @media screen and (min-width: 1216px) { - html.theme--documenter-dark .columns.is-variable.is-6-widescreen { - --columnGap: 1.5rem; } } - @media screen and (min-width: 1216px) and (max-width: 1407px) { - html.theme--documenter-dark .columns.is-variable.is-6-widescreen-only { - --columnGap: 1.5rem; } } - @media screen and (min-width: 1408px) { - html.theme--documenter-dark .columns.is-variable.is-6-fullhd { - --columnGap: 1.5rem; } } - html.theme--documenter-dark .columns.is-variable.is-7 { - --columnGap: 1.75rem; } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .columns.is-variable.is-7-mobile { - --columnGap: 1.75rem; } } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .columns.is-variable.is-7-tablet { - --columnGap: 1.75rem; } } - @media screen and (min-width: 769px) and (max-width: 1055px) { - html.theme--documenter-dark .columns.is-variable.is-7-tablet-only { - --columnGap: 1.75rem; } } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .columns.is-variable.is-7-touch { - --columnGap: 1.75rem; } } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .columns.is-variable.is-7-desktop { - --columnGap: 1.75rem; } } - @media screen and (min-width: 1056px) and (max-width: 1215px) { - html.theme--documenter-dark .columns.is-variable.is-7-desktop-only { - --columnGap: 1.75rem; } } - @media screen and (min-width: 1216px) { - html.theme--documenter-dark .columns.is-variable.is-7-widescreen { - --columnGap: 1.75rem; } } - @media screen and (min-width: 1216px) and (max-width: 1407px) { - html.theme--documenter-dark .columns.is-variable.is-7-widescreen-only { - --columnGap: 1.75rem; } } - @media screen and (min-width: 1408px) { - html.theme--documenter-dark .columns.is-variable.is-7-fullhd { - --columnGap: 1.75rem; } } - html.theme--documenter-dark .columns.is-variable.is-8 { - --columnGap: 2rem; } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .columns.is-variable.is-8-mobile { - --columnGap: 2rem; } } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .columns.is-variable.is-8-tablet { - --columnGap: 2rem; } } - @media screen and (min-width: 769px) and (max-width: 1055px) { - html.theme--documenter-dark .columns.is-variable.is-8-tablet-only { - --columnGap: 2rem; } } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .columns.is-variable.is-8-touch { - --columnGap: 2rem; } } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .columns.is-variable.is-8-desktop { - --columnGap: 2rem; } } - @media screen and (min-width: 1056px) and (max-width: 1215px) { - html.theme--documenter-dark .columns.is-variable.is-8-desktop-only { - --columnGap: 2rem; } } - @media screen and (min-width: 1216px) { - html.theme--documenter-dark .columns.is-variable.is-8-widescreen { - --columnGap: 2rem; } } - @media screen and (min-width: 1216px) and (max-width: 1407px) { - html.theme--documenter-dark .columns.is-variable.is-8-widescreen-only { - --columnGap: 2rem; } } - @media screen and (min-width: 1408px) { - html.theme--documenter-dark .columns.is-variable.is-8-fullhd { - --columnGap: 2rem; } } - html.theme--documenter-dark .tile { - align-items: stretch; - display: block; - flex-basis: 0; - flex-grow: 1; - flex-shrink: 1; - min-height: min-content; } - html.theme--documenter-dark .tile.is-ancestor { - margin-left: -0.75rem; - margin-right: -0.75rem; - margin-top: -0.75rem; } - html.theme--documenter-dark .tile.is-ancestor:last-child { - margin-bottom: -0.75rem; } - html.theme--documenter-dark .tile.is-ancestor:not(:last-child) { - margin-bottom: 0.75rem; } - html.theme--documenter-dark .tile.is-child { - margin: 0 !important; } - html.theme--documenter-dark .tile.is-parent { - padding: 0.75rem; } - html.theme--documenter-dark .tile.is-vertical { - flex-direction: column; } - html.theme--documenter-dark .tile.is-vertical > .tile.is-child:not(:last-child) { - margin-bottom: 1.5rem !important; } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .tile:not(.is-child) { - display: flex; } - html.theme--documenter-dark .tile.is-1 { - flex: none; - width: 8.3333333333%; } - html.theme--documenter-dark .tile.is-2 { - flex: none; - width: 16.6666666667%; } - html.theme--documenter-dark .tile.is-3 { - flex: none; - width: 25%; } - html.theme--documenter-dark .tile.is-4 { - flex: none; - width: 33.3333333333%; } - html.theme--documenter-dark .tile.is-5 { - flex: none; - width: 41.6666666667%; } - html.theme--documenter-dark .tile.is-6 { - flex: none; - width: 50%; } - html.theme--documenter-dark .tile.is-7 { - flex: none; - width: 58.3333333333%; } - html.theme--documenter-dark .tile.is-8 { - flex: none; - width: 66.6666666667%; } - html.theme--documenter-dark .tile.is-9 { - flex: none; - width: 75%; } - html.theme--documenter-dark .tile.is-10 { - flex: none; - width: 83.3333333333%; } - html.theme--documenter-dark .tile.is-11 { - flex: none; - width: 91.6666666667%; } - html.theme--documenter-dark .tile.is-12 { - flex: none; - width: 100%; } } - html.theme--documenter-dark .hero { - align-items: stretch; - display: flex; - flex-direction: column; - justify-content: space-between; } - html.theme--documenter-dark .hero .navbar { - background: none; } - html.theme--documenter-dark .hero .tabs ul { - border-bottom: none; } - html.theme--documenter-dark .hero.is-white { - background-color: white; - color: #0a0a0a; } - html.theme--documenter-dark .hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - html.theme--documenter-dark .hero.is-white strong { - color: inherit; } - html.theme--documenter-dark .hero.is-white .title { - color: #0a0a0a; } - html.theme--documenter-dark .hero.is-white .subtitle { - color: rgba(10, 10, 10, 0.9); } - html.theme--documenter-dark .hero.is-white .subtitle a:not(.button), - html.theme--documenter-dark .hero.is-white .subtitle strong { - color: #0a0a0a; } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .hero.is-white .navbar-menu { - background-color: white; } } - html.theme--documenter-dark .hero.is-white .navbar-item, - html.theme--documenter-dark .hero.is-white .navbar-link { - color: rgba(10, 10, 10, 0.7); } - html.theme--documenter-dark .hero.is-white a.navbar-item:hover, html.theme--documenter-dark .hero.is-white a.navbar-item.is-active, - html.theme--documenter-dark .hero.is-white .navbar-link:hover, - html.theme--documenter-dark .hero.is-white .navbar-link.is-active { - background-color: #f2f2f2; - color: #0a0a0a; } - html.theme--documenter-dark .hero.is-white .tabs a { - color: #0a0a0a; - opacity: 0.9; } - html.theme--documenter-dark .hero.is-white .tabs a:hover { - opacity: 1; } - html.theme--documenter-dark .hero.is-white .tabs li.is-active a { - opacity: 1; } - html.theme--documenter-dark .hero.is-white .tabs.is-boxed a, html.theme--documenter-dark .hero.is-white .tabs.is-toggle a { - color: #0a0a0a; } - html.theme--documenter-dark .hero.is-white .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-white .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - html.theme--documenter-dark .hero.is-white .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-white .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-white .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-white .tabs.is-toggle li.is-active a:hover { - background-color: #0a0a0a; - border-color: #0a0a0a; - color: white; } - html.theme--documenter-dark .hero.is-white.is-bold { - background-image: linear-gradient(141deg, #e8e3e4 0%, white 71%, white 100%); } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .hero.is-white.is-bold .navbar-menu { - background-image: linear-gradient(141deg, #e8e3e4 0%, white 71%, white 100%); } } - html.theme--documenter-dark .hero.is-black { - background-color: #0a0a0a; - color: white; } - html.theme--documenter-dark .hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - html.theme--documenter-dark .hero.is-black strong { - color: inherit; } - html.theme--documenter-dark .hero.is-black .title { - color: white; } - html.theme--documenter-dark .hero.is-black .subtitle { - color: rgba(255, 255, 255, 0.9); } - html.theme--documenter-dark .hero.is-black .subtitle a:not(.button), - html.theme--documenter-dark .hero.is-black .subtitle strong { - color: white; } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .hero.is-black .navbar-menu { - background-color: #0a0a0a; } } - html.theme--documenter-dark .hero.is-black .navbar-item, - html.theme--documenter-dark .hero.is-black .navbar-link { - color: rgba(255, 255, 255, 0.7); } - html.theme--documenter-dark .hero.is-black a.navbar-item:hover, html.theme--documenter-dark .hero.is-black a.navbar-item.is-active, - html.theme--documenter-dark .hero.is-black .navbar-link:hover, - html.theme--documenter-dark .hero.is-black .navbar-link.is-active { - background-color: black; - color: white; } - html.theme--documenter-dark .hero.is-black .tabs a { - color: white; - opacity: 0.9; } - html.theme--documenter-dark .hero.is-black .tabs a:hover { - opacity: 1; } - html.theme--documenter-dark .hero.is-black .tabs li.is-active a { - opacity: 1; } - html.theme--documenter-dark .hero.is-black .tabs.is-boxed a, html.theme--documenter-dark .hero.is-black .tabs.is-toggle a { - color: white; } - html.theme--documenter-dark .hero.is-black .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-black .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - html.theme--documenter-dark .hero.is-black .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-black .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-black .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-black .tabs.is-toggle li.is-active a:hover { - background-color: white; - border-color: white; - color: #0a0a0a; } - html.theme--documenter-dark .hero.is-black.is-bold { - background-image: linear-gradient(141deg, black 0%, #0a0a0a 71%, #181616 100%); } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .hero.is-black.is-bold .navbar-menu { - background-image: linear-gradient(141deg, black 0%, #0a0a0a 71%, #181616 100%); } } - html.theme--documenter-dark .hero.is-light { - background-color: #ecf0f1; - color: #282f2f; } - html.theme--documenter-dark .hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - html.theme--documenter-dark .hero.is-light strong { - color: inherit; } - html.theme--documenter-dark .hero.is-light .title { - color: #282f2f; } - html.theme--documenter-dark .hero.is-light .subtitle { - color: rgba(40, 47, 47, 0.9); } - html.theme--documenter-dark .hero.is-light .subtitle a:not(.button), - html.theme--documenter-dark .hero.is-light .subtitle strong { - color: #282f2f; } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .hero.is-light .navbar-menu { - background-color: #ecf0f1; } } - html.theme--documenter-dark .hero.is-light .navbar-item, - html.theme--documenter-dark .hero.is-light .navbar-link { - color: rgba(40, 47, 47, 0.7); } - html.theme--documenter-dark .hero.is-light a.navbar-item:hover, html.theme--documenter-dark .hero.is-light a.navbar-item.is-active, - html.theme--documenter-dark .hero.is-light .navbar-link:hover, - html.theme--documenter-dark .hero.is-light .navbar-link.is-active { - background-color: #dde4e6; - color: #282f2f; } - html.theme--documenter-dark .hero.is-light .tabs a { - color: #282f2f; - opacity: 0.9; } - html.theme--documenter-dark .hero.is-light .tabs a:hover { - opacity: 1; } - html.theme--documenter-dark .hero.is-light .tabs li.is-active a { - opacity: 1; } - html.theme--documenter-dark .hero.is-light .tabs.is-boxed a, html.theme--documenter-dark .hero.is-light .tabs.is-toggle a { - color: #282f2f; } - html.theme--documenter-dark .hero.is-light .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-light .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - html.theme--documenter-dark .hero.is-light .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-light .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-light .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-light .tabs.is-toggle li.is-active a:hover { - background-color: #282f2f; - border-color: #282f2f; - color: #ecf0f1; } - html.theme--documenter-dark .hero.is-light.is-bold { - background-image: linear-gradient(141deg, #cadfe0 0%, #ecf0f1 71%, #fafbfc 100%); } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .hero.is-light.is-bold .navbar-menu { - background-image: linear-gradient(141deg, #cadfe0 0%, #ecf0f1 71%, #fafbfc 100%); } } - html.theme--documenter-dark .hero.is-dark, html.theme--documenter-dark .content kbd.hero { - background-color: #282f2f; - color: #ecf0f1; } - html.theme--documenter-dark .hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), html.theme--documenter-dark .content kbd.hero a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - html.theme--documenter-dark .hero.is-dark strong, - html.theme--documenter-dark .content kbd.hero strong { - color: inherit; } - html.theme--documenter-dark .hero.is-dark .title, html.theme--documenter-dark .content kbd.hero .title { - color: #ecf0f1; } - html.theme--documenter-dark .hero.is-dark .subtitle, html.theme--documenter-dark .content kbd.hero .subtitle { - color: rgba(236, 240, 241, 0.9); } - html.theme--documenter-dark .hero.is-dark .subtitle a:not(.button), html.theme--documenter-dark .content kbd.hero .subtitle a:not(.button), - html.theme--documenter-dark .hero.is-dark .subtitle strong, - html.theme--documenter-dark .content kbd.hero .subtitle strong { - color: #ecf0f1; } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .hero.is-dark .navbar-menu, html.theme--documenter-dark .content kbd.hero .navbar-menu { - background-color: #282f2f; } } - html.theme--documenter-dark .hero.is-dark .navbar-item, html.theme--documenter-dark .content kbd.hero .navbar-item, - html.theme--documenter-dark .hero.is-dark .navbar-link, - html.theme--documenter-dark .content kbd.hero .navbar-link { - color: rgba(236, 240, 241, 0.7); } - html.theme--documenter-dark .hero.is-dark a.navbar-item:hover, html.theme--documenter-dark .content kbd.hero a.navbar-item:hover, html.theme--documenter-dark .hero.is-dark a.navbar-item.is-active, html.theme--documenter-dark .content kbd.hero a.navbar-item.is-active, - html.theme--documenter-dark .hero.is-dark .navbar-link:hover, - html.theme--documenter-dark .content kbd.hero .navbar-link:hover, - html.theme--documenter-dark .hero.is-dark .navbar-link.is-active, - html.theme--documenter-dark .content kbd.hero .navbar-link.is-active { - background-color: #1d2122; - color: #ecf0f1; } - html.theme--documenter-dark .hero.is-dark .tabs a, html.theme--documenter-dark .content kbd.hero .tabs a { - color: #ecf0f1; - opacity: 0.9; } - html.theme--documenter-dark .hero.is-dark .tabs a:hover, html.theme--documenter-dark .content kbd.hero .tabs a:hover { - opacity: 1; } - html.theme--documenter-dark .hero.is-dark .tabs li.is-active a, html.theme--documenter-dark .content kbd.hero .tabs li.is-active a { - opacity: 1; } - html.theme--documenter-dark .hero.is-dark .tabs.is-boxed a, html.theme--documenter-dark .content kbd.hero .tabs.is-boxed a, html.theme--documenter-dark .hero.is-dark .tabs.is-toggle a, html.theme--documenter-dark .content kbd.hero .tabs.is-toggle a { - color: #ecf0f1; } - html.theme--documenter-dark .hero.is-dark .tabs.is-boxed a:hover, html.theme--documenter-dark .content kbd.hero .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-dark .tabs.is-toggle a:hover, html.theme--documenter-dark .content kbd.hero .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - html.theme--documenter-dark .hero.is-dark .tabs.is-boxed li.is-active a, html.theme--documenter-dark .content kbd.hero .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-dark .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-dark .tabs.is-toggle li.is-active a, html.theme--documenter-dark .content kbd.hero .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-dark .tabs.is-toggle li.is-active a:hover { - background-color: #ecf0f1; - border-color: #ecf0f1; - color: #282f2f; } - html.theme--documenter-dark .hero.is-dark.is-bold, html.theme--documenter-dark .content kbd.hero.is-bold { - background-image: linear-gradient(141deg, #0f1615 0%, #282f2f 71%, #313c40 100%); } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .hero.is-dark.is-bold .navbar-menu, html.theme--documenter-dark .content kbd.hero.is-bold .navbar-menu { - background-image: linear-gradient(141deg, #0f1615 0%, #282f2f 71%, #313c40 100%); } } - html.theme--documenter-dark .hero.is-primary, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink { - background-color: #375a7f; - color: #fff; } - html.theme--documenter-dark .hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - html.theme--documenter-dark .hero.is-primary strong, - html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink strong { - color: inherit; } - html.theme--documenter-dark .hero.is-primary .title, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .title { - color: #fff; } - html.theme--documenter-dark .hero.is-primary .subtitle, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .subtitle { - color: rgba(255, 255, 255, 0.9); } - html.theme--documenter-dark .hero.is-primary .subtitle a:not(.button), html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .subtitle a:not(.button), - html.theme--documenter-dark .hero.is-primary .subtitle strong, - html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .subtitle strong { - color: #fff; } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .hero.is-primary .navbar-menu, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .navbar-menu { - background-color: #375a7f; } } - html.theme--documenter-dark .hero.is-primary .navbar-item, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .navbar-item, - html.theme--documenter-dark .hero.is-primary .navbar-link, - html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .navbar-link { - color: rgba(255, 255, 255, 0.7); } - html.theme--documenter-dark .hero.is-primary a.navbar-item:hover, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink a.navbar-item:hover, html.theme--documenter-dark .hero.is-primary a.navbar-item.is-active, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink a.navbar-item.is-active, - html.theme--documenter-dark .hero.is-primary .navbar-link:hover, - html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .navbar-link:hover, - html.theme--documenter-dark .hero.is-primary .navbar-link.is-active, - html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .navbar-link.is-active { - background-color: #2f4d6d; - color: #fff; } - html.theme--documenter-dark .hero.is-primary .tabs a, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .tabs a { - color: #fff; - opacity: 0.9; } - html.theme--documenter-dark .hero.is-primary .tabs a:hover, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .tabs a:hover { - opacity: 1; } - html.theme--documenter-dark .hero.is-primary .tabs li.is-active a, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .tabs li.is-active a { - opacity: 1; } - html.theme--documenter-dark .hero.is-primary .tabs.is-boxed a, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .tabs.is-boxed a, html.theme--documenter-dark .hero.is-primary .tabs.is-toggle a, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .tabs.is-toggle a { - color: #fff; } - html.theme--documenter-dark .hero.is-primary .tabs.is-boxed a:hover, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-primary .tabs.is-toggle a:hover, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - html.theme--documenter-dark .hero.is-primary .tabs.is-boxed li.is-active a, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-primary .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-primary .tabs.is-toggle li.is-active a, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-primary .tabs.is-toggle li.is-active a:hover { - background-color: #fff; - border-color: #fff; - color: #375a7f; } - html.theme--documenter-dark .hero.is-primary.is-bold, html.theme--documenter-dark .docstring > section > a.hero.is-bold.docs-sourcelink { - background-image: linear-gradient(141deg, #214b62 0%, #375a7f 71%, #3a5796 100%); } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .hero.is-primary.is-bold .navbar-menu, html.theme--documenter-dark .docstring > section > a.hero.is-bold.docs-sourcelink .navbar-menu { - background-image: linear-gradient(141deg, #214b62 0%, #375a7f 71%, #3a5796 100%); } } - html.theme--documenter-dark .hero.is-link { - background-color: #1abc9c; - color: #fff; } - html.theme--documenter-dark .hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - html.theme--documenter-dark .hero.is-link strong { - color: inherit; } - html.theme--documenter-dark .hero.is-link .title { - color: #fff; } - html.theme--documenter-dark .hero.is-link .subtitle { - color: rgba(255, 255, 255, 0.9); } - html.theme--documenter-dark .hero.is-link .subtitle a:not(.button), - html.theme--documenter-dark .hero.is-link .subtitle strong { - color: #fff; } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .hero.is-link .navbar-menu { - background-color: #1abc9c; } } - html.theme--documenter-dark .hero.is-link .navbar-item, - html.theme--documenter-dark .hero.is-link .navbar-link { - color: rgba(255, 255, 255, 0.7); } - html.theme--documenter-dark .hero.is-link a.navbar-item:hover, html.theme--documenter-dark .hero.is-link a.navbar-item.is-active, - html.theme--documenter-dark .hero.is-link .navbar-link:hover, - html.theme--documenter-dark .hero.is-link .navbar-link.is-active { - background-color: #17a689; - color: #fff; } - html.theme--documenter-dark .hero.is-link .tabs a { - color: #fff; - opacity: 0.9; } - html.theme--documenter-dark .hero.is-link .tabs a:hover { - opacity: 1; } - html.theme--documenter-dark .hero.is-link .tabs li.is-active a { - opacity: 1; } - html.theme--documenter-dark .hero.is-link .tabs.is-boxed a, html.theme--documenter-dark .hero.is-link .tabs.is-toggle a { - color: #fff; } - html.theme--documenter-dark .hero.is-link .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-link .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - html.theme--documenter-dark .hero.is-link .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-link .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-link .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-link .tabs.is-toggle li.is-active a:hover { - background-color: #fff; - border-color: #fff; - color: #1abc9c; } - html.theme--documenter-dark .hero.is-link.is-bold { - background-image: linear-gradient(141deg, #0c9764 0%, #1abc9c 71%, #17d8d2 100%); } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .hero.is-link.is-bold .navbar-menu { - background-image: linear-gradient(141deg, #0c9764 0%, #1abc9c 71%, #17d8d2 100%); } } - html.theme--documenter-dark .hero.is-info { - background-color: #024c7d; - color: #fff; } - html.theme--documenter-dark .hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - html.theme--documenter-dark .hero.is-info strong { - color: inherit; } - html.theme--documenter-dark .hero.is-info .title { - color: #fff; } - html.theme--documenter-dark .hero.is-info .subtitle { - color: rgba(255, 255, 255, 0.9); } - html.theme--documenter-dark .hero.is-info .subtitle a:not(.button), - html.theme--documenter-dark .hero.is-info .subtitle strong { - color: #fff; } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .hero.is-info .navbar-menu { - background-color: #024c7d; } } - html.theme--documenter-dark .hero.is-info .navbar-item, - html.theme--documenter-dark .hero.is-info .navbar-link { - color: rgba(255, 255, 255, 0.7); } - html.theme--documenter-dark .hero.is-info a.navbar-item:hover, html.theme--documenter-dark .hero.is-info a.navbar-item.is-active, - html.theme--documenter-dark .hero.is-info .navbar-link:hover, - html.theme--documenter-dark .hero.is-info .navbar-link.is-active { - background-color: #023d64; - color: #fff; } - html.theme--documenter-dark .hero.is-info .tabs a { - color: #fff; - opacity: 0.9; } - html.theme--documenter-dark .hero.is-info .tabs a:hover { - opacity: 1; } - html.theme--documenter-dark .hero.is-info .tabs li.is-active a { - opacity: 1; } - html.theme--documenter-dark .hero.is-info .tabs.is-boxed a, html.theme--documenter-dark .hero.is-info .tabs.is-toggle a { - color: #fff; } - html.theme--documenter-dark .hero.is-info .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-info .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - html.theme--documenter-dark .hero.is-info .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-info .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-info .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-info .tabs.is-toggle li.is-active a:hover { - background-color: #fff; - border-color: #fff; - color: #024c7d; } - html.theme--documenter-dark .hero.is-info.is-bold { - background-image: linear-gradient(141deg, #003a4c 0%, #024c7d 71%, #004299 100%); } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .hero.is-info.is-bold .navbar-menu { - background-image: linear-gradient(141deg, #003a4c 0%, #024c7d 71%, #004299 100%); } } - html.theme--documenter-dark .hero.is-success { - background-color: #008438; - color: #fff; } - html.theme--documenter-dark .hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - html.theme--documenter-dark .hero.is-success strong { - color: inherit; } - html.theme--documenter-dark .hero.is-success .title { - color: #fff; } - html.theme--documenter-dark .hero.is-success .subtitle { - color: rgba(255, 255, 255, 0.9); } - html.theme--documenter-dark .hero.is-success .subtitle a:not(.button), - html.theme--documenter-dark .hero.is-success .subtitle strong { - color: #fff; } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .hero.is-success .navbar-menu { - background-color: #008438; } } - html.theme--documenter-dark .hero.is-success .navbar-item, - html.theme--documenter-dark .hero.is-success .navbar-link { - color: rgba(255, 255, 255, 0.7); } - html.theme--documenter-dark .hero.is-success a.navbar-item:hover, html.theme--documenter-dark .hero.is-success a.navbar-item.is-active, - html.theme--documenter-dark .hero.is-success .navbar-link:hover, - html.theme--documenter-dark .hero.is-success .navbar-link.is-active { - background-color: #006b2d; - color: #fff; } - html.theme--documenter-dark .hero.is-success .tabs a { - color: #fff; - opacity: 0.9; } - html.theme--documenter-dark .hero.is-success .tabs a:hover { - opacity: 1; } - html.theme--documenter-dark .hero.is-success .tabs li.is-active a { - opacity: 1; } - html.theme--documenter-dark .hero.is-success .tabs.is-boxed a, html.theme--documenter-dark .hero.is-success .tabs.is-toggle a { - color: #fff; } - html.theme--documenter-dark .hero.is-success .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-success .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - html.theme--documenter-dark .hero.is-success .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-success .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-success .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-success .tabs.is-toggle li.is-active a:hover { - background-color: #fff; - border-color: #fff; - color: #008438; } - html.theme--documenter-dark .hero.is-success.is-bold { - background-image: linear-gradient(141deg, #005115 0%, #008438 71%, #009e5d 100%); } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .hero.is-success.is-bold .navbar-menu { - background-image: linear-gradient(141deg, #005115 0%, #008438 71%, #009e5d 100%); } } - html.theme--documenter-dark .hero.is-warning { - background-color: #ad8100; - color: #fff; } - html.theme--documenter-dark .hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - html.theme--documenter-dark .hero.is-warning strong { - color: inherit; } - html.theme--documenter-dark .hero.is-warning .title { - color: #fff; } - html.theme--documenter-dark .hero.is-warning .subtitle { - color: rgba(255, 255, 255, 0.9); } - html.theme--documenter-dark .hero.is-warning .subtitle a:not(.button), - html.theme--documenter-dark .hero.is-warning .subtitle strong { - color: #fff; } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .hero.is-warning .navbar-menu { - background-color: #ad8100; } } - html.theme--documenter-dark .hero.is-warning .navbar-item, - html.theme--documenter-dark .hero.is-warning .navbar-link { - color: rgba(255, 255, 255, 0.7); } - html.theme--documenter-dark .hero.is-warning a.navbar-item:hover, html.theme--documenter-dark .hero.is-warning a.navbar-item.is-active, - html.theme--documenter-dark .hero.is-warning .navbar-link:hover, - html.theme--documenter-dark .hero.is-warning .navbar-link.is-active { - background-color: #946e00; - color: #fff; } - html.theme--documenter-dark .hero.is-warning .tabs a { - color: #fff; - opacity: 0.9; } - html.theme--documenter-dark .hero.is-warning .tabs a:hover { - opacity: 1; } - html.theme--documenter-dark .hero.is-warning .tabs li.is-active a { - opacity: 1; } - html.theme--documenter-dark .hero.is-warning .tabs.is-boxed a, html.theme--documenter-dark .hero.is-warning .tabs.is-toggle a { - color: #fff; } - html.theme--documenter-dark .hero.is-warning .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-warning .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - html.theme--documenter-dark .hero.is-warning .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-warning .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-warning .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-warning .tabs.is-toggle li.is-active a:hover { - background-color: #fff; - border-color: #fff; - color: #ad8100; } - html.theme--documenter-dark .hero.is-warning.is-bold { - background-image: linear-gradient(141deg, #7a4700 0%, #ad8100 71%, #c7b500 100%); } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .hero.is-warning.is-bold .navbar-menu { - background-image: linear-gradient(141deg, #7a4700 0%, #ad8100 71%, #c7b500 100%); } } - html.theme--documenter-dark .hero.is-danger { - background-color: #9e1b0d; - color: #fff; } - html.theme--documenter-dark .hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - html.theme--documenter-dark .hero.is-danger strong { - color: inherit; } - html.theme--documenter-dark .hero.is-danger .title { - color: #fff; } - html.theme--documenter-dark .hero.is-danger .subtitle { - color: rgba(255, 255, 255, 0.9); } - html.theme--documenter-dark .hero.is-danger .subtitle a:not(.button), - html.theme--documenter-dark .hero.is-danger .subtitle strong { - color: #fff; } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .hero.is-danger .navbar-menu { - background-color: #9e1b0d; } } - html.theme--documenter-dark .hero.is-danger .navbar-item, - html.theme--documenter-dark .hero.is-danger .navbar-link { - color: rgba(255, 255, 255, 0.7); } - html.theme--documenter-dark .hero.is-danger a.navbar-item:hover, html.theme--documenter-dark .hero.is-danger a.navbar-item.is-active, - html.theme--documenter-dark .hero.is-danger .navbar-link:hover, - html.theme--documenter-dark .hero.is-danger .navbar-link.is-active { - background-color: #86170b; - color: #fff; } - html.theme--documenter-dark .hero.is-danger .tabs a { - color: #fff; - opacity: 0.9; } - html.theme--documenter-dark .hero.is-danger .tabs a:hover { - opacity: 1; } - html.theme--documenter-dark .hero.is-danger .tabs li.is-active a { - opacity: 1; } - html.theme--documenter-dark .hero.is-danger .tabs.is-boxed a, html.theme--documenter-dark .hero.is-danger .tabs.is-toggle a { - color: #fff; } - html.theme--documenter-dark .hero.is-danger .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-danger .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - html.theme--documenter-dark .hero.is-danger .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-danger .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-danger .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-danger .tabs.is-toggle li.is-active a:hover { - background-color: #fff; - border-color: #fff; - color: #9e1b0d; } - html.theme--documenter-dark .hero.is-danger.is-bold { - background-image: linear-gradient(141deg, #75030b 0%, #9e1b0d 71%, #ba380a 100%); } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .hero.is-danger.is-bold .navbar-menu { - background-image: linear-gradient(141deg, #75030b 0%, #9e1b0d 71%, #ba380a 100%); } } - html.theme--documenter-dark .hero.is-small .hero-body, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.hero .hero-body { - padding-bottom: 1.5rem; - padding-top: 1.5rem; } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .hero.is-medium .hero-body { - padding-bottom: 9rem; - padding-top: 9rem; } } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .hero.is-large .hero-body { - padding-bottom: 18rem; - padding-top: 18rem; } } - html.theme--documenter-dark .hero.is-halfheight .hero-body, html.theme--documenter-dark .hero.is-fullheight .hero-body, html.theme--documenter-dark .hero.is-fullheight-with-navbar .hero-body { - align-items: center; - display: flex; } - html.theme--documenter-dark .hero.is-halfheight .hero-body > .container, html.theme--documenter-dark .hero.is-fullheight .hero-body > .container, html.theme--documenter-dark .hero.is-fullheight-with-navbar .hero-body > .container { - flex-grow: 1; - flex-shrink: 1; } - html.theme--documenter-dark .hero.is-halfheight { - min-height: 50vh; } - html.theme--documenter-dark .hero.is-fullheight { - min-height: 100vh; } - html.theme--documenter-dark .hero-video { - overflow: hidden; } - html.theme--documenter-dark .hero-video video { - left: 50%; - min-height: 100%; - min-width: 100%; - position: absolute; - top: 50%; - transform: translate3d(-50%, -50%, 0); } - html.theme--documenter-dark .hero-video.is-transparent { - opacity: 0.3; } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .hero-video { - display: none; } } - html.theme--documenter-dark .hero-buttons { - margin-top: 1.5rem; } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .hero-buttons .button { - display: flex; } - html.theme--documenter-dark .hero-buttons .button:not(:last-child) { - margin-bottom: 0.75rem; } } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .hero-buttons { - display: flex; - justify-content: center; } - html.theme--documenter-dark .hero-buttons .button:not(:last-child) { - margin-right: 1.5rem; } } - html.theme--documenter-dark .hero-head, - html.theme--documenter-dark .hero-foot { - flex-grow: 0; - flex-shrink: 0; } - html.theme--documenter-dark .hero-body { - flex-grow: 1; - flex-shrink: 0; - padding: 3rem 1.5rem; } - html.theme--documenter-dark .section { - padding: 3rem 1.5rem; } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .section.is-medium { - padding: 9rem 1.5rem; } - html.theme--documenter-dark .section.is-large { - padding: 18rem 1.5rem; } } - html.theme--documenter-dark .footer { - background-color: #282f2f; - padding: 3rem 1.5rem 6rem; } - html.theme--documenter-dark hr { - height: 1px; } - html.theme--documenter-dark h6 { - text-transform: uppercase; - letter-spacing: 0.5px; } - html.theme--documenter-dark .hero { - background-color: #343c3d; } - html.theme--documenter-dark a { - transition: all 200ms ease; } - html.theme--documenter-dark .button { - transition: all 200ms ease; - border-width: 1px; - color: white; } - html.theme--documenter-dark .button.is-active, html.theme--documenter-dark .button.is-focused, html.theme--documenter-dark .button:active, html.theme--documenter-dark .button:focus { - box-shadow: 0 0 0 2px rgba(140, 155, 157, 0.5); } - html.theme--documenter-dark .button.is-white.is-hovered, html.theme--documenter-dark .button.is-white:hover { - background-color: white; } - html.theme--documenter-dark .button.is-white.is-active, html.theme--documenter-dark .button.is-white.is-focused, html.theme--documenter-dark .button.is-white:active, html.theme--documenter-dark .button.is-white:focus { - border-color: white; - box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.5); } - html.theme--documenter-dark .button.is-black.is-hovered, html.theme--documenter-dark .button.is-black:hover { - background-color: #1d1d1d; } - html.theme--documenter-dark .button.is-black.is-active, html.theme--documenter-dark .button.is-black.is-focused, html.theme--documenter-dark .button.is-black:active, html.theme--documenter-dark .button.is-black:focus { - border-color: #0a0a0a; - box-shadow: 0 0 0 2px rgba(10, 10, 10, 0.5); } - html.theme--documenter-dark .button.is-light.is-hovered, html.theme--documenter-dark .button.is-light:hover { - background-color: white; } - html.theme--documenter-dark .button.is-light.is-active, html.theme--documenter-dark .button.is-light.is-focused, html.theme--documenter-dark .button.is-light:active, html.theme--documenter-dark .button.is-light:focus { - border-color: #ecf0f1; - box-shadow: 0 0 0 2px rgba(236, 240, 241, 0.5); } - html.theme--documenter-dark .button.is-dark.is-hovered, html.theme--documenter-dark .content kbd.button.is-hovered, html.theme--documenter-dark .button.is-dark:hover, html.theme--documenter-dark .content kbd.button:hover { - background-color: #3a4344; } - html.theme--documenter-dark .button.is-dark.is-active, html.theme--documenter-dark .content kbd.button.is-active, html.theme--documenter-dark .button.is-dark.is-focused, html.theme--documenter-dark .content kbd.button.is-focused, html.theme--documenter-dark .button.is-dark:active, html.theme--documenter-dark .content kbd.button:active, html.theme--documenter-dark .button.is-dark:focus, html.theme--documenter-dark .content kbd.button:focus { - border-color: #282f2f; - box-shadow: 0 0 0 2px rgba(40, 47, 47, 0.5); } - html.theme--documenter-dark .button.is-primary.is-hovered, html.theme--documenter-dark .docstring > section > a.button.is-hovered.docs-sourcelink, html.theme--documenter-dark .button.is-primary:hover, html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink:hover { - background-color: #436d9a; } - html.theme--documenter-dark .button.is-primary.is-active, html.theme--documenter-dark .docstring > section > a.button.is-active.docs-sourcelink, html.theme--documenter-dark .button.is-primary.is-focused, html.theme--documenter-dark .docstring > section > a.button.is-focused.docs-sourcelink, html.theme--documenter-dark .button.is-primary:active, html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink:active, html.theme--documenter-dark .button.is-primary:focus, html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink:focus { - border-color: #375a7f; - box-shadow: 0 0 0 2px rgba(55, 90, 127, 0.5); } - html.theme--documenter-dark .button.is-link.is-hovered, html.theme--documenter-dark .button.is-link:hover { - background-color: #1fdeb8; } - html.theme--documenter-dark .button.is-link.is-active, html.theme--documenter-dark .button.is-link.is-focused, html.theme--documenter-dark .button.is-link:active, html.theme--documenter-dark .button.is-link:focus { - border-color: #1abc9c; - box-shadow: 0 0 0 2px rgba(26, 188, 156, 0.5); } - html.theme--documenter-dark .button.is-info.is-hovered, html.theme--documenter-dark .button.is-info:hover { - background-color: #0363a3; } - html.theme--documenter-dark .button.is-info.is-active, html.theme--documenter-dark .button.is-info.is-focused, html.theme--documenter-dark .button.is-info:active, html.theme--documenter-dark .button.is-info:focus { - border-color: #024c7d; - box-shadow: 0 0 0 2px rgba(2, 76, 125, 0.5); } - html.theme--documenter-dark .button.is-success.is-hovered, html.theme--documenter-dark .button.is-success:hover { - background-color: #00aa48; } - html.theme--documenter-dark .button.is-success.is-active, html.theme--documenter-dark .button.is-success.is-focused, html.theme--documenter-dark .button.is-success:active, html.theme--documenter-dark .button.is-success:focus { - border-color: #008438; - box-shadow: 0 0 0 2px rgba(0, 132, 56, 0.5); } - html.theme--documenter-dark .button.is-warning.is-hovered, html.theme--documenter-dark .button.is-warning:hover { - background-color: #d39e00; } - html.theme--documenter-dark .button.is-warning.is-active, html.theme--documenter-dark .button.is-warning.is-focused, html.theme--documenter-dark .button.is-warning:active, html.theme--documenter-dark .button.is-warning:focus { - border-color: #ad8100; - box-shadow: 0 0 0 2px rgba(173, 129, 0, 0.5); } - html.theme--documenter-dark .button.is-danger.is-hovered, html.theme--documenter-dark .button.is-danger:hover { - background-color: #c12110; } - html.theme--documenter-dark .button.is-danger.is-active, html.theme--documenter-dark .button.is-danger.is-focused, html.theme--documenter-dark .button.is-danger:active, html.theme--documenter-dark .button.is-danger:focus { - border-color: #9e1b0d; - box-shadow: 0 0 0 2px rgba(158, 27, 13, 0.5); } - html.theme--documenter-dark .label { - color: #dbdee0; } - html.theme--documenter-dark .button, - html.theme--documenter-dark .control.has-icons-left .icon, - html.theme--documenter-dark .control.has-icons-right .icon, - html.theme--documenter-dark .input, - html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input, - html.theme--documenter-dark .pagination-ellipsis, - html.theme--documenter-dark .pagination-link, - html.theme--documenter-dark .pagination-next, - html.theme--documenter-dark .pagination-previous, - html.theme--documenter-dark .select, - html.theme--documenter-dark .select select, - html.theme--documenter-dark .textarea { - height: 2.5em; } - html.theme--documenter-dark .input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input, - html.theme--documenter-dark .textarea { - transition: all 200ms ease; - box-shadow: none; - border-width: 1px; - padding-left: 1em; - padding-right: 1em; } - html.theme--documenter-dark .select:after, - html.theme--documenter-dark .select select { - border-width: 1px; } - html.theme--documenter-dark .control.has-addons .button, - html.theme--documenter-dark .control.has-addons .input, - html.theme--documenter-dark .control.has-addons #documenter .docs-sidebar form.docs-search > input, - html.theme--documenter-dark #documenter .docs-sidebar .control.has-addons form.docs-search > input, - html.theme--documenter-dark .control.has-addons .select { - margin-right: -1px; } - html.theme--documenter-dark .notification { - background-color: #343c3d; } - html.theme--documenter-dark .card { - box-shadow: none; - border: 1px solid #343c3d; - background-color: #282f2f; - border-radius: 0.4em; } - html.theme--documenter-dark .card .card-image img { - border-radius: 0.4em 0.4em 0 0; } - html.theme--documenter-dark .card .card-header { - box-shadow: none; - background-color: rgba(18, 18, 18, 0.2); - border-radius: 0.4em 0.4em 0 0; } - html.theme--documenter-dark .card .card-footer { - background-color: rgba(18, 18, 18, 0.2); } - html.theme--documenter-dark .card .card-footer, - html.theme--documenter-dark .card .card-footer-item { - border-width: 1px; - border-color: #343c3d; } - html.theme--documenter-dark .notification.is-white a:not(.button) { - color: #0a0a0a; - text-decoration: underline; } - html.theme--documenter-dark .notification.is-black a:not(.button) { - color: white; - text-decoration: underline; } - html.theme--documenter-dark .notification.is-light a:not(.button) { - color: #282f2f; - text-decoration: underline; } - html.theme--documenter-dark .notification.is-dark a:not(.button), html.theme--documenter-dark .content kbd.notification a:not(.button) { - color: #ecf0f1; - text-decoration: underline; } - html.theme--documenter-dark .notification.is-primary a:not(.button), html.theme--documenter-dark .docstring > section > a.notification.docs-sourcelink a:not(.button) { - color: #fff; - text-decoration: underline; } - html.theme--documenter-dark .notification.is-link a:not(.button) { - color: #fff; - text-decoration: underline; } - html.theme--documenter-dark .notification.is-info a:not(.button) { - color: #fff; - text-decoration: underline; } - html.theme--documenter-dark .notification.is-success a:not(.button) { - color: #fff; - text-decoration: underline; } - html.theme--documenter-dark .notification.is-warning a:not(.button) { - color: #fff; - text-decoration: underline; } - html.theme--documenter-dark .notification.is-danger a:not(.button) { - color: #fff; - text-decoration: underline; } - html.theme--documenter-dark .tag, html.theme--documenter-dark .content kbd, html.theme--documenter-dark .docstring > section > a.docs-sourcelink { - border-radius: 0.4em; } - html.theme--documenter-dark .menu-list a { - transition: all 300ms ease; } - html.theme--documenter-dark .modal-card-body { - background-color: #282f2f; } - html.theme--documenter-dark .modal-card-foot, - html.theme--documenter-dark .modal-card-head { - border-color: #343c3d; } - html.theme--documenter-dark .message-header { - font-weight: 700; - background-color: #343c3d; - color: white; } - html.theme--documenter-dark .message-body { - border-width: 1px; - border-color: #343c3d; } - html.theme--documenter-dark .navbar { - border-radius: 0.4em; } - html.theme--documenter-dark .navbar.is-transparent { - background: none; } - html.theme--documenter-dark .navbar.is-primary .navbar-dropdown a.navbar-item.is-active, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active { - background-color: #1abc9c; } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .navbar .navbar-menu { - background-color: #375a7f; - border-radius: 0 0 0.4em 0.4em; } } - html.theme--documenter-dark .hero .navbar, - html.theme--documenter-dark body > .navbar { - border-radius: 0; } - html.theme--documenter-dark .pagination-link, - html.theme--documenter-dark .pagination-next, - html.theme--documenter-dark .pagination-previous { - border-width: 1px; } - html.theme--documenter-dark .panel-block, - html.theme--documenter-dark .panel-heading, - html.theme--documenter-dark .panel-tabs { - border-width: 1px; } - html.theme--documenter-dark .panel-block:first-child, - html.theme--documenter-dark .panel-heading:first-child, - html.theme--documenter-dark .panel-tabs:first-child { - border-top-width: 1px; } - html.theme--documenter-dark .panel-heading { - font-weight: 700; } - html.theme--documenter-dark .panel-tabs a { - border-width: 1px; - margin-bottom: -1px; } - html.theme--documenter-dark .panel-tabs a.is-active { - border-bottom-color: #17a689; } - html.theme--documenter-dark .panel-block:hover { - color: #1dd2af; } - html.theme--documenter-dark .panel-block:hover .panel-icon { - color: #1dd2af; } - html.theme--documenter-dark .panel-block.is-active .panel-icon { - color: #17a689; } - html.theme--documenter-dark .tabs a { - border-bottom-width: 1px; - margin-bottom: -1px; } - html.theme--documenter-dark .tabs ul { - border-bottom-width: 1px; } - html.theme--documenter-dark .tabs.is-boxed a { - border-width: 1px; } - html.theme--documenter-dark .tabs.is-boxed li.is-active a { - background-color: #1f2424; } - html.theme--documenter-dark .tabs.is-toggle li a { - border-width: 1px; - margin-bottom: 0; } - html.theme--documenter-dark .tabs.is-toggle li + li { - margin-left: -1px; } - html.theme--documenter-dark .hero.is-white .navbar .navbar-dropdown .navbar-item:hover { - background-color: transparent; } - html.theme--documenter-dark .hero.is-black .navbar .navbar-dropdown .navbar-item:hover { - background-color: transparent; } - html.theme--documenter-dark .hero.is-light .navbar .navbar-dropdown .navbar-item:hover { - background-color: transparent; } - html.theme--documenter-dark .hero.is-dark .navbar .navbar-dropdown .navbar-item:hover, html.theme--documenter-dark .content kbd.hero .navbar .navbar-dropdown .navbar-item:hover { - background-color: transparent; } - html.theme--documenter-dark .hero.is-primary .navbar .navbar-dropdown .navbar-item:hover, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .navbar .navbar-dropdown .navbar-item:hover { - background-color: transparent; } - html.theme--documenter-dark .hero.is-link .navbar .navbar-dropdown .navbar-item:hover { - background-color: transparent; } - html.theme--documenter-dark .hero.is-info .navbar .navbar-dropdown .navbar-item:hover { - background-color: transparent; } - html.theme--documenter-dark .hero.is-success .navbar .navbar-dropdown .navbar-item:hover { - background-color: transparent; } - html.theme--documenter-dark .hero.is-warning .navbar .navbar-dropdown .navbar-item:hover { - background-color: transparent; } - html.theme--documenter-dark .hero.is-danger .navbar .navbar-dropdown .navbar-item:hover { - background-color: transparent; } - html.theme--documenter-dark h1 .docs-heading-anchor, html.theme--documenter-dark h1 .docs-heading-anchor:hover, html.theme--documenter-dark h1 .docs-heading-anchor:visited, html.theme--documenter-dark h2 .docs-heading-anchor, html.theme--documenter-dark h2 .docs-heading-anchor:hover, html.theme--documenter-dark h2 .docs-heading-anchor:visited, html.theme--documenter-dark h3 .docs-heading-anchor, html.theme--documenter-dark h3 .docs-heading-anchor:hover, html.theme--documenter-dark h3 .docs-heading-anchor:visited, html.theme--documenter-dark h4 .docs-heading-anchor, html.theme--documenter-dark h4 .docs-heading-anchor:hover, html.theme--documenter-dark h4 .docs-heading-anchor:visited, html.theme--documenter-dark h5 .docs-heading-anchor, html.theme--documenter-dark h5 .docs-heading-anchor:hover, html.theme--documenter-dark h5 .docs-heading-anchor:visited, html.theme--documenter-dark h6 .docs-heading-anchor, html.theme--documenter-dark h6 .docs-heading-anchor:hover, html.theme--documenter-dark h6 .docs-heading-anchor:visited { - color: #f2f2f2; } - html.theme--documenter-dark h1 .docs-heading-anchor-permalink, html.theme--documenter-dark h2 .docs-heading-anchor-permalink, html.theme--documenter-dark h3 .docs-heading-anchor-permalink, html.theme--documenter-dark h4 .docs-heading-anchor-permalink, html.theme--documenter-dark h5 .docs-heading-anchor-permalink, html.theme--documenter-dark h6 .docs-heading-anchor-permalink { - visibility: hidden; - vertical-align: middle; - margin-left: 0.5em; - font-size: 0.7rem; } - html.theme--documenter-dark h1 .docs-heading-anchor-permalink::before, html.theme--documenter-dark h2 .docs-heading-anchor-permalink::before, html.theme--documenter-dark h3 .docs-heading-anchor-permalink::before, html.theme--documenter-dark h4 .docs-heading-anchor-permalink::before, html.theme--documenter-dark h5 .docs-heading-anchor-permalink::before, html.theme--documenter-dark h6 .docs-heading-anchor-permalink::before { - font-family: "Font Awesome 5 Free"; - font-weight: 900; - content: "\f0c1"; } - html.theme--documenter-dark h1:hover .docs-heading-anchor-permalink, html.theme--documenter-dark h2:hover .docs-heading-anchor-permalink, html.theme--documenter-dark h3:hover .docs-heading-anchor-permalink, html.theme--documenter-dark h4:hover .docs-heading-anchor-permalink, html.theme--documenter-dark h5:hover .docs-heading-anchor-permalink, html.theme--documenter-dark h6:hover .docs-heading-anchor-permalink { - visibility: visible; } - html.theme--documenter-dark .docs-light-only { - display: none !important; } - html.theme--documenter-dark pre { - position: relative; - overflow: hidden; } - html.theme--documenter-dark pre code, html.theme--documenter-dark pre code.hljs { - padding: 0 0.75rem !important; - overflow: auto; - display: block; } - html.theme--documenter-dark pre code:first-of-type, html.theme--documenter-dark pre code.hljs:first-of-type { - padding-top: 0.5rem !important; } - html.theme--documenter-dark pre code:last-of-type, html.theme--documenter-dark pre code.hljs:last-of-type { - padding-bottom: 0.5rem !important; } - html.theme--documenter-dark pre .copy-button { - opacity: 0.2; - transition: opacity 0.2s; - position: absolute; - right: 0em; - top: 0em; - padding: 0.5em; - width: 2.5em; - height: 2.5em; - background: transparent; - border: none; - font-family: "Font Awesome 5 Free"; - color: #fff; - cursor: pointer; - text-align: center; } - html.theme--documenter-dark pre .copy-button:focus, html.theme--documenter-dark pre .copy-button:hover { - opacity: 1; - background: rgba(255, 255, 255, 0.1); - color: #1abc9c; } - html.theme--documenter-dark pre .copy-button.success { - color: #259a12; - opacity: 1; } - html.theme--documenter-dark pre .copy-button.error { - color: #cb3c33; - opacity: 1; } - html.theme--documenter-dark pre:hover .copy-button { - opacity: 1; } - html.theme--documenter-dark .admonition { - background-color: #282f2f; - border-style: solid; - border-width: 1px; - border-color: #5e6d6f; - border-radius: 0.4em; - font-size: 15px; } - html.theme--documenter-dark .admonition strong { - color: currentColor; } - html.theme--documenter-dark .admonition.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.admonition { - font-size: 0.85em; } - html.theme--documenter-dark .admonition.is-medium { - font-size: 1.25rem; } - html.theme--documenter-dark .admonition.is-large { - font-size: 1.5rem; } - html.theme--documenter-dark .admonition.is-default { - background-color: #282f2f; - border-color: #5e6d6f; } - html.theme--documenter-dark .admonition.is-default > .admonition-header { - background-color: #5e6d6f; } - html.theme--documenter-dark .admonition.is-info { - background-color: #282f2f; - border-color: #024c7d; } - html.theme--documenter-dark .admonition.is-info > .admonition-header { - background-color: #024c7d; } - html.theme--documenter-dark .admonition.is-success { - background-color: #282f2f; - border-color: #008438; } - html.theme--documenter-dark .admonition.is-success > .admonition-header { - background-color: #008438; } - html.theme--documenter-dark .admonition.is-warning { - background-color: #282f2f; - border-color: #ad8100; } - html.theme--documenter-dark .admonition.is-warning > .admonition-header { - background-color: #ad8100; } - html.theme--documenter-dark .admonition.is-danger { - background-color: #282f2f; - border-color: #9e1b0d; } - html.theme--documenter-dark .admonition.is-danger > .admonition-header { - background-color: #9e1b0d; } - html.theme--documenter-dark .admonition.is-compat { - background-color: #282f2f; - border-color: #137886; } - html.theme--documenter-dark .admonition.is-compat > .admonition-header { - background-color: #137886; } - html.theme--documenter-dark .admonition-header { - background-color: #5e6d6f; - align-items: center; - font-weight: 700; - justify-content: space-between; - line-height: 1.25; - padding: 0.5rem 0.75rem; - position: relative; } - html.theme--documenter-dark .admonition-header:before { - font-family: "Font Awesome 5 Free"; - font-weight: 900; - margin-right: 0.75rem; - content: "\f06a"; } - html.theme--documenter-dark .admonition-body { - color: #fff; - padding: 0.5rem 0.75rem; } - html.theme--documenter-dark .admonition-body pre { - background-color: #282f2f; } - html.theme--documenter-dark .admonition-body code { - background-color: rgba(255, 255, 255, 0.05); } - html.theme--documenter-dark .docstring { - margin-bottom: 1em; - background-color: transparent; - border: 1px solid #5e6d6f; - box-shadow: none; - max-width: 100%; } - html.theme--documenter-dark .docstring > header { - display: flex; - flex-grow: 1; - align-items: stretch; - padding: 0.5rem 0.75rem; - background-color: #282f2f; - box-shadow: 0 1px 2px rgba(10, 10, 10, 0.1); - box-shadow: none; - border-bottom: 1px solid #5e6d6f; } - html.theme--documenter-dark .docstring > header code { - background-color: transparent; } - html.theme--documenter-dark .docstring > header .docstring-binding { - margin-right: 0.3em; } - html.theme--documenter-dark .docstring > header .docstring-category { - margin-left: 0.3em; } - html.theme--documenter-dark .docstring > section { - position: relative; - padding: 0.75rem 0.75rem; - border-bottom: 1px solid #5e6d6f; } - html.theme--documenter-dark .docstring > section:last-child { - border-bottom: none; } - html.theme--documenter-dark .docstring > section > a.docs-sourcelink { - transition: opacity 0.3s; - opacity: 0; - position: absolute; - right: 0.375rem; - bottom: 0.375rem; } - html.theme--documenter-dark .docstring > section > a.docs-sourcelink:focus { - opacity: 1 !important; } - html.theme--documenter-dark .docstring:hover > section > a.docs-sourcelink { - opacity: 0.2; } - html.theme--documenter-dark .docstring:focus-within > section > a.docs-sourcelink { - opacity: 0.2; } - html.theme--documenter-dark .docstring > section:hover a.docs-sourcelink { - opacity: 1; } - html.theme--documenter-dark .documenter-example-output { - background-color: #1f2424; } - html.theme--documenter-dark .outdated-warning-overlay { - position: fixed; - top: 0; - left: 0; - right: 0; - box-shadow: 0 0 10px rgba(0, 0, 0, 0.3); - z-index: 999; - background-color: #282f2f; - border-bottom: 3px solid #9e1b0d; - padding: 10px 35px; - text-align: center; - font-size: 15px; } - html.theme--documenter-dark .outdated-warning-overlay .outdated-warning-closer { - position: absolute; - top: calc(50% - 10px); - right: 18px; - cursor: pointer; - width: 12px; } - html.theme--documenter-dark .outdated-warning-overlay a { - color: #1abc9c; } - html.theme--documenter-dark .outdated-warning-overlay a:hover { - color: #1dd2af; } - html.theme--documenter-dark .content pre { - border: 1px solid #5e6d6f; } - html.theme--documenter-dark .content code { - font-weight: inherit; } - html.theme--documenter-dark .content a code { - color: #1abc9c; } - html.theme--documenter-dark .content h1 code, html.theme--documenter-dark .content h2 code, html.theme--documenter-dark .content h3 code, html.theme--documenter-dark .content h4 code, html.theme--documenter-dark .content h5 code, html.theme--documenter-dark .content h6 code { - color: #f2f2f2; } - html.theme--documenter-dark .content table { - display: block; - width: initial; - max-width: 100%; - overflow-x: auto; } - html.theme--documenter-dark .content blockquote > ul:first-child, html.theme--documenter-dark .content blockquote > ol:first-child, html.theme--documenter-dark .content .admonition-body > ul:first-child, html.theme--documenter-dark .content .admonition-body > ol:first-child { - margin-top: 0; } - html.theme--documenter-dark pre, html.theme--documenter-dark code { - font-variant-ligatures: no-contextual; } - html.theme--documenter-dark .breadcrumb a.is-disabled { - cursor: default; - pointer-events: none; } - html.theme--documenter-dark .breadcrumb a.is-disabled, html.theme--documenter-dark .breadcrumb a.is-disabled:hover { - color: #f2f2f2; } - html.theme--documenter-dark .hljs { - background: initial !important; } - html.theme--documenter-dark .katex .katex-mathml { - top: 0; - right: 0; } - html.theme--documenter-dark .katex-display, html.theme--documenter-dark mjx-container, html.theme--documenter-dark .MathJax_Display { - margin: 0.5em 0 !important; } - html.theme--documenter-dark html { - -moz-osx-font-smoothing: auto; - -webkit-font-smoothing: auto; } - html.theme--documenter-dark li.no-marker { - list-style: none; } - html.theme--documenter-dark #documenter .docs-main > article { - overflow-wrap: break-word; } - html.theme--documenter-dark #documenter .docs-main > article .math-container { - overflow-x: auto; - overflow-y: hidden; } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark #documenter .docs-main { - max-width: 52rem; - margin-left: 20rem; - padding-right: 1rem; } } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark #documenter .docs-main { - width: 100%; } - html.theme--documenter-dark #documenter .docs-main > article { - max-width: 52rem; - margin-left: auto; - margin-right: auto; - margin-bottom: 1rem; - padding: 0 1rem; } - html.theme--documenter-dark #documenter .docs-main > header, html.theme--documenter-dark #documenter .docs-main > nav { - max-width: 100%; - width: 100%; - margin: 0; } } - html.theme--documenter-dark #documenter .docs-main header.docs-navbar { - background-color: #1f2424; - border-bottom: 1px solid #5e6d6f; - z-index: 2; - min-height: 4rem; - margin-bottom: 1rem; - display: flex; } - html.theme--documenter-dark #documenter .docs-main header.docs-navbar .breadcrumb { - flex-grow: 1; } - html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right { - display: flex; - white-space: nowrap; } - html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-icon, html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-label, html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-sidebar-button { - display: inline-block; } - html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-label { - padding: 0; - margin-left: 0.3em; } - html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-settings-button { - margin: auto 0 auto 1rem; } - html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-sidebar-button { - font-size: 1.5rem; - margin: auto 0 auto 1rem; } - html.theme--documenter-dark #documenter .docs-main header.docs-navbar > * { - margin: auto 0; } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark #documenter .docs-main header.docs-navbar { - position: sticky; - top: 0; - padding: 0 1rem; - /* For Headroom.js */ - transition-property: top, box-shadow; - -webkit-transition-property: top, box-shadow; - /* Safari */ - transition-duration: 0.3s; - -webkit-transition-duration: 0.3s; - /* Safari */ } - html.theme--documenter-dark #documenter .docs-main header.docs-navbar.headroom--not-top { - box-shadow: 0.2rem 0rem 0.4rem #171717; - transition-duration: 0.7s; - -webkit-transition-duration: 0.7s; - /* Safari */ } - html.theme--documenter-dark #documenter .docs-main header.docs-navbar.headroom--unpinned.headroom--not-top.headroom--not-bottom { - top: -4.5rem; - transition-duration: 0.7s; - -webkit-transition-duration: 0.7s; - /* Safari */ } } - html.theme--documenter-dark #documenter .docs-main section.footnotes { - border-top: 1px solid #5e6d6f; } - html.theme--documenter-dark #documenter .docs-main section.footnotes li .tag:first-child, html.theme--documenter-dark #documenter .docs-main section.footnotes li .docstring > section > a.docs-sourcelink:first-child, html.theme--documenter-dark #documenter .docs-main section.footnotes li .content kbd:first-child, html.theme--documenter-dark .content #documenter .docs-main section.footnotes li kbd:first-child { - margin-right: 1em; - margin-bottom: 0.4em; } - html.theme--documenter-dark #documenter .docs-main .docs-footer { - display: flex; - flex-wrap: wrap; - margin-left: 0; - margin-right: 0; - border-top: 1px solid #5e6d6f; - padding-top: 1rem; - padding-bottom: 1rem; } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark #documenter .docs-main .docs-footer { - padding-left: 1rem; - padding-right: 1rem; } } - html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-nextpage, html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-prevpage { - flex-grow: 1; } - html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-nextpage { - text-align: right; } - html.theme--documenter-dark #documenter .docs-main .docs-footer .flexbox-break { - flex-basis: 100%; - height: 0; } - html.theme--documenter-dark #documenter .docs-main .docs-footer .footer-message { - font-size: 0.8em; - margin: 0.5em auto 0 auto; - text-align: center; } - html.theme--documenter-dark #documenter .docs-sidebar { - display: flex; - flex-direction: column; - color: #fff; - background-color: #282f2f; - border-right: 1px solid #5e6d6f; - padding: 0; - flex: 0 0 18rem; - z-index: 5; - font-size: 15px; - position: fixed; - left: -18rem; - width: 18rem; - height: 100%; - transition: left 0.3s; - /* Setting up a nicer theme style for the scrollbar */ } - html.theme--documenter-dark #documenter .docs-sidebar.visible { - left: 0; - box-shadow: 0.4rem 0rem 0.8rem #171717; } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark #documenter .docs-sidebar.visible { - box-shadow: none; } } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark #documenter .docs-sidebar { - left: 0; - top: 0; } } - html.theme--documenter-dark #documenter .docs-sidebar .docs-logo { - margin-top: 1rem; - padding: 0 1rem; } - html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img { - max-height: 6rem; - margin: auto; } - html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name { - flex-shrink: 0; - font-size: 1.5rem; - font-weight: 700; - text-align: center; - white-space: nowrap; - overflow: hidden; - padding: 0.5rem 0; } - html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name .docs-autofit { - max-width: 16.2rem; } - html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name a, html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name a:hover { - color: #fff; } - html.theme--documenter-dark #documenter .docs-sidebar .docs-version-selector { - border-top: 1px solid #5e6d6f; - display: none; - padding: 0.5rem; } - html.theme--documenter-dark #documenter .docs-sidebar .docs-version-selector.visible { - display: flex; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu { - flex-grow: 1; - user-select: none; - border-top: 1px solid #5e6d6f; - padding-bottom: 1.5rem; - /* Managing collapsible submenus */ } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu > li > .tocitem { - font-weight: bold; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu > li li { - font-size: 14.25px; - margin-left: 1em; - border-left: 1px solid #5e6d6f; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input.collapse-toggle { - display: none; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.collapsed { - display: none; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input:checked ~ ul.collapsed { - display: block; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem { - display: flex; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-label { - flex-grow: 2; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron { - display: inline-block; - font-style: normal; - font-variant: normal; - text-rendering: auto; - line-height: 1; - font-size: 11.25px; - margin-left: 1rem; - margin-top: auto; - margin-bottom: auto; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron::before { - font-family: "Font Awesome 5 Free"; - font-weight: 900; - content: "\f054"; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input:checked ~ label.tocitem .docs-chevron::before { - content: "\f078"; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem { - display: block; - padding: 0.5rem 0.5rem; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem, html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem:hover { - color: #fff; - background: #282f2f; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu a.tocitem:hover, html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem:hover { - color: #fff; - background-color: #32393a; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active { - border-top: 1px solid #5e6d6f; - border-bottom: 1px solid #5e6d6f; - background-color: #1f2424; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active .tocitem, html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active .tocitem:hover { - background-color: #1f2424; - color: #fff; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active ul.internal .tocitem:hover { - background-color: #32393a; - color: #fff; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu > li.is-active:first-child { - border-top: none; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal { - margin: 0 0.5rem 0.5rem; - border-top: 1px solid #5e6d6f; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal li { - font-size: 12.75px; - border-left: none; - margin-left: 0; - margin-top: 0.5rem; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal .tocitem { - width: 100%; - padding: 0; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal .tocitem::before { - content: "⚬"; - margin-right: 0.4em; } - html.theme--documenter-dark #documenter .docs-sidebar form.docs-search { - margin: auto; - margin-top: 0.5rem; - margin-bottom: 0.5rem; } - html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input { - width: 14.4rem; } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu { - overflow-y: auto; - -webkit-overflow-scroll: touch; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar { - width: .3rem; - background: none; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb { - border-radius: 5px 0px 0px 5px; - background: #3b4445; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb:hover { - background: #4e5a5c; } } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark #documenter .docs-sidebar { - overflow-y: auto; - -webkit-overflow-scroll: touch; } - html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar { - width: .3rem; - background: none; } - html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar-thumb { - border-radius: 5px 0px 0px 5px; - background: #3b4445; } - html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar-thumb:hover { - background: #4e5a5c; } } - html.theme--documenter-dark #documenter .docs-main #documenter-search-info { - margin-bottom: 1rem; } - html.theme--documenter-dark #documenter .docs-main #documenter-search-results { - list-style-type: circle; - list-style-position: outside; } - html.theme--documenter-dark #documenter .docs-main #documenter-search-results li { - margin-left: 2rem; } - html.theme--documenter-dark #documenter .docs-main #documenter-search-results .docs-highlight { - background-color: yellow; } - html.theme--documenter-dark { - background-color: #1f2424; - font-size: 16px; - min-width: 300px; - overflow-x: auto; - overflow-y: scroll; - text-rendering: optimizeLegibility; - text-size-adjust: 100%; } - html.theme--documenter-dark .ansi span.sgr1 { - font-weight: bolder; } - html.theme--documenter-dark .ansi span.sgr2 { - font-weight: lighter; } - html.theme--documenter-dark .ansi span.sgr3 { - font-style: italic; } - html.theme--documenter-dark .ansi span.sgr4 { - text-decoration: underline; } - html.theme--documenter-dark .ansi span.sgr7 { - color: #1f2424; - background-color: #fff; } - html.theme--documenter-dark .ansi span.sgr8 { - color: transparent; } - html.theme--documenter-dark .ansi span.sgr8 span { - color: transparent; } - html.theme--documenter-dark .ansi span.sgr9 { - text-decoration: line-through; } - html.theme--documenter-dark .ansi span.sgr30 { - color: #242424; } - html.theme--documenter-dark .ansi span.sgr31 { - color: #f6705f; } - html.theme--documenter-dark .ansi span.sgr32 { - color: #4fb43a; } - html.theme--documenter-dark .ansi span.sgr33 { - color: #f4c72f; } - html.theme--documenter-dark .ansi span.sgr34 { - color: #7587f0; } - html.theme--documenter-dark .ansi span.sgr35 { - color: #bc89d3; } - html.theme--documenter-dark .ansi span.sgr36 { - color: #49b6ca; } - html.theme--documenter-dark .ansi span.sgr37 { - color: #b3bdbe; } - html.theme--documenter-dark .ansi span.sgr40 { - background-color: #242424; } - html.theme--documenter-dark .ansi span.sgr41 { - background-color: #f6705f; } - html.theme--documenter-dark .ansi span.sgr42 { - background-color: #4fb43a; } - html.theme--documenter-dark .ansi span.sgr43 { - background-color: #f4c72f; } - html.theme--documenter-dark .ansi span.sgr44 { - background-color: #7587f0; } - html.theme--documenter-dark .ansi span.sgr45 { - background-color: #bc89d3; } - html.theme--documenter-dark .ansi span.sgr46 { - background-color: #49b6ca; } - html.theme--documenter-dark .ansi span.sgr47 { - background-color: #b3bdbe; } - html.theme--documenter-dark .ansi span.sgr90 { - color: #92a0a2; } - html.theme--documenter-dark .ansi span.sgr91 { - color: #ff8674; } - html.theme--documenter-dark .ansi span.sgr92 { - color: #79d462; } - html.theme--documenter-dark .ansi span.sgr93 { - color: #ffe76b; } - html.theme--documenter-dark .ansi span.sgr94 { - color: #8a98ff; } - html.theme--documenter-dark .ansi span.sgr95 { - color: #d2a4e6; } - html.theme--documenter-dark .ansi span.sgr96 { - color: #6bc8db; } - html.theme--documenter-dark .ansi span.sgr97 { - color: #ecf0f1; } - html.theme--documenter-dark .ansi span.sgr100 { - background-color: #92a0a2; } - html.theme--documenter-dark .ansi span.sgr101 { - background-color: #ff8674; } - html.theme--documenter-dark .ansi span.sgr102 { - background-color: #79d462; } - html.theme--documenter-dark .ansi span.sgr103 { - background-color: #ffe76b; } - html.theme--documenter-dark .ansi span.sgr104 { - background-color: #8a98ff; } - html.theme--documenter-dark .ansi span.sgr105 { - background-color: #d2a4e6; } - html.theme--documenter-dark .ansi span.sgr106 { - background-color: #6bc8db; } - html.theme--documenter-dark .ansi span.sgr107 { - background-color: #ecf0f1; } - html.theme--documenter-dark code.language-julia-repl > span.hljs-meta { - color: #4fb43a; - font-weight: bolder; } - html.theme--documenter-dark .hljs { - background: #2b2b2b; - color: #f8f8f2; } - html.theme--documenter-dark .hljs-comment, - html.theme--documenter-dark .hljs-quote { - color: #d4d0ab; } - html.theme--documenter-dark .hljs-variable, - html.theme--documenter-dark .hljs-template-variable, - html.theme--documenter-dark .hljs-tag, - html.theme--documenter-dark .hljs-name, - html.theme--documenter-dark .hljs-selector-id, - html.theme--documenter-dark .hljs-selector-class, - html.theme--documenter-dark .hljs-regexp, - html.theme--documenter-dark .hljs-deletion { - color: #ffa07a; } - html.theme--documenter-dark .hljs-number, - html.theme--documenter-dark .hljs-built_in, - html.theme--documenter-dark .hljs-literal, - html.theme--documenter-dark .hljs-type, - html.theme--documenter-dark .hljs-params, - html.theme--documenter-dark .hljs-meta, - html.theme--documenter-dark .hljs-link { - color: #f5ab35; } - html.theme--documenter-dark .hljs-attribute { - color: #ffd700; } - html.theme--documenter-dark .hljs-string, - html.theme--documenter-dark .hljs-symbol, - html.theme--documenter-dark .hljs-bullet, - html.theme--documenter-dark .hljs-addition { - color: #abe338; } - html.theme--documenter-dark .hljs-title, - html.theme--documenter-dark .hljs-section { - color: #00e0e0; } - html.theme--documenter-dark .hljs-keyword, - html.theme--documenter-dark .hljs-selector-tag { - color: #dcc6e0; } - html.theme--documenter-dark .hljs-emphasis { - font-style: italic; } - html.theme--documenter-dark .hljs-strong { - font-weight: bold; } - @media screen and (-ms-high-contrast: active) { - html.theme--documenter-dark .hljs-addition, - html.theme--documenter-dark .hljs-attribute, - html.theme--documenter-dark .hljs-built_in, - html.theme--documenter-dark .hljs-bullet, - html.theme--documenter-dark .hljs-comment, - html.theme--documenter-dark .hljs-link, - html.theme--documenter-dark .hljs-literal, - html.theme--documenter-dark .hljs-meta, - html.theme--documenter-dark .hljs-number, - html.theme--documenter-dark .hljs-params, - html.theme--documenter-dark .hljs-string, - html.theme--documenter-dark .hljs-symbol, - html.theme--documenter-dark .hljs-type, - html.theme--documenter-dark .hljs-quote { - color: highlight; } - html.theme--documenter-dark .hljs-keyword, - html.theme--documenter-dark .hljs-selector-tag { - font-weight: bold; } } - html.theme--documenter-dark .hljs-subst { - color: #f8f8f2; } +*/}html.theme--documenter-dark html{background-color:#1f2424;font-size:16px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;min-width:300px;overflow-x:auto;overflow-y:scroll;text-rendering:optimizeLegibility;text-size-adjust:100%}html.theme--documenter-dark article,html.theme--documenter-dark aside,html.theme--documenter-dark figure,html.theme--documenter-dark footer,html.theme--documenter-dark header,html.theme--documenter-dark hgroup,html.theme--documenter-dark section{display:block}html.theme--documenter-dark body,html.theme--documenter-dark button,html.theme--documenter-dark input,html.theme--documenter-dark select,html.theme--documenter-dark textarea{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif}html.theme--documenter-dark code,html.theme--documenter-dark pre{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto;font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace}html.theme--documenter-dark body{color:#fff;font-size:1em;font-weight:400;line-height:1.5}html.theme--documenter-dark a{color:#1abc9c;cursor:pointer;text-decoration:none}html.theme--documenter-dark a strong{color:currentColor}html.theme--documenter-dark a:hover{color:#1dd2af}html.theme--documenter-dark code{background-color:rgba(255,255,255,0.05);color:#ececec;font-size:.875em;font-weight:normal;padding:.1em}html.theme--documenter-dark hr{background-color:#282f2f;border:none;display:block;height:2px;margin:1.5rem 0}html.theme--documenter-dark img{height:auto;max-width:100%}html.theme--documenter-dark input[type="checkbox"],html.theme--documenter-dark input[type="radio"]{vertical-align:baseline}html.theme--documenter-dark small{font-size:.875em}html.theme--documenter-dark span{font-style:inherit;font-weight:inherit}html.theme--documenter-dark strong{color:#f2f2f2;font-weight:700}html.theme--documenter-dark fieldset{border:none}html.theme--documenter-dark pre{-webkit-overflow-scrolling:touch;background-color:#282f2f;color:#fff;font-size:.875em;overflow-x:auto;padding:1.25rem 1.5rem;white-space:pre;word-wrap:normal}html.theme--documenter-dark pre code{background-color:transparent;color:currentColor;font-size:1em;padding:0}html.theme--documenter-dark table td,html.theme--documenter-dark table th{vertical-align:top}html.theme--documenter-dark table td:not([align]),html.theme--documenter-dark table th:not([align]){text-align:left}html.theme--documenter-dark table th{color:#f2f2f2}html.theme--documenter-dark .box{background-color:#343c3d;border-radius:8px;box-shadow:none;color:#fff;display:block;padding:1.25rem}html.theme--documenter-dark a.box:hover,html.theme--documenter-dark a.box:focus{box-shadow:0 2px 3px rgba(10,10,10,0.1),0 0 0 1px #1abc9c}html.theme--documenter-dark a.box:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2),0 0 0 1px #1abc9c}html.theme--documenter-dark .button{background-color:#282f2f;border-color:#4c5759;border-width:1px;color:#375a7f;cursor:pointer;justify-content:center;padding-bottom:calc(0.375em - 1px);padding-left:.75em;padding-right:.75em;padding-top:calc(0.375em - 1px);text-align:center;white-space:nowrap}html.theme--documenter-dark .button strong{color:inherit}html.theme--documenter-dark .button .icon,html.theme--documenter-dark .button .icon.is-small,html.theme--documenter-dark .button #documenter .docs-sidebar form.docs-search>input.icon,html.theme--documenter-dark #documenter .docs-sidebar .button form.docs-search>input.icon,html.theme--documenter-dark .button .icon.is-medium,html.theme--documenter-dark .button .icon.is-large{height:1.5em;width:1.5em}html.theme--documenter-dark .button .icon:first-child:not(:last-child){margin-left:calc(-0.375em - 1px);margin-right:0.1875em}html.theme--documenter-dark .button .icon:last-child:not(:first-child){margin-left:0.1875em;margin-right:calc(-0.375em - 1px)}html.theme--documenter-dark .button .icon:first-child:last-child{margin-left:calc(-0.375em - 1px);margin-right:calc(-0.375em - 1px)}html.theme--documenter-dark .button:hover,html.theme--documenter-dark .button.is-hovered{border-color:#8c9b9d;color:#f2f2f2}html.theme--documenter-dark .button:focus,html.theme--documenter-dark .button.is-focused{border-color:#8c9b9d;color:#17a689}html.theme--documenter-dark .button:focus:not(:active),html.theme--documenter-dark .button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .button:active,html.theme--documenter-dark .button.is-active{border-color:#343c3d;color:#f2f2f2}html.theme--documenter-dark .button.is-text{background-color:transparent;border-color:transparent;color:#fff;text-decoration:underline}html.theme--documenter-dark .button.is-text:hover,html.theme--documenter-dark .button.is-text.is-hovered,html.theme--documenter-dark .button.is-text:focus,html.theme--documenter-dark .button.is-text.is-focused{background-color:#282f2f;color:#f2f2f2}html.theme--documenter-dark .button.is-text:active,html.theme--documenter-dark .button.is-text.is-active{background-color:#1d2122;color:#f2f2f2}html.theme--documenter-dark .button.is-text[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-text{background-color:transparent;border-color:transparent;box-shadow:none}html.theme--documenter-dark .button.is-white{background-color:#fff;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white:hover,html.theme--documenter-dark .button.is-white.is-hovered{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white:focus,html.theme--documenter-dark .button.is-white.is-focused{border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white:focus:not(:active),html.theme--documenter-dark .button.is-white.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}html.theme--documenter-dark .button.is-white:active,html.theme--documenter-dark .button.is-white.is-active{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white{background-color:#fff;border-color:transparent;box-shadow:none}html.theme--documenter-dark .button.is-white.is-inverted{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .button.is-white.is-inverted:hover,html.theme--documenter-dark .button.is-white.is-inverted.is-hovered{background-color:#000}html.theme--documenter-dark .button.is-white.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white.is-inverted{background-color:#0a0a0a;border-color:transparent;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-white.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-white.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-white.is-outlined:hover,html.theme--documenter-dark .button.is-white.is-outlined.is-hovered,html.theme--documenter-dark .button.is-white.is-outlined:focus,html.theme--documenter-dark .button.is-white.is-outlined.is-focused{background-color:#fff;border-color:#fff;color:#0a0a0a}html.theme--documenter-dark .button.is-white.is-outlined.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-white.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-white.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-white.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-white.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-white.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-focused{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}html.theme--documenter-dark .button.is-black{background-color:#0a0a0a;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black:hover,html.theme--documenter-dark .button.is-black.is-hovered{background-color:#040404;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black:focus,html.theme--documenter-dark .button.is-black.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black:focus:not(:active),html.theme--documenter-dark .button.is-black.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}html.theme--documenter-dark .button.is-black:active,html.theme--documenter-dark .button.is-black.is-active{background-color:#000;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black{background-color:#0a0a0a;border-color:transparent;box-shadow:none}html.theme--documenter-dark .button.is-black.is-inverted{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-inverted:hover,html.theme--documenter-dark .button.is-black.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-black.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-outlined:hover,html.theme--documenter-dark .button.is-black.is-outlined.is-hovered,html.theme--documenter-dark .button.is-black.is-outlined:focus,html.theme--documenter-dark .button.is-black.is-outlined.is-focused{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}html.theme--documenter-dark .button.is-black.is-outlined.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-black.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-black.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-black.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-black.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-black.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-focused{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-light{background-color:#ecf0f1;border-color:transparent;color:#282f2f}html.theme--documenter-dark .button.is-light:hover,html.theme--documenter-dark .button.is-light.is-hovered{background-color:#e5eaec;border-color:transparent;color:#282f2f}html.theme--documenter-dark .button.is-light:focus,html.theme--documenter-dark .button.is-light.is-focused{border-color:transparent;color:#282f2f}html.theme--documenter-dark .button.is-light:focus:not(:active),html.theme--documenter-dark .button.is-light.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(236,240,241,0.25)}html.theme--documenter-dark .button.is-light:active,html.theme--documenter-dark .button.is-light.is-active{background-color:#dde4e6;border-color:transparent;color:#282f2f}html.theme--documenter-dark .button.is-light[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light{background-color:#ecf0f1;border-color:transparent;box-shadow:none}html.theme--documenter-dark .button.is-light.is-inverted{background-color:#282f2f;color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-inverted:hover,html.theme--documenter-dark .button.is-light.is-inverted.is-hovered{background-color:#1d2122}html.theme--documenter-dark .button.is-light.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light.is-inverted{background-color:#282f2f;border-color:transparent;box-shadow:none;color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-loading::after{border-color:transparent transparent #282f2f #282f2f !important}html.theme--documenter-dark .button.is-light.is-outlined{background-color:transparent;border-color:#ecf0f1;color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-outlined:hover,html.theme--documenter-dark .button.is-light.is-outlined.is-hovered,html.theme--documenter-dark .button.is-light.is-outlined:focus,html.theme--documenter-dark .button.is-light.is-outlined.is-focused{background-color:#ecf0f1;border-color:#ecf0f1;color:#282f2f}html.theme--documenter-dark .button.is-light.is-outlined.is-loading::after{border-color:transparent transparent #ecf0f1 #ecf0f1 !important}html.theme--documenter-dark .button.is-light.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-light.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-light.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-light.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #282f2f #282f2f !important}html.theme--documenter-dark .button.is-light.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light.is-outlined{background-color:transparent;border-color:#ecf0f1;box-shadow:none;color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:#282f2f;color:#282f2f}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-focused{background-color:#282f2f;color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #ecf0f1 #ecf0f1 !important}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:#282f2f;box-shadow:none;color:#282f2f}html.theme--documenter-dark .button.is-dark,html.theme--documenter-dark .content kbd.button{background-color:#282f2f;border-color:transparent;color:#ecf0f1}html.theme--documenter-dark .button.is-dark:hover,html.theme--documenter-dark .content kbd.button:hover,html.theme--documenter-dark .button.is-dark.is-hovered,html.theme--documenter-dark .content kbd.button.is-hovered{background-color:#232829;border-color:transparent;color:#ecf0f1}html.theme--documenter-dark .button.is-dark:focus,html.theme--documenter-dark .content kbd.button:focus,html.theme--documenter-dark .button.is-dark.is-focused,html.theme--documenter-dark .content kbd.button.is-focused{border-color:transparent;color:#ecf0f1}html.theme--documenter-dark .button.is-dark:focus:not(:active),html.theme--documenter-dark .content kbd.button:focus:not(:active),html.theme--documenter-dark .button.is-dark.is-focused:not(:active),html.theme--documenter-dark .content kbd.button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(40,47,47,0.25)}html.theme--documenter-dark .button.is-dark:active,html.theme--documenter-dark .content kbd.button:active,html.theme--documenter-dark .button.is-dark.is-active,html.theme--documenter-dark .content kbd.button.is-active{background-color:#1d2122;border-color:transparent;color:#ecf0f1}html.theme--documenter-dark .button.is-dark[disabled],html.theme--documenter-dark .content kbd.button[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark,fieldset[disabled] html.theme--documenter-dark .content kbd.button{background-color:#282f2f;border-color:transparent;box-shadow:none}html.theme--documenter-dark .button.is-dark.is-inverted,html.theme--documenter-dark .content kbd.button.is-inverted{background-color:#ecf0f1;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-inverted:hover,html.theme--documenter-dark .content kbd.button.is-inverted:hover,html.theme--documenter-dark .button.is-dark.is-inverted.is-hovered,html.theme--documenter-dark .content kbd.button.is-inverted.is-hovered{background-color:#dde4e6}html.theme--documenter-dark .button.is-dark.is-inverted[disabled],html.theme--documenter-dark .content kbd.button.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-inverted,fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-inverted{background-color:#ecf0f1;border-color:transparent;box-shadow:none;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-loading::after,html.theme--documenter-dark .content kbd.button.is-loading::after{border-color:transparent transparent #ecf0f1 #ecf0f1 !important}html.theme--documenter-dark .button.is-dark.is-outlined,html.theme--documenter-dark .content kbd.button.is-outlined{background-color:transparent;border-color:#282f2f;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-outlined:hover,html.theme--documenter-dark .content kbd.button.is-outlined:hover,html.theme--documenter-dark .button.is-dark.is-outlined.is-hovered,html.theme--documenter-dark .content kbd.button.is-outlined.is-hovered,html.theme--documenter-dark .button.is-dark.is-outlined:focus,html.theme--documenter-dark .content kbd.button.is-outlined:focus,html.theme--documenter-dark .button.is-dark.is-outlined.is-focused,html.theme--documenter-dark .content kbd.button.is-outlined.is-focused{background-color:#282f2f;border-color:#282f2f;color:#ecf0f1}html.theme--documenter-dark .button.is-dark.is-outlined.is-loading::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading::after{border-color:transparent transparent #282f2f #282f2f !important}html.theme--documenter-dark .button.is-dark.is-outlined.is-loading:hover::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-dark.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-dark.is-outlined.is-loading:focus::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-dark.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #ecf0f1 #ecf0f1 !important}html.theme--documenter-dark .button.is-dark.is-outlined[disabled],html.theme--documenter-dark .content kbd.button.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-outlined,fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-outlined{background-color:transparent;border-color:#282f2f;box-shadow:none;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#ecf0f1;color:#ecf0f1}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined:hover,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined:focus,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-focused,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-focused{background-color:#ecf0f1;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #282f2f #282f2f !important}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined[disabled],html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined,fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#ecf0f1;box-shadow:none;color:#ecf0f1}html.theme--documenter-dark .button.is-primary,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink{background-color:#375a7f;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary:hover,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-hovered.docs-sourcelink{background-color:#335476;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary:focus,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:focus,html.theme--documenter-dark .button.is-primary.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-focused.docs-sourcelink{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary:focus:not(:active),html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:focus:not(:active),html.theme--documenter-dark .button.is-primary.is-focused:not(:active),html.theme--documenter-dark .docstring>section>a.button.is-focused.docs-sourcelink:not(:active){box-shadow:0 0 0 0.125em rgba(55,90,127,0.25)}html.theme--documenter-dark .button.is-primary:active,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:active,html.theme--documenter-dark .button.is-primary.is-active,html.theme--documenter-dark .docstring>section>a.button.is-active.docs-sourcelink{background-color:#2f4d6d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary[disabled],html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink{background-color:#375a7f;border-color:transparent;box-shadow:none}html.theme--documenter-dark .button.is-primary.is-inverted,html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-inverted:hover,html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-inverted.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-hovered.docs-sourcelink{background-color:#f2f2f2}html.theme--documenter-dark .button.is-primary.is-inverted[disabled],html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-inverted,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;border-color:transparent;box-shadow:none;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-loading::after,html.theme--documenter-dark .docstring>section>a.button.is-loading.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-primary.is-outlined,html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#375a7f;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-outlined:hover,html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-outlined.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-hovered.docs-sourcelink,html.theme--documenter-dark .button.is-primary.is-outlined:focus,html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink:focus,html.theme--documenter-dark .button.is-primary.is-outlined.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-focused.docs-sourcelink{background-color:#375a7f;border-color:#375a7f;color:#fff}html.theme--documenter-dark .button.is-primary.is-outlined.is-loading::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.docs-sourcelink::after{border-color:transparent transparent #375a7f #375a7f !important}html.theme--documenter-dark .button.is-primary.is-outlined.is-loading:hover::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:hover::after,html.theme--documenter-dark .button.is-primary.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.is-hovered.docs-sourcelink::after,html.theme--documenter-dark .button.is-primary.is-outlined.is-loading:focus::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:focus::after,html.theme--documenter-dark .button.is-primary.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-primary.is-outlined[disabled],html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-outlined,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#375a7f;box-shadow:none;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined:hover,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-hovered.docs-sourcelink,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined:focus,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:focus,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-focused.docs-sourcelink{background-color:#fff;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:hover::after,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.is-hovered.docs-sourcelink::after,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:focus::after,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #375a7f #375a7f !important}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined[disabled],html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-link{background-color:#1abc9c;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link:hover,html.theme--documenter-dark .button.is-link.is-hovered{background-color:#18b193;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link:focus,html.theme--documenter-dark .button.is-link.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link:focus:not(:active),html.theme--documenter-dark .button.is-link.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .button.is-link:active,html.theme--documenter-dark .button.is-link.is-active{background-color:#17a689;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link{background-color:#1abc9c;border-color:transparent;box-shadow:none}html.theme--documenter-dark .button.is-link.is-inverted{background-color:#fff;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-inverted:hover,html.theme--documenter-dark .button.is-link.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-link.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-link.is-outlined{background-color:transparent;border-color:#1abc9c;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-outlined:hover,html.theme--documenter-dark .button.is-link.is-outlined.is-hovered,html.theme--documenter-dark .button.is-link.is-outlined:focus,html.theme--documenter-dark .button.is-link.is-outlined.is-focused{background-color:#1abc9c;border-color:#1abc9c;color:#fff}html.theme--documenter-dark .button.is-link.is-outlined.is-loading::after{border-color:transparent transparent #1abc9c #1abc9c !important}html.theme--documenter-dark .button.is-link.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-link.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-link.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-link.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-link.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link.is-outlined{background-color:transparent;border-color:#1abc9c;box-shadow:none;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-focused{background-color:#fff;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #1abc9c #1abc9c !important}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-info{background-color:#024c7d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info:hover,html.theme--documenter-dark .button.is-info.is-hovered{background-color:#024470;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info:focus,html.theme--documenter-dark .button.is-info.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info:focus:not(:active),html.theme--documenter-dark .button.is-info.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(2,76,125,0.25)}html.theme--documenter-dark .button.is-info:active,html.theme--documenter-dark .button.is-info.is-active{background-color:#023d64;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info{background-color:#024c7d;border-color:transparent;box-shadow:none}html.theme--documenter-dark .button.is-info.is-inverted{background-color:#fff;color:#024c7d}html.theme--documenter-dark .button.is-info.is-inverted:hover,html.theme--documenter-dark .button.is-info.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-info.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#024c7d}html.theme--documenter-dark .button.is-info.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-info.is-outlined{background-color:transparent;border-color:#024c7d;color:#024c7d}html.theme--documenter-dark .button.is-info.is-outlined:hover,html.theme--documenter-dark .button.is-info.is-outlined.is-hovered,html.theme--documenter-dark .button.is-info.is-outlined:focus,html.theme--documenter-dark .button.is-info.is-outlined.is-focused{background-color:#024c7d;border-color:#024c7d;color:#fff}html.theme--documenter-dark .button.is-info.is-outlined.is-loading::after{border-color:transparent transparent #024c7d #024c7d !important}html.theme--documenter-dark .button.is-info.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-info.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-info.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-info.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-info.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info.is-outlined{background-color:transparent;border-color:#024c7d;box-shadow:none;color:#024c7d}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-focused{background-color:#fff;color:#024c7d}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #024c7d #024c7d !important}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-success{background-color:#008438;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success:hover,html.theme--documenter-dark .button.is-success.is-hovered{background-color:#073;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success:focus,html.theme--documenter-dark .button.is-success.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success:focus:not(:active),html.theme--documenter-dark .button.is-success.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(0,132,56,0.25)}html.theme--documenter-dark .button.is-success:active,html.theme--documenter-dark .button.is-success.is-active{background-color:#006b2d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success{background-color:#008438;border-color:transparent;box-shadow:none}html.theme--documenter-dark .button.is-success.is-inverted{background-color:#fff;color:#008438}html.theme--documenter-dark .button.is-success.is-inverted:hover,html.theme--documenter-dark .button.is-success.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-success.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#008438}html.theme--documenter-dark .button.is-success.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-success.is-outlined{background-color:transparent;border-color:#008438;color:#008438}html.theme--documenter-dark .button.is-success.is-outlined:hover,html.theme--documenter-dark .button.is-success.is-outlined.is-hovered,html.theme--documenter-dark .button.is-success.is-outlined:focus,html.theme--documenter-dark .button.is-success.is-outlined.is-focused{background-color:#008438;border-color:#008438;color:#fff}html.theme--documenter-dark .button.is-success.is-outlined.is-loading::after{border-color:transparent transparent #008438 #008438 !important}html.theme--documenter-dark .button.is-success.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-success.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-success.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-success.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-success.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success.is-outlined{background-color:transparent;border-color:#008438;box-shadow:none;color:#008438}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-focused{background-color:#fff;color:#008438}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #008438 #008438 !important}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-warning{background-color:#ad8100;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning:hover,html.theme--documenter-dark .button.is-warning.is-hovered{background-color:#a07700;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning:focus,html.theme--documenter-dark .button.is-warning.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning:focus:not(:active),html.theme--documenter-dark .button.is-warning.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(173,129,0,0.25)}html.theme--documenter-dark .button.is-warning:active,html.theme--documenter-dark .button.is-warning.is-active{background-color:#946e00;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning{background-color:#ad8100;border-color:transparent;box-shadow:none}html.theme--documenter-dark .button.is-warning.is-inverted{background-color:#fff;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-inverted:hover,html.theme--documenter-dark .button.is-warning.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-warning.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-warning.is-outlined{background-color:transparent;border-color:#ad8100;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-outlined:hover,html.theme--documenter-dark .button.is-warning.is-outlined.is-hovered,html.theme--documenter-dark .button.is-warning.is-outlined:focus,html.theme--documenter-dark .button.is-warning.is-outlined.is-focused{background-color:#ad8100;border-color:#ad8100;color:#fff}html.theme--documenter-dark .button.is-warning.is-outlined.is-loading::after{border-color:transparent transparent #ad8100 #ad8100 !important}html.theme--documenter-dark .button.is-warning.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-warning.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-warning.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-warning.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-warning.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-outlined{background-color:transparent;border-color:#ad8100;box-shadow:none;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-focused{background-color:#fff;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #ad8100 #ad8100 !important}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-danger{background-color:#9e1b0d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger:hover,html.theme--documenter-dark .button.is-danger.is-hovered{background-color:#92190c;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger:focus,html.theme--documenter-dark .button.is-danger.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger:focus:not(:active),html.theme--documenter-dark .button.is-danger.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(158,27,13,0.25)}html.theme--documenter-dark .button.is-danger:active,html.theme--documenter-dark .button.is-danger.is-active{background-color:#86170b;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger{background-color:#9e1b0d;border-color:transparent;box-shadow:none}html.theme--documenter-dark .button.is-danger.is-inverted{background-color:#fff;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-inverted:hover,html.theme--documenter-dark .button.is-danger.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-danger.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-danger.is-outlined{background-color:transparent;border-color:#9e1b0d;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-outlined:hover,html.theme--documenter-dark .button.is-danger.is-outlined.is-hovered,html.theme--documenter-dark .button.is-danger.is-outlined:focus,html.theme--documenter-dark .button.is-danger.is-outlined.is-focused{background-color:#9e1b0d;border-color:#9e1b0d;color:#fff}html.theme--documenter-dark .button.is-danger.is-outlined.is-loading::after{border-color:transparent transparent #9e1b0d #9e1b0d !important}html.theme--documenter-dark .button.is-danger.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-danger.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-danger.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-danger.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-danger.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-outlined{background-color:transparent;border-color:#9e1b0d;box-shadow:none;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-focused{background-color:#fff;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #9e1b0d #9e1b0d !important}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.button{border-radius:3px;font-size:.85em}html.theme--documenter-dark .button.is-normal{font-size:15px}html.theme--documenter-dark .button.is-medium{font-size:1.25rem}html.theme--documenter-dark .button.is-large{font-size:1.5rem}html.theme--documenter-dark .button[disabled],fieldset[disabled] html.theme--documenter-dark .button{background-color:#8c9b9d;border-color:#dbdee0;box-shadow:none;opacity:.5}html.theme--documenter-dark .button.is-fullwidth{display:flex;width:100%}html.theme--documenter-dark .button.is-loading{color:transparent !important;pointer-events:none}html.theme--documenter-dark .button.is-loading::after{position:absolute;left:calc(50% - (1em / 2));top:calc(50% - (1em / 2));position:absolute !important}html.theme--documenter-dark .button.is-static{background-color:#282f2f;border-color:#5e6d6f;color:#dbdee0;box-shadow:none;pointer-events:none}html.theme--documenter-dark .button.is-rounded,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.button{border-radius:290486px;padding-left:1em;padding-right:1em}html.theme--documenter-dark .buttons{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}html.theme--documenter-dark .buttons .button{margin-bottom:0.5rem}html.theme--documenter-dark .buttons .button:not(:last-child):not(.is-fullwidth){margin-right:0.5rem}html.theme--documenter-dark .buttons:last-child{margin-bottom:-0.5rem}html.theme--documenter-dark .buttons:not(:last-child){margin-bottom:1rem}html.theme--documenter-dark .buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large){border-radius:3px;font-size:.85em}html.theme--documenter-dark .buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large){font-size:1.25rem}html.theme--documenter-dark .buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium){font-size:1.5rem}html.theme--documenter-dark .buttons.has-addons .button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}html.theme--documenter-dark .buttons.has-addons .button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}html.theme--documenter-dark .buttons.has-addons .button:last-child{margin-right:0}html.theme--documenter-dark .buttons.has-addons .button:hover,html.theme--documenter-dark .buttons.has-addons .button.is-hovered{z-index:2}html.theme--documenter-dark .buttons.has-addons .button:focus,html.theme--documenter-dark .buttons.has-addons .button.is-focused,html.theme--documenter-dark .buttons.has-addons .button:active,html.theme--documenter-dark .buttons.has-addons .button.is-active,html.theme--documenter-dark .buttons.has-addons .button.is-selected{z-index:3}html.theme--documenter-dark .buttons.has-addons .button:focus:hover,html.theme--documenter-dark .buttons.has-addons .button.is-focused:hover,html.theme--documenter-dark .buttons.has-addons .button:active:hover,html.theme--documenter-dark .buttons.has-addons .button.is-active:hover,html.theme--documenter-dark .buttons.has-addons .button.is-selected:hover{z-index:4}html.theme--documenter-dark .buttons.has-addons .button.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .buttons.is-centered{justify-content:center}html.theme--documenter-dark .buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}html.theme--documenter-dark .buttons.is-right{justify-content:flex-end}html.theme--documenter-dark .buttons.is-right:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}html.theme--documenter-dark .container{flex-grow:1;margin:0 auto;position:relative;width:auto}@media screen and (min-width: 1056px){html.theme--documenter-dark .container{max-width:992px}html.theme--documenter-dark .container.is-fluid{margin-left:32px;margin-right:32px;max-width:none}}@media screen and (max-width: 1215px){html.theme--documenter-dark .container.is-widescreen{max-width:1152px}}@media screen and (max-width: 1407px){html.theme--documenter-dark .container.is-fullhd{max-width:1344px}}@media screen and (min-width: 1216px){html.theme--documenter-dark .container{max-width:1152px}}@media screen and (min-width: 1408px){html.theme--documenter-dark .container{max-width:1344px}}html.theme--documenter-dark .content li+li{margin-top:0.25em}html.theme--documenter-dark .content p:not(:last-child),html.theme--documenter-dark .content dl:not(:last-child),html.theme--documenter-dark .content ol:not(:last-child),html.theme--documenter-dark .content ul:not(:last-child),html.theme--documenter-dark .content blockquote:not(:last-child),html.theme--documenter-dark .content pre:not(:last-child),html.theme--documenter-dark .content table:not(:last-child){margin-bottom:1em}html.theme--documenter-dark .content h1,html.theme--documenter-dark .content h2,html.theme--documenter-dark .content h3,html.theme--documenter-dark .content h4,html.theme--documenter-dark .content h5,html.theme--documenter-dark .content h6{color:#f2f2f2;font-weight:600;line-height:1.125}html.theme--documenter-dark .content h1{font-size:2em;margin-bottom:0.5em}html.theme--documenter-dark .content h1:not(:first-child){margin-top:1em}html.theme--documenter-dark .content h2{font-size:1.75em;margin-bottom:0.5714em}html.theme--documenter-dark .content h2:not(:first-child){margin-top:1.1428em}html.theme--documenter-dark .content h3{font-size:1.5em;margin-bottom:0.6666em}html.theme--documenter-dark .content h3:not(:first-child){margin-top:1.3333em}html.theme--documenter-dark .content h4{font-size:1.25em;margin-bottom:0.8em}html.theme--documenter-dark .content h5{font-size:1.125em;margin-bottom:0.8888em}html.theme--documenter-dark .content h6{font-size:1em;margin-bottom:1em}html.theme--documenter-dark .content blockquote{background-color:#282f2f;border-left:5px solid #5e6d6f;padding:1.25em 1.5em}html.theme--documenter-dark .content ol{list-style-position:outside;margin-left:2em;margin-top:1em}html.theme--documenter-dark .content ol:not([type]){list-style-type:decimal}html.theme--documenter-dark .content ol.is-lower-alpha:not([type]){list-style-type:lower-alpha}html.theme--documenter-dark .content ol.is-lower-roman:not([type]){list-style-type:lower-roman}html.theme--documenter-dark .content ol.is-upper-alpha:not([type]){list-style-type:upper-alpha}html.theme--documenter-dark .content ol.is-upper-roman:not([type]){list-style-type:upper-roman}html.theme--documenter-dark .content ul{list-style:disc outside;margin-left:2em;margin-top:1em}html.theme--documenter-dark .content ul ul{list-style-type:circle;margin-top:0.5em}html.theme--documenter-dark .content ul ul ul{list-style-type:square}html.theme--documenter-dark .content dd{margin-left:2em}html.theme--documenter-dark .content figure{margin-left:2em;margin-right:2em;text-align:center}html.theme--documenter-dark .content figure:not(:first-child){margin-top:2em}html.theme--documenter-dark .content figure:not(:last-child){margin-bottom:2em}html.theme--documenter-dark .content figure img{display:inline-block}html.theme--documenter-dark .content figure figcaption{font-style:italic}html.theme--documenter-dark .content pre{-webkit-overflow-scrolling:touch;overflow-x:auto;padding:0;white-space:pre;word-wrap:normal}html.theme--documenter-dark .content sup,html.theme--documenter-dark .content sub{font-size:75%}html.theme--documenter-dark .content table{width:100%}html.theme--documenter-dark .content table td,html.theme--documenter-dark .content table th{border:1px solid #5e6d6f;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}html.theme--documenter-dark .content table th{color:#f2f2f2}html.theme--documenter-dark .content table th:not([align]){text-align:left}html.theme--documenter-dark .content table thead td,html.theme--documenter-dark .content table thead th{border-width:0 0 2px;color:#f2f2f2}html.theme--documenter-dark .content table tfoot td,html.theme--documenter-dark .content table tfoot th{border-width:2px 0 0;color:#f2f2f2}html.theme--documenter-dark .content table tbody tr:last-child td,html.theme--documenter-dark .content table tbody tr:last-child th{border-bottom-width:0}html.theme--documenter-dark .content .tabs li+li{margin-top:0}html.theme--documenter-dark .content.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.content{font-size:.85em}html.theme--documenter-dark .content.is-medium{font-size:1.25rem}html.theme--documenter-dark .content.is-large{font-size:1.5rem}html.theme--documenter-dark .icon{align-items:center;display:inline-flex;justify-content:center;height:1.5rem;width:1.5rem}html.theme--documenter-dark .icon.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.icon{height:1rem;width:1rem}html.theme--documenter-dark .icon.is-medium{height:2rem;width:2rem}html.theme--documenter-dark .icon.is-large{height:3rem;width:3rem}html.theme--documenter-dark .image,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img{display:block;position:relative}html.theme--documenter-dark .image img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img img{display:block;height:auto;width:100%}html.theme--documenter-dark .image img.is-rounded,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img img.is-rounded{border-radius:290486px}html.theme--documenter-dark .image.is-square img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square img,html.theme--documenter-dark .image.is-square .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,html.theme--documenter-dark .image.is-1by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 img,html.theme--documenter-dark .image.is-1by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,html.theme--documenter-dark .image.is-5by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 img,html.theme--documenter-dark .image.is-5by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,html.theme--documenter-dark .image.is-4by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 img,html.theme--documenter-dark .image.is-4by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,html.theme--documenter-dark .image.is-3by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 img,html.theme--documenter-dark .image.is-3by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,html.theme--documenter-dark .image.is-5by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 img,html.theme--documenter-dark .image.is-5by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,html.theme--documenter-dark .image.is-16by9 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 img,html.theme--documenter-dark .image.is-16by9 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,html.theme--documenter-dark .image.is-2by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 img,html.theme--documenter-dark .image.is-2by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,html.theme--documenter-dark .image.is-3by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 img,html.theme--documenter-dark .image.is-3by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,html.theme--documenter-dark .image.is-4by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 img,html.theme--documenter-dark .image.is-4by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,html.theme--documenter-dark .image.is-3by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 img,html.theme--documenter-dark .image.is-3by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,html.theme--documenter-dark .image.is-2by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 img,html.theme--documenter-dark .image.is-2by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,html.theme--documenter-dark .image.is-3by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 img,html.theme--documenter-dark .image.is-3by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,html.theme--documenter-dark .image.is-9by16 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 img,html.theme--documenter-dark .image.is-9by16 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,html.theme--documenter-dark .image.is-1by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 img,html.theme--documenter-dark .image.is-1by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,html.theme--documenter-dark .image.is-1by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 img,html.theme--documenter-dark .image.is-1by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio{height:100%;width:100%}html.theme--documenter-dark .image.is-square,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square,html.theme--documenter-dark .image.is-1by1,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1{padding-top:100%}html.theme--documenter-dark .image.is-5by4,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4{padding-top:80%}html.theme--documenter-dark .image.is-4by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3{padding-top:75%}html.theme--documenter-dark .image.is-3by2,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2{padding-top:66.6666%}html.theme--documenter-dark .image.is-5by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3{padding-top:60%}html.theme--documenter-dark .image.is-16by9,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9{padding-top:56.25%}html.theme--documenter-dark .image.is-2by1,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1{padding-top:50%}html.theme--documenter-dark .image.is-3by1,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1{padding-top:33.3333%}html.theme--documenter-dark .image.is-4by5,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5{padding-top:125%}html.theme--documenter-dark .image.is-3by4,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4{padding-top:133.3333%}html.theme--documenter-dark .image.is-2by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3{padding-top:150%}html.theme--documenter-dark .image.is-3by5,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5{padding-top:166.6666%}html.theme--documenter-dark .image.is-9by16,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16{padding-top:177.7777%}html.theme--documenter-dark .image.is-1by2,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2{padding-top:200%}html.theme--documenter-dark .image.is-1by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3{padding-top:300%}html.theme--documenter-dark .image.is-16x16,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16x16{height:16px;width:16px}html.theme--documenter-dark .image.is-24x24,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-24x24{height:24px;width:24px}html.theme--documenter-dark .image.is-32x32,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-32x32{height:32px;width:32px}html.theme--documenter-dark .image.is-48x48,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-48x48{height:48px;width:48px}html.theme--documenter-dark .image.is-64x64,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-64x64{height:64px;width:64px}html.theme--documenter-dark .image.is-96x96,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-96x96{height:96px;width:96px}html.theme--documenter-dark .image.is-128x128,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-128x128{height:128px;width:128px}html.theme--documenter-dark .notification{background-color:#282f2f;border-radius:.4em;padding:1.25rem 2.5rem 1.25rem 1.5rem;position:relative}html.theme--documenter-dark .notification a:not(.button):not(.dropdown-item){color:currentColor;text-decoration:underline}html.theme--documenter-dark .notification strong{color:currentColor}html.theme--documenter-dark .notification code,html.theme--documenter-dark .notification pre{background:#fff}html.theme--documenter-dark .notification pre code{background:transparent}html.theme--documenter-dark .notification>.delete{position:absolute;right:0.5rem;top:0.5rem}html.theme--documenter-dark .notification .title,html.theme--documenter-dark .notification .subtitle,html.theme--documenter-dark .notification .content{color:currentColor}html.theme--documenter-dark .notification.is-white{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .notification.is-black{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .notification.is-light{background-color:#ecf0f1;color:#282f2f}html.theme--documenter-dark .notification.is-dark,html.theme--documenter-dark .content kbd.notification{background-color:#282f2f;color:#ecf0f1}html.theme--documenter-dark .notification.is-primary,html.theme--documenter-dark .docstring>section>a.notification.docs-sourcelink{background-color:#375a7f;color:#fff}html.theme--documenter-dark .notification.is-link{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .notification.is-info{background-color:#024c7d;color:#fff}html.theme--documenter-dark .notification.is-success{background-color:#008438;color:#fff}html.theme--documenter-dark .notification.is-warning{background-color:#ad8100;color:#fff}html.theme--documenter-dark .notification.is-danger{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .progress{-moz-appearance:none;-webkit-appearance:none;border:none;border-radius:290486px;display:block;height:15px;overflow:hidden;padding:0;width:100%}html.theme--documenter-dark .progress::-webkit-progress-bar{background-color:#5e6d6f}html.theme--documenter-dark .progress::-webkit-progress-value{background-color:#dbdee0}html.theme--documenter-dark .progress::-moz-progress-bar{background-color:#dbdee0}html.theme--documenter-dark .progress::-ms-fill{background-color:#dbdee0;border:none}html.theme--documenter-dark .progress.is-white::-webkit-progress-value{background-color:#fff}html.theme--documenter-dark .progress.is-white::-moz-progress-bar{background-color:#fff}html.theme--documenter-dark .progress.is-white::-ms-fill{background-color:#fff}html.theme--documenter-dark .progress.is-white:indeterminate{background-image:linear-gradient(to right, #fff 30%, #5e6d6f 30%)}html.theme--documenter-dark .progress.is-black::-webkit-progress-value{background-color:#0a0a0a}html.theme--documenter-dark .progress.is-black::-moz-progress-bar{background-color:#0a0a0a}html.theme--documenter-dark .progress.is-black::-ms-fill{background-color:#0a0a0a}html.theme--documenter-dark .progress.is-black:indeterminate{background-image:linear-gradient(to right, #0a0a0a 30%, #5e6d6f 30%)}html.theme--documenter-dark .progress.is-light::-webkit-progress-value{background-color:#ecf0f1}html.theme--documenter-dark .progress.is-light::-moz-progress-bar{background-color:#ecf0f1}html.theme--documenter-dark .progress.is-light::-ms-fill{background-color:#ecf0f1}html.theme--documenter-dark .progress.is-light:indeterminate{background-image:linear-gradient(to right, #ecf0f1 30%, #5e6d6f 30%)}html.theme--documenter-dark .progress.is-dark::-webkit-progress-value,html.theme--documenter-dark .content kbd.progress::-webkit-progress-value{background-color:#282f2f}html.theme--documenter-dark .progress.is-dark::-moz-progress-bar,html.theme--documenter-dark .content kbd.progress::-moz-progress-bar{background-color:#282f2f}html.theme--documenter-dark .progress.is-dark::-ms-fill,html.theme--documenter-dark .content kbd.progress::-ms-fill{background-color:#282f2f}html.theme--documenter-dark .progress.is-dark:indeterminate,html.theme--documenter-dark .content kbd.progress:indeterminate{background-image:linear-gradient(to right, #282f2f 30%, #5e6d6f 30%)}html.theme--documenter-dark .progress.is-primary::-webkit-progress-value,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink::-webkit-progress-value{background-color:#375a7f}html.theme--documenter-dark .progress.is-primary::-moz-progress-bar,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink::-moz-progress-bar{background-color:#375a7f}html.theme--documenter-dark .progress.is-primary::-ms-fill,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink::-ms-fill{background-color:#375a7f}html.theme--documenter-dark .progress.is-primary:indeterminate,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink:indeterminate{background-image:linear-gradient(to right, #375a7f 30%, #5e6d6f 30%)}html.theme--documenter-dark .progress.is-link::-webkit-progress-value{background-color:#1abc9c}html.theme--documenter-dark .progress.is-link::-moz-progress-bar{background-color:#1abc9c}html.theme--documenter-dark .progress.is-link::-ms-fill{background-color:#1abc9c}html.theme--documenter-dark .progress.is-link:indeterminate{background-image:linear-gradient(to right, #1abc9c 30%, #5e6d6f 30%)}html.theme--documenter-dark .progress.is-info::-webkit-progress-value{background-color:#024c7d}html.theme--documenter-dark .progress.is-info::-moz-progress-bar{background-color:#024c7d}html.theme--documenter-dark .progress.is-info::-ms-fill{background-color:#024c7d}html.theme--documenter-dark .progress.is-info:indeterminate{background-image:linear-gradient(to right, #024c7d 30%, #5e6d6f 30%)}html.theme--documenter-dark .progress.is-success::-webkit-progress-value{background-color:#008438}html.theme--documenter-dark .progress.is-success::-moz-progress-bar{background-color:#008438}html.theme--documenter-dark .progress.is-success::-ms-fill{background-color:#008438}html.theme--documenter-dark .progress.is-success:indeterminate{background-image:linear-gradient(to right, #008438 30%, #5e6d6f 30%)}html.theme--documenter-dark .progress.is-warning::-webkit-progress-value{background-color:#ad8100}html.theme--documenter-dark .progress.is-warning::-moz-progress-bar{background-color:#ad8100}html.theme--documenter-dark .progress.is-warning::-ms-fill{background-color:#ad8100}html.theme--documenter-dark .progress.is-warning:indeterminate{background-image:linear-gradient(to right, #ad8100 30%, #5e6d6f 30%)}html.theme--documenter-dark .progress.is-danger::-webkit-progress-value{background-color:#9e1b0d}html.theme--documenter-dark .progress.is-danger::-moz-progress-bar{background-color:#9e1b0d}html.theme--documenter-dark .progress.is-danger::-ms-fill{background-color:#9e1b0d}html.theme--documenter-dark .progress.is-danger:indeterminate{background-image:linear-gradient(to right, #9e1b0d 30%, #5e6d6f 30%)}html.theme--documenter-dark .progress:indeterminate{animation-duration:1.5s;animation-iteration-count:infinite;animation-name:moveIndeterminate;animation-timing-function:linear;background-color:#5e6d6f;background-image:linear-gradient(to right, #fff 30%, #5e6d6f 30%);background-position:top left;background-repeat:no-repeat;background-size:150% 150%}html.theme--documenter-dark .progress:indeterminate::-webkit-progress-bar{background-color:transparent}html.theme--documenter-dark .progress:indeterminate::-moz-progress-bar{background-color:transparent}html.theme--documenter-dark .progress.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.progress{height:.85em}html.theme--documenter-dark .progress.is-medium{height:1.25rem}html.theme--documenter-dark .progress.is-large{height:1.5rem}@keyframes moveIndeterminate{from{background-position:200% 0}to{background-position:-200% 0}}html.theme--documenter-dark .table{background-color:#343c3d;color:#fff}html.theme--documenter-dark .table td,html.theme--documenter-dark .table th{border:1px solid #5e6d6f;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}html.theme--documenter-dark .table td.is-white,html.theme--documenter-dark .table th.is-white{background-color:#fff;border-color:#fff;color:#0a0a0a}html.theme--documenter-dark .table td.is-black,html.theme--documenter-dark .table th.is-black{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}html.theme--documenter-dark .table td.is-light,html.theme--documenter-dark .table th.is-light{background-color:#ecf0f1;border-color:#ecf0f1;color:#282f2f}html.theme--documenter-dark .table td.is-dark,html.theme--documenter-dark .table th.is-dark{background-color:#282f2f;border-color:#282f2f;color:#ecf0f1}html.theme--documenter-dark .table td.is-primary,html.theme--documenter-dark .table th.is-primary{background-color:#375a7f;border-color:#375a7f;color:#fff}html.theme--documenter-dark .table td.is-link,html.theme--documenter-dark .table th.is-link{background-color:#1abc9c;border-color:#1abc9c;color:#fff}html.theme--documenter-dark .table td.is-info,html.theme--documenter-dark .table th.is-info{background-color:#024c7d;border-color:#024c7d;color:#fff}html.theme--documenter-dark .table td.is-success,html.theme--documenter-dark .table th.is-success{background-color:#008438;border-color:#008438;color:#fff}html.theme--documenter-dark .table td.is-warning,html.theme--documenter-dark .table th.is-warning{background-color:#ad8100;border-color:#ad8100;color:#fff}html.theme--documenter-dark .table td.is-danger,html.theme--documenter-dark .table th.is-danger{background-color:#9e1b0d;border-color:#9e1b0d;color:#fff}html.theme--documenter-dark .table td.is-narrow,html.theme--documenter-dark .table th.is-narrow{white-space:nowrap;width:1%}html.theme--documenter-dark .table td.is-selected,html.theme--documenter-dark .table th.is-selected{background-color:#375a7f;color:#fff}html.theme--documenter-dark .table td.is-selected a,html.theme--documenter-dark .table td.is-selected strong,html.theme--documenter-dark .table th.is-selected a,html.theme--documenter-dark .table th.is-selected strong{color:currentColor}html.theme--documenter-dark .table th{color:#f2f2f2}html.theme--documenter-dark .table th:not([align]){text-align:left}html.theme--documenter-dark .table tr.is-selected{background-color:#375a7f;color:#fff}html.theme--documenter-dark .table tr.is-selected a,html.theme--documenter-dark .table tr.is-selected strong{color:currentColor}html.theme--documenter-dark .table tr.is-selected td,html.theme--documenter-dark .table tr.is-selected th{border-color:#fff;color:currentColor}html.theme--documenter-dark .table thead{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .table thead td,html.theme--documenter-dark .table thead th{border-width:0 0 2px;color:#f2f2f2}html.theme--documenter-dark .table tfoot{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .table tfoot td,html.theme--documenter-dark .table tfoot th{border-width:2px 0 0;color:#f2f2f2}html.theme--documenter-dark .table tbody{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .table tbody tr:last-child td,html.theme--documenter-dark .table tbody tr:last-child th{border-bottom-width:0}html.theme--documenter-dark .table.is-bordered td,html.theme--documenter-dark .table.is-bordered th{border-width:1px}html.theme--documenter-dark .table.is-bordered tr:last-child td,html.theme--documenter-dark .table.is-bordered tr:last-child th{border-bottom-width:1px}html.theme--documenter-dark .table.is-fullwidth{width:100%}html.theme--documenter-dark .table.is-hoverable tbody tr:not(.is-selected):hover{background-color:#282f2f}html.theme--documenter-dark .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover{background-color:#282f2f}html.theme--documenter-dark .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(even){background-color:#2d3435}html.theme--documenter-dark .table.is-narrow td,html.theme--documenter-dark .table.is-narrow th{padding:0.25em 0.5em}html.theme--documenter-dark .table.is-striped tbody tr:not(.is-selected):nth-child(even){background-color:#282f2f}html.theme--documenter-dark .table-container{-webkit-overflow-scrolling:touch;overflow:auto;overflow-y:hidden;max-width:100%}html.theme--documenter-dark .tags{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}html.theme--documenter-dark .tags .tag,html.theme--documenter-dark .tags .content kbd,html.theme--documenter-dark .content .tags kbd,html.theme--documenter-dark .tags .docstring>section>a.docs-sourcelink{margin-bottom:0.5rem}html.theme--documenter-dark .tags .tag:not(:last-child),html.theme--documenter-dark .tags .content kbd:not(:last-child),html.theme--documenter-dark .content .tags kbd:not(:last-child),html.theme--documenter-dark .tags .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:0.5rem}html.theme--documenter-dark .tags:last-child{margin-bottom:-0.5rem}html.theme--documenter-dark .tags:not(:last-child){margin-bottom:1rem}html.theme--documenter-dark .tags.are-medium .tag:not(.is-normal):not(.is-large),html.theme--documenter-dark .tags.are-medium .content kbd:not(.is-normal):not(.is-large),html.theme--documenter-dark .content .tags.are-medium kbd:not(.is-normal):not(.is-large),html.theme--documenter-dark .tags.are-medium .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-large){font-size:15px}html.theme--documenter-dark .tags.are-large .tag:not(.is-normal):not(.is-medium),html.theme--documenter-dark .tags.are-large .content kbd:not(.is-normal):not(.is-medium),html.theme--documenter-dark .content .tags.are-large kbd:not(.is-normal):not(.is-medium),html.theme--documenter-dark .tags.are-large .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-medium){font-size:1.25rem}html.theme--documenter-dark .tags.is-centered{justify-content:center}html.theme--documenter-dark .tags.is-centered .tag,html.theme--documenter-dark .tags.is-centered .content kbd,html.theme--documenter-dark .content .tags.is-centered kbd,html.theme--documenter-dark .tags.is-centered .docstring>section>a.docs-sourcelink{margin-right:0.25rem;margin-left:0.25rem}html.theme--documenter-dark .tags.is-right{justify-content:flex-end}html.theme--documenter-dark .tags.is-right .tag:not(:first-child),html.theme--documenter-dark .tags.is-right .content kbd:not(:first-child),html.theme--documenter-dark .content .tags.is-right kbd:not(:first-child),html.theme--documenter-dark .tags.is-right .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0.5rem}html.theme--documenter-dark .tags.is-right .tag:not(:last-child),html.theme--documenter-dark .tags.is-right .content kbd:not(:last-child),html.theme--documenter-dark .content .tags.is-right kbd:not(:last-child),html.theme--documenter-dark .tags.is-right .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:0}html.theme--documenter-dark .tags.has-addons .tag,html.theme--documenter-dark .tags.has-addons .content kbd,html.theme--documenter-dark .content .tags.has-addons kbd,html.theme--documenter-dark .tags.has-addons .docstring>section>a.docs-sourcelink{margin-right:0}html.theme--documenter-dark .tags.has-addons .tag:not(:first-child),html.theme--documenter-dark .tags.has-addons .content kbd:not(:first-child),html.theme--documenter-dark .content .tags.has-addons kbd:not(:first-child),html.theme--documenter-dark .tags.has-addons .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0;border-bottom-left-radius:0;border-top-left-radius:0}html.theme--documenter-dark .tags.has-addons .tag:not(:last-child),html.theme--documenter-dark .tags.has-addons .content kbd:not(:last-child),html.theme--documenter-dark .content .tags.has-addons kbd:not(:last-child),html.theme--documenter-dark .tags.has-addons .docstring>section>a.docs-sourcelink:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}html.theme--documenter-dark .tag:not(body),html.theme--documenter-dark .content kbd:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body){align-items:center;background-color:#282f2f;border-radius:.4em;color:#fff;display:inline-flex;font-size:.85em;height:2em;justify-content:center;line-height:1.5;padding-left:0.75em;padding-right:0.75em;white-space:nowrap}html.theme--documenter-dark .tag:not(body) .delete,html.theme--documenter-dark .content kbd:not(body) .delete,html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .delete{margin-left:0.25rem;margin-right:-0.375rem}html.theme--documenter-dark .tag.is-white:not(body),html.theme--documenter-dark .content kbd.is-white:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-white:not(body){background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .tag.is-black:not(body),html.theme--documenter-dark .content kbd.is-black:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-black:not(body){background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .tag.is-light:not(body),html.theme--documenter-dark .content kbd.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-light:not(body){background-color:#ecf0f1;color:#282f2f}html.theme--documenter-dark .tag.is-dark:not(body),html.theme--documenter-dark .content kbd:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-dark:not(body),html.theme--documenter-dark .content .docstring>section>kbd:not(body){background-color:#282f2f;color:#ecf0f1}html.theme--documenter-dark .tag.is-primary:not(body),html.theme--documenter-dark .content kbd.is-primary:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body){background-color:#375a7f;color:#fff}html.theme--documenter-dark .tag.is-link:not(body),html.theme--documenter-dark .content kbd.is-link:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-link:not(body){background-color:#1abc9c;color:#fff}html.theme--documenter-dark .tag.is-info:not(body),html.theme--documenter-dark .content kbd.is-info:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-info:not(body){background-color:#024c7d;color:#fff}html.theme--documenter-dark .tag.is-success:not(body),html.theme--documenter-dark .content kbd.is-success:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-success:not(body){background-color:#008438;color:#fff}html.theme--documenter-dark .tag.is-warning:not(body),html.theme--documenter-dark .content kbd.is-warning:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-warning:not(body){background-color:#ad8100;color:#fff}html.theme--documenter-dark .tag.is-danger:not(body),html.theme--documenter-dark .content kbd.is-danger:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-danger:not(body){background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .tag.is-normal:not(body),html.theme--documenter-dark .content kbd.is-normal:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-normal:not(body){font-size:.85em}html.theme--documenter-dark .tag.is-medium:not(body),html.theme--documenter-dark .content kbd.is-medium:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-medium:not(body){font-size:15px}html.theme--documenter-dark .tag.is-large:not(body),html.theme--documenter-dark .content kbd.is-large:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-large:not(body){font-size:1.25rem}html.theme--documenter-dark .tag:not(body) .icon:first-child:not(:last-child),html.theme--documenter-dark .content kbd:not(body) .icon:first-child:not(:last-child),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .icon:first-child:not(:last-child){margin-left:-0.375em;margin-right:0.1875em}html.theme--documenter-dark .tag:not(body) .icon:last-child:not(:first-child),html.theme--documenter-dark .content kbd:not(body) .icon:last-child:not(:first-child),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .icon:last-child:not(:first-child){margin-left:0.1875em;margin-right:-0.375em}html.theme--documenter-dark .tag:not(body) .icon:first-child:last-child,html.theme--documenter-dark .content kbd:not(body) .icon:first-child:last-child,html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .icon:first-child:last-child{margin-left:-0.375em;margin-right:-0.375em}html.theme--documenter-dark .tag.is-delete:not(body),html.theme--documenter-dark .content kbd.is-delete:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body){margin-left:1px;padding:0;position:relative;width:2em}html.theme--documenter-dark .tag.is-delete:not(body)::before,html.theme--documenter-dark .content kbd.is-delete:not(body)::before,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::before,html.theme--documenter-dark .tag.is-delete:not(body)::after,html.theme--documenter-dark .content kbd.is-delete:not(body)::after,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::after{background-color:currentColor;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}html.theme--documenter-dark .tag.is-delete:not(body)::before,html.theme--documenter-dark .content kbd.is-delete:not(body)::before,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::before{height:1px;width:50%}html.theme--documenter-dark .tag.is-delete:not(body)::after,html.theme--documenter-dark .content kbd.is-delete:not(body)::after,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::after{height:50%;width:1px}html.theme--documenter-dark .tag.is-delete:not(body):hover,html.theme--documenter-dark .content kbd.is-delete:not(body):hover,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body):hover,html.theme--documenter-dark .tag.is-delete:not(body):focus,html.theme--documenter-dark .content kbd.is-delete:not(body):focus,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body):focus{background-color:#1d2122}html.theme--documenter-dark .tag.is-delete:not(body):active,html.theme--documenter-dark .content kbd.is-delete:not(body):active,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body):active{background-color:#111414}html.theme--documenter-dark .tag.is-rounded:not(body),html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:not(body),html.theme--documenter-dark .content kbd.is-rounded:not(body),html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search>input:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-rounded:not(body){border-radius:290486px}html.theme--documenter-dark a.tag:hover,html.theme--documenter-dark .docstring>section>a.docs-sourcelink:hover{text-decoration:underline}html.theme--documenter-dark .title,html.theme--documenter-dark .subtitle{word-break:break-word}html.theme--documenter-dark .title em,html.theme--documenter-dark .title span,html.theme--documenter-dark .subtitle em,html.theme--documenter-dark .subtitle span{font-weight:inherit}html.theme--documenter-dark .title sub,html.theme--documenter-dark .subtitle sub{font-size:.75em}html.theme--documenter-dark .title sup,html.theme--documenter-dark .subtitle sup{font-size:.75em}html.theme--documenter-dark .title .tag,html.theme--documenter-dark .title .content kbd,html.theme--documenter-dark .content .title kbd,html.theme--documenter-dark .title .docstring>section>a.docs-sourcelink,html.theme--documenter-dark .subtitle .tag,html.theme--documenter-dark .subtitle .content kbd,html.theme--documenter-dark .content .subtitle kbd,html.theme--documenter-dark .subtitle .docstring>section>a.docs-sourcelink{vertical-align:middle}html.theme--documenter-dark .title{color:#fff;font-size:2rem;font-weight:500;line-height:1.125}html.theme--documenter-dark .title strong{color:inherit;font-weight:inherit}html.theme--documenter-dark .title+.highlight{margin-top:-0.75rem}html.theme--documenter-dark .title:not(.is-spaced)+.subtitle{margin-top:-1.25rem}html.theme--documenter-dark .title.is-1{font-size:3rem}html.theme--documenter-dark .title.is-2{font-size:2.5rem}html.theme--documenter-dark .title.is-3{font-size:2rem}html.theme--documenter-dark .title.is-4{font-size:1.5rem}html.theme--documenter-dark .title.is-5{font-size:1.25rem}html.theme--documenter-dark .title.is-6{font-size:15px}html.theme--documenter-dark .title.is-7{font-size:.85em}html.theme--documenter-dark .subtitle{color:#8c9b9d;font-size:1.25rem;font-weight:400;line-height:1.25}html.theme--documenter-dark .subtitle strong{color:#8c9b9d;font-weight:600}html.theme--documenter-dark .subtitle:not(.is-spaced)+.title{margin-top:-1.25rem}html.theme--documenter-dark .subtitle.is-1{font-size:3rem}html.theme--documenter-dark .subtitle.is-2{font-size:2.5rem}html.theme--documenter-dark .subtitle.is-3{font-size:2rem}html.theme--documenter-dark .subtitle.is-4{font-size:1.5rem}html.theme--documenter-dark .subtitle.is-5{font-size:1.25rem}html.theme--documenter-dark .subtitle.is-6{font-size:15px}html.theme--documenter-dark .subtitle.is-7{font-size:.85em}html.theme--documenter-dark .heading{display:block;font-size:11px;letter-spacing:1px;margin-bottom:5px;text-transform:uppercase}html.theme--documenter-dark .highlight{font-weight:400;max-width:100%;overflow:hidden;padding:0}html.theme--documenter-dark .highlight pre{overflow:auto;max-width:100%}html.theme--documenter-dark .number{align-items:center;background-color:#282f2f;border-radius:290486px;display:inline-flex;font-size:1.25rem;height:2em;justify-content:center;margin-right:1.5rem;min-width:2.5em;padding:0.25rem 0.5rem;text-align:center;vertical-align:top}html.theme--documenter-dark .select select,html.theme--documenter-dark .textarea,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{background-color:#1f2424;border-color:#5e6d6f;border-radius:.4em;color:#dbdee0}html.theme--documenter-dark .select select::-moz-placeholder,html.theme--documenter-dark .textarea::-moz-placeholder,html.theme--documenter-dark .input::-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-moz-placeholder{color:rgba(219,222,224,0.3)}html.theme--documenter-dark .select select::-webkit-input-placeholder,html.theme--documenter-dark .textarea::-webkit-input-placeholder,html.theme--documenter-dark .input::-webkit-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder{color:rgba(219,222,224,0.3)}html.theme--documenter-dark .select select:-moz-placeholder,html.theme--documenter-dark .textarea:-moz-placeholder,html.theme--documenter-dark .input:-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-moz-placeholder{color:rgba(219,222,224,0.3)}html.theme--documenter-dark .select select:-ms-input-placeholder,html.theme--documenter-dark .textarea:-ms-input-placeholder,html.theme--documenter-dark .input:-ms-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder{color:rgba(219,222,224,0.3)}html.theme--documenter-dark .select select:hover,html.theme--documenter-dark .textarea:hover,html.theme--documenter-dark .input:hover,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:hover,html.theme--documenter-dark .select select.is-hovered,html.theme--documenter-dark .is-hovered.textarea,html.theme--documenter-dark .is-hovered.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-hovered{border-color:#8c9b9d}html.theme--documenter-dark .select select:focus,html.theme--documenter-dark .textarea:focus,html.theme--documenter-dark .input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:focus,html.theme--documenter-dark .select select.is-focused,html.theme--documenter-dark .is-focused.textarea,html.theme--documenter-dark .is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .select select:active,html.theme--documenter-dark .textarea:active,html.theme--documenter-dark .input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:active,html.theme--documenter-dark .select select.is-active,html.theme--documenter-dark .is-active.textarea,html.theme--documenter-dark .is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{border-color:#1abc9c;box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .select select[disabled],html.theme--documenter-dark .textarea[disabled],html.theme--documenter-dark .input[disabled],html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled],fieldset[disabled] html.theme--documenter-dark .select select,fieldset[disabled] html.theme--documenter-dark .textarea,fieldset[disabled] html.theme--documenter-dark .input,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{background-color:#8c9b9d;border-color:#282f2f;box-shadow:none;color:#fff}html.theme--documenter-dark .select select[disabled]::-moz-placeholder,html.theme--documenter-dark .textarea[disabled]::-moz-placeholder,html.theme--documenter-dark .input[disabled]::-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .select select::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .input::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-moz-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .select select[disabled]::-webkit-input-placeholder,html.theme--documenter-dark .textarea[disabled]::-webkit-input-placeholder,html.theme--documenter-dark .input[disabled]::-webkit-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark .select select::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark .input::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .select select[disabled]:-moz-placeholder,html.theme--documenter-dark .textarea[disabled]:-moz-placeholder,html.theme--documenter-dark .input[disabled]:-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .select select:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .input:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-moz-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .select select[disabled]:-ms-input-placeholder,html.theme--documenter-dark .textarea[disabled]:-ms-input-placeholder,html.theme--documenter-dark .input[disabled]:-ms-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark .select select:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark .input:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .textarea,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{box-shadow:inset 0 1px 2px rgba(10,10,10,0.1);max-width:100%;width:100%}html.theme--documenter-dark .textarea[readonly],html.theme--documenter-dark .input[readonly],html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[readonly]{box-shadow:none}html.theme--documenter-dark .is-white.textarea,html.theme--documenter-dark .is-white.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-white{border-color:#fff}html.theme--documenter-dark .is-white.textarea:focus,html.theme--documenter-dark .is-white.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-white:focus,html.theme--documenter-dark .is-white.is-focused.textarea,html.theme--documenter-dark .is-white.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-white.textarea:active,html.theme--documenter-dark .is-white.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-white:active,html.theme--documenter-dark .is-white.is-active.textarea,html.theme--documenter-dark .is-white.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}html.theme--documenter-dark .is-black.textarea,html.theme--documenter-dark .is-black.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-black{border-color:#0a0a0a}html.theme--documenter-dark .is-black.textarea:focus,html.theme--documenter-dark .is-black.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-black:focus,html.theme--documenter-dark .is-black.is-focused.textarea,html.theme--documenter-dark .is-black.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-black.textarea:active,html.theme--documenter-dark .is-black.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-black:active,html.theme--documenter-dark .is-black.is-active.textarea,html.theme--documenter-dark .is-black.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}html.theme--documenter-dark .is-light.textarea,html.theme--documenter-dark .is-light.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-light{border-color:#ecf0f1}html.theme--documenter-dark .is-light.textarea:focus,html.theme--documenter-dark .is-light.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-light:focus,html.theme--documenter-dark .is-light.is-focused.textarea,html.theme--documenter-dark .is-light.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-light.textarea:active,html.theme--documenter-dark .is-light.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-light:active,html.theme--documenter-dark .is-light.is-active.textarea,html.theme--documenter-dark .is-light.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(236,240,241,0.25)}html.theme--documenter-dark .is-dark.textarea,html.theme--documenter-dark .content kbd.textarea,html.theme--documenter-dark .is-dark.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-dark,html.theme--documenter-dark .content kbd.input{border-color:#282f2f}html.theme--documenter-dark .is-dark.textarea:focus,html.theme--documenter-dark .content kbd.textarea:focus,html.theme--documenter-dark .is-dark.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-dark:focus,html.theme--documenter-dark .content kbd.input:focus,html.theme--documenter-dark .is-dark.is-focused.textarea,html.theme--documenter-dark .content kbd.is-focused.textarea,html.theme--documenter-dark .is-dark.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .content kbd.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search>input.is-focused,html.theme--documenter-dark .is-dark.textarea:active,html.theme--documenter-dark .content kbd.textarea:active,html.theme--documenter-dark .is-dark.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-dark:active,html.theme--documenter-dark .content kbd.input:active,html.theme--documenter-dark .is-dark.is-active.textarea,html.theme--documenter-dark .content kbd.is-active.textarea,html.theme--documenter-dark .is-dark.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active,html.theme--documenter-dark .content kbd.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(40,47,47,0.25)}html.theme--documenter-dark .is-primary.textarea,html.theme--documenter-dark .docstring>section>a.textarea.docs-sourcelink,html.theme--documenter-dark .is-primary.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-primary,html.theme--documenter-dark .docstring>section>a.input.docs-sourcelink{border-color:#375a7f}html.theme--documenter-dark .is-primary.textarea:focus,html.theme--documenter-dark .docstring>section>a.textarea.docs-sourcelink:focus,html.theme--documenter-dark .is-primary.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-primary:focus,html.theme--documenter-dark .docstring>section>a.input.docs-sourcelink:focus,html.theme--documenter-dark .is-primary.is-focused.textarea,html.theme--documenter-dark .docstring>section>a.is-focused.textarea.docs-sourcelink,html.theme--documenter-dark .is-primary.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .docstring>section>a.is-focused.input.docs-sourcelink,html.theme--documenter-dark .is-primary.textarea:active,html.theme--documenter-dark .docstring>section>a.textarea.docs-sourcelink:active,html.theme--documenter-dark .is-primary.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-primary:active,html.theme--documenter-dark .docstring>section>a.input.docs-sourcelink:active,html.theme--documenter-dark .is-primary.is-active.textarea,html.theme--documenter-dark .docstring>section>a.is-active.textarea.docs-sourcelink,html.theme--documenter-dark .is-primary.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active,html.theme--documenter-dark .docstring>section>a.is-active.input.docs-sourcelink{box-shadow:0 0 0 0.125em rgba(55,90,127,0.25)}html.theme--documenter-dark .is-link.textarea,html.theme--documenter-dark .is-link.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-link{border-color:#1abc9c}html.theme--documenter-dark .is-link.textarea:focus,html.theme--documenter-dark .is-link.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-link:focus,html.theme--documenter-dark .is-link.is-focused.textarea,html.theme--documenter-dark .is-link.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-link.textarea:active,html.theme--documenter-dark .is-link.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-link:active,html.theme--documenter-dark .is-link.is-active.textarea,html.theme--documenter-dark .is-link.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .is-info.textarea,html.theme--documenter-dark .is-info.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-info{border-color:#024c7d}html.theme--documenter-dark .is-info.textarea:focus,html.theme--documenter-dark .is-info.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-info:focus,html.theme--documenter-dark .is-info.is-focused.textarea,html.theme--documenter-dark .is-info.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-info.textarea:active,html.theme--documenter-dark .is-info.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-info:active,html.theme--documenter-dark .is-info.is-active.textarea,html.theme--documenter-dark .is-info.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(2,76,125,0.25)}html.theme--documenter-dark .is-success.textarea,html.theme--documenter-dark .is-success.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-success{border-color:#008438}html.theme--documenter-dark .is-success.textarea:focus,html.theme--documenter-dark .is-success.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-success:focus,html.theme--documenter-dark .is-success.is-focused.textarea,html.theme--documenter-dark .is-success.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-success.textarea:active,html.theme--documenter-dark .is-success.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-success:active,html.theme--documenter-dark .is-success.is-active.textarea,html.theme--documenter-dark .is-success.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(0,132,56,0.25)}html.theme--documenter-dark .is-warning.textarea,html.theme--documenter-dark .is-warning.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-warning{border-color:#ad8100}html.theme--documenter-dark .is-warning.textarea:focus,html.theme--documenter-dark .is-warning.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-warning:focus,html.theme--documenter-dark .is-warning.is-focused.textarea,html.theme--documenter-dark .is-warning.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-warning.textarea:active,html.theme--documenter-dark .is-warning.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-warning:active,html.theme--documenter-dark .is-warning.is-active.textarea,html.theme--documenter-dark .is-warning.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(173,129,0,0.25)}html.theme--documenter-dark .is-danger.textarea,html.theme--documenter-dark .is-danger.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-danger{border-color:#9e1b0d}html.theme--documenter-dark .is-danger.textarea:focus,html.theme--documenter-dark .is-danger.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-danger:focus,html.theme--documenter-dark .is-danger.is-focused.textarea,html.theme--documenter-dark .is-danger.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-danger.textarea:active,html.theme--documenter-dark .is-danger.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-danger:active,html.theme--documenter-dark .is-danger.is-active.textarea,html.theme--documenter-dark .is-danger.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(158,27,13,0.25)}html.theme--documenter-dark .is-small.textarea,html.theme--documenter-dark .is-small.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{border-radius:3px;font-size:.85em}html.theme--documenter-dark .is-medium.textarea,html.theme--documenter-dark .is-medium.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-medium{font-size:1.25rem}html.theme--documenter-dark .is-large.textarea,html.theme--documenter-dark .is-large.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-large{font-size:1.5rem}html.theme--documenter-dark .is-fullwidth.textarea,html.theme--documenter-dark .is-fullwidth.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-fullwidth{display:block;width:100%}html.theme--documenter-dark .is-inline.textarea,html.theme--documenter-dark .is-inline.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-inline{display:inline;width:auto}html.theme--documenter-dark .input.is-rounded,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{border-radius:290486px;padding-left:1em;padding-right:1em}html.theme--documenter-dark .input.is-static,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-static{background-color:transparent;border-color:transparent;box-shadow:none;padding-left:0;padding-right:0}html.theme--documenter-dark .textarea{display:block;max-width:100%;min-width:100%;padding:0.625em;resize:vertical}html.theme--documenter-dark .textarea:not([rows]){max-height:600px;min-height:120px}html.theme--documenter-dark .textarea[rows]{height:initial}html.theme--documenter-dark .textarea.has-fixed-size{resize:none}html.theme--documenter-dark .radio,html.theme--documenter-dark .checkbox{cursor:pointer;display:inline-block;line-height:1.25;position:relative}html.theme--documenter-dark .radio input,html.theme--documenter-dark .checkbox input{cursor:pointer}html.theme--documenter-dark .radio:hover,html.theme--documenter-dark .checkbox:hover{color:#8c9b9d}html.theme--documenter-dark .radio[disabled],html.theme--documenter-dark .checkbox[disabled],fieldset[disabled] html.theme--documenter-dark .radio,fieldset[disabled] html.theme--documenter-dark .checkbox{color:#fff;cursor:not-allowed}html.theme--documenter-dark .radio+.radio{margin-left:0.5em}html.theme--documenter-dark .select{display:inline-block;max-width:100%;position:relative;vertical-align:top}html.theme--documenter-dark .select:not(.is-multiple){height:2.25em}html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading)::after{border-color:#1abc9c;right:1.125em;z-index:4}html.theme--documenter-dark .select.is-rounded select,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.select select{border-radius:290486px;padding-left:1em}html.theme--documenter-dark .select select{cursor:pointer;display:block;font-size:1em;max-width:100%;outline:none}html.theme--documenter-dark .select select::-ms-expand{display:none}html.theme--documenter-dark .select select[disabled]:hover,fieldset[disabled] html.theme--documenter-dark .select select:hover{border-color:#282f2f}html.theme--documenter-dark .select select:not([multiple]){padding-right:2.5em}html.theme--documenter-dark .select select[multiple]{height:auto;padding:0}html.theme--documenter-dark .select select[multiple] option{padding:0.5em 1em}html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading):hover::after{border-color:#8c9b9d}html.theme--documenter-dark .select.is-white:not(:hover)::after{border-color:#fff}html.theme--documenter-dark .select.is-white select{border-color:#fff}html.theme--documenter-dark .select.is-white select:hover,html.theme--documenter-dark .select.is-white select.is-hovered{border-color:#f2f2f2}html.theme--documenter-dark .select.is-white select:focus,html.theme--documenter-dark .select.is-white select.is-focused,html.theme--documenter-dark .select.is-white select:active,html.theme--documenter-dark .select.is-white select.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}html.theme--documenter-dark .select.is-black:not(:hover)::after{border-color:#0a0a0a}html.theme--documenter-dark .select.is-black select{border-color:#0a0a0a}html.theme--documenter-dark .select.is-black select:hover,html.theme--documenter-dark .select.is-black select.is-hovered{border-color:#000}html.theme--documenter-dark .select.is-black select:focus,html.theme--documenter-dark .select.is-black select.is-focused,html.theme--documenter-dark .select.is-black select:active,html.theme--documenter-dark .select.is-black select.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}html.theme--documenter-dark .select.is-light:not(:hover)::after{border-color:#ecf0f1}html.theme--documenter-dark .select.is-light select{border-color:#ecf0f1}html.theme--documenter-dark .select.is-light select:hover,html.theme--documenter-dark .select.is-light select.is-hovered{border-color:#dde4e6}html.theme--documenter-dark .select.is-light select:focus,html.theme--documenter-dark .select.is-light select.is-focused,html.theme--documenter-dark .select.is-light select:active,html.theme--documenter-dark .select.is-light select.is-active{box-shadow:0 0 0 0.125em rgba(236,240,241,0.25)}html.theme--documenter-dark .select.is-dark:not(:hover)::after,html.theme--documenter-dark .content kbd.select:not(:hover)::after{border-color:#282f2f}html.theme--documenter-dark .select.is-dark select,html.theme--documenter-dark .content kbd.select select{border-color:#282f2f}html.theme--documenter-dark .select.is-dark select:hover,html.theme--documenter-dark .content kbd.select select:hover,html.theme--documenter-dark .select.is-dark select.is-hovered,html.theme--documenter-dark .content kbd.select select.is-hovered{border-color:#1d2122}html.theme--documenter-dark .select.is-dark select:focus,html.theme--documenter-dark .content kbd.select select:focus,html.theme--documenter-dark .select.is-dark select.is-focused,html.theme--documenter-dark .content kbd.select select.is-focused,html.theme--documenter-dark .select.is-dark select:active,html.theme--documenter-dark .content kbd.select select:active,html.theme--documenter-dark .select.is-dark select.is-active,html.theme--documenter-dark .content kbd.select select.is-active{box-shadow:0 0 0 0.125em rgba(40,47,47,0.25)}html.theme--documenter-dark .select.is-primary:not(:hover)::after,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink:not(:hover)::after{border-color:#375a7f}html.theme--documenter-dark .select.is-primary select,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select{border-color:#375a7f}html.theme--documenter-dark .select.is-primary select:hover,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select:hover,html.theme--documenter-dark .select.is-primary select.is-hovered,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select.is-hovered{border-color:#2f4d6d}html.theme--documenter-dark .select.is-primary select:focus,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select:focus,html.theme--documenter-dark .select.is-primary select.is-focused,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select.is-focused,html.theme--documenter-dark .select.is-primary select:active,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select:active,html.theme--documenter-dark .select.is-primary select.is-active,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select.is-active{box-shadow:0 0 0 0.125em rgba(55,90,127,0.25)}html.theme--documenter-dark .select.is-link:not(:hover)::after{border-color:#1abc9c}html.theme--documenter-dark .select.is-link select{border-color:#1abc9c}html.theme--documenter-dark .select.is-link select:hover,html.theme--documenter-dark .select.is-link select.is-hovered{border-color:#17a689}html.theme--documenter-dark .select.is-link select:focus,html.theme--documenter-dark .select.is-link select.is-focused,html.theme--documenter-dark .select.is-link select:active,html.theme--documenter-dark .select.is-link select.is-active{box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .select.is-info:not(:hover)::after{border-color:#024c7d}html.theme--documenter-dark .select.is-info select{border-color:#024c7d}html.theme--documenter-dark .select.is-info select:hover,html.theme--documenter-dark .select.is-info select.is-hovered{border-color:#023d64}html.theme--documenter-dark .select.is-info select:focus,html.theme--documenter-dark .select.is-info select.is-focused,html.theme--documenter-dark .select.is-info select:active,html.theme--documenter-dark .select.is-info select.is-active{box-shadow:0 0 0 0.125em rgba(2,76,125,0.25)}html.theme--documenter-dark .select.is-success:not(:hover)::after{border-color:#008438}html.theme--documenter-dark .select.is-success select{border-color:#008438}html.theme--documenter-dark .select.is-success select:hover,html.theme--documenter-dark .select.is-success select.is-hovered{border-color:#006b2d}html.theme--documenter-dark .select.is-success select:focus,html.theme--documenter-dark .select.is-success select.is-focused,html.theme--documenter-dark .select.is-success select:active,html.theme--documenter-dark .select.is-success select.is-active{box-shadow:0 0 0 0.125em rgba(0,132,56,0.25)}html.theme--documenter-dark .select.is-warning:not(:hover)::after{border-color:#ad8100}html.theme--documenter-dark .select.is-warning select{border-color:#ad8100}html.theme--documenter-dark .select.is-warning select:hover,html.theme--documenter-dark .select.is-warning select.is-hovered{border-color:#946e00}html.theme--documenter-dark .select.is-warning select:focus,html.theme--documenter-dark .select.is-warning select.is-focused,html.theme--documenter-dark .select.is-warning select:active,html.theme--documenter-dark .select.is-warning select.is-active{box-shadow:0 0 0 0.125em rgba(173,129,0,0.25)}html.theme--documenter-dark .select.is-danger:not(:hover)::after{border-color:#9e1b0d}html.theme--documenter-dark .select.is-danger select{border-color:#9e1b0d}html.theme--documenter-dark .select.is-danger select:hover,html.theme--documenter-dark .select.is-danger select.is-hovered{border-color:#86170b}html.theme--documenter-dark .select.is-danger select:focus,html.theme--documenter-dark .select.is-danger select.is-focused,html.theme--documenter-dark .select.is-danger select:active,html.theme--documenter-dark .select.is-danger select.is-active{box-shadow:0 0 0 0.125em rgba(158,27,13,0.25)}html.theme--documenter-dark .select.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.select{border-radius:3px;font-size:.85em}html.theme--documenter-dark .select.is-medium{font-size:1.25rem}html.theme--documenter-dark .select.is-large{font-size:1.5rem}html.theme--documenter-dark .select.is-disabled::after{border-color:#fff}html.theme--documenter-dark .select.is-fullwidth{width:100%}html.theme--documenter-dark .select.is-fullwidth select{width:100%}html.theme--documenter-dark .select.is-loading::after{margin-top:0;position:absolute;right:0.625em;top:0.625em;transform:none}html.theme--documenter-dark .select.is-loading.is-small:after,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.85em}html.theme--documenter-dark .select.is-loading.is-medium:after{font-size:1.25rem}html.theme--documenter-dark .select.is-loading.is-large:after{font-size:1.5rem}html.theme--documenter-dark .file{align-items:stretch;display:flex;justify-content:flex-start;position:relative}html.theme--documenter-dark .file.is-white .file-cta{background-color:#fff;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .file.is-white:hover .file-cta,html.theme--documenter-dark .file.is-white.is-hovered .file-cta{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .file.is-white:focus .file-cta,html.theme--documenter-dark .file.is-white.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(255,255,255,0.25);color:#0a0a0a}html.theme--documenter-dark .file.is-white:active .file-cta,html.theme--documenter-dark .file.is-white.is-active .file-cta{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .file.is-black .file-cta{background-color:#0a0a0a;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-black:hover .file-cta,html.theme--documenter-dark .file.is-black.is-hovered .file-cta{background-color:#040404;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-black:focus .file-cta,html.theme--documenter-dark .file.is-black.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(10,10,10,0.25);color:#fff}html.theme--documenter-dark .file.is-black:active .file-cta,html.theme--documenter-dark .file.is-black.is-active .file-cta{background-color:#000;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-light .file-cta{background-color:#ecf0f1;border-color:transparent;color:#282f2f}html.theme--documenter-dark .file.is-light:hover .file-cta,html.theme--documenter-dark .file.is-light.is-hovered .file-cta{background-color:#e5eaec;border-color:transparent;color:#282f2f}html.theme--documenter-dark .file.is-light:focus .file-cta,html.theme--documenter-dark .file.is-light.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(236,240,241,0.25);color:#282f2f}html.theme--documenter-dark .file.is-light:active .file-cta,html.theme--documenter-dark .file.is-light.is-active .file-cta{background-color:#dde4e6;border-color:transparent;color:#282f2f}html.theme--documenter-dark .file.is-dark .file-cta,html.theme--documenter-dark .content kbd.file .file-cta{background-color:#282f2f;border-color:transparent;color:#ecf0f1}html.theme--documenter-dark .file.is-dark:hover .file-cta,html.theme--documenter-dark .content kbd.file:hover .file-cta,html.theme--documenter-dark .file.is-dark.is-hovered .file-cta,html.theme--documenter-dark .content kbd.file.is-hovered .file-cta{background-color:#232829;border-color:transparent;color:#ecf0f1}html.theme--documenter-dark .file.is-dark:focus .file-cta,html.theme--documenter-dark .content kbd.file:focus .file-cta,html.theme--documenter-dark .file.is-dark.is-focused .file-cta,html.theme--documenter-dark .content kbd.file.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(40,47,47,0.25);color:#ecf0f1}html.theme--documenter-dark .file.is-dark:active .file-cta,html.theme--documenter-dark .content kbd.file:active .file-cta,html.theme--documenter-dark .file.is-dark.is-active .file-cta,html.theme--documenter-dark .content kbd.file.is-active .file-cta{background-color:#1d2122;border-color:transparent;color:#ecf0f1}html.theme--documenter-dark .file.is-primary .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink .file-cta{background-color:#375a7f;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-primary:hover .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink:hover .file-cta,html.theme--documenter-dark .file.is-primary.is-hovered .file-cta,html.theme--documenter-dark .docstring>section>a.file.is-hovered.docs-sourcelink .file-cta{background-color:#335476;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-primary:focus .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink:focus .file-cta,html.theme--documenter-dark .file.is-primary.is-focused .file-cta,html.theme--documenter-dark .docstring>section>a.file.is-focused.docs-sourcelink .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(55,90,127,0.25);color:#fff}html.theme--documenter-dark .file.is-primary:active .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink:active .file-cta,html.theme--documenter-dark .file.is-primary.is-active .file-cta,html.theme--documenter-dark .docstring>section>a.file.is-active.docs-sourcelink .file-cta{background-color:#2f4d6d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-link .file-cta{background-color:#1abc9c;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-link:hover .file-cta,html.theme--documenter-dark .file.is-link.is-hovered .file-cta{background-color:#18b193;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-link:focus .file-cta,html.theme--documenter-dark .file.is-link.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(26,188,156,0.25);color:#fff}html.theme--documenter-dark .file.is-link:active .file-cta,html.theme--documenter-dark .file.is-link.is-active .file-cta{background-color:#17a689;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-info .file-cta{background-color:#024c7d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-info:hover .file-cta,html.theme--documenter-dark .file.is-info.is-hovered .file-cta{background-color:#024470;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-info:focus .file-cta,html.theme--documenter-dark .file.is-info.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(2,76,125,0.25);color:#fff}html.theme--documenter-dark .file.is-info:active .file-cta,html.theme--documenter-dark .file.is-info.is-active .file-cta{background-color:#023d64;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-success .file-cta{background-color:#008438;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-success:hover .file-cta,html.theme--documenter-dark .file.is-success.is-hovered .file-cta{background-color:#073;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-success:focus .file-cta,html.theme--documenter-dark .file.is-success.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(0,132,56,0.25);color:#fff}html.theme--documenter-dark .file.is-success:active .file-cta,html.theme--documenter-dark .file.is-success.is-active .file-cta{background-color:#006b2d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-warning .file-cta{background-color:#ad8100;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-warning:hover .file-cta,html.theme--documenter-dark .file.is-warning.is-hovered .file-cta{background-color:#a07700;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-warning:focus .file-cta,html.theme--documenter-dark .file.is-warning.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(173,129,0,0.25);color:#fff}html.theme--documenter-dark .file.is-warning:active .file-cta,html.theme--documenter-dark .file.is-warning.is-active .file-cta{background-color:#946e00;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-danger .file-cta{background-color:#9e1b0d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-danger:hover .file-cta,html.theme--documenter-dark .file.is-danger.is-hovered .file-cta{background-color:#92190c;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-danger:focus .file-cta,html.theme--documenter-dark .file.is-danger.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(158,27,13,0.25);color:#fff}html.theme--documenter-dark .file.is-danger:active .file-cta,html.theme--documenter-dark .file.is-danger.is-active .file-cta{background-color:#86170b;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.file{font-size:.85em}html.theme--documenter-dark .file.is-medium{font-size:1.25rem}html.theme--documenter-dark .file.is-medium .file-icon .fa{font-size:21px}html.theme--documenter-dark .file.is-large{font-size:1.5rem}html.theme--documenter-dark .file.is-large .file-icon .fa{font-size:28px}html.theme--documenter-dark .file.has-name .file-cta{border-bottom-right-radius:0;border-top-right-radius:0}html.theme--documenter-dark .file.has-name .file-name{border-bottom-left-radius:0;border-top-left-radius:0}html.theme--documenter-dark .file.has-name.is-empty .file-cta{border-radius:.4em}html.theme--documenter-dark .file.has-name.is-empty .file-name{display:none}html.theme--documenter-dark .file.is-boxed .file-label{flex-direction:column}html.theme--documenter-dark .file.is-boxed .file-cta{flex-direction:column;height:auto;padding:1em 3em}html.theme--documenter-dark .file.is-boxed .file-name{border-width:0 1px 1px}html.theme--documenter-dark .file.is-boxed .file-icon{height:1.5em;width:1.5em}html.theme--documenter-dark .file.is-boxed .file-icon .fa{font-size:21px}html.theme--documenter-dark .file.is-boxed.is-small .file-icon .fa,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-boxed .file-icon .fa{font-size:14px}html.theme--documenter-dark .file.is-boxed.is-medium .file-icon .fa{font-size:28px}html.theme--documenter-dark .file.is-boxed.is-large .file-icon .fa{font-size:35px}html.theme--documenter-dark .file.is-boxed.has-name .file-cta{border-radius:.4em .4em 0 0}html.theme--documenter-dark .file.is-boxed.has-name .file-name{border-radius:0 0 .4em .4em;border-width:0 1px 1px}html.theme--documenter-dark .file.is-centered{justify-content:center}html.theme--documenter-dark .file.is-fullwidth .file-label{width:100%}html.theme--documenter-dark .file.is-fullwidth .file-name{flex-grow:1;max-width:none}html.theme--documenter-dark .file.is-right{justify-content:flex-end}html.theme--documenter-dark .file.is-right .file-cta{border-radius:0 .4em .4em 0}html.theme--documenter-dark .file.is-right .file-name{border-radius:.4em 0 0 .4em;border-width:1px 0 1px 1px;order:-1}html.theme--documenter-dark .file-label{align-items:stretch;display:flex;cursor:pointer;justify-content:flex-start;overflow:hidden;position:relative}html.theme--documenter-dark .file-label:hover .file-cta{background-color:#e5eaec;color:#282f2f}html.theme--documenter-dark .file-label:hover .file-name{border-color:#596668}html.theme--documenter-dark .file-label:active .file-cta{background-color:#dde4e6;color:#282f2f}html.theme--documenter-dark .file-label:active .file-name{border-color:#535f61}html.theme--documenter-dark .file-input{height:100%;left:0;opacity:0;outline:none;position:absolute;top:0;width:100%}html.theme--documenter-dark .file-cta,html.theme--documenter-dark .file-name{border-color:#5e6d6f;border-radius:.4em;font-size:1em;padding-left:1em;padding-right:1em;white-space:nowrap}html.theme--documenter-dark .file-cta{background-color:#ecf0f1;color:#343c3d}html.theme--documenter-dark .file-name{border-color:#5e6d6f;border-style:solid;border-width:1px 1px 1px 0;display:block;max-width:16em;overflow:hidden;text-align:left;text-overflow:ellipsis}html.theme--documenter-dark .file-icon{align-items:center;display:flex;height:1em;justify-content:center;margin-right:0.5em;width:1em}html.theme--documenter-dark .file-icon .fa{font-size:14px}html.theme--documenter-dark .label{color:#282f2f;display:block;font-size:15px;font-weight:700}html.theme--documenter-dark .label:not(:last-child){margin-bottom:0.5em}html.theme--documenter-dark .label.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.label{font-size:.85em}html.theme--documenter-dark .label.is-medium{font-size:1.25rem}html.theme--documenter-dark .label.is-large{font-size:1.5rem}html.theme--documenter-dark .help{display:block;font-size:.85em;margin-top:0.25rem}html.theme--documenter-dark .help.is-white{color:#fff}html.theme--documenter-dark .help.is-black{color:#0a0a0a}html.theme--documenter-dark .help.is-light{color:#ecf0f1}html.theme--documenter-dark .help.is-dark,html.theme--documenter-dark .content kbd.help{color:#282f2f}html.theme--documenter-dark .help.is-primary,html.theme--documenter-dark .docstring>section>a.help.docs-sourcelink{color:#375a7f}html.theme--documenter-dark .help.is-link{color:#1abc9c}html.theme--documenter-dark .help.is-info{color:#024c7d}html.theme--documenter-dark .help.is-success{color:#008438}html.theme--documenter-dark .help.is-warning{color:#ad8100}html.theme--documenter-dark .help.is-danger{color:#9e1b0d}html.theme--documenter-dark .field:not(:last-child){margin-bottom:0.75rem}html.theme--documenter-dark .field.has-addons{display:flex;justify-content:flex-start}html.theme--documenter-dark .field.has-addons .control:not(:last-child){margin-right:-1px}html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .button,html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .input,html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:not(:first-child):not(:last-child) form.docs-search>input,html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .select select{border-radius:0}html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .button,html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .input,html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:first-child:not(:only-child) form.docs-search>input,html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .select select{border-bottom-right-radius:0;border-top-right-radius:0}html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .button,html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .input,html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:last-child:not(:only-child) form.docs-search>input,html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .select select{border-bottom-left-radius:0;border-top-left-radius:0}html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .button.is-hovered:not([disabled]),html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .input.is-hovered:not([disabled]),html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-hovered:not([disabled]),html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-hovered:not([disabled]),html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .select select.is-hovered:not([disabled]){z-index:2}html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control .button.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control .button.is-active:not([disabled]),html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control .input.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]),html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control .input.is-active:not([disabled]),html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]),html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]),html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control .select select.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control .select select.is-active:not([disabled]){z-index:3}html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control .button.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control .button.is-active:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus:hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control .input.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]):hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active:hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control .input.is-active:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]):hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control .select select.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control .select select.is-active:not([disabled]):hover{z-index:4}html.theme--documenter-dark .field.has-addons .control.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .field.has-addons.has-addons-centered{justify-content:center}html.theme--documenter-dark .field.has-addons.has-addons-right{justify-content:flex-end}html.theme--documenter-dark .field.has-addons.has-addons-fullwidth .control{flex-grow:1;flex-shrink:0}html.theme--documenter-dark .field.is-grouped{display:flex;justify-content:flex-start}html.theme--documenter-dark .field.is-grouped>.control{flex-shrink:0}html.theme--documenter-dark .field.is-grouped>.control:not(:last-child){margin-bottom:0;margin-right:0.75rem}html.theme--documenter-dark .field.is-grouped>.control.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .field.is-grouped.is-grouped-centered{justify-content:center}html.theme--documenter-dark .field.is-grouped.is-grouped-right{justify-content:flex-end}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline{flex-wrap:wrap}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline>.control:last-child,html.theme--documenter-dark .field.is-grouped.is-grouped-multiline>.control:not(:last-child){margin-bottom:0.75rem}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline:last-child{margin-bottom:-0.75rem}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline:not(:last-child){margin-bottom:0}@media screen and (min-width: 769px),print{html.theme--documenter-dark .field.is-horizontal{display:flex}}html.theme--documenter-dark .field-label .label{font-size:inherit}@media screen and (max-width: 768px){html.theme--documenter-dark .field-label{margin-bottom:0.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .field-label{flex-basis:0;flex-grow:1;flex-shrink:0;margin-right:1.5rem;text-align:right}html.theme--documenter-dark .field-label.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.field-label{font-size:.85em;padding-top:0.375em}html.theme--documenter-dark .field-label.is-normal{padding-top:0.375em}html.theme--documenter-dark .field-label.is-medium{font-size:1.25rem;padding-top:0.375em}html.theme--documenter-dark .field-label.is-large{font-size:1.5rem;padding-top:0.375em}}html.theme--documenter-dark .field-body .field .field{margin-bottom:0}@media screen and (min-width: 769px),print{html.theme--documenter-dark .field-body{display:flex;flex-basis:0;flex-grow:5;flex-shrink:1}html.theme--documenter-dark .field-body .field{margin-bottom:0}html.theme--documenter-dark .field-body>.field{flex-shrink:1}html.theme--documenter-dark .field-body>.field:not(.is-narrow){flex-grow:1}html.theme--documenter-dark .field-body>.field:not(:last-child){margin-right:0.75rem}}html.theme--documenter-dark .control{box-sizing:border-box;clear:both;font-size:15px;position:relative;text-align:left}html.theme--documenter-dark .control.has-icons-left .input:focus~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input:focus~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input:focus~.icon,html.theme--documenter-dark .control.has-icons-left .select:focus~.icon,html.theme--documenter-dark .control.has-icons-right .input:focus~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input:focus~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input:focus~.icon,html.theme--documenter-dark .control.has-icons-right .select:focus~.icon{color:#5e6d6f}html.theme--documenter-dark .control.has-icons-left .input.is-small~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input~.icon,html.theme--documenter-dark .control.has-icons-left .select.is-small~.icon,html.theme--documenter-dark .control.has-icons-right .input.is-small~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input~.icon,html.theme--documenter-dark .control.has-icons-right .select.is-small~.icon{font-size:.85em}html.theme--documenter-dark .control.has-icons-left .input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-left .select.is-medium~.icon,html.theme--documenter-dark .control.has-icons-right .input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-right .select.is-medium~.icon{font-size:1.25rem}html.theme--documenter-dark .control.has-icons-left .input.is-large~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-large~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-large~.icon,html.theme--documenter-dark .control.has-icons-left .select.is-large~.icon,html.theme--documenter-dark .control.has-icons-right .input.is-large~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-large~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-large~.icon,html.theme--documenter-dark .control.has-icons-right .select.is-large~.icon{font-size:1.5rem}html.theme--documenter-dark .control.has-icons-left .icon,html.theme--documenter-dark .control.has-icons-right .icon{color:#dbdee0;height:2.25em;pointer-events:none;position:absolute;top:0;width:2.25em;z-index:4}html.theme--documenter-dark .control.has-icons-left .input,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input,html.theme--documenter-dark .control.has-icons-left .select select{padding-left:2.25em}html.theme--documenter-dark .control.has-icons-left .icon.is-left{left:0}html.theme--documenter-dark .control.has-icons-right .input,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input,html.theme--documenter-dark .control.has-icons-right .select select{padding-right:2.25em}html.theme--documenter-dark .control.has-icons-right .icon.is-right{right:0}html.theme--documenter-dark .control.is-loading::after{position:absolute !important;right:0.625em;top:0.625em;z-index:4}html.theme--documenter-dark .control.is-loading.is-small:after,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.85em}html.theme--documenter-dark .control.is-loading.is-medium:after{font-size:1.25rem}html.theme--documenter-dark .control.is-loading.is-large:after{font-size:1.5rem}html.theme--documenter-dark .breadcrumb{font-size:15px;white-space:nowrap}html.theme--documenter-dark .breadcrumb a{align-items:center;color:#1abc9c;display:flex;justify-content:center;padding:0 .75em}html.theme--documenter-dark .breadcrumb a:hover{color:#1dd2af}html.theme--documenter-dark .breadcrumb li{align-items:center;display:flex}html.theme--documenter-dark .breadcrumb li:first-child a{padding-left:0}html.theme--documenter-dark .breadcrumb li.is-active a{color:#f2f2f2;cursor:default;pointer-events:none}html.theme--documenter-dark .breadcrumb li+li::before{color:#8c9b9d;content:"\0002f"}html.theme--documenter-dark .breadcrumb ul,html.theme--documenter-dark .breadcrumb ol{align-items:flex-start;display:flex;flex-wrap:wrap;justify-content:flex-start}html.theme--documenter-dark .breadcrumb .icon:first-child{margin-right:0.5em}html.theme--documenter-dark .breadcrumb .icon:last-child{margin-left:0.5em}html.theme--documenter-dark .breadcrumb.is-centered ol,html.theme--documenter-dark .breadcrumb.is-centered ul{justify-content:center}html.theme--documenter-dark .breadcrumb.is-right ol,html.theme--documenter-dark .breadcrumb.is-right ul{justify-content:flex-end}html.theme--documenter-dark .breadcrumb.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.breadcrumb{font-size:.85em}html.theme--documenter-dark .breadcrumb.is-medium{font-size:1.25rem}html.theme--documenter-dark .breadcrumb.is-large{font-size:1.5rem}html.theme--documenter-dark .breadcrumb.has-arrow-separator li+li::before{content:"\02192"}html.theme--documenter-dark .breadcrumb.has-bullet-separator li+li::before{content:"\02022"}html.theme--documenter-dark .breadcrumb.has-dot-separator li+li::before{content:"\000b7"}html.theme--documenter-dark .breadcrumb.has-succeeds-separator li+li::before{content:"\0227B"}html.theme--documenter-dark .card{background-color:#fff;box-shadow:0 2px 3px rgba(10,10,10,0.1),0 0 0 1px rgba(10,10,10,0.1);color:#fff;max-width:100%;position:relative}html.theme--documenter-dark .card-header{background-color:rgba(0,0,0,0);align-items:stretch;box-shadow:0 1px 2px rgba(10,10,10,0.1);display:flex}html.theme--documenter-dark .card-header-title{align-items:center;color:#f2f2f2;display:flex;flex-grow:1;font-weight:700;padding:.75rem}html.theme--documenter-dark .card-header-title.is-centered{justify-content:center}html.theme--documenter-dark .card-header-icon{align-items:center;cursor:pointer;display:flex;justify-content:center;padding:.75rem}html.theme--documenter-dark .card-image{display:block;position:relative}html.theme--documenter-dark .card-content{background-color:rgba(0,0,0,0);padding:1.5rem}html.theme--documenter-dark .card-footer{background-color:rgba(0,0,0,0);border-top:1px solid #5e6d6f;align-items:stretch;display:flex}html.theme--documenter-dark .card-footer-item{align-items:center;display:flex;flex-basis:0;flex-grow:1;flex-shrink:0;justify-content:center;padding:.75rem}html.theme--documenter-dark .card-footer-item:not(:last-child){border-right:1px solid #5e6d6f}html.theme--documenter-dark .card .media:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .dropdown{display:inline-flex;position:relative;vertical-align:top}html.theme--documenter-dark .dropdown.is-active .dropdown-menu,html.theme--documenter-dark .dropdown.is-hoverable:hover .dropdown-menu{display:block}html.theme--documenter-dark .dropdown.is-right .dropdown-menu{left:auto;right:0}html.theme--documenter-dark .dropdown.is-up .dropdown-menu{bottom:100%;padding-bottom:4px;padding-top:initial;top:auto}html.theme--documenter-dark .dropdown-menu{display:none;left:0;min-width:12rem;padding-top:4px;position:absolute;top:100%;z-index:20}html.theme--documenter-dark .dropdown-content{background-color:#282f2f;border-radius:.4em;box-shadow:0 2px 3px rgba(10,10,10,0.1),0 0 0 1px rgba(10,10,10,0.1);padding-bottom:.5rem;padding-top:.5rem}html.theme--documenter-dark .dropdown-item{color:#fff;display:block;font-size:0.875rem;line-height:1.5;padding:0.375rem 1rem;position:relative}html.theme--documenter-dark a.dropdown-item,html.theme--documenter-dark button.dropdown-item{padding-right:3rem;text-align:left;white-space:nowrap;width:100%}html.theme--documenter-dark a.dropdown-item:hover,html.theme--documenter-dark button.dropdown-item:hover{background-color:#282f2f;color:#0a0a0a}html.theme--documenter-dark a.dropdown-item.is-active,html.theme--documenter-dark button.dropdown-item.is-active{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .dropdown-divider{background-color:#5e6d6f;border:none;display:block;height:1px;margin:0.5rem 0}html.theme--documenter-dark .level{align-items:center;justify-content:space-between}html.theme--documenter-dark .level code{border-radius:.4em}html.theme--documenter-dark .level img{display:inline-block;vertical-align:top}html.theme--documenter-dark .level.is-mobile{display:flex}html.theme--documenter-dark .level.is-mobile .level-left,html.theme--documenter-dark .level.is-mobile .level-right{display:flex}html.theme--documenter-dark .level.is-mobile .level-left+.level-right{margin-top:0}html.theme--documenter-dark .level.is-mobile .level-item:not(:last-child){margin-bottom:0;margin-right:.75rem}html.theme--documenter-dark .level.is-mobile .level-item:not(.is-narrow){flex-grow:1}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level{display:flex}html.theme--documenter-dark .level>.level-item:not(.is-narrow){flex-grow:1}}html.theme--documenter-dark .level-item{align-items:center;display:flex;flex-basis:auto;flex-grow:0;flex-shrink:0;justify-content:center}html.theme--documenter-dark .level-item .title,html.theme--documenter-dark .level-item .subtitle{margin-bottom:0}@media screen and (max-width: 768px){html.theme--documenter-dark .level-item:not(:last-child){margin-bottom:.75rem}}html.theme--documenter-dark .level-left,html.theme--documenter-dark .level-right{flex-basis:auto;flex-grow:0;flex-shrink:0}html.theme--documenter-dark .level-left .level-item.is-flexible,html.theme--documenter-dark .level-right .level-item.is-flexible{flex-grow:1}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level-left .level-item:not(:last-child),html.theme--documenter-dark .level-right .level-item:not(:last-child){margin-right:.75rem}}html.theme--documenter-dark .level-left{align-items:center;justify-content:flex-start}@media screen and (max-width: 768px){html.theme--documenter-dark .level-left+.level-right{margin-top:1.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level-left{display:flex}}html.theme--documenter-dark .level-right{align-items:center;justify-content:flex-end}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level-right{display:flex}}html.theme--documenter-dark .list{background-color:#fff;border-radius:.4em;box-shadow:0 2px 3px rgba(10,10,10,0.1),0 0 0 1px rgba(10,10,10,0.1)}html.theme--documenter-dark .list-item{display:block;padding:0.5em 1em}html.theme--documenter-dark .list-item:not(a){color:#fff}html.theme--documenter-dark .list-item:first-child{border-top-left-radius:.4em;border-top-right-radius:.4em}html.theme--documenter-dark .list-item:last-child{border-bottom-left-radius:.4em;border-bottom-right-radius:.4em}html.theme--documenter-dark .list-item:not(:last-child){border-bottom:1px solid #5e6d6f}html.theme--documenter-dark .list-item.is-active{background-color:#1abc9c;color:#fff}html.theme--documenter-dark a.list-item{background-color:#282f2f;cursor:pointer}html.theme--documenter-dark .media{align-items:flex-start;display:flex;text-align:left}html.theme--documenter-dark .media .content:not(:last-child){margin-bottom:0.75rem}html.theme--documenter-dark .media .media{border-top:1px solid rgba(94,109,111,0.5);display:flex;padding-top:0.75rem}html.theme--documenter-dark .media .media .content:not(:last-child),html.theme--documenter-dark .media .media .control:not(:last-child){margin-bottom:0.5rem}html.theme--documenter-dark .media .media .media{padding-top:0.5rem}html.theme--documenter-dark .media .media .media+.media{margin-top:0.5rem}html.theme--documenter-dark .media+.media{border-top:1px solid rgba(94,109,111,0.5);margin-top:1rem;padding-top:1rem}html.theme--documenter-dark .media.is-large+.media{margin-top:1.5rem;padding-top:1.5rem}html.theme--documenter-dark .media-left,html.theme--documenter-dark .media-right{flex-basis:auto;flex-grow:0;flex-shrink:0}html.theme--documenter-dark .media-left{margin-right:1rem}html.theme--documenter-dark .media-right{margin-left:1rem}html.theme--documenter-dark .media-content{flex-basis:auto;flex-grow:1;flex-shrink:1;text-align:left}@media screen and (max-width: 768px){html.theme--documenter-dark .media-content{overflow-x:auto}}html.theme--documenter-dark .menu{font-size:15px}html.theme--documenter-dark .menu.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.menu{font-size:.85em}html.theme--documenter-dark .menu.is-medium{font-size:1.25rem}html.theme--documenter-dark .menu.is-large{font-size:1.5rem}html.theme--documenter-dark .menu-list{line-height:1.25}html.theme--documenter-dark .menu-list a{border-radius:3px;color:#fff;display:block;padding:0.5em 0.75em}html.theme--documenter-dark .menu-list a:hover{background-color:#282f2f;color:#f2f2f2}html.theme--documenter-dark .menu-list a.is-active{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .menu-list li ul{border-left:1px solid #5e6d6f;margin:.75em;padding-left:.75em}html.theme--documenter-dark .menu-label{color:#fff;font-size:.75em;letter-spacing:.1em;text-transform:uppercase}html.theme--documenter-dark .menu-label:not(:first-child){margin-top:1em}html.theme--documenter-dark .menu-label:not(:last-child){margin-bottom:1em}html.theme--documenter-dark .message{background-color:#282f2f;border-radius:.4em;font-size:15px}html.theme--documenter-dark .message strong{color:currentColor}html.theme--documenter-dark .message a:not(.button):not(.tag):not(.dropdown-item){color:currentColor;text-decoration:underline}html.theme--documenter-dark .message.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.message{font-size:.85em}html.theme--documenter-dark .message.is-medium{font-size:1.25rem}html.theme--documenter-dark .message.is-large{font-size:1.5rem}html.theme--documenter-dark .message.is-white{background-color:#fff}html.theme--documenter-dark .message.is-white .message-header{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .message.is-white .message-body{border-color:#fff;color:#4d4d4d}html.theme--documenter-dark .message.is-black{background-color:#fafafa}html.theme--documenter-dark .message.is-black .message-header{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .message.is-black .message-body{border-color:#0a0a0a;color:#090909}html.theme--documenter-dark .message.is-light{background-color:#f9fafb}html.theme--documenter-dark .message.is-light .message-header{background-color:#ecf0f1;color:#282f2f}html.theme--documenter-dark .message.is-light .message-body{border-color:#ecf0f1;color:#505050}html.theme--documenter-dark .message.is-dark,html.theme--documenter-dark .content kbd.message{background-color:#f9fafa}html.theme--documenter-dark .message.is-dark .message-header,html.theme--documenter-dark .content kbd.message .message-header{background-color:#282f2f;color:#ecf0f1}html.theme--documenter-dark .message.is-dark .message-body,html.theme--documenter-dark .content kbd.message .message-body{border-color:#282f2f;color:#212526}html.theme--documenter-dark .message.is-primary,html.theme--documenter-dark .docstring>section>a.message.docs-sourcelink{background-color:#f8fafc}html.theme--documenter-dark .message.is-primary .message-header,html.theme--documenter-dark .docstring>section>a.message.docs-sourcelink .message-header{background-color:#375a7f;color:#fff}html.theme--documenter-dark .message.is-primary .message-body,html.theme--documenter-dark .docstring>section>a.message.docs-sourcelink .message-body{border-color:#375a7f;color:#2b4159}html.theme--documenter-dark .message.is-link{background-color:#f6fefc}html.theme--documenter-dark .message.is-link .message-header{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .message.is-link .message-body{border-color:#1abc9c;color:#0b2f28}html.theme--documenter-dark .message.is-info{background-color:#f5fbff}html.theme--documenter-dark .message.is-info .message-header{background-color:#024c7d;color:#fff}html.theme--documenter-dark .message.is-info .message-body{border-color:#024c7d;color:#033659}html.theme--documenter-dark .message.is-success{background-color:#f5fff9}html.theme--documenter-dark .message.is-success .message-header{background-color:#008438;color:#fff}html.theme--documenter-dark .message.is-success .message-body{border-color:#008438;color:#023518}html.theme--documenter-dark .message.is-warning{background-color:#fffcf5}html.theme--documenter-dark .message.is-warning .message-header{background-color:#ad8100;color:#fff}html.theme--documenter-dark .message.is-warning .message-body{border-color:#ad8100;color:#3d2e03}html.theme--documenter-dark .message.is-danger{background-color:#fef6f6}html.theme--documenter-dark .message.is-danger .message-header{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .message.is-danger .message-body{border-color:#9e1b0d;color:#7a170c}html.theme--documenter-dark .message-header{align-items:center;background-color:#fff;border-radius:.4em .4em 0 0;color:rgba(0,0,0,0.7);display:flex;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.75em 1em;position:relative}html.theme--documenter-dark .message-header .delete{flex-grow:0;flex-shrink:0;margin-left:0.75em}html.theme--documenter-dark .message-header+.message-body{border-width:0;border-top-left-radius:0;border-top-right-radius:0}html.theme--documenter-dark .message-body{border-color:#5e6d6f;border-radius:.4em;border-style:solid;border-width:0 0 0 4px;color:#fff;padding:1.25em 1.5em}html.theme--documenter-dark .message-body code,html.theme--documenter-dark .message-body pre{background-color:#fff}html.theme--documenter-dark .message-body pre code{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .modal{align-items:center;display:none;flex-direction:column;justify-content:center;overflow:hidden;position:fixed;z-index:40}html.theme--documenter-dark .modal.is-active{display:flex}html.theme--documenter-dark .modal-background{background-color:rgba(10,10,10,0.86)}html.theme--documenter-dark .modal-content,html.theme--documenter-dark .modal-card{margin:0 20px;max-height:calc(100vh - 160px);overflow:auto;position:relative;width:100%}@media screen and (min-width: 769px),print{html.theme--documenter-dark .modal-content,html.theme--documenter-dark .modal-card{margin:0 auto;max-height:calc(100vh - 40px);width:640px}}html.theme--documenter-dark .modal-close{background:none;height:40px;position:fixed;right:20px;top:20px;width:40px}html.theme--documenter-dark .modal-card{display:flex;flex-direction:column;max-height:calc(100vh - 40px);overflow:hidden;-ms-overflow-y:visible}html.theme--documenter-dark .modal-card-head,html.theme--documenter-dark .modal-card-foot{align-items:center;background-color:#282f2f;display:flex;flex-shrink:0;justify-content:flex-start;padding:20px;position:relative}html.theme--documenter-dark .modal-card-head{border-bottom:1px solid #5e6d6f;border-top-left-radius:8px;border-top-right-radius:8px}html.theme--documenter-dark .modal-card-title{color:#f2f2f2;flex-grow:1;flex-shrink:0;font-size:1.5rem;line-height:1}html.theme--documenter-dark .modal-card-foot{border-bottom-left-radius:8px;border-bottom-right-radius:8px;border-top:1px solid #5e6d6f}html.theme--documenter-dark .modal-card-foot .button:not(:last-child){margin-right:0.5em}html.theme--documenter-dark .modal-card-body{-webkit-overflow-scrolling:touch;background-color:#fff;flex-grow:1;flex-shrink:1;overflow:auto;padding:20px}html.theme--documenter-dark .navbar{background-color:#375a7f;min-height:4rem;position:relative;z-index:30}html.theme--documenter-dark .navbar.is-white{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link{color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-white .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-white .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link::after{border-color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-burger{color:#0a0a0a}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-white .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-white .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link{color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-white .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-white .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-white .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-white .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-white .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link::after{border-color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-dropdown a.navbar-item.is-active{background-color:#fff;color:#0a0a0a}}html.theme--documenter-dark .navbar.is-black{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-black .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-black .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link.is-active{background-color:#000;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-black .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-black .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-black .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-black .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-black .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-black .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-black .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link.is-active{background-color:#000;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link{background-color:#000;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-dropdown a.navbar-item.is-active{background-color:#0a0a0a;color:#fff}}html.theme--documenter-dark .navbar.is-light{background-color:#ecf0f1;color:#282f2f}html.theme--documenter-dark .navbar.is-light .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link{color:#282f2f}html.theme--documenter-dark .navbar.is-light .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-light .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-light .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link.is-active{background-color:#dde4e6;color:#282f2f}html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link::after{border-color:#282f2f}html.theme--documenter-dark .navbar.is-light .navbar-burger{color:#282f2f}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-light .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-light .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link{color:#282f2f}html.theme--documenter-dark .navbar.is-light .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-light .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-light .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-light .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-light .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-light .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link.is-active{background-color:#dde4e6;color:#282f2f}html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link::after{border-color:#282f2f}html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link{background-color:#dde4e6;color:#282f2f}html.theme--documenter-dark .navbar.is-light .navbar-dropdown a.navbar-item.is-active{background-color:#ecf0f1;color:#282f2f}}html.theme--documenter-dark .navbar.is-dark,html.theme--documenter-dark .content kbd.navbar{background-color:#282f2f;color:#ecf0f1}html.theme--documenter-dark .navbar.is-dark .navbar-brand>.navbar-item,html.theme--documenter-dark .content kbd.navbar .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link{color:#ecf0f1}html.theme--documenter-dark .navbar.is-dark .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .content kbd.navbar .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-dark .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .content kbd.navbar .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-dark .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link:focus,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link:hover,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link.is-active{background-color:#1d2122;color:#ecf0f1}html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link::after,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link::after{border-color:#ecf0f1}html.theme--documenter-dark .navbar.is-dark .navbar-burger,html.theme--documenter-dark .content kbd.navbar .navbar-burger{color:#ecf0f1}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-dark .navbar-start>.navbar-item,html.theme--documenter-dark .content kbd.navbar .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-dark .navbar-end>.navbar-item,html.theme--documenter-dark .content kbd.navbar .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link{color:#ecf0f1}html.theme--documenter-dark .navbar.is-dark .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .content kbd.navbar .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-dark .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .content kbd.navbar .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-dark .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link:focus,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link:hover,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .content kbd.navbar .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-dark .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .content kbd.navbar .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-dark .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link:focus,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link:hover,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link.is-active{background-color:#1d2122;color:#ecf0f1}html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link::after,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link::after,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link::after{border-color:#ecf0f1}html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown.is-active .navbar-link{background-color:#1d2122;color:#ecf0f1}html.theme--documenter-dark .navbar.is-dark .navbar-dropdown a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-dropdown a.navbar-item.is-active{background-color:#282f2f;color:#ecf0f1}}html.theme--documenter-dark .navbar.is-primary,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink{background-color:#375a7f;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-brand>.navbar-item,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-primary .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-primary .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link.is-active{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link::after,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-burger,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-primary .navbar-start>.navbar-item,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-primary .navbar-end>.navbar-item,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-primary .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-primary .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-primary .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-primary .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link.is-active{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link::after,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link::after,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown.is-active .navbar-link{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-dropdown a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active{background-color:#375a7f;color:#fff}}html.theme--documenter-dark .navbar.is-link{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-link .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-link .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link.is-active{background-color:#17a689;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-link .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-link .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-link .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-link .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-link .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-link .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-link .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link.is-active{background-color:#17a689;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link{background-color:#17a689;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-dropdown a.navbar-item.is-active{background-color:#1abc9c;color:#fff}}html.theme--documenter-dark .navbar.is-info{background-color:#024c7d;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-info .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-info .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link.is-active{background-color:#023d64;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-info .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-info .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-info .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-info .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-info .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-info .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-info .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link.is-active{background-color:#023d64;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link{background-color:#023d64;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-dropdown a.navbar-item.is-active{background-color:#024c7d;color:#fff}}html.theme--documenter-dark .navbar.is-success{background-color:#008438;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-success .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-success .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link.is-active{background-color:#006b2d;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-success .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-success .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-success .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-success .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-success .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-success .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-success .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link.is-active{background-color:#006b2d;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link{background-color:#006b2d;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-dropdown a.navbar-item.is-active{background-color:#008438;color:#fff}}html.theme--documenter-dark .navbar.is-warning{background-color:#ad8100;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-warning .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-warning .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link.is-active{background-color:#946e00;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-warning .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-warning .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-warning .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-warning .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-warning .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-warning .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link.is-active{background-color:#946e00;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link{background-color:#946e00;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-dropdown a.navbar-item.is-active{background-color:#ad8100;color:#fff}}html.theme--documenter-dark .navbar.is-danger{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-danger .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-danger .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link.is-active{background-color:#86170b;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-danger .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-danger .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-danger .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-danger .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-danger .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-danger .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link.is-active{background-color:#86170b;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link{background-color:#86170b;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-dropdown a.navbar-item.is-active{background-color:#9e1b0d;color:#fff}}html.theme--documenter-dark .navbar>.container{align-items:stretch;display:flex;min-height:4rem;width:100%}html.theme--documenter-dark .navbar.has-shadow{box-shadow:0 2px 0 0 #282f2f}html.theme--documenter-dark .navbar.is-fixed-bottom,html.theme--documenter-dark .navbar.is-fixed-top{left:0;position:fixed;right:0;z-index:30}html.theme--documenter-dark .navbar.is-fixed-bottom{bottom:0}html.theme--documenter-dark .navbar.is-fixed-bottom.has-shadow{box-shadow:0 -2px 0 0 #282f2f}html.theme--documenter-dark .navbar.is-fixed-top{top:0}html.theme--documenter-dark html.has-navbar-fixed-top,html.theme--documenter-dark body.has-navbar-fixed-top{padding-top:4rem}html.theme--documenter-dark html.has-navbar-fixed-bottom,html.theme--documenter-dark body.has-navbar-fixed-bottom{padding-bottom:4rem}html.theme--documenter-dark .navbar-brand,html.theme--documenter-dark .navbar-tabs{align-items:stretch;display:flex;flex-shrink:0;min-height:4rem}html.theme--documenter-dark .navbar-brand a.navbar-item:focus,html.theme--documenter-dark .navbar-brand a.navbar-item:hover{background-color:transparent}html.theme--documenter-dark .navbar-tabs{-webkit-overflow-scrolling:touch;max-width:100vw;overflow-x:auto;overflow-y:hidden}html.theme--documenter-dark .navbar-burger{color:#fff;cursor:pointer;display:block;height:4rem;position:relative;width:4rem;margin-left:auto}html.theme--documenter-dark .navbar-burger span{background-color:currentColor;display:block;height:1px;left:calc(50% - 8px);position:absolute;transform-origin:center;transition-duration:86ms;transition-property:background-color, opacity, transform;transition-timing-function:ease-out;width:16px}html.theme--documenter-dark .navbar-burger span:nth-child(1){top:calc(50% - 6px)}html.theme--documenter-dark .navbar-burger span:nth-child(2){top:calc(50% - 1px)}html.theme--documenter-dark .navbar-burger span:nth-child(3){top:calc(50% + 4px)}html.theme--documenter-dark .navbar-burger:hover{background-color:rgba(0,0,0,0.05)}html.theme--documenter-dark .navbar-burger.is-active span:nth-child(1){transform:translateY(5px) rotate(45deg)}html.theme--documenter-dark .navbar-burger.is-active span:nth-child(2){opacity:0}html.theme--documenter-dark .navbar-burger.is-active span:nth-child(3){transform:translateY(-5px) rotate(-45deg)}html.theme--documenter-dark .navbar-menu{display:none}html.theme--documenter-dark .navbar-item,html.theme--documenter-dark .navbar-link{color:#fff;display:block;line-height:1.5;padding:0.5rem 0.75rem;position:relative}html.theme--documenter-dark .navbar-item .icon:only-child,html.theme--documenter-dark .navbar-link .icon:only-child{margin-left:-0.25rem;margin-right:-0.25rem}html.theme--documenter-dark a.navbar-item,html.theme--documenter-dark .navbar-link{cursor:pointer}html.theme--documenter-dark a.navbar-item:focus,html.theme--documenter-dark a.navbar-item:focus-within,html.theme--documenter-dark a.navbar-item:hover,html.theme--documenter-dark a.navbar-item.is-active,html.theme--documenter-dark .navbar-link:focus,html.theme--documenter-dark .navbar-link:focus-within,html.theme--documenter-dark .navbar-link:hover,html.theme--documenter-dark .navbar-link.is-active{background-color:rgba(0,0,0,0);color:#1abc9c}html.theme--documenter-dark .navbar-item{display:block;flex-grow:0;flex-shrink:0}html.theme--documenter-dark .navbar-item img{max-height:1.75rem}html.theme--documenter-dark .navbar-item.has-dropdown{padding:0}html.theme--documenter-dark .navbar-item.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .navbar-item.is-tab{border-bottom:1px solid transparent;min-height:4rem;padding-bottom:calc(0.5rem - 1px)}html.theme--documenter-dark .navbar-item.is-tab:focus,html.theme--documenter-dark .navbar-item.is-tab:hover{background-color:rgba(0,0,0,0);border-bottom-color:#1abc9c}html.theme--documenter-dark .navbar-item.is-tab.is-active{background-color:rgba(0,0,0,0);border-bottom-color:#1abc9c;border-bottom-style:solid;border-bottom-width:3px;color:#1abc9c;padding-bottom:calc(0.5rem - 3px)}html.theme--documenter-dark .navbar-content{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .navbar-link:not(.is-arrowless){padding-right:2.5em}html.theme--documenter-dark .navbar-link:not(.is-arrowless)::after{border-color:#fff;margin-top:-0.375em;right:1.125em}html.theme--documenter-dark .navbar-dropdown{font-size:0.875rem;padding-bottom:0.5rem;padding-top:0.5rem}html.theme--documenter-dark .navbar-dropdown .navbar-item{padding-left:1.5rem;padding-right:1.5rem}html.theme--documenter-dark .navbar-divider{background-color:rgba(0,0,0,0.2);border:none;display:none;height:2px;margin:0.5rem 0}@media screen and (max-width: 1055px){html.theme--documenter-dark .navbar>.container{display:block}html.theme--documenter-dark .navbar-brand .navbar-item,html.theme--documenter-dark .navbar-tabs .navbar-item{align-items:center;display:flex}html.theme--documenter-dark .navbar-link::after{display:none}html.theme--documenter-dark .navbar-menu{background-color:#375a7f;box-shadow:0 8px 16px rgba(10,10,10,0.1);padding:0.5rem 0}html.theme--documenter-dark .navbar-menu.is-active{display:block}html.theme--documenter-dark .navbar.is-fixed-bottom-touch,html.theme--documenter-dark .navbar.is-fixed-top-touch{left:0;position:fixed;right:0;z-index:30}html.theme--documenter-dark .navbar.is-fixed-bottom-touch{bottom:0}html.theme--documenter-dark .navbar.is-fixed-bottom-touch.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}html.theme--documenter-dark .navbar.is-fixed-top-touch{top:0}html.theme--documenter-dark .navbar.is-fixed-top .navbar-menu,html.theme--documenter-dark .navbar.is-fixed-top-touch .navbar-menu{-webkit-overflow-scrolling:touch;max-height:calc(100vh - 4rem);overflow:auto}html.theme--documenter-dark html.has-navbar-fixed-top-touch,html.theme--documenter-dark body.has-navbar-fixed-top-touch{padding-top:4rem}html.theme--documenter-dark html.has-navbar-fixed-bottom-touch,html.theme--documenter-dark body.has-navbar-fixed-bottom-touch{padding-bottom:4rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar,html.theme--documenter-dark .navbar-menu,html.theme--documenter-dark .navbar-start,html.theme--documenter-dark .navbar-end{align-items:stretch;display:flex}html.theme--documenter-dark .navbar{min-height:4rem}html.theme--documenter-dark .navbar.is-spaced{padding:1rem 2rem}html.theme--documenter-dark .navbar.is-spaced .navbar-start,html.theme--documenter-dark .navbar.is-spaced .navbar-end{align-items:center}html.theme--documenter-dark .navbar.is-spaced a.navbar-item,html.theme--documenter-dark .navbar.is-spaced .navbar-link{border-radius:.4em}html.theme--documenter-dark .navbar.is-transparent a.navbar-item:focus,html.theme--documenter-dark .navbar.is-transparent a.navbar-item:hover,html.theme--documenter-dark .navbar.is-transparent a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-transparent .navbar-link:focus,html.theme--documenter-dark .navbar.is-transparent .navbar-link:hover,html.theme--documenter-dark .navbar.is-transparent .navbar-link.is-active{background-color:transparent !important}html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link,html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link,html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link,html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link{background-color:transparent !important}html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item:focus,html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item:hover{background-color:rgba(0,0,0,0);color:#dbdee0}html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item.is-active{background-color:rgba(0,0,0,0);color:#1abc9c}html.theme--documenter-dark .navbar-burger{display:none}html.theme--documenter-dark .navbar-item,html.theme--documenter-dark .navbar-link{align-items:center;display:flex}html.theme--documenter-dark .navbar-item{display:flex}html.theme--documenter-dark .navbar-item.has-dropdown{align-items:stretch}html.theme--documenter-dark .navbar-item.has-dropdown-up .navbar-link::after{transform:rotate(135deg) translate(0.25em, -0.25em)}html.theme--documenter-dark .navbar-item.has-dropdown-up .navbar-dropdown{border-bottom:1px solid rgba(0,0,0,0.2);border-radius:8px 8px 0 0;border-top:none;bottom:100%;box-shadow:0 -8px 8px rgba(10,10,10,0.1);top:auto}html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown{display:block}.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown.is-boxed,.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed,.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed,.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed{opacity:1;pointer-events:auto;transform:translateY(0)}html.theme--documenter-dark .navbar-menu{flex-grow:1;flex-shrink:0}html.theme--documenter-dark .navbar-start{justify-content:flex-start;margin-right:auto}html.theme--documenter-dark .navbar-end{justify-content:flex-end;margin-left:auto}html.theme--documenter-dark .navbar-dropdown{background-color:#375a7f;border-bottom-left-radius:8px;border-bottom-right-radius:8px;border-top:1px solid rgba(0,0,0,0.2);box-shadow:0 8px 8px rgba(10,10,10,0.1);display:none;font-size:0.875rem;left:0;min-width:100%;position:absolute;top:100%;z-index:20}html.theme--documenter-dark .navbar-dropdown .navbar-item{padding:0.375rem 1rem;white-space:nowrap}html.theme--documenter-dark .navbar-dropdown a.navbar-item{padding-right:3rem}html.theme--documenter-dark .navbar-dropdown a.navbar-item:focus,html.theme--documenter-dark .navbar-dropdown a.navbar-item:hover{background-color:rgba(0,0,0,0);color:#dbdee0}html.theme--documenter-dark .navbar-dropdown a.navbar-item.is-active{background-color:rgba(0,0,0,0);color:#1abc9c}.navbar.is-spaced html.theme--documenter-dark .navbar-dropdown,html.theme--documenter-dark .navbar-dropdown.is-boxed{border-radius:8px;border-top:none;box-shadow:0 8px 8px rgba(10,10,10,0.1), 0 0 0 1px rgba(10,10,10,0.1);display:block;opacity:0;pointer-events:none;top:calc(100% + (-4px));transform:translateY(-5px);transition-duration:86ms;transition-property:opacity, transform}html.theme--documenter-dark .navbar-dropdown.is-right{left:auto;right:0}html.theme--documenter-dark .navbar-divider{display:block}html.theme--documenter-dark .navbar>.container .navbar-brand,html.theme--documenter-dark .container>.navbar .navbar-brand{margin-left:-.75rem}html.theme--documenter-dark .navbar>.container .navbar-menu,html.theme--documenter-dark .container>.navbar .navbar-menu{margin-right:-.75rem}html.theme--documenter-dark .navbar.is-fixed-bottom-desktop,html.theme--documenter-dark .navbar.is-fixed-top-desktop{left:0;position:fixed;right:0;z-index:30}html.theme--documenter-dark .navbar.is-fixed-bottom-desktop{bottom:0}html.theme--documenter-dark .navbar.is-fixed-bottom-desktop.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}html.theme--documenter-dark .navbar.is-fixed-top-desktop{top:0}html.theme--documenter-dark html.has-navbar-fixed-top-desktop,html.theme--documenter-dark body.has-navbar-fixed-top-desktop{padding-top:4rem}html.theme--documenter-dark html.has-navbar-fixed-bottom-desktop,html.theme--documenter-dark body.has-navbar-fixed-bottom-desktop{padding-bottom:4rem}html.theme--documenter-dark html.has-spaced-navbar-fixed-top,html.theme--documenter-dark body.has-spaced-navbar-fixed-top{padding-top:6rem}html.theme--documenter-dark html.has-spaced-navbar-fixed-bottom,html.theme--documenter-dark body.has-spaced-navbar-fixed-bottom{padding-bottom:6rem}html.theme--documenter-dark a.navbar-item.is-active,html.theme--documenter-dark .navbar-link.is-active{color:#1abc9c}html.theme--documenter-dark a.navbar-item.is-active:not(:focus):not(:hover),html.theme--documenter-dark .navbar-link.is-active:not(:focus):not(:hover){background-color:rgba(0,0,0,0)}html.theme--documenter-dark .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar-item.has-dropdown.is-active .navbar-link{background-color:rgba(0,0,0,0)}}html.theme--documenter-dark .hero.is-fullheight-with-navbar{min-height:calc(100vh - 4rem)}html.theme--documenter-dark .pagination{font-size:15px;margin:-.25rem}html.theme--documenter-dark .pagination.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination{font-size:.85em}html.theme--documenter-dark .pagination.is-medium{font-size:1.25rem}html.theme--documenter-dark .pagination.is-large{font-size:1.5rem}html.theme--documenter-dark .pagination.is-rounded .pagination-previous,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination .pagination-previous,html.theme--documenter-dark .pagination.is-rounded .pagination-next,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination .pagination-next{padding-left:1em;padding-right:1em;border-radius:290486px}html.theme--documenter-dark .pagination.is-rounded .pagination-link,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination .pagination-link{border-radius:290486px}html.theme--documenter-dark .pagination,html.theme--documenter-dark .pagination-list{align-items:center;display:flex;justify-content:center;text-align:center}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis{font-size:1em;justify-content:center;margin:.25rem;padding-left:.5em;padding-right:.5em;text-align:center}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link{border-color:#5e6d6f;color:#1abc9c;min-width:2.25em}html.theme--documenter-dark .pagination-previous:hover,html.theme--documenter-dark .pagination-next:hover,html.theme--documenter-dark .pagination-link:hover{border-color:#8c9b9d;color:#1dd2af}html.theme--documenter-dark .pagination-previous:focus,html.theme--documenter-dark .pagination-next:focus,html.theme--documenter-dark .pagination-link:focus{border-color:#8c9b9d}html.theme--documenter-dark .pagination-previous:active,html.theme--documenter-dark .pagination-next:active,html.theme--documenter-dark .pagination-link:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2)}html.theme--documenter-dark .pagination-previous[disabled],html.theme--documenter-dark .pagination-next[disabled],html.theme--documenter-dark .pagination-link[disabled]{background-color:#dbdee0;border-color:#dbdee0;box-shadow:none;color:#5e6d6f;opacity:0.5}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next{padding-left:0.75em;padding-right:0.75em;white-space:nowrap}html.theme--documenter-dark .pagination-link.is-current{background-color:#1abc9c;border-color:#1abc9c;color:#fff}html.theme--documenter-dark .pagination-ellipsis{color:#8c9b9d;pointer-events:none}html.theme--documenter-dark .pagination-list{flex-wrap:wrap}@media screen and (max-width: 768px){html.theme--documenter-dark .pagination{flex-wrap:wrap}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .pagination-list li{flex-grow:1;flex-shrink:1}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .pagination-list{flex-grow:1;flex-shrink:1;justify-content:flex-start;order:1}html.theme--documenter-dark .pagination-previous{order:2}html.theme--documenter-dark .pagination-next{order:3}html.theme--documenter-dark .pagination{justify-content:space-between}html.theme--documenter-dark .pagination.is-centered .pagination-previous{order:1}html.theme--documenter-dark .pagination.is-centered .pagination-list{justify-content:center;order:2}html.theme--documenter-dark .pagination.is-centered .pagination-next{order:3}html.theme--documenter-dark .pagination.is-right .pagination-previous{order:1}html.theme--documenter-dark .pagination.is-right .pagination-next{order:2}html.theme--documenter-dark .pagination.is-right .pagination-list{justify-content:flex-end;order:3}}html.theme--documenter-dark .panel{font-size:15px}html.theme--documenter-dark .panel:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .panel-heading,html.theme--documenter-dark .panel-tabs,html.theme--documenter-dark .panel-block{border-bottom:1px solid #5e6d6f;border-left:1px solid #5e6d6f;border-right:1px solid #5e6d6f}html.theme--documenter-dark .panel-heading:first-child,html.theme--documenter-dark .panel-tabs:first-child,html.theme--documenter-dark .panel-block:first-child{border-top:1px solid #5e6d6f}html.theme--documenter-dark .panel-heading{background-color:#282f2f;border-radius:.4em .4em 0 0;color:#f2f2f2;font-size:1.25em;font-weight:300;line-height:1.25;padding:0.5em 0.75em}html.theme--documenter-dark .panel-tabs{align-items:flex-end;display:flex;font-size:.875em;justify-content:center}html.theme--documenter-dark .panel-tabs a{border-bottom:1px solid #5e6d6f;margin-bottom:-1px;padding:0.5em}html.theme--documenter-dark .panel-tabs a.is-active{border-bottom-color:#343c3d;color:#17a689}html.theme--documenter-dark .panel-list a{color:#fff}html.theme--documenter-dark .panel-list a:hover{color:#1abc9c}html.theme--documenter-dark .panel-block{align-items:center;color:#f2f2f2;display:flex;justify-content:flex-start;padding:0.5em 0.75em}html.theme--documenter-dark .panel-block input[type="checkbox"]{margin-right:0.75em}html.theme--documenter-dark .panel-block>.control{flex-grow:1;flex-shrink:1;width:100%}html.theme--documenter-dark .panel-block.is-wrapped{flex-wrap:wrap}html.theme--documenter-dark .panel-block.is-active{border-left-color:#1abc9c;color:#17a689}html.theme--documenter-dark .panel-block.is-active .panel-icon{color:#1abc9c}html.theme--documenter-dark a.panel-block,html.theme--documenter-dark label.panel-block{cursor:pointer}html.theme--documenter-dark a.panel-block:hover,html.theme--documenter-dark label.panel-block:hover{background-color:#282f2f}html.theme--documenter-dark .panel-icon{display:inline-block;font-size:14px;height:1em;line-height:1em;text-align:center;vertical-align:top;width:1em;color:#fff;margin-right:0.75em}html.theme--documenter-dark .panel-icon .fa{font-size:inherit;line-height:inherit}html.theme--documenter-dark .tabs{-webkit-overflow-scrolling:touch;align-items:stretch;display:flex;font-size:15px;justify-content:space-between;overflow:hidden;overflow-x:auto;white-space:nowrap}html.theme--documenter-dark .tabs a{align-items:center;border-bottom-color:#5e6d6f;border-bottom-style:solid;border-bottom-width:1px;color:#fff;display:flex;justify-content:center;margin-bottom:-1px;padding:0.5em 1em;vertical-align:top}html.theme--documenter-dark .tabs a:hover{border-bottom-color:#f2f2f2;color:#f2f2f2}html.theme--documenter-dark .tabs li{display:block}html.theme--documenter-dark .tabs li.is-active a{border-bottom-color:#1abc9c;color:#1abc9c}html.theme--documenter-dark .tabs ul{align-items:center;border-bottom-color:#5e6d6f;border-bottom-style:solid;border-bottom-width:1px;display:flex;flex-grow:1;flex-shrink:0;justify-content:flex-start}html.theme--documenter-dark .tabs ul.is-left{padding-right:0.75em}html.theme--documenter-dark .tabs ul.is-center{flex:none;justify-content:center;padding-left:0.75em;padding-right:0.75em}html.theme--documenter-dark .tabs ul.is-right{justify-content:flex-end;padding-left:0.75em}html.theme--documenter-dark .tabs .icon:first-child{margin-right:0.5em}html.theme--documenter-dark .tabs .icon:last-child{margin-left:0.5em}html.theme--documenter-dark .tabs.is-centered ul{justify-content:center}html.theme--documenter-dark .tabs.is-right ul{justify-content:flex-end}html.theme--documenter-dark .tabs.is-boxed a{border:1px solid transparent;border-radius:.4em .4em 0 0}html.theme--documenter-dark .tabs.is-boxed a:hover{background-color:#282f2f;border-bottom-color:#5e6d6f}html.theme--documenter-dark .tabs.is-boxed li.is-active a{background-color:#fff;border-color:#5e6d6f;border-bottom-color:rgba(0,0,0,0) !important}html.theme--documenter-dark .tabs.is-fullwidth li{flex-grow:1;flex-shrink:0}html.theme--documenter-dark .tabs.is-toggle a{border-color:#5e6d6f;border-style:solid;border-width:1px;margin-bottom:0;position:relative}html.theme--documenter-dark .tabs.is-toggle a:hover{background-color:#282f2f;border-color:#8c9b9d;z-index:2}html.theme--documenter-dark .tabs.is-toggle li+li{margin-left:-1px}html.theme--documenter-dark .tabs.is-toggle li:first-child a{border-radius:.4em 0 0 .4em}html.theme--documenter-dark .tabs.is-toggle li:last-child a{border-radius:0 .4em .4em 0}html.theme--documenter-dark .tabs.is-toggle li.is-active a{background-color:#1abc9c;border-color:#1abc9c;color:#fff;z-index:1}html.theme--documenter-dark .tabs.is-toggle ul{border-bottom:none}html.theme--documenter-dark .tabs.is-toggle.is-toggle-rounded li:first-child a{border-bottom-left-radius:290486px;border-top-left-radius:290486px;padding-left:1.25em}html.theme--documenter-dark .tabs.is-toggle.is-toggle-rounded li:last-child a{border-bottom-right-radius:290486px;border-top-right-radius:290486px;padding-right:1.25em}html.theme--documenter-dark .tabs.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.tabs{font-size:.85em}html.theme--documenter-dark .tabs.is-medium{font-size:1.25rem}html.theme--documenter-dark .tabs.is-large{font-size:1.5rem}html.theme--documenter-dark .column{display:block;flex-basis:0;flex-grow:1;flex-shrink:1;padding:.75rem}.columns.is-mobile>html.theme--documenter-dark .column.is-narrow{flex:none}.columns.is-mobile>html.theme--documenter-dark .column.is-full{flex:none;width:100%}.columns.is-mobile>html.theme--documenter-dark .column.is-three-quarters{flex:none;width:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-two-thirds{flex:none;width:66.6666%}.columns.is-mobile>html.theme--documenter-dark .column.is-half{flex:none;width:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-one-third{flex:none;width:33.3333%}.columns.is-mobile>html.theme--documenter-dark .column.is-one-quarter{flex:none;width:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-one-fifth{flex:none;width:20%}.columns.is-mobile>html.theme--documenter-dark .column.is-two-fifths{flex:none;width:40%}.columns.is-mobile>html.theme--documenter-dark .column.is-three-fifths{flex:none;width:60%}.columns.is-mobile>html.theme--documenter-dark .column.is-four-fifths{flex:none;width:80%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-three-quarters{margin-left:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-two-thirds{margin-left:66.6666%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-half{margin-left:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-one-third{margin-left:33.3333%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-one-quarter{margin-left:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-one-fifth{margin-left:20%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-two-fifths{margin-left:40%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-three-fifths{margin-left:60%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-four-fifths{margin-left:80%}.columns.is-mobile>html.theme--documenter-dark .column.is-0{flex:none;width:0%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-0{margin-left:0%}.columns.is-mobile>html.theme--documenter-dark .column.is-1{flex:none;width:8.3333333333%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-1{margin-left:8.3333333333%}.columns.is-mobile>html.theme--documenter-dark .column.is-2{flex:none;width:16.6666666667%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-2{margin-left:16.6666666667%}.columns.is-mobile>html.theme--documenter-dark .column.is-3{flex:none;width:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-3{margin-left:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-4{flex:none;width:33.3333333333%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-4{margin-left:33.3333333333%}.columns.is-mobile>html.theme--documenter-dark .column.is-5{flex:none;width:41.6666666667%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-5{margin-left:41.6666666667%}.columns.is-mobile>html.theme--documenter-dark .column.is-6{flex:none;width:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-6{margin-left:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-7{flex:none;width:58.3333333333%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-7{margin-left:58.3333333333%}.columns.is-mobile>html.theme--documenter-dark .column.is-8{flex:none;width:66.6666666667%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-8{margin-left:66.6666666667%}.columns.is-mobile>html.theme--documenter-dark .column.is-9{flex:none;width:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-9{margin-left:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-10{flex:none;width:83.3333333333%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-10{margin-left:83.3333333333%}.columns.is-mobile>html.theme--documenter-dark .column.is-11{flex:none;width:91.6666666667%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-11{margin-left:91.6666666667%}.columns.is-mobile>html.theme--documenter-dark .column.is-12{flex:none;width:100%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-12{margin-left:100%}@media screen and (max-width: 768px){html.theme--documenter-dark .column.is-narrow-mobile{flex:none}html.theme--documenter-dark .column.is-full-mobile{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-mobile{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-mobile{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-mobile{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-mobile{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-mobile{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-mobile{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-mobile{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-mobile{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-mobile{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-mobile{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-mobile{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-mobile{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-mobile{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-mobile{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-mobile{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-mobile{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-mobile{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-mobile{margin-left:80%}html.theme--documenter-dark .column.is-0-mobile{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-mobile{margin-left:0%}html.theme--documenter-dark .column.is-1-mobile{flex:none;width:8.3333333333%}html.theme--documenter-dark .column.is-offset-1-mobile{margin-left:8.3333333333%}html.theme--documenter-dark .column.is-2-mobile{flex:none;width:16.6666666667%}html.theme--documenter-dark .column.is-offset-2-mobile{margin-left:16.6666666667%}html.theme--documenter-dark .column.is-3-mobile{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-mobile{margin-left:25%}html.theme--documenter-dark .column.is-4-mobile{flex:none;width:33.3333333333%}html.theme--documenter-dark .column.is-offset-4-mobile{margin-left:33.3333333333%}html.theme--documenter-dark .column.is-5-mobile{flex:none;width:41.6666666667%}html.theme--documenter-dark .column.is-offset-5-mobile{margin-left:41.6666666667%}html.theme--documenter-dark .column.is-6-mobile{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-mobile{margin-left:50%}html.theme--documenter-dark .column.is-7-mobile{flex:none;width:58.3333333333%}html.theme--documenter-dark .column.is-offset-7-mobile{margin-left:58.3333333333%}html.theme--documenter-dark .column.is-8-mobile{flex:none;width:66.6666666667%}html.theme--documenter-dark .column.is-offset-8-mobile{margin-left:66.6666666667%}html.theme--documenter-dark .column.is-9-mobile{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-mobile{margin-left:75%}html.theme--documenter-dark .column.is-10-mobile{flex:none;width:83.3333333333%}html.theme--documenter-dark .column.is-offset-10-mobile{margin-left:83.3333333333%}html.theme--documenter-dark .column.is-11-mobile{flex:none;width:91.6666666667%}html.theme--documenter-dark .column.is-offset-11-mobile{margin-left:91.6666666667%}html.theme--documenter-dark .column.is-12-mobile{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-mobile{margin-left:100%}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .column.is-narrow,html.theme--documenter-dark .column.is-narrow-tablet{flex:none}html.theme--documenter-dark .column.is-full,html.theme--documenter-dark .column.is-full-tablet{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters,html.theme--documenter-dark .column.is-three-quarters-tablet{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds,html.theme--documenter-dark .column.is-two-thirds-tablet{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half,html.theme--documenter-dark .column.is-half-tablet{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third,html.theme--documenter-dark .column.is-one-third-tablet{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter,html.theme--documenter-dark .column.is-one-quarter-tablet{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth,html.theme--documenter-dark .column.is-one-fifth-tablet{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths,html.theme--documenter-dark .column.is-two-fifths-tablet{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths,html.theme--documenter-dark .column.is-three-fifths-tablet{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths,html.theme--documenter-dark .column.is-four-fifths-tablet{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters,html.theme--documenter-dark .column.is-offset-three-quarters-tablet{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds,html.theme--documenter-dark .column.is-offset-two-thirds-tablet{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half,html.theme--documenter-dark .column.is-offset-half-tablet{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third,html.theme--documenter-dark .column.is-offset-one-third-tablet{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter,html.theme--documenter-dark .column.is-offset-one-quarter-tablet{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth,html.theme--documenter-dark .column.is-offset-one-fifth-tablet{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths,html.theme--documenter-dark .column.is-offset-two-fifths-tablet{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths,html.theme--documenter-dark .column.is-offset-three-fifths-tablet{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths,html.theme--documenter-dark .column.is-offset-four-fifths-tablet{margin-left:80%}html.theme--documenter-dark .column.is-0,html.theme--documenter-dark .column.is-0-tablet{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0,html.theme--documenter-dark .column.is-offset-0-tablet{margin-left:0%}html.theme--documenter-dark .column.is-1,html.theme--documenter-dark .column.is-1-tablet{flex:none;width:8.3333333333%}html.theme--documenter-dark .column.is-offset-1,html.theme--documenter-dark .column.is-offset-1-tablet{margin-left:8.3333333333%}html.theme--documenter-dark .column.is-2,html.theme--documenter-dark .column.is-2-tablet{flex:none;width:16.6666666667%}html.theme--documenter-dark .column.is-offset-2,html.theme--documenter-dark .column.is-offset-2-tablet{margin-left:16.6666666667%}html.theme--documenter-dark .column.is-3,html.theme--documenter-dark .column.is-3-tablet{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3,html.theme--documenter-dark .column.is-offset-3-tablet{margin-left:25%}html.theme--documenter-dark .column.is-4,html.theme--documenter-dark .column.is-4-tablet{flex:none;width:33.3333333333%}html.theme--documenter-dark .column.is-offset-4,html.theme--documenter-dark .column.is-offset-4-tablet{margin-left:33.3333333333%}html.theme--documenter-dark .column.is-5,html.theme--documenter-dark .column.is-5-tablet{flex:none;width:41.6666666667%}html.theme--documenter-dark .column.is-offset-5,html.theme--documenter-dark .column.is-offset-5-tablet{margin-left:41.6666666667%}html.theme--documenter-dark .column.is-6,html.theme--documenter-dark .column.is-6-tablet{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6,html.theme--documenter-dark .column.is-offset-6-tablet{margin-left:50%}html.theme--documenter-dark .column.is-7,html.theme--documenter-dark .column.is-7-tablet{flex:none;width:58.3333333333%}html.theme--documenter-dark .column.is-offset-7,html.theme--documenter-dark .column.is-offset-7-tablet{margin-left:58.3333333333%}html.theme--documenter-dark .column.is-8,html.theme--documenter-dark .column.is-8-tablet{flex:none;width:66.6666666667%}html.theme--documenter-dark .column.is-offset-8,html.theme--documenter-dark .column.is-offset-8-tablet{margin-left:66.6666666667%}html.theme--documenter-dark .column.is-9,html.theme--documenter-dark .column.is-9-tablet{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9,html.theme--documenter-dark .column.is-offset-9-tablet{margin-left:75%}html.theme--documenter-dark .column.is-10,html.theme--documenter-dark .column.is-10-tablet{flex:none;width:83.3333333333%}html.theme--documenter-dark .column.is-offset-10,html.theme--documenter-dark .column.is-offset-10-tablet{margin-left:83.3333333333%}html.theme--documenter-dark .column.is-11,html.theme--documenter-dark .column.is-11-tablet{flex:none;width:91.6666666667%}html.theme--documenter-dark .column.is-offset-11,html.theme--documenter-dark .column.is-offset-11-tablet{margin-left:91.6666666667%}html.theme--documenter-dark .column.is-12,html.theme--documenter-dark .column.is-12-tablet{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12,html.theme--documenter-dark .column.is-offset-12-tablet{margin-left:100%}}@media screen and (max-width: 1055px){html.theme--documenter-dark .column.is-narrow-touch{flex:none}html.theme--documenter-dark .column.is-full-touch{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-touch{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-touch{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-touch{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-touch{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-touch{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-touch{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-touch{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-touch{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-touch{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-touch{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-touch{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-touch{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-touch{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-touch{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-touch{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-touch{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-touch{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-touch{margin-left:80%}html.theme--documenter-dark .column.is-0-touch{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-touch{margin-left:0%}html.theme--documenter-dark .column.is-1-touch{flex:none;width:8.3333333333%}html.theme--documenter-dark .column.is-offset-1-touch{margin-left:8.3333333333%}html.theme--documenter-dark .column.is-2-touch{flex:none;width:16.6666666667%}html.theme--documenter-dark .column.is-offset-2-touch{margin-left:16.6666666667%}html.theme--documenter-dark .column.is-3-touch{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-touch{margin-left:25%}html.theme--documenter-dark .column.is-4-touch{flex:none;width:33.3333333333%}html.theme--documenter-dark .column.is-offset-4-touch{margin-left:33.3333333333%}html.theme--documenter-dark .column.is-5-touch{flex:none;width:41.6666666667%}html.theme--documenter-dark .column.is-offset-5-touch{margin-left:41.6666666667%}html.theme--documenter-dark .column.is-6-touch{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-touch{margin-left:50%}html.theme--documenter-dark .column.is-7-touch{flex:none;width:58.3333333333%}html.theme--documenter-dark .column.is-offset-7-touch{margin-left:58.3333333333%}html.theme--documenter-dark .column.is-8-touch{flex:none;width:66.6666666667%}html.theme--documenter-dark .column.is-offset-8-touch{margin-left:66.6666666667%}html.theme--documenter-dark .column.is-9-touch{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-touch{margin-left:75%}html.theme--documenter-dark .column.is-10-touch{flex:none;width:83.3333333333%}html.theme--documenter-dark .column.is-offset-10-touch{margin-left:83.3333333333%}html.theme--documenter-dark .column.is-11-touch{flex:none;width:91.6666666667%}html.theme--documenter-dark .column.is-offset-11-touch{margin-left:91.6666666667%}html.theme--documenter-dark .column.is-12-touch{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-touch{margin-left:100%}}@media screen and (min-width: 1056px){html.theme--documenter-dark .column.is-narrow-desktop{flex:none}html.theme--documenter-dark .column.is-full-desktop{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-desktop{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-desktop{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-desktop{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-desktop{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-desktop{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-desktop{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-desktop{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-desktop{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-desktop{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-desktop{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-desktop{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-desktop{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-desktop{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-desktop{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-desktop{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-desktop{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-desktop{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-desktop{margin-left:80%}html.theme--documenter-dark .column.is-0-desktop{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-desktop{margin-left:0%}html.theme--documenter-dark .column.is-1-desktop{flex:none;width:8.3333333333%}html.theme--documenter-dark .column.is-offset-1-desktop{margin-left:8.3333333333%}html.theme--documenter-dark .column.is-2-desktop{flex:none;width:16.6666666667%}html.theme--documenter-dark .column.is-offset-2-desktop{margin-left:16.6666666667%}html.theme--documenter-dark .column.is-3-desktop{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-desktop{margin-left:25%}html.theme--documenter-dark .column.is-4-desktop{flex:none;width:33.3333333333%}html.theme--documenter-dark .column.is-offset-4-desktop{margin-left:33.3333333333%}html.theme--documenter-dark .column.is-5-desktop{flex:none;width:41.6666666667%}html.theme--documenter-dark .column.is-offset-5-desktop{margin-left:41.6666666667%}html.theme--documenter-dark .column.is-6-desktop{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-desktop{margin-left:50%}html.theme--documenter-dark .column.is-7-desktop{flex:none;width:58.3333333333%}html.theme--documenter-dark .column.is-offset-7-desktop{margin-left:58.3333333333%}html.theme--documenter-dark .column.is-8-desktop{flex:none;width:66.6666666667%}html.theme--documenter-dark .column.is-offset-8-desktop{margin-left:66.6666666667%}html.theme--documenter-dark .column.is-9-desktop{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-desktop{margin-left:75%}html.theme--documenter-dark .column.is-10-desktop{flex:none;width:83.3333333333%}html.theme--documenter-dark .column.is-offset-10-desktop{margin-left:83.3333333333%}html.theme--documenter-dark .column.is-11-desktop{flex:none;width:91.6666666667%}html.theme--documenter-dark .column.is-offset-11-desktop{margin-left:91.6666666667%}html.theme--documenter-dark .column.is-12-desktop{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-desktop{margin-left:100%}}@media screen and (min-width: 1216px){html.theme--documenter-dark .column.is-narrow-widescreen{flex:none}html.theme--documenter-dark .column.is-full-widescreen{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-widescreen{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-widescreen{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-widescreen{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-widescreen{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-widescreen{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-widescreen{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-widescreen{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-widescreen{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-widescreen{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-widescreen{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-widescreen{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-widescreen{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-widescreen{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-widescreen{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-widescreen{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-widescreen{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-widescreen{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-widescreen{margin-left:80%}html.theme--documenter-dark .column.is-0-widescreen{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-widescreen{margin-left:0%}html.theme--documenter-dark .column.is-1-widescreen{flex:none;width:8.3333333333%}html.theme--documenter-dark .column.is-offset-1-widescreen{margin-left:8.3333333333%}html.theme--documenter-dark .column.is-2-widescreen{flex:none;width:16.6666666667%}html.theme--documenter-dark .column.is-offset-2-widescreen{margin-left:16.6666666667%}html.theme--documenter-dark .column.is-3-widescreen{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-widescreen{margin-left:25%}html.theme--documenter-dark .column.is-4-widescreen{flex:none;width:33.3333333333%}html.theme--documenter-dark .column.is-offset-4-widescreen{margin-left:33.3333333333%}html.theme--documenter-dark .column.is-5-widescreen{flex:none;width:41.6666666667%}html.theme--documenter-dark .column.is-offset-5-widescreen{margin-left:41.6666666667%}html.theme--documenter-dark .column.is-6-widescreen{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-widescreen{margin-left:50%}html.theme--documenter-dark .column.is-7-widescreen{flex:none;width:58.3333333333%}html.theme--documenter-dark .column.is-offset-7-widescreen{margin-left:58.3333333333%}html.theme--documenter-dark .column.is-8-widescreen{flex:none;width:66.6666666667%}html.theme--documenter-dark .column.is-offset-8-widescreen{margin-left:66.6666666667%}html.theme--documenter-dark .column.is-9-widescreen{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-widescreen{margin-left:75%}html.theme--documenter-dark .column.is-10-widescreen{flex:none;width:83.3333333333%}html.theme--documenter-dark .column.is-offset-10-widescreen{margin-left:83.3333333333%}html.theme--documenter-dark .column.is-11-widescreen{flex:none;width:91.6666666667%}html.theme--documenter-dark .column.is-offset-11-widescreen{margin-left:91.6666666667%}html.theme--documenter-dark .column.is-12-widescreen{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-widescreen{margin-left:100%}}@media screen and (min-width: 1408px){html.theme--documenter-dark .column.is-narrow-fullhd{flex:none}html.theme--documenter-dark .column.is-full-fullhd{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-fullhd{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-fullhd{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-fullhd{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-fullhd{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-fullhd{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-fullhd{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-fullhd{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-fullhd{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-fullhd{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-fullhd{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-fullhd{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-fullhd{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-fullhd{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-fullhd{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-fullhd{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-fullhd{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-fullhd{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-fullhd{margin-left:80%}html.theme--documenter-dark .column.is-0-fullhd{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-fullhd{margin-left:0%}html.theme--documenter-dark .column.is-1-fullhd{flex:none;width:8.3333333333%}html.theme--documenter-dark .column.is-offset-1-fullhd{margin-left:8.3333333333%}html.theme--documenter-dark .column.is-2-fullhd{flex:none;width:16.6666666667%}html.theme--documenter-dark .column.is-offset-2-fullhd{margin-left:16.6666666667%}html.theme--documenter-dark .column.is-3-fullhd{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-fullhd{margin-left:25%}html.theme--documenter-dark .column.is-4-fullhd{flex:none;width:33.3333333333%}html.theme--documenter-dark .column.is-offset-4-fullhd{margin-left:33.3333333333%}html.theme--documenter-dark .column.is-5-fullhd{flex:none;width:41.6666666667%}html.theme--documenter-dark .column.is-offset-5-fullhd{margin-left:41.6666666667%}html.theme--documenter-dark .column.is-6-fullhd{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-fullhd{margin-left:50%}html.theme--documenter-dark .column.is-7-fullhd{flex:none;width:58.3333333333%}html.theme--documenter-dark .column.is-offset-7-fullhd{margin-left:58.3333333333%}html.theme--documenter-dark .column.is-8-fullhd{flex:none;width:66.6666666667%}html.theme--documenter-dark .column.is-offset-8-fullhd{margin-left:66.6666666667%}html.theme--documenter-dark .column.is-9-fullhd{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-fullhd{margin-left:75%}html.theme--documenter-dark .column.is-10-fullhd{flex:none;width:83.3333333333%}html.theme--documenter-dark .column.is-offset-10-fullhd{margin-left:83.3333333333%}html.theme--documenter-dark .column.is-11-fullhd{flex:none;width:91.6666666667%}html.theme--documenter-dark .column.is-offset-11-fullhd{margin-left:91.6666666667%}html.theme--documenter-dark .column.is-12-fullhd{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-fullhd{margin-left:100%}}html.theme--documenter-dark .columns{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}html.theme--documenter-dark .columns:last-child{margin-bottom:-.75rem}html.theme--documenter-dark .columns:not(:last-child){margin-bottom:calc(1.5rem - .75rem)}html.theme--documenter-dark .columns.is-centered{justify-content:center}html.theme--documenter-dark .columns.is-gapless{margin-left:0;margin-right:0;margin-top:0}html.theme--documenter-dark .columns.is-gapless>.column{margin:0;padding:0 !important}html.theme--documenter-dark .columns.is-gapless:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .columns.is-gapless:last-child{margin-bottom:0}html.theme--documenter-dark .columns.is-mobile{display:flex}html.theme--documenter-dark .columns.is-multiline{flex-wrap:wrap}html.theme--documenter-dark .columns.is-vcentered{align-items:center}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns:not(.is-desktop){display:flex}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-desktop{display:flex}}html.theme--documenter-dark .columns.is-variable{--columnGap: 0.75rem;margin-left:calc(-1 * var(--columnGap));margin-right:calc(-1 * var(--columnGap))}html.theme--documenter-dark .columns.is-variable .column{padding-left:var(--columnGap);padding-right:var(--columnGap)}html.theme--documenter-dark .columns.is-variable.is-0{--columnGap: 0rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-0-mobile{--columnGap: 0rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-0-tablet{--columnGap: 0rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-0-tablet-only{--columnGap: 0rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-0-touch{--columnGap: 0rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-0-desktop{--columnGap: 0rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-0-desktop-only{--columnGap: 0rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-0-widescreen{--columnGap: 0rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-0-widescreen-only{--columnGap: 0rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-0-fullhd{--columnGap: 0rem}}html.theme--documenter-dark .columns.is-variable.is-1{--columnGap: .25rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-1-mobile{--columnGap: .25rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-1-tablet{--columnGap: .25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-1-tablet-only{--columnGap: .25rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-1-touch{--columnGap: .25rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-1-desktop{--columnGap: .25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-1-desktop-only{--columnGap: .25rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-1-widescreen{--columnGap: .25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-1-widescreen-only{--columnGap: .25rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-1-fullhd{--columnGap: .25rem}}html.theme--documenter-dark .columns.is-variable.is-2{--columnGap: .5rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-2-mobile{--columnGap: .5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-2-tablet{--columnGap: .5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-2-tablet-only{--columnGap: .5rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-2-touch{--columnGap: .5rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-2-desktop{--columnGap: .5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-2-desktop-only{--columnGap: .5rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-2-widescreen{--columnGap: .5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-2-widescreen-only{--columnGap: .5rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-2-fullhd{--columnGap: .5rem}}html.theme--documenter-dark .columns.is-variable.is-3{--columnGap: .75rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-3-mobile{--columnGap: .75rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-3-tablet{--columnGap: .75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-3-tablet-only{--columnGap: .75rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-3-touch{--columnGap: .75rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-3-desktop{--columnGap: .75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-3-desktop-only{--columnGap: .75rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-3-widescreen{--columnGap: .75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-3-widescreen-only{--columnGap: .75rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-3-fullhd{--columnGap: .75rem}}html.theme--documenter-dark .columns.is-variable.is-4{--columnGap: 1rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-4-mobile{--columnGap: 1rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-4-tablet{--columnGap: 1rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-4-tablet-only{--columnGap: 1rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-4-touch{--columnGap: 1rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-4-desktop{--columnGap: 1rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-4-desktop-only{--columnGap: 1rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-4-widescreen{--columnGap: 1rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-4-widescreen-only{--columnGap: 1rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-4-fullhd{--columnGap: 1rem}}html.theme--documenter-dark .columns.is-variable.is-5{--columnGap: 1.25rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-5-mobile{--columnGap: 1.25rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-5-tablet{--columnGap: 1.25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-5-tablet-only{--columnGap: 1.25rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-5-touch{--columnGap: 1.25rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-5-desktop{--columnGap: 1.25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-5-desktop-only{--columnGap: 1.25rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-5-widescreen{--columnGap: 1.25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-5-widescreen-only{--columnGap: 1.25rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-5-fullhd{--columnGap: 1.25rem}}html.theme--documenter-dark .columns.is-variable.is-6{--columnGap: 1.5rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-6-mobile{--columnGap: 1.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-6-tablet{--columnGap: 1.5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-6-tablet-only{--columnGap: 1.5rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-6-touch{--columnGap: 1.5rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-6-desktop{--columnGap: 1.5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-6-desktop-only{--columnGap: 1.5rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-6-widescreen{--columnGap: 1.5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-6-widescreen-only{--columnGap: 1.5rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-6-fullhd{--columnGap: 1.5rem}}html.theme--documenter-dark .columns.is-variable.is-7{--columnGap: 1.75rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-7-mobile{--columnGap: 1.75rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-7-tablet{--columnGap: 1.75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-7-tablet-only{--columnGap: 1.75rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-7-touch{--columnGap: 1.75rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-7-desktop{--columnGap: 1.75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-7-desktop-only{--columnGap: 1.75rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-7-widescreen{--columnGap: 1.75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-7-widescreen-only{--columnGap: 1.75rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-7-fullhd{--columnGap: 1.75rem}}html.theme--documenter-dark .columns.is-variable.is-8{--columnGap: 2rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-8-mobile{--columnGap: 2rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-8-tablet{--columnGap: 2rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-8-tablet-only{--columnGap: 2rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-8-touch{--columnGap: 2rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-8-desktop{--columnGap: 2rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-8-desktop-only{--columnGap: 2rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-8-widescreen{--columnGap: 2rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-8-widescreen-only{--columnGap: 2rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-8-fullhd{--columnGap: 2rem}}html.theme--documenter-dark .tile{align-items:stretch;display:block;flex-basis:0;flex-grow:1;flex-shrink:1;min-height:min-content}html.theme--documenter-dark .tile.is-ancestor{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}html.theme--documenter-dark .tile.is-ancestor:last-child{margin-bottom:-.75rem}html.theme--documenter-dark .tile.is-ancestor:not(:last-child){margin-bottom:.75rem}html.theme--documenter-dark .tile.is-child{margin:0 !important}html.theme--documenter-dark .tile.is-parent{padding:.75rem}html.theme--documenter-dark .tile.is-vertical{flex-direction:column}html.theme--documenter-dark .tile.is-vertical>.tile.is-child:not(:last-child){margin-bottom:1.5rem !important}@media screen and (min-width: 769px),print{html.theme--documenter-dark .tile:not(.is-child){display:flex}html.theme--documenter-dark .tile.is-1{flex:none;width:8.3333333333%}html.theme--documenter-dark .tile.is-2{flex:none;width:16.6666666667%}html.theme--documenter-dark .tile.is-3{flex:none;width:25%}html.theme--documenter-dark .tile.is-4{flex:none;width:33.3333333333%}html.theme--documenter-dark .tile.is-5{flex:none;width:41.6666666667%}html.theme--documenter-dark .tile.is-6{flex:none;width:50%}html.theme--documenter-dark .tile.is-7{flex:none;width:58.3333333333%}html.theme--documenter-dark .tile.is-8{flex:none;width:66.6666666667%}html.theme--documenter-dark .tile.is-9{flex:none;width:75%}html.theme--documenter-dark .tile.is-10{flex:none;width:83.3333333333%}html.theme--documenter-dark .tile.is-11{flex:none;width:91.6666666667%}html.theme--documenter-dark .tile.is-12{flex:none;width:100%}}html.theme--documenter-dark .hero{align-items:stretch;display:flex;flex-direction:column;justify-content:space-between}html.theme--documenter-dark .hero .navbar{background:none}html.theme--documenter-dark .hero .tabs ul{border-bottom:none}html.theme--documenter-dark .hero.is-white{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-white strong{color:inherit}html.theme--documenter-dark .hero.is-white .title{color:#0a0a0a}html.theme--documenter-dark .hero.is-white .subtitle{color:rgba(10,10,10,0.9)}html.theme--documenter-dark .hero.is-white .subtitle a:not(.button),html.theme--documenter-dark .hero.is-white .subtitle strong{color:#0a0a0a}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-white .navbar-menu{background-color:#fff}}html.theme--documenter-dark .hero.is-white .navbar-item,html.theme--documenter-dark .hero.is-white .navbar-link{color:rgba(10,10,10,0.7)}html.theme--documenter-dark .hero.is-white a.navbar-item:hover,html.theme--documenter-dark .hero.is-white a.navbar-item.is-active,html.theme--documenter-dark .hero.is-white .navbar-link:hover,html.theme--documenter-dark .hero.is-white .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .hero.is-white .tabs a{color:#0a0a0a;opacity:0.9}html.theme--documenter-dark .hero.is-white .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-white .tabs li.is-active a{opacity:1}html.theme--documenter-dark .hero.is-white .tabs.is-boxed a,html.theme--documenter-dark .hero.is-white .tabs.is-toggle a{color:#0a0a0a}html.theme--documenter-dark .hero.is-white .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-white .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-white .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-white .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-white .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-white .tabs.is-toggle li.is-active a:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}html.theme--documenter-dark .hero.is-white.is-bold{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-white.is-bold .navbar-menu{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}}html.theme--documenter-dark .hero.is-black{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-black strong{color:inherit}html.theme--documenter-dark .hero.is-black .title{color:#fff}html.theme--documenter-dark .hero.is-black .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-black .subtitle a:not(.button),html.theme--documenter-dark .hero.is-black .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-black .navbar-menu{background-color:#0a0a0a}}html.theme--documenter-dark .hero.is-black .navbar-item,html.theme--documenter-dark .hero.is-black .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-black a.navbar-item:hover,html.theme--documenter-dark .hero.is-black a.navbar-item.is-active,html.theme--documenter-dark .hero.is-black .navbar-link:hover,html.theme--documenter-dark .hero.is-black .navbar-link.is-active{background-color:#000;color:#fff}html.theme--documenter-dark .hero.is-black .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-black .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-black .tabs li.is-active a{opacity:1}html.theme--documenter-dark .hero.is-black .tabs.is-boxed a,html.theme--documenter-dark .hero.is-black .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-black .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-black .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-black .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-black .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-black .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-black .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}html.theme--documenter-dark .hero.is-black.is-bold{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-black.is-bold .navbar-menu{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}}html.theme--documenter-dark .hero.is-light{background-color:#ecf0f1;color:#282f2f}html.theme--documenter-dark .hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-light strong{color:inherit}html.theme--documenter-dark .hero.is-light .title{color:#282f2f}html.theme--documenter-dark .hero.is-light .subtitle{color:rgba(40,47,47,0.9)}html.theme--documenter-dark .hero.is-light .subtitle a:not(.button),html.theme--documenter-dark .hero.is-light .subtitle strong{color:#282f2f}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-light .navbar-menu{background-color:#ecf0f1}}html.theme--documenter-dark .hero.is-light .navbar-item,html.theme--documenter-dark .hero.is-light .navbar-link{color:rgba(40,47,47,0.7)}html.theme--documenter-dark .hero.is-light a.navbar-item:hover,html.theme--documenter-dark .hero.is-light a.navbar-item.is-active,html.theme--documenter-dark .hero.is-light .navbar-link:hover,html.theme--documenter-dark .hero.is-light .navbar-link.is-active{background-color:#dde4e6;color:#282f2f}html.theme--documenter-dark .hero.is-light .tabs a{color:#282f2f;opacity:0.9}html.theme--documenter-dark .hero.is-light .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-light .tabs li.is-active a{opacity:1}html.theme--documenter-dark .hero.is-light .tabs.is-boxed a,html.theme--documenter-dark .hero.is-light .tabs.is-toggle a{color:#282f2f}html.theme--documenter-dark .hero.is-light .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-light .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-light .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-light .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-light .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-light .tabs.is-toggle li.is-active a:hover{background-color:#282f2f;border-color:#282f2f;color:#ecf0f1}html.theme--documenter-dark .hero.is-light.is-bold{background-image:linear-gradient(141deg, #cadfe0 0%, #ecf0f1 71%, #fafbfc 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-light.is-bold .navbar-menu{background-image:linear-gradient(141deg, #cadfe0 0%, #ecf0f1 71%, #fafbfc 100%)}}html.theme--documenter-dark .hero.is-dark,html.theme--documenter-dark .content kbd.hero{background-color:#282f2f;color:#ecf0f1}html.theme--documenter-dark .hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .content kbd.hero a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-dark strong,html.theme--documenter-dark .content kbd.hero strong{color:inherit}html.theme--documenter-dark .hero.is-dark .title,html.theme--documenter-dark .content kbd.hero .title{color:#ecf0f1}html.theme--documenter-dark .hero.is-dark .subtitle,html.theme--documenter-dark .content kbd.hero .subtitle{color:rgba(236,240,241,0.9)}html.theme--documenter-dark .hero.is-dark .subtitle a:not(.button),html.theme--documenter-dark .content kbd.hero .subtitle a:not(.button),html.theme--documenter-dark .hero.is-dark .subtitle strong,html.theme--documenter-dark .content kbd.hero .subtitle strong{color:#ecf0f1}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-dark .navbar-menu,html.theme--documenter-dark .content kbd.hero .navbar-menu{background-color:#282f2f}}html.theme--documenter-dark .hero.is-dark .navbar-item,html.theme--documenter-dark .content kbd.hero .navbar-item,html.theme--documenter-dark .hero.is-dark .navbar-link,html.theme--documenter-dark .content kbd.hero .navbar-link{color:rgba(236,240,241,0.7)}html.theme--documenter-dark .hero.is-dark a.navbar-item:hover,html.theme--documenter-dark .content kbd.hero a.navbar-item:hover,html.theme--documenter-dark .hero.is-dark a.navbar-item.is-active,html.theme--documenter-dark .content kbd.hero a.navbar-item.is-active,html.theme--documenter-dark .hero.is-dark .navbar-link:hover,html.theme--documenter-dark .content kbd.hero .navbar-link:hover,html.theme--documenter-dark .hero.is-dark .navbar-link.is-active,html.theme--documenter-dark .content kbd.hero .navbar-link.is-active{background-color:#1d2122;color:#ecf0f1}html.theme--documenter-dark .hero.is-dark .tabs a,html.theme--documenter-dark .content kbd.hero .tabs a{color:#ecf0f1;opacity:0.9}html.theme--documenter-dark .hero.is-dark .tabs a:hover,html.theme--documenter-dark .content kbd.hero .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-dark .tabs li.is-active a,html.theme--documenter-dark .content kbd.hero .tabs li.is-active a{opacity:1}html.theme--documenter-dark .hero.is-dark .tabs.is-boxed a,html.theme--documenter-dark .content kbd.hero .tabs.is-boxed a,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle a,html.theme--documenter-dark .content kbd.hero .tabs.is-toggle a{color:#ecf0f1}html.theme--documenter-dark .hero.is-dark .tabs.is-boxed a:hover,html.theme--documenter-dark .content kbd.hero .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle a:hover,html.theme--documenter-dark .content kbd.hero .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-dark .tabs.is-boxed li.is-active a,html.theme--documenter-dark .content kbd.hero .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-dark .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle li.is-active a,html.theme--documenter-dark .content kbd.hero .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle li.is-active a:hover{background-color:#ecf0f1;border-color:#ecf0f1;color:#282f2f}html.theme--documenter-dark .hero.is-dark.is-bold,html.theme--documenter-dark .content kbd.hero.is-bold{background-image:linear-gradient(141deg, #0f1615 0%, #282f2f 71%, #313c40 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-dark.is-bold .navbar-menu,html.theme--documenter-dark .content kbd.hero.is-bold .navbar-menu{background-image:linear-gradient(141deg, #0f1615 0%, #282f2f 71%, #313c40 100%)}}html.theme--documenter-dark .hero.is-primary,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink{background-color:#375a7f;color:#fff}html.theme--documenter-dark .hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-primary strong,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink strong{color:inherit}html.theme--documenter-dark .hero.is-primary .title,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .title{color:#fff}html.theme--documenter-dark .hero.is-primary .subtitle,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-primary .subtitle a:not(.button),html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .subtitle a:not(.button),html.theme--documenter-dark .hero.is-primary .subtitle strong,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-primary .navbar-menu,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-menu{background-color:#375a7f}}html.theme--documenter-dark .hero.is-primary .navbar-item,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-item,html.theme--documenter-dark .hero.is-primary .navbar-link,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-primary a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink a.navbar-item:hover,html.theme--documenter-dark .hero.is-primary a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink a.navbar-item.is-active,html.theme--documenter-dark .hero.is-primary .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-link:hover,html.theme--documenter-dark .hero.is-primary .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-link.is-active{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .hero.is-primary .tabs a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-primary .tabs a:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-primary .tabs li.is-active a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs li.is-active a{opacity:1}html.theme--documenter-dark .hero.is-primary .tabs.is-boxed a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-primary .tabs.is-boxed a:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle a:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-primary .tabs.is-boxed li.is-active a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-primary .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle li.is-active a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#375a7f}html.theme--documenter-dark .hero.is-primary.is-bold,html.theme--documenter-dark .docstring>section>a.hero.is-bold.docs-sourcelink{background-image:linear-gradient(141deg, #214b62 0%, #375a7f 71%, #3a5796 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-primary.is-bold .navbar-menu,html.theme--documenter-dark .docstring>section>a.hero.is-bold.docs-sourcelink .navbar-menu{background-image:linear-gradient(141deg, #214b62 0%, #375a7f 71%, #3a5796 100%)}}html.theme--documenter-dark .hero.is-link{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-link strong{color:inherit}html.theme--documenter-dark .hero.is-link .title{color:#fff}html.theme--documenter-dark .hero.is-link .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-link .subtitle a:not(.button),html.theme--documenter-dark .hero.is-link .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-link .navbar-menu{background-color:#1abc9c}}html.theme--documenter-dark .hero.is-link .navbar-item,html.theme--documenter-dark .hero.is-link .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-link a.navbar-item:hover,html.theme--documenter-dark .hero.is-link a.navbar-item.is-active,html.theme--documenter-dark .hero.is-link .navbar-link:hover,html.theme--documenter-dark .hero.is-link .navbar-link.is-active{background-color:#17a689;color:#fff}html.theme--documenter-dark .hero.is-link .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-link .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-link .tabs li.is-active a{opacity:1}html.theme--documenter-dark .hero.is-link .tabs.is-boxed a,html.theme--documenter-dark .hero.is-link .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-link .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-link .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-link .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-link .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-link .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-link .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#1abc9c}html.theme--documenter-dark .hero.is-link.is-bold{background-image:linear-gradient(141deg, #0c9764 0%, #1abc9c 71%, #17d8d2 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-link.is-bold .navbar-menu{background-image:linear-gradient(141deg, #0c9764 0%, #1abc9c 71%, #17d8d2 100%)}}html.theme--documenter-dark .hero.is-info{background-color:#024c7d;color:#fff}html.theme--documenter-dark .hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-info strong{color:inherit}html.theme--documenter-dark .hero.is-info .title{color:#fff}html.theme--documenter-dark .hero.is-info .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-info .subtitle a:not(.button),html.theme--documenter-dark .hero.is-info .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-info .navbar-menu{background-color:#024c7d}}html.theme--documenter-dark .hero.is-info .navbar-item,html.theme--documenter-dark .hero.is-info .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-info a.navbar-item:hover,html.theme--documenter-dark .hero.is-info a.navbar-item.is-active,html.theme--documenter-dark .hero.is-info .navbar-link:hover,html.theme--documenter-dark .hero.is-info .navbar-link.is-active{background-color:#023d64;color:#fff}html.theme--documenter-dark .hero.is-info .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-info .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-info .tabs li.is-active a{opacity:1}html.theme--documenter-dark .hero.is-info .tabs.is-boxed a,html.theme--documenter-dark .hero.is-info .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-info .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-info .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-info .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-info .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-info .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-info .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#024c7d}html.theme--documenter-dark .hero.is-info.is-bold{background-image:linear-gradient(141deg, #003a4c 0%, #024c7d 71%, #004299 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-info.is-bold .navbar-menu{background-image:linear-gradient(141deg, #003a4c 0%, #024c7d 71%, #004299 100%)}}html.theme--documenter-dark .hero.is-success{background-color:#008438;color:#fff}html.theme--documenter-dark .hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-success strong{color:inherit}html.theme--documenter-dark .hero.is-success .title{color:#fff}html.theme--documenter-dark .hero.is-success .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-success .subtitle a:not(.button),html.theme--documenter-dark .hero.is-success .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-success .navbar-menu{background-color:#008438}}html.theme--documenter-dark .hero.is-success .navbar-item,html.theme--documenter-dark .hero.is-success .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-success a.navbar-item:hover,html.theme--documenter-dark .hero.is-success a.navbar-item.is-active,html.theme--documenter-dark .hero.is-success .navbar-link:hover,html.theme--documenter-dark .hero.is-success .navbar-link.is-active{background-color:#006b2d;color:#fff}html.theme--documenter-dark .hero.is-success .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-success .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-success .tabs li.is-active a{opacity:1}html.theme--documenter-dark .hero.is-success .tabs.is-boxed a,html.theme--documenter-dark .hero.is-success .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-success .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-success .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-success .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-success .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-success .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-success .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#008438}html.theme--documenter-dark .hero.is-success.is-bold{background-image:linear-gradient(141deg, #005115 0%, #008438 71%, #009e5d 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-success.is-bold .navbar-menu{background-image:linear-gradient(141deg, #005115 0%, #008438 71%, #009e5d 100%)}}html.theme--documenter-dark .hero.is-warning{background-color:#ad8100;color:#fff}html.theme--documenter-dark .hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-warning strong{color:inherit}html.theme--documenter-dark .hero.is-warning .title{color:#fff}html.theme--documenter-dark .hero.is-warning .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-warning .subtitle a:not(.button),html.theme--documenter-dark .hero.is-warning .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-warning .navbar-menu{background-color:#ad8100}}html.theme--documenter-dark .hero.is-warning .navbar-item,html.theme--documenter-dark .hero.is-warning .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-warning a.navbar-item:hover,html.theme--documenter-dark .hero.is-warning a.navbar-item.is-active,html.theme--documenter-dark .hero.is-warning .navbar-link:hover,html.theme--documenter-dark .hero.is-warning .navbar-link.is-active{background-color:#946e00;color:#fff}html.theme--documenter-dark .hero.is-warning .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-warning .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-warning .tabs li.is-active a{opacity:1}html.theme--documenter-dark .hero.is-warning .tabs.is-boxed a,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-warning .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-warning .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-warning .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#ad8100}html.theme--documenter-dark .hero.is-warning.is-bold{background-image:linear-gradient(141deg, #7a4700 0%, #ad8100 71%, #c7b500 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-warning.is-bold .navbar-menu{background-image:linear-gradient(141deg, #7a4700 0%, #ad8100 71%, #c7b500 100%)}}html.theme--documenter-dark .hero.is-danger{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-danger strong{color:inherit}html.theme--documenter-dark .hero.is-danger .title{color:#fff}html.theme--documenter-dark .hero.is-danger .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-danger .subtitle a:not(.button),html.theme--documenter-dark .hero.is-danger .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-danger .navbar-menu{background-color:#9e1b0d}}html.theme--documenter-dark .hero.is-danger .navbar-item,html.theme--documenter-dark .hero.is-danger .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-danger a.navbar-item:hover,html.theme--documenter-dark .hero.is-danger a.navbar-item.is-active,html.theme--documenter-dark .hero.is-danger .navbar-link:hover,html.theme--documenter-dark .hero.is-danger .navbar-link.is-active{background-color:#86170b;color:#fff}html.theme--documenter-dark .hero.is-danger .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-danger .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-danger .tabs li.is-active a{opacity:1}html.theme--documenter-dark .hero.is-danger .tabs.is-boxed a,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-danger .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-danger .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-danger .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#9e1b0d}html.theme--documenter-dark .hero.is-danger.is-bold{background-image:linear-gradient(141deg, #75030b 0%, #9e1b0d 71%, #ba380a 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-danger.is-bold .navbar-menu{background-image:linear-gradient(141deg, #75030b 0%, #9e1b0d 71%, #ba380a 100%)}}html.theme--documenter-dark .hero.is-small .hero-body,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.hero .hero-body{padding-bottom:1.5rem;padding-top:1.5rem}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero.is-medium .hero-body{padding-bottom:9rem;padding-top:9rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero.is-large .hero-body{padding-bottom:18rem;padding-top:18rem}}html.theme--documenter-dark .hero.is-halfheight .hero-body,html.theme--documenter-dark .hero.is-fullheight .hero-body,html.theme--documenter-dark .hero.is-fullheight-with-navbar .hero-body{align-items:center;display:flex}html.theme--documenter-dark .hero.is-halfheight .hero-body>.container,html.theme--documenter-dark .hero.is-fullheight .hero-body>.container,html.theme--documenter-dark .hero.is-fullheight-with-navbar .hero-body>.container{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .hero.is-halfheight{min-height:50vh}html.theme--documenter-dark .hero.is-fullheight{min-height:100vh}html.theme--documenter-dark .hero-video{overflow:hidden}html.theme--documenter-dark .hero-video video{left:50%;min-height:100%;min-width:100%;position:absolute;top:50%;transform:translate3d(-50%, -50%, 0)}html.theme--documenter-dark .hero-video.is-transparent{opacity:0.3}@media screen and (max-width: 768px){html.theme--documenter-dark .hero-video{display:none}}html.theme--documenter-dark .hero-buttons{margin-top:1.5rem}@media screen and (max-width: 768px){html.theme--documenter-dark .hero-buttons .button{display:flex}html.theme--documenter-dark .hero-buttons .button:not(:last-child){margin-bottom:0.75rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero-buttons{display:flex;justify-content:center}html.theme--documenter-dark .hero-buttons .button:not(:last-child){margin-right:1.5rem}}html.theme--documenter-dark .hero-head,html.theme--documenter-dark .hero-foot{flex-grow:0;flex-shrink:0}html.theme--documenter-dark .hero-body{flex-grow:1;flex-shrink:0;padding:3rem 1.5rem}html.theme--documenter-dark .section{padding:3rem 1.5rem}@media screen and (min-width: 1056px){html.theme--documenter-dark .section.is-medium{padding:9rem 1.5rem}html.theme--documenter-dark .section.is-large{padding:18rem 1.5rem}}html.theme--documenter-dark .footer{background-color:#282f2f;padding:3rem 1.5rem 6rem}html.theme--documenter-dark hr{height:1px}html.theme--documenter-dark h6{text-transform:uppercase;letter-spacing:0.5px}html.theme--documenter-dark .hero{background-color:#343c3d}html.theme--documenter-dark a{transition:all 200ms ease}html.theme--documenter-dark .button{transition:all 200ms ease;border-width:1px;color:#fff}html.theme--documenter-dark .button.is-active,html.theme--documenter-dark .button.is-focused,html.theme--documenter-dark .button:active,html.theme--documenter-dark .button:focus{box-shadow:0 0 0 2px rgba(140,155,157,0.5)}html.theme--documenter-dark .button.is-white.is-hovered,html.theme--documenter-dark .button.is-white:hover{background-color:#fff}html.theme--documenter-dark .button.is-white.is-active,html.theme--documenter-dark .button.is-white.is-focused,html.theme--documenter-dark .button.is-white:active,html.theme--documenter-dark .button.is-white:focus{border-color:#fff;box-shadow:0 0 0 2px rgba(255,255,255,0.5)}html.theme--documenter-dark .button.is-black.is-hovered,html.theme--documenter-dark .button.is-black:hover{background-color:#1d1d1d}html.theme--documenter-dark .button.is-black.is-active,html.theme--documenter-dark .button.is-black.is-focused,html.theme--documenter-dark .button.is-black:active,html.theme--documenter-dark .button.is-black:focus{border-color:#0a0a0a;box-shadow:0 0 0 2px rgba(10,10,10,0.5)}html.theme--documenter-dark .button.is-light.is-hovered,html.theme--documenter-dark .button.is-light:hover{background-color:#fff}html.theme--documenter-dark .button.is-light.is-active,html.theme--documenter-dark .button.is-light.is-focused,html.theme--documenter-dark .button.is-light:active,html.theme--documenter-dark .button.is-light:focus{border-color:#ecf0f1;box-shadow:0 0 0 2px rgba(236,240,241,0.5)}html.theme--documenter-dark .button.is-dark.is-hovered,html.theme--documenter-dark .content kbd.button.is-hovered,html.theme--documenter-dark .button.is-dark:hover,html.theme--documenter-dark .content kbd.button:hover{background-color:#3a4344}html.theme--documenter-dark .button.is-dark.is-active,html.theme--documenter-dark .content kbd.button.is-active,html.theme--documenter-dark .button.is-dark.is-focused,html.theme--documenter-dark .content kbd.button.is-focused,html.theme--documenter-dark .button.is-dark:active,html.theme--documenter-dark .content kbd.button:active,html.theme--documenter-dark .button.is-dark:focus,html.theme--documenter-dark .content kbd.button:focus{border-color:#282f2f;box-shadow:0 0 0 2px rgba(40,47,47,0.5)}html.theme--documenter-dark .button.is-primary.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-hovered.docs-sourcelink,html.theme--documenter-dark .button.is-primary:hover,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:hover{background-color:#436d9a}html.theme--documenter-dark .button.is-primary.is-active,html.theme--documenter-dark .docstring>section>a.button.is-active.docs-sourcelink,html.theme--documenter-dark .button.is-primary.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-focused.docs-sourcelink,html.theme--documenter-dark .button.is-primary:active,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:active,html.theme--documenter-dark .button.is-primary:focus,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:focus{border-color:#375a7f;box-shadow:0 0 0 2px rgba(55,90,127,0.5)}html.theme--documenter-dark .button.is-link.is-hovered,html.theme--documenter-dark .button.is-link:hover{background-color:#1fdeb8}html.theme--documenter-dark .button.is-link.is-active,html.theme--documenter-dark .button.is-link.is-focused,html.theme--documenter-dark .button.is-link:active,html.theme--documenter-dark .button.is-link:focus{border-color:#1abc9c;box-shadow:0 0 0 2px rgba(26,188,156,0.5)}html.theme--documenter-dark .button.is-info.is-hovered,html.theme--documenter-dark .button.is-info:hover{background-color:#0363a3}html.theme--documenter-dark .button.is-info.is-active,html.theme--documenter-dark .button.is-info.is-focused,html.theme--documenter-dark .button.is-info:active,html.theme--documenter-dark .button.is-info:focus{border-color:#024c7d;box-shadow:0 0 0 2px rgba(2,76,125,0.5)}html.theme--documenter-dark .button.is-success.is-hovered,html.theme--documenter-dark .button.is-success:hover{background-color:#00aa48}html.theme--documenter-dark .button.is-success.is-active,html.theme--documenter-dark .button.is-success.is-focused,html.theme--documenter-dark .button.is-success:active,html.theme--documenter-dark .button.is-success:focus{border-color:#008438;box-shadow:0 0 0 2px rgba(0,132,56,0.5)}html.theme--documenter-dark .button.is-warning.is-hovered,html.theme--documenter-dark .button.is-warning:hover{background-color:#d39e00}html.theme--documenter-dark .button.is-warning.is-active,html.theme--documenter-dark .button.is-warning.is-focused,html.theme--documenter-dark .button.is-warning:active,html.theme--documenter-dark .button.is-warning:focus{border-color:#ad8100;box-shadow:0 0 0 2px rgba(173,129,0,0.5)}html.theme--documenter-dark .button.is-danger.is-hovered,html.theme--documenter-dark .button.is-danger:hover{background-color:#c12110}html.theme--documenter-dark .button.is-danger.is-active,html.theme--documenter-dark .button.is-danger.is-focused,html.theme--documenter-dark .button.is-danger:active,html.theme--documenter-dark .button.is-danger:focus{border-color:#9e1b0d;box-shadow:0 0 0 2px rgba(158,27,13,0.5)}html.theme--documenter-dark .label{color:#dbdee0}html.theme--documenter-dark .button,html.theme--documenter-dark .control.has-icons-left .icon,html.theme--documenter-dark .control.has-icons-right .icon,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .select,html.theme--documenter-dark .select select,html.theme--documenter-dark .textarea{height:2.5em}html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark .textarea{transition:all 200ms ease;box-shadow:none;border-width:1px;padding-left:1em;padding-right:1em}html.theme--documenter-dark .select:after,html.theme--documenter-dark .select select{border-width:1px}html.theme--documenter-dark .control.has-addons .button,html.theme--documenter-dark .control.has-addons .input,html.theme--documenter-dark .control.has-addons #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .control.has-addons form.docs-search>input,html.theme--documenter-dark .control.has-addons .select{margin-right:-1px}html.theme--documenter-dark .notification{background-color:#343c3d}html.theme--documenter-dark .card{box-shadow:none;border:1px solid #343c3d;background-color:#282f2f;border-radius:.4em}html.theme--documenter-dark .card .card-image img{border-radius:.4em .4em 0 0}html.theme--documenter-dark .card .card-header{box-shadow:none;background-color:rgba(18,18,18,0.2);border-radius:.4em .4em 0 0}html.theme--documenter-dark .card .card-footer{background-color:rgba(18,18,18,0.2)}html.theme--documenter-dark .card .card-footer,html.theme--documenter-dark .card .card-footer-item{border-width:1px;border-color:#343c3d}html.theme--documenter-dark .notification.is-white a:not(.button){color:#0a0a0a;text-decoration:underline}html.theme--documenter-dark .notification.is-black a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-light a:not(.button){color:#282f2f;text-decoration:underline}html.theme--documenter-dark .notification.is-dark a:not(.button),html.theme--documenter-dark .content kbd.notification a:not(.button){color:#ecf0f1;text-decoration:underline}html.theme--documenter-dark .notification.is-primary a:not(.button),html.theme--documenter-dark .docstring>section>a.notification.docs-sourcelink a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-link a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-info a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-success a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-warning a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-danger a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .tag,html.theme--documenter-dark .content kbd,html.theme--documenter-dark .docstring>section>a.docs-sourcelink{border-radius:.4em}html.theme--documenter-dark .menu-list a{transition:all 300ms ease}html.theme--documenter-dark .modal-card-body{background-color:#282f2f}html.theme--documenter-dark .modal-card-foot,html.theme--documenter-dark .modal-card-head{border-color:#343c3d}html.theme--documenter-dark .message-header{font-weight:700;background-color:#343c3d;color:#fff}html.theme--documenter-dark .message-body{border-width:1px;border-color:#343c3d}html.theme--documenter-dark .navbar{border-radius:.4em}html.theme--documenter-dark .navbar.is-transparent{background:none}html.theme--documenter-dark .navbar.is-primary .navbar-dropdown a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active{background-color:#1abc9c}@media screen and (max-width: 1055px){html.theme--documenter-dark .navbar .navbar-menu{background-color:#375a7f;border-radius:0 0 .4em .4em}}html.theme--documenter-dark .hero .navbar,html.theme--documenter-dark body>.navbar{border-radius:0}html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-previous{border-width:1px}html.theme--documenter-dark .panel-block,html.theme--documenter-dark .panel-heading,html.theme--documenter-dark .panel-tabs{border-width:1px}html.theme--documenter-dark .panel-block:first-child,html.theme--documenter-dark .panel-heading:first-child,html.theme--documenter-dark .panel-tabs:first-child{border-top-width:1px}html.theme--documenter-dark .panel-heading{font-weight:700}html.theme--documenter-dark .panel-tabs a{border-width:1px;margin-bottom:-1px}html.theme--documenter-dark .panel-tabs a.is-active{border-bottom-color:#17a689}html.theme--documenter-dark .panel-block:hover{color:#1dd2af}html.theme--documenter-dark .panel-block:hover .panel-icon{color:#1dd2af}html.theme--documenter-dark .panel-block.is-active .panel-icon{color:#17a689}html.theme--documenter-dark .tabs a{border-bottom-width:1px;margin-bottom:-1px}html.theme--documenter-dark .tabs ul{border-bottom-width:1px}html.theme--documenter-dark .tabs.is-boxed a{border-width:1px}html.theme--documenter-dark .tabs.is-boxed li.is-active a{background-color:#1f2424}html.theme--documenter-dark .tabs.is-toggle li a{border-width:1px;margin-bottom:0}html.theme--documenter-dark .tabs.is-toggle li+li{margin-left:-1px}html.theme--documenter-dark .hero.is-white .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-black .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-light .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-dark .navbar .navbar-dropdown .navbar-item:hover,html.theme--documenter-dark .content kbd.hero .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-primary .navbar .navbar-dropdown .navbar-item:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-link .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-info .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-success .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-warning .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-danger .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark h1 .docs-heading-anchor,html.theme--documenter-dark h1 .docs-heading-anchor:hover,html.theme--documenter-dark h1 .docs-heading-anchor:visited,html.theme--documenter-dark h2 .docs-heading-anchor,html.theme--documenter-dark h2 .docs-heading-anchor:hover,html.theme--documenter-dark h2 .docs-heading-anchor:visited,html.theme--documenter-dark h3 .docs-heading-anchor,html.theme--documenter-dark h3 .docs-heading-anchor:hover,html.theme--documenter-dark h3 .docs-heading-anchor:visited,html.theme--documenter-dark h4 .docs-heading-anchor,html.theme--documenter-dark h4 .docs-heading-anchor:hover,html.theme--documenter-dark h4 .docs-heading-anchor:visited,html.theme--documenter-dark h5 .docs-heading-anchor,html.theme--documenter-dark h5 .docs-heading-anchor:hover,html.theme--documenter-dark h5 .docs-heading-anchor:visited,html.theme--documenter-dark h6 .docs-heading-anchor,html.theme--documenter-dark h6 .docs-heading-anchor:hover,html.theme--documenter-dark h6 .docs-heading-anchor:visited{color:#f2f2f2}html.theme--documenter-dark h1 .docs-heading-anchor-permalink,html.theme--documenter-dark h2 .docs-heading-anchor-permalink,html.theme--documenter-dark h3 .docs-heading-anchor-permalink,html.theme--documenter-dark h4 .docs-heading-anchor-permalink,html.theme--documenter-dark h5 .docs-heading-anchor-permalink,html.theme--documenter-dark h6 .docs-heading-anchor-permalink{visibility:hidden;vertical-align:middle;margin-left:0.5em;font-size:0.7rem}html.theme--documenter-dark h1 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h2 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h3 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h4 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h5 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h6 .docs-heading-anchor-permalink::before{font-family:"Font Awesome 5 Free";font-weight:900;content:"\f0c1"}html.theme--documenter-dark h1:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h2:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h3:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h4:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h5:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h6:hover .docs-heading-anchor-permalink{visibility:visible}html.theme--documenter-dark .docs-light-only{display:none !important}html.theme--documenter-dark pre{position:relative;overflow:hidden}html.theme--documenter-dark pre code,html.theme--documenter-dark pre code.hljs{padding:0 .75rem !important;overflow:auto;display:block}html.theme--documenter-dark pre code:first-of-type,html.theme--documenter-dark pre code.hljs:first-of-type{padding-top:0.5rem !important}html.theme--documenter-dark pre code:last-of-type,html.theme--documenter-dark pre code.hljs:last-of-type{padding-bottom:0.5rem !important}html.theme--documenter-dark pre .copy-button{opacity:0.2;transition:opacity 0.2s;position:absolute;right:0em;top:0em;padding:0.5em;width:2.5em;height:2.5em;background:transparent;border:none;font-family:"Font Awesome 5 Free";color:#fff;cursor:pointer;text-align:center}html.theme--documenter-dark pre .copy-button:focus,html.theme--documenter-dark pre .copy-button:hover{opacity:1;background:rgba(255,255,255,0.1);color:#1abc9c}html.theme--documenter-dark pre .copy-button.success{color:#259a12;opacity:1}html.theme--documenter-dark pre .copy-button.error{color:#cb3c33;opacity:1}html.theme--documenter-dark pre:hover .copy-button{opacity:1}html.theme--documenter-dark .admonition{background-color:#282f2f;border-style:solid;border-width:1px;border-color:#5e6d6f;border-radius:.4em;font-size:15px}html.theme--documenter-dark .admonition strong{color:currentColor}html.theme--documenter-dark .admonition.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.admonition{font-size:.85em}html.theme--documenter-dark .admonition.is-medium{font-size:1.25rem}html.theme--documenter-dark .admonition.is-large{font-size:1.5rem}html.theme--documenter-dark .admonition.is-default{background-color:#282f2f;border-color:#5e6d6f}html.theme--documenter-dark .admonition.is-default>.admonition-header{background-color:#5e6d6f;color:#fff}html.theme--documenter-dark .admonition.is-default>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-info{background-color:#282f2f;border-color:#024c7d}html.theme--documenter-dark .admonition.is-info>.admonition-header{background-color:#024c7d;color:#fff}html.theme--documenter-dark .admonition.is-info>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-success{background-color:#282f2f;border-color:#008438}html.theme--documenter-dark .admonition.is-success>.admonition-header{background-color:#008438;color:#fff}html.theme--documenter-dark .admonition.is-success>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-warning{background-color:#282f2f;border-color:#ad8100}html.theme--documenter-dark .admonition.is-warning>.admonition-header{background-color:#ad8100;color:#fff}html.theme--documenter-dark .admonition.is-warning>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-danger{background-color:#282f2f;border-color:#9e1b0d}html.theme--documenter-dark .admonition.is-danger>.admonition-header{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .admonition.is-danger>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-compat{background-color:#282f2f;border-color:#137886}html.theme--documenter-dark .admonition.is-compat>.admonition-header{background-color:#137886;color:#fff}html.theme--documenter-dark .admonition.is-compat>.admonition-body{color:#fff}html.theme--documenter-dark .admonition-header{color:#fff;background-color:#5e6d6f;align-items:center;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.5rem .75rem;position:relative}html.theme--documenter-dark .admonition-header:before{font-family:"Font Awesome 5 Free";font-weight:900;margin-right:.75rem;content:"\f06a"}html.theme--documenter-dark .admonition-body{color:#fff;padding:0.5rem .75rem}html.theme--documenter-dark .admonition-body pre{background-color:#282f2f}html.theme--documenter-dark .admonition-body code{background-color:rgba(255,255,255,0.05)}html.theme--documenter-dark .docstring{margin-bottom:1em;background-color:rgba(0,0,0,0);border:1px solid #5e6d6f;box-shadow:none;max-width:100%}html.theme--documenter-dark .docstring>header{display:flex;flex-grow:1;align-items:stretch;padding:0.5rem .75rem;background-color:#282f2f;box-shadow:0 1px 2px rgba(10,10,10,0.1);box-shadow:none;border-bottom:1px solid #5e6d6f}html.theme--documenter-dark .docstring>header code{background-color:transparent}html.theme--documenter-dark .docstring>header .docstring-binding{margin-right:0.3em}html.theme--documenter-dark .docstring>header .docstring-category{margin-left:0.3em}html.theme--documenter-dark .docstring>section{position:relative;padding:.75rem .75rem;border-bottom:1px solid #5e6d6f}html.theme--documenter-dark .docstring>section:last-child{border-bottom:none}html.theme--documenter-dark .docstring>section>a.docs-sourcelink{transition:opacity 0.3s;opacity:0;position:absolute;right:.375rem;bottom:.375rem}html.theme--documenter-dark .docstring>section>a.docs-sourcelink:focus{opacity:1 !important}html.theme--documenter-dark .docstring:hover>section>a.docs-sourcelink{opacity:0.2}html.theme--documenter-dark .docstring:focus-within>section>a.docs-sourcelink{opacity:0.2}html.theme--documenter-dark .docstring>section:hover a.docs-sourcelink{opacity:1}html.theme--documenter-dark .documenter-example-output{background-color:#1f2424}html.theme--documenter-dark .outdated-warning-overlay{position:fixed;top:0;left:0;right:0;box-shadow:0 0 10px rgba(0,0,0,0.3);z-index:999;background-color:#282f2f;color:#fff;border-bottom:3px solid #9e1b0d;padding:10px 35px;text-align:center;font-size:15px}html.theme--documenter-dark .outdated-warning-overlay .outdated-warning-closer{position:absolute;top:calc(50% - 10px);right:18px;cursor:pointer;width:12px}html.theme--documenter-dark .outdated-warning-overlay a{color:#1abc9c}html.theme--documenter-dark .outdated-warning-overlay a:hover{color:#1dd2af}html.theme--documenter-dark .content pre{border:1px solid #5e6d6f}html.theme--documenter-dark .content code{font-weight:inherit}html.theme--documenter-dark .content a code{color:#1abc9c}html.theme--documenter-dark .content h1 code,html.theme--documenter-dark .content h2 code,html.theme--documenter-dark .content h3 code,html.theme--documenter-dark .content h4 code,html.theme--documenter-dark .content h5 code,html.theme--documenter-dark .content h6 code{color:#f2f2f2}html.theme--documenter-dark .content table{display:block;width:initial;max-width:100%;overflow-x:auto}html.theme--documenter-dark .content blockquote>ul:first-child,html.theme--documenter-dark .content blockquote>ol:first-child,html.theme--documenter-dark .content .admonition-body>ul:first-child,html.theme--documenter-dark .content .admonition-body>ol:first-child{margin-top:0}html.theme--documenter-dark pre,html.theme--documenter-dark code{font-variant-ligatures:no-contextual}html.theme--documenter-dark .breadcrumb a.is-disabled{cursor:default;pointer-events:none}html.theme--documenter-dark .breadcrumb a.is-disabled,html.theme--documenter-dark .breadcrumb a.is-disabled:hover{color:#f2f2f2}html.theme--documenter-dark .hljs{background:initial !important}html.theme--documenter-dark .katex .katex-mathml{top:0;right:0}html.theme--documenter-dark .katex-display,html.theme--documenter-dark mjx-container,html.theme--documenter-dark .MathJax_Display{margin:0.5em 0 !important}html.theme--documenter-dark html{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto}html.theme--documenter-dark li.no-marker{list-style:none}html.theme--documenter-dark #documenter .docs-main>article{overflow-wrap:break-word}html.theme--documenter-dark #documenter .docs-main>article .math-container{overflow-x:auto;overflow-y:hidden}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-main{max-width:52rem;margin-left:20rem;padding-right:1rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main{width:100%}html.theme--documenter-dark #documenter .docs-main>article{max-width:52rem;margin-left:auto;margin-right:auto;margin-bottom:1rem;padding:0 1rem}html.theme--documenter-dark #documenter .docs-main>header,html.theme--documenter-dark #documenter .docs-main>nav{max-width:100%;width:100%;margin:0}}html.theme--documenter-dark #documenter .docs-main header.docs-navbar{background-color:#1f2424;border-bottom:1px solid #5e6d6f;z-index:2;min-height:4rem;margin-bottom:1rem;display:flex}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .breadcrumb{flex-grow:1}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right{display:flex;white-space:nowrap}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-icon,html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-label,html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-sidebar-button{display:inline-block}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-label{padding:0;margin-left:0.3em}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-settings-button{margin:auto 0 auto 1rem}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-sidebar-button{font-size:1.5rem;margin:auto 0 auto 1rem}html.theme--documenter-dark #documenter .docs-main header.docs-navbar>*{margin:auto 0}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main header.docs-navbar{position:sticky;top:0;padding:0 1rem;transition-property:top, box-shadow;-webkit-transition-property:top, box-shadow;transition-duration:0.3s;-webkit-transition-duration:0.3s}html.theme--documenter-dark #documenter .docs-main header.docs-navbar.headroom--not-top{box-shadow:.2rem 0rem .4rem #171717;transition-duration:0.7s;-webkit-transition-duration:0.7s}html.theme--documenter-dark #documenter .docs-main header.docs-navbar.headroom--unpinned.headroom--not-top.headroom--not-bottom{top:-4.5rem;transition-duration:0.7s;-webkit-transition-duration:0.7s}}html.theme--documenter-dark #documenter .docs-main section.footnotes{border-top:1px solid #5e6d6f}html.theme--documenter-dark #documenter .docs-main section.footnotes li .tag:first-child,html.theme--documenter-dark #documenter .docs-main section.footnotes li .docstring>section>a.docs-sourcelink:first-child,html.theme--documenter-dark #documenter .docs-main section.footnotes li .content kbd:first-child,html.theme--documenter-dark .content #documenter .docs-main section.footnotes li kbd:first-child{margin-right:1em;margin-bottom:0.4em}html.theme--documenter-dark #documenter .docs-main .docs-footer{display:flex;flex-wrap:wrap;margin-left:0;margin-right:0;border-top:1px solid #5e6d6f;padding-top:1rem;padding-bottom:1rem}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main .docs-footer{padding-left:1rem;padding-right:1rem}}html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-nextpage,html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-prevpage{flex-grow:1}html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-nextpage{text-align:right}html.theme--documenter-dark #documenter .docs-main .docs-footer .flexbox-break{flex-basis:100%;height:0}html.theme--documenter-dark #documenter .docs-main .docs-footer .footer-message{font-size:0.8em;margin:0.5em auto 0 auto;text-align:center}html.theme--documenter-dark #documenter .docs-sidebar{display:flex;flex-direction:column;color:#fff;background-color:#282f2f;border-right:1px solid #5e6d6f;padding:0;flex:0 0 18rem;z-index:5;font-size:15px;position:fixed;left:-18rem;width:18rem;height:100%;transition:left 0.3s}html.theme--documenter-dark #documenter .docs-sidebar.visible{left:0;box-shadow:.4rem 0rem .8rem #171717}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-sidebar.visible{box-shadow:none}}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-sidebar{left:0;top:0}}html.theme--documenter-dark #documenter .docs-sidebar .docs-logo{margin-top:1rem;padding:0 1rem}html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img{max-height:6rem;margin:auto}html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name{flex-shrink:0;font-size:1.5rem;font-weight:700;text-align:center;white-space:nowrap;overflow:hidden;padding:0.5rem 0}html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name .docs-autofit{max-width:16.2rem}html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name a,html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name a:hover{color:#fff}html.theme--documenter-dark #documenter .docs-sidebar .docs-version-selector{border-top:1px solid #5e6d6f;display:none;padding:0.5rem}html.theme--documenter-dark #documenter .docs-sidebar .docs-version-selector.visible{display:flex}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu{flex-grow:1;user-select:none;border-top:1px solid #5e6d6f;padding-bottom:1.5rem}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu>li>.tocitem{font-weight:bold}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu>li li{font-size:14.25px;margin-left:1em;border-left:1px solid #5e6d6f}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input.collapse-toggle{display:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.collapsed{display:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input:checked~ul.collapsed{display:block}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem{display:flex}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-label{flex-grow:2}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron{display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1;font-size:11.25px;margin-left:1rem;margin-top:auto;margin-bottom:auto}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron::before{font-family:"Font Awesome 5 Free";font-weight:900;content:"\f054"}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input:checked~label.tocitem .docs-chevron::before{content:"\f078"}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem{display:block;padding:0.5rem 0.5rem}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem,html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem:hover{color:#fff;background:#282f2f}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu a.tocitem:hover,html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem:hover{color:#fff;background-color:#32393a}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active{border-top:1px solid #5e6d6f;border-bottom:1px solid #5e6d6f;background-color:#1f2424}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active .tocitem,html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active .tocitem:hover{background-color:#1f2424;color:#fff}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active ul.internal .tocitem:hover{background-color:#32393a;color:#fff}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu>li.is-active:first-child{border-top:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal{margin:0 0.5rem 0.5rem;border-top:1px solid #5e6d6f}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal li{font-size:12.75px;border-left:none;margin-left:0;margin-top:0.5rem}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal .tocitem{width:100%;padding:0}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal .tocitem::before{content:"⚬";margin-right:0.4em}html.theme--documenter-dark #documenter .docs-sidebar form.docs-search{margin:auto;margin-top:0.5rem;margin-bottom:0.5rem}html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{width:14.4rem}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu{overflow-y:auto;-webkit-overflow-scroll:touch}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar{width:.3rem;background:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#3b4445}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb:hover{background:#4e5a5c}}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-sidebar{overflow-y:auto;-webkit-overflow-scroll:touch}html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar{width:.3rem;background:none}html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#3b4445}html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar-thumb:hover{background:#4e5a5c}}html.theme--documenter-dark #documenter .docs-main #documenter-search-info{margin-bottom:1rem}html.theme--documenter-dark #documenter .docs-main #documenter-search-results{list-style-type:circle;list-style-position:outside}html.theme--documenter-dark #documenter .docs-main #documenter-search-results li{margin-left:2rem}html.theme--documenter-dark #documenter .docs-main #documenter-search-results .docs-highlight{background-color:yellow}html.theme--documenter-dark{background-color:#1f2424;font-size:16px;min-width:300px;overflow-x:auto;overflow-y:scroll;text-rendering:optimizeLegibility;text-size-adjust:100%}html.theme--documenter-dark .ansi span.sgr1{font-weight:bolder}html.theme--documenter-dark .ansi span.sgr2{font-weight:lighter}html.theme--documenter-dark .ansi span.sgr3{font-style:italic}html.theme--documenter-dark .ansi span.sgr4{text-decoration:underline}html.theme--documenter-dark .ansi span.sgr7{color:#1f2424;background-color:#fff}html.theme--documenter-dark .ansi span.sgr8{color:transparent}html.theme--documenter-dark .ansi span.sgr8 span{color:transparent}html.theme--documenter-dark .ansi span.sgr9{text-decoration:line-through}html.theme--documenter-dark .ansi span.sgr30{color:#242424}html.theme--documenter-dark .ansi span.sgr31{color:#f6705f}html.theme--documenter-dark .ansi span.sgr32{color:#4fb43a}html.theme--documenter-dark .ansi span.sgr33{color:#f4c72f}html.theme--documenter-dark .ansi span.sgr34{color:#7587f0}html.theme--documenter-dark .ansi span.sgr35{color:#bc89d3}html.theme--documenter-dark .ansi span.sgr36{color:#49b6ca}html.theme--documenter-dark .ansi span.sgr37{color:#b3bdbe}html.theme--documenter-dark .ansi span.sgr40{background-color:#242424}html.theme--documenter-dark .ansi span.sgr41{background-color:#f6705f}html.theme--documenter-dark .ansi span.sgr42{background-color:#4fb43a}html.theme--documenter-dark .ansi span.sgr43{background-color:#f4c72f}html.theme--documenter-dark .ansi span.sgr44{background-color:#7587f0}html.theme--documenter-dark .ansi span.sgr45{background-color:#bc89d3}html.theme--documenter-dark .ansi span.sgr46{background-color:#49b6ca}html.theme--documenter-dark .ansi span.sgr47{background-color:#b3bdbe}html.theme--documenter-dark .ansi span.sgr90{color:#92a0a2}html.theme--documenter-dark .ansi span.sgr91{color:#ff8674}html.theme--documenter-dark .ansi span.sgr92{color:#79d462}html.theme--documenter-dark .ansi span.sgr93{color:#ffe76b}html.theme--documenter-dark .ansi span.sgr94{color:#8a98ff}html.theme--documenter-dark .ansi span.sgr95{color:#d2a4e6}html.theme--documenter-dark .ansi span.sgr96{color:#6bc8db}html.theme--documenter-dark .ansi span.sgr97{color:#ecf0f1}html.theme--documenter-dark .ansi span.sgr100{background-color:#92a0a2}html.theme--documenter-dark .ansi span.sgr101{background-color:#ff8674}html.theme--documenter-dark .ansi span.sgr102{background-color:#79d462}html.theme--documenter-dark .ansi span.sgr103{background-color:#ffe76b}html.theme--documenter-dark .ansi span.sgr104{background-color:#8a98ff}html.theme--documenter-dark .ansi span.sgr105{background-color:#d2a4e6}html.theme--documenter-dark .ansi span.sgr106{background-color:#6bc8db}html.theme--documenter-dark .ansi span.sgr107{background-color:#ecf0f1}html.theme--documenter-dark code.language-julia-repl>span.hljs-meta{color:#4fb43a;font-weight:bolder}html.theme--documenter-dark .hljs{background:#2b2b2b;color:#f8f8f2}html.theme--documenter-dark .hljs-comment,html.theme--documenter-dark .hljs-quote{color:#d4d0ab}html.theme--documenter-dark .hljs-variable,html.theme--documenter-dark .hljs-template-variable,html.theme--documenter-dark .hljs-tag,html.theme--documenter-dark .hljs-name,html.theme--documenter-dark .hljs-selector-id,html.theme--documenter-dark .hljs-selector-class,html.theme--documenter-dark .hljs-regexp,html.theme--documenter-dark .hljs-deletion{color:#ffa07a}html.theme--documenter-dark .hljs-number,html.theme--documenter-dark .hljs-built_in,html.theme--documenter-dark .hljs-literal,html.theme--documenter-dark .hljs-type,html.theme--documenter-dark .hljs-params,html.theme--documenter-dark .hljs-meta,html.theme--documenter-dark .hljs-link{color:#f5ab35}html.theme--documenter-dark .hljs-attribute{color:#ffd700}html.theme--documenter-dark .hljs-string,html.theme--documenter-dark .hljs-symbol,html.theme--documenter-dark .hljs-bullet,html.theme--documenter-dark .hljs-addition{color:#abe338}html.theme--documenter-dark .hljs-title,html.theme--documenter-dark .hljs-section{color:#00e0e0}html.theme--documenter-dark .hljs-keyword,html.theme--documenter-dark .hljs-selector-tag{color:#dcc6e0}html.theme--documenter-dark .hljs-emphasis{font-style:italic}html.theme--documenter-dark .hljs-strong{font-weight:bold}@media screen and (-ms-high-contrast: active){html.theme--documenter-dark .hljs-addition,html.theme--documenter-dark .hljs-attribute,html.theme--documenter-dark .hljs-built_in,html.theme--documenter-dark .hljs-bullet,html.theme--documenter-dark .hljs-comment,html.theme--documenter-dark .hljs-link,html.theme--documenter-dark .hljs-literal,html.theme--documenter-dark .hljs-meta,html.theme--documenter-dark .hljs-number,html.theme--documenter-dark .hljs-params,html.theme--documenter-dark .hljs-string,html.theme--documenter-dark .hljs-symbol,html.theme--documenter-dark .hljs-type,html.theme--documenter-dark .hljs-quote{color:highlight}html.theme--documenter-dark .hljs-keyword,html.theme--documenter-dark .hljs-selector-tag{font-weight:bold}}html.theme--documenter-dark .hljs-subst{color:#f8f8f2} diff --git a/dev/assets/themes/documenter-light.css b/dev/assets/themes/documenter-light.css index 9595d5b8e..9b9a14b04 100644 --- a/dev/assets/themes/documenter-light.css +++ b/dev/assets/themes/documenter-light.css @@ -1,7642 +1,4 @@ -@charset "UTF-8"; -/* Font Awesome 5 mixin. Can be included in any rule that should render Font Awesome icons. */ -@keyframes spinAround { - from { - transform: rotate(0deg); } - to { - transform: rotate(359deg); } } - -.tabs, .pagination-previous, -.pagination-next, -.pagination-link, -.pagination-ellipsis, .breadcrumb, .file, .button, .is-unselectable, .modal-close, .delete { - -webkit-touch-callout: none; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; } - -.navbar-link:not(.is-arrowless)::after, .select:not(.is-multiple):not(.is-loading)::after { - border: 3px solid transparent; - border-radius: 2px; - border-right: 0; - border-top: 0; - content: " "; - display: block; - height: 0.625em; - margin-top: -0.4375em; - pointer-events: none; - position: absolute; - top: 50%; - transform: rotate(-45deg); - transform-origin: center; - width: 0.625em; } - -.admonition:not(:last-child), .tabs:not(:last-child), .message:not(:last-child), .list:not(:last-child), .level:not(:last-child), .breadcrumb:not(:last-child), .highlight:not(:last-child), .block:not(:last-child), .title:not(:last-child), -.subtitle:not(:last-child), .table-container:not(:last-child), .table:not(:last-child), .progress:not(:last-child), .notification:not(:last-child), .content:not(:last-child), .box:not(:last-child) { - margin-bottom: 1.5rem; } - -.modal-close, .delete { - -moz-appearance: none; - -webkit-appearance: none; - background-color: rgba(10, 10, 10, 0.2); - border: none; - border-radius: 290486px; - cursor: pointer; - pointer-events: auto; - display: inline-block; - flex-grow: 0; - flex-shrink: 0; - font-size: 0; - height: 20px; - max-height: 20px; - max-width: 20px; - min-height: 20px; - min-width: 20px; - outline: none; - position: relative; - vertical-align: top; - width: 20px; } - .modal-close::before, .delete::before, .modal-close::after, .delete::after { - background-color: white; - content: ""; - display: block; - left: 50%; - position: absolute; - top: 50%; - transform: translateX(-50%) translateY(-50%) rotate(45deg); - transform-origin: center center; } - .modal-close::before, .delete::before { - height: 2px; - width: 50%; } - .modal-close::after, .delete::after { - height: 50%; - width: 2px; } - .modal-close:hover, .delete:hover, .modal-close:focus, .delete:focus { - background-color: rgba(10, 10, 10, 0.3); } - .modal-close:active, .delete:active { - background-color: rgba(10, 10, 10, 0.4); } - .is-small.modal-close, #documenter .docs-sidebar form.docs-search > input.modal-close, .is-small.delete, #documenter .docs-sidebar form.docs-search > input.delete { - height: 16px; - max-height: 16px; - max-width: 16px; - min-height: 16px; - min-width: 16px; - width: 16px; } - .is-medium.modal-close, .is-medium.delete { - height: 24px; - max-height: 24px; - max-width: 24px; - min-height: 24px; - min-width: 24px; - width: 24px; } - .is-large.modal-close, .is-large.delete { - height: 32px; - max-height: 32px; - max-width: 32px; - min-height: 32px; - min-width: 32px; - width: 32px; } - -.control.is-loading::after, .select.is-loading::after, .loader, .button.is-loading::after { - animation: spinAround 500ms infinite linear; - border: 2px solid #dbdbdb; - border-radius: 290486px; - border-right-color: transparent; - border-top-color: transparent; - content: ""; - display: block; - height: 1em; - position: relative; - width: 1em; } - -.hero-video, .modal-background, .modal, .image.is-square img, #documenter .docs-sidebar .docs-logo > img.is-square img, -.image.is-square .has-ratio, -#documenter .docs-sidebar .docs-logo > img.is-square .has-ratio, .image.is-1by1 img, #documenter .docs-sidebar .docs-logo > img.is-1by1 img, -.image.is-1by1 .has-ratio, -#documenter .docs-sidebar .docs-logo > img.is-1by1 .has-ratio, .image.is-5by4 img, #documenter .docs-sidebar .docs-logo > img.is-5by4 img, -.image.is-5by4 .has-ratio, -#documenter .docs-sidebar .docs-logo > img.is-5by4 .has-ratio, .image.is-4by3 img, #documenter .docs-sidebar .docs-logo > img.is-4by3 img, -.image.is-4by3 .has-ratio, -#documenter .docs-sidebar .docs-logo > img.is-4by3 .has-ratio, .image.is-3by2 img, #documenter .docs-sidebar .docs-logo > img.is-3by2 img, -.image.is-3by2 .has-ratio, -#documenter .docs-sidebar .docs-logo > img.is-3by2 .has-ratio, .image.is-5by3 img, #documenter .docs-sidebar .docs-logo > img.is-5by3 img, -.image.is-5by3 .has-ratio, -#documenter .docs-sidebar .docs-logo > img.is-5by3 .has-ratio, .image.is-16by9 img, #documenter .docs-sidebar .docs-logo > img.is-16by9 img, -.image.is-16by9 .has-ratio, -#documenter .docs-sidebar .docs-logo > img.is-16by9 .has-ratio, .image.is-2by1 img, #documenter .docs-sidebar .docs-logo > img.is-2by1 img, -.image.is-2by1 .has-ratio, -#documenter .docs-sidebar .docs-logo > img.is-2by1 .has-ratio, .image.is-3by1 img, #documenter .docs-sidebar .docs-logo > img.is-3by1 img, -.image.is-3by1 .has-ratio, -#documenter .docs-sidebar .docs-logo > img.is-3by1 .has-ratio, .image.is-4by5 img, #documenter .docs-sidebar .docs-logo > img.is-4by5 img, -.image.is-4by5 .has-ratio, -#documenter .docs-sidebar .docs-logo > img.is-4by5 .has-ratio, .image.is-3by4 img, #documenter .docs-sidebar .docs-logo > img.is-3by4 img, -.image.is-3by4 .has-ratio, -#documenter .docs-sidebar .docs-logo > img.is-3by4 .has-ratio, .image.is-2by3 img, #documenter .docs-sidebar .docs-logo > img.is-2by3 img, -.image.is-2by3 .has-ratio, -#documenter .docs-sidebar .docs-logo > img.is-2by3 .has-ratio, .image.is-3by5 img, #documenter .docs-sidebar .docs-logo > img.is-3by5 img, -.image.is-3by5 .has-ratio, -#documenter .docs-sidebar .docs-logo > img.is-3by5 .has-ratio, .image.is-9by16 img, #documenter .docs-sidebar .docs-logo > img.is-9by16 img, -.image.is-9by16 .has-ratio, -#documenter .docs-sidebar .docs-logo > img.is-9by16 .has-ratio, .image.is-1by2 img, #documenter .docs-sidebar .docs-logo > img.is-1by2 img, -.image.is-1by2 .has-ratio, -#documenter .docs-sidebar .docs-logo > img.is-1by2 .has-ratio, .image.is-1by3 img, #documenter .docs-sidebar .docs-logo > img.is-1by3 img, -.image.is-1by3 .has-ratio, -#documenter .docs-sidebar .docs-logo > img.is-1by3 .has-ratio, .is-overlay { - bottom: 0; - left: 0; - position: absolute; - right: 0; - top: 0; } - -.pagination-previous, -.pagination-next, -.pagination-link, -.pagination-ellipsis, .file-cta, -.file-name, .select select, .textarea, .input, #documenter .docs-sidebar form.docs-search > input, .button { - -moz-appearance: none; - -webkit-appearance: none; - align-items: center; - border: 1px solid transparent; - border-radius: 4px; - box-shadow: none; - display: inline-flex; - font-size: 1rem; - height: 2.25em; - justify-content: flex-start; - line-height: 1.5; - padding-bottom: calc(0.375em - 1px); - padding-left: calc(0.625em - 1px); - padding-right: calc(0.625em - 1px); - padding-top: calc(0.375em - 1px); - position: relative; - vertical-align: top; } - .pagination-previous:focus, - .pagination-next:focus, - .pagination-link:focus, - .pagination-ellipsis:focus, .file-cta:focus, - .file-name:focus, .select select:focus, .textarea:focus, .input:focus, #documenter .docs-sidebar form.docs-search > input:focus, .button:focus, .is-focused.pagination-previous, - .is-focused.pagination-next, - .is-focused.pagination-link, - .is-focused.pagination-ellipsis, .is-focused.file-cta, - .is-focused.file-name, .select select.is-focused, .is-focused.textarea, .is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .is-focused.button, .pagination-previous:active, - .pagination-next:active, - .pagination-link:active, - .pagination-ellipsis:active, .file-cta:active, - .file-name:active, .select select:active, .textarea:active, .input:active, #documenter .docs-sidebar form.docs-search > input:active, .button:active, .is-active.pagination-previous, - .is-active.pagination-next, - .is-active.pagination-link, - .is-active.pagination-ellipsis, .is-active.file-cta, - .is-active.file-name, .select select.is-active, .is-active.textarea, .is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active, .is-active.button { - outline: none; } - .pagination-previous[disabled], - .pagination-next[disabled], - .pagination-link[disabled], - .pagination-ellipsis[disabled], .file-cta[disabled], - .file-name[disabled], .select select[disabled], .textarea[disabled], .input[disabled], #documenter .docs-sidebar form.docs-search > input[disabled], .button[disabled], fieldset[disabled] .pagination-previous, - fieldset[disabled] .pagination-next, - fieldset[disabled] .pagination-link, - fieldset[disabled] .pagination-ellipsis, fieldset[disabled] .file-cta, - fieldset[disabled] .file-name, fieldset[disabled] .select select, .select fieldset[disabled] select, fieldset[disabled] .textarea, fieldset[disabled] .input, fieldset[disabled] #documenter .docs-sidebar form.docs-search > input, #documenter .docs-sidebar fieldset[disabled] form.docs-search > input, fieldset[disabled] .button { - cursor: not-allowed; } - -/*! minireset.css v0.0.4 | MIT License | github.com/jgthms/minireset.css */ -html, -body, -p, -ol, -ul, -li, -dl, -dt, -dd, -blockquote, -figure, -fieldset, -legend, -textarea, -pre, -iframe, -hr, -h1, -h2, -h3, -h4, -h5, -h6 { - margin: 0; - padding: 0; } - -h1, -h2, -h3, -h4, -h5, -h6 { - font-size: 100%; - font-weight: normal; } - -ul { - list-style: none; } - -button, -input, -select, -textarea { - margin: 0; } - -html { - box-sizing: border-box; } - -*, *::before, *::after { - box-sizing: inherit; } - -img, -embed, -iframe, -object, -video { - height: auto; - max-width: 100%; } - -audio { - max-width: 100%; } - -iframe { - border: 0; } - -table { - border-collapse: collapse; - border-spacing: 0; } - -td, -th { - padding: 0; } - td:not([align]), - th:not([align]) { - text-align: left; } - -html { - background-color: white; - font-size: 16px; - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; - min-width: 300px; - overflow-x: auto; - overflow-y: scroll; - text-rendering: optimizeLegibility; - text-size-adjust: 100%; } - -article, -aside, -figure, -footer, -header, -hgroup, -section { - display: block; } - -body, -button, -input, -select, -textarea { - font-family: "Lato Medium", -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", "Helvetica", "Arial", sans-serif; } - -code, -pre { - -moz-osx-font-smoothing: auto; - -webkit-font-smoothing: auto; - font-family: "JuliaMono", "SFMono-Regular", "Menlo", "Consolas", "Liberation Mono", "DejaVu Sans Mono", monospace; } - -body { - color: #222222; - font-size: 1em; - font-weight: 400; - line-height: 1.5; } - -a { - color: #2e63b8; - cursor: pointer; - text-decoration: none; } - a strong { - color: currentColor; } - a:hover { - color: #363636; } - -code { - background-color: rgba(0, 0, 0, 0.05); - color: #000000; - font-size: 0.875em; - font-weight: normal; - padding: 0.1em; } - -hr { - background-color: whitesmoke; - border: none; - display: block; - height: 2px; - margin: 1.5rem 0; } - -img { - height: auto; - max-width: 100%; } - -input[type="checkbox"], -input[type="radio"] { - vertical-align: baseline; } - -small { - font-size: 0.875em; } - -span { - font-style: inherit; - font-weight: inherit; } - -strong { - color: #222222; - font-weight: 700; } - -fieldset { - border: none; } - -pre { - -webkit-overflow-scrolling: touch; - background-color: whitesmoke; - color: #222222; - font-size: 0.875em; - overflow-x: auto; - padding: 1.25rem 1.5rem; - white-space: pre; - word-wrap: normal; } - pre code { - background-color: transparent; - color: currentColor; - font-size: 1em; - padding: 0; } - -table td, -table th { - vertical-align: top; } - table td:not([align]), - table th:not([align]) { - text-align: left; } - -table th { - color: #222222; } - -.is-clearfix::after { - clear: both; - content: " "; - display: table; } - -.is-pulled-left { - float: left !important; } - -.is-pulled-right { - float: right !important; } - -.is-clipped { - overflow: hidden !important; } - -.is-size-1 { - font-size: 3rem !important; } - -.is-size-2 { - font-size: 2.5rem !important; } - -.is-size-3 { - font-size: 2rem !important; } - -.is-size-4 { - font-size: 1.5rem !important; } - -.is-size-5 { - font-size: 1.25rem !important; } - -.is-size-6 { - font-size: 1rem !important; } - -.is-size-7, .docstring > section > a.docs-sourcelink { - font-size: 0.75rem !important; } - -@media screen and (max-width: 768px) { - .is-size-1-mobile { - font-size: 3rem !important; } - .is-size-2-mobile { - font-size: 2.5rem !important; } - .is-size-3-mobile { - font-size: 2rem !important; } - .is-size-4-mobile { - font-size: 1.5rem !important; } - .is-size-5-mobile { - font-size: 1.25rem !important; } - .is-size-6-mobile { - font-size: 1rem !important; } - .is-size-7-mobile { - font-size: 0.75rem !important; } } - -@media screen and (min-width: 769px), print { - .is-size-1-tablet { - font-size: 3rem !important; } - .is-size-2-tablet { - font-size: 2.5rem !important; } - .is-size-3-tablet { - font-size: 2rem !important; } - .is-size-4-tablet { - font-size: 1.5rem !important; } - .is-size-5-tablet { - font-size: 1.25rem !important; } - .is-size-6-tablet { - font-size: 1rem !important; } - .is-size-7-tablet { - font-size: 0.75rem !important; } } - -@media screen and (max-width: 1055px) { - .is-size-1-touch { - font-size: 3rem !important; } - .is-size-2-touch { - font-size: 2.5rem !important; } - .is-size-3-touch { - font-size: 2rem !important; } - .is-size-4-touch { - font-size: 1.5rem !important; } - .is-size-5-touch { - font-size: 1.25rem !important; } - .is-size-6-touch { - font-size: 1rem !important; } - .is-size-7-touch { - font-size: 0.75rem !important; } } - -@media screen and (min-width: 1056px) { - .is-size-1-desktop { - font-size: 3rem !important; } - .is-size-2-desktop { - font-size: 2.5rem !important; } - .is-size-3-desktop { - font-size: 2rem !important; } - .is-size-4-desktop { - font-size: 1.5rem !important; } - .is-size-5-desktop { - font-size: 1.25rem !important; } - .is-size-6-desktop { - font-size: 1rem !important; } - .is-size-7-desktop { - font-size: 0.75rem !important; } } - -@media screen and (min-width: 1216px) { - .is-size-1-widescreen { - font-size: 3rem !important; } - .is-size-2-widescreen { - font-size: 2.5rem !important; } - .is-size-3-widescreen { - font-size: 2rem !important; } - .is-size-4-widescreen { - font-size: 1.5rem !important; } - .is-size-5-widescreen { - font-size: 1.25rem !important; } - .is-size-6-widescreen { - font-size: 1rem !important; } - .is-size-7-widescreen { - font-size: 0.75rem !important; } } - -@media screen and (min-width: 1408px) { - .is-size-1-fullhd { - font-size: 3rem !important; } - .is-size-2-fullhd { - font-size: 2.5rem !important; } - .is-size-3-fullhd { - font-size: 2rem !important; } - .is-size-4-fullhd { - font-size: 1.5rem !important; } - .is-size-5-fullhd { - font-size: 1.25rem !important; } - .is-size-6-fullhd { - font-size: 1rem !important; } - .is-size-7-fullhd { - font-size: 0.75rem !important; } } - -.has-text-centered { - text-align: center !important; } - -.has-text-justified { - text-align: justify !important; } - -.has-text-left { - text-align: left !important; } - -.has-text-right { - text-align: right !important; } - -@media screen and (max-width: 768px) { - .has-text-centered-mobile { - text-align: center !important; } } - -@media screen and (min-width: 769px), print { - .has-text-centered-tablet { - text-align: center !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .has-text-centered-tablet-only { - text-align: center !important; } } - -@media screen and (max-width: 1055px) { - .has-text-centered-touch { - text-align: center !important; } } - -@media screen and (min-width: 1056px) { - .has-text-centered-desktop { - text-align: center !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .has-text-centered-desktop-only { - text-align: center !important; } } - -@media screen and (min-width: 1216px) { - .has-text-centered-widescreen { - text-align: center !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .has-text-centered-widescreen-only { - text-align: center !important; } } - -@media screen and (min-width: 1408px) { - .has-text-centered-fullhd { - text-align: center !important; } } - -@media screen and (max-width: 768px) { - .has-text-justified-mobile { - text-align: justify !important; } } - -@media screen and (min-width: 769px), print { - .has-text-justified-tablet { - text-align: justify !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .has-text-justified-tablet-only { - text-align: justify !important; } } - -@media screen and (max-width: 1055px) { - .has-text-justified-touch { - text-align: justify !important; } } - -@media screen and (min-width: 1056px) { - .has-text-justified-desktop { - text-align: justify !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .has-text-justified-desktop-only { - text-align: justify !important; } } - -@media screen and (min-width: 1216px) { - .has-text-justified-widescreen { - text-align: justify !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .has-text-justified-widescreen-only { - text-align: justify !important; } } - -@media screen and (min-width: 1408px) { - .has-text-justified-fullhd { - text-align: justify !important; } } - -@media screen and (max-width: 768px) { - .has-text-left-mobile { - text-align: left !important; } } - -@media screen and (min-width: 769px), print { - .has-text-left-tablet { - text-align: left !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .has-text-left-tablet-only { - text-align: left !important; } } - -@media screen and (max-width: 1055px) { - .has-text-left-touch { - text-align: left !important; } } - -@media screen and (min-width: 1056px) { - .has-text-left-desktop { - text-align: left !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .has-text-left-desktop-only { - text-align: left !important; } } - -@media screen and (min-width: 1216px) { - .has-text-left-widescreen { - text-align: left !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .has-text-left-widescreen-only { - text-align: left !important; } } - -@media screen and (min-width: 1408px) { - .has-text-left-fullhd { - text-align: left !important; } } - -@media screen and (max-width: 768px) { - .has-text-right-mobile { - text-align: right !important; } } - -@media screen and (min-width: 769px), print { - .has-text-right-tablet { - text-align: right !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .has-text-right-tablet-only { - text-align: right !important; } } - -@media screen and (max-width: 1055px) { - .has-text-right-touch { - text-align: right !important; } } - -@media screen and (min-width: 1056px) { - .has-text-right-desktop { - text-align: right !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .has-text-right-desktop-only { - text-align: right !important; } } - -@media screen and (min-width: 1216px) { - .has-text-right-widescreen { - text-align: right !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .has-text-right-widescreen-only { - text-align: right !important; } } - -@media screen and (min-width: 1408px) { - .has-text-right-fullhd { - text-align: right !important; } } - -.is-capitalized { - text-transform: capitalize !important; } - -.is-lowercase { - text-transform: lowercase !important; } - -.is-uppercase { - text-transform: uppercase !important; } - -.is-italic { - font-style: italic !important; } - -.has-text-white { - color: white !important; } - -a.has-text-white:hover, a.has-text-white:focus { - color: #e6e6e6 !important; } - -.has-background-white { - background-color: white !important; } - -.has-text-black { - color: #0a0a0a !important; } - -a.has-text-black:hover, a.has-text-black:focus { - color: black !important; } - -.has-background-black { - background-color: #0a0a0a !important; } - -.has-text-light { - color: whitesmoke !important; } - -a.has-text-light:hover, a.has-text-light:focus { - color: #dbdbdb !important; } - -.has-background-light { - background-color: whitesmoke !important; } - -.has-text-dark { - color: #363636 !important; } - -a.has-text-dark:hover, a.has-text-dark:focus { - color: #1c1c1c !important; } - -.has-background-dark { - background-color: #363636 !important; } - -.has-text-primary { - color: #4eb5de !important; } - -a.has-text-primary:hover, a.has-text-primary:focus { - color: #27a1d2 !important; } - -.has-background-primary { - background-color: #4eb5de !important; } - -.has-text-link { - color: #2e63b8 !important; } - -a.has-text-link:hover, a.has-text-link:focus { - color: #244d8f !important; } - -.has-background-link { - background-color: #2e63b8 !important; } - -.has-text-info { - color: #209cee !important; } - -a.has-text-info:hover, a.has-text-info:focus { - color: #1081cb !important; } - -.has-background-info { - background-color: #209cee !important; } - -.has-text-success { - color: #22c35b !important; } - -a.has-text-success:hover, a.has-text-success:focus { - color: #1a9847 !important; } - -.has-background-success { - background-color: #22c35b !important; } - -.has-text-warning { - color: #ffdd57 !important; } - -a.has-text-warning:hover, a.has-text-warning:focus { - color: #ffd324 !important; } - -.has-background-warning { - background-color: #ffdd57 !important; } - -.has-text-danger { - color: #da0b00 !important; } - -a.has-text-danger:hover, a.has-text-danger:focus { - color: #a70800 !important; } - -.has-background-danger { - background-color: #da0b00 !important; } - -.has-text-black-bis { - color: #121212 !important; } - -.has-background-black-bis { - background-color: #121212 !important; } - -.has-text-black-ter { - color: #242424 !important; } - -.has-background-black-ter { - background-color: #242424 !important; } - -.has-text-grey-darker { - color: #363636 !important; } - -.has-background-grey-darker { - background-color: #363636 !important; } - -.has-text-grey-dark { - color: #4a4a4a !important; } - -.has-background-grey-dark { - background-color: #4a4a4a !important; } - -.has-text-grey { - color: #6b6b6b !important; } - -.has-background-grey { - background-color: #6b6b6b !important; } - -.has-text-grey-light { - color: #b5b5b5 !important; } - -.has-background-grey-light { - background-color: #b5b5b5 !important; } - -.has-text-grey-lighter { - color: #dbdbdb !important; } - -.has-background-grey-lighter { - background-color: #dbdbdb !important; } - -.has-text-white-ter { - color: whitesmoke !important; } - -.has-background-white-ter { - background-color: whitesmoke !important; } - -.has-text-white-bis { - color: #fafafa !important; } - -.has-background-white-bis { - background-color: #fafafa !important; } - -.has-text-weight-light { - font-weight: 300 !important; } - -.has-text-weight-normal { - font-weight: 400 !important; } - -.has-text-weight-medium { - font-weight: 500 !important; } - -.has-text-weight-semibold { - font-weight: 600 !important; } - -.has-text-weight-bold { - font-weight: 700 !important; } - -.is-family-primary { - font-family: "Lato Medium", -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", "Helvetica", "Arial", sans-serif !important; } - -.is-family-secondary { - font-family: "Lato Medium", -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", "Helvetica", "Arial", sans-serif !important; } - -.is-family-sans-serif { - font-family: "Lato Medium", -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", "Helvetica", "Arial", sans-serif !important; } - -.is-family-monospace { - font-family: "JuliaMono", "SFMono-Regular", "Menlo", "Consolas", "Liberation Mono", "DejaVu Sans Mono", monospace !important; } - -.is-family-code { - font-family: "JuliaMono", "SFMono-Regular", "Menlo", "Consolas", "Liberation Mono", "DejaVu Sans Mono", monospace !important; } - -.is-block { - display: block !important; } - -@media screen and (max-width: 768px) { - .is-block-mobile { - display: block !important; } } - -@media screen and (min-width: 769px), print { - .is-block-tablet { - display: block !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .is-block-tablet-only { - display: block !important; } } - -@media screen and (max-width: 1055px) { - .is-block-touch { - display: block !important; } } - -@media screen and (min-width: 1056px) { - .is-block-desktop { - display: block !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .is-block-desktop-only { - display: block !important; } } - -@media screen and (min-width: 1216px) { - .is-block-widescreen { - display: block !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .is-block-widescreen-only { - display: block !important; } } - -@media screen and (min-width: 1408px) { - .is-block-fullhd { - display: block !important; } } - -.is-flex { - display: flex !important; } - -@media screen and (max-width: 768px) { - .is-flex-mobile { - display: flex !important; } } - -@media screen and (min-width: 769px), print { - .is-flex-tablet { - display: flex !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .is-flex-tablet-only { - display: flex !important; } } - -@media screen and (max-width: 1055px) { - .is-flex-touch { - display: flex !important; } } - -@media screen and (min-width: 1056px) { - .is-flex-desktop { - display: flex !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .is-flex-desktop-only { - display: flex !important; } } - -@media screen and (min-width: 1216px) { - .is-flex-widescreen { - display: flex !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .is-flex-widescreen-only { - display: flex !important; } } - -@media screen and (min-width: 1408px) { - .is-flex-fullhd { - display: flex !important; } } - -.is-inline { - display: inline !important; } - -@media screen and (max-width: 768px) { - .is-inline-mobile { - display: inline !important; } } - -@media screen and (min-width: 769px), print { - .is-inline-tablet { - display: inline !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .is-inline-tablet-only { - display: inline !important; } } - -@media screen and (max-width: 1055px) { - .is-inline-touch { - display: inline !important; } } - -@media screen and (min-width: 1056px) { - .is-inline-desktop { - display: inline !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .is-inline-desktop-only { - display: inline !important; } } - -@media screen and (min-width: 1216px) { - .is-inline-widescreen { - display: inline !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .is-inline-widescreen-only { - display: inline !important; } } - -@media screen and (min-width: 1408px) { - .is-inline-fullhd { - display: inline !important; } } - -.is-inline-block { - display: inline-block !important; } - -@media screen and (max-width: 768px) { - .is-inline-block-mobile { - display: inline-block !important; } } - -@media screen and (min-width: 769px), print { - .is-inline-block-tablet { - display: inline-block !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .is-inline-block-tablet-only { - display: inline-block !important; } } - -@media screen and (max-width: 1055px) { - .is-inline-block-touch { - display: inline-block !important; } } - -@media screen and (min-width: 1056px) { - .is-inline-block-desktop { - display: inline-block !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .is-inline-block-desktop-only { - display: inline-block !important; } } - -@media screen and (min-width: 1216px) { - .is-inline-block-widescreen { - display: inline-block !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .is-inline-block-widescreen-only { - display: inline-block !important; } } - -@media screen and (min-width: 1408px) { - .is-inline-block-fullhd { - display: inline-block !important; } } - -.is-inline-flex { - display: inline-flex !important; } - -@media screen and (max-width: 768px) { - .is-inline-flex-mobile { - display: inline-flex !important; } } - -@media screen and (min-width: 769px), print { - .is-inline-flex-tablet { - display: inline-flex !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .is-inline-flex-tablet-only { - display: inline-flex !important; } } - -@media screen and (max-width: 1055px) { - .is-inline-flex-touch { - display: inline-flex !important; } } - -@media screen and (min-width: 1056px) { - .is-inline-flex-desktop { - display: inline-flex !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .is-inline-flex-desktop-only { - display: inline-flex !important; } } - -@media screen and (min-width: 1216px) { - .is-inline-flex-widescreen { - display: inline-flex !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .is-inline-flex-widescreen-only { - display: inline-flex !important; } } - -@media screen and (min-width: 1408px) { - .is-inline-flex-fullhd { - display: inline-flex !important; } } - -.is-hidden { - display: none !important; } - -.is-sr-only { - border: none !important; - clip: rect(0, 0, 0, 0) !important; - height: 0.01em !important; - overflow: hidden !important; - padding: 0 !important; - position: absolute !important; - white-space: nowrap !important; - width: 0.01em !important; } - -@media screen and (max-width: 768px) { - .is-hidden-mobile { - display: none !important; } } - -@media screen and (min-width: 769px), print { - .is-hidden-tablet { - display: none !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .is-hidden-tablet-only { - display: none !important; } } - -@media screen and (max-width: 1055px) { - .is-hidden-touch { - display: none !important; } } - -@media screen and (min-width: 1056px) { - .is-hidden-desktop { - display: none !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .is-hidden-desktop-only { - display: none !important; } } - -@media screen and (min-width: 1216px) { - .is-hidden-widescreen { - display: none !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .is-hidden-widescreen-only { - display: none !important; } } - -@media screen and (min-width: 1408px) { - .is-hidden-fullhd { - display: none !important; } } - -.is-invisible { - visibility: hidden !important; } - -@media screen and (max-width: 768px) { - .is-invisible-mobile { - visibility: hidden !important; } } - -@media screen and (min-width: 769px), print { - .is-invisible-tablet { - visibility: hidden !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .is-invisible-tablet-only { - visibility: hidden !important; } } - -@media screen and (max-width: 1055px) { - .is-invisible-touch { - visibility: hidden !important; } } - -@media screen and (min-width: 1056px) { - .is-invisible-desktop { - visibility: hidden !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .is-invisible-desktop-only { - visibility: hidden !important; } } - -@media screen and (min-width: 1216px) { - .is-invisible-widescreen { - visibility: hidden !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .is-invisible-widescreen-only { - visibility: hidden !important; } } - -@media screen and (min-width: 1408px) { - .is-invisible-fullhd { - visibility: hidden !important; } } - -.is-marginless { - margin: 0 !important; } - -.is-paddingless { - padding: 0 !important; } - -.is-radiusless { - border-radius: 0 !important; } - -.is-shadowless { - box-shadow: none !important; } - -.is-relative { - position: relative !important; } - -.box { - background-color: white; - border-radius: 6px; - box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); - color: #222222; - display: block; - padding: 1.25rem; } - -a.box:hover, a.box:focus { - box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px #2e63b8; } - -a.box:active { - box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2), 0 0 0 1px #2e63b8; } - -.button { - background-color: white; - border-color: #dbdbdb; - border-width: 1px; - color: #363636; - cursor: pointer; - justify-content: center; - padding-bottom: calc(0.375em - 1px); - padding-left: 0.75em; - padding-right: 0.75em; - padding-top: calc(0.375em - 1px); - text-align: center; - white-space: nowrap; } - .button strong { - color: inherit; } - .button .icon, .button .icon.is-small, .button #documenter .docs-sidebar form.docs-search > input.icon, #documenter .docs-sidebar .button form.docs-search > input.icon, .button .icon.is-medium, .button .icon.is-large { - height: 1.5em; - width: 1.5em; } - .button .icon:first-child:not(:last-child) { - margin-left: calc(-0.375em - 1px); - margin-right: 0.1875em; } - .button .icon:last-child:not(:first-child) { - margin-left: 0.1875em; - margin-right: calc(-0.375em - 1px); } - .button .icon:first-child:last-child { - margin-left: calc(-0.375em - 1px); - margin-right: calc(-0.375em - 1px); } - .button:hover, .button.is-hovered { - border-color: #b5b5b5; - color: #363636; } - .button:focus, .button.is-focused { - border-color: #3c5dcd; - color: #363636; } - .button:focus:not(:active), .button.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(46, 99, 184, 0.25); } - .button:active, .button.is-active { - border-color: #4a4a4a; - color: #363636; } - .button.is-text { - background-color: transparent; - border-color: transparent; - color: #222222; - text-decoration: underline; } - .button.is-text:hover, .button.is-text.is-hovered, .button.is-text:focus, .button.is-text.is-focused { - background-color: whitesmoke; - color: #222222; } - .button.is-text:active, .button.is-text.is-active { - background-color: #e8e8e8; - color: #222222; } - .button.is-text[disabled], fieldset[disabled] .button.is-text { - background-color: transparent; - border-color: transparent; - box-shadow: none; } - .button.is-white { - background-color: white; - border-color: transparent; - color: #0a0a0a; } - .button.is-white:hover, .button.is-white.is-hovered { - background-color: #f9f9f9; - border-color: transparent; - color: #0a0a0a; } - .button.is-white:focus, .button.is-white.is-focused { - border-color: transparent; - color: #0a0a0a; } - .button.is-white:focus:not(:active), .button.is-white.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); } - .button.is-white:active, .button.is-white.is-active { - background-color: #f2f2f2; - border-color: transparent; - color: #0a0a0a; } - .button.is-white[disabled], fieldset[disabled] .button.is-white { - background-color: white; - border-color: transparent; - box-shadow: none; } - .button.is-white.is-inverted { - background-color: #0a0a0a; - color: white; } - .button.is-white.is-inverted:hover, .button.is-white.is-inverted.is-hovered { - background-color: black; } - .button.is-white.is-inverted[disabled], fieldset[disabled] .button.is-white.is-inverted { - background-color: #0a0a0a; - border-color: transparent; - box-shadow: none; - color: white; } - .button.is-white.is-loading::after { - border-color: transparent transparent #0a0a0a #0a0a0a !important; } - .button.is-white.is-outlined { - background-color: transparent; - border-color: white; - color: white; } - .button.is-white.is-outlined:hover, .button.is-white.is-outlined.is-hovered, .button.is-white.is-outlined:focus, .button.is-white.is-outlined.is-focused { - background-color: white; - border-color: white; - color: #0a0a0a; } - .button.is-white.is-outlined.is-loading::after { - border-color: transparent transparent white white !important; } - .button.is-white.is-outlined.is-loading:hover::after, .button.is-white.is-outlined.is-loading.is-hovered::after, .button.is-white.is-outlined.is-loading:focus::after, .button.is-white.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #0a0a0a #0a0a0a !important; } - .button.is-white.is-outlined[disabled], fieldset[disabled] .button.is-white.is-outlined { - background-color: transparent; - border-color: white; - box-shadow: none; - color: white; } - .button.is-white.is-inverted.is-outlined { - background-color: transparent; - border-color: #0a0a0a; - color: #0a0a0a; } - .button.is-white.is-inverted.is-outlined:hover, .button.is-white.is-inverted.is-outlined.is-hovered, .button.is-white.is-inverted.is-outlined:focus, .button.is-white.is-inverted.is-outlined.is-focused { - background-color: #0a0a0a; - color: white; } - .button.is-white.is-inverted.is-outlined.is-loading:hover::after, .button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-white.is-inverted.is-outlined.is-loading:focus::after, .button.is-white.is-inverted.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent white white !important; } - .button.is-white.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-white.is-inverted.is-outlined { - background-color: transparent; - border-color: #0a0a0a; - box-shadow: none; - color: #0a0a0a; } - .button.is-black { - background-color: #0a0a0a; - border-color: transparent; - color: white; } - .button.is-black:hover, .button.is-black.is-hovered { - background-color: #040404; - border-color: transparent; - color: white; } - .button.is-black:focus, .button.is-black.is-focused { - border-color: transparent; - color: white; } - .button.is-black:focus:not(:active), .button.is-black.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); } - .button.is-black:active, .button.is-black.is-active { - background-color: black; - border-color: transparent; - color: white; } - .button.is-black[disabled], fieldset[disabled] .button.is-black { - background-color: #0a0a0a; - border-color: transparent; - box-shadow: none; } - .button.is-black.is-inverted { - background-color: white; - color: #0a0a0a; } - .button.is-black.is-inverted:hover, .button.is-black.is-inverted.is-hovered { - background-color: #f2f2f2; } - .button.is-black.is-inverted[disabled], fieldset[disabled] .button.is-black.is-inverted { - background-color: white; - border-color: transparent; - box-shadow: none; - color: #0a0a0a; } - .button.is-black.is-loading::after { - border-color: transparent transparent white white !important; } - .button.is-black.is-outlined { - background-color: transparent; - border-color: #0a0a0a; - color: #0a0a0a; } - .button.is-black.is-outlined:hover, .button.is-black.is-outlined.is-hovered, .button.is-black.is-outlined:focus, .button.is-black.is-outlined.is-focused { - background-color: #0a0a0a; - border-color: #0a0a0a; - color: white; } - .button.is-black.is-outlined.is-loading::after { - border-color: transparent transparent #0a0a0a #0a0a0a !important; } - .button.is-black.is-outlined.is-loading:hover::after, .button.is-black.is-outlined.is-loading.is-hovered::after, .button.is-black.is-outlined.is-loading:focus::after, .button.is-black.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent white white !important; } - .button.is-black.is-outlined[disabled], fieldset[disabled] .button.is-black.is-outlined { - background-color: transparent; - border-color: #0a0a0a; - box-shadow: none; - color: #0a0a0a; } - .button.is-black.is-inverted.is-outlined { - background-color: transparent; - border-color: white; - color: white; } - .button.is-black.is-inverted.is-outlined:hover, .button.is-black.is-inverted.is-outlined.is-hovered, .button.is-black.is-inverted.is-outlined:focus, .button.is-black.is-inverted.is-outlined.is-focused { - background-color: white; - color: #0a0a0a; } - .button.is-black.is-inverted.is-outlined.is-loading:hover::after, .button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-black.is-inverted.is-outlined.is-loading:focus::after, .button.is-black.is-inverted.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #0a0a0a #0a0a0a !important; } - .button.is-black.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-black.is-inverted.is-outlined { - background-color: transparent; - border-color: white; - box-shadow: none; - color: white; } - .button.is-light { - background-color: whitesmoke; - border-color: transparent; - color: #363636; } - .button.is-light:hover, .button.is-light.is-hovered { - background-color: #eeeeee; - border-color: transparent; - color: #363636; } - .button.is-light:focus, .button.is-light.is-focused { - border-color: transparent; - color: #363636; } - .button.is-light:focus:not(:active), .button.is-light.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(245, 245, 245, 0.25); } - .button.is-light:active, .button.is-light.is-active { - background-color: #e8e8e8; - border-color: transparent; - color: #363636; } - .button.is-light[disabled], fieldset[disabled] .button.is-light { - background-color: whitesmoke; - border-color: transparent; - box-shadow: none; } - .button.is-light.is-inverted { - background-color: #363636; - color: whitesmoke; } - .button.is-light.is-inverted:hover, .button.is-light.is-inverted.is-hovered { - background-color: #292929; } - .button.is-light.is-inverted[disabled], fieldset[disabled] .button.is-light.is-inverted { - background-color: #363636; - border-color: transparent; - box-shadow: none; - color: whitesmoke; } - .button.is-light.is-loading::after { - border-color: transparent transparent #363636 #363636 !important; } - .button.is-light.is-outlined { - background-color: transparent; - border-color: whitesmoke; - color: whitesmoke; } - .button.is-light.is-outlined:hover, .button.is-light.is-outlined.is-hovered, .button.is-light.is-outlined:focus, .button.is-light.is-outlined.is-focused { - background-color: whitesmoke; - border-color: whitesmoke; - color: #363636; } - .button.is-light.is-outlined.is-loading::after { - border-color: transparent transparent whitesmoke whitesmoke !important; } - .button.is-light.is-outlined.is-loading:hover::after, .button.is-light.is-outlined.is-loading.is-hovered::after, .button.is-light.is-outlined.is-loading:focus::after, .button.is-light.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #363636 #363636 !important; } - .button.is-light.is-outlined[disabled], fieldset[disabled] .button.is-light.is-outlined { - background-color: transparent; - border-color: whitesmoke; - box-shadow: none; - color: whitesmoke; } - .button.is-light.is-inverted.is-outlined { - background-color: transparent; - border-color: #363636; - color: #363636; } - .button.is-light.is-inverted.is-outlined:hover, .button.is-light.is-inverted.is-outlined.is-hovered, .button.is-light.is-inverted.is-outlined:focus, .button.is-light.is-inverted.is-outlined.is-focused { - background-color: #363636; - color: whitesmoke; } - .button.is-light.is-inverted.is-outlined.is-loading:hover::after, .button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-light.is-inverted.is-outlined.is-loading:focus::after, .button.is-light.is-inverted.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent whitesmoke whitesmoke !important; } - .button.is-light.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-light.is-inverted.is-outlined { - background-color: transparent; - border-color: #363636; - box-shadow: none; - color: #363636; } - .button.is-dark, .content kbd.button { - background-color: #363636; - border-color: transparent; - color: whitesmoke; } - .button.is-dark:hover, .content kbd.button:hover, .button.is-dark.is-hovered, .content kbd.button.is-hovered { - background-color: #2f2f2f; - border-color: transparent; - color: whitesmoke; } - .button.is-dark:focus, .content kbd.button:focus, .button.is-dark.is-focused, .content kbd.button.is-focused { - border-color: transparent; - color: whitesmoke; } - .button.is-dark:focus:not(:active), .content kbd.button:focus:not(:active), .button.is-dark.is-focused:not(:active), .content kbd.button.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(54, 54, 54, 0.25); } - .button.is-dark:active, .content kbd.button:active, .button.is-dark.is-active, .content kbd.button.is-active { - background-color: #292929; - border-color: transparent; - color: whitesmoke; } - .button.is-dark[disabled], .content kbd.button[disabled], fieldset[disabled] .button.is-dark, fieldset[disabled] .content kbd.button, .content fieldset[disabled] kbd.button { - background-color: #363636; - border-color: transparent; - box-shadow: none; } - .button.is-dark.is-inverted, .content kbd.button.is-inverted { - background-color: whitesmoke; - color: #363636; } - .button.is-dark.is-inverted:hover, .content kbd.button.is-inverted:hover, .button.is-dark.is-inverted.is-hovered, .content kbd.button.is-inverted.is-hovered { - background-color: #e8e8e8; } - .button.is-dark.is-inverted[disabled], .content kbd.button.is-inverted[disabled], fieldset[disabled] .button.is-dark.is-inverted, fieldset[disabled] .content kbd.button.is-inverted, .content fieldset[disabled] kbd.button.is-inverted { - background-color: whitesmoke; - border-color: transparent; - box-shadow: none; - color: #363636; } - .button.is-dark.is-loading::after, .content kbd.button.is-loading::after { - border-color: transparent transparent whitesmoke whitesmoke !important; } - .button.is-dark.is-outlined, .content kbd.button.is-outlined { - background-color: transparent; - border-color: #363636; - color: #363636; } - .button.is-dark.is-outlined:hover, .content kbd.button.is-outlined:hover, .button.is-dark.is-outlined.is-hovered, .content kbd.button.is-outlined.is-hovered, .button.is-dark.is-outlined:focus, .content kbd.button.is-outlined:focus, .button.is-dark.is-outlined.is-focused, .content kbd.button.is-outlined.is-focused { - background-color: #363636; - border-color: #363636; - color: whitesmoke; } - .button.is-dark.is-outlined.is-loading::after, .content kbd.button.is-outlined.is-loading::after { - border-color: transparent transparent #363636 #363636 !important; } - .button.is-dark.is-outlined.is-loading:hover::after, .content kbd.button.is-outlined.is-loading:hover::after, .button.is-dark.is-outlined.is-loading.is-hovered::after, .content kbd.button.is-outlined.is-loading.is-hovered::after, .button.is-dark.is-outlined.is-loading:focus::after, .content kbd.button.is-outlined.is-loading:focus::after, .button.is-dark.is-outlined.is-loading.is-focused::after, .content kbd.button.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent whitesmoke whitesmoke !important; } - .button.is-dark.is-outlined[disabled], .content kbd.button.is-outlined[disabled], fieldset[disabled] .button.is-dark.is-outlined, fieldset[disabled] .content kbd.button.is-outlined, .content fieldset[disabled] kbd.button.is-outlined { - background-color: transparent; - border-color: #363636; - box-shadow: none; - color: #363636; } - .button.is-dark.is-inverted.is-outlined, .content kbd.button.is-inverted.is-outlined { - background-color: transparent; - border-color: whitesmoke; - color: whitesmoke; } - .button.is-dark.is-inverted.is-outlined:hover, .content kbd.button.is-inverted.is-outlined:hover, .button.is-dark.is-inverted.is-outlined.is-hovered, .content kbd.button.is-inverted.is-outlined.is-hovered, .button.is-dark.is-inverted.is-outlined:focus, .content kbd.button.is-inverted.is-outlined:focus, .button.is-dark.is-inverted.is-outlined.is-focused, .content kbd.button.is-inverted.is-outlined.is-focused { - background-color: whitesmoke; - color: #363636; } - .button.is-dark.is-inverted.is-outlined.is-loading:hover::after, .content kbd.button.is-inverted.is-outlined.is-loading:hover::after, .button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after, .content kbd.button.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-dark.is-inverted.is-outlined.is-loading:focus::after, .content kbd.button.is-inverted.is-outlined.is-loading:focus::after, .button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after, .content kbd.button.is-inverted.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #363636 #363636 !important; } - .button.is-dark.is-inverted.is-outlined[disabled], .content kbd.button.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-dark.is-inverted.is-outlined, fieldset[disabled] .content kbd.button.is-inverted.is-outlined, .content fieldset[disabled] kbd.button.is-inverted.is-outlined { - background-color: transparent; - border-color: whitesmoke; - box-shadow: none; - color: whitesmoke; } - .button.is-primary, .docstring > section > a.button.docs-sourcelink { - background-color: #4eb5de; - border-color: transparent; - color: #fff; } - .button.is-primary:hover, .docstring > section > a.button.docs-sourcelink:hover, .button.is-primary.is-hovered, .docstring > section > a.button.is-hovered.docs-sourcelink { - background-color: #43b1dc; - border-color: transparent; - color: #fff; } - .button.is-primary:focus, .docstring > section > a.button.docs-sourcelink:focus, .button.is-primary.is-focused, .docstring > section > a.button.is-focused.docs-sourcelink { - border-color: transparent; - color: #fff; } - .button.is-primary:focus:not(:active), .docstring > section > a.button.docs-sourcelink:focus:not(:active), .button.is-primary.is-focused:not(:active), .docstring > section > a.button.is-focused.docs-sourcelink:not(:active) { - box-shadow: 0 0 0 0.125em rgba(78, 181, 222, 0.25); } - .button.is-primary:active, .docstring > section > a.button.docs-sourcelink:active, .button.is-primary.is-active, .docstring > section > a.button.is-active.docs-sourcelink { - background-color: #39acda; - border-color: transparent; - color: #fff; } - .button.is-primary[disabled], .docstring > section > a.button.docs-sourcelink[disabled], fieldset[disabled] .button.is-primary, fieldset[disabled] .docstring > section > a.button.docs-sourcelink { - background-color: #4eb5de; - border-color: transparent; - box-shadow: none; } - .button.is-primary.is-inverted, .docstring > section > a.button.is-inverted.docs-sourcelink { - background-color: #fff; - color: #4eb5de; } - .button.is-primary.is-inverted:hover, .docstring > section > a.button.is-inverted.docs-sourcelink:hover, .button.is-primary.is-inverted.is-hovered, .docstring > section > a.button.is-inverted.is-hovered.docs-sourcelink { - background-color: #f2f2f2; } - .button.is-primary.is-inverted[disabled], .docstring > section > a.button.is-inverted.docs-sourcelink[disabled], fieldset[disabled] .button.is-primary.is-inverted, fieldset[disabled] .docstring > section > a.button.is-inverted.docs-sourcelink { - background-color: #fff; - border-color: transparent; - box-shadow: none; - color: #4eb5de; } - .button.is-primary.is-loading::after, .docstring > section > a.button.is-loading.docs-sourcelink::after { - border-color: transparent transparent #fff #fff !important; } - .button.is-primary.is-outlined, .docstring > section > a.button.is-outlined.docs-sourcelink { - background-color: transparent; - border-color: #4eb5de; - color: #4eb5de; } - .button.is-primary.is-outlined:hover, .docstring > section > a.button.is-outlined.docs-sourcelink:hover, .button.is-primary.is-outlined.is-hovered, .docstring > section > a.button.is-outlined.is-hovered.docs-sourcelink, .button.is-primary.is-outlined:focus, .docstring > section > a.button.is-outlined.docs-sourcelink:focus, .button.is-primary.is-outlined.is-focused, .docstring > section > a.button.is-outlined.is-focused.docs-sourcelink { - background-color: #4eb5de; - border-color: #4eb5de; - color: #fff; } - .button.is-primary.is-outlined.is-loading::after, .docstring > section > a.button.is-outlined.is-loading.docs-sourcelink::after { - border-color: transparent transparent #4eb5de #4eb5de !important; } - .button.is-primary.is-outlined.is-loading:hover::after, .docstring > section > a.button.is-outlined.is-loading.docs-sourcelink:hover::after, .button.is-primary.is-outlined.is-loading.is-hovered::after, .docstring > section > a.button.is-outlined.is-loading.is-hovered.docs-sourcelink::after, .button.is-primary.is-outlined.is-loading:focus::after, .docstring > section > a.button.is-outlined.is-loading.docs-sourcelink:focus::after, .button.is-primary.is-outlined.is-loading.is-focused::after, .docstring > section > a.button.is-outlined.is-loading.is-focused.docs-sourcelink::after { - border-color: transparent transparent #fff #fff !important; } - .button.is-primary.is-outlined[disabled], .docstring > section > a.button.is-outlined.docs-sourcelink[disabled], fieldset[disabled] .button.is-primary.is-outlined, fieldset[disabled] .docstring > section > a.button.is-outlined.docs-sourcelink { - background-color: transparent; - border-color: #4eb5de; - box-shadow: none; - color: #4eb5de; } - .button.is-primary.is-inverted.is-outlined, .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink { - background-color: transparent; - border-color: #fff; - color: #fff; } - .button.is-primary.is-inverted.is-outlined:hover, .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink:hover, .button.is-primary.is-inverted.is-outlined.is-hovered, .docstring > section > a.button.is-inverted.is-outlined.is-hovered.docs-sourcelink, .button.is-primary.is-inverted.is-outlined:focus, .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink:focus, .button.is-primary.is-inverted.is-outlined.is-focused, .docstring > section > a.button.is-inverted.is-outlined.is-focused.docs-sourcelink { - background-color: #fff; - color: #4eb5de; } - .button.is-primary.is-inverted.is-outlined.is-loading:hover::after, .docstring > section > a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:hover::after, .button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after, .docstring > section > a.button.is-inverted.is-outlined.is-loading.is-hovered.docs-sourcelink::after, .button.is-primary.is-inverted.is-outlined.is-loading:focus::after, .docstring > section > a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:focus::after, .button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after, .docstring > section > a.button.is-inverted.is-outlined.is-loading.is-focused.docs-sourcelink::after { - border-color: transparent transparent #4eb5de #4eb5de !important; } - .button.is-primary.is-inverted.is-outlined[disabled], .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink[disabled], fieldset[disabled] .button.is-primary.is-inverted.is-outlined, fieldset[disabled] .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink { - background-color: transparent; - border-color: #fff; - box-shadow: none; - color: #fff; } - .button.is-link { - background-color: #2e63b8; - border-color: transparent; - color: #fff; } - .button.is-link:hover, .button.is-link.is-hovered { - background-color: #2b5eae; - border-color: transparent; - color: #fff; } - .button.is-link:focus, .button.is-link.is-focused { - border-color: transparent; - color: #fff; } - .button.is-link:focus:not(:active), .button.is-link.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(46, 99, 184, 0.25); } - .button.is-link:active, .button.is-link.is-active { - background-color: #2958a4; - border-color: transparent; - color: #fff; } - .button.is-link[disabled], fieldset[disabled] .button.is-link { - background-color: #2e63b8; - border-color: transparent; - box-shadow: none; } - .button.is-link.is-inverted { - background-color: #fff; - color: #2e63b8; } - .button.is-link.is-inverted:hover, .button.is-link.is-inverted.is-hovered { - background-color: #f2f2f2; } - .button.is-link.is-inverted[disabled], fieldset[disabled] .button.is-link.is-inverted { - background-color: #fff; - border-color: transparent; - box-shadow: none; - color: #2e63b8; } - .button.is-link.is-loading::after { - border-color: transparent transparent #fff #fff !important; } - .button.is-link.is-outlined { - background-color: transparent; - border-color: #2e63b8; - color: #2e63b8; } - .button.is-link.is-outlined:hover, .button.is-link.is-outlined.is-hovered, .button.is-link.is-outlined:focus, .button.is-link.is-outlined.is-focused { - background-color: #2e63b8; - border-color: #2e63b8; - color: #fff; } - .button.is-link.is-outlined.is-loading::after { - border-color: transparent transparent #2e63b8 #2e63b8 !important; } - .button.is-link.is-outlined.is-loading:hover::after, .button.is-link.is-outlined.is-loading.is-hovered::after, .button.is-link.is-outlined.is-loading:focus::after, .button.is-link.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #fff #fff !important; } - .button.is-link.is-outlined[disabled], fieldset[disabled] .button.is-link.is-outlined { - background-color: transparent; - border-color: #2e63b8; - box-shadow: none; - color: #2e63b8; } - .button.is-link.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - color: #fff; } - .button.is-link.is-inverted.is-outlined:hover, .button.is-link.is-inverted.is-outlined.is-hovered, .button.is-link.is-inverted.is-outlined:focus, .button.is-link.is-inverted.is-outlined.is-focused { - background-color: #fff; - color: #2e63b8; } - .button.is-link.is-inverted.is-outlined.is-loading:hover::after, .button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-link.is-inverted.is-outlined.is-loading:focus::after, .button.is-link.is-inverted.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #2e63b8 #2e63b8 !important; } - .button.is-link.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-link.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - box-shadow: none; - color: #fff; } - .button.is-info { - background-color: #209cee; - border-color: transparent; - color: #fff; } - .button.is-info:hover, .button.is-info.is-hovered { - background-color: #1497ed; - border-color: transparent; - color: #fff; } - .button.is-info:focus, .button.is-info.is-focused { - border-color: transparent; - color: #fff; } - .button.is-info:focus:not(:active), .button.is-info.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(32, 156, 238, 0.25); } - .button.is-info:active, .button.is-info.is-active { - background-color: #1190e3; - border-color: transparent; - color: #fff; } - .button.is-info[disabled], fieldset[disabled] .button.is-info { - background-color: #209cee; - border-color: transparent; - box-shadow: none; } - .button.is-info.is-inverted { - background-color: #fff; - color: #209cee; } - .button.is-info.is-inverted:hover, .button.is-info.is-inverted.is-hovered { - background-color: #f2f2f2; } - .button.is-info.is-inverted[disabled], fieldset[disabled] .button.is-info.is-inverted { - background-color: #fff; - border-color: transparent; - box-shadow: none; - color: #209cee; } - .button.is-info.is-loading::after { - border-color: transparent transparent #fff #fff !important; } - .button.is-info.is-outlined { - background-color: transparent; - border-color: #209cee; - color: #209cee; } - .button.is-info.is-outlined:hover, .button.is-info.is-outlined.is-hovered, .button.is-info.is-outlined:focus, .button.is-info.is-outlined.is-focused { - background-color: #209cee; - border-color: #209cee; - color: #fff; } - .button.is-info.is-outlined.is-loading::after { - border-color: transparent transparent #209cee #209cee !important; } - .button.is-info.is-outlined.is-loading:hover::after, .button.is-info.is-outlined.is-loading.is-hovered::after, .button.is-info.is-outlined.is-loading:focus::after, .button.is-info.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #fff #fff !important; } - .button.is-info.is-outlined[disabled], fieldset[disabled] .button.is-info.is-outlined { - background-color: transparent; - border-color: #209cee; - box-shadow: none; - color: #209cee; } - .button.is-info.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - color: #fff; } - .button.is-info.is-inverted.is-outlined:hover, .button.is-info.is-inverted.is-outlined.is-hovered, .button.is-info.is-inverted.is-outlined:focus, .button.is-info.is-inverted.is-outlined.is-focused { - background-color: #fff; - color: #209cee; } - .button.is-info.is-inverted.is-outlined.is-loading:hover::after, .button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-info.is-inverted.is-outlined.is-loading:focus::after, .button.is-info.is-inverted.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #209cee #209cee !important; } - .button.is-info.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-info.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - box-shadow: none; - color: #fff; } - .button.is-success { - background-color: #22c35b; - border-color: transparent; - color: #fff; } - .button.is-success:hover, .button.is-success.is-hovered { - background-color: #20b856; - border-color: transparent; - color: #fff; } - .button.is-success:focus, .button.is-success.is-focused { - border-color: transparent; - color: #fff; } - .button.is-success:focus:not(:active), .button.is-success.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(34, 195, 91, 0.25); } - .button.is-success:active, .button.is-success.is-active { - background-color: #1ead51; - border-color: transparent; - color: #fff; } - .button.is-success[disabled], fieldset[disabled] .button.is-success { - background-color: #22c35b; - border-color: transparent; - box-shadow: none; } - .button.is-success.is-inverted { - background-color: #fff; - color: #22c35b; } - .button.is-success.is-inverted:hover, .button.is-success.is-inverted.is-hovered { - background-color: #f2f2f2; } - .button.is-success.is-inverted[disabled], fieldset[disabled] .button.is-success.is-inverted { - background-color: #fff; - border-color: transparent; - box-shadow: none; - color: #22c35b; } - .button.is-success.is-loading::after { - border-color: transparent transparent #fff #fff !important; } - .button.is-success.is-outlined { - background-color: transparent; - border-color: #22c35b; - color: #22c35b; } - .button.is-success.is-outlined:hover, .button.is-success.is-outlined.is-hovered, .button.is-success.is-outlined:focus, .button.is-success.is-outlined.is-focused { - background-color: #22c35b; - border-color: #22c35b; - color: #fff; } - .button.is-success.is-outlined.is-loading::after { - border-color: transparent transparent #22c35b #22c35b !important; } - .button.is-success.is-outlined.is-loading:hover::after, .button.is-success.is-outlined.is-loading.is-hovered::after, .button.is-success.is-outlined.is-loading:focus::after, .button.is-success.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #fff #fff !important; } - .button.is-success.is-outlined[disabled], fieldset[disabled] .button.is-success.is-outlined { - background-color: transparent; - border-color: #22c35b; - box-shadow: none; - color: #22c35b; } - .button.is-success.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - color: #fff; } - .button.is-success.is-inverted.is-outlined:hover, .button.is-success.is-inverted.is-outlined.is-hovered, .button.is-success.is-inverted.is-outlined:focus, .button.is-success.is-inverted.is-outlined.is-focused { - background-color: #fff; - color: #22c35b; } - .button.is-success.is-inverted.is-outlined.is-loading:hover::after, .button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-success.is-inverted.is-outlined.is-loading:focus::after, .button.is-success.is-inverted.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #22c35b #22c35b !important; } - .button.is-success.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-success.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - box-shadow: none; - color: #fff; } - .button.is-warning { - background-color: #ffdd57; - border-color: transparent; - color: rgba(0, 0, 0, 0.7); } - .button.is-warning:hover, .button.is-warning.is-hovered { - background-color: #ffda4a; - border-color: transparent; - color: rgba(0, 0, 0, 0.7); } - .button.is-warning:focus, .button.is-warning.is-focused { - border-color: transparent; - color: rgba(0, 0, 0, 0.7); } - .button.is-warning:focus:not(:active), .button.is-warning.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(255, 221, 87, 0.25); } - .button.is-warning:active, .button.is-warning.is-active { - background-color: #ffd83e; - border-color: transparent; - color: rgba(0, 0, 0, 0.7); } - .button.is-warning[disabled], fieldset[disabled] .button.is-warning { - background-color: #ffdd57; - border-color: transparent; - box-shadow: none; } - .button.is-warning.is-inverted { - background-color: rgba(0, 0, 0, 0.7); - color: #ffdd57; } - .button.is-warning.is-inverted:hover, .button.is-warning.is-inverted.is-hovered { - background-color: rgba(0, 0, 0, 0.7); } - .button.is-warning.is-inverted[disabled], fieldset[disabled] .button.is-warning.is-inverted { - background-color: rgba(0, 0, 0, 0.7); - border-color: transparent; - box-shadow: none; - color: #ffdd57; } - .button.is-warning.is-loading::after { - border-color: transparent transparent rgba(0, 0, 0, 0.7) rgba(0, 0, 0, 0.7) !important; } - .button.is-warning.is-outlined { - background-color: transparent; - border-color: #ffdd57; - color: #ffdd57; } - .button.is-warning.is-outlined:hover, .button.is-warning.is-outlined.is-hovered, .button.is-warning.is-outlined:focus, .button.is-warning.is-outlined.is-focused { - background-color: #ffdd57; - border-color: #ffdd57; - color: rgba(0, 0, 0, 0.7); } - .button.is-warning.is-outlined.is-loading::after { - border-color: transparent transparent #ffdd57 #ffdd57 !important; } - .button.is-warning.is-outlined.is-loading:hover::after, .button.is-warning.is-outlined.is-loading.is-hovered::after, .button.is-warning.is-outlined.is-loading:focus::after, .button.is-warning.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent rgba(0, 0, 0, 0.7) rgba(0, 0, 0, 0.7) !important; } - .button.is-warning.is-outlined[disabled], fieldset[disabled] .button.is-warning.is-outlined { - background-color: transparent; - border-color: #ffdd57; - box-shadow: none; - color: #ffdd57; } - .button.is-warning.is-inverted.is-outlined { - background-color: transparent; - border-color: rgba(0, 0, 0, 0.7); - color: rgba(0, 0, 0, 0.7); } - .button.is-warning.is-inverted.is-outlined:hover, .button.is-warning.is-inverted.is-outlined.is-hovered, .button.is-warning.is-inverted.is-outlined:focus, .button.is-warning.is-inverted.is-outlined.is-focused { - background-color: rgba(0, 0, 0, 0.7); - color: #ffdd57; } - .button.is-warning.is-inverted.is-outlined.is-loading:hover::after, .button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-warning.is-inverted.is-outlined.is-loading:focus::after, .button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #ffdd57 #ffdd57 !important; } - .button.is-warning.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-warning.is-inverted.is-outlined { - background-color: transparent; - border-color: rgba(0, 0, 0, 0.7); - box-shadow: none; - color: rgba(0, 0, 0, 0.7); } - .button.is-danger { - background-color: #da0b00; - border-color: transparent; - color: #fff; } - .button.is-danger:hover, .button.is-danger.is-hovered { - background-color: #cd0a00; - border-color: transparent; - color: #fff; } - .button.is-danger:focus, .button.is-danger.is-focused { - border-color: transparent; - color: #fff; } - .button.is-danger:focus:not(:active), .button.is-danger.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(218, 11, 0, 0.25); } - .button.is-danger:active, .button.is-danger.is-active { - background-color: #c10a00; - border-color: transparent; - color: #fff; } - .button.is-danger[disabled], fieldset[disabled] .button.is-danger { - background-color: #da0b00; - border-color: transparent; - box-shadow: none; } - .button.is-danger.is-inverted { - background-color: #fff; - color: #da0b00; } - .button.is-danger.is-inverted:hover, .button.is-danger.is-inverted.is-hovered { - background-color: #f2f2f2; } - .button.is-danger.is-inverted[disabled], fieldset[disabled] .button.is-danger.is-inverted { - background-color: #fff; - border-color: transparent; - box-shadow: none; - color: #da0b00; } - .button.is-danger.is-loading::after { - border-color: transparent transparent #fff #fff !important; } - .button.is-danger.is-outlined { - background-color: transparent; - border-color: #da0b00; - color: #da0b00; } - .button.is-danger.is-outlined:hover, .button.is-danger.is-outlined.is-hovered, .button.is-danger.is-outlined:focus, .button.is-danger.is-outlined.is-focused { - background-color: #da0b00; - border-color: #da0b00; - color: #fff; } - .button.is-danger.is-outlined.is-loading::after { - border-color: transparent transparent #da0b00 #da0b00 !important; } - .button.is-danger.is-outlined.is-loading:hover::after, .button.is-danger.is-outlined.is-loading.is-hovered::after, .button.is-danger.is-outlined.is-loading:focus::after, .button.is-danger.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #fff #fff !important; } - .button.is-danger.is-outlined[disabled], fieldset[disabled] .button.is-danger.is-outlined { - background-color: transparent; - border-color: #da0b00; - box-shadow: none; - color: #da0b00; } - .button.is-danger.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - color: #fff; } - .button.is-danger.is-inverted.is-outlined:hover, .button.is-danger.is-inverted.is-outlined.is-hovered, .button.is-danger.is-inverted.is-outlined:focus, .button.is-danger.is-inverted.is-outlined.is-focused { - background-color: #fff; - color: #da0b00; } - .button.is-danger.is-inverted.is-outlined.is-loading:hover::after, .button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-danger.is-inverted.is-outlined.is-loading:focus::after, .button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #da0b00 #da0b00 !important; } - .button.is-danger.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-danger.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - box-shadow: none; - color: #fff; } - .button.is-small, #documenter .docs-sidebar form.docs-search > input.button { - border-radius: 2px; - font-size: 0.75rem; } - .button.is-normal { - font-size: 1rem; } - .button.is-medium { - font-size: 1.25rem; } - .button.is-large { - font-size: 1.5rem; } - .button[disabled], fieldset[disabled] .button { - background-color: white; - border-color: #dbdbdb; - box-shadow: none; - opacity: 0.5; } - .button.is-fullwidth { - display: flex; - width: 100%; } - .button.is-loading { - color: transparent !important; - pointer-events: none; } - .button.is-loading::after { - position: absolute; - left: calc(50% - (1em / 2)); - top: calc(50% - (1em / 2)); - position: absolute !important; } - .button.is-static { - background-color: whitesmoke; - border-color: #dbdbdb; - color: #6b6b6b; - box-shadow: none; - pointer-events: none; } - .button.is-rounded, #documenter .docs-sidebar form.docs-search > input.button { - border-radius: 290486px; - padding-left: 1em; - padding-right: 1em; } - -.buttons { - align-items: center; - display: flex; - flex-wrap: wrap; - justify-content: flex-start; } - .buttons .button { - margin-bottom: 0.5rem; } - .buttons .button:not(:last-child):not(.is-fullwidth) { - margin-right: 0.5rem; } - .buttons:last-child { - margin-bottom: -0.5rem; } - .buttons:not(:last-child) { - margin-bottom: 1rem; } - .buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large) { - border-radius: 2px; - font-size: 0.75rem; } - .buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large) { - font-size: 1.25rem; } - .buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium) { - font-size: 1.5rem; } - .buttons.has-addons .button:not(:first-child) { - border-bottom-left-radius: 0; - border-top-left-radius: 0; } - .buttons.has-addons .button:not(:last-child) { - border-bottom-right-radius: 0; - border-top-right-radius: 0; - margin-right: -1px; } - .buttons.has-addons .button:last-child { - margin-right: 0; } - .buttons.has-addons .button:hover, .buttons.has-addons .button.is-hovered { - z-index: 2; } - .buttons.has-addons .button:focus, .buttons.has-addons .button.is-focused, .buttons.has-addons .button:active, .buttons.has-addons .button.is-active, .buttons.has-addons .button.is-selected { - z-index: 3; } - .buttons.has-addons .button:focus:hover, .buttons.has-addons .button.is-focused:hover, .buttons.has-addons .button:active:hover, .buttons.has-addons .button.is-active:hover, .buttons.has-addons .button.is-selected:hover { - z-index: 4; } - .buttons.has-addons .button.is-expanded { - flex-grow: 1; - flex-shrink: 1; } - .buttons.is-centered { - justify-content: center; } - .buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth) { - margin-left: 0.25rem; - margin-right: 0.25rem; } - .buttons.is-right { - justify-content: flex-end; } - .buttons.is-right:not(.has-addons) .button:not(.is-fullwidth) { - margin-left: 0.25rem; - margin-right: 0.25rem; } - -.container { - flex-grow: 1; - margin: 0 auto; - position: relative; - width: auto; } - @media screen and (min-width: 1056px) { - .container { - max-width: 992px; } - .container.is-fluid { - margin-left: 32px; - margin-right: 32px; - max-width: none; } } - @media screen and (max-width: 1215px) { - .container.is-widescreen { - max-width: 1152px; } } - @media screen and (max-width: 1407px) { - .container.is-fullhd { - max-width: 1344px; } } - @media screen and (min-width: 1216px) { - .container { - max-width: 1152px; } } - @media screen and (min-width: 1408px) { - .container { - max-width: 1344px; } } -.content li + li { - margin-top: 0.25em; } - -.content p:not(:last-child), -.content dl:not(:last-child), -.content ol:not(:last-child), -.content ul:not(:last-child), -.content blockquote:not(:last-child), -.content pre:not(:last-child), -.content table:not(:last-child) { - margin-bottom: 1em; } - -.content h1, -.content h2, -.content h3, -.content h4, -.content h5, -.content h6 { - color: #222222; - font-weight: 600; - line-height: 1.125; } - -.content h1 { - font-size: 2em; - margin-bottom: 0.5em; } - .content h1:not(:first-child) { - margin-top: 1em; } - -.content h2 { - font-size: 1.75em; - margin-bottom: 0.5714em; } - .content h2:not(:first-child) { - margin-top: 1.1428em; } - -.content h3 { - font-size: 1.5em; - margin-bottom: 0.6666em; } - .content h3:not(:first-child) { - margin-top: 1.3333em; } - -.content h4 { - font-size: 1.25em; - margin-bottom: 0.8em; } - -.content h5 { - font-size: 1.125em; - margin-bottom: 0.8888em; } - -.content h6 { - font-size: 1em; - margin-bottom: 1em; } - -.content blockquote { - background-color: whitesmoke; - border-left: 5px solid #dbdbdb; - padding: 1.25em 1.5em; } - -.content ol { - list-style-position: outside; - margin-left: 2em; - margin-top: 1em; } - .content ol:not([type]) { - list-style-type: decimal; } - .content ol.is-lower-alpha:not([type]) { - list-style-type: lower-alpha; } - .content ol.is-lower-roman:not([type]) { - list-style-type: lower-roman; } - .content ol.is-upper-alpha:not([type]) { - list-style-type: upper-alpha; } - .content ol.is-upper-roman:not([type]) { - list-style-type: upper-roman; } - -.content ul { - list-style: disc outside; - margin-left: 2em; - margin-top: 1em; } - .content ul ul { - list-style-type: circle; - margin-top: 0.5em; } - .content ul ul ul { - list-style-type: square; } - -.content dd { - margin-left: 2em; } - -.content figure { - margin-left: 2em; - margin-right: 2em; - text-align: center; } - .content figure:not(:first-child) { - margin-top: 2em; } - .content figure:not(:last-child) { - margin-bottom: 2em; } - .content figure img { - display: inline-block; } - .content figure figcaption { - font-style: italic; } - -.content pre { - -webkit-overflow-scrolling: touch; - overflow-x: auto; - padding: 0; - white-space: pre; - word-wrap: normal; } - -.content sup, -.content sub { - font-size: 75%; } - -.content table { - width: 100%; } - .content table td, - .content table th { - border: 1px solid #dbdbdb; - border-width: 0 0 1px; - padding: 0.5em 0.75em; - vertical-align: top; } - .content table th { - color: #222222; } - .content table th:not([align]) { - text-align: left; } - .content table thead td, - .content table thead th { - border-width: 0 0 2px; - color: #222222; } - .content table tfoot td, - .content table tfoot th { - border-width: 2px 0 0; - color: #222222; } - .content table tbody tr:last-child td, - .content table tbody tr:last-child th { - border-bottom-width: 0; } - -.content .tabs li + li { - margin-top: 0; } - -.content.is-small, #documenter .docs-sidebar form.docs-search > input.content { - font-size: 0.75rem; } - -.content.is-medium { - font-size: 1.25rem; } - -.content.is-large { - font-size: 1.5rem; } - -.icon { - align-items: center; - display: inline-flex; - justify-content: center; - height: 1.5rem; - width: 1.5rem; } - .icon.is-small, #documenter .docs-sidebar form.docs-search > input.icon { - height: 1rem; - width: 1rem; } - .icon.is-medium { - height: 2rem; - width: 2rem; } - .icon.is-large { - height: 3rem; - width: 3rem; } - -.image, #documenter .docs-sidebar .docs-logo > img { - display: block; - position: relative; } - .image img, #documenter .docs-sidebar .docs-logo > img img { - display: block; - height: auto; - width: 100%; } - .image img.is-rounded, #documenter .docs-sidebar .docs-logo > img img.is-rounded { - border-radius: 290486px; } - .image.is-square img, #documenter .docs-sidebar .docs-logo > img.is-square img, - .image.is-square .has-ratio, - #documenter .docs-sidebar .docs-logo > img.is-square .has-ratio, .image.is-1by1 img, #documenter .docs-sidebar .docs-logo > img.is-1by1 img, - .image.is-1by1 .has-ratio, - #documenter .docs-sidebar .docs-logo > img.is-1by1 .has-ratio, .image.is-5by4 img, #documenter .docs-sidebar .docs-logo > img.is-5by4 img, - .image.is-5by4 .has-ratio, - #documenter .docs-sidebar .docs-logo > img.is-5by4 .has-ratio, .image.is-4by3 img, #documenter .docs-sidebar .docs-logo > img.is-4by3 img, - .image.is-4by3 .has-ratio, - #documenter .docs-sidebar .docs-logo > img.is-4by3 .has-ratio, .image.is-3by2 img, #documenter .docs-sidebar .docs-logo > img.is-3by2 img, - .image.is-3by2 .has-ratio, - #documenter .docs-sidebar .docs-logo > img.is-3by2 .has-ratio, .image.is-5by3 img, #documenter .docs-sidebar .docs-logo > img.is-5by3 img, - .image.is-5by3 .has-ratio, - #documenter .docs-sidebar .docs-logo > img.is-5by3 .has-ratio, .image.is-16by9 img, #documenter .docs-sidebar .docs-logo > img.is-16by9 img, - .image.is-16by9 .has-ratio, - #documenter .docs-sidebar .docs-logo > img.is-16by9 .has-ratio, .image.is-2by1 img, #documenter .docs-sidebar .docs-logo > img.is-2by1 img, - .image.is-2by1 .has-ratio, - #documenter .docs-sidebar .docs-logo > img.is-2by1 .has-ratio, .image.is-3by1 img, #documenter .docs-sidebar .docs-logo > img.is-3by1 img, - .image.is-3by1 .has-ratio, - #documenter .docs-sidebar .docs-logo > img.is-3by1 .has-ratio, .image.is-4by5 img, #documenter .docs-sidebar .docs-logo > img.is-4by5 img, - .image.is-4by5 .has-ratio, - #documenter .docs-sidebar .docs-logo > img.is-4by5 .has-ratio, .image.is-3by4 img, #documenter .docs-sidebar .docs-logo > img.is-3by4 img, - .image.is-3by4 .has-ratio, - #documenter .docs-sidebar .docs-logo > img.is-3by4 .has-ratio, .image.is-2by3 img, #documenter .docs-sidebar .docs-logo > img.is-2by3 img, - .image.is-2by3 .has-ratio, - #documenter .docs-sidebar .docs-logo > img.is-2by3 .has-ratio, .image.is-3by5 img, #documenter .docs-sidebar .docs-logo > img.is-3by5 img, - .image.is-3by5 .has-ratio, - #documenter .docs-sidebar .docs-logo > img.is-3by5 .has-ratio, .image.is-9by16 img, #documenter .docs-sidebar .docs-logo > img.is-9by16 img, - .image.is-9by16 .has-ratio, - #documenter .docs-sidebar .docs-logo > img.is-9by16 .has-ratio, .image.is-1by2 img, #documenter .docs-sidebar .docs-logo > img.is-1by2 img, - .image.is-1by2 .has-ratio, - #documenter .docs-sidebar .docs-logo > img.is-1by2 .has-ratio, .image.is-1by3 img, #documenter .docs-sidebar .docs-logo > img.is-1by3 img, - .image.is-1by3 .has-ratio, - #documenter .docs-sidebar .docs-logo > img.is-1by3 .has-ratio { - height: 100%; - width: 100%; } - .image.is-square, #documenter .docs-sidebar .docs-logo > img.is-square, .image.is-1by1, #documenter .docs-sidebar .docs-logo > img.is-1by1 { - padding-top: 100%; } - .image.is-5by4, #documenter .docs-sidebar .docs-logo > img.is-5by4 { - padding-top: 80%; } - .image.is-4by3, #documenter .docs-sidebar .docs-logo > img.is-4by3 { - padding-top: 75%; } - .image.is-3by2, #documenter .docs-sidebar .docs-logo > img.is-3by2 { - padding-top: 66.6666%; } - .image.is-5by3, #documenter .docs-sidebar .docs-logo > img.is-5by3 { - padding-top: 60%; } - .image.is-16by9, #documenter .docs-sidebar .docs-logo > img.is-16by9 { - padding-top: 56.25%; } - .image.is-2by1, #documenter .docs-sidebar .docs-logo > img.is-2by1 { - padding-top: 50%; } - .image.is-3by1, #documenter .docs-sidebar .docs-logo > img.is-3by1 { - padding-top: 33.3333%; } - .image.is-4by5, #documenter .docs-sidebar .docs-logo > img.is-4by5 { - padding-top: 125%; } - .image.is-3by4, #documenter .docs-sidebar .docs-logo > img.is-3by4 { - padding-top: 133.3333%; } - .image.is-2by3, #documenter .docs-sidebar .docs-logo > img.is-2by3 { - padding-top: 150%; } - .image.is-3by5, #documenter .docs-sidebar .docs-logo > img.is-3by5 { - padding-top: 166.6666%; } - .image.is-9by16, #documenter .docs-sidebar .docs-logo > img.is-9by16 { - padding-top: 177.7777%; } - .image.is-1by2, #documenter .docs-sidebar .docs-logo > img.is-1by2 { - padding-top: 200%; } - .image.is-1by3, #documenter .docs-sidebar .docs-logo > img.is-1by3 { - padding-top: 300%; } - .image.is-16x16, #documenter .docs-sidebar .docs-logo > img.is-16x16 { - height: 16px; - width: 16px; } - .image.is-24x24, #documenter .docs-sidebar .docs-logo > img.is-24x24 { - height: 24px; - width: 24px; } - .image.is-32x32, #documenter .docs-sidebar .docs-logo > img.is-32x32 { - height: 32px; - width: 32px; } - .image.is-48x48, #documenter .docs-sidebar .docs-logo > img.is-48x48 { - height: 48px; - width: 48px; } - .image.is-64x64, #documenter .docs-sidebar .docs-logo > img.is-64x64 { - height: 64px; - width: 64px; } - .image.is-96x96, #documenter .docs-sidebar .docs-logo > img.is-96x96 { - height: 96px; - width: 96px; } - .image.is-128x128, #documenter .docs-sidebar .docs-logo > img.is-128x128 { - height: 128px; - width: 128px; } - -.notification { - background-color: whitesmoke; - border-radius: 4px; - padding: 1.25rem 2.5rem 1.25rem 1.5rem; - position: relative; } - .notification a:not(.button):not(.dropdown-item) { - color: currentColor; - text-decoration: underline; } - .notification strong { - color: currentColor; } - .notification code, - .notification pre { - background: white; } - .notification pre code { - background: transparent; } - .notification > .delete { - position: absolute; - right: 0.5rem; - top: 0.5rem; } - .notification .title, - .notification .subtitle, - .notification .content { - color: currentColor; } - .notification.is-white { - background-color: white; - color: #0a0a0a; } - .notification.is-black { - background-color: #0a0a0a; - color: white; } - .notification.is-light { - background-color: whitesmoke; - color: #363636; } - .notification.is-dark, .content kbd.notification { - background-color: #363636; - color: whitesmoke; } - .notification.is-primary, .docstring > section > a.notification.docs-sourcelink { - background-color: #4eb5de; - color: #fff; } - .notification.is-link { - background-color: #2e63b8; - color: #fff; } - .notification.is-info { - background-color: #209cee; - color: #fff; } - .notification.is-success { - background-color: #22c35b; - color: #fff; } - .notification.is-warning { - background-color: #ffdd57; - color: rgba(0, 0, 0, 0.7); } - .notification.is-danger { - background-color: #da0b00; - color: #fff; } - -.progress { - -moz-appearance: none; - -webkit-appearance: none; - border: none; - border-radius: 290486px; - display: block; - height: 1rem; - overflow: hidden; - padding: 0; - width: 100%; } - .progress::-webkit-progress-bar { - background-color: #dbdbdb; } - .progress::-webkit-progress-value { - background-color: #222222; } - .progress::-moz-progress-bar { - background-color: #222222; } - .progress::-ms-fill { - background-color: #222222; - border: none; } - .progress.is-white::-webkit-progress-value { - background-color: white; } - .progress.is-white::-moz-progress-bar { - background-color: white; } - .progress.is-white::-ms-fill { - background-color: white; } - .progress.is-white:indeterminate { - background-image: linear-gradient(to right, white 30%, #dbdbdb 30%); } - .progress.is-black::-webkit-progress-value { - background-color: #0a0a0a; } - .progress.is-black::-moz-progress-bar { - background-color: #0a0a0a; } - .progress.is-black::-ms-fill { - background-color: #0a0a0a; } - .progress.is-black:indeterminate { - background-image: linear-gradient(to right, #0a0a0a 30%, #dbdbdb 30%); } - .progress.is-light::-webkit-progress-value { - background-color: whitesmoke; } - .progress.is-light::-moz-progress-bar { - background-color: whitesmoke; } - .progress.is-light::-ms-fill { - background-color: whitesmoke; } - .progress.is-light:indeterminate { - background-image: linear-gradient(to right, whitesmoke 30%, #dbdbdb 30%); } - .progress.is-dark::-webkit-progress-value, .content kbd.progress::-webkit-progress-value { - background-color: #363636; } - .progress.is-dark::-moz-progress-bar, .content kbd.progress::-moz-progress-bar { - background-color: #363636; } - .progress.is-dark::-ms-fill, .content kbd.progress::-ms-fill { - background-color: #363636; } - .progress.is-dark:indeterminate, .content kbd.progress:indeterminate { - background-image: linear-gradient(to right, #363636 30%, #dbdbdb 30%); } - .progress.is-primary::-webkit-progress-value, .docstring > section > a.progress.docs-sourcelink::-webkit-progress-value { - background-color: #4eb5de; } - .progress.is-primary::-moz-progress-bar, .docstring > section > a.progress.docs-sourcelink::-moz-progress-bar { - background-color: #4eb5de; } - .progress.is-primary::-ms-fill, .docstring > section > a.progress.docs-sourcelink::-ms-fill { - background-color: #4eb5de; } - .progress.is-primary:indeterminate, .docstring > section > a.progress.docs-sourcelink:indeterminate { - background-image: linear-gradient(to right, #4eb5de 30%, #dbdbdb 30%); } - .progress.is-link::-webkit-progress-value { - background-color: #2e63b8; } - .progress.is-link::-moz-progress-bar { - background-color: #2e63b8; } - .progress.is-link::-ms-fill { - background-color: #2e63b8; } - .progress.is-link:indeterminate { - background-image: linear-gradient(to right, #2e63b8 30%, #dbdbdb 30%); } - .progress.is-info::-webkit-progress-value { - background-color: #209cee; } - .progress.is-info::-moz-progress-bar { - background-color: #209cee; } - .progress.is-info::-ms-fill { - background-color: #209cee; } - .progress.is-info:indeterminate { - background-image: linear-gradient(to right, #209cee 30%, #dbdbdb 30%); } - .progress.is-success::-webkit-progress-value { - background-color: #22c35b; } - .progress.is-success::-moz-progress-bar { - background-color: #22c35b; } - .progress.is-success::-ms-fill { - background-color: #22c35b; } - .progress.is-success:indeterminate { - background-image: linear-gradient(to right, #22c35b 30%, #dbdbdb 30%); } - .progress.is-warning::-webkit-progress-value { - background-color: #ffdd57; } - .progress.is-warning::-moz-progress-bar { - background-color: #ffdd57; } - .progress.is-warning::-ms-fill { - background-color: #ffdd57; } - .progress.is-warning:indeterminate { - background-image: linear-gradient(to right, #ffdd57 30%, #dbdbdb 30%); } - .progress.is-danger::-webkit-progress-value { - background-color: #da0b00; } - .progress.is-danger::-moz-progress-bar { - background-color: #da0b00; } - .progress.is-danger::-ms-fill { - background-color: #da0b00; } - .progress.is-danger:indeterminate { - background-image: linear-gradient(to right, #da0b00 30%, #dbdbdb 30%); } - .progress:indeterminate { - animation-duration: 1.5s; - animation-iteration-count: infinite; - animation-name: moveIndeterminate; - animation-timing-function: linear; - background-color: #dbdbdb; - background-image: linear-gradient(to right, #222222 30%, #dbdbdb 30%); - background-position: top left; - background-repeat: no-repeat; - background-size: 150% 150%; } - .progress:indeterminate::-webkit-progress-bar { - background-color: transparent; } - .progress:indeterminate::-moz-progress-bar { - background-color: transparent; } - .progress.is-small, #documenter .docs-sidebar form.docs-search > input.progress { - height: 0.75rem; } - .progress.is-medium { - height: 1.25rem; } - .progress.is-large { - height: 1.5rem; } - -@keyframes moveIndeterminate { - from { - background-position: 200% 0; } - to { - background-position: -200% 0; } } - -.table { - background-color: white; - color: #363636; } - .table td, - .table th { - border: 1px solid #dbdbdb; - border-width: 0 0 1px; - padding: 0.5em 0.75em; - vertical-align: top; } - .table td.is-white, - .table th.is-white { - background-color: white; - border-color: white; - color: #0a0a0a; } - .table td.is-black, - .table th.is-black { - background-color: #0a0a0a; - border-color: #0a0a0a; - color: white; } - .table td.is-light, - .table th.is-light { - background-color: whitesmoke; - border-color: whitesmoke; - color: #363636; } - .table td.is-dark, - .table th.is-dark { - background-color: #363636; - border-color: #363636; - color: whitesmoke; } - .table td.is-primary, - .table th.is-primary { - background-color: #4eb5de; - border-color: #4eb5de; - color: #fff; } - .table td.is-link, - .table th.is-link { - background-color: #2e63b8; - border-color: #2e63b8; - color: #fff; } - .table td.is-info, - .table th.is-info { - background-color: #209cee; - border-color: #209cee; - color: #fff; } - .table td.is-success, - .table th.is-success { - background-color: #22c35b; - border-color: #22c35b; - color: #fff; } - .table td.is-warning, - .table th.is-warning { - background-color: #ffdd57; - border-color: #ffdd57; - color: rgba(0, 0, 0, 0.7); } - .table td.is-danger, - .table th.is-danger { - background-color: #da0b00; - border-color: #da0b00; - color: #fff; } - .table td.is-narrow, - .table th.is-narrow { - white-space: nowrap; - width: 1%; } - .table td.is-selected, - .table th.is-selected { - background-color: #4eb5de; - color: #fff; } - .table td.is-selected a, - .table td.is-selected strong, - .table th.is-selected a, - .table th.is-selected strong { - color: currentColor; } - .table th { - color: #222222; } - .table th:not([align]) { - text-align: left; } - .table tr.is-selected { - background-color: #4eb5de; - color: #fff; } - .table tr.is-selected a, - .table tr.is-selected strong { - color: currentColor; } - .table tr.is-selected td, - .table tr.is-selected th { - border-color: #fff; - color: currentColor; } - .table thead { - background-color: transparent; } - .table thead td, - .table thead th { - border-width: 0 0 2px; - color: #222222; } - .table tfoot { - background-color: transparent; } - .table tfoot td, - .table tfoot th { - border-width: 2px 0 0; - color: #222222; } - .table tbody { - background-color: transparent; } - .table tbody tr:last-child td, - .table tbody tr:last-child th { - border-bottom-width: 0; } - .table.is-bordered td, - .table.is-bordered th { - border-width: 1px; } - .table.is-bordered tr:last-child td, - .table.is-bordered tr:last-child th { - border-bottom-width: 1px; } - .table.is-fullwidth { - width: 100%; } - .table.is-hoverable tbody tr:not(.is-selected):hover { - background-color: #fafafa; } - .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover { - background-color: #fafafa; } - .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(even) { - background-color: whitesmoke; } - .table.is-narrow td, - .table.is-narrow th { - padding: 0.25em 0.5em; } - .table.is-striped tbody tr:not(.is-selected):nth-child(even) { - background-color: #fafafa; } - -.table-container { - -webkit-overflow-scrolling: touch; - overflow: auto; - overflow-y: hidden; - max-width: 100%; } - -.tags { - align-items: center; - display: flex; - flex-wrap: wrap; - justify-content: flex-start; } - .tags .tag, .tags .content kbd, .content .tags kbd, .tags .docstring > section > a.docs-sourcelink { - margin-bottom: 0.5rem; } - .tags .tag:not(:last-child), .tags .content kbd:not(:last-child), .content .tags kbd:not(:last-child), .tags .docstring > section > a.docs-sourcelink:not(:last-child) { - margin-right: 0.5rem; } - .tags:last-child { - margin-bottom: -0.5rem; } - .tags:not(:last-child) { - margin-bottom: 1rem; } - .tags.are-medium .tag:not(.is-normal):not(.is-large), .tags.are-medium .content kbd:not(.is-normal):not(.is-large), .content .tags.are-medium kbd:not(.is-normal):not(.is-large), .tags.are-medium .docstring > section > a.docs-sourcelink:not(.is-normal):not(.is-large) { - font-size: 1rem; } - .tags.are-large .tag:not(.is-normal):not(.is-medium), .tags.are-large .content kbd:not(.is-normal):not(.is-medium), .content .tags.are-large kbd:not(.is-normal):not(.is-medium), .tags.are-large .docstring > section > a.docs-sourcelink:not(.is-normal):not(.is-medium) { - font-size: 1.25rem; } - .tags.is-centered { - justify-content: center; } - .tags.is-centered .tag, .tags.is-centered .content kbd, .content .tags.is-centered kbd, .tags.is-centered .docstring > section > a.docs-sourcelink { - margin-right: 0.25rem; - margin-left: 0.25rem; } - .tags.is-right { - justify-content: flex-end; } - .tags.is-right .tag:not(:first-child), .tags.is-right .content kbd:not(:first-child), .content .tags.is-right kbd:not(:first-child), .tags.is-right .docstring > section > a.docs-sourcelink:not(:first-child) { - margin-left: 0.5rem; } - .tags.is-right .tag:not(:last-child), .tags.is-right .content kbd:not(:last-child), .content .tags.is-right kbd:not(:last-child), .tags.is-right .docstring > section > a.docs-sourcelink:not(:last-child) { - margin-right: 0; } - .tags.has-addons .tag, .tags.has-addons .content kbd, .content .tags.has-addons kbd, .tags.has-addons .docstring > section > a.docs-sourcelink { - margin-right: 0; } - .tags.has-addons .tag:not(:first-child), .tags.has-addons .content kbd:not(:first-child), .content .tags.has-addons kbd:not(:first-child), .tags.has-addons .docstring > section > a.docs-sourcelink:not(:first-child) { - margin-left: 0; - border-bottom-left-radius: 0; - border-top-left-radius: 0; } - .tags.has-addons .tag:not(:last-child), .tags.has-addons .content kbd:not(:last-child), .content .tags.has-addons kbd:not(:last-child), .tags.has-addons .docstring > section > a.docs-sourcelink:not(:last-child) { - border-bottom-right-radius: 0; - border-top-right-radius: 0; } - -.tag:not(body), .content kbd:not(body), .docstring > section > a.docs-sourcelink:not(body) { - align-items: center; - background-color: whitesmoke; - border-radius: 4px; - color: #222222; - display: inline-flex; - font-size: 0.75rem; - height: 2em; - justify-content: center; - line-height: 1.5; - padding-left: 0.75em; - padding-right: 0.75em; - white-space: nowrap; } - .tag:not(body) .delete, .content kbd:not(body) .delete, .docstring > section > a.docs-sourcelink:not(body) .delete { - margin-left: 0.25rem; - margin-right: -0.375rem; } - .tag.is-white:not(body), .content kbd.is-white:not(body), .docstring > section > a.docs-sourcelink.is-white:not(body) { - background-color: white; - color: #0a0a0a; } - .tag.is-black:not(body), .content kbd.is-black:not(body), .docstring > section > a.docs-sourcelink.is-black:not(body) { - background-color: #0a0a0a; - color: white; } - .tag.is-light:not(body), .content kbd.is-light:not(body), .docstring > section > a.docs-sourcelink.is-light:not(body) { - background-color: whitesmoke; - color: #363636; } - .tag.is-dark:not(body), .content kbd:not(body), .docstring > section > a.docs-sourcelink.is-dark:not(body), .content .docstring > section > kbd:not(body) { - background-color: #363636; - color: whitesmoke; } - .tag.is-primary:not(body), .content kbd.is-primary:not(body), .docstring > section > a.docs-sourcelink:not(body) { - background-color: #4eb5de; - color: #fff; } - .tag.is-link:not(body), .content kbd.is-link:not(body), .docstring > section > a.docs-sourcelink.is-link:not(body) { - background-color: #2e63b8; - color: #fff; } - .tag.is-info:not(body), .content kbd.is-info:not(body), .docstring > section > a.docs-sourcelink.is-info:not(body) { - background-color: #209cee; - color: #fff; } - .tag.is-success:not(body), .content kbd.is-success:not(body), .docstring > section > a.docs-sourcelink.is-success:not(body) { - background-color: #22c35b; - color: #fff; } - .tag.is-warning:not(body), .content kbd.is-warning:not(body), .docstring > section > a.docs-sourcelink.is-warning:not(body) { - background-color: #ffdd57; - color: rgba(0, 0, 0, 0.7); } - .tag.is-danger:not(body), .content kbd.is-danger:not(body), .docstring > section > a.docs-sourcelink.is-danger:not(body) { - background-color: #da0b00; - color: #fff; } - .tag.is-normal:not(body), .content kbd.is-normal:not(body), .docstring > section > a.docs-sourcelink.is-normal:not(body) { - font-size: 0.75rem; } - .tag.is-medium:not(body), .content kbd.is-medium:not(body), .docstring > section > a.docs-sourcelink.is-medium:not(body) { - font-size: 1rem; } - .tag.is-large:not(body), .content kbd.is-large:not(body), .docstring > section > a.docs-sourcelink.is-large:not(body) { - font-size: 1.25rem; } - .tag:not(body) .icon:first-child:not(:last-child), .content kbd:not(body) .icon:first-child:not(:last-child), .docstring > section > a.docs-sourcelink:not(body) .icon:first-child:not(:last-child) { - margin-left: -0.375em; - margin-right: 0.1875em; } - .tag:not(body) .icon:last-child:not(:first-child), .content kbd:not(body) .icon:last-child:not(:first-child), .docstring > section > a.docs-sourcelink:not(body) .icon:last-child:not(:first-child) { - margin-left: 0.1875em; - margin-right: -0.375em; } - .tag:not(body) .icon:first-child:last-child, .content kbd:not(body) .icon:first-child:last-child, .docstring > section > a.docs-sourcelink:not(body) .icon:first-child:last-child { - margin-left: -0.375em; - margin-right: -0.375em; } - .tag.is-delete:not(body), .content kbd.is-delete:not(body), .docstring > section > a.docs-sourcelink.is-delete:not(body) { - margin-left: 1px; - padding: 0; - position: relative; - width: 2em; } - .tag.is-delete:not(body)::before, .content kbd.is-delete:not(body)::before, .docstring > section > a.docs-sourcelink.is-delete:not(body)::before, .tag.is-delete:not(body)::after, .content kbd.is-delete:not(body)::after, .docstring > section > a.docs-sourcelink.is-delete:not(body)::after { - background-color: currentColor; - content: ""; - display: block; - left: 50%; - position: absolute; - top: 50%; - transform: translateX(-50%) translateY(-50%) rotate(45deg); - transform-origin: center center; } - .tag.is-delete:not(body)::before, .content kbd.is-delete:not(body)::before, .docstring > section > a.docs-sourcelink.is-delete:not(body)::before { - height: 1px; - width: 50%; } - .tag.is-delete:not(body)::after, .content kbd.is-delete:not(body)::after, .docstring > section > a.docs-sourcelink.is-delete:not(body)::after { - height: 50%; - width: 1px; } - .tag.is-delete:not(body):hover, .content kbd.is-delete:not(body):hover, .docstring > section > a.docs-sourcelink.is-delete:not(body):hover, .tag.is-delete:not(body):focus, .content kbd.is-delete:not(body):focus, .docstring > section > a.docs-sourcelink.is-delete:not(body):focus { - background-color: #e8e8e8; } - .tag.is-delete:not(body):active, .content kbd.is-delete:not(body):active, .docstring > section > a.docs-sourcelink.is-delete:not(body):active { - background-color: #dbdbdb; } - .tag.is-rounded:not(body), #documenter .docs-sidebar form.docs-search > input:not(body), .content kbd.is-rounded:not(body), #documenter .docs-sidebar .content form.docs-search > input:not(body), .docstring > section > a.docs-sourcelink.is-rounded:not(body) { - border-radius: 290486px; } - -a.tag:hover, .docstring > section > a.docs-sourcelink:hover { - text-decoration: underline; } - -.title, -.subtitle { - word-break: break-word; } - .title em, - .title span, - .subtitle em, - .subtitle span { - font-weight: inherit; } - .title sub, - .subtitle sub { - font-size: 0.75em; } - .title sup, - .subtitle sup { - font-size: 0.75em; } - .title .tag, .title .content kbd, .content .title kbd, .title .docstring > section > a.docs-sourcelink, - .subtitle .tag, - .subtitle .content kbd, - .content .subtitle kbd, - .subtitle .docstring > section > a.docs-sourcelink { - vertical-align: middle; } - -.title { - color: #363636; - font-size: 2rem; - font-weight: 600; - line-height: 1.125; } - .title strong { - color: inherit; - font-weight: inherit; } - .title + .highlight { - margin-top: -0.75rem; } - .title:not(.is-spaced) + .subtitle { - margin-top: -1.25rem; } - .title.is-1 { - font-size: 3rem; } - .title.is-2 { - font-size: 2.5rem; } - .title.is-3 { - font-size: 2rem; } - .title.is-4 { - font-size: 1.5rem; } - .title.is-5 { - font-size: 1.25rem; } - .title.is-6 { - font-size: 1rem; } - .title.is-7 { - font-size: 0.75rem; } - -.subtitle { - color: #4a4a4a; - font-size: 1.25rem; - font-weight: 400; - line-height: 1.25; } - .subtitle strong { - color: #363636; - font-weight: 600; } - .subtitle:not(.is-spaced) + .title { - margin-top: -1.25rem; } - .subtitle.is-1 { - font-size: 3rem; } - .subtitle.is-2 { - font-size: 2.5rem; } - .subtitle.is-3 { - font-size: 2rem; } - .subtitle.is-4 { - font-size: 1.5rem; } - .subtitle.is-5 { - font-size: 1.25rem; } - .subtitle.is-6 { - font-size: 1rem; } - .subtitle.is-7 { - font-size: 0.75rem; } - -.heading { - display: block; - font-size: 11px; - letter-spacing: 1px; - margin-bottom: 5px; - text-transform: uppercase; } - -.highlight { - font-weight: 400; - max-width: 100%; - overflow: hidden; - padding: 0; } - .highlight pre { - overflow: auto; - max-width: 100%; } - -.number { - align-items: center; - background-color: whitesmoke; - border-radius: 290486px; - display: inline-flex; - font-size: 1.25rem; - height: 2em; - justify-content: center; - margin-right: 1.5rem; - min-width: 2.5em; - padding: 0.25rem 0.5rem; - text-align: center; - vertical-align: top; } - -.select select, .textarea, .input, #documenter .docs-sidebar form.docs-search > input { - background-color: white; - border-color: #dbdbdb; - border-radius: 4px; - color: #363636; } - .select select::-moz-placeholder, .textarea::-moz-placeholder, .input::-moz-placeholder, #documenter .docs-sidebar form.docs-search > input::-moz-placeholder { - color: rgba(54, 54, 54, 0.3); } - .select select::-webkit-input-placeholder, .textarea::-webkit-input-placeholder, .input::-webkit-input-placeholder, #documenter .docs-sidebar form.docs-search > input::-webkit-input-placeholder { - color: rgba(54, 54, 54, 0.3); } - .select select:-moz-placeholder, .textarea:-moz-placeholder, .input:-moz-placeholder, #documenter .docs-sidebar form.docs-search > input:-moz-placeholder { - color: rgba(54, 54, 54, 0.3); } - .select select:-ms-input-placeholder, .textarea:-ms-input-placeholder, .input:-ms-input-placeholder, #documenter .docs-sidebar form.docs-search > input:-ms-input-placeholder { - color: rgba(54, 54, 54, 0.3); } - .select select:hover, .textarea:hover, .input:hover, #documenter .docs-sidebar form.docs-search > input:hover, .select select.is-hovered, .is-hovered.textarea, .is-hovered.input, #documenter .docs-sidebar form.docs-search > input.is-hovered { - border-color: #b5b5b5; } - .select select:focus, .textarea:focus, .input:focus, #documenter .docs-sidebar form.docs-search > input:focus, .select select.is-focused, .is-focused.textarea, .is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .select select:active, .textarea:active, .input:active, #documenter .docs-sidebar form.docs-search > input:active, .select select.is-active, .is-active.textarea, .is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active { - border-color: #2e63b8; - box-shadow: 0 0 0 0.125em rgba(46, 99, 184, 0.25); } - .select select[disabled], .textarea[disabled], .input[disabled], #documenter .docs-sidebar form.docs-search > input[disabled], fieldset[disabled] .select select, .select fieldset[disabled] select, fieldset[disabled] .textarea, fieldset[disabled] .input, fieldset[disabled] #documenter .docs-sidebar form.docs-search > input, #documenter .docs-sidebar fieldset[disabled] form.docs-search > input { - background-color: whitesmoke; - border-color: whitesmoke; - box-shadow: none; - color: #6b6b6b; } - .select select[disabled]::-moz-placeholder, .textarea[disabled]::-moz-placeholder, .input[disabled]::-moz-placeholder, #documenter .docs-sidebar form.docs-search > input[disabled]::-moz-placeholder, fieldset[disabled] .select select::-moz-placeholder, .select fieldset[disabled] select::-moz-placeholder, fieldset[disabled] .textarea::-moz-placeholder, fieldset[disabled] .input::-moz-placeholder, fieldset[disabled] #documenter .docs-sidebar form.docs-search > input::-moz-placeholder, #documenter .docs-sidebar fieldset[disabled] form.docs-search > input::-moz-placeholder { - color: rgba(107, 107, 107, 0.3); } - .select select[disabled]::-webkit-input-placeholder, .textarea[disabled]::-webkit-input-placeholder, .input[disabled]::-webkit-input-placeholder, #documenter .docs-sidebar form.docs-search > input[disabled]::-webkit-input-placeholder, fieldset[disabled] .select select::-webkit-input-placeholder, .select fieldset[disabled] select::-webkit-input-placeholder, fieldset[disabled] .textarea::-webkit-input-placeholder, fieldset[disabled] .input::-webkit-input-placeholder, fieldset[disabled] #documenter .docs-sidebar form.docs-search > input::-webkit-input-placeholder, #documenter .docs-sidebar fieldset[disabled] form.docs-search > input::-webkit-input-placeholder { - color: rgba(107, 107, 107, 0.3); } - .select select[disabled]:-moz-placeholder, .textarea[disabled]:-moz-placeholder, .input[disabled]:-moz-placeholder, #documenter .docs-sidebar form.docs-search > input[disabled]:-moz-placeholder, fieldset[disabled] .select select:-moz-placeholder, .select fieldset[disabled] select:-moz-placeholder, fieldset[disabled] .textarea:-moz-placeholder, fieldset[disabled] .input:-moz-placeholder, fieldset[disabled] #documenter .docs-sidebar form.docs-search > input:-moz-placeholder, #documenter .docs-sidebar fieldset[disabled] form.docs-search > input:-moz-placeholder { - color: rgba(107, 107, 107, 0.3); } - .select select[disabled]:-ms-input-placeholder, .textarea[disabled]:-ms-input-placeholder, .input[disabled]:-ms-input-placeholder, #documenter .docs-sidebar form.docs-search > input[disabled]:-ms-input-placeholder, fieldset[disabled] .select select:-ms-input-placeholder, .select fieldset[disabled] select:-ms-input-placeholder, fieldset[disabled] .textarea:-ms-input-placeholder, fieldset[disabled] .input:-ms-input-placeholder, fieldset[disabled] #documenter .docs-sidebar form.docs-search > input:-ms-input-placeholder, #documenter .docs-sidebar fieldset[disabled] form.docs-search > input:-ms-input-placeholder { - color: rgba(107, 107, 107, 0.3); } - -.textarea, .input, #documenter .docs-sidebar form.docs-search > input { - box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.1); - max-width: 100%; - width: 100%; } - .textarea[readonly], .input[readonly], #documenter .docs-sidebar form.docs-search > input[readonly] { - box-shadow: none; } - .is-white.textarea, .is-white.input, #documenter .docs-sidebar form.docs-search > input.is-white { - border-color: white; } - .is-white.textarea:focus, .is-white.input:focus, #documenter .docs-sidebar form.docs-search > input.is-white:focus, .is-white.is-focused.textarea, .is-white.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .is-white.textarea:active, .is-white.input:active, #documenter .docs-sidebar form.docs-search > input.is-white:active, .is-white.is-active.textarea, .is-white.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active { - box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); } - .is-black.textarea, .is-black.input, #documenter .docs-sidebar form.docs-search > input.is-black { - border-color: #0a0a0a; } - .is-black.textarea:focus, .is-black.input:focus, #documenter .docs-sidebar form.docs-search > input.is-black:focus, .is-black.is-focused.textarea, .is-black.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .is-black.textarea:active, .is-black.input:active, #documenter .docs-sidebar form.docs-search > input.is-black:active, .is-black.is-active.textarea, .is-black.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active { - box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); } - .is-light.textarea, .is-light.input, #documenter .docs-sidebar form.docs-search > input.is-light { - border-color: whitesmoke; } - .is-light.textarea:focus, .is-light.input:focus, #documenter .docs-sidebar form.docs-search > input.is-light:focus, .is-light.is-focused.textarea, .is-light.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .is-light.textarea:active, .is-light.input:active, #documenter .docs-sidebar form.docs-search > input.is-light:active, .is-light.is-active.textarea, .is-light.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active { - box-shadow: 0 0 0 0.125em rgba(245, 245, 245, 0.25); } - .is-dark.textarea, .content kbd.textarea, .is-dark.input, #documenter .docs-sidebar form.docs-search > input.is-dark, .content kbd.input { - border-color: #363636; } - .is-dark.textarea:focus, .content kbd.textarea:focus, .is-dark.input:focus, #documenter .docs-sidebar form.docs-search > input.is-dark:focus, .content kbd.input:focus, .is-dark.is-focused.textarea, .content kbd.is-focused.textarea, .is-dark.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .content kbd.is-focused.input, #documenter .docs-sidebar .content form.docs-search > input.is-focused, .is-dark.textarea:active, .content kbd.textarea:active, .is-dark.input:active, #documenter .docs-sidebar form.docs-search > input.is-dark:active, .content kbd.input:active, .is-dark.is-active.textarea, .content kbd.is-active.textarea, .is-dark.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active, .content kbd.is-active.input, #documenter .docs-sidebar .content form.docs-search > input.is-active { - box-shadow: 0 0 0 0.125em rgba(54, 54, 54, 0.25); } - .is-primary.textarea, .docstring > section > a.textarea.docs-sourcelink, .is-primary.input, #documenter .docs-sidebar form.docs-search > input.is-primary, .docstring > section > a.input.docs-sourcelink { - border-color: #4eb5de; } - .is-primary.textarea:focus, .docstring > section > a.textarea.docs-sourcelink:focus, .is-primary.input:focus, #documenter .docs-sidebar form.docs-search > input.is-primary:focus, .docstring > section > a.input.docs-sourcelink:focus, .is-primary.is-focused.textarea, .docstring > section > a.is-focused.textarea.docs-sourcelink, .is-primary.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .docstring > section > a.is-focused.input.docs-sourcelink, .is-primary.textarea:active, .docstring > section > a.textarea.docs-sourcelink:active, .is-primary.input:active, #documenter .docs-sidebar form.docs-search > input.is-primary:active, .docstring > section > a.input.docs-sourcelink:active, .is-primary.is-active.textarea, .docstring > section > a.is-active.textarea.docs-sourcelink, .is-primary.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active, .docstring > section > a.is-active.input.docs-sourcelink { - box-shadow: 0 0 0 0.125em rgba(78, 181, 222, 0.25); } - .is-link.textarea, .is-link.input, #documenter .docs-sidebar form.docs-search > input.is-link { - border-color: #2e63b8; } - .is-link.textarea:focus, .is-link.input:focus, #documenter .docs-sidebar form.docs-search > input.is-link:focus, .is-link.is-focused.textarea, .is-link.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .is-link.textarea:active, .is-link.input:active, #documenter .docs-sidebar form.docs-search > input.is-link:active, .is-link.is-active.textarea, .is-link.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active { - box-shadow: 0 0 0 0.125em rgba(46, 99, 184, 0.25); } - .is-info.textarea, .is-info.input, #documenter .docs-sidebar form.docs-search > input.is-info { - border-color: #209cee; } - .is-info.textarea:focus, .is-info.input:focus, #documenter .docs-sidebar form.docs-search > input.is-info:focus, .is-info.is-focused.textarea, .is-info.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .is-info.textarea:active, .is-info.input:active, #documenter .docs-sidebar form.docs-search > input.is-info:active, .is-info.is-active.textarea, .is-info.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active { - box-shadow: 0 0 0 0.125em rgba(32, 156, 238, 0.25); } - .is-success.textarea, .is-success.input, #documenter .docs-sidebar form.docs-search > input.is-success { - border-color: #22c35b; } - .is-success.textarea:focus, .is-success.input:focus, #documenter .docs-sidebar form.docs-search > input.is-success:focus, .is-success.is-focused.textarea, .is-success.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .is-success.textarea:active, .is-success.input:active, #documenter .docs-sidebar form.docs-search > input.is-success:active, .is-success.is-active.textarea, .is-success.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active { - box-shadow: 0 0 0 0.125em rgba(34, 195, 91, 0.25); } - .is-warning.textarea, .is-warning.input, #documenter .docs-sidebar form.docs-search > input.is-warning { - border-color: #ffdd57; } - .is-warning.textarea:focus, .is-warning.input:focus, #documenter .docs-sidebar form.docs-search > input.is-warning:focus, .is-warning.is-focused.textarea, .is-warning.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .is-warning.textarea:active, .is-warning.input:active, #documenter .docs-sidebar form.docs-search > input.is-warning:active, .is-warning.is-active.textarea, .is-warning.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active { - box-shadow: 0 0 0 0.125em rgba(255, 221, 87, 0.25); } - .is-danger.textarea, .is-danger.input, #documenter .docs-sidebar form.docs-search > input.is-danger { - border-color: #da0b00; } - .is-danger.textarea:focus, .is-danger.input:focus, #documenter .docs-sidebar form.docs-search > input.is-danger:focus, .is-danger.is-focused.textarea, .is-danger.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .is-danger.textarea:active, .is-danger.input:active, #documenter .docs-sidebar form.docs-search > input.is-danger:active, .is-danger.is-active.textarea, .is-danger.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active { - box-shadow: 0 0 0 0.125em rgba(218, 11, 0, 0.25); } - .is-small.textarea, .is-small.input, #documenter .docs-sidebar form.docs-search > input { - border-radius: 2px; - font-size: 0.75rem; } - .is-medium.textarea, .is-medium.input, #documenter .docs-sidebar form.docs-search > input.is-medium { - font-size: 1.25rem; } - .is-large.textarea, .is-large.input, #documenter .docs-sidebar form.docs-search > input.is-large { - font-size: 1.5rem; } - .is-fullwidth.textarea, .is-fullwidth.input, #documenter .docs-sidebar form.docs-search > input.is-fullwidth { - display: block; - width: 100%; } - .is-inline.textarea, .is-inline.input, #documenter .docs-sidebar form.docs-search > input.is-inline { - display: inline; - width: auto; } - -.input.is-rounded, #documenter .docs-sidebar form.docs-search > input { - border-radius: 290486px; - padding-left: 1em; - padding-right: 1em; } - -.input.is-static, #documenter .docs-sidebar form.docs-search > input.is-static { - background-color: transparent; - border-color: transparent; - box-shadow: none; - padding-left: 0; - padding-right: 0; } - -.textarea { - display: block; - max-width: 100%; - min-width: 100%; - padding: 0.625em; - resize: vertical; } - .textarea:not([rows]) { - max-height: 600px; - min-height: 120px; } - .textarea[rows] { - height: initial; } - .textarea.has-fixed-size { - resize: none; } - -.radio, .checkbox { - cursor: pointer; - display: inline-block; - line-height: 1.25; - position: relative; } - .radio input, .checkbox input { - cursor: pointer; } - .radio:hover, .checkbox:hover { - color: #363636; } - .radio[disabled], .checkbox[disabled], fieldset[disabled] .radio, fieldset[disabled] .checkbox { - color: #6b6b6b; - cursor: not-allowed; } - -.radio + .radio { - margin-left: 0.5em; } - -.select { - display: inline-block; - max-width: 100%; - position: relative; - vertical-align: top; } - .select:not(.is-multiple) { - height: 2.25em; } - .select:not(.is-multiple):not(.is-loading)::after { - border-color: #2e63b8; - right: 1.125em; - z-index: 4; } - .select.is-rounded select, #documenter .docs-sidebar form.docs-search > input.select select { - border-radius: 290486px; - padding-left: 1em; } - .select select { - cursor: pointer; - display: block; - font-size: 1em; - max-width: 100%; - outline: none; } - .select select::-ms-expand { - display: none; } - .select select[disabled]:hover, fieldset[disabled] .select select:hover { - border-color: whitesmoke; } - .select select:not([multiple]) { - padding-right: 2.5em; } - .select select[multiple] { - height: auto; - padding: 0; } - .select select[multiple] option { - padding: 0.5em 1em; } - .select:not(.is-multiple):not(.is-loading):hover::after { - border-color: #363636; } - .select.is-white:not(:hover)::after { - border-color: white; } - .select.is-white select { - border-color: white; } - .select.is-white select:hover, .select.is-white select.is-hovered { - border-color: #f2f2f2; } - .select.is-white select:focus, .select.is-white select.is-focused, .select.is-white select:active, .select.is-white select.is-active { - box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); } - .select.is-black:not(:hover)::after { - border-color: #0a0a0a; } - .select.is-black select { - border-color: #0a0a0a; } - .select.is-black select:hover, .select.is-black select.is-hovered { - border-color: black; } - .select.is-black select:focus, .select.is-black select.is-focused, .select.is-black select:active, .select.is-black select.is-active { - box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); } - .select.is-light:not(:hover)::after { - border-color: whitesmoke; } - .select.is-light select { - border-color: whitesmoke; } - .select.is-light select:hover, .select.is-light select.is-hovered { - border-color: #e8e8e8; } - .select.is-light select:focus, .select.is-light select.is-focused, .select.is-light select:active, .select.is-light select.is-active { - box-shadow: 0 0 0 0.125em rgba(245, 245, 245, 0.25); } - .select.is-dark:not(:hover)::after, .content kbd.select:not(:hover)::after { - border-color: #363636; } - .select.is-dark select, .content kbd.select select { - border-color: #363636; } - .select.is-dark select:hover, .content kbd.select select:hover, .select.is-dark select.is-hovered, .content kbd.select select.is-hovered { - border-color: #292929; } - .select.is-dark select:focus, .content kbd.select select:focus, .select.is-dark select.is-focused, .content kbd.select select.is-focused, .select.is-dark select:active, .content kbd.select select:active, .select.is-dark select.is-active, .content kbd.select select.is-active { - box-shadow: 0 0 0 0.125em rgba(54, 54, 54, 0.25); } - .select.is-primary:not(:hover)::after, .docstring > section > a.select.docs-sourcelink:not(:hover)::after { - border-color: #4eb5de; } - .select.is-primary select, .docstring > section > a.select.docs-sourcelink select { - border-color: #4eb5de; } - .select.is-primary select:hover, .docstring > section > a.select.docs-sourcelink select:hover, .select.is-primary select.is-hovered, .docstring > section > a.select.docs-sourcelink select.is-hovered { - border-color: #39acda; } - .select.is-primary select:focus, .docstring > section > a.select.docs-sourcelink select:focus, .select.is-primary select.is-focused, .docstring > section > a.select.docs-sourcelink select.is-focused, .select.is-primary select:active, .docstring > section > a.select.docs-sourcelink select:active, .select.is-primary select.is-active, .docstring > section > a.select.docs-sourcelink select.is-active { - box-shadow: 0 0 0 0.125em rgba(78, 181, 222, 0.25); } - .select.is-link:not(:hover)::after { - border-color: #2e63b8; } - .select.is-link select { - border-color: #2e63b8; } - .select.is-link select:hover, .select.is-link select.is-hovered { - border-color: #2958a4; } - .select.is-link select:focus, .select.is-link select.is-focused, .select.is-link select:active, .select.is-link select.is-active { - box-shadow: 0 0 0 0.125em rgba(46, 99, 184, 0.25); } - .select.is-info:not(:hover)::after { - border-color: #209cee; } - .select.is-info select { - border-color: #209cee; } - .select.is-info select:hover, .select.is-info select.is-hovered { - border-color: #1190e3; } - .select.is-info select:focus, .select.is-info select.is-focused, .select.is-info select:active, .select.is-info select.is-active { - box-shadow: 0 0 0 0.125em rgba(32, 156, 238, 0.25); } - .select.is-success:not(:hover)::after { - border-color: #22c35b; } - .select.is-success select { - border-color: #22c35b; } - .select.is-success select:hover, .select.is-success select.is-hovered { - border-color: #1ead51; } - .select.is-success select:focus, .select.is-success select.is-focused, .select.is-success select:active, .select.is-success select.is-active { - box-shadow: 0 0 0 0.125em rgba(34, 195, 91, 0.25); } - .select.is-warning:not(:hover)::after { - border-color: #ffdd57; } - .select.is-warning select { - border-color: #ffdd57; } - .select.is-warning select:hover, .select.is-warning select.is-hovered { - border-color: #ffd83e; } - .select.is-warning select:focus, .select.is-warning select.is-focused, .select.is-warning select:active, .select.is-warning select.is-active { - box-shadow: 0 0 0 0.125em rgba(255, 221, 87, 0.25); } - .select.is-danger:not(:hover)::after { - border-color: #da0b00; } - .select.is-danger select { - border-color: #da0b00; } - .select.is-danger select:hover, .select.is-danger select.is-hovered { - border-color: #c10a00; } - .select.is-danger select:focus, .select.is-danger select.is-focused, .select.is-danger select:active, .select.is-danger select.is-active { - box-shadow: 0 0 0 0.125em rgba(218, 11, 0, 0.25); } - .select.is-small, #documenter .docs-sidebar form.docs-search > input.select { - border-radius: 2px; - font-size: 0.75rem; } - .select.is-medium { - font-size: 1.25rem; } - .select.is-large { - font-size: 1.5rem; } - .select.is-disabled::after { - border-color: #6b6b6b; } - .select.is-fullwidth { - width: 100%; } - .select.is-fullwidth select { - width: 100%; } - .select.is-loading::after { - margin-top: 0; - position: absolute; - right: 0.625em; - top: 0.625em; - transform: none; } - .select.is-loading.is-small:after, #documenter .docs-sidebar form.docs-search > input.is-loading:after { - font-size: 0.75rem; } - .select.is-loading.is-medium:after { - font-size: 1.25rem; } - .select.is-loading.is-large:after { - font-size: 1.5rem; } - -.file { - align-items: stretch; - display: flex; - justify-content: flex-start; - position: relative; } - .file.is-white .file-cta { - background-color: white; - border-color: transparent; - color: #0a0a0a; } - .file.is-white:hover .file-cta, .file.is-white.is-hovered .file-cta { - background-color: #f9f9f9; - border-color: transparent; - color: #0a0a0a; } - .file.is-white:focus .file-cta, .file.is-white.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(255, 255, 255, 0.25); - color: #0a0a0a; } - .file.is-white:active .file-cta, .file.is-white.is-active .file-cta { - background-color: #f2f2f2; - border-color: transparent; - color: #0a0a0a; } - .file.is-black .file-cta { - background-color: #0a0a0a; - border-color: transparent; - color: white; } - .file.is-black:hover .file-cta, .file.is-black.is-hovered .file-cta { - background-color: #040404; - border-color: transparent; - color: white; } - .file.is-black:focus .file-cta, .file.is-black.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(10, 10, 10, 0.25); - color: white; } - .file.is-black:active .file-cta, .file.is-black.is-active .file-cta { - background-color: black; - border-color: transparent; - color: white; } - .file.is-light .file-cta { - background-color: whitesmoke; - border-color: transparent; - color: #363636; } - .file.is-light:hover .file-cta, .file.is-light.is-hovered .file-cta { - background-color: #eeeeee; - border-color: transparent; - color: #363636; } - .file.is-light:focus .file-cta, .file.is-light.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(245, 245, 245, 0.25); - color: #363636; } - .file.is-light:active .file-cta, .file.is-light.is-active .file-cta { - background-color: #e8e8e8; - border-color: transparent; - color: #363636; } - .file.is-dark .file-cta, .content kbd.file .file-cta { - background-color: #363636; - border-color: transparent; - color: whitesmoke; } - .file.is-dark:hover .file-cta, .content kbd.file:hover .file-cta, .file.is-dark.is-hovered .file-cta, .content kbd.file.is-hovered .file-cta { - background-color: #2f2f2f; - border-color: transparent; - color: whitesmoke; } - .file.is-dark:focus .file-cta, .content kbd.file:focus .file-cta, .file.is-dark.is-focused .file-cta, .content kbd.file.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(54, 54, 54, 0.25); - color: whitesmoke; } - .file.is-dark:active .file-cta, .content kbd.file:active .file-cta, .file.is-dark.is-active .file-cta, .content kbd.file.is-active .file-cta { - background-color: #292929; - border-color: transparent; - color: whitesmoke; } - .file.is-primary .file-cta, .docstring > section > a.file.docs-sourcelink .file-cta { - background-color: #4eb5de; - border-color: transparent; - color: #fff; } - .file.is-primary:hover .file-cta, .docstring > section > a.file.docs-sourcelink:hover .file-cta, .file.is-primary.is-hovered .file-cta, .docstring > section > a.file.is-hovered.docs-sourcelink .file-cta { - background-color: #43b1dc; - border-color: transparent; - color: #fff; } - .file.is-primary:focus .file-cta, .docstring > section > a.file.docs-sourcelink:focus .file-cta, .file.is-primary.is-focused .file-cta, .docstring > section > a.file.is-focused.docs-sourcelink .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(78, 181, 222, 0.25); - color: #fff; } - .file.is-primary:active .file-cta, .docstring > section > a.file.docs-sourcelink:active .file-cta, .file.is-primary.is-active .file-cta, .docstring > section > a.file.is-active.docs-sourcelink .file-cta { - background-color: #39acda; - border-color: transparent; - color: #fff; } - .file.is-link .file-cta { - background-color: #2e63b8; - border-color: transparent; - color: #fff; } - .file.is-link:hover .file-cta, .file.is-link.is-hovered .file-cta { - background-color: #2b5eae; - border-color: transparent; - color: #fff; } - .file.is-link:focus .file-cta, .file.is-link.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(46, 99, 184, 0.25); - color: #fff; } - .file.is-link:active .file-cta, .file.is-link.is-active .file-cta { - background-color: #2958a4; - border-color: transparent; - color: #fff; } - .file.is-info .file-cta { - background-color: #209cee; - border-color: transparent; - color: #fff; } - .file.is-info:hover .file-cta, .file.is-info.is-hovered .file-cta { - background-color: #1497ed; - border-color: transparent; - color: #fff; } - .file.is-info:focus .file-cta, .file.is-info.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(32, 156, 238, 0.25); - color: #fff; } - .file.is-info:active .file-cta, .file.is-info.is-active .file-cta { - background-color: #1190e3; - border-color: transparent; - color: #fff; } - .file.is-success .file-cta { - background-color: #22c35b; - border-color: transparent; - color: #fff; } - .file.is-success:hover .file-cta, .file.is-success.is-hovered .file-cta { - background-color: #20b856; - border-color: transparent; - color: #fff; } - .file.is-success:focus .file-cta, .file.is-success.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(34, 195, 91, 0.25); - color: #fff; } - .file.is-success:active .file-cta, .file.is-success.is-active .file-cta { - background-color: #1ead51; - border-color: transparent; - color: #fff; } - .file.is-warning .file-cta { - background-color: #ffdd57; - border-color: transparent; - color: rgba(0, 0, 0, 0.7); } - .file.is-warning:hover .file-cta, .file.is-warning.is-hovered .file-cta { - background-color: #ffda4a; - border-color: transparent; - color: rgba(0, 0, 0, 0.7); } - .file.is-warning:focus .file-cta, .file.is-warning.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(255, 221, 87, 0.25); - color: rgba(0, 0, 0, 0.7); } - .file.is-warning:active .file-cta, .file.is-warning.is-active .file-cta { - background-color: #ffd83e; - border-color: transparent; - color: rgba(0, 0, 0, 0.7); } - .file.is-danger .file-cta { - background-color: #da0b00; - border-color: transparent; - color: #fff; } - .file.is-danger:hover .file-cta, .file.is-danger.is-hovered .file-cta { - background-color: #cd0a00; - border-color: transparent; - color: #fff; } - .file.is-danger:focus .file-cta, .file.is-danger.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(218, 11, 0, 0.25); - color: #fff; } - .file.is-danger:active .file-cta, .file.is-danger.is-active .file-cta { - background-color: #c10a00; - border-color: transparent; - color: #fff; } - .file.is-small, #documenter .docs-sidebar form.docs-search > input.file { - font-size: 0.75rem; } - .file.is-medium { - font-size: 1.25rem; } - .file.is-medium .file-icon .fa { - font-size: 21px; } - .file.is-large { - font-size: 1.5rem; } - .file.is-large .file-icon .fa { - font-size: 28px; } - .file.has-name .file-cta { - border-bottom-right-radius: 0; - border-top-right-radius: 0; } - .file.has-name .file-name { - border-bottom-left-radius: 0; - border-top-left-radius: 0; } - .file.has-name.is-empty .file-cta { - border-radius: 4px; } - .file.has-name.is-empty .file-name { - display: none; } - .file.is-boxed .file-label { - flex-direction: column; } - .file.is-boxed .file-cta { - flex-direction: column; - height: auto; - padding: 1em 3em; } - .file.is-boxed .file-name { - border-width: 0 1px 1px; } - .file.is-boxed .file-icon { - height: 1.5em; - width: 1.5em; } - .file.is-boxed .file-icon .fa { - font-size: 21px; } - .file.is-boxed.is-small .file-icon .fa, #documenter .docs-sidebar form.docs-search > input.is-boxed .file-icon .fa { - font-size: 14px; } - .file.is-boxed.is-medium .file-icon .fa { - font-size: 28px; } - .file.is-boxed.is-large .file-icon .fa { - font-size: 35px; } - .file.is-boxed.has-name .file-cta { - border-radius: 4px 4px 0 0; } - .file.is-boxed.has-name .file-name { - border-radius: 0 0 4px 4px; - border-width: 0 1px 1px; } - .file.is-centered { - justify-content: center; } - .file.is-fullwidth .file-label { - width: 100%; } - .file.is-fullwidth .file-name { - flex-grow: 1; - max-width: none; } - .file.is-right { - justify-content: flex-end; } - .file.is-right .file-cta { - border-radius: 0 4px 4px 0; } - .file.is-right .file-name { - border-radius: 4px 0 0 4px; - border-width: 1px 0 1px 1px; - order: -1; } - -.file-label { - align-items: stretch; - display: flex; - cursor: pointer; - justify-content: flex-start; - overflow: hidden; - position: relative; } - .file-label:hover .file-cta { - background-color: #eeeeee; - color: #363636; } - .file-label:hover .file-name { - border-color: #d5d5d5; } - .file-label:active .file-cta { - background-color: #e8e8e8; - color: #363636; } - .file-label:active .file-name { - border-color: #cfcfcf; } - -.file-input { - height: 100%; - left: 0; - opacity: 0; - outline: none; - position: absolute; - top: 0; - width: 100%; } - -.file-cta, -.file-name { - border-color: #dbdbdb; - border-radius: 4px; - font-size: 1em; - padding-left: 1em; - padding-right: 1em; - white-space: nowrap; } - -.file-cta { - background-color: whitesmoke; - color: #4a4a4a; } - -.file-name { - border-color: #dbdbdb; - border-style: solid; - border-width: 1px 1px 1px 0; - display: block; - max-width: 16em; - overflow: hidden; - text-align: left; - text-overflow: ellipsis; } - -.file-icon { - align-items: center; - display: flex; - height: 1em; - justify-content: center; - margin-right: 0.5em; - width: 1em; } - .file-icon .fa { - font-size: 14px; } - -.label { - color: #363636; - display: block; - font-size: 1rem; - font-weight: 700; } - .label:not(:last-child) { - margin-bottom: 0.5em; } - .label.is-small, #documenter .docs-sidebar form.docs-search > input.label { - font-size: 0.75rem; } - .label.is-medium { - font-size: 1.25rem; } - .label.is-large { - font-size: 1.5rem; } - -.help { - display: block; - font-size: 0.75rem; - margin-top: 0.25rem; } - .help.is-white { - color: white; } - .help.is-black { - color: #0a0a0a; } - .help.is-light { - color: whitesmoke; } - .help.is-dark, .content kbd.help { - color: #363636; } - .help.is-primary, .docstring > section > a.help.docs-sourcelink { - color: #4eb5de; } - .help.is-link { - color: #2e63b8; } - .help.is-info { - color: #209cee; } - .help.is-success { - color: #22c35b; } - .help.is-warning { - color: #ffdd57; } - .help.is-danger { - color: #da0b00; } - -.field:not(:last-child) { - margin-bottom: 0.75rem; } - -.field.has-addons { - display: flex; - justify-content: flex-start; } - .field.has-addons .control:not(:last-child) { - margin-right: -1px; } - .field.has-addons .control:not(:first-child):not(:last-child) .button, - .field.has-addons .control:not(:first-child):not(:last-child) .input, - .field.has-addons .control:not(:first-child):not(:last-child) #documenter .docs-sidebar form.docs-search > input, - #documenter .docs-sidebar .field.has-addons .control:not(:first-child):not(:last-child) form.docs-search > input, - .field.has-addons .control:not(:first-child):not(:last-child) .select select { - border-radius: 0; } - .field.has-addons .control:first-child:not(:only-child) .button, - .field.has-addons .control:first-child:not(:only-child) .input, - .field.has-addons .control:first-child:not(:only-child) #documenter .docs-sidebar form.docs-search > input, - #documenter .docs-sidebar .field.has-addons .control:first-child:not(:only-child) form.docs-search > input, - .field.has-addons .control:first-child:not(:only-child) .select select { - border-bottom-right-radius: 0; - border-top-right-radius: 0; } - .field.has-addons .control:last-child:not(:only-child) .button, - .field.has-addons .control:last-child:not(:only-child) .input, - .field.has-addons .control:last-child:not(:only-child) #documenter .docs-sidebar form.docs-search > input, - #documenter .docs-sidebar .field.has-addons .control:last-child:not(:only-child) form.docs-search > input, - .field.has-addons .control:last-child:not(:only-child) .select select { - border-bottom-left-radius: 0; - border-top-left-radius: 0; } - .field.has-addons .control .button:not([disabled]):hover, .field.has-addons .control .button.is-hovered:not([disabled]), - .field.has-addons .control .input:not([disabled]):hover, - .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):hover, - #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):hover, - .field.has-addons .control .input.is-hovered:not([disabled]), - .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-hovered:not([disabled]), - #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-hovered:not([disabled]), - .field.has-addons .control .select select:not([disabled]):hover, - .field.has-addons .control .select select.is-hovered:not([disabled]) { - z-index: 2; } - .field.has-addons .control .button:not([disabled]):focus, .field.has-addons .control .button.is-focused:not([disabled]), .field.has-addons .control .button:not([disabled]):active, .field.has-addons .control .button.is-active:not([disabled]), - .field.has-addons .control .input:not([disabled]):focus, - .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):focus, - #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):focus, - .field.has-addons .control .input.is-focused:not([disabled]), - .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-focused:not([disabled]), - #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-focused:not([disabled]), - .field.has-addons .control .input:not([disabled]):active, - .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):active, - #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):active, - .field.has-addons .control .input.is-active:not([disabled]), - .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-active:not([disabled]), - #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-active:not([disabled]), - .field.has-addons .control .select select:not([disabled]):focus, - .field.has-addons .control .select select.is-focused:not([disabled]), - .field.has-addons .control .select select:not([disabled]):active, - .field.has-addons .control .select select.is-active:not([disabled]) { - z-index: 3; } - .field.has-addons .control .button:not([disabled]):focus:hover, .field.has-addons .control .button.is-focused:not([disabled]):hover, .field.has-addons .control .button:not([disabled]):active:hover, .field.has-addons .control .button.is-active:not([disabled]):hover, - .field.has-addons .control .input:not([disabled]):focus:hover, - .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):focus:hover, - #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):focus:hover, - .field.has-addons .control .input.is-focused:not([disabled]):hover, - .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-focused:not([disabled]):hover, - #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-focused:not([disabled]):hover, - .field.has-addons .control .input:not([disabled]):active:hover, - .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):active:hover, - #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):active:hover, - .field.has-addons .control .input.is-active:not([disabled]):hover, - .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-active:not([disabled]):hover, - #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-active:not([disabled]):hover, - .field.has-addons .control .select select:not([disabled]):focus:hover, - .field.has-addons .control .select select.is-focused:not([disabled]):hover, - .field.has-addons .control .select select:not([disabled]):active:hover, - .field.has-addons .control .select select.is-active:not([disabled]):hover { - z-index: 4; } - .field.has-addons .control.is-expanded { - flex-grow: 1; - flex-shrink: 1; } - .field.has-addons.has-addons-centered { - justify-content: center; } - .field.has-addons.has-addons-right { - justify-content: flex-end; } - .field.has-addons.has-addons-fullwidth .control { - flex-grow: 1; - flex-shrink: 0; } - -.field.is-grouped { - display: flex; - justify-content: flex-start; } - .field.is-grouped > .control { - flex-shrink: 0; } - .field.is-grouped > .control:not(:last-child) { - margin-bottom: 0; - margin-right: 0.75rem; } - .field.is-grouped > .control.is-expanded { - flex-grow: 1; - flex-shrink: 1; } - .field.is-grouped.is-grouped-centered { - justify-content: center; } - .field.is-grouped.is-grouped-right { - justify-content: flex-end; } - .field.is-grouped.is-grouped-multiline { - flex-wrap: wrap; } - .field.is-grouped.is-grouped-multiline > .control:last-child, .field.is-grouped.is-grouped-multiline > .control:not(:last-child) { - margin-bottom: 0.75rem; } - .field.is-grouped.is-grouped-multiline:last-child { - margin-bottom: -0.75rem; } - .field.is-grouped.is-grouped-multiline:not(:last-child) { - margin-bottom: 0; } - -@media screen and (min-width: 769px), print { - .field.is-horizontal { - display: flex; } } - -.field-label .label { - font-size: inherit; } - -@media screen and (max-width: 768px) { - .field-label { - margin-bottom: 0.5rem; } } - -@media screen and (min-width: 769px), print { - .field-label { - flex-basis: 0; - flex-grow: 1; - flex-shrink: 0; - margin-right: 1.5rem; - text-align: right; } - .field-label.is-small, #documenter .docs-sidebar form.docs-search > input.field-label { - font-size: 0.75rem; - padding-top: 0.375em; } - .field-label.is-normal { - padding-top: 0.375em; } - .field-label.is-medium { - font-size: 1.25rem; - padding-top: 0.375em; } - .field-label.is-large { - font-size: 1.5rem; - padding-top: 0.375em; } } - -.field-body .field .field { - margin-bottom: 0; } - -@media screen and (min-width: 769px), print { - .field-body { - display: flex; - flex-basis: 0; - flex-grow: 5; - flex-shrink: 1; } - .field-body .field { - margin-bottom: 0; } - .field-body > .field { - flex-shrink: 1; } - .field-body > .field:not(.is-narrow) { - flex-grow: 1; } - .field-body > .field:not(:last-child) { - margin-right: 0.75rem; } } - -.control { - box-sizing: border-box; - clear: both; - font-size: 1rem; - position: relative; - text-align: left; } - .control.has-icons-left .input:focus ~ .icon, .control.has-icons-left #documenter .docs-sidebar form.docs-search > input:focus ~ .icon, #documenter .docs-sidebar .control.has-icons-left form.docs-search > input:focus ~ .icon, - .control.has-icons-left .select:focus ~ .icon, .control.has-icons-right .input:focus ~ .icon, .control.has-icons-right #documenter .docs-sidebar form.docs-search > input:focus ~ .icon, #documenter .docs-sidebar .control.has-icons-right form.docs-search > input:focus ~ .icon, - .control.has-icons-right .select:focus ~ .icon { - color: #6b6b6b; } - .control.has-icons-left .input.is-small ~ .icon, .control.has-icons-left #documenter .docs-sidebar form.docs-search > input ~ .icon, #documenter .docs-sidebar .control.has-icons-left form.docs-search > input ~ .icon, - .control.has-icons-left .select.is-small ~ .icon, .control.has-icons-right .input.is-small ~ .icon, .control.has-icons-right #documenter .docs-sidebar form.docs-search > input ~ .icon, #documenter .docs-sidebar .control.has-icons-right form.docs-search > input ~ .icon, - .control.has-icons-right .select.is-small ~ .icon { - font-size: 0.75rem; } - .control.has-icons-left .input.is-medium ~ .icon, .control.has-icons-left #documenter .docs-sidebar form.docs-search > input.is-medium ~ .icon, #documenter .docs-sidebar .control.has-icons-left form.docs-search > input.is-medium ~ .icon, - .control.has-icons-left .select.is-medium ~ .icon, .control.has-icons-right .input.is-medium ~ .icon, .control.has-icons-right #documenter .docs-sidebar form.docs-search > input.is-medium ~ .icon, #documenter .docs-sidebar .control.has-icons-right form.docs-search > input.is-medium ~ .icon, - .control.has-icons-right .select.is-medium ~ .icon { - font-size: 1.25rem; } - .control.has-icons-left .input.is-large ~ .icon, .control.has-icons-left #documenter .docs-sidebar form.docs-search > input.is-large ~ .icon, #documenter .docs-sidebar .control.has-icons-left form.docs-search > input.is-large ~ .icon, - .control.has-icons-left .select.is-large ~ .icon, .control.has-icons-right .input.is-large ~ .icon, .control.has-icons-right #documenter .docs-sidebar form.docs-search > input.is-large ~ .icon, #documenter .docs-sidebar .control.has-icons-right form.docs-search > input.is-large ~ .icon, - .control.has-icons-right .select.is-large ~ .icon { - font-size: 1.5rem; } - .control.has-icons-left .icon, .control.has-icons-right .icon { - color: #dbdbdb; - height: 2.25em; - pointer-events: none; - position: absolute; - top: 0; - width: 2.25em; - z-index: 4; } - .control.has-icons-left .input, .control.has-icons-left #documenter .docs-sidebar form.docs-search > input, #documenter .docs-sidebar .control.has-icons-left form.docs-search > input, - .control.has-icons-left .select select { - padding-left: 2.25em; } - .control.has-icons-left .icon.is-left { - left: 0; } - .control.has-icons-right .input, .control.has-icons-right #documenter .docs-sidebar form.docs-search > input, #documenter .docs-sidebar .control.has-icons-right form.docs-search > input, - .control.has-icons-right .select select { - padding-right: 2.25em; } - .control.has-icons-right .icon.is-right { - right: 0; } - .control.is-loading::after { - position: absolute !important; - right: 0.625em; - top: 0.625em; - z-index: 4; } - .control.is-loading.is-small:after, #documenter .docs-sidebar form.docs-search > input.is-loading:after { - font-size: 0.75rem; } - .control.is-loading.is-medium:after { - font-size: 1.25rem; } - .control.is-loading.is-large:after { - font-size: 1.5rem; } - -.breadcrumb { - font-size: 1rem; - white-space: nowrap; } - .breadcrumb a { - align-items: center; - color: #2e63b8; - display: flex; - justify-content: center; - padding: 0 0.75em; } - .breadcrumb a:hover { - color: #363636; } - .breadcrumb li { - align-items: center; - display: flex; } - .breadcrumb li:first-child a { - padding-left: 0; } - .breadcrumb li.is-active a { - color: #222222; - cursor: default; - pointer-events: none; } - .breadcrumb li + li::before { - color: #b5b5b5; - content: "\0002f"; } - .breadcrumb ul, - .breadcrumb ol { - align-items: flex-start; - display: flex; - flex-wrap: wrap; - justify-content: flex-start; } - .breadcrumb .icon:first-child { - margin-right: 0.5em; } - .breadcrumb .icon:last-child { - margin-left: 0.5em; } - .breadcrumb.is-centered ol, - .breadcrumb.is-centered ul { - justify-content: center; } - .breadcrumb.is-right ol, - .breadcrumb.is-right ul { - justify-content: flex-end; } - .breadcrumb.is-small, #documenter .docs-sidebar form.docs-search > input.breadcrumb { - font-size: 0.75rem; } - .breadcrumb.is-medium { - font-size: 1.25rem; } - .breadcrumb.is-large { - font-size: 1.5rem; } - .breadcrumb.has-arrow-separator li + li::before { - content: "\02192"; } - .breadcrumb.has-bullet-separator li + li::before { - content: "\02022"; } - .breadcrumb.has-dot-separator li + li::before { - content: "\000b7"; } - .breadcrumb.has-succeeds-separator li + li::before { - content: "\0227B"; } - -.card { - background-color: white; - box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); - color: #222222; - max-width: 100%; - position: relative; } - -.card-header { - background-color: transparent; - align-items: stretch; - box-shadow: 0 1px 2px rgba(10, 10, 10, 0.1); - display: flex; } - -.card-header-title { - align-items: center; - color: #222222; - display: flex; - flex-grow: 1; - font-weight: 700; - padding: 0.75rem; } - .card-header-title.is-centered { - justify-content: center; } - -.card-header-icon { - align-items: center; - cursor: pointer; - display: flex; - justify-content: center; - padding: 0.75rem; } - -.card-image { - display: block; - position: relative; } - -.card-content { - background-color: transparent; - padding: 1.5rem; } - -.card-footer { - background-color: transparent; - border-top: 1px solid #dbdbdb; - align-items: stretch; - display: flex; } - -.card-footer-item { - align-items: center; - display: flex; - flex-basis: 0; - flex-grow: 1; - flex-shrink: 0; - justify-content: center; - padding: 0.75rem; } - .card-footer-item:not(:last-child) { - border-right: 1px solid #dbdbdb; } - -.card .media:not(:last-child) { - margin-bottom: 1.5rem; } - -.dropdown { - display: inline-flex; - position: relative; - vertical-align: top; } - .dropdown.is-active .dropdown-menu, .dropdown.is-hoverable:hover .dropdown-menu { - display: block; } - .dropdown.is-right .dropdown-menu { - left: auto; - right: 0; } - .dropdown.is-up .dropdown-menu { - bottom: 100%; - padding-bottom: 4px; - padding-top: initial; - top: auto; } - -.dropdown-menu { - display: none; - left: 0; - min-width: 12rem; - padding-top: 4px; - position: absolute; - top: 100%; - z-index: 20; } - -.dropdown-content { - background-color: white; - border-radius: 4px; - box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); - padding-bottom: 0.5rem; - padding-top: 0.5rem; } - -.dropdown-item { - color: #4a4a4a; - display: block; - font-size: 0.875rem; - line-height: 1.5; - padding: 0.375rem 1rem; - position: relative; } - -a.dropdown-item, -button.dropdown-item { - padding-right: 3rem; - text-align: left; - white-space: nowrap; - width: 100%; } - a.dropdown-item:hover, - button.dropdown-item:hover { - background-color: whitesmoke; - color: #0a0a0a; } - a.dropdown-item.is-active, - button.dropdown-item.is-active { - background-color: #2e63b8; - color: #fff; } - -.dropdown-divider { - background-color: #dbdbdb; - border: none; - display: block; - height: 1px; - margin: 0.5rem 0; } - -.level { - align-items: center; - justify-content: space-between; } - .level code { - border-radius: 4px; } - .level img { - display: inline-block; - vertical-align: top; } - .level.is-mobile { - display: flex; } - .level.is-mobile .level-left, - .level.is-mobile .level-right { - display: flex; } - .level.is-mobile .level-left + .level-right { - margin-top: 0; } - .level.is-mobile .level-item:not(:last-child) { - margin-bottom: 0; - margin-right: 0.75rem; } - .level.is-mobile .level-item:not(.is-narrow) { - flex-grow: 1; } - @media screen and (min-width: 769px), print { - .level { - display: flex; } - .level > .level-item:not(.is-narrow) { - flex-grow: 1; } } -.level-item { - align-items: center; - display: flex; - flex-basis: auto; - flex-grow: 0; - flex-shrink: 0; - justify-content: center; } - .level-item .title, - .level-item .subtitle { - margin-bottom: 0; } - @media screen and (max-width: 768px) { - .level-item:not(:last-child) { - margin-bottom: 0.75rem; } } -.level-left, -.level-right { - flex-basis: auto; - flex-grow: 0; - flex-shrink: 0; } - .level-left .level-item.is-flexible, - .level-right .level-item.is-flexible { - flex-grow: 1; } - @media screen and (min-width: 769px), print { - .level-left .level-item:not(:last-child), - .level-right .level-item:not(:last-child) { - margin-right: 0.75rem; } } -.level-left { - align-items: center; - justify-content: flex-start; } - @media screen and (max-width: 768px) { - .level-left + .level-right { - margin-top: 1.5rem; } } - @media screen and (min-width: 769px), print { - .level-left { - display: flex; } } -.level-right { - align-items: center; - justify-content: flex-end; } - @media screen and (min-width: 769px), print { - .level-right { - display: flex; } } -.list { - background-color: white; - border-radius: 4px; - box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); } - -.list-item { - display: block; - padding: 0.5em 1em; } - .list-item:not(a) { - color: #222222; } - .list-item:first-child { - border-top-left-radius: 4px; - border-top-right-radius: 4px; } - .list-item:last-child { - border-bottom-left-radius: 4px; - border-bottom-right-radius: 4px; } - .list-item:not(:last-child) { - border-bottom: 1px solid #dbdbdb; } - .list-item.is-active { - background-color: #2e63b8; - color: #fff; } - -a.list-item { - background-color: whitesmoke; - cursor: pointer; } - -.media { - align-items: flex-start; - display: flex; - text-align: left; } - .media .content:not(:last-child) { - margin-bottom: 0.75rem; } - .media .media { - border-top: 1px solid rgba(219, 219, 219, 0.5); - display: flex; - padding-top: 0.75rem; } - .media .media .content:not(:last-child), - .media .media .control:not(:last-child) { - margin-bottom: 0.5rem; } - .media .media .media { - padding-top: 0.5rem; } - .media .media .media + .media { - margin-top: 0.5rem; } - .media + .media { - border-top: 1px solid rgba(219, 219, 219, 0.5); - margin-top: 1rem; - padding-top: 1rem; } - .media.is-large + .media { - margin-top: 1.5rem; - padding-top: 1.5rem; } - -.media-left, -.media-right { - flex-basis: auto; - flex-grow: 0; - flex-shrink: 0; } - -.media-left { - margin-right: 1rem; } - -.media-right { - margin-left: 1rem; } - -.media-content { - flex-basis: auto; - flex-grow: 1; - flex-shrink: 1; - text-align: left; } - -@media screen and (max-width: 768px) { - .media-content { - overflow-x: auto; } } - -.menu { - font-size: 1rem; } - .menu.is-small, #documenter .docs-sidebar form.docs-search > input.menu { - font-size: 0.75rem; } - .menu.is-medium { - font-size: 1.25rem; } - .menu.is-large { - font-size: 1.5rem; } - -.menu-list { - line-height: 1.25; } - .menu-list a { - border-radius: 2px; - color: #222222; - display: block; - padding: 0.5em 0.75em; } - .menu-list a:hover { - background-color: whitesmoke; - color: #222222; } - .menu-list a.is-active { - background-color: #2e63b8; - color: #fff; } - .menu-list li ul { - border-left: 1px solid #dbdbdb; - margin: 0.75em; - padding-left: 0.75em; } - -.menu-label { - color: #6b6b6b; - font-size: 0.75em; - letter-spacing: 0.1em; - text-transform: uppercase; } - .menu-label:not(:first-child) { - margin-top: 1em; } - .menu-label:not(:last-child) { - margin-bottom: 1em; } - -.message { - background-color: whitesmoke; - border-radius: 4px; - font-size: 1rem; } - .message strong { - color: currentColor; } - .message a:not(.button):not(.tag):not(.dropdown-item) { - color: currentColor; - text-decoration: underline; } - .message.is-small, #documenter .docs-sidebar form.docs-search > input.message { - font-size: 0.75rem; } - .message.is-medium { - font-size: 1.25rem; } - .message.is-large { - font-size: 1.5rem; } - .message.is-white { - background-color: white; } - .message.is-white .message-header { - background-color: white; - color: #0a0a0a; } - .message.is-white .message-body { - border-color: white; - color: #4d4d4d; } - .message.is-black { - background-color: #fafafa; } - .message.is-black .message-header { - background-color: #0a0a0a; - color: white; } - .message.is-black .message-body { - border-color: #0a0a0a; - color: #090909; } - .message.is-light { - background-color: #fafafa; } - .message.is-light .message-header { - background-color: whitesmoke; - color: #363636; } - .message.is-light .message-body { - border-color: whitesmoke; - color: #505050; } - .message.is-dark, .content kbd.message { - background-color: #fafafa; } - .message.is-dark .message-header, .content kbd.message .message-header { - background-color: #363636; - color: whitesmoke; } - .message.is-dark .message-body, .content kbd.message .message-body { - border-color: #363636; - color: #2a2a2a; } - .message.is-primary, .docstring > section > a.message.docs-sourcelink { - background-color: #f6fbfd; } - .message.is-primary .message-header, .docstring > section > a.message.docs-sourcelink .message-header { - background-color: #4eb5de; - color: #fff; } - .message.is-primary .message-body, .docstring > section > a.message.docs-sourcelink .message-body { - border-color: #4eb5de; - color: #1f556a; } - .message.is-link { - background-color: #f7f9fd; } - .message.is-link .message-header { - background-color: #2e63b8; - color: #fff; } - .message.is-link .message-body { - border-color: #2e63b8; - color: #264981; } - .message.is-info { - background-color: #f6fbfe; } - .message.is-info .message-header { - background-color: #209cee; - color: #fff; } - .message.is-info .message-body { - border-color: #209cee; - color: #12537d; } - .message.is-success { - background-color: #f6fdf9; } - .message.is-success .message-header { - background-color: #22c35b; - color: #fff; } - .message.is-success .message-body { - border-color: #22c35b; - color: #0f361d; } - .message.is-warning { - background-color: #fffdf5; } - .message.is-warning .message-header { - background-color: #ffdd57; - color: rgba(0, 0, 0, 0.7); } - .message.is-warning .message-body { - border-color: #ffdd57; - color: #3c3108; } - .message.is-danger { - background-color: #fff5f5; } - .message.is-danger .message-header { - background-color: #da0b00; - color: #fff; } - .message.is-danger .message-body { - border-color: #da0b00; - color: #9b0c04; } - -.message-header { - align-items: center; - background-color: #222222; - border-radius: 4px 4px 0 0; - color: #fff; - display: flex; - font-weight: 700; - justify-content: space-between; - line-height: 1.25; - padding: 0.75em 1em; - position: relative; } - .message-header .delete { - flex-grow: 0; - flex-shrink: 0; - margin-left: 0.75em; } - .message-header + .message-body { - border-width: 0; - border-top-left-radius: 0; - border-top-right-radius: 0; } - -.message-body { - border-color: #dbdbdb; - border-radius: 4px; - border-style: solid; - border-width: 0 0 0 4px; - color: #222222; - padding: 1.25em 1.5em; } - .message-body code, - .message-body pre { - background-color: white; } - .message-body pre code { - background-color: transparent; } - -.modal { - align-items: center; - display: none; - flex-direction: column; - justify-content: center; - overflow: hidden; - position: fixed; - z-index: 40; } - .modal.is-active { - display: flex; } - -.modal-background { - background-color: rgba(10, 10, 10, 0.86); } - -.modal-content, -.modal-card { - margin: 0 20px; - max-height: calc(100vh - 160px); - overflow: auto; - position: relative; - width: 100%; } - @media screen and (min-width: 769px), print { - .modal-content, - .modal-card { - margin: 0 auto; - max-height: calc(100vh - 40px); - width: 640px; } } -.modal-close { - background: none; - height: 40px; - position: fixed; - right: 20px; - top: 20px; - width: 40px; } - -.modal-card { - display: flex; - flex-direction: column; - max-height: calc(100vh - 40px); - overflow: hidden; - -ms-overflow-y: visible; } - -.modal-card-head, -.modal-card-foot { - align-items: center; - background-color: whitesmoke; - display: flex; - flex-shrink: 0; - justify-content: flex-start; - padding: 20px; - position: relative; } - -.modal-card-head { - border-bottom: 1px solid #dbdbdb; - border-top-left-radius: 6px; - border-top-right-radius: 6px; } - -.modal-card-title { - color: #222222; - flex-grow: 1; - flex-shrink: 0; - font-size: 1.5rem; - line-height: 1; } - -.modal-card-foot { - border-bottom-left-radius: 6px; - border-bottom-right-radius: 6px; - border-top: 1px solid #dbdbdb; } - .modal-card-foot .button:not(:last-child) { - margin-right: 0.5em; } - -.modal-card-body { - -webkit-overflow-scrolling: touch; - background-color: white; - flex-grow: 1; - flex-shrink: 1; - overflow: auto; - padding: 20px; } - -.navbar { - background-color: white; - min-height: 3.25rem; - position: relative; - z-index: 30; } - .navbar.is-white { - background-color: white; - color: #0a0a0a; } - .navbar.is-white .navbar-brand > .navbar-item, - .navbar.is-white .navbar-brand .navbar-link { - color: #0a0a0a; } - .navbar.is-white .navbar-brand > a.navbar-item:focus, .navbar.is-white .navbar-brand > a.navbar-item:hover, .navbar.is-white .navbar-brand > a.navbar-item.is-active, - .navbar.is-white .navbar-brand .navbar-link:focus, - .navbar.is-white .navbar-brand .navbar-link:hover, - .navbar.is-white .navbar-brand .navbar-link.is-active { - background-color: #f2f2f2; - color: #0a0a0a; } - .navbar.is-white .navbar-brand .navbar-link::after { - border-color: #0a0a0a; } - .navbar.is-white .navbar-burger { - color: #0a0a0a; } - @media screen and (min-width: 1056px) { - .navbar.is-white .navbar-start > .navbar-item, - .navbar.is-white .navbar-start .navbar-link, - .navbar.is-white .navbar-end > .navbar-item, - .navbar.is-white .navbar-end .navbar-link { - color: #0a0a0a; } - .navbar.is-white .navbar-start > a.navbar-item:focus, .navbar.is-white .navbar-start > a.navbar-item:hover, .navbar.is-white .navbar-start > a.navbar-item.is-active, - .navbar.is-white .navbar-start .navbar-link:focus, - .navbar.is-white .navbar-start .navbar-link:hover, - .navbar.is-white .navbar-start .navbar-link.is-active, - .navbar.is-white .navbar-end > a.navbar-item:focus, - .navbar.is-white .navbar-end > a.navbar-item:hover, - .navbar.is-white .navbar-end > a.navbar-item.is-active, - .navbar.is-white .navbar-end .navbar-link:focus, - .navbar.is-white .navbar-end .navbar-link:hover, - .navbar.is-white .navbar-end .navbar-link.is-active { - background-color: #f2f2f2; - color: #0a0a0a; } - .navbar.is-white .navbar-start .navbar-link::after, - .navbar.is-white .navbar-end .navbar-link::after { - border-color: #0a0a0a; } - .navbar.is-white .navbar-item.has-dropdown:focus .navbar-link, - .navbar.is-white .navbar-item.has-dropdown:hover .navbar-link, - .navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #f2f2f2; - color: #0a0a0a; } - .navbar.is-white .navbar-dropdown a.navbar-item.is-active { - background-color: white; - color: #0a0a0a; } } - .navbar.is-black { - background-color: #0a0a0a; - color: white; } - .navbar.is-black .navbar-brand > .navbar-item, - .navbar.is-black .navbar-brand .navbar-link { - color: white; } - .navbar.is-black .navbar-brand > a.navbar-item:focus, .navbar.is-black .navbar-brand > a.navbar-item:hover, .navbar.is-black .navbar-brand > a.navbar-item.is-active, - .navbar.is-black .navbar-brand .navbar-link:focus, - .navbar.is-black .navbar-brand .navbar-link:hover, - .navbar.is-black .navbar-brand .navbar-link.is-active { - background-color: black; - color: white; } - .navbar.is-black .navbar-brand .navbar-link::after { - border-color: white; } - .navbar.is-black .navbar-burger { - color: white; } - @media screen and (min-width: 1056px) { - .navbar.is-black .navbar-start > .navbar-item, - .navbar.is-black .navbar-start .navbar-link, - .navbar.is-black .navbar-end > .navbar-item, - .navbar.is-black .navbar-end .navbar-link { - color: white; } - .navbar.is-black .navbar-start > a.navbar-item:focus, .navbar.is-black .navbar-start > a.navbar-item:hover, .navbar.is-black .navbar-start > a.navbar-item.is-active, - .navbar.is-black .navbar-start .navbar-link:focus, - .navbar.is-black .navbar-start .navbar-link:hover, - .navbar.is-black .navbar-start .navbar-link.is-active, - .navbar.is-black .navbar-end > a.navbar-item:focus, - .navbar.is-black .navbar-end > a.navbar-item:hover, - .navbar.is-black .navbar-end > a.navbar-item.is-active, - .navbar.is-black .navbar-end .navbar-link:focus, - .navbar.is-black .navbar-end .navbar-link:hover, - .navbar.is-black .navbar-end .navbar-link.is-active { - background-color: black; - color: white; } - .navbar.is-black .navbar-start .navbar-link::after, - .navbar.is-black .navbar-end .navbar-link::after { - border-color: white; } - .navbar.is-black .navbar-item.has-dropdown:focus .navbar-link, - .navbar.is-black .navbar-item.has-dropdown:hover .navbar-link, - .navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link { - background-color: black; - color: white; } - .navbar.is-black .navbar-dropdown a.navbar-item.is-active { - background-color: #0a0a0a; - color: white; } } - .navbar.is-light { - background-color: whitesmoke; - color: #363636; } - .navbar.is-light .navbar-brand > .navbar-item, - .navbar.is-light .navbar-brand .navbar-link { - color: #363636; } - .navbar.is-light .navbar-brand > a.navbar-item:focus, .navbar.is-light .navbar-brand > a.navbar-item:hover, .navbar.is-light .navbar-brand > a.navbar-item.is-active, - .navbar.is-light .navbar-brand .navbar-link:focus, - .navbar.is-light .navbar-brand .navbar-link:hover, - .navbar.is-light .navbar-brand .navbar-link.is-active { - background-color: #e8e8e8; - color: #363636; } - .navbar.is-light .navbar-brand .navbar-link::after { - border-color: #363636; } - .navbar.is-light .navbar-burger { - color: #363636; } - @media screen and (min-width: 1056px) { - .navbar.is-light .navbar-start > .navbar-item, - .navbar.is-light .navbar-start .navbar-link, - .navbar.is-light .navbar-end > .navbar-item, - .navbar.is-light .navbar-end .navbar-link { - color: #363636; } - .navbar.is-light .navbar-start > a.navbar-item:focus, .navbar.is-light .navbar-start > a.navbar-item:hover, .navbar.is-light .navbar-start > a.navbar-item.is-active, - .navbar.is-light .navbar-start .navbar-link:focus, - .navbar.is-light .navbar-start .navbar-link:hover, - .navbar.is-light .navbar-start .navbar-link.is-active, - .navbar.is-light .navbar-end > a.navbar-item:focus, - .navbar.is-light .navbar-end > a.navbar-item:hover, - .navbar.is-light .navbar-end > a.navbar-item.is-active, - .navbar.is-light .navbar-end .navbar-link:focus, - .navbar.is-light .navbar-end .navbar-link:hover, - .navbar.is-light .navbar-end .navbar-link.is-active { - background-color: #e8e8e8; - color: #363636; } - .navbar.is-light .navbar-start .navbar-link::after, - .navbar.is-light .navbar-end .navbar-link::after { - border-color: #363636; } - .navbar.is-light .navbar-item.has-dropdown:focus .navbar-link, - .navbar.is-light .navbar-item.has-dropdown:hover .navbar-link, - .navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #e8e8e8; - color: #363636; } - .navbar.is-light .navbar-dropdown a.navbar-item.is-active { - background-color: whitesmoke; - color: #363636; } } - .navbar.is-dark, .content kbd.navbar { - background-color: #363636; - color: whitesmoke; } - .navbar.is-dark .navbar-brand > .navbar-item, .content kbd.navbar .navbar-brand > .navbar-item, - .navbar.is-dark .navbar-brand .navbar-link, - .content kbd.navbar .navbar-brand .navbar-link { - color: whitesmoke; } - .navbar.is-dark .navbar-brand > a.navbar-item:focus, .content kbd.navbar .navbar-brand > a.navbar-item:focus, .navbar.is-dark .navbar-brand > a.navbar-item:hover, .content kbd.navbar .navbar-brand > a.navbar-item:hover, .navbar.is-dark .navbar-brand > a.navbar-item.is-active, .content kbd.navbar .navbar-brand > a.navbar-item.is-active, - .navbar.is-dark .navbar-brand .navbar-link:focus, - .content kbd.navbar .navbar-brand .navbar-link:focus, - .navbar.is-dark .navbar-brand .navbar-link:hover, - .content kbd.navbar .navbar-brand .navbar-link:hover, - .navbar.is-dark .navbar-brand .navbar-link.is-active, - .content kbd.navbar .navbar-brand .navbar-link.is-active { - background-color: #292929; - color: whitesmoke; } - .navbar.is-dark .navbar-brand .navbar-link::after, .content kbd.navbar .navbar-brand .navbar-link::after { - border-color: whitesmoke; } - .navbar.is-dark .navbar-burger, .content kbd.navbar .navbar-burger { - color: whitesmoke; } - @media screen and (min-width: 1056px) { - .navbar.is-dark .navbar-start > .navbar-item, .content kbd.navbar .navbar-start > .navbar-item, - .navbar.is-dark .navbar-start .navbar-link, - .content kbd.navbar .navbar-start .navbar-link, - .navbar.is-dark .navbar-end > .navbar-item, - .content kbd.navbar .navbar-end > .navbar-item, - .navbar.is-dark .navbar-end .navbar-link, - .content kbd.navbar .navbar-end .navbar-link { - color: whitesmoke; } - .navbar.is-dark .navbar-start > a.navbar-item:focus, .content kbd.navbar .navbar-start > a.navbar-item:focus, .navbar.is-dark .navbar-start > a.navbar-item:hover, .content kbd.navbar .navbar-start > a.navbar-item:hover, .navbar.is-dark .navbar-start > a.navbar-item.is-active, .content kbd.navbar .navbar-start > a.navbar-item.is-active, - .navbar.is-dark .navbar-start .navbar-link:focus, - .content kbd.navbar .navbar-start .navbar-link:focus, - .navbar.is-dark .navbar-start .navbar-link:hover, - .content kbd.navbar .navbar-start .navbar-link:hover, - .navbar.is-dark .navbar-start .navbar-link.is-active, - .content kbd.navbar .navbar-start .navbar-link.is-active, - .navbar.is-dark .navbar-end > a.navbar-item:focus, - .content kbd.navbar .navbar-end > a.navbar-item:focus, - .navbar.is-dark .navbar-end > a.navbar-item:hover, - .content kbd.navbar .navbar-end > a.navbar-item:hover, - .navbar.is-dark .navbar-end > a.navbar-item.is-active, - .content kbd.navbar .navbar-end > a.navbar-item.is-active, - .navbar.is-dark .navbar-end .navbar-link:focus, - .content kbd.navbar .navbar-end .navbar-link:focus, - .navbar.is-dark .navbar-end .navbar-link:hover, - .content kbd.navbar .navbar-end .navbar-link:hover, - .navbar.is-dark .navbar-end .navbar-link.is-active, - .content kbd.navbar .navbar-end .navbar-link.is-active { - background-color: #292929; - color: whitesmoke; } - .navbar.is-dark .navbar-start .navbar-link::after, .content kbd.navbar .navbar-start .navbar-link::after, - .navbar.is-dark .navbar-end .navbar-link::after, - .content kbd.navbar .navbar-end .navbar-link::after { - border-color: whitesmoke; } - .navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link, .content kbd.navbar .navbar-item.has-dropdown:focus .navbar-link, - .navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link, - .content kbd.navbar .navbar-item.has-dropdown:hover .navbar-link, - .navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link, - .content kbd.navbar .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #292929; - color: whitesmoke; } - .navbar.is-dark .navbar-dropdown a.navbar-item.is-active, .content kbd.navbar .navbar-dropdown a.navbar-item.is-active { - background-color: #363636; - color: whitesmoke; } } - .navbar.is-primary, .docstring > section > a.navbar.docs-sourcelink { - background-color: #4eb5de; - color: #fff; } - .navbar.is-primary .navbar-brand > .navbar-item, .docstring > section > a.navbar.docs-sourcelink .navbar-brand > .navbar-item, - .navbar.is-primary .navbar-brand .navbar-link, - .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link { - color: #fff; } - .navbar.is-primary .navbar-brand > a.navbar-item:focus, .docstring > section > a.navbar.docs-sourcelink .navbar-brand > a.navbar-item:focus, .navbar.is-primary .navbar-brand > a.navbar-item:hover, .docstring > section > a.navbar.docs-sourcelink .navbar-brand > a.navbar-item:hover, .navbar.is-primary .navbar-brand > a.navbar-item.is-active, .docstring > section > a.navbar.docs-sourcelink .navbar-brand > a.navbar-item.is-active, - .navbar.is-primary .navbar-brand .navbar-link:focus, - .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link:focus, - .navbar.is-primary .navbar-brand .navbar-link:hover, - .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link:hover, - .navbar.is-primary .navbar-brand .navbar-link.is-active, - .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link.is-active { - background-color: #39acda; - color: #fff; } - .navbar.is-primary .navbar-brand .navbar-link::after, .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link::after { - border-color: #fff; } - .navbar.is-primary .navbar-burger, .docstring > section > a.navbar.docs-sourcelink .navbar-burger { - color: #fff; } - @media screen and (min-width: 1056px) { - .navbar.is-primary .navbar-start > .navbar-item, .docstring > section > a.navbar.docs-sourcelink .navbar-start > .navbar-item, - .navbar.is-primary .navbar-start .navbar-link, - .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link, - .navbar.is-primary .navbar-end > .navbar-item, - .docstring > section > a.navbar.docs-sourcelink .navbar-end > .navbar-item, - .navbar.is-primary .navbar-end .navbar-link, - .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link { - color: #fff; } - .navbar.is-primary .navbar-start > a.navbar-item:focus, .docstring > section > a.navbar.docs-sourcelink .navbar-start > a.navbar-item:focus, .navbar.is-primary .navbar-start > a.navbar-item:hover, .docstring > section > a.navbar.docs-sourcelink .navbar-start > a.navbar-item:hover, .navbar.is-primary .navbar-start > a.navbar-item.is-active, .docstring > section > a.navbar.docs-sourcelink .navbar-start > a.navbar-item.is-active, - .navbar.is-primary .navbar-start .navbar-link:focus, - .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link:focus, - .navbar.is-primary .navbar-start .navbar-link:hover, - .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link:hover, - .navbar.is-primary .navbar-start .navbar-link.is-active, - .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link.is-active, - .navbar.is-primary .navbar-end > a.navbar-item:focus, - .docstring > section > a.navbar.docs-sourcelink .navbar-end > a.navbar-item:focus, - .navbar.is-primary .navbar-end > a.navbar-item:hover, - .docstring > section > a.navbar.docs-sourcelink .navbar-end > a.navbar-item:hover, - .navbar.is-primary .navbar-end > a.navbar-item.is-active, - .docstring > section > a.navbar.docs-sourcelink .navbar-end > a.navbar-item.is-active, - .navbar.is-primary .navbar-end .navbar-link:focus, - .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link:focus, - .navbar.is-primary .navbar-end .navbar-link:hover, - .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link:hover, - .navbar.is-primary .navbar-end .navbar-link.is-active, - .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link.is-active { - background-color: #39acda; - color: #fff; } - .navbar.is-primary .navbar-start .navbar-link::after, .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link::after, - .navbar.is-primary .navbar-end .navbar-link::after, - .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link::after { - border-color: #fff; } - .navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link, .docstring > section > a.navbar.docs-sourcelink .navbar-item.has-dropdown:focus .navbar-link, - .navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link, - .docstring > section > a.navbar.docs-sourcelink .navbar-item.has-dropdown:hover .navbar-link, - .navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link, - .docstring > section > a.navbar.docs-sourcelink .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #39acda; - color: #fff; } - .navbar.is-primary .navbar-dropdown a.navbar-item.is-active, .docstring > section > a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active { - background-color: #4eb5de; - color: #fff; } } - .navbar.is-link { - background-color: #2e63b8; - color: #fff; } - .navbar.is-link .navbar-brand > .navbar-item, - .navbar.is-link .navbar-brand .navbar-link { - color: #fff; } - .navbar.is-link .navbar-brand > a.navbar-item:focus, .navbar.is-link .navbar-brand > a.navbar-item:hover, .navbar.is-link .navbar-brand > a.navbar-item.is-active, - .navbar.is-link .navbar-brand .navbar-link:focus, - .navbar.is-link .navbar-brand .navbar-link:hover, - .navbar.is-link .navbar-brand .navbar-link.is-active { - background-color: #2958a4; - color: #fff; } - .navbar.is-link .navbar-brand .navbar-link::after { - border-color: #fff; } - .navbar.is-link .navbar-burger { - color: #fff; } - @media screen and (min-width: 1056px) { - .navbar.is-link .navbar-start > .navbar-item, - .navbar.is-link .navbar-start .navbar-link, - .navbar.is-link .navbar-end > .navbar-item, - .navbar.is-link .navbar-end .navbar-link { - color: #fff; } - .navbar.is-link .navbar-start > a.navbar-item:focus, .navbar.is-link .navbar-start > a.navbar-item:hover, .navbar.is-link .navbar-start > a.navbar-item.is-active, - .navbar.is-link .navbar-start .navbar-link:focus, - .navbar.is-link .navbar-start .navbar-link:hover, - .navbar.is-link .navbar-start .navbar-link.is-active, - .navbar.is-link .navbar-end > a.navbar-item:focus, - .navbar.is-link .navbar-end > a.navbar-item:hover, - .navbar.is-link .navbar-end > a.navbar-item.is-active, - .navbar.is-link .navbar-end .navbar-link:focus, - .navbar.is-link .navbar-end .navbar-link:hover, - .navbar.is-link .navbar-end .navbar-link.is-active { - background-color: #2958a4; - color: #fff; } - .navbar.is-link .navbar-start .navbar-link::after, - .navbar.is-link .navbar-end .navbar-link::after { - border-color: #fff; } - .navbar.is-link .navbar-item.has-dropdown:focus .navbar-link, - .navbar.is-link .navbar-item.has-dropdown:hover .navbar-link, - .navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #2958a4; - color: #fff; } - .navbar.is-link .navbar-dropdown a.navbar-item.is-active { - background-color: #2e63b8; - color: #fff; } } - .navbar.is-info { - background-color: #209cee; - color: #fff; } - .navbar.is-info .navbar-brand > .navbar-item, - .navbar.is-info .navbar-brand .navbar-link { - color: #fff; } - .navbar.is-info .navbar-brand > a.navbar-item:focus, .navbar.is-info .navbar-brand > a.navbar-item:hover, .navbar.is-info .navbar-brand > a.navbar-item.is-active, - .navbar.is-info .navbar-brand .navbar-link:focus, - .navbar.is-info .navbar-brand .navbar-link:hover, - .navbar.is-info .navbar-brand .navbar-link.is-active { - background-color: #1190e3; - color: #fff; } - .navbar.is-info .navbar-brand .navbar-link::after { - border-color: #fff; } - .navbar.is-info .navbar-burger { - color: #fff; } - @media screen and (min-width: 1056px) { - .navbar.is-info .navbar-start > .navbar-item, - .navbar.is-info .navbar-start .navbar-link, - .navbar.is-info .navbar-end > .navbar-item, - .navbar.is-info .navbar-end .navbar-link { - color: #fff; } - .navbar.is-info .navbar-start > a.navbar-item:focus, .navbar.is-info .navbar-start > a.navbar-item:hover, .navbar.is-info .navbar-start > a.navbar-item.is-active, - .navbar.is-info .navbar-start .navbar-link:focus, - .navbar.is-info .navbar-start .navbar-link:hover, - .navbar.is-info .navbar-start .navbar-link.is-active, - .navbar.is-info .navbar-end > a.navbar-item:focus, - .navbar.is-info .navbar-end > a.navbar-item:hover, - .navbar.is-info .navbar-end > a.navbar-item.is-active, - .navbar.is-info .navbar-end .navbar-link:focus, - .navbar.is-info .navbar-end .navbar-link:hover, - .navbar.is-info .navbar-end .navbar-link.is-active { - background-color: #1190e3; - color: #fff; } - .navbar.is-info .navbar-start .navbar-link::after, - .navbar.is-info .navbar-end .navbar-link::after { - border-color: #fff; } - .navbar.is-info .navbar-item.has-dropdown:focus .navbar-link, - .navbar.is-info .navbar-item.has-dropdown:hover .navbar-link, - .navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #1190e3; - color: #fff; } - .navbar.is-info .navbar-dropdown a.navbar-item.is-active { - background-color: #209cee; - color: #fff; } } - .navbar.is-success { - background-color: #22c35b; - color: #fff; } - .navbar.is-success .navbar-brand > .navbar-item, - .navbar.is-success .navbar-brand .navbar-link { - color: #fff; } - .navbar.is-success .navbar-brand > a.navbar-item:focus, .navbar.is-success .navbar-brand > a.navbar-item:hover, .navbar.is-success .navbar-brand > a.navbar-item.is-active, - .navbar.is-success .navbar-brand .navbar-link:focus, - .navbar.is-success .navbar-brand .navbar-link:hover, - .navbar.is-success .navbar-brand .navbar-link.is-active { - background-color: #1ead51; - color: #fff; } - .navbar.is-success .navbar-brand .navbar-link::after { - border-color: #fff; } - .navbar.is-success .navbar-burger { - color: #fff; } - @media screen and (min-width: 1056px) { - .navbar.is-success .navbar-start > .navbar-item, - .navbar.is-success .navbar-start .navbar-link, - .navbar.is-success .navbar-end > .navbar-item, - .navbar.is-success .navbar-end .navbar-link { - color: #fff; } - .navbar.is-success .navbar-start > a.navbar-item:focus, .navbar.is-success .navbar-start > a.navbar-item:hover, .navbar.is-success .navbar-start > a.navbar-item.is-active, - .navbar.is-success .navbar-start .navbar-link:focus, - .navbar.is-success .navbar-start .navbar-link:hover, - .navbar.is-success .navbar-start .navbar-link.is-active, - .navbar.is-success .navbar-end > a.navbar-item:focus, - .navbar.is-success .navbar-end > a.navbar-item:hover, - .navbar.is-success .navbar-end > a.navbar-item.is-active, - .navbar.is-success .navbar-end .navbar-link:focus, - .navbar.is-success .navbar-end .navbar-link:hover, - .navbar.is-success .navbar-end .navbar-link.is-active { - background-color: #1ead51; - color: #fff; } - .navbar.is-success .navbar-start .navbar-link::after, - .navbar.is-success .navbar-end .navbar-link::after { - border-color: #fff; } - .navbar.is-success .navbar-item.has-dropdown:focus .navbar-link, - .navbar.is-success .navbar-item.has-dropdown:hover .navbar-link, - .navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #1ead51; - color: #fff; } - .navbar.is-success .navbar-dropdown a.navbar-item.is-active { - background-color: #22c35b; - color: #fff; } } - .navbar.is-warning { - background-color: #ffdd57; - color: rgba(0, 0, 0, 0.7); } - .navbar.is-warning .navbar-brand > .navbar-item, - .navbar.is-warning .navbar-brand .navbar-link { - color: rgba(0, 0, 0, 0.7); } - .navbar.is-warning .navbar-brand > a.navbar-item:focus, .navbar.is-warning .navbar-brand > a.navbar-item:hover, .navbar.is-warning .navbar-brand > a.navbar-item.is-active, - .navbar.is-warning .navbar-brand .navbar-link:focus, - .navbar.is-warning .navbar-brand .navbar-link:hover, - .navbar.is-warning .navbar-brand .navbar-link.is-active { - background-color: #ffd83e; - color: rgba(0, 0, 0, 0.7); } - .navbar.is-warning .navbar-brand .navbar-link::after { - border-color: rgba(0, 0, 0, 0.7); } - .navbar.is-warning .navbar-burger { - color: rgba(0, 0, 0, 0.7); } - @media screen and (min-width: 1056px) { - .navbar.is-warning .navbar-start > .navbar-item, - .navbar.is-warning .navbar-start .navbar-link, - .navbar.is-warning .navbar-end > .navbar-item, - .navbar.is-warning .navbar-end .navbar-link { - color: rgba(0, 0, 0, 0.7); } - .navbar.is-warning .navbar-start > a.navbar-item:focus, .navbar.is-warning .navbar-start > a.navbar-item:hover, .navbar.is-warning .navbar-start > a.navbar-item.is-active, - .navbar.is-warning .navbar-start .navbar-link:focus, - .navbar.is-warning .navbar-start .navbar-link:hover, - .navbar.is-warning .navbar-start .navbar-link.is-active, - .navbar.is-warning .navbar-end > a.navbar-item:focus, - .navbar.is-warning .navbar-end > a.navbar-item:hover, - .navbar.is-warning .navbar-end > a.navbar-item.is-active, - .navbar.is-warning .navbar-end .navbar-link:focus, - .navbar.is-warning .navbar-end .navbar-link:hover, - .navbar.is-warning .navbar-end .navbar-link.is-active { - background-color: #ffd83e; - color: rgba(0, 0, 0, 0.7); } - .navbar.is-warning .navbar-start .navbar-link::after, - .navbar.is-warning .navbar-end .navbar-link::after { - border-color: rgba(0, 0, 0, 0.7); } - .navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link, - .navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link, - .navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #ffd83e; - color: rgba(0, 0, 0, 0.7); } - .navbar.is-warning .navbar-dropdown a.navbar-item.is-active { - background-color: #ffdd57; - color: rgba(0, 0, 0, 0.7); } } - .navbar.is-danger { - background-color: #da0b00; - color: #fff; } - .navbar.is-danger .navbar-brand > .navbar-item, - .navbar.is-danger .navbar-brand .navbar-link { - color: #fff; } - .navbar.is-danger .navbar-brand > a.navbar-item:focus, .navbar.is-danger .navbar-brand > a.navbar-item:hover, .navbar.is-danger .navbar-brand > a.navbar-item.is-active, - .navbar.is-danger .navbar-brand .navbar-link:focus, - .navbar.is-danger .navbar-brand .navbar-link:hover, - .navbar.is-danger .navbar-brand .navbar-link.is-active { - background-color: #c10a00; - color: #fff; } - .navbar.is-danger .navbar-brand .navbar-link::after { - border-color: #fff; } - .navbar.is-danger .navbar-burger { - color: #fff; } - @media screen and (min-width: 1056px) { - .navbar.is-danger .navbar-start > .navbar-item, - .navbar.is-danger .navbar-start .navbar-link, - .navbar.is-danger .navbar-end > .navbar-item, - .navbar.is-danger .navbar-end .navbar-link { - color: #fff; } - .navbar.is-danger .navbar-start > a.navbar-item:focus, .navbar.is-danger .navbar-start > a.navbar-item:hover, .navbar.is-danger .navbar-start > a.navbar-item.is-active, - .navbar.is-danger .navbar-start .navbar-link:focus, - .navbar.is-danger .navbar-start .navbar-link:hover, - .navbar.is-danger .navbar-start .navbar-link.is-active, - .navbar.is-danger .navbar-end > a.navbar-item:focus, - .navbar.is-danger .navbar-end > a.navbar-item:hover, - .navbar.is-danger .navbar-end > a.navbar-item.is-active, - .navbar.is-danger .navbar-end .navbar-link:focus, - .navbar.is-danger .navbar-end .navbar-link:hover, - .navbar.is-danger .navbar-end .navbar-link.is-active { - background-color: #c10a00; - color: #fff; } - .navbar.is-danger .navbar-start .navbar-link::after, - .navbar.is-danger .navbar-end .navbar-link::after { - border-color: #fff; } - .navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link, - .navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link, - .navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #c10a00; - color: #fff; } - .navbar.is-danger .navbar-dropdown a.navbar-item.is-active { - background-color: #da0b00; - color: #fff; } } - .navbar > .container { - align-items: stretch; - display: flex; - min-height: 3.25rem; - width: 100%; } - .navbar.has-shadow { - box-shadow: 0 2px 0 0 whitesmoke; } - .navbar.is-fixed-bottom, .navbar.is-fixed-top { - left: 0; - position: fixed; - right: 0; - z-index: 30; } - .navbar.is-fixed-bottom { - bottom: 0; } - .navbar.is-fixed-bottom.has-shadow { - box-shadow: 0 -2px 0 0 whitesmoke; } - .navbar.is-fixed-top { - top: 0; } - -html.has-navbar-fixed-top, -body.has-navbar-fixed-top { - padding-top: 3.25rem; } - -html.has-navbar-fixed-bottom, -body.has-navbar-fixed-bottom { - padding-bottom: 3.25rem; } - -.navbar-brand, -.navbar-tabs { - align-items: stretch; - display: flex; - flex-shrink: 0; - min-height: 3.25rem; } - -.navbar-brand a.navbar-item:focus, .navbar-brand a.navbar-item:hover { - background-color: transparent; } - -.navbar-tabs { - -webkit-overflow-scrolling: touch; - max-width: 100vw; - overflow-x: auto; - overflow-y: hidden; } - -.navbar-burger { - color: #4a4a4a; - cursor: pointer; - display: block; - height: 3.25rem; - position: relative; - width: 3.25rem; - margin-left: auto; } - .navbar-burger span { - background-color: currentColor; - display: block; - height: 1px; - left: calc(50% - 8px); - position: absolute; - transform-origin: center; - transition-duration: 86ms; - transition-property: background-color, opacity, transform; - transition-timing-function: ease-out; - width: 16px; } - .navbar-burger span:nth-child(1) { - top: calc(50% - 6px); } - .navbar-burger span:nth-child(2) { - top: calc(50% - 1px); } - .navbar-burger span:nth-child(3) { - top: calc(50% + 4px); } - .navbar-burger:hover { - background-color: rgba(0, 0, 0, 0.05); } - .navbar-burger.is-active span:nth-child(1) { - transform: translateY(5px) rotate(45deg); } - .navbar-burger.is-active span:nth-child(2) { - opacity: 0; } - .navbar-burger.is-active span:nth-child(3) { - transform: translateY(-5px) rotate(-45deg); } - -.navbar-menu { - display: none; } - -.navbar-item, -.navbar-link { - color: #4a4a4a; - display: block; - line-height: 1.5; - padding: 0.5rem 0.75rem; - position: relative; } - .navbar-item .icon:only-child, - .navbar-link .icon:only-child { - margin-left: -0.25rem; - margin-right: -0.25rem; } - -a.navbar-item, -.navbar-link { - cursor: pointer; } - a.navbar-item:focus, a.navbar-item:focus-within, a.navbar-item:hover, a.navbar-item.is-active, - .navbar-link:focus, - .navbar-link:focus-within, - .navbar-link:hover, - .navbar-link.is-active { - background-color: #fafafa; - color: #2e63b8; } - -.navbar-item { - display: block; - flex-grow: 0; - flex-shrink: 0; } - .navbar-item img { - max-height: 1.75rem; } - .navbar-item.has-dropdown { - padding: 0; } - .navbar-item.is-expanded { - flex-grow: 1; - flex-shrink: 1; } - .navbar-item.is-tab { - border-bottom: 1px solid transparent; - min-height: 3.25rem; - padding-bottom: calc(0.5rem - 1px); } - .navbar-item.is-tab:focus, .navbar-item.is-tab:hover { - background-color: transparent; - border-bottom-color: #2e63b8; } - .navbar-item.is-tab.is-active { - background-color: transparent; - border-bottom-color: #2e63b8; - border-bottom-style: solid; - border-bottom-width: 3px; - color: #2e63b8; - padding-bottom: calc(0.5rem - 3px); } - -.navbar-content { - flex-grow: 1; - flex-shrink: 1; } - -.navbar-link:not(.is-arrowless) { - padding-right: 2.5em; } - .navbar-link:not(.is-arrowless)::after { - border-color: #2e63b8; - margin-top: -0.375em; - right: 1.125em; } - -.navbar-dropdown { - font-size: 0.875rem; - padding-bottom: 0.5rem; - padding-top: 0.5rem; } - .navbar-dropdown .navbar-item { - padding-left: 1.5rem; - padding-right: 1.5rem; } - -.navbar-divider { - background-color: whitesmoke; - border: none; - display: none; - height: 2px; - margin: 0.5rem 0; } - -@media screen and (max-width: 1055px) { - .navbar > .container { - display: block; } - .navbar-brand .navbar-item, - .navbar-tabs .navbar-item { - align-items: center; - display: flex; } - .navbar-link::after { - display: none; } - .navbar-menu { - background-color: white; - box-shadow: 0 8px 16px rgba(10, 10, 10, 0.1); - padding: 0.5rem 0; } - .navbar-menu.is-active { - display: block; } - .navbar.is-fixed-bottom-touch, .navbar.is-fixed-top-touch { - left: 0; - position: fixed; - right: 0; - z-index: 30; } - .navbar.is-fixed-bottom-touch { - bottom: 0; } - .navbar.is-fixed-bottom-touch.has-shadow { - box-shadow: 0 -2px 3px rgba(10, 10, 10, 0.1); } - .navbar.is-fixed-top-touch { - top: 0; } - .navbar.is-fixed-top .navbar-menu, .navbar.is-fixed-top-touch .navbar-menu { - -webkit-overflow-scrolling: touch; - max-height: calc(100vh - 3.25rem); - overflow: auto; } - html.has-navbar-fixed-top-touch, - body.has-navbar-fixed-top-touch { - padding-top: 3.25rem; } - html.has-navbar-fixed-bottom-touch, - body.has-navbar-fixed-bottom-touch { - padding-bottom: 3.25rem; } } - -@media screen and (min-width: 1056px) { - .navbar, - .navbar-menu, - .navbar-start, - .navbar-end { - align-items: stretch; - display: flex; } - .navbar { - min-height: 3.25rem; } - .navbar.is-spaced { - padding: 1rem 2rem; } - .navbar.is-spaced .navbar-start, - .navbar.is-spaced .navbar-end { - align-items: center; } - .navbar.is-spaced a.navbar-item, - .navbar.is-spaced .navbar-link { - border-radius: 4px; } - .navbar.is-transparent a.navbar-item:focus, .navbar.is-transparent a.navbar-item:hover, .navbar.is-transparent a.navbar-item.is-active, - .navbar.is-transparent .navbar-link:focus, - .navbar.is-transparent .navbar-link:hover, - .navbar.is-transparent .navbar-link.is-active { - background-color: transparent !important; } - .navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link, .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link, .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link, .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link { - background-color: transparent !important; } - .navbar.is-transparent .navbar-dropdown a.navbar-item:focus, .navbar.is-transparent .navbar-dropdown a.navbar-item:hover { - background-color: whitesmoke; - color: #0a0a0a; } - .navbar.is-transparent .navbar-dropdown a.navbar-item.is-active { - background-color: whitesmoke; - color: #2e63b8; } - .navbar-burger { - display: none; } - .navbar-item, - .navbar-link { - align-items: center; - display: flex; } - .navbar-item { - display: flex; } - .navbar-item.has-dropdown { - align-items: stretch; } - .navbar-item.has-dropdown-up .navbar-link::after { - transform: rotate(135deg) translate(0.25em, -0.25em); } - .navbar-item.has-dropdown-up .navbar-dropdown { - border-bottom: 2px solid #dbdbdb; - border-radius: 6px 6px 0 0; - border-top: none; - bottom: 100%; - box-shadow: 0 -8px 8px rgba(10, 10, 10, 0.1); - top: auto; } - .navbar-item.is-active .navbar-dropdown, .navbar-item.is-hoverable:focus .navbar-dropdown, .navbar-item.is-hoverable:focus-within .navbar-dropdown, .navbar-item.is-hoverable:hover .navbar-dropdown { - display: block; } - .navbar.is-spaced .navbar-item.is-active .navbar-dropdown, .navbar-item.is-active .navbar-dropdown.is-boxed, .navbar.is-spaced .navbar-item.is-hoverable:focus .navbar-dropdown, .navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed, .navbar.is-spaced .navbar-item.is-hoverable:focus-within .navbar-dropdown, .navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed, .navbar.is-spaced .navbar-item.is-hoverable:hover .navbar-dropdown, .navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed { - opacity: 1; - pointer-events: auto; - transform: translateY(0); } - .navbar-menu { - flex-grow: 1; - flex-shrink: 0; } - .navbar-start { - justify-content: flex-start; - margin-right: auto; } - .navbar-end { - justify-content: flex-end; - margin-left: auto; } - .navbar-dropdown { - background-color: white; - border-bottom-left-radius: 6px; - border-bottom-right-radius: 6px; - border-top: 2px solid #dbdbdb; - box-shadow: 0 8px 8px rgba(10, 10, 10, 0.1); - display: none; - font-size: 0.875rem; - left: 0; - min-width: 100%; - position: absolute; - top: 100%; - z-index: 20; } - .navbar-dropdown .navbar-item { - padding: 0.375rem 1rem; - white-space: nowrap; } - .navbar-dropdown a.navbar-item { - padding-right: 3rem; } - .navbar-dropdown a.navbar-item:focus, .navbar-dropdown a.navbar-item:hover { - background-color: whitesmoke; - color: #0a0a0a; } - .navbar-dropdown a.navbar-item.is-active { - background-color: whitesmoke; - color: #2e63b8; } - .navbar.is-spaced .navbar-dropdown, .navbar-dropdown.is-boxed { - border-radius: 6px; - border-top: none; - box-shadow: 0 8px 8px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); - display: block; - opacity: 0; - pointer-events: none; - top: calc(100% + (-4px)); - transform: translateY(-5px); - transition-duration: 86ms; - transition-property: opacity, transform; } - .navbar-dropdown.is-right { - left: auto; - right: 0; } - .navbar-divider { - display: block; } - .navbar > .container .navbar-brand, - .container > .navbar .navbar-brand { - margin-left: -.75rem; } - .navbar > .container .navbar-menu, - .container > .navbar .navbar-menu { - margin-right: -.75rem; } - .navbar.is-fixed-bottom-desktop, .navbar.is-fixed-top-desktop { - left: 0; - position: fixed; - right: 0; - z-index: 30; } - .navbar.is-fixed-bottom-desktop { - bottom: 0; } - .navbar.is-fixed-bottom-desktop.has-shadow { - box-shadow: 0 -2px 3px rgba(10, 10, 10, 0.1); } - .navbar.is-fixed-top-desktop { - top: 0; } - html.has-navbar-fixed-top-desktop, - body.has-navbar-fixed-top-desktop { - padding-top: 3.25rem; } - html.has-navbar-fixed-bottom-desktop, - body.has-navbar-fixed-bottom-desktop { - padding-bottom: 3.25rem; } - html.has-spaced-navbar-fixed-top, - body.has-spaced-navbar-fixed-top { - padding-top: 5.25rem; } - html.has-spaced-navbar-fixed-bottom, - body.has-spaced-navbar-fixed-bottom { - padding-bottom: 5.25rem; } - a.navbar-item.is-active, - .navbar-link.is-active { - color: #0a0a0a; } - a.navbar-item.is-active:not(:focus):not(:hover), - .navbar-link.is-active:not(:focus):not(:hover) { - background-color: transparent; } - .navbar-item.has-dropdown:focus .navbar-link, .navbar-item.has-dropdown:hover .navbar-link, .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #fafafa; } } - -.hero.is-fullheight-with-navbar { - min-height: calc(100vh - 3.25rem); } - -.pagination { - font-size: 1rem; - margin: -0.25rem; } - .pagination.is-small, #documenter .docs-sidebar form.docs-search > input.pagination { - font-size: 0.75rem; } - .pagination.is-medium { - font-size: 1.25rem; } - .pagination.is-large { - font-size: 1.5rem; } - .pagination.is-rounded .pagination-previous, #documenter .docs-sidebar form.docs-search > input.pagination .pagination-previous, - .pagination.is-rounded .pagination-next, - #documenter .docs-sidebar form.docs-search > input.pagination .pagination-next { - padding-left: 1em; - padding-right: 1em; - border-radius: 290486px; } - .pagination.is-rounded .pagination-link, #documenter .docs-sidebar form.docs-search > input.pagination .pagination-link { - border-radius: 290486px; } - -.pagination, -.pagination-list { - align-items: center; - display: flex; - justify-content: center; - text-align: center; } - -.pagination-previous, -.pagination-next, -.pagination-link, -.pagination-ellipsis { - font-size: 1em; - justify-content: center; - margin: 0.25rem; - padding-left: 0.5em; - padding-right: 0.5em; - text-align: center; } - -.pagination-previous, -.pagination-next, -.pagination-link { - border-color: #dbdbdb; - color: #363636; - min-width: 2.25em; } - .pagination-previous:hover, - .pagination-next:hover, - .pagination-link:hover { - border-color: #b5b5b5; - color: #363636; } - .pagination-previous:focus, - .pagination-next:focus, - .pagination-link:focus { - border-color: #3c5dcd; } - .pagination-previous:active, - .pagination-next:active, - .pagination-link:active { - box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2); } - .pagination-previous[disabled], - .pagination-next[disabled], - .pagination-link[disabled] { - background-color: #dbdbdb; - border-color: #dbdbdb; - box-shadow: none; - color: #6b6b6b; - opacity: 0.5; } - -.pagination-previous, -.pagination-next { - padding-left: 0.75em; - padding-right: 0.75em; - white-space: nowrap; } - -.pagination-link.is-current { - background-color: #2e63b8; - border-color: #2e63b8; - color: #fff; } - -.pagination-ellipsis { - color: #b5b5b5; - pointer-events: none; } - -.pagination-list { - flex-wrap: wrap; } - -@media screen and (max-width: 768px) { - .pagination { - flex-wrap: wrap; } - .pagination-previous, - .pagination-next { - flex-grow: 1; - flex-shrink: 1; } - .pagination-list li { - flex-grow: 1; - flex-shrink: 1; } } - -@media screen and (min-width: 769px), print { - .pagination-list { - flex-grow: 1; - flex-shrink: 1; - justify-content: flex-start; - order: 1; } - .pagination-previous { - order: 2; } - .pagination-next { - order: 3; } - .pagination { - justify-content: space-between; } - .pagination.is-centered .pagination-previous { - order: 1; } - .pagination.is-centered .pagination-list { - justify-content: center; - order: 2; } - .pagination.is-centered .pagination-next { - order: 3; } - .pagination.is-right .pagination-previous { - order: 1; } - .pagination.is-right .pagination-next { - order: 2; } - .pagination.is-right .pagination-list { - justify-content: flex-end; - order: 3; } } - -.panel { - font-size: 1rem; } - .panel:not(:last-child) { - margin-bottom: 1.5rem; } - -.panel-heading, -.panel-tabs, -.panel-block { - border-bottom: 1px solid #dbdbdb; - border-left: 1px solid #dbdbdb; - border-right: 1px solid #dbdbdb; } - .panel-heading:first-child, - .panel-tabs:first-child, - .panel-block:first-child { - border-top: 1px solid #dbdbdb; } - -.panel-heading { - background-color: whitesmoke; - border-radius: 4px 4px 0 0; - color: #222222; - font-size: 1.25em; - font-weight: 300; - line-height: 1.25; - padding: 0.5em 0.75em; } - -.panel-tabs { - align-items: flex-end; - display: flex; - font-size: 0.875em; - justify-content: center; } - .panel-tabs a { - border-bottom: 1px solid #dbdbdb; - margin-bottom: -1px; - padding: 0.5em; } - .panel-tabs a.is-active { - border-bottom-color: #4a4a4a; - color: #363636; } - -.panel-list a { - color: #222222; } - .panel-list a:hover { - color: #2e63b8; } - -.panel-block { - align-items: center; - color: #222222; - display: flex; - justify-content: flex-start; - padding: 0.5em 0.75em; } - .panel-block input[type="checkbox"] { - margin-right: 0.75em; } - .panel-block > .control { - flex-grow: 1; - flex-shrink: 1; - width: 100%; } - .panel-block.is-wrapped { - flex-wrap: wrap; } - .panel-block.is-active { - border-left-color: #2e63b8; - color: #363636; } - .panel-block.is-active .panel-icon { - color: #2e63b8; } - -a.panel-block, -label.panel-block { - cursor: pointer; } - a.panel-block:hover, - label.panel-block:hover { - background-color: whitesmoke; } - -.panel-icon { - display: inline-block; - font-size: 14px; - height: 1em; - line-height: 1em; - text-align: center; - vertical-align: top; - width: 1em; - color: #6b6b6b; - margin-right: 0.75em; } - .panel-icon .fa { - font-size: inherit; - line-height: inherit; } - -.tabs { - -webkit-overflow-scrolling: touch; - align-items: stretch; - display: flex; - font-size: 1rem; - justify-content: space-between; - overflow: hidden; - overflow-x: auto; - white-space: nowrap; } - .tabs a { - align-items: center; - border-bottom-color: #dbdbdb; - border-bottom-style: solid; - border-bottom-width: 1px; - color: #222222; - display: flex; - justify-content: center; - margin-bottom: -1px; - padding: 0.5em 1em; - vertical-align: top; } - .tabs a:hover { - border-bottom-color: #222222; - color: #222222; } - .tabs li { - display: block; } - .tabs li.is-active a { - border-bottom-color: #2e63b8; - color: #2e63b8; } - .tabs ul { - align-items: center; - border-bottom-color: #dbdbdb; - border-bottom-style: solid; - border-bottom-width: 1px; - display: flex; - flex-grow: 1; - flex-shrink: 0; - justify-content: flex-start; } - .tabs ul.is-left { - padding-right: 0.75em; } - .tabs ul.is-center { - flex: none; - justify-content: center; - padding-left: 0.75em; - padding-right: 0.75em; } - .tabs ul.is-right { - justify-content: flex-end; - padding-left: 0.75em; } - .tabs .icon:first-child { - margin-right: 0.5em; } - .tabs .icon:last-child { - margin-left: 0.5em; } - .tabs.is-centered ul { - justify-content: center; } - .tabs.is-right ul { - justify-content: flex-end; } - .tabs.is-boxed a { - border: 1px solid transparent; - border-radius: 4px 4px 0 0; } - .tabs.is-boxed a:hover { - background-color: whitesmoke; - border-bottom-color: #dbdbdb; } - .tabs.is-boxed li.is-active a { - background-color: white; - border-color: #dbdbdb; - border-bottom-color: transparent !important; } - .tabs.is-fullwidth li { - flex-grow: 1; - flex-shrink: 0; } - .tabs.is-toggle a { - border-color: #dbdbdb; - border-style: solid; - border-width: 1px; - margin-bottom: 0; - position: relative; } - .tabs.is-toggle a:hover { - background-color: whitesmoke; - border-color: #b5b5b5; - z-index: 2; } - .tabs.is-toggle li + li { - margin-left: -1px; } - .tabs.is-toggle li:first-child a { - border-radius: 4px 0 0 4px; } - .tabs.is-toggle li:last-child a { - border-radius: 0 4px 4px 0; } - .tabs.is-toggle li.is-active a { - background-color: #2e63b8; - border-color: #2e63b8; - color: #fff; - z-index: 1; } - .tabs.is-toggle ul { - border-bottom: none; } - .tabs.is-toggle.is-toggle-rounded li:first-child a { - border-bottom-left-radius: 290486px; - border-top-left-radius: 290486px; - padding-left: 1.25em; } - .tabs.is-toggle.is-toggle-rounded li:last-child a { - border-bottom-right-radius: 290486px; - border-top-right-radius: 290486px; - padding-right: 1.25em; } - .tabs.is-small, #documenter .docs-sidebar form.docs-search > input.tabs { - font-size: 0.75rem; } - .tabs.is-medium { - font-size: 1.25rem; } - .tabs.is-large { - font-size: 1.5rem; } - -.column { - display: block; - flex-basis: 0; - flex-grow: 1; - flex-shrink: 1; - padding: 0.75rem; } - .columns.is-mobile > .column.is-narrow { - flex: none; } - .columns.is-mobile > .column.is-full { - flex: none; - width: 100%; } - .columns.is-mobile > .column.is-three-quarters { - flex: none; - width: 75%; } - .columns.is-mobile > .column.is-two-thirds { - flex: none; - width: 66.6666%; } - .columns.is-mobile > .column.is-half { - flex: none; - width: 50%; } - .columns.is-mobile > .column.is-one-third { - flex: none; - width: 33.3333%; } - .columns.is-mobile > .column.is-one-quarter { - flex: none; - width: 25%; } - .columns.is-mobile > .column.is-one-fifth { - flex: none; - width: 20%; } - .columns.is-mobile > .column.is-two-fifths { - flex: none; - width: 40%; } - .columns.is-mobile > .column.is-three-fifths { - flex: none; - width: 60%; } - .columns.is-mobile > .column.is-four-fifths { - flex: none; - width: 80%; } - .columns.is-mobile > .column.is-offset-three-quarters { - margin-left: 75%; } - .columns.is-mobile > .column.is-offset-two-thirds { - margin-left: 66.6666%; } - .columns.is-mobile > .column.is-offset-half { - margin-left: 50%; } - .columns.is-mobile > .column.is-offset-one-third { - margin-left: 33.3333%; } - .columns.is-mobile > .column.is-offset-one-quarter { - margin-left: 25%; } - .columns.is-mobile > .column.is-offset-one-fifth { - margin-left: 20%; } - .columns.is-mobile > .column.is-offset-two-fifths { - margin-left: 40%; } - .columns.is-mobile > .column.is-offset-three-fifths { - margin-left: 60%; } - .columns.is-mobile > .column.is-offset-four-fifths { - margin-left: 80%; } - .columns.is-mobile > .column.is-0 { - flex: none; - width: 0%; } - .columns.is-mobile > .column.is-offset-0 { - margin-left: 0%; } - .columns.is-mobile > .column.is-1 { - flex: none; - width: 8.3333333333%; } - .columns.is-mobile > .column.is-offset-1 { - margin-left: 8.3333333333%; } - .columns.is-mobile > .column.is-2 { - flex: none; - width: 16.6666666667%; } - .columns.is-mobile > .column.is-offset-2 { - margin-left: 16.6666666667%; } - .columns.is-mobile > .column.is-3 { - flex: none; - width: 25%; } - .columns.is-mobile > .column.is-offset-3 { - margin-left: 25%; } - .columns.is-mobile > .column.is-4 { - flex: none; - width: 33.3333333333%; } - .columns.is-mobile > .column.is-offset-4 { - margin-left: 33.3333333333%; } - .columns.is-mobile > .column.is-5 { - flex: none; - width: 41.6666666667%; } - .columns.is-mobile > .column.is-offset-5 { - margin-left: 41.6666666667%; } - .columns.is-mobile > .column.is-6 { - flex: none; - width: 50%; } - .columns.is-mobile > .column.is-offset-6 { - margin-left: 50%; } - .columns.is-mobile > .column.is-7 { - flex: none; - width: 58.3333333333%; } - .columns.is-mobile > .column.is-offset-7 { - margin-left: 58.3333333333%; } - .columns.is-mobile > .column.is-8 { - flex: none; - width: 66.6666666667%; } - .columns.is-mobile > .column.is-offset-8 { - margin-left: 66.6666666667%; } - .columns.is-mobile > .column.is-9 { - flex: none; - width: 75%; } - .columns.is-mobile > .column.is-offset-9 { - margin-left: 75%; } - .columns.is-mobile > .column.is-10 { - flex: none; - width: 83.3333333333%; } - .columns.is-mobile > .column.is-offset-10 { - margin-left: 83.3333333333%; } - .columns.is-mobile > .column.is-11 { - flex: none; - width: 91.6666666667%; } - .columns.is-mobile > .column.is-offset-11 { - margin-left: 91.6666666667%; } - .columns.is-mobile > .column.is-12 { - flex: none; - width: 100%; } - .columns.is-mobile > .column.is-offset-12 { - margin-left: 100%; } - @media screen and (max-width: 768px) { - .column.is-narrow-mobile { - flex: none; } - .column.is-full-mobile { - flex: none; - width: 100%; } - .column.is-three-quarters-mobile { - flex: none; - width: 75%; } - .column.is-two-thirds-mobile { - flex: none; - width: 66.6666%; } - .column.is-half-mobile { - flex: none; - width: 50%; } - .column.is-one-third-mobile { - flex: none; - width: 33.3333%; } - .column.is-one-quarter-mobile { - flex: none; - width: 25%; } - .column.is-one-fifth-mobile { - flex: none; - width: 20%; } - .column.is-two-fifths-mobile { - flex: none; - width: 40%; } - .column.is-three-fifths-mobile { - flex: none; - width: 60%; } - .column.is-four-fifths-mobile { - flex: none; - width: 80%; } - .column.is-offset-three-quarters-mobile { - margin-left: 75%; } - .column.is-offset-two-thirds-mobile { - margin-left: 66.6666%; } - .column.is-offset-half-mobile { - margin-left: 50%; } - .column.is-offset-one-third-mobile { - margin-left: 33.3333%; } - .column.is-offset-one-quarter-mobile { - margin-left: 25%; } - .column.is-offset-one-fifth-mobile { - margin-left: 20%; } - .column.is-offset-two-fifths-mobile { - margin-left: 40%; } - .column.is-offset-three-fifths-mobile { - margin-left: 60%; } - .column.is-offset-four-fifths-mobile { - margin-left: 80%; } - .column.is-0-mobile { - flex: none; - width: 0%; } - .column.is-offset-0-mobile { - margin-left: 0%; } - .column.is-1-mobile { - flex: none; - width: 8.3333333333%; } - .column.is-offset-1-mobile { - margin-left: 8.3333333333%; } - .column.is-2-mobile { - flex: none; - width: 16.6666666667%; } - .column.is-offset-2-mobile { - margin-left: 16.6666666667%; } - .column.is-3-mobile { - flex: none; - width: 25%; } - .column.is-offset-3-mobile { - margin-left: 25%; } - .column.is-4-mobile { - flex: none; - width: 33.3333333333%; } - .column.is-offset-4-mobile { - margin-left: 33.3333333333%; } - .column.is-5-mobile { - flex: none; - width: 41.6666666667%; } - .column.is-offset-5-mobile { - margin-left: 41.6666666667%; } - .column.is-6-mobile { - flex: none; - width: 50%; } - .column.is-offset-6-mobile { - margin-left: 50%; } - .column.is-7-mobile { - flex: none; - width: 58.3333333333%; } - .column.is-offset-7-mobile { - margin-left: 58.3333333333%; } - .column.is-8-mobile { - flex: none; - width: 66.6666666667%; } - .column.is-offset-8-mobile { - margin-left: 66.6666666667%; } - .column.is-9-mobile { - flex: none; - width: 75%; } - .column.is-offset-9-mobile { - margin-left: 75%; } - .column.is-10-mobile { - flex: none; - width: 83.3333333333%; } - .column.is-offset-10-mobile { - margin-left: 83.3333333333%; } - .column.is-11-mobile { - flex: none; - width: 91.6666666667%; } - .column.is-offset-11-mobile { - margin-left: 91.6666666667%; } - .column.is-12-mobile { - flex: none; - width: 100%; } - .column.is-offset-12-mobile { - margin-left: 100%; } } - @media screen and (min-width: 769px), print { - .column.is-narrow, .column.is-narrow-tablet { - flex: none; } - .column.is-full, .column.is-full-tablet { - flex: none; - width: 100%; } - .column.is-three-quarters, .column.is-three-quarters-tablet { - flex: none; - width: 75%; } - .column.is-two-thirds, .column.is-two-thirds-tablet { - flex: none; - width: 66.6666%; } - .column.is-half, .column.is-half-tablet { - flex: none; - width: 50%; } - .column.is-one-third, .column.is-one-third-tablet { - flex: none; - width: 33.3333%; } - .column.is-one-quarter, .column.is-one-quarter-tablet { - flex: none; - width: 25%; } - .column.is-one-fifth, .column.is-one-fifth-tablet { - flex: none; - width: 20%; } - .column.is-two-fifths, .column.is-two-fifths-tablet { - flex: none; - width: 40%; } - .column.is-three-fifths, .column.is-three-fifths-tablet { - flex: none; - width: 60%; } - .column.is-four-fifths, .column.is-four-fifths-tablet { - flex: none; - width: 80%; } - .column.is-offset-three-quarters, .column.is-offset-three-quarters-tablet { - margin-left: 75%; } - .column.is-offset-two-thirds, .column.is-offset-two-thirds-tablet { - margin-left: 66.6666%; } - .column.is-offset-half, .column.is-offset-half-tablet { - margin-left: 50%; } - .column.is-offset-one-third, .column.is-offset-one-third-tablet { - margin-left: 33.3333%; } - .column.is-offset-one-quarter, .column.is-offset-one-quarter-tablet { - margin-left: 25%; } - .column.is-offset-one-fifth, .column.is-offset-one-fifth-tablet { - margin-left: 20%; } - .column.is-offset-two-fifths, .column.is-offset-two-fifths-tablet { - margin-left: 40%; } - .column.is-offset-three-fifths, .column.is-offset-three-fifths-tablet { - margin-left: 60%; } - .column.is-offset-four-fifths, .column.is-offset-four-fifths-tablet { - margin-left: 80%; } - .column.is-0, .column.is-0-tablet { - flex: none; - width: 0%; } - .column.is-offset-0, .column.is-offset-0-tablet { - margin-left: 0%; } - .column.is-1, .column.is-1-tablet { - flex: none; - width: 8.3333333333%; } - .column.is-offset-1, .column.is-offset-1-tablet { - margin-left: 8.3333333333%; } - .column.is-2, .column.is-2-tablet { - flex: none; - width: 16.6666666667%; } - .column.is-offset-2, .column.is-offset-2-tablet { - margin-left: 16.6666666667%; } - .column.is-3, .column.is-3-tablet { - flex: none; - width: 25%; } - .column.is-offset-3, .column.is-offset-3-tablet { - margin-left: 25%; } - .column.is-4, .column.is-4-tablet { - flex: none; - width: 33.3333333333%; } - .column.is-offset-4, .column.is-offset-4-tablet { - margin-left: 33.3333333333%; } - .column.is-5, .column.is-5-tablet { - flex: none; - width: 41.6666666667%; } - .column.is-offset-5, .column.is-offset-5-tablet { - margin-left: 41.6666666667%; } - .column.is-6, .column.is-6-tablet { - flex: none; - width: 50%; } - .column.is-offset-6, .column.is-offset-6-tablet { - margin-left: 50%; } - .column.is-7, .column.is-7-tablet { - flex: none; - width: 58.3333333333%; } - .column.is-offset-7, .column.is-offset-7-tablet { - margin-left: 58.3333333333%; } - .column.is-8, .column.is-8-tablet { - flex: none; - width: 66.6666666667%; } - .column.is-offset-8, .column.is-offset-8-tablet { - margin-left: 66.6666666667%; } - .column.is-9, .column.is-9-tablet { - flex: none; - width: 75%; } - .column.is-offset-9, .column.is-offset-9-tablet { - margin-left: 75%; } - .column.is-10, .column.is-10-tablet { - flex: none; - width: 83.3333333333%; } - .column.is-offset-10, .column.is-offset-10-tablet { - margin-left: 83.3333333333%; } - .column.is-11, .column.is-11-tablet { - flex: none; - width: 91.6666666667%; } - .column.is-offset-11, .column.is-offset-11-tablet { - margin-left: 91.6666666667%; } - .column.is-12, .column.is-12-tablet { - flex: none; - width: 100%; } - .column.is-offset-12, .column.is-offset-12-tablet { - margin-left: 100%; } } - @media screen and (max-width: 1055px) { - .column.is-narrow-touch { - flex: none; } - .column.is-full-touch { - flex: none; - width: 100%; } - .column.is-three-quarters-touch { - flex: none; - width: 75%; } - .column.is-two-thirds-touch { - flex: none; - width: 66.6666%; } - .column.is-half-touch { - flex: none; - width: 50%; } - .column.is-one-third-touch { - flex: none; - width: 33.3333%; } - .column.is-one-quarter-touch { - flex: none; - width: 25%; } - .column.is-one-fifth-touch { - flex: none; - width: 20%; } - .column.is-two-fifths-touch { - flex: none; - width: 40%; } - .column.is-three-fifths-touch { - flex: none; - width: 60%; } - .column.is-four-fifths-touch { - flex: none; - width: 80%; } - .column.is-offset-three-quarters-touch { - margin-left: 75%; } - .column.is-offset-two-thirds-touch { - margin-left: 66.6666%; } - .column.is-offset-half-touch { - margin-left: 50%; } - .column.is-offset-one-third-touch { - margin-left: 33.3333%; } - .column.is-offset-one-quarter-touch { - margin-left: 25%; } - .column.is-offset-one-fifth-touch { - margin-left: 20%; } - .column.is-offset-two-fifths-touch { - margin-left: 40%; } - .column.is-offset-three-fifths-touch { - margin-left: 60%; } - .column.is-offset-four-fifths-touch { - margin-left: 80%; } - .column.is-0-touch { - flex: none; - width: 0%; } - .column.is-offset-0-touch { - margin-left: 0%; } - .column.is-1-touch { - flex: none; - width: 8.3333333333%; } - .column.is-offset-1-touch { - margin-left: 8.3333333333%; } - .column.is-2-touch { - flex: none; - width: 16.6666666667%; } - .column.is-offset-2-touch { - margin-left: 16.6666666667%; } - .column.is-3-touch { - flex: none; - width: 25%; } - .column.is-offset-3-touch { - margin-left: 25%; } - .column.is-4-touch { - flex: none; - width: 33.3333333333%; } - .column.is-offset-4-touch { - margin-left: 33.3333333333%; } - .column.is-5-touch { - flex: none; - width: 41.6666666667%; } - .column.is-offset-5-touch { - margin-left: 41.6666666667%; } - .column.is-6-touch { - flex: none; - width: 50%; } - .column.is-offset-6-touch { - margin-left: 50%; } - .column.is-7-touch { - flex: none; - width: 58.3333333333%; } - .column.is-offset-7-touch { - margin-left: 58.3333333333%; } - .column.is-8-touch { - flex: none; - width: 66.6666666667%; } - .column.is-offset-8-touch { - margin-left: 66.6666666667%; } - .column.is-9-touch { - flex: none; - width: 75%; } - .column.is-offset-9-touch { - margin-left: 75%; } - .column.is-10-touch { - flex: none; - width: 83.3333333333%; } - .column.is-offset-10-touch { - margin-left: 83.3333333333%; } - .column.is-11-touch { - flex: none; - width: 91.6666666667%; } - .column.is-offset-11-touch { - margin-left: 91.6666666667%; } - .column.is-12-touch { - flex: none; - width: 100%; } - .column.is-offset-12-touch { - margin-left: 100%; } } - @media screen and (min-width: 1056px) { - .column.is-narrow-desktop { - flex: none; } - .column.is-full-desktop { - flex: none; - width: 100%; } - .column.is-three-quarters-desktop { - flex: none; - width: 75%; } - .column.is-two-thirds-desktop { - flex: none; - width: 66.6666%; } - .column.is-half-desktop { - flex: none; - width: 50%; } - .column.is-one-third-desktop { - flex: none; - width: 33.3333%; } - .column.is-one-quarter-desktop { - flex: none; - width: 25%; } - .column.is-one-fifth-desktop { - flex: none; - width: 20%; } - .column.is-two-fifths-desktop { - flex: none; - width: 40%; } - .column.is-three-fifths-desktop { - flex: none; - width: 60%; } - .column.is-four-fifths-desktop { - flex: none; - width: 80%; } - .column.is-offset-three-quarters-desktop { - margin-left: 75%; } - .column.is-offset-two-thirds-desktop { - margin-left: 66.6666%; } - .column.is-offset-half-desktop { - margin-left: 50%; } - .column.is-offset-one-third-desktop { - margin-left: 33.3333%; } - .column.is-offset-one-quarter-desktop { - margin-left: 25%; } - .column.is-offset-one-fifth-desktop { - margin-left: 20%; } - .column.is-offset-two-fifths-desktop { - margin-left: 40%; } - .column.is-offset-three-fifths-desktop { - margin-left: 60%; } - .column.is-offset-four-fifths-desktop { - margin-left: 80%; } - .column.is-0-desktop { - flex: none; - width: 0%; } - .column.is-offset-0-desktop { - margin-left: 0%; } - .column.is-1-desktop { - flex: none; - width: 8.3333333333%; } - .column.is-offset-1-desktop { - margin-left: 8.3333333333%; } - .column.is-2-desktop { - flex: none; - width: 16.6666666667%; } - .column.is-offset-2-desktop { - margin-left: 16.6666666667%; } - .column.is-3-desktop { - flex: none; - width: 25%; } - .column.is-offset-3-desktop { - margin-left: 25%; } - .column.is-4-desktop { - flex: none; - width: 33.3333333333%; } - .column.is-offset-4-desktop { - margin-left: 33.3333333333%; } - .column.is-5-desktop { - flex: none; - width: 41.6666666667%; } - .column.is-offset-5-desktop { - margin-left: 41.6666666667%; } - .column.is-6-desktop { - flex: none; - width: 50%; } - .column.is-offset-6-desktop { - margin-left: 50%; } - .column.is-7-desktop { - flex: none; - width: 58.3333333333%; } - .column.is-offset-7-desktop { - margin-left: 58.3333333333%; } - .column.is-8-desktop { - flex: none; - width: 66.6666666667%; } - .column.is-offset-8-desktop { - margin-left: 66.6666666667%; } - .column.is-9-desktop { - flex: none; - width: 75%; } - .column.is-offset-9-desktop { - margin-left: 75%; } - .column.is-10-desktop { - flex: none; - width: 83.3333333333%; } - .column.is-offset-10-desktop { - margin-left: 83.3333333333%; } - .column.is-11-desktop { - flex: none; - width: 91.6666666667%; } - .column.is-offset-11-desktop { - margin-left: 91.6666666667%; } - .column.is-12-desktop { - flex: none; - width: 100%; } - .column.is-offset-12-desktop { - margin-left: 100%; } } - @media screen and (min-width: 1216px) { - .column.is-narrow-widescreen { - flex: none; } - .column.is-full-widescreen { - flex: none; - width: 100%; } - .column.is-three-quarters-widescreen { - flex: none; - width: 75%; } - .column.is-two-thirds-widescreen { - flex: none; - width: 66.6666%; } - .column.is-half-widescreen { - flex: none; - width: 50%; } - .column.is-one-third-widescreen { - flex: none; - width: 33.3333%; } - .column.is-one-quarter-widescreen { - flex: none; - width: 25%; } - .column.is-one-fifth-widescreen { - flex: none; - width: 20%; } - .column.is-two-fifths-widescreen { - flex: none; - width: 40%; } - .column.is-three-fifths-widescreen { - flex: none; - width: 60%; } - .column.is-four-fifths-widescreen { - flex: none; - width: 80%; } - .column.is-offset-three-quarters-widescreen { - margin-left: 75%; } - .column.is-offset-two-thirds-widescreen { - margin-left: 66.6666%; } - .column.is-offset-half-widescreen { - margin-left: 50%; } - .column.is-offset-one-third-widescreen { - margin-left: 33.3333%; } - .column.is-offset-one-quarter-widescreen { - margin-left: 25%; } - .column.is-offset-one-fifth-widescreen { - margin-left: 20%; } - .column.is-offset-two-fifths-widescreen { - margin-left: 40%; } - .column.is-offset-three-fifths-widescreen { - margin-left: 60%; } - .column.is-offset-four-fifths-widescreen { - margin-left: 80%; } - .column.is-0-widescreen { - flex: none; - width: 0%; } - .column.is-offset-0-widescreen { - margin-left: 0%; } - .column.is-1-widescreen { - flex: none; - width: 8.3333333333%; } - .column.is-offset-1-widescreen { - margin-left: 8.3333333333%; } - .column.is-2-widescreen { - flex: none; - width: 16.6666666667%; } - .column.is-offset-2-widescreen { - margin-left: 16.6666666667%; } - .column.is-3-widescreen { - flex: none; - width: 25%; } - .column.is-offset-3-widescreen { - margin-left: 25%; } - .column.is-4-widescreen { - flex: none; - width: 33.3333333333%; } - .column.is-offset-4-widescreen { - margin-left: 33.3333333333%; } - .column.is-5-widescreen { - flex: none; - width: 41.6666666667%; } - .column.is-offset-5-widescreen { - margin-left: 41.6666666667%; } - .column.is-6-widescreen { - flex: none; - width: 50%; } - .column.is-offset-6-widescreen { - margin-left: 50%; } - .column.is-7-widescreen { - flex: none; - width: 58.3333333333%; } - .column.is-offset-7-widescreen { - margin-left: 58.3333333333%; } - .column.is-8-widescreen { - flex: none; - width: 66.6666666667%; } - .column.is-offset-8-widescreen { - margin-left: 66.6666666667%; } - .column.is-9-widescreen { - flex: none; - width: 75%; } - .column.is-offset-9-widescreen { - margin-left: 75%; } - .column.is-10-widescreen { - flex: none; - width: 83.3333333333%; } - .column.is-offset-10-widescreen { - margin-left: 83.3333333333%; } - .column.is-11-widescreen { - flex: none; - width: 91.6666666667%; } - .column.is-offset-11-widescreen { - margin-left: 91.6666666667%; } - .column.is-12-widescreen { - flex: none; - width: 100%; } - .column.is-offset-12-widescreen { - margin-left: 100%; } } - @media screen and (min-width: 1408px) { - .column.is-narrow-fullhd { - flex: none; } - .column.is-full-fullhd { - flex: none; - width: 100%; } - .column.is-three-quarters-fullhd { - flex: none; - width: 75%; } - .column.is-two-thirds-fullhd { - flex: none; - width: 66.6666%; } - .column.is-half-fullhd { - flex: none; - width: 50%; } - .column.is-one-third-fullhd { - flex: none; - width: 33.3333%; } - .column.is-one-quarter-fullhd { - flex: none; - width: 25%; } - .column.is-one-fifth-fullhd { - flex: none; - width: 20%; } - .column.is-two-fifths-fullhd { - flex: none; - width: 40%; } - .column.is-three-fifths-fullhd { - flex: none; - width: 60%; } - .column.is-four-fifths-fullhd { - flex: none; - width: 80%; } - .column.is-offset-three-quarters-fullhd { - margin-left: 75%; } - .column.is-offset-two-thirds-fullhd { - margin-left: 66.6666%; } - .column.is-offset-half-fullhd { - margin-left: 50%; } - .column.is-offset-one-third-fullhd { - margin-left: 33.3333%; } - .column.is-offset-one-quarter-fullhd { - margin-left: 25%; } - .column.is-offset-one-fifth-fullhd { - margin-left: 20%; } - .column.is-offset-two-fifths-fullhd { - margin-left: 40%; } - .column.is-offset-three-fifths-fullhd { - margin-left: 60%; } - .column.is-offset-four-fifths-fullhd { - margin-left: 80%; } - .column.is-0-fullhd { - flex: none; - width: 0%; } - .column.is-offset-0-fullhd { - margin-left: 0%; } - .column.is-1-fullhd { - flex: none; - width: 8.3333333333%; } - .column.is-offset-1-fullhd { - margin-left: 8.3333333333%; } - .column.is-2-fullhd { - flex: none; - width: 16.6666666667%; } - .column.is-offset-2-fullhd { - margin-left: 16.6666666667%; } - .column.is-3-fullhd { - flex: none; - width: 25%; } - .column.is-offset-3-fullhd { - margin-left: 25%; } - .column.is-4-fullhd { - flex: none; - width: 33.3333333333%; } - .column.is-offset-4-fullhd { - margin-left: 33.3333333333%; } - .column.is-5-fullhd { - flex: none; - width: 41.6666666667%; } - .column.is-offset-5-fullhd { - margin-left: 41.6666666667%; } - .column.is-6-fullhd { - flex: none; - width: 50%; } - .column.is-offset-6-fullhd { - margin-left: 50%; } - .column.is-7-fullhd { - flex: none; - width: 58.3333333333%; } - .column.is-offset-7-fullhd { - margin-left: 58.3333333333%; } - .column.is-8-fullhd { - flex: none; - width: 66.6666666667%; } - .column.is-offset-8-fullhd { - margin-left: 66.6666666667%; } - .column.is-9-fullhd { - flex: none; - width: 75%; } - .column.is-offset-9-fullhd { - margin-left: 75%; } - .column.is-10-fullhd { - flex: none; - width: 83.3333333333%; } - .column.is-offset-10-fullhd { - margin-left: 83.3333333333%; } - .column.is-11-fullhd { - flex: none; - width: 91.6666666667%; } - .column.is-offset-11-fullhd { - margin-left: 91.6666666667%; } - .column.is-12-fullhd { - flex: none; - width: 100%; } - .column.is-offset-12-fullhd { - margin-left: 100%; } } -.columns { - margin-left: -0.75rem; - margin-right: -0.75rem; - margin-top: -0.75rem; } - .columns:last-child { - margin-bottom: -0.75rem; } - .columns:not(:last-child) { - margin-bottom: calc(1.5rem - 0.75rem); } - .columns.is-centered { - justify-content: center; } - .columns.is-gapless { - margin-left: 0; - margin-right: 0; - margin-top: 0; } - .columns.is-gapless > .column { - margin: 0; - padding: 0 !important; } - .columns.is-gapless:not(:last-child) { - margin-bottom: 1.5rem; } - .columns.is-gapless:last-child { - margin-bottom: 0; } - .columns.is-mobile { - display: flex; } - .columns.is-multiline { - flex-wrap: wrap; } - .columns.is-vcentered { - align-items: center; } - @media screen and (min-width: 769px), print { - .columns:not(.is-desktop) { - display: flex; } } - @media screen and (min-width: 1056px) { - .columns.is-desktop { - display: flex; } } -.columns.is-variable { - --columnGap: 0.75rem; - margin-left: calc(-1 * var(--columnGap)); - margin-right: calc(-1 * var(--columnGap)); } - .columns.is-variable .column { - padding-left: var(--columnGap); - padding-right: var(--columnGap); } - .columns.is-variable.is-0 { - --columnGap: 0rem; } - @media screen and (max-width: 768px) { - .columns.is-variable.is-0-mobile { - --columnGap: 0rem; } } - @media screen and (min-width: 769px), print { - .columns.is-variable.is-0-tablet { - --columnGap: 0rem; } } - @media screen and (min-width: 769px) and (max-width: 1055px) { - .columns.is-variable.is-0-tablet-only { - --columnGap: 0rem; } } - @media screen and (max-width: 1055px) { - .columns.is-variable.is-0-touch { - --columnGap: 0rem; } } - @media screen and (min-width: 1056px) { - .columns.is-variable.is-0-desktop { - --columnGap: 0rem; } } - @media screen and (min-width: 1056px) and (max-width: 1215px) { - .columns.is-variable.is-0-desktop-only { - --columnGap: 0rem; } } - @media screen and (min-width: 1216px) { - .columns.is-variable.is-0-widescreen { - --columnGap: 0rem; } } - @media screen and (min-width: 1216px) and (max-width: 1407px) { - .columns.is-variable.is-0-widescreen-only { - --columnGap: 0rem; } } - @media screen and (min-width: 1408px) { - .columns.is-variable.is-0-fullhd { - --columnGap: 0rem; } } - .columns.is-variable.is-1 { - --columnGap: 0.25rem; } - @media screen and (max-width: 768px) { - .columns.is-variable.is-1-mobile { - --columnGap: 0.25rem; } } - @media screen and (min-width: 769px), print { - .columns.is-variable.is-1-tablet { - --columnGap: 0.25rem; } } - @media screen and (min-width: 769px) and (max-width: 1055px) { - .columns.is-variable.is-1-tablet-only { - --columnGap: 0.25rem; } } - @media screen and (max-width: 1055px) { - .columns.is-variable.is-1-touch { - --columnGap: 0.25rem; } } - @media screen and (min-width: 1056px) { - .columns.is-variable.is-1-desktop { - --columnGap: 0.25rem; } } - @media screen and (min-width: 1056px) and (max-width: 1215px) { - .columns.is-variable.is-1-desktop-only { - --columnGap: 0.25rem; } } - @media screen and (min-width: 1216px) { - .columns.is-variable.is-1-widescreen { - --columnGap: 0.25rem; } } - @media screen and (min-width: 1216px) and (max-width: 1407px) { - .columns.is-variable.is-1-widescreen-only { - --columnGap: 0.25rem; } } - @media screen and (min-width: 1408px) { - .columns.is-variable.is-1-fullhd { - --columnGap: 0.25rem; } } - .columns.is-variable.is-2 { - --columnGap: 0.5rem; } - @media screen and (max-width: 768px) { - .columns.is-variable.is-2-mobile { - --columnGap: 0.5rem; } } - @media screen and (min-width: 769px), print { - .columns.is-variable.is-2-tablet { - --columnGap: 0.5rem; } } - @media screen and (min-width: 769px) and (max-width: 1055px) { - .columns.is-variable.is-2-tablet-only { - --columnGap: 0.5rem; } } - @media screen and (max-width: 1055px) { - .columns.is-variable.is-2-touch { - --columnGap: 0.5rem; } } - @media screen and (min-width: 1056px) { - .columns.is-variable.is-2-desktop { - --columnGap: 0.5rem; } } - @media screen and (min-width: 1056px) and (max-width: 1215px) { - .columns.is-variable.is-2-desktop-only { - --columnGap: 0.5rem; } } - @media screen and (min-width: 1216px) { - .columns.is-variable.is-2-widescreen { - --columnGap: 0.5rem; } } - @media screen and (min-width: 1216px) and (max-width: 1407px) { - .columns.is-variable.is-2-widescreen-only { - --columnGap: 0.5rem; } } - @media screen and (min-width: 1408px) { - .columns.is-variable.is-2-fullhd { - --columnGap: 0.5rem; } } - .columns.is-variable.is-3 { - --columnGap: 0.75rem; } - @media screen and (max-width: 768px) { - .columns.is-variable.is-3-mobile { - --columnGap: 0.75rem; } } - @media screen and (min-width: 769px), print { - .columns.is-variable.is-3-tablet { - --columnGap: 0.75rem; } } - @media screen and (min-width: 769px) and (max-width: 1055px) { - .columns.is-variable.is-3-tablet-only { - --columnGap: 0.75rem; } } - @media screen and (max-width: 1055px) { - .columns.is-variable.is-3-touch { - --columnGap: 0.75rem; } } - @media screen and (min-width: 1056px) { - .columns.is-variable.is-3-desktop { - --columnGap: 0.75rem; } } - @media screen and (min-width: 1056px) and (max-width: 1215px) { - .columns.is-variable.is-3-desktop-only { - --columnGap: 0.75rem; } } - @media screen and (min-width: 1216px) { - .columns.is-variable.is-3-widescreen { - --columnGap: 0.75rem; } } - @media screen and (min-width: 1216px) and (max-width: 1407px) { - .columns.is-variable.is-3-widescreen-only { - --columnGap: 0.75rem; } } - @media screen and (min-width: 1408px) { - .columns.is-variable.is-3-fullhd { - --columnGap: 0.75rem; } } - .columns.is-variable.is-4 { - --columnGap: 1rem; } - @media screen and (max-width: 768px) { - .columns.is-variable.is-4-mobile { - --columnGap: 1rem; } } - @media screen and (min-width: 769px), print { - .columns.is-variable.is-4-tablet { - --columnGap: 1rem; } } - @media screen and (min-width: 769px) and (max-width: 1055px) { - .columns.is-variable.is-4-tablet-only { - --columnGap: 1rem; } } - @media screen and (max-width: 1055px) { - .columns.is-variable.is-4-touch { - --columnGap: 1rem; } } - @media screen and (min-width: 1056px) { - .columns.is-variable.is-4-desktop { - --columnGap: 1rem; } } - @media screen and (min-width: 1056px) and (max-width: 1215px) { - .columns.is-variable.is-4-desktop-only { - --columnGap: 1rem; } } - @media screen and (min-width: 1216px) { - .columns.is-variable.is-4-widescreen { - --columnGap: 1rem; } } - @media screen and (min-width: 1216px) and (max-width: 1407px) { - .columns.is-variable.is-4-widescreen-only { - --columnGap: 1rem; } } - @media screen and (min-width: 1408px) { - .columns.is-variable.is-4-fullhd { - --columnGap: 1rem; } } - .columns.is-variable.is-5 { - --columnGap: 1.25rem; } - @media screen and (max-width: 768px) { - .columns.is-variable.is-5-mobile { - --columnGap: 1.25rem; } } - @media screen and (min-width: 769px), print { - .columns.is-variable.is-5-tablet { - --columnGap: 1.25rem; } } - @media screen and (min-width: 769px) and (max-width: 1055px) { - .columns.is-variable.is-5-tablet-only { - --columnGap: 1.25rem; } } - @media screen and (max-width: 1055px) { - .columns.is-variable.is-5-touch { - --columnGap: 1.25rem; } } - @media screen and (min-width: 1056px) { - .columns.is-variable.is-5-desktop { - --columnGap: 1.25rem; } } - @media screen and (min-width: 1056px) and (max-width: 1215px) { - .columns.is-variable.is-5-desktop-only { - --columnGap: 1.25rem; } } - @media screen and (min-width: 1216px) { - .columns.is-variable.is-5-widescreen { - --columnGap: 1.25rem; } } - @media screen and (min-width: 1216px) and (max-width: 1407px) { - .columns.is-variable.is-5-widescreen-only { - --columnGap: 1.25rem; } } - @media screen and (min-width: 1408px) { - .columns.is-variable.is-5-fullhd { - --columnGap: 1.25rem; } } - .columns.is-variable.is-6 { - --columnGap: 1.5rem; } - @media screen and (max-width: 768px) { - .columns.is-variable.is-6-mobile { - --columnGap: 1.5rem; } } - @media screen and (min-width: 769px), print { - .columns.is-variable.is-6-tablet { - --columnGap: 1.5rem; } } - @media screen and (min-width: 769px) and (max-width: 1055px) { - .columns.is-variable.is-6-tablet-only { - --columnGap: 1.5rem; } } - @media screen and (max-width: 1055px) { - .columns.is-variable.is-6-touch { - --columnGap: 1.5rem; } } - @media screen and (min-width: 1056px) { - .columns.is-variable.is-6-desktop { - --columnGap: 1.5rem; } } - @media screen and (min-width: 1056px) and (max-width: 1215px) { - .columns.is-variable.is-6-desktop-only { - --columnGap: 1.5rem; } } - @media screen and (min-width: 1216px) { - .columns.is-variable.is-6-widescreen { - --columnGap: 1.5rem; } } - @media screen and (min-width: 1216px) and (max-width: 1407px) { - .columns.is-variable.is-6-widescreen-only { - --columnGap: 1.5rem; } } - @media screen and (min-width: 1408px) { - .columns.is-variable.is-6-fullhd { - --columnGap: 1.5rem; } } - .columns.is-variable.is-7 { - --columnGap: 1.75rem; } - @media screen and (max-width: 768px) { - .columns.is-variable.is-7-mobile { - --columnGap: 1.75rem; } } - @media screen and (min-width: 769px), print { - .columns.is-variable.is-7-tablet { - --columnGap: 1.75rem; } } - @media screen and (min-width: 769px) and (max-width: 1055px) { - .columns.is-variable.is-7-tablet-only { - --columnGap: 1.75rem; } } - @media screen and (max-width: 1055px) { - .columns.is-variable.is-7-touch { - --columnGap: 1.75rem; } } - @media screen and (min-width: 1056px) { - .columns.is-variable.is-7-desktop { - --columnGap: 1.75rem; } } - @media screen and (min-width: 1056px) and (max-width: 1215px) { - .columns.is-variable.is-7-desktop-only { - --columnGap: 1.75rem; } } - @media screen and (min-width: 1216px) { - .columns.is-variable.is-7-widescreen { - --columnGap: 1.75rem; } } - @media screen and (min-width: 1216px) and (max-width: 1407px) { - .columns.is-variable.is-7-widescreen-only { - --columnGap: 1.75rem; } } - @media screen and (min-width: 1408px) { - .columns.is-variable.is-7-fullhd { - --columnGap: 1.75rem; } } - .columns.is-variable.is-8 { - --columnGap: 2rem; } - @media screen and (max-width: 768px) { - .columns.is-variable.is-8-mobile { - --columnGap: 2rem; } } - @media screen and (min-width: 769px), print { - .columns.is-variable.is-8-tablet { - --columnGap: 2rem; } } - @media screen and (min-width: 769px) and (max-width: 1055px) { - .columns.is-variable.is-8-tablet-only { - --columnGap: 2rem; } } - @media screen and (max-width: 1055px) { - .columns.is-variable.is-8-touch { - --columnGap: 2rem; } } - @media screen and (min-width: 1056px) { - .columns.is-variable.is-8-desktop { - --columnGap: 2rem; } } - @media screen and (min-width: 1056px) and (max-width: 1215px) { - .columns.is-variable.is-8-desktop-only { - --columnGap: 2rem; } } - @media screen and (min-width: 1216px) { - .columns.is-variable.is-8-widescreen { - --columnGap: 2rem; } } - @media screen and (min-width: 1216px) and (max-width: 1407px) { - .columns.is-variable.is-8-widescreen-only { - --columnGap: 2rem; } } - @media screen and (min-width: 1408px) { - .columns.is-variable.is-8-fullhd { - --columnGap: 2rem; } } -.tile { - align-items: stretch; - display: block; - flex-basis: 0; - flex-grow: 1; - flex-shrink: 1; - min-height: min-content; } - .tile.is-ancestor { - margin-left: -0.75rem; - margin-right: -0.75rem; - margin-top: -0.75rem; } - .tile.is-ancestor:last-child { - margin-bottom: -0.75rem; } - .tile.is-ancestor:not(:last-child) { - margin-bottom: 0.75rem; } - .tile.is-child { - margin: 0 !important; } - .tile.is-parent { - padding: 0.75rem; } - .tile.is-vertical { - flex-direction: column; } - .tile.is-vertical > .tile.is-child:not(:last-child) { - margin-bottom: 1.5rem !important; } - @media screen and (min-width: 769px), print { - .tile:not(.is-child) { - display: flex; } - .tile.is-1 { - flex: none; - width: 8.3333333333%; } - .tile.is-2 { - flex: none; - width: 16.6666666667%; } - .tile.is-3 { - flex: none; - width: 25%; } - .tile.is-4 { - flex: none; - width: 33.3333333333%; } - .tile.is-5 { - flex: none; - width: 41.6666666667%; } - .tile.is-6 { - flex: none; - width: 50%; } - .tile.is-7 { - flex: none; - width: 58.3333333333%; } - .tile.is-8 { - flex: none; - width: 66.6666666667%; } - .tile.is-9 { - flex: none; - width: 75%; } - .tile.is-10 { - flex: none; - width: 83.3333333333%; } - .tile.is-11 { - flex: none; - width: 91.6666666667%; } - .tile.is-12 { - flex: none; - width: 100%; } } -.hero { - align-items: stretch; - display: flex; - flex-direction: column; - justify-content: space-between; } - .hero .navbar { - background: none; } - .hero .tabs ul { - border-bottom: none; } - .hero.is-white { - background-color: white; - color: #0a0a0a; } - .hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - .hero.is-white strong { - color: inherit; } - .hero.is-white .title { - color: #0a0a0a; } - .hero.is-white .subtitle { - color: rgba(10, 10, 10, 0.9); } - .hero.is-white .subtitle a:not(.button), - .hero.is-white .subtitle strong { - color: #0a0a0a; } - @media screen and (max-width: 1055px) { - .hero.is-white .navbar-menu { - background-color: white; } } - .hero.is-white .navbar-item, - .hero.is-white .navbar-link { - color: rgba(10, 10, 10, 0.7); } - .hero.is-white a.navbar-item:hover, .hero.is-white a.navbar-item.is-active, - .hero.is-white .navbar-link:hover, - .hero.is-white .navbar-link.is-active { - background-color: #f2f2f2; - color: #0a0a0a; } - .hero.is-white .tabs a { - color: #0a0a0a; - opacity: 0.9; } - .hero.is-white .tabs a:hover { - opacity: 1; } - .hero.is-white .tabs li.is-active a { - opacity: 1; } - .hero.is-white .tabs.is-boxed a, .hero.is-white .tabs.is-toggle a { - color: #0a0a0a; } - .hero.is-white .tabs.is-boxed a:hover, .hero.is-white .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - .hero.is-white .tabs.is-boxed li.is-active a, .hero.is-white .tabs.is-boxed li.is-active a:hover, .hero.is-white .tabs.is-toggle li.is-active a, .hero.is-white .tabs.is-toggle li.is-active a:hover { - background-color: #0a0a0a; - border-color: #0a0a0a; - color: white; } - .hero.is-white.is-bold { - background-image: linear-gradient(141deg, #e8e3e4 0%, white 71%, white 100%); } - @media screen and (max-width: 768px) { - .hero.is-white.is-bold .navbar-menu { - background-image: linear-gradient(141deg, #e8e3e4 0%, white 71%, white 100%); } } - .hero.is-black { - background-color: #0a0a0a; - color: white; } - .hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - .hero.is-black strong { - color: inherit; } - .hero.is-black .title { - color: white; } - .hero.is-black .subtitle { - color: rgba(255, 255, 255, 0.9); } - .hero.is-black .subtitle a:not(.button), - .hero.is-black .subtitle strong { - color: white; } - @media screen and (max-width: 1055px) { - .hero.is-black .navbar-menu { - background-color: #0a0a0a; } } - .hero.is-black .navbar-item, - .hero.is-black .navbar-link { - color: rgba(255, 255, 255, 0.7); } - .hero.is-black a.navbar-item:hover, .hero.is-black a.navbar-item.is-active, - .hero.is-black .navbar-link:hover, - .hero.is-black .navbar-link.is-active { - background-color: black; - color: white; } - .hero.is-black .tabs a { - color: white; - opacity: 0.9; } - .hero.is-black .tabs a:hover { - opacity: 1; } - .hero.is-black .tabs li.is-active a { - opacity: 1; } - .hero.is-black .tabs.is-boxed a, .hero.is-black .tabs.is-toggle a { - color: white; } - .hero.is-black .tabs.is-boxed a:hover, .hero.is-black .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - .hero.is-black .tabs.is-boxed li.is-active a, .hero.is-black .tabs.is-boxed li.is-active a:hover, .hero.is-black .tabs.is-toggle li.is-active a, .hero.is-black .tabs.is-toggle li.is-active a:hover { - background-color: white; - border-color: white; - color: #0a0a0a; } - .hero.is-black.is-bold { - background-image: linear-gradient(141deg, black 0%, #0a0a0a 71%, #181616 100%); } - @media screen and (max-width: 768px) { - .hero.is-black.is-bold .navbar-menu { - background-image: linear-gradient(141deg, black 0%, #0a0a0a 71%, #181616 100%); } } - .hero.is-light { - background-color: whitesmoke; - color: #363636; } - .hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - .hero.is-light strong { - color: inherit; } - .hero.is-light .title { - color: #363636; } - .hero.is-light .subtitle { - color: rgba(54, 54, 54, 0.9); } - .hero.is-light .subtitle a:not(.button), - .hero.is-light .subtitle strong { - color: #363636; } - @media screen and (max-width: 1055px) { - .hero.is-light .navbar-menu { - background-color: whitesmoke; } } - .hero.is-light .navbar-item, - .hero.is-light .navbar-link { - color: rgba(54, 54, 54, 0.7); } - .hero.is-light a.navbar-item:hover, .hero.is-light a.navbar-item.is-active, - .hero.is-light .navbar-link:hover, - .hero.is-light .navbar-link.is-active { - background-color: #e8e8e8; - color: #363636; } - .hero.is-light .tabs a { - color: #363636; - opacity: 0.9; } - .hero.is-light .tabs a:hover { - opacity: 1; } - .hero.is-light .tabs li.is-active a { - opacity: 1; } - .hero.is-light .tabs.is-boxed a, .hero.is-light .tabs.is-toggle a { - color: #363636; } - .hero.is-light .tabs.is-boxed a:hover, .hero.is-light .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - .hero.is-light .tabs.is-boxed li.is-active a, .hero.is-light .tabs.is-boxed li.is-active a:hover, .hero.is-light .tabs.is-toggle li.is-active a, .hero.is-light .tabs.is-toggle li.is-active a:hover { - background-color: #363636; - border-color: #363636; - color: whitesmoke; } - .hero.is-light.is-bold { - background-image: linear-gradient(141deg, #dfd8d9 0%, whitesmoke 71%, white 100%); } - @media screen and (max-width: 768px) { - .hero.is-light.is-bold .navbar-menu { - background-image: linear-gradient(141deg, #dfd8d9 0%, whitesmoke 71%, white 100%); } } - .hero.is-dark, .content kbd.hero { - background-color: #363636; - color: whitesmoke; } - .hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), .content kbd.hero a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - .hero.is-dark strong, - .content kbd.hero strong { - color: inherit; } - .hero.is-dark .title, .content kbd.hero .title { - color: whitesmoke; } - .hero.is-dark .subtitle, .content kbd.hero .subtitle { - color: rgba(245, 245, 245, 0.9); } - .hero.is-dark .subtitle a:not(.button), .content kbd.hero .subtitle a:not(.button), - .hero.is-dark .subtitle strong, - .content kbd.hero .subtitle strong { - color: whitesmoke; } - @media screen and (max-width: 1055px) { - .hero.is-dark .navbar-menu, .content kbd.hero .navbar-menu { - background-color: #363636; } } - .hero.is-dark .navbar-item, .content kbd.hero .navbar-item, - .hero.is-dark .navbar-link, - .content kbd.hero .navbar-link { - color: rgba(245, 245, 245, 0.7); } - .hero.is-dark a.navbar-item:hover, .content kbd.hero a.navbar-item:hover, .hero.is-dark a.navbar-item.is-active, .content kbd.hero a.navbar-item.is-active, - .hero.is-dark .navbar-link:hover, - .content kbd.hero .navbar-link:hover, - .hero.is-dark .navbar-link.is-active, - .content kbd.hero .navbar-link.is-active { - background-color: #292929; - color: whitesmoke; } - .hero.is-dark .tabs a, .content kbd.hero .tabs a { - color: whitesmoke; - opacity: 0.9; } - .hero.is-dark .tabs a:hover, .content kbd.hero .tabs a:hover { - opacity: 1; } - .hero.is-dark .tabs li.is-active a, .content kbd.hero .tabs li.is-active a { - opacity: 1; } - .hero.is-dark .tabs.is-boxed a, .content kbd.hero .tabs.is-boxed a, .hero.is-dark .tabs.is-toggle a, .content kbd.hero .tabs.is-toggle a { - color: whitesmoke; } - .hero.is-dark .tabs.is-boxed a:hover, .content kbd.hero .tabs.is-boxed a:hover, .hero.is-dark .tabs.is-toggle a:hover, .content kbd.hero .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - .hero.is-dark .tabs.is-boxed li.is-active a, .content kbd.hero .tabs.is-boxed li.is-active a, .hero.is-dark .tabs.is-boxed li.is-active a:hover, .hero.is-dark .tabs.is-toggle li.is-active a, .content kbd.hero .tabs.is-toggle li.is-active a, .hero.is-dark .tabs.is-toggle li.is-active a:hover { - background-color: whitesmoke; - border-color: whitesmoke; - color: #363636; } - .hero.is-dark.is-bold, .content kbd.hero.is-bold { - background-image: linear-gradient(141deg, #1f191a 0%, #363636 71%, #46403f 100%); } - @media screen and (max-width: 768px) { - .hero.is-dark.is-bold .navbar-menu, .content kbd.hero.is-bold .navbar-menu { - background-image: linear-gradient(141deg, #1f191a 0%, #363636 71%, #46403f 100%); } } - .hero.is-primary, .docstring > section > a.hero.docs-sourcelink { - background-color: #4eb5de; - color: #fff; } - .hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), .docstring > section > a.hero.docs-sourcelink a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - .hero.is-primary strong, - .docstring > section > a.hero.docs-sourcelink strong { - color: inherit; } - .hero.is-primary .title, .docstring > section > a.hero.docs-sourcelink .title { - color: #fff; } - .hero.is-primary .subtitle, .docstring > section > a.hero.docs-sourcelink .subtitle { - color: rgba(255, 255, 255, 0.9); } - .hero.is-primary .subtitle a:not(.button), .docstring > section > a.hero.docs-sourcelink .subtitle a:not(.button), - .hero.is-primary .subtitle strong, - .docstring > section > a.hero.docs-sourcelink .subtitle strong { - color: #fff; } - @media screen and (max-width: 1055px) { - .hero.is-primary .navbar-menu, .docstring > section > a.hero.docs-sourcelink .navbar-menu { - background-color: #4eb5de; } } - .hero.is-primary .navbar-item, .docstring > section > a.hero.docs-sourcelink .navbar-item, - .hero.is-primary .navbar-link, - .docstring > section > a.hero.docs-sourcelink .navbar-link { - color: rgba(255, 255, 255, 0.7); } - .hero.is-primary a.navbar-item:hover, .docstring > section > a.hero.docs-sourcelink a.navbar-item:hover, .hero.is-primary a.navbar-item.is-active, .docstring > section > a.hero.docs-sourcelink a.navbar-item.is-active, - .hero.is-primary .navbar-link:hover, - .docstring > section > a.hero.docs-sourcelink .navbar-link:hover, - .hero.is-primary .navbar-link.is-active, - .docstring > section > a.hero.docs-sourcelink .navbar-link.is-active { - background-color: #39acda; - color: #fff; } - .hero.is-primary .tabs a, .docstring > section > a.hero.docs-sourcelink .tabs a { - color: #fff; - opacity: 0.9; } - .hero.is-primary .tabs a:hover, .docstring > section > a.hero.docs-sourcelink .tabs a:hover { - opacity: 1; } - .hero.is-primary .tabs li.is-active a, .docstring > section > a.hero.docs-sourcelink .tabs li.is-active a { - opacity: 1; } - .hero.is-primary .tabs.is-boxed a, .docstring > section > a.hero.docs-sourcelink .tabs.is-boxed a, .hero.is-primary .tabs.is-toggle a, .docstring > section > a.hero.docs-sourcelink .tabs.is-toggle a { - color: #fff; } - .hero.is-primary .tabs.is-boxed a:hover, .docstring > section > a.hero.docs-sourcelink .tabs.is-boxed a:hover, .hero.is-primary .tabs.is-toggle a:hover, .docstring > section > a.hero.docs-sourcelink .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - .hero.is-primary .tabs.is-boxed li.is-active a, .docstring > section > a.hero.docs-sourcelink .tabs.is-boxed li.is-active a, .hero.is-primary .tabs.is-boxed li.is-active a:hover, .hero.is-primary .tabs.is-toggle li.is-active a, .docstring > section > a.hero.docs-sourcelink .tabs.is-toggle li.is-active a, .hero.is-primary .tabs.is-toggle li.is-active a:hover { - background-color: #fff; - border-color: #fff; - color: #4eb5de; } - .hero.is-primary.is-bold, .docstring > section > a.hero.is-bold.docs-sourcelink { - background-image: linear-gradient(141deg, #1bc7de 0%, #4eb5de 71%, #5fa9e7 100%); } - @media screen and (max-width: 768px) { - .hero.is-primary.is-bold .navbar-menu, .docstring > section > a.hero.is-bold.docs-sourcelink .navbar-menu { - background-image: linear-gradient(141deg, #1bc7de 0%, #4eb5de 71%, #5fa9e7 100%); } } - .hero.is-link { - background-color: #2e63b8; - color: #fff; } - .hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - .hero.is-link strong { - color: inherit; } - .hero.is-link .title { - color: #fff; } - .hero.is-link .subtitle { - color: rgba(255, 255, 255, 0.9); } - .hero.is-link .subtitle a:not(.button), - .hero.is-link .subtitle strong { - color: #fff; } - @media screen and (max-width: 1055px) { - .hero.is-link .navbar-menu { - background-color: #2e63b8; } } - .hero.is-link .navbar-item, - .hero.is-link .navbar-link { - color: rgba(255, 255, 255, 0.7); } - .hero.is-link a.navbar-item:hover, .hero.is-link a.navbar-item.is-active, - .hero.is-link .navbar-link:hover, - .hero.is-link .navbar-link.is-active { - background-color: #2958a4; - color: #fff; } - .hero.is-link .tabs a { - color: #fff; - opacity: 0.9; } - .hero.is-link .tabs a:hover { - opacity: 1; } - .hero.is-link .tabs li.is-active a { - opacity: 1; } - .hero.is-link .tabs.is-boxed a, .hero.is-link .tabs.is-toggle a { - color: #fff; } - .hero.is-link .tabs.is-boxed a:hover, .hero.is-link .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - .hero.is-link .tabs.is-boxed li.is-active a, .hero.is-link .tabs.is-boxed li.is-active a:hover, .hero.is-link .tabs.is-toggle li.is-active a, .hero.is-link .tabs.is-toggle li.is-active a:hover { - background-color: #fff; - border-color: #fff; - color: #2e63b8; } - .hero.is-link.is-bold { - background-image: linear-gradient(141deg, #1b6098 0%, #2e63b8 71%, #2d51d2 100%); } - @media screen and (max-width: 768px) { - .hero.is-link.is-bold .navbar-menu { - background-image: linear-gradient(141deg, #1b6098 0%, #2e63b8 71%, #2d51d2 100%); } } - .hero.is-info { - background-color: #209cee; - color: #fff; } - .hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - .hero.is-info strong { - color: inherit; } - .hero.is-info .title { - color: #fff; } - .hero.is-info .subtitle { - color: rgba(255, 255, 255, 0.9); } - .hero.is-info .subtitle a:not(.button), - .hero.is-info .subtitle strong { - color: #fff; } - @media screen and (max-width: 1055px) { - .hero.is-info .navbar-menu { - background-color: #209cee; } } - .hero.is-info .navbar-item, - .hero.is-info .navbar-link { - color: rgba(255, 255, 255, 0.7); } - .hero.is-info a.navbar-item:hover, .hero.is-info a.navbar-item.is-active, - .hero.is-info .navbar-link:hover, - .hero.is-info .navbar-link.is-active { - background-color: #1190e3; - color: #fff; } - .hero.is-info .tabs a { - color: #fff; - opacity: 0.9; } - .hero.is-info .tabs a:hover { - opacity: 1; } - .hero.is-info .tabs li.is-active a { - opacity: 1; } - .hero.is-info .tabs.is-boxed a, .hero.is-info .tabs.is-toggle a { - color: #fff; } - .hero.is-info .tabs.is-boxed a:hover, .hero.is-info .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - .hero.is-info .tabs.is-boxed li.is-active a, .hero.is-info .tabs.is-boxed li.is-active a:hover, .hero.is-info .tabs.is-toggle li.is-active a, .hero.is-info .tabs.is-toggle li.is-active a:hover { - background-color: #fff; - border-color: #fff; - color: #209cee; } - .hero.is-info.is-bold { - background-image: linear-gradient(141deg, #05a6d6 0%, #209cee 71%, #3287f5 100%); } - @media screen and (max-width: 768px) { - .hero.is-info.is-bold .navbar-menu { - background-image: linear-gradient(141deg, #05a6d6 0%, #209cee 71%, #3287f5 100%); } } - .hero.is-success { - background-color: #22c35b; - color: #fff; } - .hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - .hero.is-success strong { - color: inherit; } - .hero.is-success .title { - color: #fff; } - .hero.is-success .subtitle { - color: rgba(255, 255, 255, 0.9); } - .hero.is-success .subtitle a:not(.button), - .hero.is-success .subtitle strong { - color: #fff; } - @media screen and (max-width: 1055px) { - .hero.is-success .navbar-menu { - background-color: #22c35b; } } - .hero.is-success .navbar-item, - .hero.is-success .navbar-link { - color: rgba(255, 255, 255, 0.7); } - .hero.is-success a.navbar-item:hover, .hero.is-success a.navbar-item.is-active, - .hero.is-success .navbar-link:hover, - .hero.is-success .navbar-link.is-active { - background-color: #1ead51; - color: #fff; } - .hero.is-success .tabs a { - color: #fff; - opacity: 0.9; } - .hero.is-success .tabs a:hover { - opacity: 1; } - .hero.is-success .tabs li.is-active a { - opacity: 1; } - .hero.is-success .tabs.is-boxed a, .hero.is-success .tabs.is-toggle a { - color: #fff; } - .hero.is-success .tabs.is-boxed a:hover, .hero.is-success .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - .hero.is-success .tabs.is-boxed li.is-active a, .hero.is-success .tabs.is-boxed li.is-active a:hover, .hero.is-success .tabs.is-toggle li.is-active a, .hero.is-success .tabs.is-toggle li.is-active a:hover { - background-color: #fff; - border-color: #fff; - color: #22c35b; } - .hero.is-success.is-bold { - background-image: linear-gradient(141deg, #12a02c 0%, #22c35b 71%, #1fdf83 100%); } - @media screen and (max-width: 768px) { - .hero.is-success.is-bold .navbar-menu { - background-image: linear-gradient(141deg, #12a02c 0%, #22c35b 71%, #1fdf83 100%); } } - .hero.is-warning { - background-color: #ffdd57; - color: rgba(0, 0, 0, 0.7); } - .hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - .hero.is-warning strong { - color: inherit; } - .hero.is-warning .title { - color: rgba(0, 0, 0, 0.7); } - .hero.is-warning .subtitle { - color: rgba(0, 0, 0, 0.9); } - .hero.is-warning .subtitle a:not(.button), - .hero.is-warning .subtitle strong { - color: rgba(0, 0, 0, 0.7); } - @media screen and (max-width: 1055px) { - .hero.is-warning .navbar-menu { - background-color: #ffdd57; } } - .hero.is-warning .navbar-item, - .hero.is-warning .navbar-link { - color: rgba(0, 0, 0, 0.7); } - .hero.is-warning a.navbar-item:hover, .hero.is-warning a.navbar-item.is-active, - .hero.is-warning .navbar-link:hover, - .hero.is-warning .navbar-link.is-active { - background-color: #ffd83e; - color: rgba(0, 0, 0, 0.7); } - .hero.is-warning .tabs a { - color: rgba(0, 0, 0, 0.7); - opacity: 0.9; } - .hero.is-warning .tabs a:hover { - opacity: 1; } - .hero.is-warning .tabs li.is-active a { - opacity: 1; } - .hero.is-warning .tabs.is-boxed a, .hero.is-warning .tabs.is-toggle a { - color: rgba(0, 0, 0, 0.7); } - .hero.is-warning .tabs.is-boxed a:hover, .hero.is-warning .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - .hero.is-warning .tabs.is-boxed li.is-active a, .hero.is-warning .tabs.is-boxed li.is-active a:hover, .hero.is-warning .tabs.is-toggle li.is-active a, .hero.is-warning .tabs.is-toggle li.is-active a:hover { - background-color: rgba(0, 0, 0, 0.7); - border-color: rgba(0, 0, 0, 0.7); - color: #ffdd57; } - .hero.is-warning.is-bold { - background-image: linear-gradient(141deg, #ffae24 0%, #ffdd57 71%, #fffa71 100%); } - @media screen and (max-width: 768px) { - .hero.is-warning.is-bold .navbar-menu { - background-image: linear-gradient(141deg, #ffae24 0%, #ffdd57 71%, #fffa71 100%); } } - .hero.is-danger { - background-color: #da0b00; - color: #fff; } - .hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - .hero.is-danger strong { - color: inherit; } - .hero.is-danger .title { - color: #fff; } - .hero.is-danger .subtitle { - color: rgba(255, 255, 255, 0.9); } - .hero.is-danger .subtitle a:not(.button), - .hero.is-danger .subtitle strong { - color: #fff; } - @media screen and (max-width: 1055px) { - .hero.is-danger .navbar-menu { - background-color: #da0b00; } } - .hero.is-danger .navbar-item, - .hero.is-danger .navbar-link { - color: rgba(255, 255, 255, 0.7); } - .hero.is-danger a.navbar-item:hover, .hero.is-danger a.navbar-item.is-active, - .hero.is-danger .navbar-link:hover, - .hero.is-danger .navbar-link.is-active { - background-color: #c10a00; - color: #fff; } - .hero.is-danger .tabs a { - color: #fff; - opacity: 0.9; } - .hero.is-danger .tabs a:hover { - opacity: 1; } - .hero.is-danger .tabs li.is-active a { - opacity: 1; } - .hero.is-danger .tabs.is-boxed a, .hero.is-danger .tabs.is-toggle a { - color: #fff; } - .hero.is-danger .tabs.is-boxed a:hover, .hero.is-danger .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - .hero.is-danger .tabs.is-boxed li.is-active a, .hero.is-danger .tabs.is-boxed li.is-active a:hover, .hero.is-danger .tabs.is-toggle li.is-active a, .hero.is-danger .tabs.is-toggle li.is-active a:hover { - background-color: #fff; - border-color: #fff; - color: #da0b00; } - .hero.is-danger.is-bold { - background-image: linear-gradient(141deg, #a70013 0%, #da0b00 71%, #f43500 100%); } - @media screen and (max-width: 768px) { - .hero.is-danger.is-bold .navbar-menu { - background-image: linear-gradient(141deg, #a70013 0%, #da0b00 71%, #f43500 100%); } } - .hero.is-small .hero-body, #documenter .docs-sidebar form.docs-search > input.hero .hero-body { - padding-bottom: 1.5rem; - padding-top: 1.5rem; } - @media screen and (min-width: 769px), print { - .hero.is-medium .hero-body { - padding-bottom: 9rem; - padding-top: 9rem; } } - @media screen and (min-width: 769px), print { - .hero.is-large .hero-body { - padding-bottom: 18rem; - padding-top: 18rem; } } - .hero.is-halfheight .hero-body, .hero.is-fullheight .hero-body, .hero.is-fullheight-with-navbar .hero-body { - align-items: center; - display: flex; } - .hero.is-halfheight .hero-body > .container, .hero.is-fullheight .hero-body > .container, .hero.is-fullheight-with-navbar .hero-body > .container { - flex-grow: 1; - flex-shrink: 1; } - .hero.is-halfheight { - min-height: 50vh; } - .hero.is-fullheight { - min-height: 100vh; } - -.hero-video { - overflow: hidden; } - .hero-video video { - left: 50%; - min-height: 100%; - min-width: 100%; - position: absolute; - top: 50%; - transform: translate3d(-50%, -50%, 0); } - .hero-video.is-transparent { - opacity: 0.3; } - @media screen and (max-width: 768px) { - .hero-video { - display: none; } } -.hero-buttons { - margin-top: 1.5rem; } - @media screen and (max-width: 768px) { - .hero-buttons .button { - display: flex; } - .hero-buttons .button:not(:last-child) { - margin-bottom: 0.75rem; } } - @media screen and (min-width: 769px), print { - .hero-buttons { - display: flex; - justify-content: center; } - .hero-buttons .button:not(:last-child) { - margin-right: 1.5rem; } } -.hero-head, -.hero-foot { - flex-grow: 0; - flex-shrink: 0; } - -.hero-body { - flex-grow: 1; - flex-shrink: 0; - padding: 3rem 1.5rem; } - -.section { - padding: 3rem 1.5rem; } - @media screen and (min-width: 1056px) { - .section.is-medium { - padding: 9rem 1.5rem; } - .section.is-large { - padding: 18rem 1.5rem; } } -.footer { - background-color: #fafafa; - padding: 3rem 1.5rem 6rem; } - -h1 .docs-heading-anchor, h1 .docs-heading-anchor:hover, h1 .docs-heading-anchor:visited, h2 .docs-heading-anchor, h2 .docs-heading-anchor:hover, h2 .docs-heading-anchor:visited, h3 .docs-heading-anchor, h3 .docs-heading-anchor:hover, h3 .docs-heading-anchor:visited, h4 .docs-heading-anchor, h4 .docs-heading-anchor:hover, h4 .docs-heading-anchor:visited, h5 .docs-heading-anchor, h5 .docs-heading-anchor:hover, h5 .docs-heading-anchor:visited, h6 .docs-heading-anchor, h6 .docs-heading-anchor:hover, h6 .docs-heading-anchor:visited { - color: #222222; } - -h1 .docs-heading-anchor-permalink, h2 .docs-heading-anchor-permalink, h3 .docs-heading-anchor-permalink, h4 .docs-heading-anchor-permalink, h5 .docs-heading-anchor-permalink, h6 .docs-heading-anchor-permalink { - visibility: hidden; - vertical-align: middle; - margin-left: 0.5em; - font-size: 0.7rem; } - h1 .docs-heading-anchor-permalink::before, h2 .docs-heading-anchor-permalink::before, h3 .docs-heading-anchor-permalink::before, h4 .docs-heading-anchor-permalink::before, h5 .docs-heading-anchor-permalink::before, h6 .docs-heading-anchor-permalink::before { - font-family: "Font Awesome 5 Free"; - font-weight: 900; - content: "\f0c1"; } - -h1:hover .docs-heading-anchor-permalink, h2:hover .docs-heading-anchor-permalink, h3:hover .docs-heading-anchor-permalink, h4:hover .docs-heading-anchor-permalink, h5:hover .docs-heading-anchor-permalink, h6:hover .docs-heading-anchor-permalink { - visibility: visible; } - -.docs-dark-only { - display: none !important; } - -pre { - position: relative; - overflow: hidden; } - pre code, pre code.hljs { - padding: 0 0.75rem !important; - overflow: auto; - display: block; } - pre code:first-of-type, pre code.hljs:first-of-type { - padding-top: 0.5rem !important; } - pre code:last-of-type, pre code.hljs:last-of-type { - padding-bottom: 0.5rem !important; } - pre .copy-button { - opacity: 0.2; - transition: opacity 0.2s; - position: absolute; - right: 0em; - top: 0em; - padding: 0.5em; - width: 2.5em; - height: 2.5em; - background: transparent; - border: none; - font-family: "Font Awesome 5 Free"; - color: #222222; - cursor: pointer; - text-align: center; } - pre .copy-button:focus, pre .copy-button:hover { - opacity: 1; - background: rgba(34, 34, 34, 0.1); - color: #2e63b8; } - pre .copy-button.success { - color: #259a12; - opacity: 1; } - pre .copy-button.error { - color: #cb3c33; - opacity: 1; } - pre:hover .copy-button { - opacity: 1; } - -.admonition { - background-color: #b5b5b5; - border-style: solid; - border-width: 1px; - border-color: #363636; - border-radius: 4px; - font-size: 1rem; } - .admonition strong { - color: currentColor; } - .admonition.is-small, #documenter .docs-sidebar form.docs-search > input.admonition { - font-size: 0.75rem; } - .admonition.is-medium { - font-size: 1.25rem; } - .admonition.is-large { - font-size: 1.5rem; } - .admonition.is-default { - background-color: #b5b5b5; - border-color: #363636; } - .admonition.is-default > .admonition-header { - background-color: #363636; - color: #fff; } - .admonition.is-default > .admonition-body { - color: #fff; } - .admonition.is-info { - background-color: #def0fc; - border-color: #209cee; } - .admonition.is-info > .admonition-header { - background-color: #209cee; - color: #fff; } - .admonition.is-info > .admonition-body { - color: rgba(0, 0, 0, 0.7); } - .admonition.is-success { - background-color: #bdf4d1; - border-color: #22c35b; } - .admonition.is-success > .admonition-header { - background-color: #22c35b; - color: #fff; } - .admonition.is-success > .admonition-body { - color: rgba(0, 0, 0, 0.7); } - .admonition.is-warning { - background-color: #fff3c5; - border-color: #ffdd57; } - .admonition.is-warning > .admonition-header { - background-color: #ffdd57; - color: rgba(0, 0, 0, 0.7); } - .admonition.is-warning > .admonition-body { - color: rgba(0, 0, 0, 0.7); } - .admonition.is-danger { - background-color: #ffaba7; - border-color: #da0b00; } - .admonition.is-danger > .admonition-header { - background-color: #da0b00; - color: #fff; } - .admonition.is-danger > .admonition-body { - color: rgba(0, 0, 0, 0.7); } - .admonition.is-compat { - background-color: #bdeff5; - border-color: #1db5c9; } - .admonition.is-compat > .admonition-header { - background-color: #1db5c9; - color: #fff; } - .admonition.is-compat > .admonition-body { - color: rgba(0, 0, 0, 0.7); } - -.admonition-header { - color: #fff; - background-color: #363636; - align-items: center; - font-weight: 700; - justify-content: space-between; - line-height: 1.25; - padding: 0.5rem 0.75rem; - position: relative; } - .admonition-header:before { - font-family: "Font Awesome 5 Free"; - font-weight: 900; - margin-right: 0.75rem; - content: "\f06a"; } - -.admonition-body { - color: #222222; - padding: 0.5rem 0.75rem; } - .admonition-body pre { - background-color: whitesmoke; } - .admonition-body code { - background-color: rgba(0, 0, 0, 0.05); } - -.docstring { - margin-bottom: 1em; - background-color: transparent; - border: 1px solid #dbdbdb; - box-shadow: 2px 2px 3px rgba(10, 10, 10, 0.1); - max-width: 100%; } - .docstring > header { - display: flex; - flex-grow: 1; - align-items: stretch; - padding: 0.5rem 0.75rem; - background-color: whitesmoke; - box-shadow: 0 1px 2px rgba(10, 10, 10, 0.1); - box-shadow: none; - border-bottom: 1px solid #dbdbdb; } - .docstring > header code { - background-color: transparent; } - .docstring > header .docstring-binding { - margin-right: 0.3em; } - .docstring > header .docstring-category { - margin-left: 0.3em; } - .docstring > section { - position: relative; - padding: 0.75rem 0.75rem; - border-bottom: 1px solid #dbdbdb; } - .docstring > section:last-child { - border-bottom: none; } - .docstring > section > a.docs-sourcelink { - transition: opacity 0.3s; - opacity: 0; - position: absolute; - right: 0.375rem; - bottom: 0.375rem; } - .docstring > section > a.docs-sourcelink:focus { - opacity: 1 !important; } - .docstring:hover > section > a.docs-sourcelink { - opacity: 0.2; } - .docstring:focus-within > section > a.docs-sourcelink { - opacity: 0.2; } - .docstring > section:hover a.docs-sourcelink { - opacity: 1; } - -.documenter-example-output { - background-color: white; } - -.outdated-warning-overlay { - position: fixed; - top: 0; - left: 0; - right: 0; - box-shadow: 0 0 10px rgba(0, 0, 0, 0.3); - z-index: 999; - background-color: #ffaba7; - color: rgba(0, 0, 0, 0.7); - border-bottom: 3px solid #da0b00; - padding: 10px 35px; - text-align: center; - font-size: 15px; } - .outdated-warning-overlay .outdated-warning-closer { - position: absolute; - top: calc(50% - 10px); - right: 18px; - cursor: pointer; - width: 12px; } - .outdated-warning-overlay a { - color: #2e63b8; } - .outdated-warning-overlay a:hover { - color: #363636; } - -.content pre { - border: 1px solid #dbdbdb; } - -.content code { - font-weight: inherit; } - -.content a code { - color: #2e63b8; } - -.content h1 code, .content h2 code, .content h3 code, .content h4 code, .content h5 code, .content h6 code { - color: #222222; } - -.content table { - display: block; - width: initial; - max-width: 100%; - overflow-x: auto; } - -.content blockquote > ul:first-child, .content blockquote > ol:first-child, .content .admonition-body > ul:first-child, .content .admonition-body > ol:first-child { - margin-top: 0; } - -pre, code { - font-variant-ligatures: no-contextual; } - -.breadcrumb a.is-disabled { - cursor: default; - pointer-events: none; } - .breadcrumb a.is-disabled, .breadcrumb a.is-disabled:hover { - color: #222222; } - -.hljs { - background: initial !important; } - -.katex .katex-mathml { - top: 0; - right: 0; } - -.katex-display, mjx-container, .MathJax_Display { - margin: 0.5em 0 !important; } - -html { - -moz-osx-font-smoothing: auto; - -webkit-font-smoothing: auto; } - -li.no-marker { - list-style: none; } - -/* This file contain the overall layout. - * - * The main container is
that is identified by id #documenter. - */ -#documenter .docs-main > article { - overflow-wrap: break-word; } - #documenter .docs-main > article .math-container { - overflow-x: auto; - overflow-y: hidden; } - -@media screen and (min-width: 1056px) { - #documenter .docs-main { - max-width: 52rem; - margin-left: 20rem; - padding-right: 1rem; } } - -@media screen and (max-width: 1055px) { - #documenter .docs-main { - width: 100%; } - #documenter .docs-main > article { - max-width: 52rem; - margin-left: auto; - margin-right: auto; - margin-bottom: 1rem; - padding: 0 1rem; } - #documenter .docs-main > header, #documenter .docs-main > nav { - max-width: 100%; - width: 100%; - margin: 0; } } - -#documenter .docs-main header.docs-navbar { - background-color: white; - border-bottom: 1px solid #dbdbdb; - z-index: 2; - min-height: 4rem; - margin-bottom: 1rem; - display: flex; } - #documenter .docs-main header.docs-navbar .breadcrumb { - flex-grow: 1; } - #documenter .docs-main header.docs-navbar .docs-right { - display: flex; - white-space: nowrap; } - #documenter .docs-main header.docs-navbar .docs-right .docs-icon, #documenter .docs-main header.docs-navbar .docs-right .docs-label, #documenter .docs-main header.docs-navbar .docs-right .docs-sidebar-button { - display: inline-block; } - #documenter .docs-main header.docs-navbar .docs-right .docs-label { - padding: 0; - margin-left: 0.3em; } - #documenter .docs-main header.docs-navbar .docs-right .docs-settings-button { - margin: auto 0 auto 1rem; } - #documenter .docs-main header.docs-navbar .docs-right .docs-sidebar-button { - font-size: 1.5rem; - margin: auto 0 auto 1rem; } - #documenter .docs-main header.docs-navbar > * { - margin: auto 0; } - @media screen and (max-width: 1055px) { - #documenter .docs-main header.docs-navbar { - position: sticky; - top: 0; - padding: 0 1rem; - /* For Headroom.js */ - transition-property: top, box-shadow; - -webkit-transition-property: top, box-shadow; - /* Safari */ - transition-duration: 0.3s; - -webkit-transition-duration: 0.3s; - /* Safari */ } - #documenter .docs-main header.docs-navbar.headroom--not-top { - box-shadow: 0.2rem 0rem 0.4rem #bbb; - transition-duration: 0.7s; - -webkit-transition-duration: 0.7s; - /* Safari */ } - #documenter .docs-main header.docs-navbar.headroom--unpinned.headroom--not-top.headroom--not-bottom { - top: -4.5rem; - transition-duration: 0.7s; - -webkit-transition-duration: 0.7s; - /* Safari */ } } -#documenter .docs-main section.footnotes { - border-top: 1px solid #dbdbdb; } - #documenter .docs-main section.footnotes li .tag:first-child, #documenter .docs-main section.footnotes li .docstring > section > a.docs-sourcelink:first-child, #documenter .docs-main section.footnotes li .content kbd:first-child, .content #documenter .docs-main section.footnotes li kbd:first-child { - margin-right: 1em; - margin-bottom: 0.4em; } - -#documenter .docs-main .docs-footer { - display: flex; - flex-wrap: wrap; - margin-left: 0; - margin-right: 0; - border-top: 1px solid #dbdbdb; - padding-top: 1rem; - padding-bottom: 1rem; } - @media screen and (max-width: 1055px) { - #documenter .docs-main .docs-footer { - padding-left: 1rem; - padding-right: 1rem; } } - #documenter .docs-main .docs-footer .docs-footer-nextpage, #documenter .docs-main .docs-footer .docs-footer-prevpage { - flex-grow: 1; } - #documenter .docs-main .docs-footer .docs-footer-nextpage { - text-align: right; } - #documenter .docs-main .docs-footer .flexbox-break { - flex-basis: 100%; - height: 0; } - #documenter .docs-main .docs-footer .footer-message { - font-size: 0.8em; - margin: 0.5em auto 0 auto; - text-align: center; } - -#documenter .docs-sidebar { - display: flex; - flex-direction: column; - color: #0a0a0a; - background-color: whitesmoke; - border-right: 1px solid #dbdbdb; - padding: 0; - flex: 0 0 18rem; - z-index: 5; - font-size: 1rem; - position: fixed; - left: -18rem; - width: 18rem; - height: 100%; - transition: left 0.3s; - /* Setting up a nicer theme style for the scrollbar */ } - #documenter .docs-sidebar.visible { - left: 0; - box-shadow: 0.4rem 0rem 0.8rem #bbb; } - @media screen and (min-width: 1056px) { - #documenter .docs-sidebar.visible { - box-shadow: none; } } - @media screen and (min-width: 1056px) { - #documenter .docs-sidebar { - left: 0; - top: 0; } } - #documenter .docs-sidebar .docs-logo { - margin-top: 1rem; - padding: 0 1rem; } - #documenter .docs-sidebar .docs-logo > img { - max-height: 6rem; - margin: auto; } - #documenter .docs-sidebar .docs-package-name { - flex-shrink: 0; - font-size: 1.5rem; - font-weight: 700; - text-align: center; - white-space: nowrap; - overflow: hidden; - padding: 0.5rem 0; } - #documenter .docs-sidebar .docs-package-name .docs-autofit { - max-width: 16.2rem; } - #documenter .docs-sidebar .docs-package-name a, #documenter .docs-sidebar .docs-package-name a:hover { - color: #0a0a0a; } - #documenter .docs-sidebar .docs-version-selector { - border-top: 1px solid #dbdbdb; - display: none; - padding: 0.5rem; } - #documenter .docs-sidebar .docs-version-selector.visible { - display: flex; } - #documenter .docs-sidebar ul.docs-menu { - flex-grow: 1; - user-select: none; - border-top: 1px solid #dbdbdb; - padding-bottom: 1.5rem; - /* Managing collapsible submenus */ } - #documenter .docs-sidebar ul.docs-menu > li > .tocitem { - font-weight: bold; } - #documenter .docs-sidebar ul.docs-menu > li li { - font-size: 0.95rem; - margin-left: 1em; - border-left: 1px solid #dbdbdb; } - #documenter .docs-sidebar ul.docs-menu input.collapse-toggle { - display: none; } - #documenter .docs-sidebar ul.docs-menu ul.collapsed { - display: none; } - #documenter .docs-sidebar ul.docs-menu input:checked ~ ul.collapsed { - display: block; } - #documenter .docs-sidebar ul.docs-menu label.tocitem { - display: flex; } - #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-label { - flex-grow: 2; } - #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron { - display: inline-block; - font-style: normal; - font-variant: normal; - text-rendering: auto; - line-height: 1; - font-size: 0.75rem; - margin-left: 1rem; - margin-top: auto; - margin-bottom: auto; } - #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron::before { - font-family: "Font Awesome 5 Free"; - font-weight: 900; - content: "\f054"; } - #documenter .docs-sidebar ul.docs-menu input:checked ~ label.tocitem .docs-chevron::before { - content: "\f078"; } - #documenter .docs-sidebar ul.docs-menu .tocitem { - display: block; - padding: 0.5rem 0.5rem; } - #documenter .docs-sidebar ul.docs-menu .tocitem, #documenter .docs-sidebar ul.docs-menu .tocitem:hover { - color: #0a0a0a; - background: whitesmoke; } - #documenter .docs-sidebar ul.docs-menu a.tocitem:hover, #documenter .docs-sidebar ul.docs-menu label.tocitem:hover { - color: #0a0a0a; - background-color: #ebebeb; } - #documenter .docs-sidebar ul.docs-menu li.is-active { - border-top: 1px solid #dbdbdb; - border-bottom: 1px solid #dbdbdb; - background-color: white; } - #documenter .docs-sidebar ul.docs-menu li.is-active .tocitem, #documenter .docs-sidebar ul.docs-menu li.is-active .tocitem:hover { - background-color: white; - color: #0a0a0a; } - #documenter .docs-sidebar ul.docs-menu li.is-active ul.internal .tocitem:hover { - background-color: #ebebeb; - color: #0a0a0a; } - #documenter .docs-sidebar ul.docs-menu > li.is-active:first-child { - border-top: none; } - #documenter .docs-sidebar ul.docs-menu ul.internal { - margin: 0 0.5rem 0.5rem; - border-top: 1px solid #dbdbdb; } - #documenter .docs-sidebar ul.docs-menu ul.internal li { - font-size: 0.85rem; - border-left: none; - margin-left: 0; - margin-top: 0.5rem; } - #documenter .docs-sidebar ul.docs-menu ul.internal .tocitem { - width: 100%; - padding: 0; } - #documenter .docs-sidebar ul.docs-menu ul.internal .tocitem::before { - content: "⚬"; - margin-right: 0.4em; } - #documenter .docs-sidebar form.docs-search { - margin: auto; - margin-top: 0.5rem; - margin-bottom: 0.5rem; } - #documenter .docs-sidebar form.docs-search > input { - width: 14.4rem; } - @media screen and (min-width: 1056px) { - #documenter .docs-sidebar ul.docs-menu { - overflow-y: auto; - -webkit-overflow-scroll: touch; } - #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar { - width: .3rem; - background: none; } - #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb { - border-radius: 5px 0px 0px 5px; - background: #e0e0e0; } - #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb:hover { - background: #cccccc; } } - @media screen and (max-width: 1055px) { - #documenter .docs-sidebar { - overflow-y: auto; - -webkit-overflow-scroll: touch; } - #documenter .docs-sidebar::-webkit-scrollbar { - width: .3rem; - background: none; } - #documenter .docs-sidebar::-webkit-scrollbar-thumb { - border-radius: 5px 0px 0px 5px; - background: #e0e0e0; } - #documenter .docs-sidebar::-webkit-scrollbar-thumb:hover { - background: #cccccc; } } -#documenter .docs-main #documenter-search-info { - margin-bottom: 1rem; } - -#documenter .docs-main #documenter-search-results { - list-style-type: circle; - list-style-position: outside; } - #documenter .docs-main #documenter-search-results li { - margin-left: 2rem; } - #documenter .docs-main #documenter-search-results .docs-highlight { - background-color: yellow; } - -.ansi span.sgr1 { - font-weight: bolder; } - -.ansi span.sgr2 { - font-weight: lighter; } - -.ansi span.sgr3 { - font-style: italic; } - -.ansi span.sgr4 { - text-decoration: underline; } - -.ansi span.sgr7 { - color: white; - background-color: #222222; } - -.ansi span.sgr8 { - color: transparent; } - .ansi span.sgr8 span { - color: transparent; } - -.ansi span.sgr9 { - text-decoration: line-through; } - -.ansi span.sgr30 { - color: #242424; } - -.ansi span.sgr31 { - color: #a7201f; } - -.ansi span.sgr32 { - color: #066f00; } - -.ansi span.sgr33 { - color: #856b00; } - -.ansi span.sgr34 { - color: #2149b0; } - -.ansi span.sgr35 { - color: #7d4498; } - -.ansi span.sgr36 { - color: #007989; } - -.ansi span.sgr37 { - color: gray; } - -.ansi span.sgr40 { - background-color: #242424; } - -.ansi span.sgr41 { - background-color: #a7201f; } - -.ansi span.sgr42 { - background-color: #066f00; } - -.ansi span.sgr43 { - background-color: #856b00; } - -.ansi span.sgr44 { - background-color: #2149b0; } - -.ansi span.sgr45 { - background-color: #7d4498; } - -.ansi span.sgr46 { - background-color: #007989; } - -.ansi span.sgr47 { - background-color: gray; } - -.ansi span.sgr90 { - color: #616161; } - -.ansi span.sgr91 { - color: #cb3c33; } - -.ansi span.sgr92 { - color: #0e8300; } - -.ansi span.sgr93 { - color: #a98800; } - -.ansi span.sgr94 { - color: #3c5dcd; } - -.ansi span.sgr95 { - color: #9256af; } - -.ansi span.sgr96 { - color: #008fa3; } - -.ansi span.sgr97 { - color: whitesmoke; } - -.ansi span.sgr100 { - background-color: #616161; } - -.ansi span.sgr101 { - background-color: #cb3c33; } - -.ansi span.sgr102 { - background-color: #0e8300; } - -.ansi span.sgr103 { - background-color: #a98800; } - -.ansi span.sgr104 { - background-color: #3c5dcd; } - -.ansi span.sgr105 { - background-color: #9256af; } - -.ansi span.sgr106 { - background-color: #008fa3; } - -.ansi span.sgr107 { - background-color: whitesmoke; } - -code.language-julia-repl > span.hljs-meta { - color: #066f00; - font-weight: bolder; } - -/*! +@keyframes spinAround{from{transform:rotate(0deg)}to{transform:rotate(359deg)}}.tabs,.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis,.breadcrumb,.file,.button,.is-unselectable,.modal-close,.delete{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.navbar-link:not(.is-arrowless)::after,.select:not(.is-multiple):not(.is-loading)::after{border:3px solid rgba(0,0,0,0);border-radius:2px;border-right:0;border-top:0;content:" ";display:block;height:0.625em;margin-top:-0.4375em;pointer-events:none;position:absolute;top:50%;transform:rotate(-45deg);transform-origin:center;width:0.625em}.admonition:not(:last-child),.tabs:not(:last-child),.message:not(:last-child),.list:not(:last-child),.level:not(:last-child),.breadcrumb:not(:last-child),.highlight:not(:last-child),.block:not(:last-child),.title:not(:last-child),.subtitle:not(:last-child),.table-container:not(:last-child),.table:not(:last-child),.progress:not(:last-child),.notification:not(:last-child),.content:not(:last-child),.box:not(:last-child){margin-bottom:1.5rem}.modal-close,.delete{-moz-appearance:none;-webkit-appearance:none;background-color:rgba(10,10,10,0.2);border:none;border-radius:290486px;cursor:pointer;pointer-events:auto;display:inline-block;flex-grow:0;flex-shrink:0;font-size:0;height:20px;max-height:20px;max-width:20px;min-height:20px;min-width:20px;outline:none;position:relative;vertical-align:top;width:20px}.modal-close::before,.delete::before,.modal-close::after,.delete::after{background-color:#fff;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.modal-close::before,.delete::before{height:2px;width:50%}.modal-close::after,.delete::after{height:50%;width:2px}.modal-close:hover,.delete:hover,.modal-close:focus,.delete:focus{background-color:rgba(10,10,10,0.3)}.modal-close:active,.delete:active{background-color:rgba(10,10,10,0.4)}.is-small.modal-close,#documenter .docs-sidebar form.docs-search>input.modal-close,.is-small.delete,#documenter .docs-sidebar form.docs-search>input.delete{height:16px;max-height:16px;max-width:16px;min-height:16px;min-width:16px;width:16px}.is-medium.modal-close,.is-medium.delete{height:24px;max-height:24px;max-width:24px;min-height:24px;min-width:24px;width:24px}.is-large.modal-close,.is-large.delete{height:32px;max-height:32px;max-width:32px;min-height:32px;min-width:32px;width:32px}.control.is-loading::after,.select.is-loading::after,.loader,.button.is-loading::after{animation:spinAround 500ms infinite linear;border:2px solid #dbdbdb;border-radius:290486px;border-right-color:transparent;border-top-color:transparent;content:"";display:block;height:1em;position:relative;width:1em}.hero-video,.modal-background,.modal,.image.is-square img,#documenter .docs-sidebar .docs-logo>img.is-square img,.image.is-square .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,.image.is-1by1 img,#documenter .docs-sidebar .docs-logo>img.is-1by1 img,.image.is-1by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,.image.is-5by4 img,#documenter .docs-sidebar .docs-logo>img.is-5by4 img,.image.is-5by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,.image.is-4by3 img,#documenter .docs-sidebar .docs-logo>img.is-4by3 img,.image.is-4by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,.image.is-3by2 img,#documenter .docs-sidebar .docs-logo>img.is-3by2 img,.image.is-3by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,.image.is-5by3 img,#documenter .docs-sidebar .docs-logo>img.is-5by3 img,.image.is-5by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,.image.is-16by9 img,#documenter .docs-sidebar .docs-logo>img.is-16by9 img,.image.is-16by9 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,.image.is-2by1 img,#documenter .docs-sidebar .docs-logo>img.is-2by1 img,.image.is-2by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,.image.is-3by1 img,#documenter .docs-sidebar .docs-logo>img.is-3by1 img,.image.is-3by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,.image.is-4by5 img,#documenter .docs-sidebar .docs-logo>img.is-4by5 img,.image.is-4by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,.image.is-3by4 img,#documenter .docs-sidebar .docs-logo>img.is-3by4 img,.image.is-3by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,.image.is-2by3 img,#documenter .docs-sidebar .docs-logo>img.is-2by3 img,.image.is-2by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,.image.is-3by5 img,#documenter .docs-sidebar .docs-logo>img.is-3by5 img,.image.is-3by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,.image.is-9by16 img,#documenter .docs-sidebar .docs-logo>img.is-9by16 img,.image.is-9by16 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,.image.is-1by2 img,#documenter .docs-sidebar .docs-logo>img.is-1by2 img,.image.is-1by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,.image.is-1by3 img,#documenter .docs-sidebar .docs-logo>img.is-1by3 img,.image.is-1by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio,.is-overlay{bottom:0;left:0;position:absolute;right:0;top:0}.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis,.file-cta,.file-name,.select select,.textarea,.input,#documenter .docs-sidebar form.docs-search>input,.button{-moz-appearance:none;-webkit-appearance:none;align-items:center;border:1px solid transparent;border-radius:4px;box-shadow:none;display:inline-flex;font-size:1rem;height:2.25em;justify-content:flex-start;line-height:1.5;padding-bottom:calc(0.375em - 1px);padding-left:calc(0.625em - 1px);padding-right:calc(0.625em - 1px);padding-top:calc(0.375em - 1px);position:relative;vertical-align:top}.pagination-previous:focus,.pagination-next:focus,.pagination-link:focus,.pagination-ellipsis:focus,.file-cta:focus,.file-name:focus,.select select:focus,.textarea:focus,.input:focus,#documenter .docs-sidebar form.docs-search>input:focus,.button:focus,.is-focused.pagination-previous,.is-focused.pagination-next,.is-focused.pagination-link,.is-focused.pagination-ellipsis,.is-focused.file-cta,.is-focused.file-name,.select select.is-focused,.is-focused.textarea,.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-focused.button,.pagination-previous:active,.pagination-next:active,.pagination-link:active,.pagination-ellipsis:active,.file-cta:active,.file-name:active,.select select:active,.textarea:active,.input:active,#documenter .docs-sidebar form.docs-search>input:active,.button:active,.is-active.pagination-previous,.is-active.pagination-next,.is-active.pagination-link,.is-active.pagination-ellipsis,.is-active.file-cta,.is-active.file-name,.select select.is-active,.is-active.textarea,.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active,.is-active.button{outline:none}.pagination-previous[disabled],.pagination-next[disabled],.pagination-link[disabled],.pagination-ellipsis[disabled],.file-cta[disabled],.file-name[disabled],.select select[disabled],.textarea[disabled],.input[disabled],#documenter .docs-sidebar form.docs-search>input[disabled],.button[disabled],fieldset[disabled] .pagination-previous,fieldset[disabled] .pagination-next,fieldset[disabled] .pagination-link,fieldset[disabled] .pagination-ellipsis,fieldset[disabled] .file-cta,fieldset[disabled] .file-name,fieldset[disabled] .select select,.select fieldset[disabled] select,fieldset[disabled] .textarea,fieldset[disabled] .input,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input,fieldset[disabled] .button{cursor:not-allowed}/*! minireset.css v0.0.4 | MIT License | github.com/jgthms/minireset.css */html,body,p,ol,ul,li,dl,dt,dd,blockquote,figure,fieldset,legend,textarea,pre,iframe,hr,h1,h2,h3,h4,h5,h6{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}ul{list-style:none}button,input,select,textarea{margin:0}html{box-sizing:border-box}*,*::before,*::after{box-sizing:inherit}img,embed,iframe,object,video{height:auto;max-width:100%}audio{max-width:100%}iframe{border:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}td:not([align]),th:not([align]){text-align:left}html{background-color:#fff;font-size:16px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;min-width:300px;overflow-x:auto;overflow-y:scroll;text-rendering:optimizeLegibility;text-size-adjust:100%}article,aside,figure,footer,header,hgroup,section{display:block}body,button,input,select,textarea{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif}code,pre{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto;font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace}body{color:#222;font-size:1em;font-weight:400;line-height:1.5}a{color:#2e63b8;cursor:pointer;text-decoration:none}a strong{color:currentColor}a:hover{color:#363636}code{background-color:rgba(0,0,0,0.05);color:#000;font-size:.875em;font-weight:normal;padding:.1em}hr{background-color:#f5f5f5;border:none;display:block;height:2px;margin:1.5rem 0}img{height:auto;max-width:100%}input[type="checkbox"],input[type="radio"]{vertical-align:baseline}small{font-size:.875em}span{font-style:inherit;font-weight:inherit}strong{color:#222;font-weight:700}fieldset{border:none}pre{-webkit-overflow-scrolling:touch;background-color:#f5f5f5;color:#222;font-size:.875em;overflow-x:auto;padding:1.25rem 1.5rem;white-space:pre;word-wrap:normal}pre code{background-color:transparent;color:currentColor;font-size:1em;padding:0}table td,table th{vertical-align:top}table td:not([align]),table th:not([align]){text-align:left}table th{color:#222}.is-clearfix::after{clear:both;content:" ";display:table}.is-pulled-left{float:left !important}.is-pulled-right{float:right !important}.is-clipped{overflow:hidden !important}.is-size-1{font-size:3rem !important}.is-size-2{font-size:2.5rem !important}.is-size-3{font-size:2rem !important}.is-size-4{font-size:1.5rem !important}.is-size-5{font-size:1.25rem !important}.is-size-6{font-size:1rem !important}.is-size-7,.docstring>section>a.docs-sourcelink{font-size:.75rem !important}@media screen and (max-width: 768px){.is-size-1-mobile{font-size:3rem !important}.is-size-2-mobile{font-size:2.5rem !important}.is-size-3-mobile{font-size:2rem !important}.is-size-4-mobile{font-size:1.5rem !important}.is-size-5-mobile{font-size:1.25rem !important}.is-size-6-mobile{font-size:1rem !important}.is-size-7-mobile{font-size:.75rem !important}}@media screen and (min-width: 769px),print{.is-size-1-tablet{font-size:3rem !important}.is-size-2-tablet{font-size:2.5rem !important}.is-size-3-tablet{font-size:2rem !important}.is-size-4-tablet{font-size:1.5rem !important}.is-size-5-tablet{font-size:1.25rem !important}.is-size-6-tablet{font-size:1rem !important}.is-size-7-tablet{font-size:.75rem !important}}@media screen and (max-width: 1055px){.is-size-1-touch{font-size:3rem !important}.is-size-2-touch{font-size:2.5rem !important}.is-size-3-touch{font-size:2rem !important}.is-size-4-touch{font-size:1.5rem !important}.is-size-5-touch{font-size:1.25rem !important}.is-size-6-touch{font-size:1rem !important}.is-size-7-touch{font-size:.75rem !important}}@media screen and (min-width: 1056px){.is-size-1-desktop{font-size:3rem !important}.is-size-2-desktop{font-size:2.5rem !important}.is-size-3-desktop{font-size:2rem !important}.is-size-4-desktop{font-size:1.5rem !important}.is-size-5-desktop{font-size:1.25rem !important}.is-size-6-desktop{font-size:1rem !important}.is-size-7-desktop{font-size:.75rem !important}}@media screen and (min-width: 1216px){.is-size-1-widescreen{font-size:3rem !important}.is-size-2-widescreen{font-size:2.5rem !important}.is-size-3-widescreen{font-size:2rem !important}.is-size-4-widescreen{font-size:1.5rem !important}.is-size-5-widescreen{font-size:1.25rem !important}.is-size-6-widescreen{font-size:1rem !important}.is-size-7-widescreen{font-size:.75rem !important}}@media screen and (min-width: 1408px){.is-size-1-fullhd{font-size:3rem !important}.is-size-2-fullhd{font-size:2.5rem !important}.is-size-3-fullhd{font-size:2rem !important}.is-size-4-fullhd{font-size:1.5rem !important}.is-size-5-fullhd{font-size:1.25rem !important}.is-size-6-fullhd{font-size:1rem !important}.is-size-7-fullhd{font-size:.75rem !important}}.has-text-centered{text-align:center !important}.has-text-justified{text-align:justify !important}.has-text-left{text-align:left !important}.has-text-right{text-align:right !important}@media screen and (max-width: 768px){.has-text-centered-mobile{text-align:center !important}}@media screen and (min-width: 769px),print{.has-text-centered-tablet{text-align:center !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-centered-tablet-only{text-align:center !important}}@media screen and (max-width: 1055px){.has-text-centered-touch{text-align:center !important}}@media screen and (min-width: 1056px){.has-text-centered-desktop{text-align:center !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-centered-desktop-only{text-align:center !important}}@media screen and (min-width: 1216px){.has-text-centered-widescreen{text-align:center !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-centered-widescreen-only{text-align:center !important}}@media screen and (min-width: 1408px){.has-text-centered-fullhd{text-align:center !important}}@media screen and (max-width: 768px){.has-text-justified-mobile{text-align:justify !important}}@media screen and (min-width: 769px),print{.has-text-justified-tablet{text-align:justify !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-justified-tablet-only{text-align:justify !important}}@media screen and (max-width: 1055px){.has-text-justified-touch{text-align:justify !important}}@media screen and (min-width: 1056px){.has-text-justified-desktop{text-align:justify !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-justified-desktop-only{text-align:justify !important}}@media screen and (min-width: 1216px){.has-text-justified-widescreen{text-align:justify !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-justified-widescreen-only{text-align:justify !important}}@media screen and (min-width: 1408px){.has-text-justified-fullhd{text-align:justify !important}}@media screen and (max-width: 768px){.has-text-left-mobile{text-align:left !important}}@media screen and (min-width: 769px),print{.has-text-left-tablet{text-align:left !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-left-tablet-only{text-align:left !important}}@media screen and (max-width: 1055px){.has-text-left-touch{text-align:left !important}}@media screen and (min-width: 1056px){.has-text-left-desktop{text-align:left !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-left-desktop-only{text-align:left !important}}@media screen and (min-width: 1216px){.has-text-left-widescreen{text-align:left !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-left-widescreen-only{text-align:left !important}}@media screen and (min-width: 1408px){.has-text-left-fullhd{text-align:left !important}}@media screen and (max-width: 768px){.has-text-right-mobile{text-align:right !important}}@media screen and (min-width: 769px),print{.has-text-right-tablet{text-align:right !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-right-tablet-only{text-align:right !important}}@media screen and (max-width: 1055px){.has-text-right-touch{text-align:right !important}}@media screen and (min-width: 1056px){.has-text-right-desktop{text-align:right !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-right-desktop-only{text-align:right !important}}@media screen and (min-width: 1216px){.has-text-right-widescreen{text-align:right !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-right-widescreen-only{text-align:right !important}}@media screen and (min-width: 1408px){.has-text-right-fullhd{text-align:right !important}}.is-capitalized{text-transform:capitalize !important}.is-lowercase{text-transform:lowercase !important}.is-uppercase{text-transform:uppercase !important}.is-italic{font-style:italic !important}.has-text-white{color:#fff !important}a.has-text-white:hover,a.has-text-white:focus{color:#e6e6e6 !important}.has-background-white{background-color:#fff !important}.has-text-black{color:#0a0a0a !important}a.has-text-black:hover,a.has-text-black:focus{color:#000 !important}.has-background-black{background-color:#0a0a0a !important}.has-text-light{color:#f5f5f5 !important}a.has-text-light:hover,a.has-text-light:focus{color:#dbdbdb !important}.has-background-light{background-color:#f5f5f5 !important}.has-text-dark{color:#363636 !important}a.has-text-dark:hover,a.has-text-dark:focus{color:#1c1c1c !important}.has-background-dark{background-color:#363636 !important}.has-text-primary{color:#4eb5de !important}a.has-text-primary:hover,a.has-text-primary:focus{color:#27a1d2 !important}.has-background-primary{background-color:#4eb5de !important}.has-text-link{color:#2e63b8 !important}a.has-text-link:hover,a.has-text-link:focus{color:#244d8f !important}.has-background-link{background-color:#2e63b8 !important}.has-text-info{color:#209cee !important}a.has-text-info:hover,a.has-text-info:focus{color:#1081cb !important}.has-background-info{background-color:#209cee !important}.has-text-success{color:#22c35b !important}a.has-text-success:hover,a.has-text-success:focus{color:#1a9847 !important}.has-background-success{background-color:#22c35b !important}.has-text-warning{color:#ffdd57 !important}a.has-text-warning:hover,a.has-text-warning:focus{color:#ffd324 !important}.has-background-warning{background-color:#ffdd57 !important}.has-text-danger{color:#da0b00 !important}a.has-text-danger:hover,a.has-text-danger:focus{color:#a70800 !important}.has-background-danger{background-color:#da0b00 !important}.has-text-black-bis{color:#121212 !important}.has-background-black-bis{background-color:#121212 !important}.has-text-black-ter{color:#242424 !important}.has-background-black-ter{background-color:#242424 !important}.has-text-grey-darker{color:#363636 !important}.has-background-grey-darker{background-color:#363636 !important}.has-text-grey-dark{color:#4a4a4a !important}.has-background-grey-dark{background-color:#4a4a4a !important}.has-text-grey{color:#6b6b6b !important}.has-background-grey{background-color:#6b6b6b !important}.has-text-grey-light{color:#b5b5b5 !important}.has-background-grey-light{background-color:#b5b5b5 !important}.has-text-grey-lighter{color:#dbdbdb !important}.has-background-grey-lighter{background-color:#dbdbdb !important}.has-text-white-ter{color:#f5f5f5 !important}.has-background-white-ter{background-color:#f5f5f5 !important}.has-text-white-bis{color:#fafafa !important}.has-background-white-bis{background-color:#fafafa !important}.has-text-weight-light{font-weight:300 !important}.has-text-weight-normal{font-weight:400 !important}.has-text-weight-medium{font-weight:500 !important}.has-text-weight-semibold{font-weight:600 !important}.has-text-weight-bold{font-weight:700 !important}.is-family-primary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-secondary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-sans-serif{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-monospace{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-family-code{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-block{display:block !important}@media screen and (max-width: 768px){.is-block-mobile{display:block !important}}@media screen and (min-width: 769px),print{.is-block-tablet{display:block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-block-tablet-only{display:block !important}}@media screen and (max-width: 1055px){.is-block-touch{display:block !important}}@media screen and (min-width: 1056px){.is-block-desktop{display:block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-block-desktop-only{display:block !important}}@media screen and (min-width: 1216px){.is-block-widescreen{display:block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-block-widescreen-only{display:block !important}}@media screen and (min-width: 1408px){.is-block-fullhd{display:block !important}}.is-flex{display:flex !important}@media screen and (max-width: 768px){.is-flex-mobile{display:flex !important}}@media screen and (min-width: 769px),print{.is-flex-tablet{display:flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-flex-tablet-only{display:flex !important}}@media screen and (max-width: 1055px){.is-flex-touch{display:flex !important}}@media screen and (min-width: 1056px){.is-flex-desktop{display:flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-flex-desktop-only{display:flex !important}}@media screen and (min-width: 1216px){.is-flex-widescreen{display:flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-flex-widescreen-only{display:flex !important}}@media screen and (min-width: 1408px){.is-flex-fullhd{display:flex !important}}.is-inline{display:inline !important}@media screen and (max-width: 768px){.is-inline-mobile{display:inline !important}}@media screen and (min-width: 769px),print{.is-inline-tablet{display:inline !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-tablet-only{display:inline !important}}@media screen and (max-width: 1055px){.is-inline-touch{display:inline !important}}@media screen and (min-width: 1056px){.is-inline-desktop{display:inline !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-desktop-only{display:inline !important}}@media screen and (min-width: 1216px){.is-inline-widescreen{display:inline !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-widescreen-only{display:inline !important}}@media screen and (min-width: 1408px){.is-inline-fullhd{display:inline !important}}.is-inline-block{display:inline-block !important}@media screen and (max-width: 768px){.is-inline-block-mobile{display:inline-block !important}}@media screen and (min-width: 769px),print{.is-inline-block-tablet{display:inline-block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-block-tablet-only{display:inline-block !important}}@media screen and (max-width: 1055px){.is-inline-block-touch{display:inline-block !important}}@media screen and (min-width: 1056px){.is-inline-block-desktop{display:inline-block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-block-desktop-only{display:inline-block !important}}@media screen and (min-width: 1216px){.is-inline-block-widescreen{display:inline-block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-block-widescreen-only{display:inline-block !important}}@media screen and (min-width: 1408px){.is-inline-block-fullhd{display:inline-block !important}}.is-inline-flex{display:inline-flex !important}@media screen and (max-width: 768px){.is-inline-flex-mobile{display:inline-flex !important}}@media screen and (min-width: 769px),print{.is-inline-flex-tablet{display:inline-flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-flex-tablet-only{display:inline-flex !important}}@media screen and (max-width: 1055px){.is-inline-flex-touch{display:inline-flex !important}}@media screen and (min-width: 1056px){.is-inline-flex-desktop{display:inline-flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-flex-desktop-only{display:inline-flex !important}}@media screen and (min-width: 1216px){.is-inline-flex-widescreen{display:inline-flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-flex-widescreen-only{display:inline-flex !important}}@media screen and (min-width: 1408px){.is-inline-flex-fullhd{display:inline-flex !important}}.is-hidden{display:none !important}.is-sr-only{border:none !important;clip:rect(0, 0, 0, 0) !important;height:0.01em !important;overflow:hidden !important;padding:0 !important;position:absolute !important;white-space:nowrap !important;width:0.01em !important}@media screen and (max-width: 768px){.is-hidden-mobile{display:none !important}}@media screen and (min-width: 769px),print{.is-hidden-tablet{display:none !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-hidden-tablet-only{display:none !important}}@media screen and (max-width: 1055px){.is-hidden-touch{display:none !important}}@media screen and (min-width: 1056px){.is-hidden-desktop{display:none !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-hidden-desktop-only{display:none !important}}@media screen and (min-width: 1216px){.is-hidden-widescreen{display:none !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-hidden-widescreen-only{display:none !important}}@media screen and (min-width: 1408px){.is-hidden-fullhd{display:none !important}}.is-invisible{visibility:hidden !important}@media screen and (max-width: 768px){.is-invisible-mobile{visibility:hidden !important}}@media screen and (min-width: 769px),print{.is-invisible-tablet{visibility:hidden !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-invisible-tablet-only{visibility:hidden !important}}@media screen and (max-width: 1055px){.is-invisible-touch{visibility:hidden !important}}@media screen and (min-width: 1056px){.is-invisible-desktop{visibility:hidden !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-invisible-desktop-only{visibility:hidden !important}}@media screen and (min-width: 1216px){.is-invisible-widescreen{visibility:hidden !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-invisible-widescreen-only{visibility:hidden !important}}@media screen and (min-width: 1408px){.is-invisible-fullhd{visibility:hidden !important}}.is-marginless{margin:0 !important}.is-paddingless{padding:0 !important}.is-radiusless{border-radius:0 !important}.is-shadowless{box-shadow:none !important}.is-relative{position:relative !important}.box{background-color:#fff;border-radius:6px;box-shadow:0 2px 3px rgba(10,10,10,0.1),0 0 0 1px rgba(10,10,10,0.1);color:#222;display:block;padding:1.25rem}a.box:hover,a.box:focus{box-shadow:0 2px 3px rgba(10,10,10,0.1),0 0 0 1px #2e63b8}a.box:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2),0 0 0 1px #2e63b8}.button{background-color:#fff;border-color:#dbdbdb;border-width:1px;color:#363636;cursor:pointer;justify-content:center;padding-bottom:calc(0.375em - 1px);padding-left:.75em;padding-right:.75em;padding-top:calc(0.375em - 1px);text-align:center;white-space:nowrap}.button strong{color:inherit}.button .icon,.button .icon.is-small,.button #documenter .docs-sidebar form.docs-search>input.icon,#documenter .docs-sidebar .button form.docs-search>input.icon,.button .icon.is-medium,.button .icon.is-large{height:1.5em;width:1.5em}.button .icon:first-child:not(:last-child){margin-left:calc(-0.375em - 1px);margin-right:0.1875em}.button .icon:last-child:not(:first-child){margin-left:0.1875em;margin-right:calc(-0.375em - 1px)}.button .icon:first-child:last-child{margin-left:calc(-0.375em - 1px);margin-right:calc(-0.375em - 1px)}.button:hover,.button.is-hovered{border-color:#b5b5b5;color:#363636}.button:focus,.button.is-focused{border-color:#3c5dcd;color:#363636}.button:focus:not(:active),.button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.button:active,.button.is-active{border-color:#4a4a4a;color:#363636}.button.is-text{background-color:transparent;border-color:transparent;color:#222;text-decoration:underline}.button.is-text:hover,.button.is-text.is-hovered,.button.is-text:focus,.button.is-text.is-focused{background-color:#f5f5f5;color:#222}.button.is-text:active,.button.is-text.is-active{background-color:#e8e8e8;color:#222}.button.is-text[disabled],fieldset[disabled] .button.is-text{background-color:transparent;border-color:transparent;box-shadow:none}.button.is-white{background-color:#fff;border-color:transparent;color:#0a0a0a}.button.is-white:hover,.button.is-white.is-hovered{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.button.is-white:focus,.button.is-white.is-focused{border-color:transparent;color:#0a0a0a}.button.is-white:focus:not(:active),.button.is-white.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}.button.is-white:active,.button.is-white.is-active{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.button.is-white[disabled],fieldset[disabled] .button.is-white{background-color:#fff;border-color:transparent;box-shadow:none}.button.is-white.is-inverted{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted:hover,.button.is-white.is-inverted.is-hovered{background-color:#000}.button.is-white.is-inverted[disabled],fieldset[disabled] .button.is-white.is-inverted{background-color:#0a0a0a;border-color:transparent;box-shadow:none;color:#fff}.button.is-white.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-white.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-white.is-outlined:hover,.button.is-white.is-outlined.is-hovered,.button.is-white.is-outlined:focus,.button.is-white.is-outlined.is-focused{background-color:#fff;border-color:#fff;color:#0a0a0a}.button.is-white.is-outlined.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-white.is-outlined.is-loading:hover::after,.button.is-white.is-outlined.is-loading.is-hovered::after,.button.is-white.is-outlined.is-loading:focus::after,.button.is-white.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-white.is-outlined[disabled],fieldset[disabled] .button.is-white.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-white.is-inverted.is-outlined:hover,.button.is-white.is-inverted.is-outlined.is-hovered,.button.is-white.is-inverted.is-outlined:focus,.button.is-white.is-inverted.is-outlined.is-focused{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted.is-outlined.is-loading:hover::after,.button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-white.is-inverted.is-outlined.is-loading:focus::after,.button.is-white.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-white.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black{background-color:#0a0a0a;border-color:transparent;color:#fff}.button.is-black:hover,.button.is-black.is-hovered{background-color:#040404;border-color:transparent;color:#fff}.button.is-black:focus,.button.is-black.is-focused{border-color:transparent;color:#fff}.button.is-black:focus:not(:active),.button.is-black.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}.button.is-black:active,.button.is-black.is-active{background-color:#000;border-color:transparent;color:#fff}.button.is-black[disabled],fieldset[disabled] .button.is-black{background-color:#0a0a0a;border-color:transparent;box-shadow:none}.button.is-black.is-inverted{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted:hover,.button.is-black.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-black.is-inverted[disabled],fieldset[disabled] .button.is-black.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#0a0a0a}.button.is-black.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-black.is-outlined:hover,.button.is-black.is-outlined.is-hovered,.button.is-black.is-outlined:focus,.button.is-black.is-outlined.is-focused{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.button.is-black.is-outlined.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-black.is-outlined.is-loading:hover::after,.button.is-black.is-outlined.is-loading.is-hovered::after,.button.is-black.is-outlined.is-loading:focus::after,.button.is-black.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-black.is-outlined[disabled],fieldset[disabled] .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-black.is-inverted.is-outlined:hover,.button.is-black.is-inverted.is-outlined.is-hovered,.button.is-black.is-inverted.is-outlined:focus,.button.is-black.is-inverted.is-outlined.is-focused{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted.is-outlined.is-loading:hover::after,.button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-black.is-inverted.is-outlined.is-loading:focus::after,.button.is-black.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-black.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-light{background-color:#f5f5f5;border-color:transparent;color:#363636}.button.is-light:hover,.button.is-light.is-hovered{background-color:#eee;border-color:transparent;color:#363636}.button.is-light:focus,.button.is-light.is-focused{border-color:transparent;color:#363636}.button.is-light:focus:not(:active),.button.is-light.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(245,245,245,0.25)}.button.is-light:active,.button.is-light.is-active{background-color:#e8e8e8;border-color:transparent;color:#363636}.button.is-light[disabled],fieldset[disabled] .button.is-light{background-color:#f5f5f5;border-color:transparent;box-shadow:none}.button.is-light.is-inverted{background-color:#363636;color:#f5f5f5}.button.is-light.is-inverted:hover,.button.is-light.is-inverted.is-hovered{background-color:#292929}.button.is-light.is-inverted[disabled],fieldset[disabled] .button.is-light.is-inverted{background-color:#363636;border-color:transparent;box-shadow:none;color:#f5f5f5}.button.is-light.is-loading::after{border-color:transparent transparent #363636 #363636 !important}.button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;color:#f5f5f5}.button.is-light.is-outlined:hover,.button.is-light.is-outlined.is-hovered,.button.is-light.is-outlined:focus,.button.is-light.is-outlined.is-focused{background-color:#f5f5f5;border-color:#f5f5f5;color:#363636}.button.is-light.is-outlined.is-loading::after{border-color:transparent transparent #f5f5f5 #f5f5f5 !important}.button.is-light.is-outlined.is-loading:hover::after,.button.is-light.is-outlined.is-loading.is-hovered::after,.button.is-light.is-outlined.is-loading:focus::after,.button.is-light.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #363636 #363636 !important}.button.is-light.is-outlined[disabled],fieldset[disabled] .button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;box-shadow:none;color:#f5f5f5}.button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:#363636;color:#363636}.button.is-light.is-inverted.is-outlined:hover,.button.is-light.is-inverted.is-outlined.is-hovered,.button.is-light.is-inverted.is-outlined:focus,.button.is-light.is-inverted.is-outlined.is-focused{background-color:#363636;color:#f5f5f5}.button.is-light.is-inverted.is-outlined.is-loading:hover::after,.button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-light.is-inverted.is-outlined.is-loading:focus::after,.button.is-light.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #f5f5f5 #f5f5f5 !important}.button.is-light.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:#363636;box-shadow:none;color:#363636}.button.is-dark,.content kbd.button{background-color:#363636;border-color:transparent;color:#f5f5f5}.button.is-dark:hover,.content kbd.button:hover,.button.is-dark.is-hovered,.content kbd.button.is-hovered{background-color:#2f2f2f;border-color:transparent;color:#f5f5f5}.button.is-dark:focus,.content kbd.button:focus,.button.is-dark.is-focused,.content kbd.button.is-focused{border-color:transparent;color:#f5f5f5}.button.is-dark:focus:not(:active),.content kbd.button:focus:not(:active),.button.is-dark.is-focused:not(:active),.content kbd.button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(54,54,54,0.25)}.button.is-dark:active,.content kbd.button:active,.button.is-dark.is-active,.content kbd.button.is-active{background-color:#292929;border-color:transparent;color:#f5f5f5}.button.is-dark[disabled],.content kbd.button[disabled],fieldset[disabled] .button.is-dark,fieldset[disabled] .content kbd.button,.content fieldset[disabled] kbd.button{background-color:#363636;border-color:transparent;box-shadow:none}.button.is-dark.is-inverted,.content kbd.button.is-inverted{background-color:#f5f5f5;color:#363636}.button.is-dark.is-inverted:hover,.content kbd.button.is-inverted:hover,.button.is-dark.is-inverted.is-hovered,.content kbd.button.is-inverted.is-hovered{background-color:#e8e8e8}.button.is-dark.is-inverted[disabled],.content kbd.button.is-inverted[disabled],fieldset[disabled] .button.is-dark.is-inverted,fieldset[disabled] .content kbd.button.is-inverted,.content fieldset[disabled] kbd.button.is-inverted{background-color:#f5f5f5;border-color:transparent;box-shadow:none;color:#363636}.button.is-dark.is-loading::after,.content kbd.button.is-loading::after{border-color:transparent transparent #f5f5f5 #f5f5f5 !important}.button.is-dark.is-outlined,.content kbd.button.is-outlined{background-color:transparent;border-color:#363636;color:#363636}.button.is-dark.is-outlined:hover,.content kbd.button.is-outlined:hover,.button.is-dark.is-outlined.is-hovered,.content kbd.button.is-outlined.is-hovered,.button.is-dark.is-outlined:focus,.content kbd.button.is-outlined:focus,.button.is-dark.is-outlined.is-focused,.content kbd.button.is-outlined.is-focused{background-color:#363636;border-color:#363636;color:#f5f5f5}.button.is-dark.is-outlined.is-loading::after,.content kbd.button.is-outlined.is-loading::after{border-color:transparent transparent #363636 #363636 !important}.button.is-dark.is-outlined.is-loading:hover::after,.content kbd.button.is-outlined.is-loading:hover::after,.button.is-dark.is-outlined.is-loading.is-hovered::after,.content kbd.button.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-outlined.is-loading:focus::after,.content kbd.button.is-outlined.is-loading:focus::after,.button.is-dark.is-outlined.is-loading.is-focused::after,.content kbd.button.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #f5f5f5 #f5f5f5 !important}.button.is-dark.is-outlined[disabled],.content kbd.button.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-outlined,fieldset[disabled] .content kbd.button.is-outlined,.content fieldset[disabled] kbd.button.is-outlined{background-color:transparent;border-color:#363636;box-shadow:none;color:#363636}.button.is-dark.is-inverted.is-outlined,.content kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#f5f5f5;color:#f5f5f5}.button.is-dark.is-inverted.is-outlined:hover,.content kbd.button.is-inverted.is-outlined:hover,.button.is-dark.is-inverted.is-outlined.is-hovered,.content kbd.button.is-inverted.is-outlined.is-hovered,.button.is-dark.is-inverted.is-outlined:focus,.content kbd.button.is-inverted.is-outlined:focus,.button.is-dark.is-inverted.is-outlined.is-focused,.content kbd.button.is-inverted.is-outlined.is-focused{background-color:#f5f5f5;color:#363636}.button.is-dark.is-inverted.is-outlined.is-loading:hover::after,.content kbd.button.is-inverted.is-outlined.is-loading:hover::after,.button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after,.content kbd.button.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-inverted.is-outlined.is-loading:focus::after,.content kbd.button.is-inverted.is-outlined.is-loading:focus::after,.button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after,.content kbd.button.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #363636 #363636 !important}.button.is-dark.is-inverted.is-outlined[disabled],.content kbd.button.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-inverted.is-outlined,fieldset[disabled] .content kbd.button.is-inverted.is-outlined,.content fieldset[disabled] kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#f5f5f5;box-shadow:none;color:#f5f5f5}.button.is-primary,.docstring>section>a.button.docs-sourcelink{background-color:#4eb5de;border-color:transparent;color:#fff}.button.is-primary:hover,.docstring>section>a.button.docs-sourcelink:hover,.button.is-primary.is-hovered,.docstring>section>a.button.is-hovered.docs-sourcelink{background-color:#43b1dc;border-color:transparent;color:#fff}.button.is-primary:focus,.docstring>section>a.button.docs-sourcelink:focus,.button.is-primary.is-focused,.docstring>section>a.button.is-focused.docs-sourcelink{border-color:transparent;color:#fff}.button.is-primary:focus:not(:active),.docstring>section>a.button.docs-sourcelink:focus:not(:active),.button.is-primary.is-focused:not(:active),.docstring>section>a.button.is-focused.docs-sourcelink:not(:active){box-shadow:0 0 0 0.125em rgba(78,181,222,0.25)}.button.is-primary:active,.docstring>section>a.button.docs-sourcelink:active,.button.is-primary.is-active,.docstring>section>a.button.is-active.docs-sourcelink{background-color:#39acda;border-color:transparent;color:#fff}.button.is-primary[disabled],.docstring>section>a.button.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary,fieldset[disabled] .docstring>section>a.button.docs-sourcelink{background-color:#4eb5de;border-color:transparent;box-shadow:none}.button.is-primary.is-inverted,.docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;color:#4eb5de}.button.is-primary.is-inverted:hover,.docstring>section>a.button.is-inverted.docs-sourcelink:hover,.button.is-primary.is-inverted.is-hovered,.docstring>section>a.button.is-inverted.is-hovered.docs-sourcelink{background-color:#f2f2f2}.button.is-primary.is-inverted[disabled],.docstring>section>a.button.is-inverted.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary.is-inverted,fieldset[disabled] .docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;border-color:transparent;box-shadow:none;color:#4eb5de}.button.is-primary.is-loading::after,.docstring>section>a.button.is-loading.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}.button.is-primary.is-outlined,.docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#4eb5de;color:#4eb5de}.button.is-primary.is-outlined:hover,.docstring>section>a.button.is-outlined.docs-sourcelink:hover,.button.is-primary.is-outlined.is-hovered,.docstring>section>a.button.is-outlined.is-hovered.docs-sourcelink,.button.is-primary.is-outlined:focus,.docstring>section>a.button.is-outlined.docs-sourcelink:focus,.button.is-primary.is-outlined.is-focused,.docstring>section>a.button.is-outlined.is-focused.docs-sourcelink{background-color:#4eb5de;border-color:#4eb5de;color:#fff}.button.is-primary.is-outlined.is-loading::after,.docstring>section>a.button.is-outlined.is-loading.docs-sourcelink::after{border-color:transparent transparent #4eb5de #4eb5de !important}.button.is-primary.is-outlined.is-loading:hover::after,.docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:hover::after,.button.is-primary.is-outlined.is-loading.is-hovered::after,.docstring>section>a.button.is-outlined.is-loading.is-hovered.docs-sourcelink::after,.button.is-primary.is-outlined.is-loading:focus::after,.docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:focus::after,.button.is-primary.is-outlined.is-loading.is-focused::after,.docstring>section>a.button.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}.button.is-primary.is-outlined[disabled],.docstring>section>a.button.is-outlined.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary.is-outlined,fieldset[disabled] .docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#4eb5de;box-shadow:none;color:#4eb5de}.button.is-primary.is-inverted.is-outlined,.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;color:#fff}.button.is-primary.is-inverted.is-outlined:hover,.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:hover,.button.is-primary.is-inverted.is-outlined.is-hovered,.docstring>section>a.button.is-inverted.is-outlined.is-hovered.docs-sourcelink,.button.is-primary.is-inverted.is-outlined:focus,.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:focus,.button.is-primary.is-inverted.is-outlined.is-focused,.docstring>section>a.button.is-inverted.is-outlined.is-focused.docs-sourcelink{background-color:#fff;color:#4eb5de}.button.is-primary.is-inverted.is-outlined.is-loading:hover::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:hover::after,.button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.is-hovered.docs-sourcelink::after,.button.is-primary.is-inverted.is-outlined.is-loading:focus::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:focus::after,.button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #4eb5de #4eb5de !important}.button.is-primary.is-inverted.is-outlined[disabled],.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary.is-inverted.is-outlined,fieldset[disabled] .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-link{background-color:#2e63b8;border-color:transparent;color:#fff}.button.is-link:hover,.button.is-link.is-hovered{background-color:#2b5eae;border-color:transparent;color:#fff}.button.is-link:focus,.button.is-link.is-focused{border-color:transparent;color:#fff}.button.is-link:focus:not(:active),.button.is-link.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.button.is-link:active,.button.is-link.is-active{background-color:#2958a4;border-color:transparent;color:#fff}.button.is-link[disabled],fieldset[disabled] .button.is-link{background-color:#2e63b8;border-color:transparent;box-shadow:none}.button.is-link.is-inverted{background-color:#fff;color:#2e63b8}.button.is-link.is-inverted:hover,.button.is-link.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-link.is-inverted[disabled],fieldset[disabled] .button.is-link.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#2e63b8}.button.is-link.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-link.is-outlined{background-color:transparent;border-color:#2e63b8;color:#2e63b8}.button.is-link.is-outlined:hover,.button.is-link.is-outlined.is-hovered,.button.is-link.is-outlined:focus,.button.is-link.is-outlined.is-focused{background-color:#2e63b8;border-color:#2e63b8;color:#fff}.button.is-link.is-outlined.is-loading::after{border-color:transparent transparent #2e63b8 #2e63b8 !important}.button.is-link.is-outlined.is-loading:hover::after,.button.is-link.is-outlined.is-loading.is-hovered::after,.button.is-link.is-outlined.is-loading:focus::after,.button.is-link.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-link.is-outlined[disabled],fieldset[disabled] .button.is-link.is-outlined{background-color:transparent;border-color:#2e63b8;box-shadow:none;color:#2e63b8}.button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-link.is-inverted.is-outlined:hover,.button.is-link.is-inverted.is-outlined.is-hovered,.button.is-link.is-inverted.is-outlined:focus,.button.is-link.is-inverted.is-outlined.is-focused{background-color:#fff;color:#2e63b8}.button.is-link.is-inverted.is-outlined.is-loading:hover::after,.button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-link.is-inverted.is-outlined.is-loading:focus::after,.button.is-link.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #2e63b8 #2e63b8 !important}.button.is-link.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-info{background-color:#209cee;border-color:transparent;color:#fff}.button.is-info:hover,.button.is-info.is-hovered{background-color:#1497ed;border-color:transparent;color:#fff}.button.is-info:focus,.button.is-info.is-focused{border-color:transparent;color:#fff}.button.is-info:focus:not(:active),.button.is-info.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(32,156,238,0.25)}.button.is-info:active,.button.is-info.is-active{background-color:#1190e3;border-color:transparent;color:#fff}.button.is-info[disabled],fieldset[disabled] .button.is-info{background-color:#209cee;border-color:transparent;box-shadow:none}.button.is-info.is-inverted{background-color:#fff;color:#209cee}.button.is-info.is-inverted:hover,.button.is-info.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-info.is-inverted[disabled],fieldset[disabled] .button.is-info.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#209cee}.button.is-info.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-info.is-outlined{background-color:transparent;border-color:#209cee;color:#209cee}.button.is-info.is-outlined:hover,.button.is-info.is-outlined.is-hovered,.button.is-info.is-outlined:focus,.button.is-info.is-outlined.is-focused{background-color:#209cee;border-color:#209cee;color:#fff}.button.is-info.is-outlined.is-loading::after{border-color:transparent transparent #209cee #209cee !important}.button.is-info.is-outlined.is-loading:hover::after,.button.is-info.is-outlined.is-loading.is-hovered::after,.button.is-info.is-outlined.is-loading:focus::after,.button.is-info.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-info.is-outlined[disabled],fieldset[disabled] .button.is-info.is-outlined{background-color:transparent;border-color:#209cee;box-shadow:none;color:#209cee}.button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-info.is-inverted.is-outlined:hover,.button.is-info.is-inverted.is-outlined.is-hovered,.button.is-info.is-inverted.is-outlined:focus,.button.is-info.is-inverted.is-outlined.is-focused{background-color:#fff;color:#209cee}.button.is-info.is-inverted.is-outlined.is-loading:hover::after,.button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-info.is-inverted.is-outlined.is-loading:focus::after,.button.is-info.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #209cee #209cee !important}.button.is-info.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-success{background-color:#22c35b;border-color:transparent;color:#fff}.button.is-success:hover,.button.is-success.is-hovered{background-color:#20b856;border-color:transparent;color:#fff}.button.is-success:focus,.button.is-success.is-focused{border-color:transparent;color:#fff}.button.is-success:focus:not(:active),.button.is-success.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(34,195,91,0.25)}.button.is-success:active,.button.is-success.is-active{background-color:#1ead51;border-color:transparent;color:#fff}.button.is-success[disabled],fieldset[disabled] .button.is-success{background-color:#22c35b;border-color:transparent;box-shadow:none}.button.is-success.is-inverted{background-color:#fff;color:#22c35b}.button.is-success.is-inverted:hover,.button.is-success.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-success.is-inverted[disabled],fieldset[disabled] .button.is-success.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#22c35b}.button.is-success.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-success.is-outlined{background-color:transparent;border-color:#22c35b;color:#22c35b}.button.is-success.is-outlined:hover,.button.is-success.is-outlined.is-hovered,.button.is-success.is-outlined:focus,.button.is-success.is-outlined.is-focused{background-color:#22c35b;border-color:#22c35b;color:#fff}.button.is-success.is-outlined.is-loading::after{border-color:transparent transparent #22c35b #22c35b !important}.button.is-success.is-outlined.is-loading:hover::after,.button.is-success.is-outlined.is-loading.is-hovered::after,.button.is-success.is-outlined.is-loading:focus::after,.button.is-success.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-success.is-outlined[disabled],fieldset[disabled] .button.is-success.is-outlined{background-color:transparent;border-color:#22c35b;box-shadow:none;color:#22c35b}.button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-success.is-inverted.is-outlined:hover,.button.is-success.is-inverted.is-outlined.is-hovered,.button.is-success.is-inverted.is-outlined:focus,.button.is-success.is-inverted.is-outlined.is-focused{background-color:#fff;color:#22c35b}.button.is-success.is-inverted.is-outlined.is-loading:hover::after,.button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-success.is-inverted.is-outlined.is-loading:focus::after,.button.is-success.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #22c35b #22c35b !important}.button.is-success.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-warning{background-color:#ffdd57;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning:hover,.button.is-warning.is-hovered{background-color:#ffda4a;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning:focus,.button.is-warning.is-focused{border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning:focus:not(:active),.button.is-warning.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(255,221,87,0.25)}.button.is-warning:active,.button.is-warning.is-active{background-color:#ffd83e;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning[disabled],fieldset[disabled] .button.is-warning{background-color:#ffdd57;border-color:transparent;box-shadow:none}.button.is-warning.is-inverted{background-color:rgba(0,0,0,0.7);color:#ffdd57}.button.is-warning.is-inverted:hover,.button.is-warning.is-inverted.is-hovered{background-color:rgba(0,0,0,0.7)}.button.is-warning.is-inverted[disabled],fieldset[disabled] .button.is-warning.is-inverted{background-color:rgba(0,0,0,0.7);border-color:transparent;box-shadow:none;color:#ffdd57}.button.is-warning.is-loading::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}.button.is-warning.is-outlined{background-color:transparent;border-color:#ffdd57;color:#ffdd57}.button.is-warning.is-outlined:hover,.button.is-warning.is-outlined.is-hovered,.button.is-warning.is-outlined:focus,.button.is-warning.is-outlined.is-focused{background-color:#ffdd57;border-color:#ffdd57;color:rgba(0,0,0,0.7)}.button.is-warning.is-outlined.is-loading::after{border-color:transparent transparent #ffdd57 #ffdd57 !important}.button.is-warning.is-outlined.is-loading:hover::after,.button.is-warning.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-outlined.is-loading:focus::after,.button.is-warning.is-outlined.is-loading.is-focused::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}.button.is-warning.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-outlined{background-color:transparent;border-color:#ffdd57;box-shadow:none;color:#ffdd57}.button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);color:rgba(0,0,0,0.7)}.button.is-warning.is-inverted.is-outlined:hover,.button.is-warning.is-inverted.is-outlined.is-hovered,.button.is-warning.is-inverted.is-outlined:focus,.button.is-warning.is-inverted.is-outlined.is-focused{background-color:rgba(0,0,0,0.7);color:#ffdd57}.button.is-warning.is-inverted.is-outlined.is-loading:hover::after,.button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-inverted.is-outlined.is-loading:focus::after,.button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #ffdd57 #ffdd57 !important}.button.is-warning.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);box-shadow:none;color:rgba(0,0,0,0.7)}.button.is-danger{background-color:#da0b00;border-color:transparent;color:#fff}.button.is-danger:hover,.button.is-danger.is-hovered{background-color:#cd0a00;border-color:transparent;color:#fff}.button.is-danger:focus,.button.is-danger.is-focused{border-color:transparent;color:#fff}.button.is-danger:focus:not(:active),.button.is-danger.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(218,11,0,0.25)}.button.is-danger:active,.button.is-danger.is-active{background-color:#c10a00;border-color:transparent;color:#fff}.button.is-danger[disabled],fieldset[disabled] .button.is-danger{background-color:#da0b00;border-color:transparent;box-shadow:none}.button.is-danger.is-inverted{background-color:#fff;color:#da0b00}.button.is-danger.is-inverted:hover,.button.is-danger.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-danger.is-inverted[disabled],fieldset[disabled] .button.is-danger.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#da0b00}.button.is-danger.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-danger.is-outlined{background-color:transparent;border-color:#da0b00;color:#da0b00}.button.is-danger.is-outlined:hover,.button.is-danger.is-outlined.is-hovered,.button.is-danger.is-outlined:focus,.button.is-danger.is-outlined.is-focused{background-color:#da0b00;border-color:#da0b00;color:#fff}.button.is-danger.is-outlined.is-loading::after{border-color:transparent transparent #da0b00 #da0b00 !important}.button.is-danger.is-outlined.is-loading:hover::after,.button.is-danger.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-outlined.is-loading:focus::after,.button.is-danger.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-danger.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-outlined{background-color:transparent;border-color:#da0b00;box-shadow:none;color:#da0b00}.button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-danger.is-inverted.is-outlined:hover,.button.is-danger.is-inverted.is-outlined.is-hovered,.button.is-danger.is-inverted.is-outlined:focus,.button.is-danger.is-inverted.is-outlined.is-focused{background-color:#fff;color:#da0b00}.button.is-danger.is-inverted.is-outlined.is-loading:hover::after,.button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-inverted.is-outlined.is-loading:focus::after,.button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #da0b00 #da0b00 !important}.button.is-danger.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-small,#documenter .docs-sidebar form.docs-search>input.button{border-radius:2px;font-size:.75rem}.button.is-normal{font-size:1rem}.button.is-medium{font-size:1.25rem}.button.is-large{font-size:1.5rem}.button[disabled],fieldset[disabled] .button{background-color:#fff;border-color:#dbdbdb;box-shadow:none;opacity:.5}.button.is-fullwidth{display:flex;width:100%}.button.is-loading{color:transparent !important;pointer-events:none}.button.is-loading::after{position:absolute;left:calc(50% - (1em / 2));top:calc(50% - (1em / 2));position:absolute !important}.button.is-static{background-color:#f5f5f5;border-color:#dbdbdb;color:#6b6b6b;box-shadow:none;pointer-events:none}.button.is-rounded,#documenter .docs-sidebar form.docs-search>input.button{border-radius:290486px;padding-left:1em;padding-right:1em}.buttons{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.buttons .button{margin-bottom:0.5rem}.buttons .button:not(:last-child):not(.is-fullwidth){margin-right:0.5rem}.buttons:last-child{margin-bottom:-0.5rem}.buttons:not(:last-child){margin-bottom:1rem}.buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large){border-radius:2px;font-size:.75rem}.buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large){font-size:1.25rem}.buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium){font-size:1.5rem}.buttons.has-addons .button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.buttons.has-addons .button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}.buttons.has-addons .button:last-child{margin-right:0}.buttons.has-addons .button:hover,.buttons.has-addons .button.is-hovered{z-index:2}.buttons.has-addons .button:focus,.buttons.has-addons .button.is-focused,.buttons.has-addons .button:active,.buttons.has-addons .button.is-active,.buttons.has-addons .button.is-selected{z-index:3}.buttons.has-addons .button:focus:hover,.buttons.has-addons .button.is-focused:hover,.buttons.has-addons .button:active:hover,.buttons.has-addons .button.is-active:hover,.buttons.has-addons .button.is-selected:hover{z-index:4}.buttons.has-addons .button.is-expanded{flex-grow:1;flex-shrink:1}.buttons.is-centered{justify-content:center}.buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}.buttons.is-right{justify-content:flex-end}.buttons.is-right:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}.container{flex-grow:1;margin:0 auto;position:relative;width:auto}@media screen and (min-width: 1056px){.container{max-width:992px}.container.is-fluid{margin-left:32px;margin-right:32px;max-width:none}}@media screen and (max-width: 1215px){.container.is-widescreen{max-width:1152px}}@media screen and (max-width: 1407px){.container.is-fullhd{max-width:1344px}}@media screen and (min-width: 1216px){.container{max-width:1152px}}@media screen and (min-width: 1408px){.container{max-width:1344px}}.content li+li{margin-top:0.25em}.content p:not(:last-child),.content dl:not(:last-child),.content ol:not(:last-child),.content ul:not(:last-child),.content blockquote:not(:last-child),.content pre:not(:last-child),.content table:not(:last-child){margin-bottom:1em}.content h1,.content h2,.content h3,.content h4,.content h5,.content h6{color:#222;font-weight:600;line-height:1.125}.content h1{font-size:2em;margin-bottom:0.5em}.content h1:not(:first-child){margin-top:1em}.content h2{font-size:1.75em;margin-bottom:0.5714em}.content h2:not(:first-child){margin-top:1.1428em}.content h3{font-size:1.5em;margin-bottom:0.6666em}.content h3:not(:first-child){margin-top:1.3333em}.content h4{font-size:1.25em;margin-bottom:0.8em}.content h5{font-size:1.125em;margin-bottom:0.8888em}.content h6{font-size:1em;margin-bottom:1em}.content blockquote{background-color:#f5f5f5;border-left:5px solid #dbdbdb;padding:1.25em 1.5em}.content ol{list-style-position:outside;margin-left:2em;margin-top:1em}.content ol:not([type]){list-style-type:decimal}.content ol.is-lower-alpha:not([type]){list-style-type:lower-alpha}.content ol.is-lower-roman:not([type]){list-style-type:lower-roman}.content ol.is-upper-alpha:not([type]){list-style-type:upper-alpha}.content ol.is-upper-roman:not([type]){list-style-type:upper-roman}.content ul{list-style:disc outside;margin-left:2em;margin-top:1em}.content ul ul{list-style-type:circle;margin-top:0.5em}.content ul ul ul{list-style-type:square}.content dd{margin-left:2em}.content figure{margin-left:2em;margin-right:2em;text-align:center}.content figure:not(:first-child){margin-top:2em}.content figure:not(:last-child){margin-bottom:2em}.content figure img{display:inline-block}.content figure figcaption{font-style:italic}.content pre{-webkit-overflow-scrolling:touch;overflow-x:auto;padding:0;white-space:pre;word-wrap:normal}.content sup,.content sub{font-size:75%}.content table{width:100%}.content table td,.content table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}.content table th{color:#222}.content table th:not([align]){text-align:left}.content table thead td,.content table thead th{border-width:0 0 2px;color:#222}.content table tfoot td,.content table tfoot th{border-width:2px 0 0;color:#222}.content table tbody tr:last-child td,.content table tbody tr:last-child th{border-bottom-width:0}.content .tabs li+li{margin-top:0}.content.is-small,#documenter .docs-sidebar form.docs-search>input.content{font-size:.75rem}.content.is-medium{font-size:1.25rem}.content.is-large{font-size:1.5rem}.icon{align-items:center;display:inline-flex;justify-content:center;height:1.5rem;width:1.5rem}.icon.is-small,#documenter .docs-sidebar form.docs-search>input.icon{height:1rem;width:1rem}.icon.is-medium{height:2rem;width:2rem}.icon.is-large{height:3rem;width:3rem}.image,#documenter .docs-sidebar .docs-logo>img{display:block;position:relative}.image img,#documenter .docs-sidebar .docs-logo>img img{display:block;height:auto;width:100%}.image img.is-rounded,#documenter .docs-sidebar .docs-logo>img img.is-rounded{border-radius:290486px}.image.is-square img,#documenter .docs-sidebar .docs-logo>img.is-square img,.image.is-square .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,.image.is-1by1 img,#documenter .docs-sidebar .docs-logo>img.is-1by1 img,.image.is-1by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,.image.is-5by4 img,#documenter .docs-sidebar .docs-logo>img.is-5by4 img,.image.is-5by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,.image.is-4by3 img,#documenter .docs-sidebar .docs-logo>img.is-4by3 img,.image.is-4by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,.image.is-3by2 img,#documenter .docs-sidebar .docs-logo>img.is-3by2 img,.image.is-3by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,.image.is-5by3 img,#documenter .docs-sidebar .docs-logo>img.is-5by3 img,.image.is-5by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,.image.is-16by9 img,#documenter .docs-sidebar .docs-logo>img.is-16by9 img,.image.is-16by9 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,.image.is-2by1 img,#documenter .docs-sidebar .docs-logo>img.is-2by1 img,.image.is-2by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,.image.is-3by1 img,#documenter .docs-sidebar .docs-logo>img.is-3by1 img,.image.is-3by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,.image.is-4by5 img,#documenter .docs-sidebar .docs-logo>img.is-4by5 img,.image.is-4by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,.image.is-3by4 img,#documenter .docs-sidebar .docs-logo>img.is-3by4 img,.image.is-3by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,.image.is-2by3 img,#documenter .docs-sidebar .docs-logo>img.is-2by3 img,.image.is-2by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,.image.is-3by5 img,#documenter .docs-sidebar .docs-logo>img.is-3by5 img,.image.is-3by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,.image.is-9by16 img,#documenter .docs-sidebar .docs-logo>img.is-9by16 img,.image.is-9by16 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,.image.is-1by2 img,#documenter .docs-sidebar .docs-logo>img.is-1by2 img,.image.is-1by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,.image.is-1by3 img,#documenter .docs-sidebar .docs-logo>img.is-1by3 img,.image.is-1by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio{height:100%;width:100%}.image.is-square,#documenter .docs-sidebar .docs-logo>img.is-square,.image.is-1by1,#documenter .docs-sidebar .docs-logo>img.is-1by1{padding-top:100%}.image.is-5by4,#documenter .docs-sidebar .docs-logo>img.is-5by4{padding-top:80%}.image.is-4by3,#documenter .docs-sidebar .docs-logo>img.is-4by3{padding-top:75%}.image.is-3by2,#documenter .docs-sidebar .docs-logo>img.is-3by2{padding-top:66.6666%}.image.is-5by3,#documenter .docs-sidebar .docs-logo>img.is-5by3{padding-top:60%}.image.is-16by9,#documenter .docs-sidebar .docs-logo>img.is-16by9{padding-top:56.25%}.image.is-2by1,#documenter .docs-sidebar .docs-logo>img.is-2by1{padding-top:50%}.image.is-3by1,#documenter .docs-sidebar .docs-logo>img.is-3by1{padding-top:33.3333%}.image.is-4by5,#documenter .docs-sidebar .docs-logo>img.is-4by5{padding-top:125%}.image.is-3by4,#documenter .docs-sidebar .docs-logo>img.is-3by4{padding-top:133.3333%}.image.is-2by3,#documenter .docs-sidebar .docs-logo>img.is-2by3{padding-top:150%}.image.is-3by5,#documenter .docs-sidebar .docs-logo>img.is-3by5{padding-top:166.6666%}.image.is-9by16,#documenter .docs-sidebar .docs-logo>img.is-9by16{padding-top:177.7777%}.image.is-1by2,#documenter .docs-sidebar .docs-logo>img.is-1by2{padding-top:200%}.image.is-1by3,#documenter .docs-sidebar .docs-logo>img.is-1by3{padding-top:300%}.image.is-16x16,#documenter .docs-sidebar .docs-logo>img.is-16x16{height:16px;width:16px}.image.is-24x24,#documenter .docs-sidebar .docs-logo>img.is-24x24{height:24px;width:24px}.image.is-32x32,#documenter .docs-sidebar .docs-logo>img.is-32x32{height:32px;width:32px}.image.is-48x48,#documenter .docs-sidebar .docs-logo>img.is-48x48{height:48px;width:48px}.image.is-64x64,#documenter .docs-sidebar .docs-logo>img.is-64x64{height:64px;width:64px}.image.is-96x96,#documenter .docs-sidebar .docs-logo>img.is-96x96{height:96px;width:96px}.image.is-128x128,#documenter .docs-sidebar .docs-logo>img.is-128x128{height:128px;width:128px}.notification{background-color:#f5f5f5;border-radius:4px;padding:1.25rem 2.5rem 1.25rem 1.5rem;position:relative}.notification a:not(.button):not(.dropdown-item){color:currentColor;text-decoration:underline}.notification strong{color:currentColor}.notification code,.notification pre{background:#fff}.notification pre code{background:transparent}.notification>.delete{position:absolute;right:0.5rem;top:0.5rem}.notification .title,.notification .subtitle,.notification .content{color:currentColor}.notification.is-white{background-color:#fff;color:#0a0a0a}.notification.is-black{background-color:#0a0a0a;color:#fff}.notification.is-light{background-color:#f5f5f5;color:#363636}.notification.is-dark,.content kbd.notification{background-color:#363636;color:#f5f5f5}.notification.is-primary,.docstring>section>a.notification.docs-sourcelink{background-color:#4eb5de;color:#fff}.notification.is-link{background-color:#2e63b8;color:#fff}.notification.is-info{background-color:#209cee;color:#fff}.notification.is-success{background-color:#22c35b;color:#fff}.notification.is-warning{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.notification.is-danger{background-color:#da0b00;color:#fff}.progress{-moz-appearance:none;-webkit-appearance:none;border:none;border-radius:290486px;display:block;height:1rem;overflow:hidden;padding:0;width:100%}.progress::-webkit-progress-bar{background-color:#dbdbdb}.progress::-webkit-progress-value{background-color:#222}.progress::-moz-progress-bar{background-color:#222}.progress::-ms-fill{background-color:#222;border:none}.progress.is-white::-webkit-progress-value{background-color:#fff}.progress.is-white::-moz-progress-bar{background-color:#fff}.progress.is-white::-ms-fill{background-color:#fff}.progress.is-white:indeterminate{background-image:linear-gradient(to right, #fff 30%, #dbdbdb 30%)}.progress.is-black::-webkit-progress-value{background-color:#0a0a0a}.progress.is-black::-moz-progress-bar{background-color:#0a0a0a}.progress.is-black::-ms-fill{background-color:#0a0a0a}.progress.is-black:indeterminate{background-image:linear-gradient(to right, #0a0a0a 30%, #dbdbdb 30%)}.progress.is-light::-webkit-progress-value{background-color:#f5f5f5}.progress.is-light::-moz-progress-bar{background-color:#f5f5f5}.progress.is-light::-ms-fill{background-color:#f5f5f5}.progress.is-light:indeterminate{background-image:linear-gradient(to right, #f5f5f5 30%, #dbdbdb 30%)}.progress.is-dark::-webkit-progress-value,.content kbd.progress::-webkit-progress-value{background-color:#363636}.progress.is-dark::-moz-progress-bar,.content kbd.progress::-moz-progress-bar{background-color:#363636}.progress.is-dark::-ms-fill,.content kbd.progress::-ms-fill{background-color:#363636}.progress.is-dark:indeterminate,.content kbd.progress:indeterminate{background-image:linear-gradient(to right, #363636 30%, #dbdbdb 30%)}.progress.is-primary::-webkit-progress-value,.docstring>section>a.progress.docs-sourcelink::-webkit-progress-value{background-color:#4eb5de}.progress.is-primary::-moz-progress-bar,.docstring>section>a.progress.docs-sourcelink::-moz-progress-bar{background-color:#4eb5de}.progress.is-primary::-ms-fill,.docstring>section>a.progress.docs-sourcelink::-ms-fill{background-color:#4eb5de}.progress.is-primary:indeterminate,.docstring>section>a.progress.docs-sourcelink:indeterminate{background-image:linear-gradient(to right, #4eb5de 30%, #dbdbdb 30%)}.progress.is-link::-webkit-progress-value{background-color:#2e63b8}.progress.is-link::-moz-progress-bar{background-color:#2e63b8}.progress.is-link::-ms-fill{background-color:#2e63b8}.progress.is-link:indeterminate{background-image:linear-gradient(to right, #2e63b8 30%, #dbdbdb 30%)}.progress.is-info::-webkit-progress-value{background-color:#209cee}.progress.is-info::-moz-progress-bar{background-color:#209cee}.progress.is-info::-ms-fill{background-color:#209cee}.progress.is-info:indeterminate{background-image:linear-gradient(to right, #209cee 30%, #dbdbdb 30%)}.progress.is-success::-webkit-progress-value{background-color:#22c35b}.progress.is-success::-moz-progress-bar{background-color:#22c35b}.progress.is-success::-ms-fill{background-color:#22c35b}.progress.is-success:indeterminate{background-image:linear-gradient(to right, #22c35b 30%, #dbdbdb 30%)}.progress.is-warning::-webkit-progress-value{background-color:#ffdd57}.progress.is-warning::-moz-progress-bar{background-color:#ffdd57}.progress.is-warning::-ms-fill{background-color:#ffdd57}.progress.is-warning:indeterminate{background-image:linear-gradient(to right, #ffdd57 30%, #dbdbdb 30%)}.progress.is-danger::-webkit-progress-value{background-color:#da0b00}.progress.is-danger::-moz-progress-bar{background-color:#da0b00}.progress.is-danger::-ms-fill{background-color:#da0b00}.progress.is-danger:indeterminate{background-image:linear-gradient(to right, #da0b00 30%, #dbdbdb 30%)}.progress:indeterminate{animation-duration:1.5s;animation-iteration-count:infinite;animation-name:moveIndeterminate;animation-timing-function:linear;background-color:#dbdbdb;background-image:linear-gradient(to right, #222 30%, #dbdbdb 30%);background-position:top left;background-repeat:no-repeat;background-size:150% 150%}.progress:indeterminate::-webkit-progress-bar{background-color:transparent}.progress:indeterminate::-moz-progress-bar{background-color:transparent}.progress.is-small,#documenter .docs-sidebar form.docs-search>input.progress{height:.75rem}.progress.is-medium{height:1.25rem}.progress.is-large{height:1.5rem}@keyframes moveIndeterminate{from{background-position:200% 0}to{background-position:-200% 0}}.table{background-color:#fff;color:#363636}.table td,.table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}.table td.is-white,.table th.is-white{background-color:#fff;border-color:#fff;color:#0a0a0a}.table td.is-black,.table th.is-black{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.table td.is-light,.table th.is-light{background-color:#f5f5f5;border-color:#f5f5f5;color:#363636}.table td.is-dark,.table th.is-dark{background-color:#363636;border-color:#363636;color:#f5f5f5}.table td.is-primary,.table th.is-primary{background-color:#4eb5de;border-color:#4eb5de;color:#fff}.table td.is-link,.table th.is-link{background-color:#2e63b8;border-color:#2e63b8;color:#fff}.table td.is-info,.table th.is-info{background-color:#209cee;border-color:#209cee;color:#fff}.table td.is-success,.table th.is-success{background-color:#22c35b;border-color:#22c35b;color:#fff}.table td.is-warning,.table th.is-warning{background-color:#ffdd57;border-color:#ffdd57;color:rgba(0,0,0,0.7)}.table td.is-danger,.table th.is-danger{background-color:#da0b00;border-color:#da0b00;color:#fff}.table td.is-narrow,.table th.is-narrow{white-space:nowrap;width:1%}.table td.is-selected,.table th.is-selected{background-color:#4eb5de;color:#fff}.table td.is-selected a,.table td.is-selected strong,.table th.is-selected a,.table th.is-selected strong{color:currentColor}.table th{color:#222}.table th:not([align]){text-align:left}.table tr.is-selected{background-color:#4eb5de;color:#fff}.table tr.is-selected a,.table tr.is-selected strong{color:currentColor}.table tr.is-selected td,.table tr.is-selected th{border-color:#fff;color:currentColor}.table thead{background-color:rgba(0,0,0,0)}.table thead td,.table thead th{border-width:0 0 2px;color:#222}.table tfoot{background-color:rgba(0,0,0,0)}.table tfoot td,.table tfoot th{border-width:2px 0 0;color:#222}.table tbody{background-color:rgba(0,0,0,0)}.table tbody tr:last-child td,.table tbody tr:last-child th{border-bottom-width:0}.table.is-bordered td,.table.is-bordered th{border-width:1px}.table.is-bordered tr:last-child td,.table.is-bordered tr:last-child th{border-bottom-width:1px}.table.is-fullwidth{width:100%}.table.is-hoverable tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(even){background-color:#f5f5f5}.table.is-narrow td,.table.is-narrow th{padding:0.25em 0.5em}.table.is-striped tbody tr:not(.is-selected):nth-child(even){background-color:#fafafa}.table-container{-webkit-overflow-scrolling:touch;overflow:auto;overflow-y:hidden;max-width:100%}.tags{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.tags .tag,.tags .content kbd,.content .tags kbd,.tags .docstring>section>a.docs-sourcelink{margin-bottom:0.5rem}.tags .tag:not(:last-child),.tags .content kbd:not(:last-child),.content .tags kbd:not(:last-child),.tags .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:0.5rem}.tags:last-child{margin-bottom:-0.5rem}.tags:not(:last-child){margin-bottom:1rem}.tags.are-medium .tag:not(.is-normal):not(.is-large),.tags.are-medium .content kbd:not(.is-normal):not(.is-large),.content .tags.are-medium kbd:not(.is-normal):not(.is-large),.tags.are-medium .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-large){font-size:1rem}.tags.are-large .tag:not(.is-normal):not(.is-medium),.tags.are-large .content kbd:not(.is-normal):not(.is-medium),.content .tags.are-large kbd:not(.is-normal):not(.is-medium),.tags.are-large .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-medium){font-size:1.25rem}.tags.is-centered{justify-content:center}.tags.is-centered .tag,.tags.is-centered .content kbd,.content .tags.is-centered kbd,.tags.is-centered .docstring>section>a.docs-sourcelink{margin-right:0.25rem;margin-left:0.25rem}.tags.is-right{justify-content:flex-end}.tags.is-right .tag:not(:first-child),.tags.is-right .content kbd:not(:first-child),.content .tags.is-right kbd:not(:first-child),.tags.is-right .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0.5rem}.tags.is-right .tag:not(:last-child),.tags.is-right .content kbd:not(:last-child),.content .tags.is-right kbd:not(:last-child),.tags.is-right .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:0}.tags.has-addons .tag,.tags.has-addons .content kbd,.content .tags.has-addons kbd,.tags.has-addons .docstring>section>a.docs-sourcelink{margin-right:0}.tags.has-addons .tag:not(:first-child),.tags.has-addons .content kbd:not(:first-child),.content .tags.has-addons kbd:not(:first-child),.tags.has-addons .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0;border-bottom-left-radius:0;border-top-left-radius:0}.tags.has-addons .tag:not(:last-child),.tags.has-addons .content kbd:not(:last-child),.content .tags.has-addons kbd:not(:last-child),.tags.has-addons .docstring>section>a.docs-sourcelink:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.tag:not(body),.content kbd:not(body),.docstring>section>a.docs-sourcelink:not(body){align-items:center;background-color:#f5f5f5;border-radius:4px;color:#222;display:inline-flex;font-size:.75rem;height:2em;justify-content:center;line-height:1.5;padding-left:0.75em;padding-right:0.75em;white-space:nowrap}.tag:not(body) .delete,.content kbd:not(body) .delete,.docstring>section>a.docs-sourcelink:not(body) .delete{margin-left:0.25rem;margin-right:-0.375rem}.tag.is-white:not(body),.content kbd.is-white:not(body),.docstring>section>a.docs-sourcelink.is-white:not(body){background-color:#fff;color:#0a0a0a}.tag.is-black:not(body),.content kbd.is-black:not(body),.docstring>section>a.docs-sourcelink.is-black:not(body){background-color:#0a0a0a;color:#fff}.tag.is-light:not(body),.content kbd.is-light:not(body),.docstring>section>a.docs-sourcelink.is-light:not(body){background-color:#f5f5f5;color:#363636}.tag.is-dark:not(body),.content kbd:not(body),.docstring>section>a.docs-sourcelink.is-dark:not(body),.content .docstring>section>kbd:not(body){background-color:#363636;color:#f5f5f5}.tag.is-primary:not(body),.content kbd.is-primary:not(body),.docstring>section>a.docs-sourcelink:not(body){background-color:#4eb5de;color:#fff}.tag.is-link:not(body),.content kbd.is-link:not(body),.docstring>section>a.docs-sourcelink.is-link:not(body){background-color:#2e63b8;color:#fff}.tag.is-info:not(body),.content kbd.is-info:not(body),.docstring>section>a.docs-sourcelink.is-info:not(body){background-color:#209cee;color:#fff}.tag.is-success:not(body),.content kbd.is-success:not(body),.docstring>section>a.docs-sourcelink.is-success:not(body){background-color:#22c35b;color:#fff}.tag.is-warning:not(body),.content kbd.is-warning:not(body),.docstring>section>a.docs-sourcelink.is-warning:not(body){background-color:#ffdd57;color:rgba(0,0,0,0.7)}.tag.is-danger:not(body),.content kbd.is-danger:not(body),.docstring>section>a.docs-sourcelink.is-danger:not(body){background-color:#da0b00;color:#fff}.tag.is-normal:not(body),.content kbd.is-normal:not(body),.docstring>section>a.docs-sourcelink.is-normal:not(body){font-size:.75rem}.tag.is-medium:not(body),.content kbd.is-medium:not(body),.docstring>section>a.docs-sourcelink.is-medium:not(body){font-size:1rem}.tag.is-large:not(body),.content kbd.is-large:not(body),.docstring>section>a.docs-sourcelink.is-large:not(body){font-size:1.25rem}.tag:not(body) .icon:first-child:not(:last-child),.content kbd:not(body) .icon:first-child:not(:last-child),.docstring>section>a.docs-sourcelink:not(body) .icon:first-child:not(:last-child){margin-left:-0.375em;margin-right:0.1875em}.tag:not(body) .icon:last-child:not(:first-child),.content kbd:not(body) .icon:last-child:not(:first-child),.docstring>section>a.docs-sourcelink:not(body) .icon:last-child:not(:first-child){margin-left:0.1875em;margin-right:-0.375em}.tag:not(body) .icon:first-child:last-child,.content kbd:not(body) .icon:first-child:last-child,.docstring>section>a.docs-sourcelink:not(body) .icon:first-child:last-child{margin-left:-0.375em;margin-right:-0.375em}.tag.is-delete:not(body),.content kbd.is-delete:not(body),.docstring>section>a.docs-sourcelink.is-delete:not(body){margin-left:1px;padding:0;position:relative;width:2em}.tag.is-delete:not(body)::before,.content kbd.is-delete:not(body)::before,.docstring>section>a.docs-sourcelink.is-delete:not(body)::before,.tag.is-delete:not(body)::after,.content kbd.is-delete:not(body)::after,.docstring>section>a.docs-sourcelink.is-delete:not(body)::after{background-color:currentColor;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.tag.is-delete:not(body)::before,.content kbd.is-delete:not(body)::before,.docstring>section>a.docs-sourcelink.is-delete:not(body)::before{height:1px;width:50%}.tag.is-delete:not(body)::after,.content kbd.is-delete:not(body)::after,.docstring>section>a.docs-sourcelink.is-delete:not(body)::after{height:50%;width:1px}.tag.is-delete:not(body):hover,.content kbd.is-delete:not(body):hover,.docstring>section>a.docs-sourcelink.is-delete:not(body):hover,.tag.is-delete:not(body):focus,.content kbd.is-delete:not(body):focus,.docstring>section>a.docs-sourcelink.is-delete:not(body):focus{background-color:#e8e8e8}.tag.is-delete:not(body):active,.content kbd.is-delete:not(body):active,.docstring>section>a.docs-sourcelink.is-delete:not(body):active{background-color:#dbdbdb}.tag.is-rounded:not(body),#documenter .docs-sidebar form.docs-search>input:not(body),.content kbd.is-rounded:not(body),#documenter .docs-sidebar .content form.docs-search>input:not(body),.docstring>section>a.docs-sourcelink.is-rounded:not(body){border-radius:290486px}a.tag:hover,.docstring>section>a.docs-sourcelink:hover{text-decoration:underline}.title,.subtitle{word-break:break-word}.title em,.title span,.subtitle em,.subtitle span{font-weight:inherit}.title sub,.subtitle sub{font-size:.75em}.title sup,.subtitle sup{font-size:.75em}.title .tag,.title .content kbd,.content .title kbd,.title .docstring>section>a.docs-sourcelink,.subtitle .tag,.subtitle .content kbd,.content .subtitle kbd,.subtitle .docstring>section>a.docs-sourcelink{vertical-align:middle}.title{color:#363636;font-size:2rem;font-weight:600;line-height:1.125}.title strong{color:inherit;font-weight:inherit}.title+.highlight{margin-top:-0.75rem}.title:not(.is-spaced)+.subtitle{margin-top:-1.25rem}.title.is-1{font-size:3rem}.title.is-2{font-size:2.5rem}.title.is-3{font-size:2rem}.title.is-4{font-size:1.5rem}.title.is-5{font-size:1.25rem}.title.is-6{font-size:1rem}.title.is-7{font-size:.75rem}.subtitle{color:#4a4a4a;font-size:1.25rem;font-weight:400;line-height:1.25}.subtitle strong{color:#363636;font-weight:600}.subtitle:not(.is-spaced)+.title{margin-top:-1.25rem}.subtitle.is-1{font-size:3rem}.subtitle.is-2{font-size:2.5rem}.subtitle.is-3{font-size:2rem}.subtitle.is-4{font-size:1.5rem}.subtitle.is-5{font-size:1.25rem}.subtitle.is-6{font-size:1rem}.subtitle.is-7{font-size:.75rem}.heading{display:block;font-size:11px;letter-spacing:1px;margin-bottom:5px;text-transform:uppercase}.highlight{font-weight:400;max-width:100%;overflow:hidden;padding:0}.highlight pre{overflow:auto;max-width:100%}.number{align-items:center;background-color:#f5f5f5;border-radius:290486px;display:inline-flex;font-size:1.25rem;height:2em;justify-content:center;margin-right:1.5rem;min-width:2.5em;padding:0.25rem 0.5rem;text-align:center;vertical-align:top}.select select,.textarea,.input,#documenter .docs-sidebar form.docs-search>input{background-color:#fff;border-color:#dbdbdb;border-radius:4px;color:#363636}.select select::-moz-placeholder,.textarea::-moz-placeholder,.input::-moz-placeholder,#documenter .docs-sidebar form.docs-search>input::-moz-placeholder{color:rgba(54,54,54,0.3)}.select select::-webkit-input-placeholder,.textarea::-webkit-input-placeholder,.input::-webkit-input-placeholder,#documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder{color:rgba(54,54,54,0.3)}.select select:-moz-placeholder,.textarea:-moz-placeholder,.input:-moz-placeholder,#documenter .docs-sidebar form.docs-search>input:-moz-placeholder{color:rgba(54,54,54,0.3)}.select select:-ms-input-placeholder,.textarea:-ms-input-placeholder,.input:-ms-input-placeholder,#documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder{color:rgba(54,54,54,0.3)}.select select:hover,.textarea:hover,.input:hover,#documenter .docs-sidebar form.docs-search>input:hover,.select select.is-hovered,.is-hovered.textarea,.is-hovered.input,#documenter .docs-sidebar form.docs-search>input.is-hovered{border-color:#b5b5b5}.select select:focus,.textarea:focus,.input:focus,#documenter .docs-sidebar form.docs-search>input:focus,.select select.is-focused,.is-focused.textarea,.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.select select:active,.textarea:active,.input:active,#documenter .docs-sidebar form.docs-search>input:active,.select select.is-active,.is-active.textarea,.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{border-color:#2e63b8;box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.select select[disabled],.textarea[disabled],.input[disabled],#documenter .docs-sidebar form.docs-search>input[disabled],fieldset[disabled] .select select,.select fieldset[disabled] select,fieldset[disabled] .textarea,fieldset[disabled] .input,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input{background-color:#f5f5f5;border-color:#f5f5f5;box-shadow:none;color:#6b6b6b}.select select[disabled]::-moz-placeholder,.textarea[disabled]::-moz-placeholder,.input[disabled]::-moz-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]::-moz-placeholder,fieldset[disabled] .select select::-moz-placeholder,.select fieldset[disabled] select::-moz-placeholder,fieldset[disabled] .textarea::-moz-placeholder,fieldset[disabled] .input::-moz-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input::-moz-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input::-moz-placeholder{color:rgba(107,107,107,0.3)}.select select[disabled]::-webkit-input-placeholder,.textarea[disabled]::-webkit-input-placeholder,.input[disabled]::-webkit-input-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]::-webkit-input-placeholder,fieldset[disabled] .select select::-webkit-input-placeholder,.select fieldset[disabled] select::-webkit-input-placeholder,fieldset[disabled] .textarea::-webkit-input-placeholder,fieldset[disabled] .input::-webkit-input-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input::-webkit-input-placeholder{color:rgba(107,107,107,0.3)}.select select[disabled]:-moz-placeholder,.textarea[disabled]:-moz-placeholder,.input[disabled]:-moz-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]:-moz-placeholder,fieldset[disabled] .select select:-moz-placeholder,.select fieldset[disabled] select:-moz-placeholder,fieldset[disabled] .textarea:-moz-placeholder,fieldset[disabled] .input:-moz-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input:-moz-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input:-moz-placeholder{color:rgba(107,107,107,0.3)}.select select[disabled]:-ms-input-placeholder,.textarea[disabled]:-ms-input-placeholder,.input[disabled]:-ms-input-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]:-ms-input-placeholder,fieldset[disabled] .select select:-ms-input-placeholder,.select fieldset[disabled] select:-ms-input-placeholder,fieldset[disabled] .textarea:-ms-input-placeholder,fieldset[disabled] .input:-ms-input-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input:-ms-input-placeholder{color:rgba(107,107,107,0.3)}.textarea,.input,#documenter .docs-sidebar form.docs-search>input{box-shadow:inset 0 1px 2px rgba(10,10,10,0.1);max-width:100%;width:100%}.textarea[readonly],.input[readonly],#documenter .docs-sidebar form.docs-search>input[readonly]{box-shadow:none}.is-white.textarea,.is-white.input,#documenter .docs-sidebar form.docs-search>input.is-white{border-color:#fff}.is-white.textarea:focus,.is-white.input:focus,#documenter .docs-sidebar form.docs-search>input.is-white:focus,.is-white.is-focused.textarea,.is-white.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-white.textarea:active,.is-white.input:active,#documenter .docs-sidebar form.docs-search>input.is-white:active,.is-white.is-active.textarea,.is-white.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}.is-black.textarea,.is-black.input,#documenter .docs-sidebar form.docs-search>input.is-black{border-color:#0a0a0a}.is-black.textarea:focus,.is-black.input:focus,#documenter .docs-sidebar form.docs-search>input.is-black:focus,.is-black.is-focused.textarea,.is-black.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-black.textarea:active,.is-black.input:active,#documenter .docs-sidebar form.docs-search>input.is-black:active,.is-black.is-active.textarea,.is-black.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}.is-light.textarea,.is-light.input,#documenter .docs-sidebar form.docs-search>input.is-light{border-color:#f5f5f5}.is-light.textarea:focus,.is-light.input:focus,#documenter .docs-sidebar form.docs-search>input.is-light:focus,.is-light.is-focused.textarea,.is-light.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-light.textarea:active,.is-light.input:active,#documenter .docs-sidebar form.docs-search>input.is-light:active,.is-light.is-active.textarea,.is-light.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(245,245,245,0.25)}.is-dark.textarea,.content kbd.textarea,.is-dark.input,#documenter .docs-sidebar form.docs-search>input.is-dark,.content kbd.input{border-color:#363636}.is-dark.textarea:focus,.content kbd.textarea:focus,.is-dark.input:focus,#documenter .docs-sidebar form.docs-search>input.is-dark:focus,.content kbd.input:focus,.is-dark.is-focused.textarea,.content kbd.is-focused.textarea,.is-dark.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.content kbd.is-focused.input,#documenter .docs-sidebar .content form.docs-search>input.is-focused,.is-dark.textarea:active,.content kbd.textarea:active,.is-dark.input:active,#documenter .docs-sidebar form.docs-search>input.is-dark:active,.content kbd.input:active,.is-dark.is-active.textarea,.content kbd.is-active.textarea,.is-dark.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active,.content kbd.is-active.input,#documenter .docs-sidebar .content form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(54,54,54,0.25)}.is-primary.textarea,.docstring>section>a.textarea.docs-sourcelink,.is-primary.input,#documenter .docs-sidebar form.docs-search>input.is-primary,.docstring>section>a.input.docs-sourcelink{border-color:#4eb5de}.is-primary.textarea:focus,.docstring>section>a.textarea.docs-sourcelink:focus,.is-primary.input:focus,#documenter .docs-sidebar form.docs-search>input.is-primary:focus,.docstring>section>a.input.docs-sourcelink:focus,.is-primary.is-focused.textarea,.docstring>section>a.is-focused.textarea.docs-sourcelink,.is-primary.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.docstring>section>a.is-focused.input.docs-sourcelink,.is-primary.textarea:active,.docstring>section>a.textarea.docs-sourcelink:active,.is-primary.input:active,#documenter .docs-sidebar form.docs-search>input.is-primary:active,.docstring>section>a.input.docs-sourcelink:active,.is-primary.is-active.textarea,.docstring>section>a.is-active.textarea.docs-sourcelink,.is-primary.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active,.docstring>section>a.is-active.input.docs-sourcelink{box-shadow:0 0 0 0.125em rgba(78,181,222,0.25)}.is-link.textarea,.is-link.input,#documenter .docs-sidebar form.docs-search>input.is-link{border-color:#2e63b8}.is-link.textarea:focus,.is-link.input:focus,#documenter .docs-sidebar form.docs-search>input.is-link:focus,.is-link.is-focused.textarea,.is-link.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-link.textarea:active,.is-link.input:active,#documenter .docs-sidebar form.docs-search>input.is-link:active,.is-link.is-active.textarea,.is-link.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.is-info.textarea,.is-info.input,#documenter .docs-sidebar form.docs-search>input.is-info{border-color:#209cee}.is-info.textarea:focus,.is-info.input:focus,#documenter .docs-sidebar form.docs-search>input.is-info:focus,.is-info.is-focused.textarea,.is-info.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-info.textarea:active,.is-info.input:active,#documenter .docs-sidebar form.docs-search>input.is-info:active,.is-info.is-active.textarea,.is-info.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(32,156,238,0.25)}.is-success.textarea,.is-success.input,#documenter .docs-sidebar form.docs-search>input.is-success{border-color:#22c35b}.is-success.textarea:focus,.is-success.input:focus,#documenter .docs-sidebar form.docs-search>input.is-success:focus,.is-success.is-focused.textarea,.is-success.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-success.textarea:active,.is-success.input:active,#documenter .docs-sidebar form.docs-search>input.is-success:active,.is-success.is-active.textarea,.is-success.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(34,195,91,0.25)}.is-warning.textarea,.is-warning.input,#documenter .docs-sidebar form.docs-search>input.is-warning{border-color:#ffdd57}.is-warning.textarea:focus,.is-warning.input:focus,#documenter .docs-sidebar form.docs-search>input.is-warning:focus,.is-warning.is-focused.textarea,.is-warning.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-warning.textarea:active,.is-warning.input:active,#documenter .docs-sidebar form.docs-search>input.is-warning:active,.is-warning.is-active.textarea,.is-warning.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(255,221,87,0.25)}.is-danger.textarea,.is-danger.input,#documenter .docs-sidebar form.docs-search>input.is-danger{border-color:#da0b00}.is-danger.textarea:focus,.is-danger.input:focus,#documenter .docs-sidebar form.docs-search>input.is-danger:focus,.is-danger.is-focused.textarea,.is-danger.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-danger.textarea:active,.is-danger.input:active,#documenter .docs-sidebar form.docs-search>input.is-danger:active,.is-danger.is-active.textarea,.is-danger.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(218,11,0,0.25)}.is-small.textarea,.is-small.input,#documenter .docs-sidebar form.docs-search>input{border-radius:2px;font-size:.75rem}.is-medium.textarea,.is-medium.input,#documenter .docs-sidebar form.docs-search>input.is-medium{font-size:1.25rem}.is-large.textarea,.is-large.input,#documenter .docs-sidebar form.docs-search>input.is-large{font-size:1.5rem}.is-fullwidth.textarea,.is-fullwidth.input,#documenter .docs-sidebar form.docs-search>input.is-fullwidth{display:block;width:100%}.is-inline.textarea,.is-inline.input,#documenter .docs-sidebar form.docs-search>input.is-inline{display:inline;width:auto}.input.is-rounded,#documenter .docs-sidebar form.docs-search>input{border-radius:290486px;padding-left:1em;padding-right:1em}.input.is-static,#documenter .docs-sidebar form.docs-search>input.is-static{background-color:transparent;border-color:transparent;box-shadow:none;padding-left:0;padding-right:0}.textarea{display:block;max-width:100%;min-width:100%;padding:0.625em;resize:vertical}.textarea:not([rows]){max-height:600px;min-height:120px}.textarea[rows]{height:initial}.textarea.has-fixed-size{resize:none}.radio,.checkbox{cursor:pointer;display:inline-block;line-height:1.25;position:relative}.radio input,.checkbox input{cursor:pointer}.radio:hover,.checkbox:hover{color:#363636}.radio[disabled],.checkbox[disabled],fieldset[disabled] .radio,fieldset[disabled] .checkbox{color:#6b6b6b;cursor:not-allowed}.radio+.radio{margin-left:0.5em}.select{display:inline-block;max-width:100%;position:relative;vertical-align:top}.select:not(.is-multiple){height:2.25em}.select:not(.is-multiple):not(.is-loading)::after{border-color:#2e63b8;right:1.125em;z-index:4}.select.is-rounded select,#documenter .docs-sidebar form.docs-search>input.select select{border-radius:290486px;padding-left:1em}.select select{cursor:pointer;display:block;font-size:1em;max-width:100%;outline:none}.select select::-ms-expand{display:none}.select select[disabled]:hover,fieldset[disabled] .select select:hover{border-color:#f5f5f5}.select select:not([multiple]){padding-right:2.5em}.select select[multiple]{height:auto;padding:0}.select select[multiple] option{padding:0.5em 1em}.select:not(.is-multiple):not(.is-loading):hover::after{border-color:#363636}.select.is-white:not(:hover)::after{border-color:#fff}.select.is-white select{border-color:#fff}.select.is-white select:hover,.select.is-white select.is-hovered{border-color:#f2f2f2}.select.is-white select:focus,.select.is-white select.is-focused,.select.is-white select:active,.select.is-white select.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}.select.is-black:not(:hover)::after{border-color:#0a0a0a}.select.is-black select{border-color:#0a0a0a}.select.is-black select:hover,.select.is-black select.is-hovered{border-color:#000}.select.is-black select:focus,.select.is-black select.is-focused,.select.is-black select:active,.select.is-black select.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}.select.is-light:not(:hover)::after{border-color:#f5f5f5}.select.is-light select{border-color:#f5f5f5}.select.is-light select:hover,.select.is-light select.is-hovered{border-color:#e8e8e8}.select.is-light select:focus,.select.is-light select.is-focused,.select.is-light select:active,.select.is-light select.is-active{box-shadow:0 0 0 0.125em rgba(245,245,245,0.25)}.select.is-dark:not(:hover)::after,.content kbd.select:not(:hover)::after{border-color:#363636}.select.is-dark select,.content kbd.select select{border-color:#363636}.select.is-dark select:hover,.content kbd.select select:hover,.select.is-dark select.is-hovered,.content kbd.select select.is-hovered{border-color:#292929}.select.is-dark select:focus,.content kbd.select select:focus,.select.is-dark select.is-focused,.content kbd.select select.is-focused,.select.is-dark select:active,.content kbd.select select:active,.select.is-dark select.is-active,.content kbd.select select.is-active{box-shadow:0 0 0 0.125em rgba(54,54,54,0.25)}.select.is-primary:not(:hover)::after,.docstring>section>a.select.docs-sourcelink:not(:hover)::after{border-color:#4eb5de}.select.is-primary select,.docstring>section>a.select.docs-sourcelink select{border-color:#4eb5de}.select.is-primary select:hover,.docstring>section>a.select.docs-sourcelink select:hover,.select.is-primary select.is-hovered,.docstring>section>a.select.docs-sourcelink select.is-hovered{border-color:#39acda}.select.is-primary select:focus,.docstring>section>a.select.docs-sourcelink select:focus,.select.is-primary select.is-focused,.docstring>section>a.select.docs-sourcelink select.is-focused,.select.is-primary select:active,.docstring>section>a.select.docs-sourcelink select:active,.select.is-primary select.is-active,.docstring>section>a.select.docs-sourcelink select.is-active{box-shadow:0 0 0 0.125em rgba(78,181,222,0.25)}.select.is-link:not(:hover)::after{border-color:#2e63b8}.select.is-link select{border-color:#2e63b8}.select.is-link select:hover,.select.is-link select.is-hovered{border-color:#2958a4}.select.is-link select:focus,.select.is-link select.is-focused,.select.is-link select:active,.select.is-link select.is-active{box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.select.is-info:not(:hover)::after{border-color:#209cee}.select.is-info select{border-color:#209cee}.select.is-info select:hover,.select.is-info select.is-hovered{border-color:#1190e3}.select.is-info select:focus,.select.is-info select.is-focused,.select.is-info select:active,.select.is-info select.is-active{box-shadow:0 0 0 0.125em rgba(32,156,238,0.25)}.select.is-success:not(:hover)::after{border-color:#22c35b}.select.is-success select{border-color:#22c35b}.select.is-success select:hover,.select.is-success select.is-hovered{border-color:#1ead51}.select.is-success select:focus,.select.is-success select.is-focused,.select.is-success select:active,.select.is-success select.is-active{box-shadow:0 0 0 0.125em rgba(34,195,91,0.25)}.select.is-warning:not(:hover)::after{border-color:#ffdd57}.select.is-warning select{border-color:#ffdd57}.select.is-warning select:hover,.select.is-warning select.is-hovered{border-color:#ffd83e}.select.is-warning select:focus,.select.is-warning select.is-focused,.select.is-warning select:active,.select.is-warning select.is-active{box-shadow:0 0 0 0.125em rgba(255,221,87,0.25)}.select.is-danger:not(:hover)::after{border-color:#da0b00}.select.is-danger select{border-color:#da0b00}.select.is-danger select:hover,.select.is-danger select.is-hovered{border-color:#c10a00}.select.is-danger select:focus,.select.is-danger select.is-focused,.select.is-danger select:active,.select.is-danger select.is-active{box-shadow:0 0 0 0.125em rgba(218,11,0,0.25)}.select.is-small,#documenter .docs-sidebar form.docs-search>input.select{border-radius:2px;font-size:.75rem}.select.is-medium{font-size:1.25rem}.select.is-large{font-size:1.5rem}.select.is-disabled::after{border-color:#6b6b6b}.select.is-fullwidth{width:100%}.select.is-fullwidth select{width:100%}.select.is-loading::after{margin-top:0;position:absolute;right:0.625em;top:0.625em;transform:none}.select.is-loading.is-small:after,#documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.75rem}.select.is-loading.is-medium:after{font-size:1.25rem}.select.is-loading.is-large:after{font-size:1.5rem}.file{align-items:stretch;display:flex;justify-content:flex-start;position:relative}.file.is-white .file-cta{background-color:#fff;border-color:transparent;color:#0a0a0a}.file.is-white:hover .file-cta,.file.is-white.is-hovered .file-cta{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.file.is-white:focus .file-cta,.file.is-white.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(255,255,255,0.25);color:#0a0a0a}.file.is-white:active .file-cta,.file.is-white.is-active .file-cta{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.file.is-black .file-cta{background-color:#0a0a0a;border-color:transparent;color:#fff}.file.is-black:hover .file-cta,.file.is-black.is-hovered .file-cta{background-color:#040404;border-color:transparent;color:#fff}.file.is-black:focus .file-cta,.file.is-black.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(10,10,10,0.25);color:#fff}.file.is-black:active .file-cta,.file.is-black.is-active .file-cta{background-color:#000;border-color:transparent;color:#fff}.file.is-light .file-cta{background-color:#f5f5f5;border-color:transparent;color:#363636}.file.is-light:hover .file-cta,.file.is-light.is-hovered .file-cta{background-color:#eee;border-color:transparent;color:#363636}.file.is-light:focus .file-cta,.file.is-light.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(245,245,245,0.25);color:#363636}.file.is-light:active .file-cta,.file.is-light.is-active .file-cta{background-color:#e8e8e8;border-color:transparent;color:#363636}.file.is-dark .file-cta,.content kbd.file .file-cta{background-color:#363636;border-color:transparent;color:#f5f5f5}.file.is-dark:hover .file-cta,.content kbd.file:hover .file-cta,.file.is-dark.is-hovered .file-cta,.content kbd.file.is-hovered .file-cta{background-color:#2f2f2f;border-color:transparent;color:#f5f5f5}.file.is-dark:focus .file-cta,.content kbd.file:focus .file-cta,.file.is-dark.is-focused .file-cta,.content kbd.file.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(54,54,54,0.25);color:#f5f5f5}.file.is-dark:active .file-cta,.content kbd.file:active .file-cta,.file.is-dark.is-active .file-cta,.content kbd.file.is-active .file-cta{background-color:#292929;border-color:transparent;color:#f5f5f5}.file.is-primary .file-cta,.docstring>section>a.file.docs-sourcelink .file-cta{background-color:#4eb5de;border-color:transparent;color:#fff}.file.is-primary:hover .file-cta,.docstring>section>a.file.docs-sourcelink:hover .file-cta,.file.is-primary.is-hovered .file-cta,.docstring>section>a.file.is-hovered.docs-sourcelink .file-cta{background-color:#43b1dc;border-color:transparent;color:#fff}.file.is-primary:focus .file-cta,.docstring>section>a.file.docs-sourcelink:focus .file-cta,.file.is-primary.is-focused .file-cta,.docstring>section>a.file.is-focused.docs-sourcelink .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(78,181,222,0.25);color:#fff}.file.is-primary:active .file-cta,.docstring>section>a.file.docs-sourcelink:active .file-cta,.file.is-primary.is-active .file-cta,.docstring>section>a.file.is-active.docs-sourcelink .file-cta{background-color:#39acda;border-color:transparent;color:#fff}.file.is-link .file-cta{background-color:#2e63b8;border-color:transparent;color:#fff}.file.is-link:hover .file-cta,.file.is-link.is-hovered .file-cta{background-color:#2b5eae;border-color:transparent;color:#fff}.file.is-link:focus .file-cta,.file.is-link.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(46,99,184,0.25);color:#fff}.file.is-link:active .file-cta,.file.is-link.is-active .file-cta{background-color:#2958a4;border-color:transparent;color:#fff}.file.is-info .file-cta{background-color:#209cee;border-color:transparent;color:#fff}.file.is-info:hover .file-cta,.file.is-info.is-hovered .file-cta{background-color:#1497ed;border-color:transparent;color:#fff}.file.is-info:focus .file-cta,.file.is-info.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(32,156,238,0.25);color:#fff}.file.is-info:active .file-cta,.file.is-info.is-active .file-cta{background-color:#1190e3;border-color:transparent;color:#fff}.file.is-success .file-cta{background-color:#22c35b;border-color:transparent;color:#fff}.file.is-success:hover .file-cta,.file.is-success.is-hovered .file-cta{background-color:#20b856;border-color:transparent;color:#fff}.file.is-success:focus .file-cta,.file.is-success.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(34,195,91,0.25);color:#fff}.file.is-success:active .file-cta,.file.is-success.is-active .file-cta{background-color:#1ead51;border-color:transparent;color:#fff}.file.is-warning .file-cta{background-color:#ffdd57;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-warning:hover .file-cta,.file.is-warning.is-hovered .file-cta{background-color:#ffda4a;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-warning:focus .file-cta,.file.is-warning.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(255,221,87,0.25);color:rgba(0,0,0,0.7)}.file.is-warning:active .file-cta,.file.is-warning.is-active .file-cta{background-color:#ffd83e;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-danger .file-cta{background-color:#da0b00;border-color:transparent;color:#fff}.file.is-danger:hover .file-cta,.file.is-danger.is-hovered .file-cta{background-color:#cd0a00;border-color:transparent;color:#fff}.file.is-danger:focus .file-cta,.file.is-danger.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(218,11,0,0.25);color:#fff}.file.is-danger:active .file-cta,.file.is-danger.is-active .file-cta{background-color:#c10a00;border-color:transparent;color:#fff}.file.is-small,#documenter .docs-sidebar form.docs-search>input.file{font-size:.75rem}.file.is-medium{font-size:1.25rem}.file.is-medium .file-icon .fa{font-size:21px}.file.is-large{font-size:1.5rem}.file.is-large .file-icon .fa{font-size:28px}.file.has-name .file-cta{border-bottom-right-radius:0;border-top-right-radius:0}.file.has-name .file-name{border-bottom-left-radius:0;border-top-left-radius:0}.file.has-name.is-empty .file-cta{border-radius:4px}.file.has-name.is-empty .file-name{display:none}.file.is-boxed .file-label{flex-direction:column}.file.is-boxed .file-cta{flex-direction:column;height:auto;padding:1em 3em}.file.is-boxed .file-name{border-width:0 1px 1px}.file.is-boxed .file-icon{height:1.5em;width:1.5em}.file.is-boxed .file-icon .fa{font-size:21px}.file.is-boxed.is-small .file-icon .fa,#documenter .docs-sidebar form.docs-search>input.is-boxed .file-icon .fa{font-size:14px}.file.is-boxed.is-medium .file-icon .fa{font-size:28px}.file.is-boxed.is-large .file-icon .fa{font-size:35px}.file.is-boxed.has-name .file-cta{border-radius:4px 4px 0 0}.file.is-boxed.has-name .file-name{border-radius:0 0 4px 4px;border-width:0 1px 1px}.file.is-centered{justify-content:center}.file.is-fullwidth .file-label{width:100%}.file.is-fullwidth .file-name{flex-grow:1;max-width:none}.file.is-right{justify-content:flex-end}.file.is-right .file-cta{border-radius:0 4px 4px 0}.file.is-right .file-name{border-radius:4px 0 0 4px;border-width:1px 0 1px 1px;order:-1}.file-label{align-items:stretch;display:flex;cursor:pointer;justify-content:flex-start;overflow:hidden;position:relative}.file-label:hover .file-cta{background-color:#eee;color:#363636}.file-label:hover .file-name{border-color:#d5d5d5}.file-label:active .file-cta{background-color:#e8e8e8;color:#363636}.file-label:active .file-name{border-color:#cfcfcf}.file-input{height:100%;left:0;opacity:0;outline:none;position:absolute;top:0;width:100%}.file-cta,.file-name{border-color:#dbdbdb;border-radius:4px;font-size:1em;padding-left:1em;padding-right:1em;white-space:nowrap}.file-cta{background-color:#f5f5f5;color:#4a4a4a}.file-name{border-color:#dbdbdb;border-style:solid;border-width:1px 1px 1px 0;display:block;max-width:16em;overflow:hidden;text-align:left;text-overflow:ellipsis}.file-icon{align-items:center;display:flex;height:1em;justify-content:center;margin-right:0.5em;width:1em}.file-icon .fa{font-size:14px}.label{color:#363636;display:block;font-size:1rem;font-weight:700}.label:not(:last-child){margin-bottom:0.5em}.label.is-small,#documenter .docs-sidebar form.docs-search>input.label{font-size:.75rem}.label.is-medium{font-size:1.25rem}.label.is-large{font-size:1.5rem}.help{display:block;font-size:.75rem;margin-top:0.25rem}.help.is-white{color:#fff}.help.is-black{color:#0a0a0a}.help.is-light{color:#f5f5f5}.help.is-dark,.content kbd.help{color:#363636}.help.is-primary,.docstring>section>a.help.docs-sourcelink{color:#4eb5de}.help.is-link{color:#2e63b8}.help.is-info{color:#209cee}.help.is-success{color:#22c35b}.help.is-warning{color:#ffdd57}.help.is-danger{color:#da0b00}.field:not(:last-child){margin-bottom:0.75rem}.field.has-addons{display:flex;justify-content:flex-start}.field.has-addons .control:not(:last-child){margin-right:-1px}.field.has-addons .control:not(:first-child):not(:last-child) .button,.field.has-addons .control:not(:first-child):not(:last-child) .input,.field.has-addons .control:not(:first-child):not(:last-child) #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .field.has-addons .control:not(:first-child):not(:last-child) form.docs-search>input,.field.has-addons .control:not(:first-child):not(:last-child) .select select{border-radius:0}.field.has-addons .control:first-child:not(:only-child) .button,.field.has-addons .control:first-child:not(:only-child) .input,.field.has-addons .control:first-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .field.has-addons .control:first-child:not(:only-child) form.docs-search>input,.field.has-addons .control:first-child:not(:only-child) .select select{border-bottom-right-radius:0;border-top-right-radius:0}.field.has-addons .control:last-child:not(:only-child) .button,.field.has-addons .control:last-child:not(:only-child) .input,.field.has-addons .control:last-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .field.has-addons .control:last-child:not(:only-child) form.docs-search>input,.field.has-addons .control:last-child:not(:only-child) .select select{border-bottom-left-radius:0;border-top-left-radius:0}.field.has-addons .control .button:not([disabled]):hover,.field.has-addons .control .button.is-hovered:not([disabled]),.field.has-addons .control .input:not([disabled]):hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):hover,.field.has-addons .control .input.is-hovered:not([disabled]),.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-hovered:not([disabled]),#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-hovered:not([disabled]),.field.has-addons .control .select select:not([disabled]):hover,.field.has-addons .control .select select.is-hovered:not([disabled]){z-index:2}.field.has-addons .control .button:not([disabled]):focus,.field.has-addons .control .button.is-focused:not([disabled]),.field.has-addons .control .button:not([disabled]):active,.field.has-addons .control .button.is-active:not([disabled]),.field.has-addons .control .input:not([disabled]):focus,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus,.field.has-addons .control .input.is-focused:not([disabled]),.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]),#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]),.field.has-addons .control .input:not([disabled]):active,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active,.field.has-addons .control .input.is-active:not([disabled]),.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]),#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]),.field.has-addons .control .select select:not([disabled]):focus,.field.has-addons .control .select select.is-focused:not([disabled]),.field.has-addons .control .select select:not([disabled]):active,.field.has-addons .control .select select.is-active:not([disabled]){z-index:3}.field.has-addons .control .button:not([disabled]):focus:hover,.field.has-addons .control .button.is-focused:not([disabled]):hover,.field.has-addons .control .button:not([disabled]):active:hover,.field.has-addons .control .button.is-active:not([disabled]):hover,.field.has-addons .control .input:not([disabled]):focus:hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus:hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus:hover,.field.has-addons .control .input.is-focused:not([disabled]):hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]):hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]):hover,.field.has-addons .control .input:not([disabled]):active:hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active:hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active:hover,.field.has-addons .control .input.is-active:not([disabled]):hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]):hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]):hover,.field.has-addons .control .select select:not([disabled]):focus:hover,.field.has-addons .control .select select.is-focused:not([disabled]):hover,.field.has-addons .control .select select:not([disabled]):active:hover,.field.has-addons .control .select select.is-active:not([disabled]):hover{z-index:4}.field.has-addons .control.is-expanded{flex-grow:1;flex-shrink:1}.field.has-addons.has-addons-centered{justify-content:center}.field.has-addons.has-addons-right{justify-content:flex-end}.field.has-addons.has-addons-fullwidth .control{flex-grow:1;flex-shrink:0}.field.is-grouped{display:flex;justify-content:flex-start}.field.is-grouped>.control{flex-shrink:0}.field.is-grouped>.control:not(:last-child){margin-bottom:0;margin-right:0.75rem}.field.is-grouped>.control.is-expanded{flex-grow:1;flex-shrink:1}.field.is-grouped.is-grouped-centered{justify-content:center}.field.is-grouped.is-grouped-right{justify-content:flex-end}.field.is-grouped.is-grouped-multiline{flex-wrap:wrap}.field.is-grouped.is-grouped-multiline>.control:last-child,.field.is-grouped.is-grouped-multiline>.control:not(:last-child){margin-bottom:0.75rem}.field.is-grouped.is-grouped-multiline:last-child{margin-bottom:-0.75rem}.field.is-grouped.is-grouped-multiline:not(:last-child){margin-bottom:0}@media screen and (min-width: 769px),print{.field.is-horizontal{display:flex}}.field-label .label{font-size:inherit}@media screen and (max-width: 768px){.field-label{margin-bottom:0.5rem}}@media screen and (min-width: 769px),print{.field-label{flex-basis:0;flex-grow:1;flex-shrink:0;margin-right:1.5rem;text-align:right}.field-label.is-small,#documenter .docs-sidebar form.docs-search>input.field-label{font-size:.75rem;padding-top:0.375em}.field-label.is-normal{padding-top:0.375em}.field-label.is-medium{font-size:1.25rem;padding-top:0.375em}.field-label.is-large{font-size:1.5rem;padding-top:0.375em}}.field-body .field .field{margin-bottom:0}@media screen and (min-width: 769px),print{.field-body{display:flex;flex-basis:0;flex-grow:5;flex-shrink:1}.field-body .field{margin-bottom:0}.field-body>.field{flex-shrink:1}.field-body>.field:not(.is-narrow){flex-grow:1}.field-body>.field:not(:last-child){margin-right:0.75rem}}.control{box-sizing:border-box;clear:both;font-size:1rem;position:relative;text-align:left}.control.has-icons-left .input:focus~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input:focus~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input:focus~.icon,.control.has-icons-left .select:focus~.icon,.control.has-icons-right .input:focus~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input:focus~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input:focus~.icon,.control.has-icons-right .select:focus~.icon{color:#6b6b6b}.control.has-icons-left .input.is-small~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input~.icon,.control.has-icons-left .select.is-small~.icon,.control.has-icons-right .input.is-small~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input~.icon,.control.has-icons-right .select.is-small~.icon{font-size:.75rem}.control.has-icons-left .input.is-medium~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-medium~.icon,.control.has-icons-left .select.is-medium~.icon,.control.has-icons-right .input.is-medium~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-medium~.icon,.control.has-icons-right .select.is-medium~.icon{font-size:1.25rem}.control.has-icons-left .input.is-large~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-large~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-large~.icon,.control.has-icons-left .select.is-large~.icon,.control.has-icons-right .input.is-large~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-large~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-large~.icon,.control.has-icons-right .select.is-large~.icon{font-size:1.5rem}.control.has-icons-left .icon,.control.has-icons-right .icon{color:#dbdbdb;height:2.25em;pointer-events:none;position:absolute;top:0;width:2.25em;z-index:4}.control.has-icons-left .input,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input,.control.has-icons-left .select select{padding-left:2.25em}.control.has-icons-left .icon.is-left{left:0}.control.has-icons-right .input,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input,.control.has-icons-right .select select{padding-right:2.25em}.control.has-icons-right .icon.is-right{right:0}.control.is-loading::after{position:absolute !important;right:0.625em;top:0.625em;z-index:4}.control.is-loading.is-small:after,#documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.75rem}.control.is-loading.is-medium:after{font-size:1.25rem}.control.is-loading.is-large:after{font-size:1.5rem}.breadcrumb{font-size:1rem;white-space:nowrap}.breadcrumb a{align-items:center;color:#2e63b8;display:flex;justify-content:center;padding:0 .75em}.breadcrumb a:hover{color:#363636}.breadcrumb li{align-items:center;display:flex}.breadcrumb li:first-child a{padding-left:0}.breadcrumb li.is-active a{color:#222;cursor:default;pointer-events:none}.breadcrumb li+li::before{color:#b5b5b5;content:"\0002f"}.breadcrumb ul,.breadcrumb ol{align-items:flex-start;display:flex;flex-wrap:wrap;justify-content:flex-start}.breadcrumb .icon:first-child{margin-right:0.5em}.breadcrumb .icon:last-child{margin-left:0.5em}.breadcrumb.is-centered ol,.breadcrumb.is-centered ul{justify-content:center}.breadcrumb.is-right ol,.breadcrumb.is-right ul{justify-content:flex-end}.breadcrumb.is-small,#documenter .docs-sidebar form.docs-search>input.breadcrumb{font-size:.75rem}.breadcrumb.is-medium{font-size:1.25rem}.breadcrumb.is-large{font-size:1.5rem}.breadcrumb.has-arrow-separator li+li::before{content:"\02192"}.breadcrumb.has-bullet-separator li+li::before{content:"\02022"}.breadcrumb.has-dot-separator li+li::before{content:"\000b7"}.breadcrumb.has-succeeds-separator li+li::before{content:"\0227B"}.card{background-color:#fff;box-shadow:0 2px 3px rgba(10,10,10,0.1),0 0 0 1px rgba(10,10,10,0.1);color:#222;max-width:100%;position:relative}.card-header{background-color:rgba(0,0,0,0);align-items:stretch;box-shadow:0 1px 2px rgba(10,10,10,0.1);display:flex}.card-header-title{align-items:center;color:#222;display:flex;flex-grow:1;font-weight:700;padding:.75rem}.card-header-title.is-centered{justify-content:center}.card-header-icon{align-items:center;cursor:pointer;display:flex;justify-content:center;padding:.75rem}.card-image{display:block;position:relative}.card-content{background-color:rgba(0,0,0,0);padding:1.5rem}.card-footer{background-color:rgba(0,0,0,0);border-top:1px solid #dbdbdb;align-items:stretch;display:flex}.card-footer-item{align-items:center;display:flex;flex-basis:0;flex-grow:1;flex-shrink:0;justify-content:center;padding:.75rem}.card-footer-item:not(:last-child){border-right:1px solid #dbdbdb}.card .media:not(:last-child){margin-bottom:1.5rem}.dropdown{display:inline-flex;position:relative;vertical-align:top}.dropdown.is-active .dropdown-menu,.dropdown.is-hoverable:hover .dropdown-menu{display:block}.dropdown.is-right .dropdown-menu{left:auto;right:0}.dropdown.is-up .dropdown-menu{bottom:100%;padding-bottom:4px;padding-top:initial;top:auto}.dropdown-menu{display:none;left:0;min-width:12rem;padding-top:4px;position:absolute;top:100%;z-index:20}.dropdown-content{background-color:#fff;border-radius:4px;box-shadow:0 2px 3px rgba(10,10,10,0.1),0 0 0 1px rgba(10,10,10,0.1);padding-bottom:.5rem;padding-top:.5rem}.dropdown-item{color:#4a4a4a;display:block;font-size:0.875rem;line-height:1.5;padding:0.375rem 1rem;position:relative}a.dropdown-item,button.dropdown-item{padding-right:3rem;text-align:left;white-space:nowrap;width:100%}a.dropdown-item:hover,button.dropdown-item:hover{background-color:#f5f5f5;color:#0a0a0a}a.dropdown-item.is-active,button.dropdown-item.is-active{background-color:#2e63b8;color:#fff}.dropdown-divider{background-color:#dbdbdb;border:none;display:block;height:1px;margin:0.5rem 0}.level{align-items:center;justify-content:space-between}.level code{border-radius:4px}.level img{display:inline-block;vertical-align:top}.level.is-mobile{display:flex}.level.is-mobile .level-left,.level.is-mobile .level-right{display:flex}.level.is-mobile .level-left+.level-right{margin-top:0}.level.is-mobile .level-item:not(:last-child){margin-bottom:0;margin-right:.75rem}.level.is-mobile .level-item:not(.is-narrow){flex-grow:1}@media screen and (min-width: 769px),print{.level{display:flex}.level>.level-item:not(.is-narrow){flex-grow:1}}.level-item{align-items:center;display:flex;flex-basis:auto;flex-grow:0;flex-shrink:0;justify-content:center}.level-item .title,.level-item .subtitle{margin-bottom:0}@media screen and (max-width: 768px){.level-item:not(:last-child){margin-bottom:.75rem}}.level-left,.level-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.level-left .level-item.is-flexible,.level-right .level-item.is-flexible{flex-grow:1}@media screen and (min-width: 769px),print{.level-left .level-item:not(:last-child),.level-right .level-item:not(:last-child){margin-right:.75rem}}.level-left{align-items:center;justify-content:flex-start}@media screen and (max-width: 768px){.level-left+.level-right{margin-top:1.5rem}}@media screen and (min-width: 769px),print{.level-left{display:flex}}.level-right{align-items:center;justify-content:flex-end}@media screen and (min-width: 769px),print{.level-right{display:flex}}.list{background-color:#fff;border-radius:4px;box-shadow:0 2px 3px rgba(10,10,10,0.1),0 0 0 1px rgba(10,10,10,0.1)}.list-item{display:block;padding:0.5em 1em}.list-item:not(a){color:#222}.list-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-item:last-child{border-bottom-left-radius:4px;border-bottom-right-radius:4px}.list-item:not(:last-child){border-bottom:1px solid #dbdbdb}.list-item.is-active{background-color:#2e63b8;color:#fff}a.list-item{background-color:#f5f5f5;cursor:pointer}.media{align-items:flex-start;display:flex;text-align:left}.media .content:not(:last-child){margin-bottom:0.75rem}.media .media{border-top:1px solid rgba(219,219,219,0.5);display:flex;padding-top:0.75rem}.media .media .content:not(:last-child),.media .media .control:not(:last-child){margin-bottom:0.5rem}.media .media .media{padding-top:0.5rem}.media .media .media+.media{margin-top:0.5rem}.media+.media{border-top:1px solid rgba(219,219,219,0.5);margin-top:1rem;padding-top:1rem}.media.is-large+.media{margin-top:1.5rem;padding-top:1.5rem}.media-left,.media-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.media-left{margin-right:1rem}.media-right{margin-left:1rem}.media-content{flex-basis:auto;flex-grow:1;flex-shrink:1;text-align:left}@media screen and (max-width: 768px){.media-content{overflow-x:auto}}.menu{font-size:1rem}.menu.is-small,#documenter .docs-sidebar form.docs-search>input.menu{font-size:.75rem}.menu.is-medium{font-size:1.25rem}.menu.is-large{font-size:1.5rem}.menu-list{line-height:1.25}.menu-list a{border-radius:2px;color:#222;display:block;padding:0.5em 0.75em}.menu-list a:hover{background-color:#f5f5f5;color:#222}.menu-list a.is-active{background-color:#2e63b8;color:#fff}.menu-list li ul{border-left:1px solid #dbdbdb;margin:.75em;padding-left:.75em}.menu-label{color:#6b6b6b;font-size:.75em;letter-spacing:.1em;text-transform:uppercase}.menu-label:not(:first-child){margin-top:1em}.menu-label:not(:last-child){margin-bottom:1em}.message{background-color:#f5f5f5;border-radius:4px;font-size:1rem}.message strong{color:currentColor}.message a:not(.button):not(.tag):not(.dropdown-item){color:currentColor;text-decoration:underline}.message.is-small,#documenter .docs-sidebar form.docs-search>input.message{font-size:.75rem}.message.is-medium{font-size:1.25rem}.message.is-large{font-size:1.5rem}.message.is-white{background-color:#fff}.message.is-white .message-header{background-color:#fff;color:#0a0a0a}.message.is-white .message-body{border-color:#fff;color:#4d4d4d}.message.is-black{background-color:#fafafa}.message.is-black .message-header{background-color:#0a0a0a;color:#fff}.message.is-black .message-body{border-color:#0a0a0a;color:#090909}.message.is-light{background-color:#fafafa}.message.is-light .message-header{background-color:#f5f5f5;color:#363636}.message.is-light .message-body{border-color:#f5f5f5;color:#505050}.message.is-dark,.content kbd.message{background-color:#fafafa}.message.is-dark .message-header,.content kbd.message .message-header{background-color:#363636;color:#f5f5f5}.message.is-dark .message-body,.content kbd.message .message-body{border-color:#363636;color:#2a2a2a}.message.is-primary,.docstring>section>a.message.docs-sourcelink{background-color:#f6fbfd}.message.is-primary .message-header,.docstring>section>a.message.docs-sourcelink .message-header{background-color:#4eb5de;color:#fff}.message.is-primary .message-body,.docstring>section>a.message.docs-sourcelink .message-body{border-color:#4eb5de;color:#1f556a}.message.is-link{background-color:#f7f9fd}.message.is-link .message-header{background-color:#2e63b8;color:#fff}.message.is-link .message-body{border-color:#2e63b8;color:#264981}.message.is-info{background-color:#f6fbfe}.message.is-info .message-header{background-color:#209cee;color:#fff}.message.is-info .message-body{border-color:#209cee;color:#12537d}.message.is-success{background-color:#f6fdf9}.message.is-success .message-header{background-color:#22c35b;color:#fff}.message.is-success .message-body{border-color:#22c35b;color:#0f361d}.message.is-warning{background-color:#fffdf5}.message.is-warning .message-header{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.message.is-warning .message-body{border-color:#ffdd57;color:#3c3108}.message.is-danger{background-color:#fff5f5}.message.is-danger .message-header{background-color:#da0b00;color:#fff}.message.is-danger .message-body{border-color:#da0b00;color:#9b0c04}.message-header{align-items:center;background-color:#222;border-radius:4px 4px 0 0;color:#fff;display:flex;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.75em 1em;position:relative}.message-header .delete{flex-grow:0;flex-shrink:0;margin-left:0.75em}.message-header+.message-body{border-width:0;border-top-left-radius:0;border-top-right-radius:0}.message-body{border-color:#dbdbdb;border-radius:4px;border-style:solid;border-width:0 0 0 4px;color:#222;padding:1.25em 1.5em}.message-body code,.message-body pre{background-color:#fff}.message-body pre code{background-color:rgba(0,0,0,0)}.modal{align-items:center;display:none;flex-direction:column;justify-content:center;overflow:hidden;position:fixed;z-index:40}.modal.is-active{display:flex}.modal-background{background-color:rgba(10,10,10,0.86)}.modal-content,.modal-card{margin:0 20px;max-height:calc(100vh - 160px);overflow:auto;position:relative;width:100%}@media screen and (min-width: 769px),print{.modal-content,.modal-card{margin:0 auto;max-height:calc(100vh - 40px);width:640px}}.modal-close{background:none;height:40px;position:fixed;right:20px;top:20px;width:40px}.modal-card{display:flex;flex-direction:column;max-height:calc(100vh - 40px);overflow:hidden;-ms-overflow-y:visible}.modal-card-head,.modal-card-foot{align-items:center;background-color:#f5f5f5;display:flex;flex-shrink:0;justify-content:flex-start;padding:20px;position:relative}.modal-card-head{border-bottom:1px solid #dbdbdb;border-top-left-radius:6px;border-top-right-radius:6px}.modal-card-title{color:#222;flex-grow:1;flex-shrink:0;font-size:1.5rem;line-height:1}.modal-card-foot{border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:1px solid #dbdbdb}.modal-card-foot .button:not(:last-child){margin-right:0.5em}.modal-card-body{-webkit-overflow-scrolling:touch;background-color:#fff;flex-grow:1;flex-shrink:1;overflow:auto;padding:20px}.navbar{background-color:#fff;min-height:3.25rem;position:relative;z-index:30}.navbar.is-white{background-color:#fff;color:#0a0a0a}.navbar.is-white .navbar-brand>.navbar-item,.navbar.is-white .navbar-brand .navbar-link{color:#0a0a0a}.navbar.is-white .navbar-brand>a.navbar-item:focus,.navbar.is-white .navbar-brand>a.navbar-item:hover,.navbar.is-white .navbar-brand>a.navbar-item.is-active,.navbar.is-white .navbar-brand .navbar-link:focus,.navbar.is-white .navbar-brand .navbar-link:hover,.navbar.is-white .navbar-brand .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-burger{color:#0a0a0a}@media screen and (min-width: 1056px){.navbar.is-white .navbar-start>.navbar-item,.navbar.is-white .navbar-start .navbar-link,.navbar.is-white .navbar-end>.navbar-item,.navbar.is-white .navbar-end .navbar-link{color:#0a0a0a}.navbar.is-white .navbar-start>a.navbar-item:focus,.navbar.is-white .navbar-start>a.navbar-item:hover,.navbar.is-white .navbar-start>a.navbar-item.is-active,.navbar.is-white .navbar-start .navbar-link:focus,.navbar.is-white .navbar-start .navbar-link:hover,.navbar.is-white .navbar-start .navbar-link.is-active,.navbar.is-white .navbar-end>a.navbar-item:focus,.navbar.is-white .navbar-end>a.navbar-item:hover,.navbar.is-white .navbar-end>a.navbar-item.is-active,.navbar.is-white .navbar-end .navbar-link:focus,.navbar.is-white .navbar-end .navbar-link:hover,.navbar.is-white .navbar-end .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-start .navbar-link::after,.navbar.is-white .navbar-end .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-white .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-dropdown a.navbar-item.is-active{background-color:#fff;color:#0a0a0a}}.navbar.is-black{background-color:#0a0a0a;color:#fff}.navbar.is-black .navbar-brand>.navbar-item,.navbar.is-black .navbar-brand .navbar-link{color:#fff}.navbar.is-black .navbar-brand>a.navbar-item:focus,.navbar.is-black .navbar-brand>a.navbar-item:hover,.navbar.is-black .navbar-brand>a.navbar-item.is-active,.navbar.is-black .navbar-brand .navbar-link:focus,.navbar.is-black .navbar-brand .navbar-link:hover,.navbar.is-black .navbar-brand .navbar-link.is-active{background-color:#000;color:#fff}.navbar.is-black .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-black .navbar-start>.navbar-item,.navbar.is-black .navbar-start .navbar-link,.navbar.is-black .navbar-end>.navbar-item,.navbar.is-black .navbar-end .navbar-link{color:#fff}.navbar.is-black .navbar-start>a.navbar-item:focus,.navbar.is-black .navbar-start>a.navbar-item:hover,.navbar.is-black .navbar-start>a.navbar-item.is-active,.navbar.is-black .navbar-start .navbar-link:focus,.navbar.is-black .navbar-start .navbar-link:hover,.navbar.is-black .navbar-start .navbar-link.is-active,.navbar.is-black .navbar-end>a.navbar-item:focus,.navbar.is-black .navbar-end>a.navbar-item:hover,.navbar.is-black .navbar-end>a.navbar-item.is-active,.navbar.is-black .navbar-end .navbar-link:focus,.navbar.is-black .navbar-end .navbar-link:hover,.navbar.is-black .navbar-end .navbar-link.is-active{background-color:#000;color:#fff}.navbar.is-black .navbar-start .navbar-link::after,.navbar.is-black .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-black .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link{background-color:#000;color:#fff}.navbar.is-black .navbar-dropdown a.navbar-item.is-active{background-color:#0a0a0a;color:#fff}}.navbar.is-light{background-color:#f5f5f5;color:#363636}.navbar.is-light .navbar-brand>.navbar-item,.navbar.is-light .navbar-brand .navbar-link{color:#363636}.navbar.is-light .navbar-brand>a.navbar-item:focus,.navbar.is-light .navbar-brand>a.navbar-item:hover,.navbar.is-light .navbar-brand>a.navbar-item.is-active,.navbar.is-light .navbar-brand .navbar-link:focus,.navbar.is-light .navbar-brand .navbar-link:hover,.navbar.is-light .navbar-brand .navbar-link.is-active{background-color:#e8e8e8;color:#363636}.navbar.is-light .navbar-brand .navbar-link::after{border-color:#363636}.navbar.is-light .navbar-burger{color:#363636}@media screen and (min-width: 1056px){.navbar.is-light .navbar-start>.navbar-item,.navbar.is-light .navbar-start .navbar-link,.navbar.is-light .navbar-end>.navbar-item,.navbar.is-light .navbar-end .navbar-link{color:#363636}.navbar.is-light .navbar-start>a.navbar-item:focus,.navbar.is-light .navbar-start>a.navbar-item:hover,.navbar.is-light .navbar-start>a.navbar-item.is-active,.navbar.is-light .navbar-start .navbar-link:focus,.navbar.is-light .navbar-start .navbar-link:hover,.navbar.is-light .navbar-start .navbar-link.is-active,.navbar.is-light .navbar-end>a.navbar-item:focus,.navbar.is-light .navbar-end>a.navbar-item:hover,.navbar.is-light .navbar-end>a.navbar-item.is-active,.navbar.is-light .navbar-end .navbar-link:focus,.navbar.is-light .navbar-end .navbar-link:hover,.navbar.is-light .navbar-end .navbar-link.is-active{background-color:#e8e8e8;color:#363636}.navbar.is-light .navbar-start .navbar-link::after,.navbar.is-light .navbar-end .navbar-link::after{border-color:#363636}.navbar.is-light .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-light .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link{background-color:#e8e8e8;color:#363636}.navbar.is-light .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#363636}}.navbar.is-dark,.content kbd.navbar{background-color:#363636;color:#f5f5f5}.navbar.is-dark .navbar-brand>.navbar-item,.content kbd.navbar .navbar-brand>.navbar-item,.navbar.is-dark .navbar-brand .navbar-link,.content kbd.navbar .navbar-brand .navbar-link{color:#f5f5f5}.navbar.is-dark .navbar-brand>a.navbar-item:focus,.content kbd.navbar .navbar-brand>a.navbar-item:focus,.navbar.is-dark .navbar-brand>a.navbar-item:hover,.content kbd.navbar .navbar-brand>a.navbar-item:hover,.navbar.is-dark .navbar-brand>a.navbar-item.is-active,.content kbd.navbar .navbar-brand>a.navbar-item.is-active,.navbar.is-dark .navbar-brand .navbar-link:focus,.content kbd.navbar .navbar-brand .navbar-link:focus,.navbar.is-dark .navbar-brand .navbar-link:hover,.content kbd.navbar .navbar-brand .navbar-link:hover,.navbar.is-dark .navbar-brand .navbar-link.is-active,.content kbd.navbar .navbar-brand .navbar-link.is-active{background-color:#292929;color:#f5f5f5}.navbar.is-dark .navbar-brand .navbar-link::after,.content kbd.navbar .navbar-brand .navbar-link::after{border-color:#f5f5f5}.navbar.is-dark .navbar-burger,.content kbd.navbar .navbar-burger{color:#f5f5f5}@media screen and (min-width: 1056px){.navbar.is-dark .navbar-start>.navbar-item,.content kbd.navbar .navbar-start>.navbar-item,.navbar.is-dark .navbar-start .navbar-link,.content kbd.navbar .navbar-start .navbar-link,.navbar.is-dark .navbar-end>.navbar-item,.content kbd.navbar .navbar-end>.navbar-item,.navbar.is-dark .navbar-end .navbar-link,.content kbd.navbar .navbar-end .navbar-link{color:#f5f5f5}.navbar.is-dark .navbar-start>a.navbar-item:focus,.content kbd.navbar .navbar-start>a.navbar-item:focus,.navbar.is-dark .navbar-start>a.navbar-item:hover,.content kbd.navbar .navbar-start>a.navbar-item:hover,.navbar.is-dark .navbar-start>a.navbar-item.is-active,.content kbd.navbar .navbar-start>a.navbar-item.is-active,.navbar.is-dark .navbar-start .navbar-link:focus,.content kbd.navbar .navbar-start .navbar-link:focus,.navbar.is-dark .navbar-start .navbar-link:hover,.content kbd.navbar .navbar-start .navbar-link:hover,.navbar.is-dark .navbar-start .navbar-link.is-active,.content kbd.navbar .navbar-start .navbar-link.is-active,.navbar.is-dark .navbar-end>a.navbar-item:focus,.content kbd.navbar .navbar-end>a.navbar-item:focus,.navbar.is-dark .navbar-end>a.navbar-item:hover,.content kbd.navbar .navbar-end>a.navbar-item:hover,.navbar.is-dark .navbar-end>a.navbar-item.is-active,.content kbd.navbar .navbar-end>a.navbar-item.is-active,.navbar.is-dark .navbar-end .navbar-link:focus,.content kbd.navbar .navbar-end .navbar-link:focus,.navbar.is-dark .navbar-end .navbar-link:hover,.content kbd.navbar .navbar-end .navbar-link:hover,.navbar.is-dark .navbar-end .navbar-link.is-active,.content kbd.navbar .navbar-end .navbar-link.is-active{background-color:#292929;color:#f5f5f5}.navbar.is-dark .navbar-start .navbar-link::after,.content kbd.navbar .navbar-start .navbar-link::after,.navbar.is-dark .navbar-end .navbar-link::after,.content kbd.navbar .navbar-end .navbar-link::after{border-color:#f5f5f5}.navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link,.content kbd.navbar .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link,.content kbd.navbar .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link,.content kbd.navbar .navbar-item.has-dropdown.is-active .navbar-link{background-color:#292929;color:#f5f5f5}.navbar.is-dark .navbar-dropdown a.navbar-item.is-active,.content kbd.navbar .navbar-dropdown a.navbar-item.is-active{background-color:#363636;color:#f5f5f5}}.navbar.is-primary,.docstring>section>a.navbar.docs-sourcelink{background-color:#4eb5de;color:#fff}.navbar.is-primary .navbar-brand>.navbar-item,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>.navbar-item,.navbar.is-primary .navbar-brand .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link{color:#fff}.navbar.is-primary .navbar-brand>a.navbar-item:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:focus,.navbar.is-primary .navbar-brand>a.navbar-item:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:hover,.navbar.is-primary .navbar-brand>a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item.is-active,.navbar.is-primary .navbar-brand .navbar-link:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:focus,.navbar.is-primary .navbar-brand .navbar-link:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:hover,.navbar.is-primary .navbar-brand .navbar-link.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link.is-active{background-color:#39acda;color:#fff}.navbar.is-primary .navbar-brand .navbar-link::after,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-burger,.docstring>section>a.navbar.docs-sourcelink .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-primary .navbar-start>.navbar-item,.docstring>section>a.navbar.docs-sourcelink .navbar-start>.navbar-item,.navbar.is-primary .navbar-start .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link,.navbar.is-primary .navbar-end>.navbar-item,.docstring>section>a.navbar.docs-sourcelink .navbar-end>.navbar-item,.navbar.is-primary .navbar-end .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link{color:#fff}.navbar.is-primary .navbar-start>a.navbar-item:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:focus,.navbar.is-primary .navbar-start>a.navbar-item:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:hover,.navbar.is-primary .navbar-start>a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item.is-active,.navbar.is-primary .navbar-start .navbar-link:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:focus,.navbar.is-primary .navbar-start .navbar-link:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:hover,.navbar.is-primary .navbar-start .navbar-link.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link.is-active,.navbar.is-primary .navbar-end>a.navbar-item:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:focus,.navbar.is-primary .navbar-end>a.navbar-item:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:hover,.navbar.is-primary .navbar-end>a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item.is-active,.navbar.is-primary .navbar-end .navbar-link:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:focus,.navbar.is-primary .navbar-end .navbar-link:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:hover,.navbar.is-primary .navbar-end .navbar-link.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link.is-active{background-color:#39acda;color:#fff}.navbar.is-primary .navbar-start .navbar-link::after,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link::after,.navbar.is-primary .navbar-end .navbar-link::after,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown.is-active .navbar-link{background-color:#39acda;color:#fff}.navbar.is-primary .navbar-dropdown a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active{background-color:#4eb5de;color:#fff}}.navbar.is-link{background-color:#2e63b8;color:#fff}.navbar.is-link .navbar-brand>.navbar-item,.navbar.is-link .navbar-brand .navbar-link{color:#fff}.navbar.is-link .navbar-brand>a.navbar-item:focus,.navbar.is-link .navbar-brand>a.navbar-item:hover,.navbar.is-link .navbar-brand>a.navbar-item.is-active,.navbar.is-link .navbar-brand .navbar-link:focus,.navbar.is-link .navbar-brand .navbar-link:hover,.navbar.is-link .navbar-brand .navbar-link.is-active{background-color:#2958a4;color:#fff}.navbar.is-link .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-link .navbar-start>.navbar-item,.navbar.is-link .navbar-start .navbar-link,.navbar.is-link .navbar-end>.navbar-item,.navbar.is-link .navbar-end .navbar-link{color:#fff}.navbar.is-link .navbar-start>a.navbar-item:focus,.navbar.is-link .navbar-start>a.navbar-item:hover,.navbar.is-link .navbar-start>a.navbar-item.is-active,.navbar.is-link .navbar-start .navbar-link:focus,.navbar.is-link .navbar-start .navbar-link:hover,.navbar.is-link .navbar-start .navbar-link.is-active,.navbar.is-link .navbar-end>a.navbar-item:focus,.navbar.is-link .navbar-end>a.navbar-item:hover,.navbar.is-link .navbar-end>a.navbar-item.is-active,.navbar.is-link .navbar-end .navbar-link:focus,.navbar.is-link .navbar-end .navbar-link:hover,.navbar.is-link .navbar-end .navbar-link.is-active{background-color:#2958a4;color:#fff}.navbar.is-link .navbar-start .navbar-link::after,.navbar.is-link .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-link .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link{background-color:#2958a4;color:#fff}.navbar.is-link .navbar-dropdown a.navbar-item.is-active{background-color:#2e63b8;color:#fff}}.navbar.is-info{background-color:#209cee;color:#fff}.navbar.is-info .navbar-brand>.navbar-item,.navbar.is-info .navbar-brand .navbar-link{color:#fff}.navbar.is-info .navbar-brand>a.navbar-item:focus,.navbar.is-info .navbar-brand>a.navbar-item:hover,.navbar.is-info .navbar-brand>a.navbar-item.is-active,.navbar.is-info .navbar-brand .navbar-link:focus,.navbar.is-info .navbar-brand .navbar-link:hover,.navbar.is-info .navbar-brand .navbar-link.is-active{background-color:#1190e3;color:#fff}.navbar.is-info .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-info .navbar-start>.navbar-item,.navbar.is-info .navbar-start .navbar-link,.navbar.is-info .navbar-end>.navbar-item,.navbar.is-info .navbar-end .navbar-link{color:#fff}.navbar.is-info .navbar-start>a.navbar-item:focus,.navbar.is-info .navbar-start>a.navbar-item:hover,.navbar.is-info .navbar-start>a.navbar-item.is-active,.navbar.is-info .navbar-start .navbar-link:focus,.navbar.is-info .navbar-start .navbar-link:hover,.navbar.is-info .navbar-start .navbar-link.is-active,.navbar.is-info .navbar-end>a.navbar-item:focus,.navbar.is-info .navbar-end>a.navbar-item:hover,.navbar.is-info .navbar-end>a.navbar-item.is-active,.navbar.is-info .navbar-end .navbar-link:focus,.navbar.is-info .navbar-end .navbar-link:hover,.navbar.is-info .navbar-end .navbar-link.is-active{background-color:#1190e3;color:#fff}.navbar.is-info .navbar-start .navbar-link::after,.navbar.is-info .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-info .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link{background-color:#1190e3;color:#fff}.navbar.is-info .navbar-dropdown a.navbar-item.is-active{background-color:#209cee;color:#fff}}.navbar.is-success{background-color:#22c35b;color:#fff}.navbar.is-success .navbar-brand>.navbar-item,.navbar.is-success .navbar-brand .navbar-link{color:#fff}.navbar.is-success .navbar-brand>a.navbar-item:focus,.navbar.is-success .navbar-brand>a.navbar-item:hover,.navbar.is-success .navbar-brand>a.navbar-item.is-active,.navbar.is-success .navbar-brand .navbar-link:focus,.navbar.is-success .navbar-brand .navbar-link:hover,.navbar.is-success .navbar-brand .navbar-link.is-active{background-color:#1ead51;color:#fff}.navbar.is-success .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-success .navbar-start>.navbar-item,.navbar.is-success .navbar-start .navbar-link,.navbar.is-success .navbar-end>.navbar-item,.navbar.is-success .navbar-end .navbar-link{color:#fff}.navbar.is-success .navbar-start>a.navbar-item:focus,.navbar.is-success .navbar-start>a.navbar-item:hover,.navbar.is-success .navbar-start>a.navbar-item.is-active,.navbar.is-success .navbar-start .navbar-link:focus,.navbar.is-success .navbar-start .navbar-link:hover,.navbar.is-success .navbar-start .navbar-link.is-active,.navbar.is-success .navbar-end>a.navbar-item:focus,.navbar.is-success .navbar-end>a.navbar-item:hover,.navbar.is-success .navbar-end>a.navbar-item.is-active,.navbar.is-success .navbar-end .navbar-link:focus,.navbar.is-success .navbar-end .navbar-link:hover,.navbar.is-success .navbar-end .navbar-link.is-active{background-color:#1ead51;color:#fff}.navbar.is-success .navbar-start .navbar-link::after,.navbar.is-success .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-success .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link{background-color:#1ead51;color:#fff}.navbar.is-success .navbar-dropdown a.navbar-item.is-active{background-color:#22c35b;color:#fff}}.navbar.is-warning{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-brand>.navbar-item,.navbar.is-warning .navbar-brand .navbar-link{color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-brand>a.navbar-item:focus,.navbar.is-warning .navbar-brand>a.navbar-item:hover,.navbar.is-warning .navbar-brand>a.navbar-item.is-active,.navbar.is-warning .navbar-brand .navbar-link:focus,.navbar.is-warning .navbar-brand .navbar-link:hover,.navbar.is-warning .navbar-brand .navbar-link.is-active{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-burger{color:rgba(0,0,0,0.7)}@media screen and (min-width: 1056px){.navbar.is-warning .navbar-start>.navbar-item,.navbar.is-warning .navbar-start .navbar-link,.navbar.is-warning .navbar-end>.navbar-item,.navbar.is-warning .navbar-end .navbar-link{color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-start>a.navbar-item:focus,.navbar.is-warning .navbar-start>a.navbar-item:hover,.navbar.is-warning .navbar-start>a.navbar-item.is-active,.navbar.is-warning .navbar-start .navbar-link:focus,.navbar.is-warning .navbar-start .navbar-link:hover,.navbar.is-warning .navbar-start .navbar-link.is-active,.navbar.is-warning .navbar-end>a.navbar-item:focus,.navbar.is-warning .navbar-end>a.navbar-item:hover,.navbar.is-warning .navbar-end>a.navbar-item.is-active,.navbar.is-warning .navbar-end .navbar-link:focus,.navbar.is-warning .navbar-end .navbar-link:hover,.navbar.is-warning .navbar-end .navbar-link.is-active{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-start .navbar-link::after,.navbar.is-warning .navbar-end .navbar-link::after{border-color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-dropdown a.navbar-item.is-active{background-color:#ffdd57;color:rgba(0,0,0,0.7)}}.navbar.is-danger{background-color:#da0b00;color:#fff}.navbar.is-danger .navbar-brand>.navbar-item,.navbar.is-danger .navbar-brand .navbar-link{color:#fff}.navbar.is-danger .navbar-brand>a.navbar-item:focus,.navbar.is-danger .navbar-brand>a.navbar-item:hover,.navbar.is-danger .navbar-brand>a.navbar-item.is-active,.navbar.is-danger .navbar-brand .navbar-link:focus,.navbar.is-danger .navbar-brand .navbar-link:hover,.navbar.is-danger .navbar-brand .navbar-link.is-active{background-color:#c10a00;color:#fff}.navbar.is-danger .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-danger .navbar-start>.navbar-item,.navbar.is-danger .navbar-start .navbar-link,.navbar.is-danger .navbar-end>.navbar-item,.navbar.is-danger .navbar-end .navbar-link{color:#fff}.navbar.is-danger .navbar-start>a.navbar-item:focus,.navbar.is-danger .navbar-start>a.navbar-item:hover,.navbar.is-danger .navbar-start>a.navbar-item.is-active,.navbar.is-danger .navbar-start .navbar-link:focus,.navbar.is-danger .navbar-start .navbar-link:hover,.navbar.is-danger .navbar-start .navbar-link.is-active,.navbar.is-danger .navbar-end>a.navbar-item:focus,.navbar.is-danger .navbar-end>a.navbar-item:hover,.navbar.is-danger .navbar-end>a.navbar-item.is-active,.navbar.is-danger .navbar-end .navbar-link:focus,.navbar.is-danger .navbar-end .navbar-link:hover,.navbar.is-danger .navbar-end .navbar-link.is-active{background-color:#c10a00;color:#fff}.navbar.is-danger .navbar-start .navbar-link::after,.navbar.is-danger .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link{background-color:#c10a00;color:#fff}.navbar.is-danger .navbar-dropdown a.navbar-item.is-active{background-color:#da0b00;color:#fff}}.navbar>.container{align-items:stretch;display:flex;min-height:3.25rem;width:100%}.navbar.has-shadow{box-shadow:0 2px 0 0 #f5f5f5}.navbar.is-fixed-bottom,.navbar.is-fixed-top{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom{bottom:0}.navbar.is-fixed-bottom.has-shadow{box-shadow:0 -2px 0 0 #f5f5f5}.navbar.is-fixed-top{top:0}html.has-navbar-fixed-top,body.has-navbar-fixed-top{padding-top:3.25rem}html.has-navbar-fixed-bottom,body.has-navbar-fixed-bottom{padding-bottom:3.25rem}.navbar-brand,.navbar-tabs{align-items:stretch;display:flex;flex-shrink:0;min-height:3.25rem}.navbar-brand a.navbar-item:focus,.navbar-brand a.navbar-item:hover{background-color:transparent}.navbar-tabs{-webkit-overflow-scrolling:touch;max-width:100vw;overflow-x:auto;overflow-y:hidden}.navbar-burger{color:#4a4a4a;cursor:pointer;display:block;height:3.25rem;position:relative;width:3.25rem;margin-left:auto}.navbar-burger span{background-color:currentColor;display:block;height:1px;left:calc(50% - 8px);position:absolute;transform-origin:center;transition-duration:86ms;transition-property:background-color, opacity, transform;transition-timing-function:ease-out;width:16px}.navbar-burger span:nth-child(1){top:calc(50% - 6px)}.navbar-burger span:nth-child(2){top:calc(50% - 1px)}.navbar-burger span:nth-child(3){top:calc(50% + 4px)}.navbar-burger:hover{background-color:rgba(0,0,0,0.05)}.navbar-burger.is-active span:nth-child(1){transform:translateY(5px) rotate(45deg)}.navbar-burger.is-active span:nth-child(2){opacity:0}.navbar-burger.is-active span:nth-child(3){transform:translateY(-5px) rotate(-45deg)}.navbar-menu{display:none}.navbar-item,.navbar-link{color:#4a4a4a;display:block;line-height:1.5;padding:0.5rem 0.75rem;position:relative}.navbar-item .icon:only-child,.navbar-link .icon:only-child{margin-left:-0.25rem;margin-right:-0.25rem}a.navbar-item,.navbar-link{cursor:pointer}a.navbar-item:focus,a.navbar-item:focus-within,a.navbar-item:hover,a.navbar-item.is-active,.navbar-link:focus,.navbar-link:focus-within,.navbar-link:hover,.navbar-link.is-active{background-color:#fafafa;color:#2e63b8}.navbar-item{display:block;flex-grow:0;flex-shrink:0}.navbar-item img{max-height:1.75rem}.navbar-item.has-dropdown{padding:0}.navbar-item.is-expanded{flex-grow:1;flex-shrink:1}.navbar-item.is-tab{border-bottom:1px solid transparent;min-height:3.25rem;padding-bottom:calc(0.5rem - 1px)}.navbar-item.is-tab:focus,.navbar-item.is-tab:hover{background-color:rgba(0,0,0,0);border-bottom-color:#2e63b8}.navbar-item.is-tab.is-active{background-color:rgba(0,0,0,0);border-bottom-color:#2e63b8;border-bottom-style:solid;border-bottom-width:3px;color:#2e63b8;padding-bottom:calc(0.5rem - 3px)}.navbar-content{flex-grow:1;flex-shrink:1}.navbar-link:not(.is-arrowless){padding-right:2.5em}.navbar-link:not(.is-arrowless)::after{border-color:#2e63b8;margin-top:-0.375em;right:1.125em}.navbar-dropdown{font-size:0.875rem;padding-bottom:0.5rem;padding-top:0.5rem}.navbar-dropdown .navbar-item{padding-left:1.5rem;padding-right:1.5rem}.navbar-divider{background-color:#f5f5f5;border:none;display:none;height:2px;margin:0.5rem 0}@media screen and (max-width: 1055px){.navbar>.container{display:block}.navbar-brand .navbar-item,.navbar-tabs .navbar-item{align-items:center;display:flex}.navbar-link::after{display:none}.navbar-menu{background-color:#fff;box-shadow:0 8px 16px rgba(10,10,10,0.1);padding:0.5rem 0}.navbar-menu.is-active{display:block}.navbar.is-fixed-bottom-touch,.navbar.is-fixed-top-touch{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-touch{bottom:0}.navbar.is-fixed-bottom-touch.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}.navbar.is-fixed-top-touch{top:0}.navbar.is-fixed-top .navbar-menu,.navbar.is-fixed-top-touch .navbar-menu{-webkit-overflow-scrolling:touch;max-height:calc(100vh - 3.25rem);overflow:auto}html.has-navbar-fixed-top-touch,body.has-navbar-fixed-top-touch{padding-top:3.25rem}html.has-navbar-fixed-bottom-touch,body.has-navbar-fixed-bottom-touch{padding-bottom:3.25rem}}@media screen and (min-width: 1056px){.navbar,.navbar-menu,.navbar-start,.navbar-end{align-items:stretch;display:flex}.navbar{min-height:3.25rem}.navbar.is-spaced{padding:1rem 2rem}.navbar.is-spaced .navbar-start,.navbar.is-spaced .navbar-end{align-items:center}.navbar.is-spaced a.navbar-item,.navbar.is-spaced .navbar-link{border-radius:4px}.navbar.is-transparent a.navbar-item:focus,.navbar.is-transparent a.navbar-item:hover,.navbar.is-transparent a.navbar-item.is-active,.navbar.is-transparent .navbar-link:focus,.navbar.is-transparent .navbar-link:hover,.navbar.is-transparent .navbar-link.is-active{background-color:transparent !important}.navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link{background-color:transparent !important}.navbar.is-transparent .navbar-dropdown a.navbar-item:focus,.navbar.is-transparent .navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar.is-transparent .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#2e63b8}.navbar-burger{display:none}.navbar-item,.navbar-link{align-items:center;display:flex}.navbar-item{display:flex}.navbar-item.has-dropdown{align-items:stretch}.navbar-item.has-dropdown-up .navbar-link::after{transform:rotate(135deg) translate(0.25em, -0.25em)}.navbar-item.has-dropdown-up .navbar-dropdown{border-bottom:2px solid #dbdbdb;border-radius:6px 6px 0 0;border-top:none;bottom:100%;box-shadow:0 -8px 8px rgba(10,10,10,0.1);top:auto}.navbar-item.is-active .navbar-dropdown,.navbar-item.is-hoverable:focus .navbar-dropdown,.navbar-item.is-hoverable:focus-within .navbar-dropdown,.navbar-item.is-hoverable:hover .navbar-dropdown{display:block}.navbar.is-spaced .navbar-item.is-active .navbar-dropdown,.navbar-item.is-active .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-hoverable:focus .navbar-dropdown,.navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-hoverable:focus-within .navbar-dropdown,.navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-hoverable:hover .navbar-dropdown,.navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed{opacity:1;pointer-events:auto;transform:translateY(0)}.navbar-menu{flex-grow:1;flex-shrink:0}.navbar-start{justify-content:flex-start;margin-right:auto}.navbar-end{justify-content:flex-end;margin-left:auto}.navbar-dropdown{background-color:#fff;border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:2px solid #dbdbdb;box-shadow:0 8px 8px rgba(10,10,10,0.1);display:none;font-size:0.875rem;left:0;min-width:100%;position:absolute;top:100%;z-index:20}.navbar-dropdown .navbar-item{padding:0.375rem 1rem;white-space:nowrap}.navbar-dropdown a.navbar-item{padding-right:3rem}.navbar-dropdown a.navbar-item:focus,.navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#2e63b8}.navbar.is-spaced .navbar-dropdown,.navbar-dropdown.is-boxed{border-radius:6px;border-top:none;box-shadow:0 8px 8px rgba(10,10,10,0.1), 0 0 0 1px rgba(10,10,10,0.1);display:block;opacity:0;pointer-events:none;top:calc(100% + (-4px));transform:translateY(-5px);transition-duration:86ms;transition-property:opacity, transform}.navbar-dropdown.is-right{left:auto;right:0}.navbar-divider{display:block}.navbar>.container .navbar-brand,.container>.navbar .navbar-brand{margin-left:-.75rem}.navbar>.container .navbar-menu,.container>.navbar .navbar-menu{margin-right:-.75rem}.navbar.is-fixed-bottom-desktop,.navbar.is-fixed-top-desktop{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-desktop{bottom:0}.navbar.is-fixed-bottom-desktop.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}.navbar.is-fixed-top-desktop{top:0}html.has-navbar-fixed-top-desktop,body.has-navbar-fixed-top-desktop{padding-top:3.25rem}html.has-navbar-fixed-bottom-desktop,body.has-navbar-fixed-bottom-desktop{padding-bottom:3.25rem}html.has-spaced-navbar-fixed-top,body.has-spaced-navbar-fixed-top{padding-top:5.25rem}html.has-spaced-navbar-fixed-bottom,body.has-spaced-navbar-fixed-bottom{padding-bottom:5.25rem}a.navbar-item.is-active,.navbar-link.is-active{color:#0a0a0a}a.navbar-item.is-active:not(:focus):not(:hover),.navbar-link.is-active:not(:focus):not(:hover){background-color:rgba(0,0,0,0)}.navbar-item.has-dropdown:focus .navbar-link,.navbar-item.has-dropdown:hover .navbar-link,.navbar-item.has-dropdown.is-active .navbar-link{background-color:#fafafa}}.hero.is-fullheight-with-navbar{min-height:calc(100vh - 3.25rem)}.pagination{font-size:1rem;margin:-.25rem}.pagination.is-small,#documenter .docs-sidebar form.docs-search>input.pagination{font-size:.75rem}.pagination.is-medium{font-size:1.25rem}.pagination.is-large{font-size:1.5rem}.pagination.is-rounded .pagination-previous,#documenter .docs-sidebar form.docs-search>input.pagination .pagination-previous,.pagination.is-rounded .pagination-next,#documenter .docs-sidebar form.docs-search>input.pagination .pagination-next{padding-left:1em;padding-right:1em;border-radius:290486px}.pagination.is-rounded .pagination-link,#documenter .docs-sidebar form.docs-search>input.pagination .pagination-link{border-radius:290486px}.pagination,.pagination-list{align-items:center;display:flex;justify-content:center;text-align:center}.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis{font-size:1em;justify-content:center;margin:.25rem;padding-left:.5em;padding-right:.5em;text-align:center}.pagination-previous,.pagination-next,.pagination-link{border-color:#dbdbdb;color:#363636;min-width:2.25em}.pagination-previous:hover,.pagination-next:hover,.pagination-link:hover{border-color:#b5b5b5;color:#363636}.pagination-previous:focus,.pagination-next:focus,.pagination-link:focus{border-color:#3c5dcd}.pagination-previous:active,.pagination-next:active,.pagination-link:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2)}.pagination-previous[disabled],.pagination-next[disabled],.pagination-link[disabled]{background-color:#dbdbdb;border-color:#dbdbdb;box-shadow:none;color:#6b6b6b;opacity:0.5}.pagination-previous,.pagination-next{padding-left:0.75em;padding-right:0.75em;white-space:nowrap}.pagination-link.is-current{background-color:#2e63b8;border-color:#2e63b8;color:#fff}.pagination-ellipsis{color:#b5b5b5;pointer-events:none}.pagination-list{flex-wrap:wrap}@media screen and (max-width: 768px){.pagination{flex-wrap:wrap}.pagination-previous,.pagination-next{flex-grow:1;flex-shrink:1}.pagination-list li{flex-grow:1;flex-shrink:1}}@media screen and (min-width: 769px),print{.pagination-list{flex-grow:1;flex-shrink:1;justify-content:flex-start;order:1}.pagination-previous{order:2}.pagination-next{order:3}.pagination{justify-content:space-between}.pagination.is-centered .pagination-previous{order:1}.pagination.is-centered .pagination-list{justify-content:center;order:2}.pagination.is-centered .pagination-next{order:3}.pagination.is-right .pagination-previous{order:1}.pagination.is-right .pagination-next{order:2}.pagination.is-right .pagination-list{justify-content:flex-end;order:3}}.panel{font-size:1rem}.panel:not(:last-child){margin-bottom:1.5rem}.panel-heading,.panel-tabs,.panel-block{border-bottom:1px solid #dbdbdb;border-left:1px solid #dbdbdb;border-right:1px solid #dbdbdb}.panel-heading:first-child,.panel-tabs:first-child,.panel-block:first-child{border-top:1px solid #dbdbdb}.panel-heading{background-color:#f5f5f5;border-radius:4px 4px 0 0;color:#222;font-size:1.25em;font-weight:300;line-height:1.25;padding:0.5em 0.75em}.panel-tabs{align-items:flex-end;display:flex;font-size:.875em;justify-content:center}.panel-tabs a{border-bottom:1px solid #dbdbdb;margin-bottom:-1px;padding:0.5em}.panel-tabs a.is-active{border-bottom-color:#4a4a4a;color:#363636}.panel-list a{color:#222}.panel-list a:hover{color:#2e63b8}.panel-block{align-items:center;color:#222;display:flex;justify-content:flex-start;padding:0.5em 0.75em}.panel-block input[type="checkbox"]{margin-right:0.75em}.panel-block>.control{flex-grow:1;flex-shrink:1;width:100%}.panel-block.is-wrapped{flex-wrap:wrap}.panel-block.is-active{border-left-color:#2e63b8;color:#363636}.panel-block.is-active .panel-icon{color:#2e63b8}a.panel-block,label.panel-block{cursor:pointer}a.panel-block:hover,label.panel-block:hover{background-color:#f5f5f5}.panel-icon{display:inline-block;font-size:14px;height:1em;line-height:1em;text-align:center;vertical-align:top;width:1em;color:#6b6b6b;margin-right:0.75em}.panel-icon .fa{font-size:inherit;line-height:inherit}.tabs{-webkit-overflow-scrolling:touch;align-items:stretch;display:flex;font-size:1rem;justify-content:space-between;overflow:hidden;overflow-x:auto;white-space:nowrap}.tabs a{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;color:#222;display:flex;justify-content:center;margin-bottom:-1px;padding:0.5em 1em;vertical-align:top}.tabs a:hover{border-bottom-color:#222;color:#222}.tabs li{display:block}.tabs li.is-active a{border-bottom-color:#2e63b8;color:#2e63b8}.tabs ul{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;display:flex;flex-grow:1;flex-shrink:0;justify-content:flex-start}.tabs ul.is-left{padding-right:0.75em}.tabs ul.is-center{flex:none;justify-content:center;padding-left:0.75em;padding-right:0.75em}.tabs ul.is-right{justify-content:flex-end;padding-left:0.75em}.tabs .icon:first-child{margin-right:0.5em}.tabs .icon:last-child{margin-left:0.5em}.tabs.is-centered ul{justify-content:center}.tabs.is-right ul{justify-content:flex-end}.tabs.is-boxed a{border:1px solid transparent;border-radius:4px 4px 0 0}.tabs.is-boxed a:hover{background-color:#f5f5f5;border-bottom-color:#dbdbdb}.tabs.is-boxed li.is-active a{background-color:#fff;border-color:#dbdbdb;border-bottom-color:rgba(0,0,0,0) !important}.tabs.is-fullwidth li{flex-grow:1;flex-shrink:0}.tabs.is-toggle a{border-color:#dbdbdb;border-style:solid;border-width:1px;margin-bottom:0;position:relative}.tabs.is-toggle a:hover{background-color:#f5f5f5;border-color:#b5b5b5;z-index:2}.tabs.is-toggle li+li{margin-left:-1px}.tabs.is-toggle li:first-child a{border-radius:4px 0 0 4px}.tabs.is-toggle li:last-child a{border-radius:0 4px 4px 0}.tabs.is-toggle li.is-active a{background-color:#2e63b8;border-color:#2e63b8;color:#fff;z-index:1}.tabs.is-toggle ul{border-bottom:none}.tabs.is-toggle.is-toggle-rounded li:first-child a{border-bottom-left-radius:290486px;border-top-left-radius:290486px;padding-left:1.25em}.tabs.is-toggle.is-toggle-rounded li:last-child a{border-bottom-right-radius:290486px;border-top-right-radius:290486px;padding-right:1.25em}.tabs.is-small,#documenter .docs-sidebar form.docs-search>input.tabs{font-size:.75rem}.tabs.is-medium{font-size:1.25rem}.tabs.is-large{font-size:1.5rem}.column{display:block;flex-basis:0;flex-grow:1;flex-shrink:1;padding:.75rem}.columns.is-mobile>.column.is-narrow{flex:none}.columns.is-mobile>.column.is-full{flex:none;width:100%}.columns.is-mobile>.column.is-three-quarters{flex:none;width:75%}.columns.is-mobile>.column.is-two-thirds{flex:none;width:66.6666%}.columns.is-mobile>.column.is-half{flex:none;width:50%}.columns.is-mobile>.column.is-one-third{flex:none;width:33.3333%}.columns.is-mobile>.column.is-one-quarter{flex:none;width:25%}.columns.is-mobile>.column.is-one-fifth{flex:none;width:20%}.columns.is-mobile>.column.is-two-fifths{flex:none;width:40%}.columns.is-mobile>.column.is-three-fifths{flex:none;width:60%}.columns.is-mobile>.column.is-four-fifths{flex:none;width:80%}.columns.is-mobile>.column.is-offset-three-quarters{margin-left:75%}.columns.is-mobile>.column.is-offset-two-thirds{margin-left:66.6666%}.columns.is-mobile>.column.is-offset-half{margin-left:50%}.columns.is-mobile>.column.is-offset-one-third{margin-left:33.3333%}.columns.is-mobile>.column.is-offset-one-quarter{margin-left:25%}.columns.is-mobile>.column.is-offset-one-fifth{margin-left:20%}.columns.is-mobile>.column.is-offset-two-fifths{margin-left:40%}.columns.is-mobile>.column.is-offset-three-fifths{margin-left:60%}.columns.is-mobile>.column.is-offset-four-fifths{margin-left:80%}.columns.is-mobile>.column.is-0{flex:none;width:0%}.columns.is-mobile>.column.is-offset-0{margin-left:0%}.columns.is-mobile>.column.is-1{flex:none;width:8.3333333333%}.columns.is-mobile>.column.is-offset-1{margin-left:8.3333333333%}.columns.is-mobile>.column.is-2{flex:none;width:16.6666666667%}.columns.is-mobile>.column.is-offset-2{margin-left:16.6666666667%}.columns.is-mobile>.column.is-3{flex:none;width:25%}.columns.is-mobile>.column.is-offset-3{margin-left:25%}.columns.is-mobile>.column.is-4{flex:none;width:33.3333333333%}.columns.is-mobile>.column.is-offset-4{margin-left:33.3333333333%}.columns.is-mobile>.column.is-5{flex:none;width:41.6666666667%}.columns.is-mobile>.column.is-offset-5{margin-left:41.6666666667%}.columns.is-mobile>.column.is-6{flex:none;width:50%}.columns.is-mobile>.column.is-offset-6{margin-left:50%}.columns.is-mobile>.column.is-7{flex:none;width:58.3333333333%}.columns.is-mobile>.column.is-offset-7{margin-left:58.3333333333%}.columns.is-mobile>.column.is-8{flex:none;width:66.6666666667%}.columns.is-mobile>.column.is-offset-8{margin-left:66.6666666667%}.columns.is-mobile>.column.is-9{flex:none;width:75%}.columns.is-mobile>.column.is-offset-9{margin-left:75%}.columns.is-mobile>.column.is-10{flex:none;width:83.3333333333%}.columns.is-mobile>.column.is-offset-10{margin-left:83.3333333333%}.columns.is-mobile>.column.is-11{flex:none;width:91.6666666667%}.columns.is-mobile>.column.is-offset-11{margin-left:91.6666666667%}.columns.is-mobile>.column.is-12{flex:none;width:100%}.columns.is-mobile>.column.is-offset-12{margin-left:100%}@media screen and (max-width: 768px){.column.is-narrow-mobile{flex:none}.column.is-full-mobile{flex:none;width:100%}.column.is-three-quarters-mobile{flex:none;width:75%}.column.is-two-thirds-mobile{flex:none;width:66.6666%}.column.is-half-mobile{flex:none;width:50%}.column.is-one-third-mobile{flex:none;width:33.3333%}.column.is-one-quarter-mobile{flex:none;width:25%}.column.is-one-fifth-mobile{flex:none;width:20%}.column.is-two-fifths-mobile{flex:none;width:40%}.column.is-three-fifths-mobile{flex:none;width:60%}.column.is-four-fifths-mobile{flex:none;width:80%}.column.is-offset-three-quarters-mobile{margin-left:75%}.column.is-offset-two-thirds-mobile{margin-left:66.6666%}.column.is-offset-half-mobile{margin-left:50%}.column.is-offset-one-third-mobile{margin-left:33.3333%}.column.is-offset-one-quarter-mobile{margin-left:25%}.column.is-offset-one-fifth-mobile{margin-left:20%}.column.is-offset-two-fifths-mobile{margin-left:40%}.column.is-offset-three-fifths-mobile{margin-left:60%}.column.is-offset-four-fifths-mobile{margin-left:80%}.column.is-0-mobile{flex:none;width:0%}.column.is-offset-0-mobile{margin-left:0%}.column.is-1-mobile{flex:none;width:8.3333333333%}.column.is-offset-1-mobile{margin-left:8.3333333333%}.column.is-2-mobile{flex:none;width:16.6666666667%}.column.is-offset-2-mobile{margin-left:16.6666666667%}.column.is-3-mobile{flex:none;width:25%}.column.is-offset-3-mobile{margin-left:25%}.column.is-4-mobile{flex:none;width:33.3333333333%}.column.is-offset-4-mobile{margin-left:33.3333333333%}.column.is-5-mobile{flex:none;width:41.6666666667%}.column.is-offset-5-mobile{margin-left:41.6666666667%}.column.is-6-mobile{flex:none;width:50%}.column.is-offset-6-mobile{margin-left:50%}.column.is-7-mobile{flex:none;width:58.3333333333%}.column.is-offset-7-mobile{margin-left:58.3333333333%}.column.is-8-mobile{flex:none;width:66.6666666667%}.column.is-offset-8-mobile{margin-left:66.6666666667%}.column.is-9-mobile{flex:none;width:75%}.column.is-offset-9-mobile{margin-left:75%}.column.is-10-mobile{flex:none;width:83.3333333333%}.column.is-offset-10-mobile{margin-left:83.3333333333%}.column.is-11-mobile{flex:none;width:91.6666666667%}.column.is-offset-11-mobile{margin-left:91.6666666667%}.column.is-12-mobile{flex:none;width:100%}.column.is-offset-12-mobile{margin-left:100%}}@media screen and (min-width: 769px),print{.column.is-narrow,.column.is-narrow-tablet{flex:none}.column.is-full,.column.is-full-tablet{flex:none;width:100%}.column.is-three-quarters,.column.is-three-quarters-tablet{flex:none;width:75%}.column.is-two-thirds,.column.is-two-thirds-tablet{flex:none;width:66.6666%}.column.is-half,.column.is-half-tablet{flex:none;width:50%}.column.is-one-third,.column.is-one-third-tablet{flex:none;width:33.3333%}.column.is-one-quarter,.column.is-one-quarter-tablet{flex:none;width:25%}.column.is-one-fifth,.column.is-one-fifth-tablet{flex:none;width:20%}.column.is-two-fifths,.column.is-two-fifths-tablet{flex:none;width:40%}.column.is-three-fifths,.column.is-three-fifths-tablet{flex:none;width:60%}.column.is-four-fifths,.column.is-four-fifths-tablet{flex:none;width:80%}.column.is-offset-three-quarters,.column.is-offset-three-quarters-tablet{margin-left:75%}.column.is-offset-two-thirds,.column.is-offset-two-thirds-tablet{margin-left:66.6666%}.column.is-offset-half,.column.is-offset-half-tablet{margin-left:50%}.column.is-offset-one-third,.column.is-offset-one-third-tablet{margin-left:33.3333%}.column.is-offset-one-quarter,.column.is-offset-one-quarter-tablet{margin-left:25%}.column.is-offset-one-fifth,.column.is-offset-one-fifth-tablet{margin-left:20%}.column.is-offset-two-fifths,.column.is-offset-two-fifths-tablet{margin-left:40%}.column.is-offset-three-fifths,.column.is-offset-three-fifths-tablet{margin-left:60%}.column.is-offset-four-fifths,.column.is-offset-four-fifths-tablet{margin-left:80%}.column.is-0,.column.is-0-tablet{flex:none;width:0%}.column.is-offset-0,.column.is-offset-0-tablet{margin-left:0%}.column.is-1,.column.is-1-tablet{flex:none;width:8.3333333333%}.column.is-offset-1,.column.is-offset-1-tablet{margin-left:8.3333333333%}.column.is-2,.column.is-2-tablet{flex:none;width:16.6666666667%}.column.is-offset-2,.column.is-offset-2-tablet{margin-left:16.6666666667%}.column.is-3,.column.is-3-tablet{flex:none;width:25%}.column.is-offset-3,.column.is-offset-3-tablet{margin-left:25%}.column.is-4,.column.is-4-tablet{flex:none;width:33.3333333333%}.column.is-offset-4,.column.is-offset-4-tablet{margin-left:33.3333333333%}.column.is-5,.column.is-5-tablet{flex:none;width:41.6666666667%}.column.is-offset-5,.column.is-offset-5-tablet{margin-left:41.6666666667%}.column.is-6,.column.is-6-tablet{flex:none;width:50%}.column.is-offset-6,.column.is-offset-6-tablet{margin-left:50%}.column.is-7,.column.is-7-tablet{flex:none;width:58.3333333333%}.column.is-offset-7,.column.is-offset-7-tablet{margin-left:58.3333333333%}.column.is-8,.column.is-8-tablet{flex:none;width:66.6666666667%}.column.is-offset-8,.column.is-offset-8-tablet{margin-left:66.6666666667%}.column.is-9,.column.is-9-tablet{flex:none;width:75%}.column.is-offset-9,.column.is-offset-9-tablet{margin-left:75%}.column.is-10,.column.is-10-tablet{flex:none;width:83.3333333333%}.column.is-offset-10,.column.is-offset-10-tablet{margin-left:83.3333333333%}.column.is-11,.column.is-11-tablet{flex:none;width:91.6666666667%}.column.is-offset-11,.column.is-offset-11-tablet{margin-left:91.6666666667%}.column.is-12,.column.is-12-tablet{flex:none;width:100%}.column.is-offset-12,.column.is-offset-12-tablet{margin-left:100%}}@media screen and (max-width: 1055px){.column.is-narrow-touch{flex:none}.column.is-full-touch{flex:none;width:100%}.column.is-three-quarters-touch{flex:none;width:75%}.column.is-two-thirds-touch{flex:none;width:66.6666%}.column.is-half-touch{flex:none;width:50%}.column.is-one-third-touch{flex:none;width:33.3333%}.column.is-one-quarter-touch{flex:none;width:25%}.column.is-one-fifth-touch{flex:none;width:20%}.column.is-two-fifths-touch{flex:none;width:40%}.column.is-three-fifths-touch{flex:none;width:60%}.column.is-four-fifths-touch{flex:none;width:80%}.column.is-offset-three-quarters-touch{margin-left:75%}.column.is-offset-two-thirds-touch{margin-left:66.6666%}.column.is-offset-half-touch{margin-left:50%}.column.is-offset-one-third-touch{margin-left:33.3333%}.column.is-offset-one-quarter-touch{margin-left:25%}.column.is-offset-one-fifth-touch{margin-left:20%}.column.is-offset-two-fifths-touch{margin-left:40%}.column.is-offset-three-fifths-touch{margin-left:60%}.column.is-offset-four-fifths-touch{margin-left:80%}.column.is-0-touch{flex:none;width:0%}.column.is-offset-0-touch{margin-left:0%}.column.is-1-touch{flex:none;width:8.3333333333%}.column.is-offset-1-touch{margin-left:8.3333333333%}.column.is-2-touch{flex:none;width:16.6666666667%}.column.is-offset-2-touch{margin-left:16.6666666667%}.column.is-3-touch{flex:none;width:25%}.column.is-offset-3-touch{margin-left:25%}.column.is-4-touch{flex:none;width:33.3333333333%}.column.is-offset-4-touch{margin-left:33.3333333333%}.column.is-5-touch{flex:none;width:41.6666666667%}.column.is-offset-5-touch{margin-left:41.6666666667%}.column.is-6-touch{flex:none;width:50%}.column.is-offset-6-touch{margin-left:50%}.column.is-7-touch{flex:none;width:58.3333333333%}.column.is-offset-7-touch{margin-left:58.3333333333%}.column.is-8-touch{flex:none;width:66.6666666667%}.column.is-offset-8-touch{margin-left:66.6666666667%}.column.is-9-touch{flex:none;width:75%}.column.is-offset-9-touch{margin-left:75%}.column.is-10-touch{flex:none;width:83.3333333333%}.column.is-offset-10-touch{margin-left:83.3333333333%}.column.is-11-touch{flex:none;width:91.6666666667%}.column.is-offset-11-touch{margin-left:91.6666666667%}.column.is-12-touch{flex:none;width:100%}.column.is-offset-12-touch{margin-left:100%}}@media screen and (min-width: 1056px){.column.is-narrow-desktop{flex:none}.column.is-full-desktop{flex:none;width:100%}.column.is-three-quarters-desktop{flex:none;width:75%}.column.is-two-thirds-desktop{flex:none;width:66.6666%}.column.is-half-desktop{flex:none;width:50%}.column.is-one-third-desktop{flex:none;width:33.3333%}.column.is-one-quarter-desktop{flex:none;width:25%}.column.is-one-fifth-desktop{flex:none;width:20%}.column.is-two-fifths-desktop{flex:none;width:40%}.column.is-three-fifths-desktop{flex:none;width:60%}.column.is-four-fifths-desktop{flex:none;width:80%}.column.is-offset-three-quarters-desktop{margin-left:75%}.column.is-offset-two-thirds-desktop{margin-left:66.6666%}.column.is-offset-half-desktop{margin-left:50%}.column.is-offset-one-third-desktop{margin-left:33.3333%}.column.is-offset-one-quarter-desktop{margin-left:25%}.column.is-offset-one-fifth-desktop{margin-left:20%}.column.is-offset-two-fifths-desktop{margin-left:40%}.column.is-offset-three-fifths-desktop{margin-left:60%}.column.is-offset-four-fifths-desktop{margin-left:80%}.column.is-0-desktop{flex:none;width:0%}.column.is-offset-0-desktop{margin-left:0%}.column.is-1-desktop{flex:none;width:8.3333333333%}.column.is-offset-1-desktop{margin-left:8.3333333333%}.column.is-2-desktop{flex:none;width:16.6666666667%}.column.is-offset-2-desktop{margin-left:16.6666666667%}.column.is-3-desktop{flex:none;width:25%}.column.is-offset-3-desktop{margin-left:25%}.column.is-4-desktop{flex:none;width:33.3333333333%}.column.is-offset-4-desktop{margin-left:33.3333333333%}.column.is-5-desktop{flex:none;width:41.6666666667%}.column.is-offset-5-desktop{margin-left:41.6666666667%}.column.is-6-desktop{flex:none;width:50%}.column.is-offset-6-desktop{margin-left:50%}.column.is-7-desktop{flex:none;width:58.3333333333%}.column.is-offset-7-desktop{margin-left:58.3333333333%}.column.is-8-desktop{flex:none;width:66.6666666667%}.column.is-offset-8-desktop{margin-left:66.6666666667%}.column.is-9-desktop{flex:none;width:75%}.column.is-offset-9-desktop{margin-left:75%}.column.is-10-desktop{flex:none;width:83.3333333333%}.column.is-offset-10-desktop{margin-left:83.3333333333%}.column.is-11-desktop{flex:none;width:91.6666666667%}.column.is-offset-11-desktop{margin-left:91.6666666667%}.column.is-12-desktop{flex:none;width:100%}.column.is-offset-12-desktop{margin-left:100%}}@media screen and (min-width: 1216px){.column.is-narrow-widescreen{flex:none}.column.is-full-widescreen{flex:none;width:100%}.column.is-three-quarters-widescreen{flex:none;width:75%}.column.is-two-thirds-widescreen{flex:none;width:66.6666%}.column.is-half-widescreen{flex:none;width:50%}.column.is-one-third-widescreen{flex:none;width:33.3333%}.column.is-one-quarter-widescreen{flex:none;width:25%}.column.is-one-fifth-widescreen{flex:none;width:20%}.column.is-two-fifths-widescreen{flex:none;width:40%}.column.is-three-fifths-widescreen{flex:none;width:60%}.column.is-four-fifths-widescreen{flex:none;width:80%}.column.is-offset-three-quarters-widescreen{margin-left:75%}.column.is-offset-two-thirds-widescreen{margin-left:66.6666%}.column.is-offset-half-widescreen{margin-left:50%}.column.is-offset-one-third-widescreen{margin-left:33.3333%}.column.is-offset-one-quarter-widescreen{margin-left:25%}.column.is-offset-one-fifth-widescreen{margin-left:20%}.column.is-offset-two-fifths-widescreen{margin-left:40%}.column.is-offset-three-fifths-widescreen{margin-left:60%}.column.is-offset-four-fifths-widescreen{margin-left:80%}.column.is-0-widescreen{flex:none;width:0%}.column.is-offset-0-widescreen{margin-left:0%}.column.is-1-widescreen{flex:none;width:8.3333333333%}.column.is-offset-1-widescreen{margin-left:8.3333333333%}.column.is-2-widescreen{flex:none;width:16.6666666667%}.column.is-offset-2-widescreen{margin-left:16.6666666667%}.column.is-3-widescreen{flex:none;width:25%}.column.is-offset-3-widescreen{margin-left:25%}.column.is-4-widescreen{flex:none;width:33.3333333333%}.column.is-offset-4-widescreen{margin-left:33.3333333333%}.column.is-5-widescreen{flex:none;width:41.6666666667%}.column.is-offset-5-widescreen{margin-left:41.6666666667%}.column.is-6-widescreen{flex:none;width:50%}.column.is-offset-6-widescreen{margin-left:50%}.column.is-7-widescreen{flex:none;width:58.3333333333%}.column.is-offset-7-widescreen{margin-left:58.3333333333%}.column.is-8-widescreen{flex:none;width:66.6666666667%}.column.is-offset-8-widescreen{margin-left:66.6666666667%}.column.is-9-widescreen{flex:none;width:75%}.column.is-offset-9-widescreen{margin-left:75%}.column.is-10-widescreen{flex:none;width:83.3333333333%}.column.is-offset-10-widescreen{margin-left:83.3333333333%}.column.is-11-widescreen{flex:none;width:91.6666666667%}.column.is-offset-11-widescreen{margin-left:91.6666666667%}.column.is-12-widescreen{flex:none;width:100%}.column.is-offset-12-widescreen{margin-left:100%}}@media screen and (min-width: 1408px){.column.is-narrow-fullhd{flex:none}.column.is-full-fullhd{flex:none;width:100%}.column.is-three-quarters-fullhd{flex:none;width:75%}.column.is-two-thirds-fullhd{flex:none;width:66.6666%}.column.is-half-fullhd{flex:none;width:50%}.column.is-one-third-fullhd{flex:none;width:33.3333%}.column.is-one-quarter-fullhd{flex:none;width:25%}.column.is-one-fifth-fullhd{flex:none;width:20%}.column.is-two-fifths-fullhd{flex:none;width:40%}.column.is-three-fifths-fullhd{flex:none;width:60%}.column.is-four-fifths-fullhd{flex:none;width:80%}.column.is-offset-three-quarters-fullhd{margin-left:75%}.column.is-offset-two-thirds-fullhd{margin-left:66.6666%}.column.is-offset-half-fullhd{margin-left:50%}.column.is-offset-one-third-fullhd{margin-left:33.3333%}.column.is-offset-one-quarter-fullhd{margin-left:25%}.column.is-offset-one-fifth-fullhd{margin-left:20%}.column.is-offset-two-fifths-fullhd{margin-left:40%}.column.is-offset-three-fifths-fullhd{margin-left:60%}.column.is-offset-four-fifths-fullhd{margin-left:80%}.column.is-0-fullhd{flex:none;width:0%}.column.is-offset-0-fullhd{margin-left:0%}.column.is-1-fullhd{flex:none;width:8.3333333333%}.column.is-offset-1-fullhd{margin-left:8.3333333333%}.column.is-2-fullhd{flex:none;width:16.6666666667%}.column.is-offset-2-fullhd{margin-left:16.6666666667%}.column.is-3-fullhd{flex:none;width:25%}.column.is-offset-3-fullhd{margin-left:25%}.column.is-4-fullhd{flex:none;width:33.3333333333%}.column.is-offset-4-fullhd{margin-left:33.3333333333%}.column.is-5-fullhd{flex:none;width:41.6666666667%}.column.is-offset-5-fullhd{margin-left:41.6666666667%}.column.is-6-fullhd{flex:none;width:50%}.column.is-offset-6-fullhd{margin-left:50%}.column.is-7-fullhd{flex:none;width:58.3333333333%}.column.is-offset-7-fullhd{margin-left:58.3333333333%}.column.is-8-fullhd{flex:none;width:66.6666666667%}.column.is-offset-8-fullhd{margin-left:66.6666666667%}.column.is-9-fullhd{flex:none;width:75%}.column.is-offset-9-fullhd{margin-left:75%}.column.is-10-fullhd{flex:none;width:83.3333333333%}.column.is-offset-10-fullhd{margin-left:83.3333333333%}.column.is-11-fullhd{flex:none;width:91.6666666667%}.column.is-offset-11-fullhd{margin-left:91.6666666667%}.column.is-12-fullhd{flex:none;width:100%}.column.is-offset-12-fullhd{margin-left:100%}}.columns{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.columns:last-child{margin-bottom:-.75rem}.columns:not(:last-child){margin-bottom:calc(1.5rem - .75rem)}.columns.is-centered{justify-content:center}.columns.is-gapless{margin-left:0;margin-right:0;margin-top:0}.columns.is-gapless>.column{margin:0;padding:0 !important}.columns.is-gapless:not(:last-child){margin-bottom:1.5rem}.columns.is-gapless:last-child{margin-bottom:0}.columns.is-mobile{display:flex}.columns.is-multiline{flex-wrap:wrap}.columns.is-vcentered{align-items:center}@media screen and (min-width: 769px),print{.columns:not(.is-desktop){display:flex}}@media screen and (min-width: 1056px){.columns.is-desktop{display:flex}}.columns.is-variable{--columnGap: 0.75rem;margin-left:calc(-1 * var(--columnGap));margin-right:calc(-1 * var(--columnGap))}.columns.is-variable .column{padding-left:var(--columnGap);padding-right:var(--columnGap)}.columns.is-variable.is-0{--columnGap: 0rem}@media screen and (max-width: 768px){.columns.is-variable.is-0-mobile{--columnGap: 0rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-0-tablet{--columnGap: 0rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-0-tablet-only{--columnGap: 0rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-0-touch{--columnGap: 0rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-0-desktop{--columnGap: 0rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-0-desktop-only{--columnGap: 0rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-0-widescreen{--columnGap: 0rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-0-widescreen-only{--columnGap: 0rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-0-fullhd{--columnGap: 0rem}}.columns.is-variable.is-1{--columnGap: .25rem}@media screen and (max-width: 768px){.columns.is-variable.is-1-mobile{--columnGap: .25rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-1-tablet{--columnGap: .25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-1-tablet-only{--columnGap: .25rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-1-touch{--columnGap: .25rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-1-desktop{--columnGap: .25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-1-desktop-only{--columnGap: .25rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-1-widescreen{--columnGap: .25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-1-widescreen-only{--columnGap: .25rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-1-fullhd{--columnGap: .25rem}}.columns.is-variable.is-2{--columnGap: .5rem}@media screen and (max-width: 768px){.columns.is-variable.is-2-mobile{--columnGap: .5rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-2-tablet{--columnGap: .5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-2-tablet-only{--columnGap: .5rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-2-touch{--columnGap: .5rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-2-desktop{--columnGap: .5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-2-desktop-only{--columnGap: .5rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-2-widescreen{--columnGap: .5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-2-widescreen-only{--columnGap: .5rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-2-fullhd{--columnGap: .5rem}}.columns.is-variable.is-3{--columnGap: .75rem}@media screen and (max-width: 768px){.columns.is-variable.is-3-mobile{--columnGap: .75rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-3-tablet{--columnGap: .75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-3-tablet-only{--columnGap: .75rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-3-touch{--columnGap: .75rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-3-desktop{--columnGap: .75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-3-desktop-only{--columnGap: .75rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-3-widescreen{--columnGap: .75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-3-widescreen-only{--columnGap: .75rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-3-fullhd{--columnGap: .75rem}}.columns.is-variable.is-4{--columnGap: 1rem}@media screen and (max-width: 768px){.columns.is-variable.is-4-mobile{--columnGap: 1rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-4-tablet{--columnGap: 1rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-4-tablet-only{--columnGap: 1rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-4-touch{--columnGap: 1rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-4-desktop{--columnGap: 1rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-4-desktop-only{--columnGap: 1rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-4-widescreen{--columnGap: 1rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-4-widescreen-only{--columnGap: 1rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-4-fullhd{--columnGap: 1rem}}.columns.is-variable.is-5{--columnGap: 1.25rem}@media screen and (max-width: 768px){.columns.is-variable.is-5-mobile{--columnGap: 1.25rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-5-tablet{--columnGap: 1.25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-5-tablet-only{--columnGap: 1.25rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-5-touch{--columnGap: 1.25rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-5-desktop{--columnGap: 1.25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-5-desktop-only{--columnGap: 1.25rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-5-widescreen{--columnGap: 1.25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-5-widescreen-only{--columnGap: 1.25rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-5-fullhd{--columnGap: 1.25rem}}.columns.is-variable.is-6{--columnGap: 1.5rem}@media screen and (max-width: 768px){.columns.is-variable.is-6-mobile{--columnGap: 1.5rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-6-tablet{--columnGap: 1.5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-6-tablet-only{--columnGap: 1.5rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-6-touch{--columnGap: 1.5rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-6-desktop{--columnGap: 1.5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-6-desktop-only{--columnGap: 1.5rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-6-widescreen{--columnGap: 1.5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-6-widescreen-only{--columnGap: 1.5rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-6-fullhd{--columnGap: 1.5rem}}.columns.is-variable.is-7{--columnGap: 1.75rem}@media screen and (max-width: 768px){.columns.is-variable.is-7-mobile{--columnGap: 1.75rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-7-tablet{--columnGap: 1.75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-7-tablet-only{--columnGap: 1.75rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-7-touch{--columnGap: 1.75rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-7-desktop{--columnGap: 1.75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-7-desktop-only{--columnGap: 1.75rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-7-widescreen{--columnGap: 1.75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-7-widescreen-only{--columnGap: 1.75rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-7-fullhd{--columnGap: 1.75rem}}.columns.is-variable.is-8{--columnGap: 2rem}@media screen and (max-width: 768px){.columns.is-variable.is-8-mobile{--columnGap: 2rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-8-tablet{--columnGap: 2rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-8-tablet-only{--columnGap: 2rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-8-touch{--columnGap: 2rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-8-desktop{--columnGap: 2rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-8-desktop-only{--columnGap: 2rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-8-widescreen{--columnGap: 2rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-8-widescreen-only{--columnGap: 2rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-8-fullhd{--columnGap: 2rem}}.tile{align-items:stretch;display:block;flex-basis:0;flex-grow:1;flex-shrink:1;min-height:min-content}.tile.is-ancestor{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.tile.is-ancestor:last-child{margin-bottom:-.75rem}.tile.is-ancestor:not(:last-child){margin-bottom:.75rem}.tile.is-child{margin:0 !important}.tile.is-parent{padding:.75rem}.tile.is-vertical{flex-direction:column}.tile.is-vertical>.tile.is-child:not(:last-child){margin-bottom:1.5rem !important}@media screen and (min-width: 769px),print{.tile:not(.is-child){display:flex}.tile.is-1{flex:none;width:8.3333333333%}.tile.is-2{flex:none;width:16.6666666667%}.tile.is-3{flex:none;width:25%}.tile.is-4{flex:none;width:33.3333333333%}.tile.is-5{flex:none;width:41.6666666667%}.tile.is-6{flex:none;width:50%}.tile.is-7{flex:none;width:58.3333333333%}.tile.is-8{flex:none;width:66.6666666667%}.tile.is-9{flex:none;width:75%}.tile.is-10{flex:none;width:83.3333333333%}.tile.is-11{flex:none;width:91.6666666667%}.tile.is-12{flex:none;width:100%}}.hero{align-items:stretch;display:flex;flex-direction:column;justify-content:space-between}.hero .navbar{background:none}.hero .tabs ul{border-bottom:none}.hero.is-white{background-color:#fff;color:#0a0a0a}.hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-white strong{color:inherit}.hero.is-white .title{color:#0a0a0a}.hero.is-white .subtitle{color:rgba(10,10,10,0.9)}.hero.is-white .subtitle a:not(.button),.hero.is-white .subtitle strong{color:#0a0a0a}@media screen and (max-width: 1055px){.hero.is-white .navbar-menu{background-color:#fff}}.hero.is-white .navbar-item,.hero.is-white .navbar-link{color:rgba(10,10,10,0.7)}.hero.is-white a.navbar-item:hover,.hero.is-white a.navbar-item.is-active,.hero.is-white .navbar-link:hover,.hero.is-white .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}.hero.is-white .tabs a{color:#0a0a0a;opacity:0.9}.hero.is-white .tabs a:hover{opacity:1}.hero.is-white .tabs li.is-active a{opacity:1}.hero.is-white .tabs.is-boxed a,.hero.is-white .tabs.is-toggle a{color:#0a0a0a}.hero.is-white .tabs.is-boxed a:hover,.hero.is-white .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-white .tabs.is-boxed li.is-active a,.hero.is-white .tabs.is-boxed li.is-active a:hover,.hero.is-white .tabs.is-toggle li.is-active a,.hero.is-white .tabs.is-toggle li.is-active a:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.hero.is-white.is-bold{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}@media screen and (max-width: 768px){.hero.is-white.is-bold .navbar-menu{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}}.hero.is-black{background-color:#0a0a0a;color:#fff}.hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-black strong{color:inherit}.hero.is-black .title{color:#fff}.hero.is-black .subtitle{color:rgba(255,255,255,0.9)}.hero.is-black .subtitle a:not(.button),.hero.is-black .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-black .navbar-menu{background-color:#0a0a0a}}.hero.is-black .navbar-item,.hero.is-black .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-black a.navbar-item:hover,.hero.is-black a.navbar-item.is-active,.hero.is-black .navbar-link:hover,.hero.is-black .navbar-link.is-active{background-color:#000;color:#fff}.hero.is-black .tabs a{color:#fff;opacity:0.9}.hero.is-black .tabs a:hover{opacity:1}.hero.is-black .tabs li.is-active a{opacity:1}.hero.is-black .tabs.is-boxed a,.hero.is-black .tabs.is-toggle a{color:#fff}.hero.is-black .tabs.is-boxed a:hover,.hero.is-black .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-black .tabs.is-boxed li.is-active a,.hero.is-black .tabs.is-boxed li.is-active a:hover,.hero.is-black .tabs.is-toggle li.is-active a,.hero.is-black .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}.hero.is-black.is-bold{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}@media screen and (max-width: 768px){.hero.is-black.is-bold .navbar-menu{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}}.hero.is-light{background-color:#f5f5f5;color:#363636}.hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-light strong{color:inherit}.hero.is-light .title{color:#363636}.hero.is-light .subtitle{color:rgba(54,54,54,0.9)}.hero.is-light .subtitle a:not(.button),.hero.is-light .subtitle strong{color:#363636}@media screen and (max-width: 1055px){.hero.is-light .navbar-menu{background-color:#f5f5f5}}.hero.is-light .navbar-item,.hero.is-light .navbar-link{color:rgba(54,54,54,0.7)}.hero.is-light a.navbar-item:hover,.hero.is-light a.navbar-item.is-active,.hero.is-light .navbar-link:hover,.hero.is-light .navbar-link.is-active{background-color:#e8e8e8;color:#363636}.hero.is-light .tabs a{color:#363636;opacity:0.9}.hero.is-light .tabs a:hover{opacity:1}.hero.is-light .tabs li.is-active a{opacity:1}.hero.is-light .tabs.is-boxed a,.hero.is-light .tabs.is-toggle a{color:#363636}.hero.is-light .tabs.is-boxed a:hover,.hero.is-light .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-light .tabs.is-boxed li.is-active a,.hero.is-light .tabs.is-boxed li.is-active a:hover,.hero.is-light .tabs.is-toggle li.is-active a,.hero.is-light .tabs.is-toggle li.is-active a:hover{background-color:#363636;border-color:#363636;color:#f5f5f5}.hero.is-light.is-bold{background-image:linear-gradient(141deg, #dfd8d9 0%, #f5f5f5 71%, #fff 100%)}@media screen and (max-width: 768px){.hero.is-light.is-bold .navbar-menu{background-image:linear-gradient(141deg, #dfd8d9 0%, #f5f5f5 71%, #fff 100%)}}.hero.is-dark,.content kbd.hero{background-color:#363636;color:#f5f5f5}.hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.content kbd.hero a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-dark strong,.content kbd.hero strong{color:inherit}.hero.is-dark .title,.content kbd.hero .title{color:#f5f5f5}.hero.is-dark .subtitle,.content kbd.hero .subtitle{color:rgba(245,245,245,0.9)}.hero.is-dark .subtitle a:not(.button),.content kbd.hero .subtitle a:not(.button),.hero.is-dark .subtitle strong,.content kbd.hero .subtitle strong{color:#f5f5f5}@media screen and (max-width: 1055px){.hero.is-dark .navbar-menu,.content kbd.hero .navbar-menu{background-color:#363636}}.hero.is-dark .navbar-item,.content kbd.hero .navbar-item,.hero.is-dark .navbar-link,.content kbd.hero .navbar-link{color:rgba(245,245,245,0.7)}.hero.is-dark a.navbar-item:hover,.content kbd.hero a.navbar-item:hover,.hero.is-dark a.navbar-item.is-active,.content kbd.hero a.navbar-item.is-active,.hero.is-dark .navbar-link:hover,.content kbd.hero .navbar-link:hover,.hero.is-dark .navbar-link.is-active,.content kbd.hero .navbar-link.is-active{background-color:#292929;color:#f5f5f5}.hero.is-dark .tabs a,.content kbd.hero .tabs a{color:#f5f5f5;opacity:0.9}.hero.is-dark .tabs a:hover,.content kbd.hero .tabs a:hover{opacity:1}.hero.is-dark .tabs li.is-active a,.content kbd.hero .tabs li.is-active a{opacity:1}.hero.is-dark .tabs.is-boxed a,.content kbd.hero .tabs.is-boxed a,.hero.is-dark .tabs.is-toggle a,.content kbd.hero .tabs.is-toggle a{color:#f5f5f5}.hero.is-dark .tabs.is-boxed a:hover,.content kbd.hero .tabs.is-boxed a:hover,.hero.is-dark .tabs.is-toggle a:hover,.content kbd.hero .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-dark .tabs.is-boxed li.is-active a,.content kbd.hero .tabs.is-boxed li.is-active a,.hero.is-dark .tabs.is-boxed li.is-active a:hover,.hero.is-dark .tabs.is-toggle li.is-active a,.content kbd.hero .tabs.is-toggle li.is-active a,.hero.is-dark .tabs.is-toggle li.is-active a:hover{background-color:#f5f5f5;border-color:#f5f5f5;color:#363636}.hero.is-dark.is-bold,.content kbd.hero.is-bold{background-image:linear-gradient(141deg, #1f191a 0%, #363636 71%, #46403f 100%)}@media screen and (max-width: 768px){.hero.is-dark.is-bold .navbar-menu,.content kbd.hero.is-bold .navbar-menu{background-image:linear-gradient(141deg, #1f191a 0%, #363636 71%, #46403f 100%)}}.hero.is-primary,.docstring>section>a.hero.docs-sourcelink{background-color:#4eb5de;color:#fff}.hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.docstring>section>a.hero.docs-sourcelink a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-primary strong,.docstring>section>a.hero.docs-sourcelink strong{color:inherit}.hero.is-primary .title,.docstring>section>a.hero.docs-sourcelink .title{color:#fff}.hero.is-primary .subtitle,.docstring>section>a.hero.docs-sourcelink .subtitle{color:rgba(255,255,255,0.9)}.hero.is-primary .subtitle a:not(.button),.docstring>section>a.hero.docs-sourcelink .subtitle a:not(.button),.hero.is-primary .subtitle strong,.docstring>section>a.hero.docs-sourcelink .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-primary .navbar-menu,.docstring>section>a.hero.docs-sourcelink .navbar-menu{background-color:#4eb5de}}.hero.is-primary .navbar-item,.docstring>section>a.hero.docs-sourcelink .navbar-item,.hero.is-primary .navbar-link,.docstring>section>a.hero.docs-sourcelink .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-primary a.navbar-item:hover,.docstring>section>a.hero.docs-sourcelink a.navbar-item:hover,.hero.is-primary a.navbar-item.is-active,.docstring>section>a.hero.docs-sourcelink a.navbar-item.is-active,.hero.is-primary .navbar-link:hover,.docstring>section>a.hero.docs-sourcelink .navbar-link:hover,.hero.is-primary .navbar-link.is-active,.docstring>section>a.hero.docs-sourcelink .navbar-link.is-active{background-color:#39acda;color:#fff}.hero.is-primary .tabs a,.docstring>section>a.hero.docs-sourcelink .tabs a{color:#fff;opacity:0.9}.hero.is-primary .tabs a:hover,.docstring>section>a.hero.docs-sourcelink .tabs a:hover{opacity:1}.hero.is-primary .tabs li.is-active a,.docstring>section>a.hero.docs-sourcelink .tabs li.is-active a{opacity:1}.hero.is-primary .tabs.is-boxed a,.docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a,.hero.is-primary .tabs.is-toggle a,.docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a{color:#fff}.hero.is-primary .tabs.is-boxed a:hover,.docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a:hover,.hero.is-primary .tabs.is-toggle a:hover,.docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-primary .tabs.is-boxed li.is-active a,.docstring>section>a.hero.docs-sourcelink .tabs.is-boxed li.is-active a,.hero.is-primary .tabs.is-boxed li.is-active a:hover,.hero.is-primary .tabs.is-toggle li.is-active a,.docstring>section>a.hero.docs-sourcelink .tabs.is-toggle li.is-active a,.hero.is-primary .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#4eb5de}.hero.is-primary.is-bold,.docstring>section>a.hero.is-bold.docs-sourcelink{background-image:linear-gradient(141deg, #1bc7de 0%, #4eb5de 71%, #5fa9e7 100%)}@media screen and (max-width: 768px){.hero.is-primary.is-bold .navbar-menu,.docstring>section>a.hero.is-bold.docs-sourcelink .navbar-menu{background-image:linear-gradient(141deg, #1bc7de 0%, #4eb5de 71%, #5fa9e7 100%)}}.hero.is-link{background-color:#2e63b8;color:#fff}.hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-link strong{color:inherit}.hero.is-link .title{color:#fff}.hero.is-link .subtitle{color:rgba(255,255,255,0.9)}.hero.is-link .subtitle a:not(.button),.hero.is-link .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-link .navbar-menu{background-color:#2e63b8}}.hero.is-link .navbar-item,.hero.is-link .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-link a.navbar-item:hover,.hero.is-link a.navbar-item.is-active,.hero.is-link .navbar-link:hover,.hero.is-link .navbar-link.is-active{background-color:#2958a4;color:#fff}.hero.is-link .tabs a{color:#fff;opacity:0.9}.hero.is-link .tabs a:hover{opacity:1}.hero.is-link .tabs li.is-active a{opacity:1}.hero.is-link .tabs.is-boxed a,.hero.is-link .tabs.is-toggle a{color:#fff}.hero.is-link .tabs.is-boxed a:hover,.hero.is-link .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-link .tabs.is-boxed li.is-active a,.hero.is-link .tabs.is-boxed li.is-active a:hover,.hero.is-link .tabs.is-toggle li.is-active a,.hero.is-link .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#2e63b8}.hero.is-link.is-bold{background-image:linear-gradient(141deg, #1b6098 0%, #2e63b8 71%, #2d51d2 100%)}@media screen and (max-width: 768px){.hero.is-link.is-bold .navbar-menu{background-image:linear-gradient(141deg, #1b6098 0%, #2e63b8 71%, #2d51d2 100%)}}.hero.is-info{background-color:#209cee;color:#fff}.hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-info strong{color:inherit}.hero.is-info .title{color:#fff}.hero.is-info .subtitle{color:rgba(255,255,255,0.9)}.hero.is-info .subtitle a:not(.button),.hero.is-info .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-info .navbar-menu{background-color:#209cee}}.hero.is-info .navbar-item,.hero.is-info .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-info a.navbar-item:hover,.hero.is-info a.navbar-item.is-active,.hero.is-info .navbar-link:hover,.hero.is-info .navbar-link.is-active{background-color:#1190e3;color:#fff}.hero.is-info .tabs a{color:#fff;opacity:0.9}.hero.is-info .tabs a:hover{opacity:1}.hero.is-info .tabs li.is-active a{opacity:1}.hero.is-info .tabs.is-boxed a,.hero.is-info .tabs.is-toggle a{color:#fff}.hero.is-info .tabs.is-boxed a:hover,.hero.is-info .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-info .tabs.is-boxed li.is-active a,.hero.is-info .tabs.is-boxed li.is-active a:hover,.hero.is-info .tabs.is-toggle li.is-active a,.hero.is-info .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#209cee}.hero.is-info.is-bold{background-image:linear-gradient(141deg, #05a6d6 0%, #209cee 71%, #3287f5 100%)}@media screen and (max-width: 768px){.hero.is-info.is-bold .navbar-menu{background-image:linear-gradient(141deg, #05a6d6 0%, #209cee 71%, #3287f5 100%)}}.hero.is-success{background-color:#22c35b;color:#fff}.hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-success strong{color:inherit}.hero.is-success .title{color:#fff}.hero.is-success .subtitle{color:rgba(255,255,255,0.9)}.hero.is-success .subtitle a:not(.button),.hero.is-success .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-success .navbar-menu{background-color:#22c35b}}.hero.is-success .navbar-item,.hero.is-success .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-success a.navbar-item:hover,.hero.is-success a.navbar-item.is-active,.hero.is-success .navbar-link:hover,.hero.is-success .navbar-link.is-active{background-color:#1ead51;color:#fff}.hero.is-success .tabs a{color:#fff;opacity:0.9}.hero.is-success .tabs a:hover{opacity:1}.hero.is-success .tabs li.is-active a{opacity:1}.hero.is-success .tabs.is-boxed a,.hero.is-success .tabs.is-toggle a{color:#fff}.hero.is-success .tabs.is-boxed a:hover,.hero.is-success .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-success .tabs.is-boxed li.is-active a,.hero.is-success .tabs.is-boxed li.is-active a:hover,.hero.is-success .tabs.is-toggle li.is-active a,.hero.is-success .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#22c35b}.hero.is-success.is-bold{background-image:linear-gradient(141deg, #12a02c 0%, #22c35b 71%, #1fdf83 100%)}@media screen and (max-width: 768px){.hero.is-success.is-bold .navbar-menu{background-image:linear-gradient(141deg, #12a02c 0%, #22c35b 71%, #1fdf83 100%)}}.hero.is-warning{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-warning strong{color:inherit}.hero.is-warning .title{color:rgba(0,0,0,0.7)}.hero.is-warning .subtitle{color:rgba(0,0,0,0.9)}.hero.is-warning .subtitle a:not(.button),.hero.is-warning .subtitle strong{color:rgba(0,0,0,0.7)}@media screen and (max-width: 1055px){.hero.is-warning .navbar-menu{background-color:#ffdd57}}.hero.is-warning .navbar-item,.hero.is-warning .navbar-link{color:rgba(0,0,0,0.7)}.hero.is-warning a.navbar-item:hover,.hero.is-warning a.navbar-item.is-active,.hero.is-warning .navbar-link:hover,.hero.is-warning .navbar-link.is-active{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.hero.is-warning .tabs a{color:rgba(0,0,0,0.7);opacity:0.9}.hero.is-warning .tabs a:hover{opacity:1}.hero.is-warning .tabs li.is-active a{opacity:1}.hero.is-warning .tabs.is-boxed a,.hero.is-warning .tabs.is-toggle a{color:rgba(0,0,0,0.7)}.hero.is-warning .tabs.is-boxed a:hover,.hero.is-warning .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-warning .tabs.is-boxed li.is-active a,.hero.is-warning .tabs.is-boxed li.is-active a:hover,.hero.is-warning .tabs.is-toggle li.is-active a,.hero.is-warning .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,0.7);border-color:rgba(0,0,0,0.7);color:#ffdd57}.hero.is-warning.is-bold{background-image:linear-gradient(141deg, #ffae24 0%, #ffdd57 71%, #fffa71 100%)}@media screen and (max-width: 768px){.hero.is-warning.is-bold .navbar-menu{background-image:linear-gradient(141deg, #ffae24 0%, #ffdd57 71%, #fffa71 100%)}}.hero.is-danger{background-color:#da0b00;color:#fff}.hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-danger strong{color:inherit}.hero.is-danger .title{color:#fff}.hero.is-danger .subtitle{color:rgba(255,255,255,0.9)}.hero.is-danger .subtitle a:not(.button),.hero.is-danger .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-danger .navbar-menu{background-color:#da0b00}}.hero.is-danger .navbar-item,.hero.is-danger .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-danger a.navbar-item:hover,.hero.is-danger a.navbar-item.is-active,.hero.is-danger .navbar-link:hover,.hero.is-danger .navbar-link.is-active{background-color:#c10a00;color:#fff}.hero.is-danger .tabs a{color:#fff;opacity:0.9}.hero.is-danger .tabs a:hover{opacity:1}.hero.is-danger .tabs li.is-active a{opacity:1}.hero.is-danger .tabs.is-boxed a,.hero.is-danger .tabs.is-toggle a{color:#fff}.hero.is-danger .tabs.is-boxed a:hover,.hero.is-danger .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-danger .tabs.is-boxed li.is-active a,.hero.is-danger .tabs.is-boxed li.is-active a:hover,.hero.is-danger .tabs.is-toggle li.is-active a,.hero.is-danger .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#da0b00}.hero.is-danger.is-bold{background-image:linear-gradient(141deg, #a70013 0%, #da0b00 71%, #f43500 100%)}@media screen and (max-width: 768px){.hero.is-danger.is-bold .navbar-menu{background-image:linear-gradient(141deg, #a70013 0%, #da0b00 71%, #f43500 100%)}}.hero.is-small .hero-body,#documenter .docs-sidebar form.docs-search>input.hero .hero-body{padding-bottom:1.5rem;padding-top:1.5rem}@media screen and (min-width: 769px),print{.hero.is-medium .hero-body{padding-bottom:9rem;padding-top:9rem}}@media screen and (min-width: 769px),print{.hero.is-large .hero-body{padding-bottom:18rem;padding-top:18rem}}.hero.is-halfheight .hero-body,.hero.is-fullheight .hero-body,.hero.is-fullheight-with-navbar .hero-body{align-items:center;display:flex}.hero.is-halfheight .hero-body>.container,.hero.is-fullheight .hero-body>.container,.hero.is-fullheight-with-navbar .hero-body>.container{flex-grow:1;flex-shrink:1}.hero.is-halfheight{min-height:50vh}.hero.is-fullheight{min-height:100vh}.hero-video{overflow:hidden}.hero-video video{left:50%;min-height:100%;min-width:100%;position:absolute;top:50%;transform:translate3d(-50%, -50%, 0)}.hero-video.is-transparent{opacity:0.3}@media screen and (max-width: 768px){.hero-video{display:none}}.hero-buttons{margin-top:1.5rem}@media screen and (max-width: 768px){.hero-buttons .button{display:flex}.hero-buttons .button:not(:last-child){margin-bottom:0.75rem}}@media screen and (min-width: 769px),print{.hero-buttons{display:flex;justify-content:center}.hero-buttons .button:not(:last-child){margin-right:1.5rem}}.hero-head,.hero-foot{flex-grow:0;flex-shrink:0}.hero-body{flex-grow:1;flex-shrink:0;padding:3rem 1.5rem}.section{padding:3rem 1.5rem}@media screen and (min-width: 1056px){.section.is-medium{padding:9rem 1.5rem}.section.is-large{padding:18rem 1.5rem}}.footer{background-color:#fafafa;padding:3rem 1.5rem 6rem}h1 .docs-heading-anchor,h1 .docs-heading-anchor:hover,h1 .docs-heading-anchor:visited,h2 .docs-heading-anchor,h2 .docs-heading-anchor:hover,h2 .docs-heading-anchor:visited,h3 .docs-heading-anchor,h3 .docs-heading-anchor:hover,h3 .docs-heading-anchor:visited,h4 .docs-heading-anchor,h4 .docs-heading-anchor:hover,h4 .docs-heading-anchor:visited,h5 .docs-heading-anchor,h5 .docs-heading-anchor:hover,h5 .docs-heading-anchor:visited,h6 .docs-heading-anchor,h6 .docs-heading-anchor:hover,h6 .docs-heading-anchor:visited{color:#222}h1 .docs-heading-anchor-permalink,h2 .docs-heading-anchor-permalink,h3 .docs-heading-anchor-permalink,h4 .docs-heading-anchor-permalink,h5 .docs-heading-anchor-permalink,h6 .docs-heading-anchor-permalink{visibility:hidden;vertical-align:middle;margin-left:0.5em;font-size:0.7rem}h1 .docs-heading-anchor-permalink::before,h2 .docs-heading-anchor-permalink::before,h3 .docs-heading-anchor-permalink::before,h4 .docs-heading-anchor-permalink::before,h5 .docs-heading-anchor-permalink::before,h6 .docs-heading-anchor-permalink::before{font-family:"Font Awesome 5 Free";font-weight:900;content:"\f0c1"}h1:hover .docs-heading-anchor-permalink,h2:hover .docs-heading-anchor-permalink,h3:hover .docs-heading-anchor-permalink,h4:hover .docs-heading-anchor-permalink,h5:hover .docs-heading-anchor-permalink,h6:hover .docs-heading-anchor-permalink{visibility:visible}.docs-dark-only{display:none !important}pre{position:relative;overflow:hidden}pre code,pre code.hljs{padding:0 .75rem !important;overflow:auto;display:block}pre code:first-of-type,pre code.hljs:first-of-type{padding-top:0.5rem !important}pre code:last-of-type,pre code.hljs:last-of-type{padding-bottom:0.5rem !important}pre .copy-button{opacity:0.2;transition:opacity 0.2s;position:absolute;right:0em;top:0em;padding:0.5em;width:2.5em;height:2.5em;background:transparent;border:none;font-family:"Font Awesome 5 Free";color:#222;cursor:pointer;text-align:center}pre .copy-button:focus,pre .copy-button:hover{opacity:1;background:rgba(34,34,34,0.1);color:#2e63b8}pre .copy-button.success{color:#259a12;opacity:1}pre .copy-button.error{color:#cb3c33;opacity:1}pre:hover .copy-button{opacity:1}.admonition{background-color:#b5b5b5;border-style:solid;border-width:1px;border-color:#363636;border-radius:4px;font-size:1rem}.admonition strong{color:currentColor}.admonition.is-small,#documenter .docs-sidebar form.docs-search>input.admonition{font-size:.75rem}.admonition.is-medium{font-size:1.25rem}.admonition.is-large{font-size:1.5rem}.admonition.is-default{background-color:#b5b5b5;border-color:#363636}.admonition.is-default>.admonition-header{background-color:#363636;color:#fff}.admonition.is-default>.admonition-body{color:#fff}.admonition.is-info{background-color:#def0fc;border-color:#209cee}.admonition.is-info>.admonition-header{background-color:#209cee;color:#fff}.admonition.is-info>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-success{background-color:#bdf4d1;border-color:#22c35b}.admonition.is-success>.admonition-header{background-color:#22c35b;color:#fff}.admonition.is-success>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-warning{background-color:#fff3c5;border-color:#ffdd57}.admonition.is-warning>.admonition-header{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.admonition.is-warning>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-danger{background-color:#ffaba7;border-color:#da0b00}.admonition.is-danger>.admonition-header{background-color:#da0b00;color:#fff}.admonition.is-danger>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-compat{background-color:#bdeff5;border-color:#1db5c9}.admonition.is-compat>.admonition-header{background-color:#1db5c9;color:#fff}.admonition.is-compat>.admonition-body{color:rgba(0,0,0,0.7)}.admonition-header{color:#fff;background-color:#363636;align-items:center;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.5rem .75rem;position:relative}.admonition-header:before{font-family:"Font Awesome 5 Free";font-weight:900;margin-right:.75rem;content:"\f06a"}.admonition-body{color:#222;padding:0.5rem .75rem}.admonition-body pre{background-color:#f5f5f5}.admonition-body code{background-color:rgba(0,0,0,0.05)}.docstring{margin-bottom:1em;background-color:rgba(0,0,0,0);border:1px solid #dbdbdb;box-shadow:2px 2px 3px rgba(10,10,10,0.1);max-width:100%}.docstring>header{display:flex;flex-grow:1;align-items:stretch;padding:0.5rem .75rem;background-color:#f5f5f5;box-shadow:0 1px 2px rgba(10,10,10,0.1);box-shadow:none;border-bottom:1px solid #dbdbdb}.docstring>header code{background-color:transparent}.docstring>header .docstring-binding{margin-right:0.3em}.docstring>header .docstring-category{margin-left:0.3em}.docstring>section{position:relative;padding:.75rem .75rem;border-bottom:1px solid #dbdbdb}.docstring>section:last-child{border-bottom:none}.docstring>section>a.docs-sourcelink{transition:opacity 0.3s;opacity:0;position:absolute;right:.375rem;bottom:.375rem}.docstring>section>a.docs-sourcelink:focus{opacity:1 !important}.docstring:hover>section>a.docs-sourcelink{opacity:0.2}.docstring:focus-within>section>a.docs-sourcelink{opacity:0.2}.docstring>section:hover a.docs-sourcelink{opacity:1}.documenter-example-output{background-color:#fff}.outdated-warning-overlay{position:fixed;top:0;left:0;right:0;box-shadow:0 0 10px rgba(0,0,0,0.3);z-index:999;background-color:#ffaba7;color:rgba(0,0,0,0.7);border-bottom:3px solid #da0b00;padding:10px 35px;text-align:center;font-size:15px}.outdated-warning-overlay .outdated-warning-closer{position:absolute;top:calc(50% - 10px);right:18px;cursor:pointer;width:12px}.outdated-warning-overlay a{color:#2e63b8}.outdated-warning-overlay a:hover{color:#363636}.content pre{border:1px solid #dbdbdb}.content code{font-weight:inherit}.content a code{color:#2e63b8}.content h1 code,.content h2 code,.content h3 code,.content h4 code,.content h5 code,.content h6 code{color:#222}.content table{display:block;width:initial;max-width:100%;overflow-x:auto}.content blockquote>ul:first-child,.content blockquote>ol:first-child,.content .admonition-body>ul:first-child,.content .admonition-body>ol:first-child{margin-top:0}pre,code{font-variant-ligatures:no-contextual}.breadcrumb a.is-disabled{cursor:default;pointer-events:none}.breadcrumb a.is-disabled,.breadcrumb a.is-disabled:hover{color:#222}.hljs{background:initial !important}.katex .katex-mathml{top:0;right:0}.katex-display,mjx-container,.MathJax_Display{margin:0.5em 0 !important}html{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto}li.no-marker{list-style:none}#documenter .docs-main>article{overflow-wrap:break-word}#documenter .docs-main>article .math-container{overflow-x:auto;overflow-y:hidden}@media screen and (min-width: 1056px){#documenter .docs-main{max-width:52rem;margin-left:20rem;padding-right:1rem}}@media screen and (max-width: 1055px){#documenter .docs-main{width:100%}#documenter .docs-main>article{max-width:52rem;margin-left:auto;margin-right:auto;margin-bottom:1rem;padding:0 1rem}#documenter .docs-main>header,#documenter .docs-main>nav{max-width:100%;width:100%;margin:0}}#documenter .docs-main header.docs-navbar{background-color:#fff;border-bottom:1px solid #dbdbdb;z-index:2;min-height:4rem;margin-bottom:1rem;display:flex}#documenter .docs-main header.docs-navbar .breadcrumb{flex-grow:1}#documenter .docs-main header.docs-navbar .docs-right{display:flex;white-space:nowrap}#documenter .docs-main header.docs-navbar .docs-right .docs-icon,#documenter .docs-main header.docs-navbar .docs-right .docs-label,#documenter .docs-main header.docs-navbar .docs-right .docs-sidebar-button{display:inline-block}#documenter .docs-main header.docs-navbar .docs-right .docs-label{padding:0;margin-left:0.3em}#documenter .docs-main header.docs-navbar .docs-right .docs-settings-button{margin:auto 0 auto 1rem}#documenter .docs-main header.docs-navbar .docs-right .docs-sidebar-button{font-size:1.5rem;margin:auto 0 auto 1rem}#documenter .docs-main header.docs-navbar>*{margin:auto 0}@media screen and (max-width: 1055px){#documenter .docs-main header.docs-navbar{position:sticky;top:0;padding:0 1rem;transition-property:top, box-shadow;-webkit-transition-property:top, box-shadow;transition-duration:0.3s;-webkit-transition-duration:0.3s}#documenter .docs-main header.docs-navbar.headroom--not-top{box-shadow:.2rem 0rem .4rem #bbb;transition-duration:0.7s;-webkit-transition-duration:0.7s}#documenter .docs-main header.docs-navbar.headroom--unpinned.headroom--not-top.headroom--not-bottom{top:-4.5rem;transition-duration:0.7s;-webkit-transition-duration:0.7s}}#documenter .docs-main section.footnotes{border-top:1px solid #dbdbdb}#documenter .docs-main section.footnotes li .tag:first-child,#documenter .docs-main section.footnotes li .docstring>section>a.docs-sourcelink:first-child,#documenter .docs-main section.footnotes li .content kbd:first-child,.content #documenter .docs-main section.footnotes li kbd:first-child{margin-right:1em;margin-bottom:0.4em}#documenter .docs-main .docs-footer{display:flex;flex-wrap:wrap;margin-left:0;margin-right:0;border-top:1px solid #dbdbdb;padding-top:1rem;padding-bottom:1rem}@media screen and (max-width: 1055px){#documenter .docs-main .docs-footer{padding-left:1rem;padding-right:1rem}}#documenter .docs-main .docs-footer .docs-footer-nextpage,#documenter .docs-main .docs-footer .docs-footer-prevpage{flex-grow:1}#documenter .docs-main .docs-footer .docs-footer-nextpage{text-align:right}#documenter .docs-main .docs-footer .flexbox-break{flex-basis:100%;height:0}#documenter .docs-main .docs-footer .footer-message{font-size:0.8em;margin:0.5em auto 0 auto;text-align:center}#documenter .docs-sidebar{display:flex;flex-direction:column;color:#0a0a0a;background-color:#f5f5f5;border-right:1px solid #dbdbdb;padding:0;flex:0 0 18rem;z-index:5;font-size:1rem;position:fixed;left:-18rem;width:18rem;height:100%;transition:left 0.3s}#documenter .docs-sidebar.visible{left:0;box-shadow:.4rem 0rem .8rem #bbb}@media screen and (min-width: 1056px){#documenter .docs-sidebar.visible{box-shadow:none}}@media screen and (min-width: 1056px){#documenter .docs-sidebar{left:0;top:0}}#documenter .docs-sidebar .docs-logo{margin-top:1rem;padding:0 1rem}#documenter .docs-sidebar .docs-logo>img{max-height:6rem;margin:auto}#documenter .docs-sidebar .docs-package-name{flex-shrink:0;font-size:1.5rem;font-weight:700;text-align:center;white-space:nowrap;overflow:hidden;padding:0.5rem 0}#documenter .docs-sidebar .docs-package-name .docs-autofit{max-width:16.2rem}#documenter .docs-sidebar .docs-package-name a,#documenter .docs-sidebar .docs-package-name a:hover{color:#0a0a0a}#documenter .docs-sidebar .docs-version-selector{border-top:1px solid #dbdbdb;display:none;padding:0.5rem}#documenter .docs-sidebar .docs-version-selector.visible{display:flex}#documenter .docs-sidebar ul.docs-menu{flex-grow:1;user-select:none;border-top:1px solid #dbdbdb;padding-bottom:1.5rem}#documenter .docs-sidebar ul.docs-menu>li>.tocitem{font-weight:bold}#documenter .docs-sidebar ul.docs-menu>li li{font-size:.95rem;margin-left:1em;border-left:1px solid #dbdbdb}#documenter .docs-sidebar ul.docs-menu input.collapse-toggle{display:none}#documenter .docs-sidebar ul.docs-menu ul.collapsed{display:none}#documenter .docs-sidebar ul.docs-menu input:checked~ul.collapsed{display:block}#documenter .docs-sidebar ul.docs-menu label.tocitem{display:flex}#documenter .docs-sidebar ul.docs-menu label.tocitem .docs-label{flex-grow:2}#documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron{display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1;font-size:.75rem;margin-left:1rem;margin-top:auto;margin-bottom:auto}#documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron::before{font-family:"Font Awesome 5 Free";font-weight:900;content:"\f054"}#documenter .docs-sidebar ul.docs-menu input:checked~label.tocitem .docs-chevron::before{content:"\f078"}#documenter .docs-sidebar ul.docs-menu .tocitem{display:block;padding:0.5rem 0.5rem}#documenter .docs-sidebar ul.docs-menu .tocitem,#documenter .docs-sidebar ul.docs-menu .tocitem:hover{color:#0a0a0a;background:#f5f5f5}#documenter .docs-sidebar ul.docs-menu a.tocitem:hover,#documenter .docs-sidebar ul.docs-menu label.tocitem:hover{color:#0a0a0a;background-color:#ebebeb}#documenter .docs-sidebar ul.docs-menu li.is-active{border-top:1px solid #dbdbdb;border-bottom:1px solid #dbdbdb;background-color:#fff}#documenter .docs-sidebar ul.docs-menu li.is-active .tocitem,#documenter .docs-sidebar ul.docs-menu li.is-active .tocitem:hover{background-color:#fff;color:#0a0a0a}#documenter .docs-sidebar ul.docs-menu li.is-active ul.internal .tocitem:hover{background-color:#ebebeb;color:#0a0a0a}#documenter .docs-sidebar ul.docs-menu>li.is-active:first-child{border-top:none}#documenter .docs-sidebar ul.docs-menu ul.internal{margin:0 0.5rem 0.5rem;border-top:1px solid #dbdbdb}#documenter .docs-sidebar ul.docs-menu ul.internal li{font-size:.85rem;border-left:none;margin-left:0;margin-top:0.5rem}#documenter .docs-sidebar ul.docs-menu ul.internal .tocitem{width:100%;padding:0}#documenter .docs-sidebar ul.docs-menu ul.internal .tocitem::before{content:"⚬";margin-right:0.4em}#documenter .docs-sidebar form.docs-search{margin:auto;margin-top:0.5rem;margin-bottom:0.5rem}#documenter .docs-sidebar form.docs-search>input{width:14.4rem}@media screen and (min-width: 1056px){#documenter .docs-sidebar ul.docs-menu{overflow-y:auto;-webkit-overflow-scroll:touch}#documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar{width:.3rem;background:none}#documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#e0e0e0}#documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb:hover{background:#ccc}}@media screen and (max-width: 1055px){#documenter .docs-sidebar{overflow-y:auto;-webkit-overflow-scroll:touch}#documenter .docs-sidebar::-webkit-scrollbar{width:.3rem;background:none}#documenter .docs-sidebar::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#e0e0e0}#documenter .docs-sidebar::-webkit-scrollbar-thumb:hover{background:#ccc}}#documenter .docs-main #documenter-search-info{margin-bottom:1rem}#documenter .docs-main #documenter-search-results{list-style-type:circle;list-style-position:outside}#documenter .docs-main #documenter-search-results li{margin-left:2rem}#documenter .docs-main #documenter-search-results .docs-highlight{background-color:yellow}.ansi span.sgr1{font-weight:bolder}.ansi span.sgr2{font-weight:lighter}.ansi span.sgr3{font-style:italic}.ansi span.sgr4{text-decoration:underline}.ansi span.sgr7{color:#fff;background-color:#222}.ansi span.sgr8{color:transparent}.ansi span.sgr8 span{color:transparent}.ansi span.sgr9{text-decoration:line-through}.ansi span.sgr30{color:#242424}.ansi span.sgr31{color:#a7201f}.ansi span.sgr32{color:#066f00}.ansi span.sgr33{color:#856b00}.ansi span.sgr34{color:#2149b0}.ansi span.sgr35{color:#7d4498}.ansi span.sgr36{color:#007989}.ansi span.sgr37{color:gray}.ansi span.sgr40{background-color:#242424}.ansi span.sgr41{background-color:#a7201f}.ansi span.sgr42{background-color:#066f00}.ansi span.sgr43{background-color:#856b00}.ansi span.sgr44{background-color:#2149b0}.ansi span.sgr45{background-color:#7d4498}.ansi span.sgr46{background-color:#007989}.ansi span.sgr47{background-color:gray}.ansi span.sgr90{color:#616161}.ansi span.sgr91{color:#cb3c33}.ansi span.sgr92{color:#0e8300}.ansi span.sgr93{color:#a98800}.ansi span.sgr94{color:#3c5dcd}.ansi span.sgr95{color:#9256af}.ansi span.sgr96{color:#008fa3}.ansi span.sgr97{color:#f5f5f5}.ansi span.sgr100{background-color:#616161}.ansi span.sgr101{background-color:#cb3c33}.ansi span.sgr102{background-color:#0e8300}.ansi span.sgr103{background-color:#a98800}.ansi span.sgr104{background-color:#3c5dcd}.ansi span.sgr105{background-color:#9256af}.ansi span.sgr106{background-color:#008fa3}.ansi span.sgr107{background-color:#f5f5f5}code.language-julia-repl>span.hljs-meta{color:#066f00;font-weight:bolder}/*! Theme: Default Description: Original highlight.js style Author: (c) Ivan Sagalaev @@ -7644,95 +6,4 @@ code.language-julia-repl > span.hljs-meta { Website: https://highlightjs.org/ License: see project LICENSE Touched: 2021 -*/ -/* -This is left on purpose making default.css the single file that can be lifted -as-is from the repository directly without the need for a build step - -Typically this "required" baseline CSS is added by `makestuff.js` during build. -*/ -pre code.hljs { - display: block; - overflow-x: auto; } - -code.hljs { - padding: 3px 5px; } - -/* end baseline CSS */ -.hljs { - background: #F0F0F0; - color: #444; } - -/* Base color: saturation 0; */ -.hljs-subst { - /* default */ } - -/* purposely ignored */ -.hljs-comment { - color: #888888; } - -.hljs-tag, -.hljs-punctuation { - color: #444a; } - -.hljs-tag .hljs-name, -.hljs-tag .hljs-attr { - color: #444; } - -.hljs-keyword, -.hljs-attribute, -.hljs-selector-tag, -.hljs-meta .hljs-keyword, -.hljs-doctag, -.hljs-name { - font-weight: bold; } - -/* User color: hue: 0 */ -.hljs-type, -.hljs-string, -.hljs-number, -.hljs-selector-id, -.hljs-selector-class, -.hljs-quote, -.hljs-template-tag, -.hljs-deletion { - color: #880000; } - -.hljs-title, -.hljs-section { - color: #880000; - font-weight: bold; } - -.hljs-regexp, -.hljs-symbol, -.hljs-variable, -.hljs-template-variable, -.hljs-link, -.hljs-selector-attr, -.hljs-operator, -.hljs-selector-pseudo { - color: #BC6060; } - -/* Language color: hue: 90; */ -.hljs-literal { - color: #78A960; } - -.hljs-built_in, -.hljs-bullet, -.hljs-code, -.hljs-addition { - color: #397300; } - -/* Meta color: hue: 200 */ -.hljs-meta { - color: #1f7199; } - -.hljs-meta .hljs-string { - color: #4d99bf; } - -/* Misc effects */ -.hljs-emphasis { - font-style: italic; } - -.hljs-strong { - font-weight: bold; } +*/pre code.hljs{display:block;overflow-x:auto}code.hljs{padding:3px 5px}.hljs{background:#F0F0F0;color:#444}.hljs-comment{color:#888888}.hljs-tag,.hljs-punctuation{color:#444a}.hljs-tag .hljs-name,.hljs-tag .hljs-attr{color:#444}.hljs-keyword,.hljs-attribute,.hljs-selector-tag,.hljs-meta .hljs-keyword,.hljs-doctag,.hljs-name{font-weight:bold}.hljs-type,.hljs-string,.hljs-number,.hljs-selector-id,.hljs-selector-class,.hljs-quote,.hljs-template-tag,.hljs-deletion{color:#880000}.hljs-title,.hljs-section{color:#880000;font-weight:bold}.hljs-regexp,.hljs-symbol,.hljs-variable,.hljs-template-variable,.hljs-link,.hljs-selector-attr,.hljs-operator,.hljs-selector-pseudo{color:#BC6060}.hljs-literal{color:#78A960}.hljs-built_in,.hljs-bullet,.hljs-code,.hljs-addition{color:#397300}.hljs-meta{color:#1f7199}.hljs-meta .hljs-string{color:#4d99bf}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:bold} diff --git a/dev/atoms/index.html b/dev/atoms/index.html index 1e5eb2be1..72e58b11a 100644 --- a/dev/atoms/index.html +++ b/dev/atoms/index.html @@ -1,5 +1,5 @@ -Atoms · NQCDynamics.jl

Handling Atoms

This package makes the choice to separate the atomic parameters from their positions and velocities for ease of use with the differential equations solvers. This contrasts somewhat with most other software packages where these would be usually by joined together into a single object.

The atomic parameters here are contained within the Atoms type introduced earlier in the Getting started section. As mentioned previously, there exist some basic constructors which use either elemental symbols or numbers to initialise the parameters:

julia> using NQCDynamics
julia> Atoms([:H, :H, :H])Atoms{Float64}([:H, :H, :H], [1, 1, 1], [1837.4715941070515, 1837.4715941070515, 1837.4715941070515])
julia> Atoms([1, 2, 3])Atoms{Float64}([:X, :X, :X], [0, 0, 0], [1.0, 2.0, 3.0])

If there are many atoms, you can use Julia's array manipulation utilities to create large vectors with many atoms types. For example, if adding an adsorbate to a metal surface, it could be initialised as:

julia> au = fill(:Au, 40)40-element Vector{Symbol}:
+Atoms · NQCDynamics.jl

Handling Atoms

This package makes the choice to separate the atomic parameters from their positions and velocities for ease of use with the differential equations solvers. This contrasts somewhat with most other software packages where these would be usually by joined together into a single object.

The atomic parameters here are contained within the Atoms type introduced earlier in the Getting started section. As mentioned previously, there exist some basic constructors which use either elemental symbols or numbers to initialise the parameters:

julia> using NQCDynamics
julia> Atoms([:H, :H, :H])Atoms{Float64}([:H, :H, :H], [1, 1, 1], [1837.4715941070515, 1837.4715941070515, 1837.4715941070515])
julia> Atoms([1, 2, 3])Atoms{Float64}([:X, :X, :X], [0, 0, 0], [1.0, 2.0, 3.0])

If there are many atoms, you can use Julia's array manipulation utilities to create large vectors with many atoms types. For example, if adding an adsorbate to a metal surface, it could be initialised as:

julia> au = fill(:Au, 40)40-element Vector{Symbol}:
  :Au
  :Au
  :Au
@@ -51,4 +51,4 @@
 
 slab.write("slab.xyz")
/home/runner/.local/lib/python3.10/site-packages/ase/io/extxyz.py:302: UserWarning: Skipping unhashable information adsorbate_info
   warnings.warn('Skipping unhashable information '

Now we can read it in with the read_extxyz function.

julia> atoms, positions, cell = read_extxyz("slab.xyz")(Atoms{Float64}([:Al, :Al, :Al, :Al, :Al, :Al, :Al, :Al, :Al, :Al, :Al, :Al, :Au], [13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 79], [49184.335999681345, 49184.335999681345, 49184.335999681345, 49184.335999681345, 49184.335999681345, 49184.335999681345, 49184.335999681345, 49184.335999681345, 49184.335999681345, 49184.335999681345, 49184.335999681345, 49184.335999681345, 359048.09171127214]), [[0.0 5.411764529907055 … 5.411764529907055 2.7058822649535275; 0.0 0.0 … 5.411764529907055 2.7058822649535275; 7.558904498503081 7.558904498503081 … 15.21229530323745 18.42482971510126]], PeriodicCell{Float64}([10.823529074196882 0.0 0.0; 0.0 10.823529074196882 0.0; 0.0 0.0 25.98373421360434], [0.0923913072293568 0.0 0.0; 0.0 0.0923913072293568 0.0; 0.0 0.0 0.038485615338399996], Bool[1, 1, 0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], Bool[0, 0, 0]))
julia> atomsAtoms{Float64}([:Al, :Al, :Al, :Al, :Al, :Al, :Al, :Al, :Al, :Al, :Al, :Al, :Au], [13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 79], [49184.335999681345, 49184.335999681345, 49184.335999681345, 49184.335999681345, 49184.335999681345, 49184.335999681345, 49184.335999681345, 49184.335999681345, 49184.335999681345, 49184.335999681345, 49184.335999681345, 49184.335999681345, 359048.09171127214])
julia> positions1-element Vector{Matrix{Float64}}: - [0.0 5.411764529907055 … 5.411764529907055 2.7058822649535275; 0.0 0.0 … 5.411764529907055 2.7058822649535275; 7.558904498503081 7.558904498503081 … 15.21229530323745 18.42482971510126]
julia> cellPeriodicCell{Float64}([10.823529074196882 0.0 0.0; 0.0 10.823529074196882 0.0; 0.0 0.0 25.98373421360434], [0.0923913072293568 0.0 0.0; 0.0 0.0923913072293568 0.0; 0.0 0.0 0.038485615338399996], Bool[1, 1, 0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], Bool[0, 0, 0])

Similarly, we can write the file with write_extxyz:

julia> write_extxyz("out.xyz", atoms, positions, cell)

Both of these functions also work with trajectories such that the positions will be a vector of configurations, whilst the atoms and cell will remain unchanged.

If not using .xyz files, we can directly use the IO capability of ase to read or the write the files. This can be done by using the conversions between our data types and the ase.Atoms object.

julia> atoms = Atoms([:H, :H, :C])Atoms{Float64}([:H, :H, :C], [1, 1, 6], [1837.4715941070515, 1837.4715941070515, 21894.713607956142])
julia> ase_atoms = NQCBase.convert_to_ase_atoms(atoms, rand(3, 3))PyObject Atoms(symbols='H2C', pbc=False)
julia> NQCBase.convert_from_ase_atoms(ase_atoms)(Atoms{Float64}([:H, :H, :C], [1, 1, 6], [1837.4715941070515, 1837.4715941070515, 21894.713607956142]), [0.15287771230022118 0.8568563011213202 0.8391508646187186; 0.5766935326636426 0.09181489359737581 0.16860492593666618; 0.742521778709645 0.224594582189937 0.6022668140706067], InfiniteCell())

These conversions work both ways such that you can read any file format using ase then convert the ase.Atoms object to our types afterwards. Then at the end when you are finished, you can convert them back and write your output with ase.

+ [0.0 5.411764529907055 … 5.411764529907055 2.7058822649535275; 0.0 0.0 … 5.411764529907055 2.7058822649535275; 7.558904498503081 7.558904498503081 … 15.21229530323745 18.42482971510126]

julia> cellPeriodicCell{Float64}([10.823529074196882 0.0 0.0; 0.0 10.823529074196882 0.0; 0.0 0.0 25.98373421360434], [0.0923913072293568 0.0 0.0; 0.0 0.0923913072293568 0.0; 0.0 0.0 0.038485615338399996], Bool[1, 1, 0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], Bool[0, 0, 0])

Similarly, we can write the file with write_extxyz:

julia> write_extxyz("out.xyz", atoms, positions, cell)

Both of these functions also work with trajectories such that the positions will be a vector of configurations, whilst the atoms and cell will remain unchanged.

If not using .xyz files, we can directly use the IO capability of ase to read or the write the files. This can be done by using the conversions between our data types and the ase.Atoms object.

julia> atoms = Atoms([:H, :H, :C])Atoms{Float64}([:H, :H, :C], [1, 1, 6], [1837.4715941070515, 1837.4715941070515, 21894.713607956142])
julia> ase_atoms = NQCBase.convert_to_ase_atoms(atoms, rand(3, 3))PyObject Atoms(symbols='H2C', pbc=False)
julia> NQCBase.convert_from_ase_atoms(ase_atoms)(Atoms{Float64}([:H, :H, :C], [1, 1, 6], [1837.4715941070515, 1837.4715941070515, 21894.713607956142]), [0.777613774261222 0.543198667469773 0.570030005609958; 0.7217699502926326 0.9922869411786044 0.10369959604487955; 0.9084742778194823 0.6805634962880117 0.07452574648824539], InfiniteCell())

These conversions work both ways such that you can read any file format using ase then convert the ase.Atoms object to our types afterwards. Then at the end when you are finished, you can convert them back and write your output with ase.

diff --git a/dev/devdocs/diffeq/index.html b/dev/devdocs/diffeq/index.html index 8bafda754..52f5a997e 100644 --- a/dev/devdocs/diffeq/index.html +++ b/dev/devdocs/diffeq/index.html @@ -1,5 +1,5 @@ -DifferentialEquations.jl integration · NQCDynamics.jl

DifferentialEquations.jl integration

NQCDynamics.jl is built directly on top of the established DifferentialEquations.jl that provides a vast array of features. By using DifferentialEquations.jl to perform the dynamics, we can immediately exploit many of these features to save us a lot of work. This page details some of the features from DifferentialEquations.jl that we have used.

Callbacks

Callbacks allow us to introduce extra code during the dynamics without needing to meddle with the integration code directly. On the developer side, [Callbacks] is the mechanism used for the saving in the run_dynamics function and the surface hopping procedure during FSSH. The user can also write their own callbacks and give these to any of the dynamics functions to manipulate the progress of the dynamics or introduce their own saving mechanism.

We also provide two pre-made callbacks which can be given to the dynamics functions. These are the TerminatingCallback, for terminating the simulation early, and the CellBoundaryCallback that can be used to ensure the atoms obey the periodicity of the simulation cell.

Here, we can show how these callbacks can be used in tandem to alter the course of the simulation. Let's look at a classical dynamics simulation without any extra callbacks:

using NQCDynamics
+DifferentialEquations.jl integration · NQCDynamics.jl

DifferentialEquations.jl integration

NQCDynamics.jl is built directly on top of the established DifferentialEquations.jl that provides a vast array of features. By using DifferentialEquations.jl to perform the dynamics, we can immediately exploit many of these features to save us a lot of work. This page details some of the features from DifferentialEquations.jl that we have used.

Callbacks

Callbacks allow us to introduce extra code during the dynamics without needing to meddle with the integration code directly. On the developer side, [Callbacks] is the mechanism used for the saving in the run_dynamics function and the surface hopping procedure during FSSH. The user can also write their own callbacks and give these to any of the dynamics functions to manipulate the progress of the dynamics or introduce their own saving mechanism.

We also provide two pre-made callbacks which can be given to the dynamics functions. These are the TerminatingCallback, for terminating the simulation early, and the CellBoundaryCallback that can be used to ensure the atoms obey the periodicity of the simulation cell.

Here, we can show how these callbacks can be used in tandem to alter the course of the simulation. Let's look at a classical dynamics simulation without any extra callbacks:

using NQCDynamics
 using Plots
 
 atoms = Atoms(:C)
@@ -13,45 +13,45 @@
 plot(solution, :OutputPosition, label="No callbacks", legend=true)
- + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + +

Now we can introduce callbacks and observe the difference:

solution = run_dynamics(sim, (0.0, 300), z; callback=DynamicsUtils.CellBoundaryCallback(), dt=1.0, output=OutputPosition)
 plot!(solution, :OutputPosition, label="Cell boundary" )
 
@@ -62,42 +62,42 @@
 plot!(solution, :OutputPosition, label="Cell + termination")
- + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + -

See how the callbacks have altered the dynamics? The atom no longer leaves the simulation cell, and the termination caused the simulation to exit early.

The callback setup we're using is exactly that provided by DifferentialEquations.jl, if you want more details on callbacks, please refer to their documentation.

+

See how the callbacks have altered the dynamics? The atom no longer leaves the simulation cell, and the termination caused the simulation to exit early.

The callback setup we're using is exactly that provided by DifferentialEquations.jl, if you want more details on callbacks, please refer to their documentation.

diff --git a/dev/devdocs/models/index.html b/dev/devdocs/models/index.html index b529530e9..dcb32ea72 100644 --- a/dev/devdocs/models/index.html +++ b/dev/devdocs/models/index.html @@ -1,2 +1,2 @@ -Implementing a new model · NQCDynamics.jl

Implementing a new model

NQCModels.jl aims to provide a unified interface for defining model Hamiltonians for nonadiabatic dynamics simulations.

Here, we walk through the implementation of a few different types of model to explain the interface.

Abstract types

Julia's abstract type system can be likened to the inheritance concept from object-oriented programming or the trait system from Rust. It allows us to defined shared behaviour for a groups of structs and allows us to define a common set of functions that all of the concrete types must implement.

In NQCModels.jl the top level abstract type is the Model, under which all of our models must fall. The second tier below this includes the two abstract types AdiabaticModel and DiabaticModel. These form the two distinct branches within the NQCModels type hierachy and the shared behaviour across the branches is minimal. The AdiabaticModel describes the familiar form from molecular dynamics that provides a single potential energy surface. The DiabaticModel instead provides multiple potential energy surfaces with couplings between them. As implied by the name, these are in the diabatic representation. If the desired model does not fall under either of these branches, a new abstract type should be created.

Minor branches

Under the two main branches there also exists some specialised abstract types that are useful in some cases, such as when using many electronic states, or when implementing extra functions is required. See the docstrings for more info:

Example implementations

To implement a new model, you first select the abstract type, where you should first take a look at the docstring for the abstract type (click on the links above). There, a list of the functions that need to be implemented along with an example implementation are provided.

For further examples, you can also take a look into the source code of the NQCModels.jl package to see how the analytic models have been implemented. If you have any issues or questions about implementing a new model, open up an issue on Github and we can work together to resolve the problem.

+Implementing a new model · NQCDynamics.jl

Implementing a new model

NQCModels.jl aims to provide a unified interface for defining model Hamiltonians for nonadiabatic dynamics simulations.

Here, we walk through the implementation of a few different types of model to explain the interface.

Abstract types

Julia's abstract type system can be likened to the inheritance concept from object-oriented programming or the trait system from Rust. It allows us to defined shared behaviour for a groups of structs and allows us to define a common set of functions that all of the concrete types must implement.

In NQCModels.jl the top level abstract type is the Model, under which all of our models must fall. The second tier below this includes the two abstract types AdiabaticModel and DiabaticModel. These form the two distinct branches within the NQCModels type hierachy and the shared behaviour across the branches is minimal. The AdiabaticModel describes the familiar form from molecular dynamics that provides a single potential energy surface. The DiabaticModel instead provides multiple potential energy surfaces with couplings between them. As implied by the name, these are in the diabatic representation. If the desired model does not fall under either of these branches, a new abstract type should be created.

Minor branches

Under the two main branches there also exists some specialised abstract types that are useful in some cases, such as when using many electronic states, or when implementing extra functions is required. See the docstrings for more info:

Example implementations

To implement a new model, you first select the abstract type, where you should first take a look at the docstring for the abstract type (click on the links above). There, a list of the functions that need to be implemented along with an example implementation are provided.

For further examples, you can also take a look into the source code of the NQCModels.jl package to see how the analytic models have been implemented. If you have any issues or questions about implementing a new model, open up an issue on Github and we can work together to resolve the problem.

diff --git a/dev/devdocs/new_methods/index.html b/dev/devdocs/new_methods/index.html index 3d92e7f51..1d2d4bced 100644 --- a/dev/devdocs/new_methods/index.html +++ b/dev/devdocs/new_methods/index.html @@ -1,5 +1,5 @@ -Contributing a new method · NQCDynamics.jl

Contributing a new method

A key goal of NQCDynamics.jl is to provide an accessible toolkit for implementing new nonadiabatic dynamics methods. This page details the steps you must take in order to create a new dynamics method. The existing methods are stored inside the DynamicsMethods submodule, and this is where new methods should be implemented. Technically, it is possible to implement new methods completely separately from the package by importing and extending the relevant functions but if you would like to include your method in the package, it should be added within this submodule.

Note

Generally, each method has its own file, though similar methods are grouped into submodules and share functionality across files. For example, multiple surface hopping methods have been implemented in the submodule DynamicsMethods.SurfaceHoppingMethods, where some functions are shared across the files.

Basic implementation

To implement a new dynamics method, the necessary steps are:

Create a new subtype of DynamicsMethods.Method.

This Method acts as an extra parameter inside the simulation that allows us to specify any extra information needed for our dynamics method. This can be a good place to include any temporary arrays and parameters for the simulation. Refer to the Julia manual section on Composite Types to learn how this types are created. Here, our type is called MyMethod and we have included an a parameter that will influence our dynamics:

using NQCDynamics
+Contributing a new method · NQCDynamics.jl

Contributing a new method

A key goal of NQCDynamics.jl is to provide an accessible toolkit for implementing new nonadiabatic dynamics methods. This page details the steps you must take in order to create a new dynamics method. The existing methods are stored inside the DynamicsMethods submodule, and this is where new methods should be implemented. Technically, it is possible to implement new methods completely separately from the package by importing and extending the relevant functions but if you would like to include your method in the package, it should be added within this submodule.

Note

Generally, each method has its own file, though similar methods are grouped into submodules and share functionality across files. For example, multiple surface hopping methods have been implemented in the submodule DynamicsMethods.SurfaceHoppingMethods, where some functions are shared across the files.

Basic implementation

To implement a new dynamics method, the necessary steps are:

Create a new subtype of DynamicsMethods.Method.

This Method acts as an extra parameter inside the simulation that allows us to specify any extra information needed for our dynamics method. This can be a good place to include any temporary arrays and parameters for the simulation. Refer to the Julia manual section on Composite Types to learn how this types are created. Here, our type is called MyMethod and we have included an a parameter that will influence our dynamics:

using NQCDynamics
 
 struct MyMethod <: DynamicsMethods.Method
     a::Float64
@@ -22,9 +22,9 @@
 u = DynamicsVariables(sim, rand(1,1), rand(1,1), [0.5])
 
 sol = run_dynamics(sim, (0.0, 5.0), u, output=(OutputPosition, OutputVelocity, OutputDynamicsVariables))
4-element Dictionaries.Dictionary{Symbol, Any}
-                    :Time │ [0.0, 0.0014515052753157562, 0.002157006427036894, …
-          :OutputPosition │ [[0.5307248722911433;;], [0.5309795328879595;;], [0…
-          :OutputVelocity │ [[0.17601717076639511;;], [0.17447619583665636;;], …
+                    :Time │ [0.0, 0.054527566542320195, 0.07970629055847074, 0.…
+          :OutputPosition │ [[0.5959609779159396;;], [0.5999139474659804;;], [0…
+          :OutputVelocity │ [[0.10507922391585878;;], [0.039838760801055355;;],…
  :OutputDynamicsVariables │ ComponentArrays.ComponentVector{Float64, Vector{Flo…
Note

In the definition of our motion! method, we have accessed only the atoms field of the simulation. This means that the model we pass to the Simulation constructor is not used. Generally the model is accessed through the calculator interface and examples of its usage can be found by referring the implementations of the existing methods.

To visualise the result we can plot each of the quantities from the output table:

using Plots
 
 plot(sol, :OutputPosition, label="Position")
@@ -33,55 +33,55 @@
 ylabel!("Value(t)")
- + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Note

The additional x parameter that we created cannot be accessed in the output tuple with a pre-existing function as with position and velocity since it is not a standard quantity. Instead, we request OutputDynamicsVariables which contains all of the dynamical variables. In the plot, two of the lines labelled DynamicsVariables overlap the position and velocity result. The unique line labelled Dynamics variables is the x variable. When implementing your method, if you want to add new output quantities you should do this inside the DynamicsOutputs submodule.

Advanced tips

Is there a custom algorithm you can implement?

Some dynamics methods have special algorithms that are tailored to the specific problem and achieve better performance than the general algorithms include in DifferentialEquations.jl. For example, ring polymer methods typically use a symplectic scheme to solve for the internal modes of the ring polymer, allowing much larger timesteps. The DifferentialEquations.jl framework provides a simple interface for adding new algorithms, check out the developer documentation to learn how it works. You can also find some examples of custom algorithms in the DynamicsMethods.IntegrationAlgorithms module.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Note

The additional x parameter that we created cannot be accessed in the output tuple with a pre-existing function as with position and velocity since it is not a standard quantity. Instead, we request OutputDynamicsVariables which contains all of the dynamical variables. In the plot, two of the lines labelled DynamicsVariables overlap the position and velocity result. The unique line labelled Dynamics variables is the x variable. When implementing your method, if you want to add new output quantities you should do this inside the DynamicsOutputs submodule.

Advanced tips

Is there a custom algorithm you can implement?

Some dynamics methods have special algorithms that are tailored to the specific problem and achieve better performance than the general algorithms include in DifferentialEquations.jl. For example, ring polymer methods typically use a symplectic scheme to solve for the internal modes of the ring polymer, allowing much larger timesteps. The DifferentialEquations.jl framework provides a simple interface for adding new algorithms, check out the developer documentation to learn how it works. You can also find some examples of custom algorithms in the DynamicsMethods.IntegrationAlgorithms module.

diff --git a/dev/dynamicssimulations/dynamicsmethods/classical/index.html b/dev/dynamicssimulations/dynamicsmethods/classical/index.html index 1c4146a58..ebe39b035 100644 --- a/dev/dynamicssimulations/dynamicsmethods/classical/index.html +++ b/dev/dynamicssimulations/dynamicsmethods/classical/index.html @@ -1,5 +1,5 @@ -Classical molecular dynamics · NQCDynamics.jl

Classical molecular dynamics

Classical (molecular) dynamics proceeds by solving the dynamics for a system governed by a classical Hamiltonian containing the kinetic energy of the particles and a potential energy function:

\[H = \frac{P^2}{2M} + V(R)\]

To integrate the equations we use the VelocityVerlet() algorithm from DifferentialEquations.jl, which is one of the most widely used algorithms for molecular dynamics.

Example

We can create two particles with mass = 1 and attach a DiatomicHarmonic interaction which provides a harmonic interatomic potential.

Note

Recall that the constructor for Simulation(...) when called without a type parameter as below defaults to Simulation{Classical}(...).

using NQCDynamics
+Classical molecular dynamics · NQCDynamics.jl

Classical molecular dynamics

Classical (molecular) dynamics proceeds by solving the dynamics for a system governed by a classical Hamiltonian containing the kinetic energy of the particles and a potential energy function:

\[H = \frac{P^2}{2M} + V(R)\]

To integrate the equations we use the VelocityVerlet() algorithm from DifferentialEquations.jl, which is one of the most widely used algorithms for molecular dynamics.

Example

We can create two particles with mass = 1 and attach a DiatomicHarmonic interaction which provides a harmonic interatomic potential.

Note

Recall that the constructor for Simulation(...) when called without a type parameter as below defaults to Simulation{Classical}(...).

using NQCDynamics
 using Plots
 
 sim = Simulation(Atoms([1, 1]), DiatomicHarmonic())
@@ -11,47 +11,51 @@
 plot(traj, :OutputPosition)
- + - + - + - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -
+
diff --git a/dev/dynamicssimulations/dynamicsmethods/ehrenfest/index.html b/dev/dynamicssimulations/dynamicsmethods/ehrenfest/index.html index bc131a6ef..4ff1df9b3 100644 --- a/dev/dynamicssimulations/dynamicsmethods/ehrenfest/index.html +++ b/dev/dynamicssimulations/dynamicsmethods/ehrenfest/index.html @@ -1,6 +1,6 @@ -Ehrenfest molecular dynamics · NQCDynamics.jl

Ehrenfest molecular dynamics

The Ehrenfest method is a mixed quantum-classical dynamics method in which the total wavefunction is factorized into slow (nuclear) variables, which are treated classically, and fast ones (electrons) which remain quantum-mechanical. In the Ehrenfest method, nuclei move according to classical mechanics on a potential energy surface given by the expectation value of the electronic Hamiltonian.

The time dependence of the electronic wavefunction is expanded into an adiabatic basis and follows the time-dependent Schr\"odinger equation.

\[i\hbar \dot{c}_i(t) = V_i(\mathbf{R}) c_i (t) -- i\hbar \sum_j \dot{\mathbf{R}} \cdot \mathbf{d}_{ij}(\mathbf{R})c_j(t)\]

Example

Below the example of the Ehrenfest implementation is presented, using model from Nandini Ananth, Charulatha Venkataraman, William H. Miller (2007).

At the start, we assign atoms and initialise the simulation using the mass and model from NQCModels.jl.

using NQCDynamics
+Ehrenfest molecular dynamics · NQCDynamics.jl

Ehrenfest molecular dynamics

The Ehrenfest method is a mixed quantum-classical dynamics method in which the total wavefunction is factorized into slow (nuclear) variables, which are treated classically, and fast ones (electrons) which remain quantum-mechanical. In the Ehrenfest method, nuclei move according to classical mechanics on a potential energy surface given by the expectation value of the electronic Hamiltonian.

The time dependence of the electronic wavefunction is expanded into an adiabatic basis and follows the time-dependent Schr\"odinger equation.

\[i\hbar \dot{c}_i(t) = V_i(\mathbf{R}) c_i (t) +- i\hbar \sum_j \dot{\mathbf{R}} \cdot \mathbf{d}_{ij}(\mathbf{R})c_j(t)\]

Example

Below the example of the Ehrenfest implementation is presented, using model from [5].

At the start, we assign atoms and initialise the simulation using the mass and model from NQCModels.jl.

using NQCDynamics
 
 atoms = Atoms(1980)
 sim = Simulation{Ehrenfest}(atoms, AnanthModelOne())
Simulation{Ehrenfest{Float64}}:
@@ -15,69 +15,65 @@
 k = sqrt(e*2*atoms.masses[1])
 r = Normal(-5, 1/sqrt(0.25))
 v = k / atoms.masses[1]
-distribution = DynamicalDistribution(v, r, size(sim))* PureState(1, Adiabatic())
NQCDistributions.ProductDistribution{NQCDistributions.FixedFill{Float64}, NQCDistributions.UnivariateFill{Distributions.Normal{Float64}}, PureState{Adiabatic}}(DynamicalDistribution{NQCDistributions.FixedFill{Float64}, NQCDistributions.UnivariateFill{Distributions.Normal{Float64}}}(NQCDistributions.FixedFill{Float64}(0.005504818825631803, (1, 1)), NQCDistributions.UnivariateFill{Distributions.Normal{Float64}}(Distributions.Normal{Float64}(μ=-5.0, σ=2.0), (1, 1)), Random.Xoshiro(0xbe9e30256c78bb24, 0xc7147b5d8417bb16, 0x87ebb2c7e68b0ac2, 0x694c61fc9469cc69)), PureState{Adiabatic}(1, Adiabatic()))

To run an ensemble simulation we additionally choose number of trajectories n_traj and timespan tspan and we pass all the established settings to the run_dynamics function. In this example we output velocities by specifying output=OutputVelocity and store the final values in the final_velocities array. Following that, we calculate final momenta.

n_traj = 10
+distribution = DynamicalDistribution(v, r, size(sim))* PureState(1, Adiabatic())
NQCDistributions.ProductDistribution{NQCDistributions.FixedFill{Float64}, NQCDistributions.UnivariateFill{Distributions.Normal{Float64}}, PureState{Adiabatic}}(DynamicalDistribution{NQCDistributions.FixedFill{Float64}, NQCDistributions.UnivariateFill{Distributions.Normal{Float64}}}(NQCDistributions.FixedFill{Float64}(0.005504818825631803, (1, 1)), NQCDistributions.UnivariateFill{Distributions.Normal{Float64}}(Distributions.Normal{Float64}(μ=-5.0, σ=2.0), (1, 1)), Random.Xoshiro(0xbe1224fc7d99fa1b, 0x7cc178668cc444c3, 0xe0b8de0552247ec6, 0xffb3c198af248e01)), PureState{Adiabatic}(1, Adiabatic()))

To run an ensemble simulation we additionally choose number of trajectories n_traj and timespan tspan and we pass all the established settings to the run_dynamics function. In this example we output velocities by specifying output=OutputVelocity and store the final values in the final_velocities array. Following that, we calculate final momenta.

n_traj = 10
 tspan = (0.0, 3000.0)
 solution = run_dynamics(sim, tspan, distribution;
     trajectories=n_traj, output=OutputVelocity, dt=1.0)
 final_velocities = [r[:OutputVelocity][end] for r in solution]
 momenta = reduce(vcat, final_velocities*atoms.masses[1])
10×1 Matrix{Float64}:
- 9.780254825676527
- 9.780254794659042
- 9.780384784945564
- 9.780255528856438
- 9.780255330673974
- 9.780259784806567
- 9.780254994831552
- 9.780504116899442
- 9.781081267815168
- 9.780339875239825

Resulting momenta can be plotted by using StatsPlots package.

using StatsPlots
+ 9.78025673123323
+ 9.780255204380799
+ 9.78025481827403
+ 9.780254812079654
+ 9.780256349369202
+ 9.780254816870517
+ 9.780254801732449
+ 9.780254794711274
+ 9.78025494635274
+ 9.78025479563416

Resulting momenta can be plotted by using StatsPlots package.

using StatsPlots
 plot(density(momenta))
 xlims!(-20,20)
- + - + - + - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/dev/dynamicssimulations/dynamicsmethods/fssh/index.html b/dev/dynamicssimulations/dynamicsmethods/fssh/index.html index 3c1810acc..2700928e2 100644 --- a/dev/dynamicssimulations/dynamicsmethods/fssh/index.html +++ b/dev/dynamicssimulations/dynamicsmethods/fssh/index.html @@ -1,7 +1,7 @@ -Fewest-switches surface hopping (FSSH) · NQCDynamics.jl

Fewest-switches surface hopping (FSSH)

Tully's FSSH John C. Tully (1990) is one of the most popular methods for nonadiabatic molecular dynamics and is classified as a mixed-quantum classical method, where the nuclei are treated classically and the electrons are treated quantum mechanically.

The central concept that governs surface hopping methods is that the nuclei evolve on a single adiabatic potential energy surface at any given moment. At each timestep, a hopping probability is evaluated. If the hopping probability is larger than a uniform random number between 0 and 1, the active state is switched and the adiabatic propagation continues on the new electronic state. When this algorithm is applied to an ensemble of trajectories, the discrete adiabatic state populations approximate the quantum mechanical populations for each state.

The surface hopping classical Hamiltonian can be written as

\[H(t) = \frac{1}{2} \mathbf{P}^T \mathbf{M}^{-1} \mathbf{P} + \sum_i \delta(s(t) - i) E_i(\mathbf{R})\]

where $\mathbf{P}$ is the vector of momenta, $\mathbf{R}$ the positions, and $\mathbf{M}$ the diagonal mass matrix. $s(t)$ can be viewed as a digital signal that takes on the value of the currently occupied adiabatic state. As such, this Hamiltonian describes classical dynamics that proceeds under the influence of the potential $E_i(\mathbf{R})$ when $s(t) = i$. The summation runs over all adiabatic states.

Of course, to integrate the associated equations of motion, $s(t)$ must be obtained. This quantity is obtained stochastically for each trajectory by making probabilistic hops between surfaces. The probabilities are obtained by integrating the electronic Schrödinger equation alongside the dynamics as

\[i\hbar \dot{c}_i(t) = E_i(\mathbf{R}) c_i (t) +Fewest-switches surface hopping (FSSH) · NQCDynamics.jl

Fewest-switches surface hopping (FSSH)

Tully's FSSH [1] is one of the most popular methods for nonadiabatic molecular dynamics and is classified as a mixed-quantum classical method, where the nuclei are treated classically and the electrons are treated quantum mechanically.

The central concept that governs surface hopping methods is that the nuclei evolve on a single adiabatic potential energy surface at any given moment. At each timestep, a hopping probability is evaluated. If the hopping probability is larger than a uniform random number between 0 and 1, the active state is switched and the adiabatic propagation continues on the new electronic state. When this algorithm is applied to an ensemble of trajectories, the discrete adiabatic state populations approximate the quantum mechanical populations for each state.

The surface hopping classical Hamiltonian can be written as

\[H(t) = \frac{1}{2} \mathbf{P}^T \mathbf{M}^{-1} \mathbf{P} + \sum_i \delta(s(t) - i) E_i(\mathbf{R})\]

where $\mathbf{P}$ is the vector of momenta, $\mathbf{R}$ the positions, and $\mathbf{M}$ the diagonal mass matrix. $s(t)$ can be viewed as a digital signal that takes on the value of the currently occupied adiabatic state. As such, this Hamiltonian describes classical dynamics that proceeds under the influence of the potential $E_i(\mathbf{R})$ when $s(t) = i$. The summation runs over all adiabatic states.

Of course, to integrate the associated equations of motion, $s(t)$ must be obtained. This quantity is obtained stochastically for each trajectory by making probabilistic hops between surfaces. The probabilities are obtained by integrating the electronic Schrödinger equation alongside the dynamics as

\[i\hbar \dot{c}_i(t) = E_i(\mathbf{R}) c_i (t) - i\hbar \sum_j \dot{\mathbf{R}} \cdot \mathbf{d}_{ij}(\mathbf{R})c_j(t)\]

In this equation, $c_i(t)$ are the complex coefficients for state $i$ and $\mathbf{d}_{ij}$ is the nonadiabatic coupling between adiabatic states $i$ and $j$. The hopping probability is calculated as

\[\gamma_{i \to j} = \sum_{\alpha} 2 \frac{P_\alpha}{M_\alpha} -\Re(\frac{\sigma_{ji}}{\sigma_{ii}}) d_{\alpha ij} dt.\]

At each timestep, a random number between 0 and 1 is generated which is compared to the probabilities. If the probability is higher than the random number, then a hop is attempted.

Additionally in the fewest-switches scheme, the energy is conserved for each trajectory by rescaling the momenta whenever a hop is performed. As such, when a hop is attempted, it will only be successful when there is sufficient kinetic energy for the energy to be conserved after the hop. If there is insufficient kinetic energy, this is termed a frustrated hop, and the dynamics proceeds without performing a hop. When a hop is successful, the kinetic energy is adjusted and $s(t)$ takes on the value of the newly occupied state. For a more detailed description of the algorithm and the momentum rescaling procedure, please refer to Joseph E. Subotnik, Amber Jain, Brian Landry, Andrew Petit, Wenjun Ouyang, Nicole Bellonzi (2016). In this reference, the notion of reversing the momenta during frustrated hops is discussed. In our implementation we leave the frustrated trajectories unchanged, though it is suggested that the momentum reversal procedure may lead to better results in some cases.

Algorithm

  1. Integrate classical dynamics for one timestep
  2. Integrate electronic dynamics for one timestep
  3. Evaluate hopping probability
  4. Perform hop if sufficient probability and kinetic energy
  5. Rescale velocity if hop is performed
  6. Return to step 1
Note

With DifferentialEquations.jl we use a callback to perform the surface hopping procedure such that steps 1 and 2 are performed by the DifferentialEquations solvers and steps 3, 4, 5 are performed by the callback.

Example

In this section we can investigate the results obtained for a single trajectory using FSSH.

First, the simulation parameters are created. Here, we have a single atom with a mass of 2000 a.u. and we are using Tully's third model (John C. Tully (1990)), provided by NQCModels.jl.

using NQCDynamics
+\Re(\frac{\sigma_{ji}}{\sigma_{ii}}) d_{\alpha ij} dt.\]

At each timestep, a random number between 0 and 1 is generated which is compared to the probabilities. If the probability is higher than the random number, then a hop is attempted.

Additionally in the fewest-switches scheme, the energy is conserved for each trajectory by rescaling the momenta whenever a hop is performed. As such, when a hop is attempted, it will only be successful when there is sufficient kinetic energy for the energy to be conserved after the hop. If there is insufficient kinetic energy, this is termed a frustrated hop, and the dynamics proceeds without performing a hop. When a hop is successful, the kinetic energy is adjusted and $s(t)$ takes on the value of the newly occupied state. For a more detailed description of the algorithm and the momentum rescaling procedure, please refer to [6]. In this reference, the notion of reversing the momenta during frustrated hops is discussed. In our implementation we leave the frustrated trajectories unchanged, though it is suggested that the momentum reversal procedure may lead to better results in some cases.

Algorithm

  1. Integrate classical dynamics for one timestep
  2. Integrate electronic dynamics for one timestep
  3. Evaluate hopping probability
  4. Perform hop if sufficient probability and kinetic energy
  5. Rescale velocity if hop is performed
  6. Return to step 1
Note

With DifferentialEquations.jl we use a callback to perform the surface hopping procedure such that steps 1 and 2 are performed by the DifferentialEquations solvers and steps 3, 4, 5 are performed by the callback.

Example

In this section we can investigate the results obtained for a single trajectory using FSSH.

First, the simulation parameters are created. Here, we have a single atom with a mass of 2000 a.u. and we are using Tully's third model ([1]), provided by NQCModels.jl.

using NQCDynamics
 
 atoms = Atoms(2000)
 sim = Simulation{FSSH}(atoms, TullyModelThree())
Simulation{FSSH{Float64}}:
@@ -27,92 +27,92 @@
 plot(traj, :OutputDiscreteState)
- + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + +

Similarly, we can plot the diabatic populations. Since FSSH is performed in the adiabatic representation, even in the case of few hops, the diabatic populations can look dramatically different depending on the complexity of the model Hamiltonian.

plot(traj, :OutputDiabaticPopulation)
- + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + -

Another example is available where we use FSSH and other methods to reproduce some of the results from John C. Tully (1990).

+

Another example is available where we use FSSH and other methods to reproduce some of the results from [1].

diff --git a/dev/dynamicssimulations/dynamicsmethods/langevin/index.html b/dev/dynamicssimulations/dynamicsmethods/langevin/index.html index e65b96c67..c3474d23d 100644 --- a/dev/dynamicssimulations/dynamicsmethods/langevin/index.html +++ b/dev/dynamicssimulations/dynamicsmethods/langevin/index.html @@ -1,9 +1,9 @@ -Classical Langevin dynamics · NQCDynamics.jl

Classical Langevin dynamics

Langevin dynamics can be used to sample the canonical ensemble for a classical system. Langevin dynamics are based on classical equations of motion that are modified by an additional drag force and a random force. The Langevin equation of motion can be written as

\[\mathbf{M}\ddot{\mathbf{R}} = - \nabla_R V(\mathbf{R}) + \mathbf{F}(t) - \gamma \dot{\mathbf{R}}\]

where $\mathbf{M}$ are the masses, $\ddot{\mathbf{R}}$ the time-derivative of the positions, i.e., the velocities, $\nabla_R V(\mathbf{R})$ the gradient of the potential and $\mathbf{F}(t)$ the random force that is related to the friction coefficient $\gamma$ by the second fluctuation-dissipation theorem.

Equally the above equation can be written in the form of Ito stochastic differential equations Benedict Leimkuhler, Charles Matthews (2012)

\[\begin{aligned} +Classical Langevin dynamics · NQCDynamics.jl

Classical Langevin dynamics

Langevin dynamics can be used to sample the canonical ensemble for a classical system. Langevin dynamics are based on classical equations of motion that are modified by an additional drag force and a random force. The Langevin equation of motion can be written as

\[\mathbf{M}\ddot{\mathbf{R}} = - \nabla_R V(\mathbf{R}) + \mathbf{F}(t) - \gamma \dot{\mathbf{R}}\]

where $\mathbf{M}$ are the masses, $\ddot{\mathbf{R}}$ the time-derivative of the positions, i.e., the velocities, $\nabla_R V(\mathbf{R})$ the gradient of the potential and $\mathbf{F}(t)$ the random force that is related to the friction coefficient $\gamma$ by the second fluctuation-dissipation theorem.

Equally the above equation can be written in the form of Ito stochastic differential equations [7]

\[\begin{aligned} d\mathbf{R} &= \mathbf{M}^{-1} \mathbf{P} dt\\ d\mathbf{P} &= [-\nabla V(\mathbf{R}) - \gamma \mathbf{P}] dt + \sigma \mathbf{M}^{1/2} d\mathbf{W} -\end{aligned}\]

where $\sigma = \sqrt{2\gamma/\beta}$ and $\mathbf{W}$ is a vector of $N$ independent Wiener processes. As usual, $\mathbf{P}$ is the vector of particle momenta and $\mathbf{M}$ their diagonal mass matrix.

Stochastic differential equations

There are two mathematical frameworks for handling stochastic differential equations, developed by Ruslan Stratonovich and Kiyosi Ito. To learn about the difference between the two in a physical context refer to H. Risken, H. Haken (1989).

As a stochastic differential equation, these two can be integrated immediately using StochasticDiffEq provided by DifferentialEquations, which offers a variety of stochastic solvers. It is possible to exploit the dynamical structure of the differential equations by splitting the integration steps into parts that can be solved exactly. In this context, it has been shown that the BAOAB method from Benedict Leimkuhler, Charles Matthews (2012) achieves good accuracy compared to other similar algorithms and this algorithm is used here as the default.

Example

Using Langevin dynamics we can sample the canonical ensemble for a simple harmonic oscillator and investigate the energy expectation values.

Firstly we set up our system parameters. Here, we have two atoms in a harmonic potential at a temperature of 1e-3. We have arbitrarily chosen the dissipation constant $\gamma = 1$, this can be tuned for optimal sampling in more complex systems.

using NQCDynamics
+\end{aligned}\]

where $\sigma = \sqrt{2\gamma/\beta}$ and $\mathbf{W}$ is a vector of $N$ independent Wiener processes. As usual, $\mathbf{P}$ is the vector of particle momenta and $\mathbf{M}$ their diagonal mass matrix.

Stochastic differential equations

There are two mathematical frameworks for handling stochastic differential equations, developed by Ruslan Stratonovich and Kiyosi Ito. To learn about the difference between the two in a physical context refer to [8].

As a stochastic differential equation, these two can be integrated immediately using StochasticDiffEq provided by DifferentialEquations, which offers a variety of stochastic solvers. It is possible to exploit the dynamical structure of the differential equations by splitting the integration steps into parts that can be solved exactly. In this context, it has been shown that the BAOAB method from [7] achieves good accuracy compared to other similar algorithms and this algorithm is used here as the default.

Example

Using Langevin dynamics we can sample the canonical ensemble for a simple harmonic oscillator and investigate the energy expectation values.

Firstly we set up our system parameters. Here, we have two atoms in a harmonic potential at a temperature of 1e-3. We have arbitrarily chosen the dissipation constant $\gamma = 1$, this can be tuned for optimal sampling in more complex systems.

using NQCDynamics
 using Unitful
 
 atoms = Atoms([:H, :C])
@@ -22,98 +22,98 @@
 plot(traj, :OutputPosition, label=["Hydrogen" "Carbon"], legend=true)
- + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

We next plot the velocities. Notice how the carbon atom with its heavier mass has a smaller magnitude throughout.

plot(traj, :OutputVelocity, label=["Hydrogen" "Carbon"], legend=true)
- + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Using the configurations from the Langevin simulation we can obtain expectation values along the trajectories. This can be done manually, but we provide the Estimators module to make this as simple as possible.

!!! note Estimators

[Here](@ref `Estimators`) you can find the available quantities that [`Estimators`](@ref) provides.
-To add new quantities, you must implement a new function inside `src/Estimators.jl`.

Let's find the expectation for the potential energy during our simulation. This is the potential energy of the final configuration in the simulation:

julia> Estimators.potential_energy(sim, traj[:OutputPosition][end])1.0584545629185372e-6

We could evaluate this for every configuration and average it manually. Fortunately however, we have the @estimate macro that will do this for us:

julia> Estimators.@estimate potential_energy(sim, traj[:OutputPosition])0.0008714360199255441
Tip

We can verify this result by comparing to the equipartition theorem which states that each quadratic degree of freedom should contribute $\frac{1}{2}kT$ to the total energy. As this is a harmonic system, this gives us the exact classical potential energy expectation as equal to the temperature, since we have two degrees of freedom and we are in atomic units.

Similarly, we can evaluate the kinetic energy expectation with:

julia> Estimators.@estimate kinetic_energy(sim, traj[:OutputVelocity])0.0009448229952026524

Again, this takes a similar value since the total energy is evenly split between the kinetic and potential for a classical harmonic system.

+To add new quantities, you must implement a new function inside `src/Estimators.jl`.

Let's find the expectation for the potential energy during our simulation. This is the potential energy of the final configuration in the simulation:

julia> Estimators.potential_energy(sim, traj[:OutputPosition][end])1.0584545629185372e-6

We could evaluate this for every configuration and average it manually. Fortunately however, we have the @estimate macro that will do this for us:

julia> Estimators.@estimate potential_energy(sim, traj[:OutputPosition])0.0008714360199255441
Tip

We can verify this result by comparing to the equipartition theorem which states that each quadratic degree of freedom should contribute $\frac{1}{2}kT$ to the total energy. As this is a harmonic system, this gives us the exact classical potential energy expectation as equal to the temperature, since we have two degrees of freedom and we are in atomic units.

Similarly, we can evaluate the kinetic energy expectation with:

julia> Estimators.@estimate kinetic_energy(sim, traj[:OutputVelocity])0.0009448229952026524

Again, this takes a similar value since the total energy is evenly split between the kinetic and potential for a classical harmonic system.

diff --git a/dev/dynamicssimulations/dynamicsmethods/mdef/index.html b/dev/dynamicssimulations/dynamicsmethods/mdef/index.html index 6e9f54921..7a2c9d859 100644 --- a/dev/dynamicssimulations/dynamicsmethods/mdef/index.html +++ b/dev/dynamicssimulations/dynamicsmethods/mdef/index.html @@ -1,5 +1,5 @@ -Molecular dynamics with electronic friction (MDEF) · NQCDynamics.jl

Molecular dynamics with electronic friction (MDEF)

Introduction

A set of fundamental and technologically relevant chemical processes (surface scattering, dissociative chemisorption, surface diffusion, recombinative desorption, etc.) are often catalyzed at the metal surface of several late transition metals (Au, Ag, Cu, Pt, Pd, Rh, etc). These metallic surfaces, unlike other surfaces, are characterized by a dense manifold of electronic states at the Fermi level, which produce continuous conduction and valence bands without a band gap. A theoretical description of the chemical processes at these metal surfaces is often challenging due to the Born-Oppenheimer (BO) approximation no longer being valid. With the breakdown of the Born-Oppenheimer approximation, nonadiabatic effects have to be considered to describe, e.g., the energy exchange that can take place between adsorbate and substrate degrees of freedom (DOF).

A fully quantum dynamical approach of this complex scenario is currently unfeasible and the gas-surface reaction dynamics are often described using quasi-classical methods where nuclear motion is described classically. Molecular dynamics with electronic friction (MDEF) is one of main methods used to deal with the nonadiabaticity in gas-surface chemical reactions. MDEF has been widely employed to decribe and simulate the nuclear dynamics in several molecular systems. It is a theoretical model based on a ground-state Langevin equation of motion which introduces nonadiabatic effects by using frictional and stochastic forces. This approach was originally introduced by Head-Gordon and Tully and the nonadiabatic effects can be included through different electronic friction models (see section below, LDFA and TDPT). The nuclear coordinates of the adsorbate atoms evolve as follows:

\[\mathbf{M}\ddot{\mathbf{R}} = - \nabla_R V(\mathbf{R}) + \mathbf{F}(t) - \Gamma(\mathbf{R}) \dot{\mathbf{R}}\]

The first term on the right hand side of the equation corresponds to a conservative force associated with the potential energy surface (PES) as in the adiabatic case. The third term is the friction force and it comes from multiplication between the electronic friction object ($\Gamma(\mathbf{R})$) and the velocity. Finally, the second term is a temperature and friction-dependent stochastic force which ensures detailed balance.

This figure shows an atom moving near a metal surface $M_A$. When the atom moves into the region of electron density $\rho_0^{M_A}$ it experiences the forces described above. ldfa motion

Simple example

We can explore the MDEF concept first by introducing a model system with non-physical parameters. This will demonstrate the general format and expected results from an MDEF simulation which can explore further in later sections using realistic systems.

Here, we model a single hydrogen atom in a harmonic potential, where the electronic temperature is 300 K. The CompositeFrictionModel allows us to combine any AdiabaticModel with an ElectronicFrictionProvider that will add electronic friction to an otherwise adiabatic system. RandomFriction is used for demonstration purposes only and provides a matrix of random numbers to use in place of the friction.

using NQCDynamics
+Molecular dynamics with electronic friction (MDEF) · NQCDynamics.jl

Molecular dynamics with electronic friction (MDEF)

Introduction

A set of fundamental and technologically relevant chemical processes (surface scattering, dissociative chemisorption, surface diffusion, recombinative desorption, etc.) are often catalyzed at the metal surface of several late transition metals (Au, Ag, Cu, Pt, Pd, Rh, etc). These metallic surfaces, unlike other surfaces, are characterized by a dense manifold of electronic states at the Fermi level, which produce continuous conduction and valence bands without a band gap. A theoretical description of the chemical processes at these metal surfaces is often challenging due to the Born-Oppenheimer (BO) approximation no longer being valid. With the breakdown of the Born-Oppenheimer approximation, nonadiabatic effects have to be considered to describe, e.g., the energy exchange that can take place between adsorbate and substrate degrees of freedom (DOF).

A fully quantum dynamical approach of this complex scenario is currently unfeasible and the gas-surface reaction dynamics are often described using quasi-classical methods where nuclear motion is described classically. Molecular dynamics with electronic friction (MDEF) is one of main methods used to deal with the nonadiabaticity in gas-surface chemical reactions. MDEF has been widely employed to decribe and simulate the nuclear dynamics in several molecular systems. It is a theoretical model based on a ground-state Langevin equation of motion which introduces nonadiabatic effects by using frictional and stochastic forces. This approach was originally introduced by Head-Gordon and Tully and the nonadiabatic effects can be included through different electronic friction models (see section below, LDFA and TDPT). The nuclear coordinates of the adsorbate atoms evolve as follows:

\[\mathbf{M}\ddot{\mathbf{R}} = - \nabla_R V(\mathbf{R}) + \mathbf{F}(t) - \Gamma(\mathbf{R}) \dot{\mathbf{R}}\]

The first term on the right hand side of the equation corresponds to a conservative force associated with the potential energy surface (PES) as in the adiabatic case. The third term is the friction force and it comes from multiplication between the electronic friction object ($\Gamma(\mathbf{R})$) and the velocity. Finally, the second term is a temperature and friction-dependent stochastic force which ensures detailed balance.

This figure shows an atom moving near a metal surface $M_A$. When the atom moves into the region of electron density $\rho_0^{M_A}$ it experiences the forces described above. ldfa motion

Simple example

We can explore the MDEF concept first by introducing a model system with non-physical parameters. This will demonstrate the general format and expected results from an MDEF simulation which can explore further in later sections using realistic systems.

Here, we model a single hydrogen atom in a harmonic potential, where the electronic temperature is 300 K. The CompositeFrictionModel allows us to combine any AdiabaticModel with an ElectronicFrictionProvider that will add electronic friction to an otherwise adiabatic system. RandomFriction is used for demonstration purposes only and provides a matrix of random numbers to use in place of the friction.

using NQCDynamics
 using Unitful
 
 atoms = Atoms([:H])
@@ -17,45 +17,45 @@
 plot(solution, :OutputTotalEnergy)
- + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + +
Note

:hamiltonian in the output tuple refers to the classical Hamiltonian that generates the classical equations of motion. Since we are performing MDEF we see that the total energy fluctuates.

Now let's see what happens if we make the electronic temperature a function of time. For any simulation, temperature can be provided as a time-dependent function which allows variable temperature simulations. In the context of MDEF, this temperature can be used to represent the use of lasers to provide extra energy to the electrons in the metal.

temperature_function(t) = exp(-(t - 50u"fs")^2 / 20u"fs^2") * 300u"K"
Warning

The time argument enters this function as a Unitful.jl quantity, and it is important to make sure the unit of the return value is temperature.

Now we can re-simulate, replacing the fixed temperature with the function we have defined.

sim = Simulation{MDEF}(atoms, model; temperature=temperature_function)
 solution = run_dynamics(sim, (0.0, 100u"fs"), z, dt=0.5u"fs",
@@ -63,44 +63,44 @@
 plot(solution, :OutputTotalEnergy)
- + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + -

This time we see a peak in the energy in the middle of the simulation which coincides with the peak in temperature at 50 fs. Having viewed this simple example, we can now explore the different ways the friction coefficient can be obtained from ab initio simulations.

Local density friction approximation (LDFA)

Local density friction approximation (LDFA) is a theoretical model which describes the electronic friction $\Gamma(\mathbf{R})$ term in the above equation based on the local electron density of the metal substrate. This approximation assumes a scalar friction coefficient ($\Gamma(R_i)$) for each adsorbate atom. The underlying assumption to this approximation is that any atom only sees an anisotropic (scalar) density that only depends on the local surroundings. In the LDFA theoretical framework the above equation of motion is used, except the friction matrix is diagonal, each element coming from the local density of each atom.

In our current LDFA implementation, a set of pre-calculated electronic friction coefficients ($\eta_{e,i}$) computed at different Wigner-Seitz radius ($r_s$) are used to fit and get an analytical expression to connect any $r_s$ values with an single electronic friction coefficient by means of cubic Spline functions. The Wigner-Sietz radius is connected to the metal substrate electron density by the following equation,

\[ r_s(\rho) = (\frac{3}{4\pi \rho (\mathbf{r_{i}})})^{1/3}\]

In this way, the electron density associated with the current substrate atom position is used to compute the respective friction coefficient through fitting function for each point of the trajectory. Visit the CubeLDFAModel.jl to learn more about how this is evaluated.

Time-dependent Perturbation theory (TDPT)

A more general formulation of the electronic friction object was also developed under the umbrella of electronic friction tensor(EFT) or orbital-dependent electronic friction (ODF) approaches. Both formulations are essentially equivalent and they incorporate the isotropy nature of the electronic friction object by a multidimentional tensor ($\Lambda_{ij}$) instead of a single coefficient as usually computed at LDFA level. The electronic friction elements can be computed by first-principle calculations in the context of first-order time-dependent perturbation theory (TDPT) at the density functional theory (DFT) level. Each electronic friction tensor (EFT) elements corresponds to relaxation rate due to electron-nuclear coupling along the Cartesian coordinate $i$ due to motion in the $j$ direction. The electronic friction tensor elements can be computed by using the Fermi's golden rule. $\Lambda_{ij}$ is an object with ($3N\times3N$)-dimension where N is often the total number of adsorbate atoms considered explicitly on the study system. View the friction models page to learn about how this can be used.

TDPT friction and LDFA in action?

If you would like to see an example using both LDFA and TDPT during full dimensional dynamics, refer to the reactive scattering example.

+

This time we see a peak in the energy in the middle of the simulation which coincides with the peak in temperature at 50 fs. Having viewed this simple example, we can now explore the different ways the friction coefficient can be obtained from ab initio simulations.

Local density friction approximation (LDFA)

Local density friction approximation (LDFA) is a theoretical model which describes the electronic friction $\Gamma(\mathbf{R})$ term in the above equation based on the local electron density of the metal substrate. This approximation assumes a scalar friction coefficient ($\Gamma(R_i)$) for each adsorbate atom. The underlying assumption to this approximation is that any atom only sees an anisotropic (scalar) density that only depends on the local surroundings. In the LDFA theoretical framework the above equation of motion is used, except the friction matrix is diagonal, each element coming from the local density of each atom.

In our current LDFA implementation, a set of pre-calculated electronic friction coefficients ($\eta_{e,i}$) computed at different Wigner-Seitz radius ($r_s$) are used to fit and get an analytical expression to connect any $r_s$ values with an single electronic friction coefficient by means of cubic Spline functions. The Wigner-Sietz radius is connected to the metal substrate electron density by the following equation,

\[ r_s(\rho) = (\frac{3}{4\pi \rho (\mathbf{r_{i}})})^{1/3}\]

In this way, the electron density associated with the current substrate atom position is used to compute the respective friction coefficient through fitting function for each point of the trajectory. Visit the CubeLDFAModel.jl to learn more about how this is evaluated.

Time-dependent Perturbation theory (TDPT)

A more general formulation of the electronic friction object was also developed under the umbrella of electronic friction tensor(EFT) or orbital-dependent electronic friction (ODF) approaches. Both formulations are essentially equivalent and they incorporate the isotropy nature of the electronic friction object by a multidimentional tensor ($\Lambda_{ij}$) instead of a single coefficient as usually computed at LDFA level. The electronic friction elements can be computed by first-principle calculations in the context of first-order time-dependent perturbation theory (TDPT) at the density functional theory (DFT) level. Each electronic friction tensor (EFT) elements corresponds to relaxation rate due to electron-nuclear coupling along the Cartesian coordinate $i$ due to motion in the $j$ direction. The electronic friction tensor elements can be computed by using the Fermi's golden rule. $\Lambda_{ij}$ is an object with ($3N\times3N$)-dimension where N is often the total number of adsorbate atoms considered explicitly on the study system. View the friction models page to learn about how this can be used.

TDPT friction and LDFA in action?

If you would like to see an example using both LDFA and TDPT during full dimensional dynamics, refer to the reactive scattering example.

diff --git a/dev/dynamicssimulations/dynamicsmethods/nrpmd/index.html b/dev/dynamicssimulations/dynamicsmethods/nrpmd/index.html index 8834e76ef..69f225079 100644 --- a/dev/dynamicssimulations/dynamicsmethods/nrpmd/index.html +++ b/dev/dynamicssimulations/dynamicsmethods/nrpmd/index.html @@ -1,5 +1,5 @@ -Nonadiabatic ring polymer molecular dynamics (NRPMD) · NQCDynamics.jl

Nonadiabatic ring polymer molecular dynamics (NRPMD)

Theory

Nonadiabatic ring polymer molecular dynamics (NRPMD) is a method that uses the ring polymer formalism to include quantum effects in the nuclear dynamics and mapping variables for the electronic degrees of freedom. (Jeremy O. Richardson, Michael Thoss (2013), Jeremy O. Richardson, Philipp Meyer, Marc-Oliver Pleinert, Michael Thoss (2017), Sutirtha N. Chowdhury, Pengfei Huo (2019)) This results in a classical dynamics in an extended phasespace of the ring polymer with each bead coupled to a set of classical mapping variables. Originally, this method was proposed as a simple combination of the Meyer-Miller-Stock-Thoss mapping formalism with RPMD but has since been rigorously derived from nonadiabatic Matsubara dynamics (Sutirtha N. Chowdhury, Pengfei Huo (2021)).

The classical Hamiltonian conserved by NRPMD is given by

\[H_N = \sum_{\alpha=1}^N \left[ +Nonadiabatic ring polymer molecular dynamics (NRPMD) · NQCDynamics.jl

Nonadiabatic ring polymer molecular dynamics (NRPMD)

Theory

Nonadiabatic ring polymer molecular dynamics (NRPMD) is a method that uses the ring polymer formalism to include quantum effects in the nuclear dynamics and mapping variables for the electronic degrees of freedom. ([9], [10], [11]) This results in a classical dynamics in an extended phasespace of the ring polymer with each bead coupled to a set of classical mapping variables. Originally, this method was proposed as a simple combination of the Meyer-Miller-Stock-Thoss mapping formalism with RPMD but has since been rigorously derived from nonadiabatic Matsubara dynamics ([12]).

The classical Hamiltonian conserved by NRPMD is given by

\[H_N = \sum_{\alpha=1}^N \left[ \frac{P_\alpha^2}{2M} + V_0(R_\alpha) + \frac{M}{2\beta_N^2\hbar^2} (R_\alpha - R_{\alpha-1})^2 + \frac{1}{\hbar} \sum_{nm}V_{nm}(R_\alpha) @@ -18,7 +18,7 @@ \\ [\dot{p}_\alpha]_n &= -\frac{1}{\hbar} \sum_m V_{nm}(R_\alpha)[q_\alpha]_m -\end{aligned}\]

Implementation details

Solving the differential equations

For mapping variable methods of this type, a symplectic algorithm (Matthew S. Church, Timothy J. H. Hele, Gregory S. Ezra, Nandini Ananth (2018)) exists. This algorithm has the advantage of long time stability and can be easily combined with the standard algorithms for ring polymer time-evolution. For NRPMD we have implemented this algorithm using the Cayley modified ring polymer propagator (Roman Korol, Nawaf Bou-Rabee, Thomas F. Miller (2019)) and obtain accurate and efficient dynamics. For few beads, similar performance to the OrdinaryDiffEq.jl algorithms is obtained, but as the number of beads increases this algorithm becomes more effective.

Generating the initial distribution

Currently, we provide this functionality only for nonequilibrium simulations where the nuclear part of the distribution is separable from the electronic part. Typically, the nuclear distribution will be sampled using Langevin dynamics or Monte Carlo sampling and the electronic variables are confined to a single electronic state. This is appropriate for modelling photoexcitation dynamics but is not yet suitable for equilibrium simulations. Equilibrium dynamics would require also sampling a thermal distribution for the mapping variables.

Form of the Hamiltonian

The diabatic models defined in NQCModels.jl are of the appropriate form for this method though they provide the potential as a single matrix, rather than separating the state-dependent and independent parts. It has been suggested that defining the Hamiltonian such that the lowest eigenvalue of the diabatic matrix is zero everywhere leads to improved convergence in the sampling (Jeremy O. Richardson, Michael Thoss (2013)). However, here we have not done this for simplicity when defining the models.

Example

Using NRPMD we can reproduce the Fig. 3a in the 2019 paper of Chowdhury and Huo (Sutirtha N. Chowdhury, Pengfei Huo (2019)).

First we generate a thermal ring polymer distribution in a harmonic potential. A simple way to do this is to use Monte Carlo sampling for the positions and obtain velocities from a Boltzmann distribution.

using NQCDynamics
+\end{aligned}\]

Implementation details

Solving the differential equations

For mapping variable methods of this type, a symplectic algorithm ([13]) exists. This algorithm has the advantage of long time stability and can be easily combined with the standard algorithms for ring polymer time-evolution. For NRPMD we have implemented this algorithm using the Cayley modified ring polymer propagator ([14]) and obtain accurate and efficient dynamics. For few beads, similar performance to the OrdinaryDiffEq.jl algorithms is obtained, but as the number of beads increases this algorithm becomes more effective.

Generating the initial distribution

Currently, we provide this functionality only for nonequilibrium simulations where the nuclear part of the distribution is separable from the electronic part. Typically, the nuclear distribution will be sampled using Langevin dynamics or Monte Carlo sampling and the electronic variables are confined to a single electronic state. This is appropriate for modelling photoexcitation dynamics but is not yet suitable for equilibrium simulations. Equilibrium dynamics would require also sampling a thermal distribution for the mapping variables.

Form of the Hamiltonian

The diabatic models defined in NQCModels.jl are of the appropriate form for this method though they provide the potential as a single matrix, rather than separating the state-dependent and independent parts. It has been suggested that defining the Hamiltonian such that the lowest eigenvalue of the diabatic matrix is zero everywhere leads to improved convergence in the sampling ([9]). However, here we have not done this for simplicity when defining the models.

Example

Using NRPMD we can reproduce the Fig. 3a in the 2019 paper of Chowdhury and Huo ([11]).

First we generate a thermal ring polymer distribution in a harmonic potential. A simple way to do this is to use Monte Carlo sampling for the positions and obtain velocities from a Boltzmann distribution.

using NQCDynamics
 
 atom = Atoms(1)
 
@@ -30,7 +30,7 @@
 output = InitialConditions.ThermalMonteCarlo.run_advancedmh_sampling(sim, r0, steps, step_size)
 velocities = VelocityBoltzmann(1/16, masses(sim), (1,1))
 
-distribution = DynamicalDistribution(velocities, output, size(sim)) * PureState(1)
NQCDistributions.ProductDistribution{NQCDistributions.RingPolymerWrapper{NQCDistributions.UnivariateArray{2, Distributions.Normal{Float64}}}, NQCDistributions.ConfigurationVector{Vector{Array{Float64, 3}}}, PureState{Diabatic}}(DynamicalDistribution{NQCDistributions.RingPolymerWrapper{NQCDistributions.UnivariateArray{2, Distributions.Normal{Float64}}}, NQCDistributions.ConfigurationVector{Vector{Array{Float64, 3}}}}(NQCDistributions.RingPolymerWrapper{NQCDistributions.UnivariateArray{2, Distributions.Normal{Float64}}}(NQCDistributions.UnivariateArray{2, Distributions.Normal{Float64}}(Distributions.Normal{Float64}[Distributions.Normal{Float64}(μ=0.0, σ=0.25);;]), (1, 1, 4), Int64[]), NQCDistributions.ConfigurationVector{Vector{Array{Float64, 3}}}([[0.0;;; 0.0;;; 0.0;;; 0.0], [0.0;;; 0.0;;; 0.0;;; 0.0], [0.0;;; 0.0;;; 0.0;;; 0.0], [0.0;;; 0.0;;; 0.0;;; 0.0], [0.0;;; 0.0;;; 0.0;;; 0.0], [0.0;;; 0.0;;; 0.0;;; 0.0], [0.0;;; 0.0;;; 0.0;;; 0.0], [0.0;;; 0.0;;; 0.0;;; 0.0], [0.0;;; 0.0;;; 0.0;;; 0.0], [0.0;;; 0.0;;; 0.0;;; 0.0]  …  [-0.016949603619807005;;; 0.17689046292575641;;; -0.4775301866930142;;; -0.6040575413889911], [0.1457978968137163;;; 0.5359994257730739;;; -0.9496772542304238;;; -0.11464209690049375], [0.1457978968137163;;; 0.5359994257730739;;; -0.9496772542304238;;; -0.11464209690049375], [0.09040576562083466;;; 0.7312182053160763;;; -0.00022063670608448048;;; -0.10877742086961574], [0.12504844554751832;;; -0.7352255829079279;;; -0.38748526451940213;;; -0.010330073752486311], [0.12504844554751832;;; -0.7352255829079279;;; -0.38748526451940213;;; -0.010330073752486311], [0.12504844554751832;;; -0.7352255829079279;;; -0.38748526451940213;;; -0.010330073752486311], [0.12504844554751832;;; -0.7352255829079279;;; -0.38748526451940213;;; -0.010330073752486311], [0.12504844554751832;;; -0.7352255829079279;;; -0.38748526451940213;;; -0.010330073752486311], [0.12504844554751832;;; -0.7352255829079279;;; -0.38748526451940213;;; -0.010330073752486311]]), Random.Xoshiro(0x7ef1556d61d6bbe0, 0xfcf7eab5002a5957, 0xffa4ebaabc497060, 0x5d64fbaa1618377b)), PureState{Diabatic}(1, Diabatic()))
`size(sim)`

size(sim) returns the system size as (degrees of freedom, number of atoms, number of beads).

Monte Carlo sampling

Further information on Monte Carlo sampling can be found here.

We can check the distribution by plotting the phasespace diagram for each of the points in our distribution:

using CairoMakie
+distribution = DynamicalDistribution(velocities, output, size(sim)) * PureState(1)
NQCDistributions.ProductDistribution{NQCDistributions.RingPolymerWrapper{NQCDistributions.UnivariateArray{2, Distributions.Normal{Float64}}}, NQCDistributions.ConfigurationVector{Vector{Array{Float64, 3}}}, PureState{Diabatic}}(DynamicalDistribution{NQCDistributions.RingPolymerWrapper{NQCDistributions.UnivariateArray{2, Distributions.Normal{Float64}}}, NQCDistributions.ConfigurationVector{Vector{Array{Float64, 3}}}}(NQCDistributions.RingPolymerWrapper{NQCDistributions.UnivariateArray{2, Distributions.Normal{Float64}}}(NQCDistributions.UnivariateArray{2, Distributions.Normal{Float64}}(Distributions.Normal{Float64}[Distributions.Normal{Float64}(μ=0.0, σ=0.25);;]), (1, 1, 4), Int64[]), NQCDistributions.ConfigurationVector{Vector{Array{Float64, 3}}}([[0.0;;; 0.0;;; 0.0;;; 0.0], [0.0;;; 0.0;;; 0.0;;; 0.0], [0.0;;; 0.0;;; 0.0;;; 0.0], [0.0;;; 0.0;;; 0.0;;; 0.0], [0.0;;; 0.0;;; 0.0;;; 0.0], [0.0;;; 0.0;;; 0.0;;; 0.0], [0.0;;; 0.0;;; 0.0;;; 0.0], [0.0;;; 0.0;;; 0.0;;; 0.0], [0.0;;; 0.0;;; 0.0;;; 0.0], [0.0;;; 0.0;;; 0.0;;; 0.0]  …  [-0.016949603619807005;;; 0.17689046292575641;;; -0.4775301866930142;;; -0.6040575413889911], [0.1457978968137163;;; 0.5359994257730739;;; -0.9496772542304238;;; -0.11464209690049375], [0.1457978968137163;;; 0.5359994257730739;;; -0.9496772542304238;;; -0.11464209690049375], [0.09040576562083466;;; 0.7312182053160763;;; -0.00022063670608448048;;; -0.10877742086961574], [0.12504844554751832;;; -0.7352255829079279;;; -0.38748526451940213;;; -0.010330073752486311], [0.12504844554751832;;; -0.7352255829079279;;; -0.38748526451940213;;; -0.010330073752486311], [0.12504844554751832;;; -0.7352255829079279;;; -0.38748526451940213;;; -0.010330073752486311], [0.12504844554751832;;; -0.7352255829079279;;; -0.38748526451940213;;; -0.010330073752486311], [0.12504844554751832;;; -0.7352255829079279;;; -0.38748526451940213;;; -0.010330073752486311], [0.12504844554751832;;; -0.7352255829079279;;; -0.38748526451940213;;; -0.010330073752486311]]), Random.Xoshiro(0xeb485f1a7b0b3778, 0x792ef522e586f132, 0x485019eee0decdb4, 0x2d3bd318ad3d58c0)), PureState{Diabatic}(1, Diabatic()))
`size(sim)`

size(sim) returns the system size as (degrees of freedom, number of atoms, number of beads).

Monte Carlo sampling

Further information on Monte Carlo sampling can be found here.

We can check the distribution by plotting the phasespace diagram for each of the points in our distribution:

using CairoMakie
 
 nuclear = distribution.nuclear
 flat_position = reduce(vcat, (nuclear.position[i][:] for i in 1:length(nuclear)))
@@ -51,4 +51,4 @@
 plt = lines(0:0.1:30, [p[1,1]-p[2,1] for p in ensemble[:PopulationCorrelationFunction]])
 plt.axis.xlabel = "Time"
 plt.axis.ylabel = "Population difference"
-plt
+plt
diff --git a/dev/dynamicssimulations/dynamicsmethods/rpmd/index.html b/dev/dynamicssimulations/dynamicsmethods/rpmd/index.html index 886f8e345..b5bbb7363 100644 --- a/dev/dynamicssimulations/dynamicsmethods/rpmd/index.html +++ b/dev/dynamicssimulations/dynamicsmethods/rpmd/index.html @@ -1,5 +1,5 @@ -Ring polymer molecular dynamics (RPMD) · NQCDynamics.jl

Ring polymer molecular dynamics (RPMD)

Ring polymer molecular dynamics is a quantum dynamics methods that attempts to approximate Kubo-transformed real-time correlation functions (Ian R. Craig, David E. Manolopoulos (2004)).

The idea is to exploit the classical isomorphism that maps a quantum particle onto the extended phasespace of a classical ring polymer. It can be shown that the quantum partition function for a system can be manipulated such that it resembles the classical partition function of a system containing many replicas of the original particle joined to together with harmonic springs in a ring. In the limit of infinite beads or replicas in the ring polymer, the isomorphism becomes exact and it is possible to evaluate quantum expectation values by evaluating ensemble averages for the classical ring polymer system. This is referred to as the field of imaginary-time path integrals and the techniques used are Path Integral Monte Carlo (PIMC) and Path Integral Molecular Dynamics (PIMD) depending on whether molecular dynamics or Monte Carlo methods are used to explore the phasespace (Mark Tuckerman (2010)).

RPMD was proposed as a heuristic extension of imaginary-time path integrals to evaluate real-time dynamical quantities. To perform RPMD, it is necessary to solve Hamilton's equations for the ring polymer Hamiltonian:

\[H = \sum_\alpha^N \frac{1}{2} \mathbf{P}_\alpha^T \mathbf{M} \mathbf{P}_\alpha +Ring polymer molecular dynamics (RPMD) · NQCDynamics.jl

Ring polymer molecular dynamics (RPMD)

Ring polymer molecular dynamics is a quantum dynamics methods that attempts to approximate Kubo-transformed real-time correlation functions ([15]).

The idea is to exploit the classical isomorphism that maps a quantum particle onto the extended phasespace of a classical ring polymer. It can be shown that the quantum partition function for a system can be manipulated such that it resembles the classical partition function of a system containing many replicas of the original particle joined to together with harmonic springs in a ring. In the limit of infinite beads or replicas in the ring polymer, the isomorphism becomes exact and it is possible to evaluate quantum expectation values by evaluating ensemble averages for the classical ring polymer system. This is referred to as the field of imaginary-time path integrals and the techniques used are Path Integral Monte Carlo (PIMC) and Path Integral Molecular Dynamics (PIMD) depending on whether molecular dynamics or Monte Carlo methods are used to explore the phasespace ([16]).

RPMD was proposed as a heuristic extension of imaginary-time path integrals to evaluate real-time dynamical quantities. To perform RPMD, it is necessary to solve Hamilton's equations for the ring polymer Hamiltonian:

\[H = \sum_\alpha^N \frac{1}{2} \mathbf{P}_\alpha^T \mathbf{M} \mathbf{P}_\alpha + \frac{1}{2} \omega_N^2 (\mathbf{R}_\alpha - \mathbf{R}_{\alpha+1})^T \mathbf{M} @@ -14,8 +14,8 @@ Free(2) with 50 beads.

Atomic units

Recall that the quantities are always in atomic units unless Unitful.jl has been used to specify alternative units. The temperature here has been specified using Kelvin.

We initialise the simulation with zero velocity and a random distribution for the ring polymer bead positions. For a real RPMD simulation you will use the thermal ring polymer distribution obtained from a PIMC or Langevin simulation but here for simplicity we use a normally distributed configuration.

u = DynamicsVariables(sim, zeros(size(sim)), randn(size(sim)))
Tip

To learn how to work with the thermal ring polymer phase space, refer to the Storing and sampling distributions section.

Now we can run the simulation, for which we use the time interval 0.0 to 500.0 and a time step of dt = 2.5:

dt = 2.5
-traj = run_dynamics(sim, (0.0, 500.0), u; output=OutputPosition, dt=dt)
[ Info: Performing 1 trajectory.
-[ Info: Finished after 7.46522568 seconds.

We can visualise this ring polymer trajectory with a 2D scatter plot that shows how the ring polymer evolves in time. Here, we have joined the adjacent beads together with lines, with the end and start beads joined with a different color. This animation shows the cyclic nature of the ring polymer, and how every bead is connected to its two neighbours.

using CairoMakie
+traj = run_dynamics(sim, (0.0, 500.0), u; output=OutputPosition, dt=dt)
[ Info: Performing 1 trajectory.
+[ Info: Finished after 8.987032239 seconds.

We can visualise this ring polymer trajectory with a 2D scatter plot that shows how the ring polymer evolves in time. Here, we have joined the adjacent beads together with lines, with the end and start beads joined with a different color. This animation shows the cyclic nature of the ring polymer, and how every bead is connected to its two neighbours.

using CairoMakie
 
 rs = traj[:OutputPosition]
 
@@ -34,4 +34,4 @@
 record(fig, filepath, timestamps;
         framerate = 30) do i
     index[] = i
-end

Note

We have used Makie's animation features to produce this animation. If you want information how Makie works, take a look at the Makie documentation.

Since this package is focused on nonadiabatic dynamics, you won't see much adiabatic RPMD elsewhere in the documentation but it's useful to understand how the original adiabatic version works before moving onto the nonadiabatic extensions.

+end

Note

We have used Makie's animation features to produce this animation. If you want information how Makie works, take a look at the Makie documentation.

Since this package is focused on nonadiabatic dynamics, you won't see much adiabatic RPMD elsewhere in the documentation but it's useful to understand how the original adiabatic version works before moving onto the nonadiabatic extensions.

diff --git a/dev/dynamicssimulations/dynamicsmethods/rpsh/index.html b/dev/dynamicssimulations/dynamicsmethods/rpsh/index.html index 318aa2140..4b800fff2 100644 --- a/dev/dynamicssimulations/dynamicsmethods/rpsh/index.html +++ b/dev/dynamicssimulations/dynamicsmethods/rpsh/index.html @@ -1,5 +1,5 @@ -Ring polymer surface hopping (RPSH) · NQCDynamics.jl

Ring polymer surface hopping (RPSH)

Ring polymer surface hopping was one of the early attempts to extend RPMD to the realm of nonadiabatic dynamics Philip Shushkov, Richard Li, John C. Tully (2012). On the surface, the concept is reasonably simple. Since RPMD proceeds on a single adiabatic surface, it should be possible to directly combine the FSSH scheme with ring polymer dynamics to approximately include nuclear quantum effects in the surface hopping dynamics. However, there are some ambiguities surrounding the exact implementation when considering how to couple the electronic equations to the nuclear equations and how the velocity rescaling should be implemented.

Originally, two varieties were proposed: the bead approximation and the centroid approximation. The centroid approximation is the simpler of the two and involves directly replacing the classical particle in the FSSH algorithm with the ring polymer centroid. This means that the nonadiabatic couplings evaluated at the centroid and the centroid velocity are used to propagate the electronic equations, and the kinetic energy is conserved on the centroid level. This is the version that is implemented here.

The bead approximation involves evaluating the nonadiabatic couplings for every bead and using these contributions from every bead to propagate the electronics. This version acts to conserve the kinetic energy for the entire ring polymer. Philip Shushkov, Richard Li, John C. Tully (2012) describes both the centroid and bead approximations, Farnaz A. Shakib, Pengfei Huo (2017) uses the centroid approximation.

Example

In this example we can apply RPSH to the ThreeStateMorse model as shown in the supporting info of Farnaz A. Shakib, Pengfei Huo (2017). This model has a single particle with mass of 20000 a.u. and we use 4 beads for the ring polymer.

using NQCDynamics
+Ring polymer surface hopping (RPSH) · NQCDynamics.jl

Ring polymer surface hopping (RPSH)

Ring polymer surface hopping was one of the early attempts to extend RPMD to the realm of nonadiabatic dynamics [17]. On the surface, the concept is reasonably simple. Since RPMD proceeds on a single adiabatic surface, it should be possible to directly combine the FSSH scheme with ring polymer dynamics to approximately include nuclear quantum effects in the surface hopping dynamics. However, there are some ambiguities surrounding the exact implementation when considering how to couple the electronic equations to the nuclear equations and how the velocity rescaling should be implemented.

Originally, two varieties were proposed: the bead approximation and the centroid approximation. The centroid approximation is the simpler of the two and involves directly replacing the classical particle in the FSSH algorithm with the ring polymer centroid. This means that the nonadiabatic couplings evaluated at the centroid and the centroid velocity are used to propagate the electronic equations, and the kinetic energy is conserved on the centroid level. This is the version that is implemented here.

The bead approximation involves evaluating the nonadiabatic couplings for every bead and using these contributions from every bead to propagate the electronics. This version acts to conserve the kinetic energy for the entire ring polymer. [17] describes both the centroid and bead approximations, [18] uses the centroid approximation.

Example

In this example we can apply RPSH to the ThreeStateMorse model as shown in the supporting info of [18]. This model has a single particle with mass of 20000 a.u. and we use 4 beads for the ring polymer.

using NQCDynamics
 using Unitful
 
 atoms = Atoms(20000)
@@ -13,7 +13,7 @@
     output=TimeCorrelationFunctions.PopulationCorrelationFunction(sim, Diabatic()),
     reduction=MeanReduction())
2-element Dictionaries.Dictionary{Symbol, Vector}
                           :Time │ [0.0, 50.0, 100.0, 150.0, 200.0, 250.0, 300.0…
- :PopulationCorrelationFunction │ [[1.0 -2.0044377182978004e-47 -1.119759462024…
Note

In the examples section at the end of the documentation we will return to this model and compare the performance of multiple methods.

Here we plot diabatic population of each state as a function of time. The result closely resembles the literature reference (Farnaz A. Shakib, Pengfei Huo (2017)). The small discrepancy that occurs at around t=2000 is due to our use of an alternative method to calculate the diabatic populations. A discussion on this topic is available from Brian R. Landry, Martin J. Falk, Joseph E. Subotnik (2013).

using Plots
+ :PopulationCorrelationFunction │ [[1.0 -2.0044377182978004e-47 -1.119759462024…
Note

In the examples section at the end of the documentation we will return to this model and compare the performance of multiple methods.

Here we plot diabatic population of each state as a function of time. The result closely resembles the literature reference ([18]). The small discrepancy that occurs at around t=2000 is due to our use of an alternative method to calculate the diabatic populations. A discussion on this topic is available from [19].

using Plots
 
 plot(0:50:3000, [p[1,1] for p in solution[:PopulationCorrelationFunction]], label="State 1")
 plot!(0:50:3000, [p[1,2] for p in solution[:PopulationCorrelationFunction]], label="State 2")
@@ -22,49 +22,49 @@
 ylabel!("Population")
- + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

For our simulation we are using a Normal distribution to initialise our ring polymer configuration. Since ring polymer surface hopping has not been rigorously derived, this choice is somewhat arbitrary and it is possible that better results could be achieved using a free ring polymer distribution instead. Ralph Welsch, Kai Song, Qiang Shi, Stuart C. Althorpe, Thomas F. Miller (2016) provides a theoretical description of how nonequilibrium simulations using RPMD should be performed. This techniques here should likely be applied to RPSH too.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

For our simulation we are using a Normal distribution to initialise our ring polymer configuration. Since ring polymer surface hopping has not been rigorously derived, this choice is somewhat arbitrary and it is possible that better results could be achieved using a free ring polymer distribution instead. [20] provides a theoretical description of how nonequilibrium simulations using RPMD should be performed. This techniques here should likely be applied to RPSH too.

diff --git a/dev/dynamicssimulations/dynamicssimulations/index.html b/dev/dynamicssimulations/dynamicssimulations/index.html index af1b76ef2..2df21643e 100644 --- a/dev/dynamicssimulations/dynamicssimulations/index.html +++ b/dev/dynamicssimulations/dynamicssimulations/index.html @@ -1,5 +1,5 @@ -Introduction · NQCDynamics.jl

Introduction

Performing dynamics simulations is at the core of this package's functionality (as you might have guessed from the name). This section of the documentation will describe how to perform dynamics simulations, building on the introduction from Getting started.

Since we use DifferentialEquations to perform the dynamics, it is most natural to split up the system parameters from the dynamics variables. This manifests itself as two separate data types: the Simulation, and the DynamicsVariables.

Info

If you intend to implement a new dynamics method, we recommend reading DifferentialEquations.jl to understand more deeply how this package works.

The Simulation holds all the static information about the system: the atoms, the model, the temperature, the cell and the dynamics method.

atoms = Atoms(2000) # Single atom with mass = 2000 a.u.
+Introduction · NQCDynamics.jl

Introduction

Performing dynamics simulations is at the core of this package's functionality (as you might have guessed from the name). This section of the documentation will describe how to perform dynamics simulations, building on the introduction from Getting started.

Since we use DifferentialEquations to perform the dynamics, it is most natural to split up the system parameters from the dynamics variables. This manifests itself as two separate data types: the Simulation, and the DynamicsVariables.

Info

If you intend to implement a new dynamics method, we recommend reading DifferentialEquations.jl to understand more deeply how this package works.

The Simulation holds all the static information about the system: the atoms, the model, the temperature, the cell and the dynamics method.

atoms = Atoms(2000) # Single atom with mass = 2000 a.u.
 sim = Simulation{Ehrenfest}(atoms, TullyModelOne(); temperature=0, cell=InfiniteCell())
Simulation{Ehrenfest{Float64}}:
   Atoms{Float64}([:X], [0], [2000.0])
   TullyModelOne{Float64, Float64, Float64, Float64}
@@ -19,88 +19,88 @@
 plot(out, :OutputPosition)
- + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + +
plot(out, :OutputAdiabaticPopulation)
- + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + -
Note

Here we have used a special plot recipe that will automatically plot any quantity against time. This is useful when investigating the results of a single trajectory.

All of the dynamics methods work in a similar way. For details on a specific method along with examples, please see the method specific page in the sidebar under Dynamics methods.

+
Note

Here we have used a special plot recipe that will automatically plot any quantity against time. This is useful when investigating the results of a single trajectory.

All of the dynamics methods work in a similar way. For details on a specific method along with examples, please see the method specific page in the sidebar under Dynamics methods.

diff --git a/dev/ensemble_simulations/index.html b/dev/ensemble_simulations/index.html index 7b99a327b..b86df883f 100644 --- a/dev/ensemble_simulations/index.html +++ b/dev/ensemble_simulations/index.html @@ -1,5 +1,5 @@ -Ensemble simulations · NQCDynamics.jl

Ensemble simulations

Typically we'll be interested in computing observables based upon the statistics obtained from many trajectories. Technically it is possible to manually run many trajectories using the single trajectory procedure introduced in the Getting started section. However, by using the methods introduced on this page it is possible to run many trajectories at once, using parallelism and computing ensemble observables automatically.

The key function for performing ensemble simulations is run_dynamics.

NQCDynamics.Ensembles.run_dynamicsFunction
run_dynamics(sim::AbstractSimulation, tspan, distribution;
+Ensemble simulations · NQCDynamics.jl

Ensemble simulations

Typically we'll be interested in computing observables based upon the statistics obtained from many trajectories. Technically it is possible to manually run many trajectories using the single trajectory procedure introduced in the Getting started section. However, by using the methods introduced on this page it is possible to run many trajectories at once, using parallelism and computing ensemble observables automatically.

The key function for performing ensemble simulations is run_dynamics.

NQCDynamics.Ensembles.run_dynamicsFunction
run_dynamics(sim::AbstractSimulation, tspan, distribution;
     output,
     selection::Union{Nothing,AbstractVector}=nothing,
     reduction=AppendReduction(),
@@ -7,7 +7,7 @@
     algorithm=DynamicsMethods.select_algorithm(sim),
     trajectories=1,
     kwargs...
-    )

Run trajectories for timespan tspan sampling from distribution.

Keywords

  • output either a single function or a Tuple of functions with the signature f(sol, i) that takes the DifferentialEquations solution and returns the desired output quantity.
  • selection should be an AbstractVector containing the indices to sample from the distribution. By default, nothing leads to random sampling.
  • reduction defines how the data is reduced across trajectories. Options are AppendReduction(), MeanReduction(), SumReduction and FileReduction(filename).
  • ensemble_algorithm is the algorithm from DifferentialEquations which determines which form of parallelism is used.
  • algorithm is the algorithm used to integrate the equations of motion.
  • trajectories is the number of trajectories to perform.
  • kwargs... any additional keywords are passed to DifferentialEquations solve`.
source

This is the same function used to perform single trajectory simulations, but by replacing the single initial condition with a distribution and changing the number of trajectories it is possible to run an ensemble of trajectories. The distributions are defined such that they can be sampled to provide initial conditions for each trajectory. The Storing and sampling distributions page details the format the distributions must take.

Internally, the DifferentialEquations.jl ensemble infrastructure is used to handle per trajectory parallelism. The ensemble_algorithm keyword takes one of the EnsembleAlgorithms. To use these, you must first add using DiffEqBase to your script.

Example

To demonstrate usage of run_dynamics, let's investigate different ways to calculate the time-dependent population with FSSH.

First, we set up our system using one of Tully's simple models (John C. Tully (1990)).

using NQCDynamics
+    )

Run trajectories for timespan tspan sampling from distribution.

Keywords

  • output either a single function or a Tuple of functions with the signature f(sol, i) that takes the DifferentialEquations solution and returns the desired output quantity.
  • selection should be an AbstractVector containing the indices to sample from the distribution. By default, nothing leads to random sampling.
  • reduction defines how the data is reduced across trajectories. Options are AppendReduction(), MeanReduction(), SumReduction and FileReduction(filename).
  • ensemble_algorithm is the algorithm from DifferentialEquations which determines which form of parallelism is used.
  • algorithm is the algorithm used to integrate the equations of motion.
  • trajectories is the number of trajectories to perform.
  • kwargs... any additional keywords are passed to DifferentialEquations solve`.
source

This is the same function used to perform single trajectory simulations, but by replacing the single initial condition with a distribution and changing the number of trajectories it is possible to run an ensemble of trajectories. The distributions are defined such that they can be sampled to provide initial conditions for each trajectory. The Storing and sampling distributions page details the format the distributions must take.

Internally, the DifferentialEquations.jl ensemble infrastructure is used to handle per trajectory parallelism. The ensemble_algorithm keyword takes one of the EnsembleAlgorithms. To use these, you must first add using DiffEqBase to your script.

Example

To demonstrate usage of run_dynamics, let's investigate different ways to calculate the time-dependent population with FSSH.

First, we set up our system using one of Tully's simple models ([1]).

using NQCDynamics
 
 atoms = Atoms(2000)
 model = TullyModelOne()
@@ -19,9 +19,9 @@
 nuclear_distribution = DynamicalDistribution(v, r, (1,1)) # Combine position and velocity
 electronic_distribution = PureState(2) # Create nonequilibrium electronic distribution
 product_distribution = nuclear_distribution * electronic_distribution

In this case, we have used a deterministic momentum of $10$ a.u. and a gaussian position distribution with width 1 centered at $-8$ a.u.. The electronic variables will be sampled such that the initial population is confined to the second state by PureState(2).

The final step before running the dynamics is to decide how to output the results. The simplest option is to use the built-in tuple format familiar from run_dynamics.

ensemble = run_dynamics(sim, (0.0, 3000.0), product_distribution;
-    trajectories=20, output=OutputDiabaticPopulation)
[ Info: Sampling randomly from provided distribution.
-[ Info: Performing 20 trajectories.
-[ Info: Finished after 7.098802965 seconds.

This is equivalent to performing single trajectories in a loop and manually re-sampling the initial conditions each time. However, here we have been able to do this more concisely, using internal mechanisms for sampling from the product_distribution.

The output of this function is a vector containing the output from each trajectory. Each entry is equivalent to the output from a call to run_dynamics and can be plotted by iterating through ensemble.

using Plots
+    trajectories=20, output=OutputDiabaticPopulation)
[ Info: Sampling randomly from provided distribution.
+[ Info: Performing 20 trajectories.
+[ Info: Finished after 9.115576896 seconds.

This is equivalent to performing single trajectories in a loop and manually re-sampling the initial conditions each time. However, here we have been able to do this more concisely, using internal mechanisms for sampling from the product_distribution.

The output of this function is a vector containing the output from each trajectory. Each entry is equivalent to the output from a call to run_dynamics and can be plotted by iterating through ensemble.

using Plots
 
 p = plot(legend=false)
 for traj in ensemble
@@ -30,110 +30,110 @@
 p
- + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

This plot shows the population difference between the two states for each trajectory. To approximate the exact quantum dynamics for this model, the average over all trajectories should be computed. Instead of manually averaging the result, we can use reduction=MeanReduction() or reduction=SumReduction() which will reduce the data accordingly before outputting the result:

ensemble = run_dynamics(sim, (0.0, 3000.0), product_distribution;
     trajectories=20, output=OutputDiabaticPopulation, reduction=MeanReduction(), saveat=0.0:10.0:3000.0)
 plot(ensemble, :OutputDiabaticPopulation)
- + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + +
Note

Here we have also specified the saveat keyword to ensure the output is saved at the same points for every trajectory, otherwise the averaging will not work. This is necessary because we are using an integrator with adaptive timestepping that will save at different points for each trajectory.

This workflow can be applied for any of the quantities defined in the DynamicsOutputs submodule. If we want a more complex output, such as a scattering probability or a time-correlation function, we can provide a function to the output argument as described in the DifferentialEquations.jl documentation. The advantage of this approach is that memory can be saved by reducing the data as the trajectories accumulate, it also allows greater flexibility when modifying the output.

Inside the Ensembles submodule we define a few premade functions of this sort, but here we can demonstrate how to reformulate the previous simulation using the alternative format.

function output_function(sol, i)
     output = zeros(2,div(3000, 50) + 1)
@@ -146,4 +146,4 @@
 ensemble = run_dynamics(sim, (0.0, 3000.0), product_distribution;
     trajectories=20, output=output_function, reduction=MeanReduction(), saveat=50.0)
2-element Dictionaries.Dictionary{Symbol, Array{Float64}}
             :Time │ [0.0, 50.0, 100.0, 150.0, 200.0, 250.0, 300.0, 350.0, 400.0…
- :output_function │ [0.0 0.0 … 0.8 0.8; 1.0 1.0 … 0.2 0.2]

This function provides us the same output as above, but this gives us the flexibility to calculate any observable we want.

Throughout the documentation, ensemble simulations like this one are used to demonstrate many of the dynamics methods. Now that you have understood the contents of this page, all of the ensemble simulations will appear familiar.

+ :output_function │ [0.0 0.0 … 0.8 0.8; 1.0 1.0 … 0.2 0.2]

This function provides us the same output as above, but this gives us the flexibility to calculate any observable we want.

Throughout the documentation, ensemble simulations like this one are used to demonstrate many of the dynamics methods. Now that you have understood the contents of this page, all of the ensemble simulations will appear familiar.

diff --git a/dev/examples/reactive_scattering/index.html b/dev/examples/reactive_scattering/index.html index 8176ed655..8e46984f9 100644 --- a/dev/examples/reactive_scattering/index.html +++ b/dev/examples/reactive_scattering/index.html @@ -1,5 +1,5 @@ -Reactive scattering from a metal surface · NQCDynamics.jl

Reactive scattering from a metal surface

Our implementation allows us to simulate vibrational de-excitation probability during reactive scattering events at metal surfaces for any diatomic molecule with a suitable model to describe energies and forces (and friction coefficients for MDEF simulations). Here, we investigate the reactive scattering of hydrogen on a Ag(111) metal surface as a prototypical example.

To run this kind of simulation, a set of initial positions and velocities ($\mathbf{R}$ and $\mathbf{\dot{R}}$) with ro-vibrational quantum states $\nu$ and $j$ have to be generated (see EBK quantisation). With a specific ro-vibrational quantum state it is possible to compute different properties after molecular collision and energy transfer with the metal surface like the vibrational de-excitation probabilities discussed here.

In order to reproduce the state-to-state vibrational de-excitation probability results presented originally by Yaolong Zhang, Reinhard J. Maurer, Hua Guo, Bin Jiang (2019) for this system, the same initial conditions were generated with QuantisedDiatomic.generate_configurations setting the initial ro-vibrational quantum state to ($\nu=2, j=0$) as was explored in the original paper.

As shown earlier in the EBK documentation we are able to generate a semiclassically quantised distribution for a diatomic molecule on a collision course with a metal surface. In this example we follow the EBK example using the H2AgModel to prepare our initial distribution and run our simulation.

Specifically, we have produced a set of initial conditions with different translational energy (translational_energy keyword) ranging from 0.2 to 1.4 eV, locating the hydrogen molecule 8 Å away from the metal surface (height keyword) with a normal incidence.

Atomic units

As usual, all quantities default to atomic units. Here we use Unitful to input the translational energy and height using different units, where they are later converted internally.

using NQCDynamics
+Reactive scattering from a metal surface · NQCDynamics.jl

Reactive scattering from a metal surface

Our implementation allows us to simulate vibrational de-excitation probability during reactive scattering events at metal surfaces for any diatomic molecule with a suitable model to describe energies and forces (and friction coefficients for MDEF simulations). Here, we investigate the reactive scattering of hydrogen on a Ag(111) metal surface as a prototypical example.

To run this kind of simulation, a set of initial positions and velocities ($\mathbf{R}$ and $\mathbf{\dot{R}}$) with ro-vibrational quantum states $\nu$ and $j$ have to be generated (see EBK quantisation). With a specific ro-vibrational quantum state it is possible to compute different properties after molecular collision and energy transfer with the metal surface like the vibrational de-excitation probabilities discussed here.

In order to reproduce the state-to-state vibrational de-excitation probability results presented originally by [21] for this system, the same initial conditions were generated with QuantisedDiatomic.generate_configurations setting the initial ro-vibrational quantum state to ($\nu=2, j=0$) as was explored in the original paper.

As shown earlier in the EBK documentation we are able to generate a semiclassically quantised distribution for a diatomic molecule on a collision course with a metal surface. In this example we follow the EBK example using the H2AgModel to prepare our initial distribution and run our simulation.

Specifically, we have produced a set of initial conditions with different translational energy (translational_energy keyword) ranging from 0.2 to 1.4 eV, locating the hydrogen molecule 8 Å away from the metal surface (height keyword) with a normal incidence.

Atomic units

As usual, all quantities default to atomic units. Here we use Unitful to input the translational energy and height using different units, where they are later converted internally.

using NQCDynamics
 using NNInterfaces
 using Unitful
 using NQCDynamics.InitialConditions: QuantisedDiatomic
@@ -21,367 +21,367 @@
 r = last.(configurations)
 
 distribution = DynamicalDistribution(v, r, (3,2))
 read all parameters done
-                                       Binding curve
-                        +----------------------------------------+
-                    0.5 |                                        | Actual values
-                        |                                        | Fitted curve
-                        |    .                                   | 
-                        |    :                                   | 
-                        |    :                                   | 
-                        |    :.                                  | 
-                        |     :                                  | 
-   Energy / Hartree     |     :                                  | 
-                        |     :                                  | 
-                        |      :                       ....:'''''| 
-                        |      :                  ...'''         | 
-                        |      :.              .:''              | 
-                        |       :          ..:''                 | 
-                        |       ':       .:'                     | 
-                      0 |        ':....:'                        | 
-                        +----------------------------------------+
-                         0                                      5
+                                       Binding curve
+                        +----------------------------------------+
+                    0.5 |                                        | Actual values
+                        |                                        | Fitted curve
+                        |    .                                   |
+                        |    :                                   |
+                        |    :                                   |
+                        |    :.                                  |
+                        |     :                                  |
+   Energy / Hartree     |     :                                  |
+                        |     :                                  |
+                        |      :                       ....:'''''|
+                        |      :                  ...'''         |
+                        |      :.              .:''              |
+                        |       :          ..:''                 |
+                        |       ':       .:'                     |
+                      0 |        ':....:'                        |
+                        +----------------------------------------+
+                         0                                      5
                                     Bond length / bohr
-[ Info: The two lines shown above should closely match. This indicates the evaluation of the potential is working correctly.
-[ Info: Converging the total energy to match the chosen quantum numbers...
+[ Info: The two lines shown above should closely match. This indicates the evaluation of the potential is working correctly.
+[ Info: Converging the total energy to match the chosen quantum numbers...
 Iter     Function value   Gradient norm
      0     1.631625e-01     5.780057e+01
- * time: 0.01921391487121582
+ * time: 0.021018028259277344
      1     8.028443e-02     5.753928e+01
- * time: 0.4346139430999756
+ * time: 0.5214991569519043
      2     7.569671e-04     5.728559e+01
- * time: 0.43477511405944824
+ * time: 0.5216701030731201
      3     4.676433e-04     5.728941e+01
- * time: 0.43494200706481934
-[ Info: Generating distribution of bond lengths and radial momenta...
-Sampling   0%|                                          |  ETA: N/A
-Sampling   0%|▏                                         |  ETA: 0:00:04
-Sampling   1%|▎                                         |  ETA: 0:00:05
-Sampling   1%|▍                                         |  ETA: 0:00:04
-Sampling   1%|▌                                         |  ETA: 0:00:03
-Sampling   2%|▊                                         |  ETA: 0:00:02
-Sampling   2%|▉                                         |  ETA: 0:00:02
-Sampling   2%|█                                         |  ETA: 0:00:01
-Sampling   3%|█▏                                        |  ETA: 0:00:01
-Sampling   3%|█▎                                        |  ETA: 0:00:01
-Sampling   3%|█▍                                        |  ETA: 0:00:01
-Sampling   4%|█▌                                        |  ETA: 0:00:01
-Sampling   4%|█▋                                        |  ETA: 0:00:01
-Sampling   4%|█▉                                        |  ETA: 0:00:01
-Sampling   5%|██                                        |  ETA: 0:00:01
-Sampling   5%|██▏                                       |  ETA: 0:00:01
-Sampling   5%|██▎                                       |  ETA: 0:00:01
-Sampling   6%|██▍                                       |  ETA: 0:00:01
-Sampling   6%|██▌                                       |  ETA: 0:00:01
-Sampling   6%|██▋                                       |  ETA: 0:00:01
-Sampling   7%|██▊                                       |  ETA: 0:00:01
-Sampling   7%|███                                       |  ETA: 0:00:00
-Sampling   7%|███▏                                      |  ETA: 0:00:00
-Sampling   8%|███▎                                      |  ETA: 0:00:00
-Sampling   8%|███▍                                      |  ETA: 0:00:00
-Sampling   8%|███▌                                      |  ETA: 0:00:00
-Sampling   9%|███▋                                      |  ETA: 0:00:00
-Sampling   9%|███▊                                      |  ETA: 0:00:00
-Sampling   9%|███▉                                      |  ETA: 0:00:00
-Sampling  10%|████                                      |  ETA: 0:00:00
-Sampling  10%|████▎                                     |  ETA: 0:00:00
-Sampling  10%|████▍                                     |  ETA: 0:00:00
-Sampling  11%|████▌                                     |  ETA: 0:00:00
-Sampling  11%|████▋                                     |  ETA: 0:00:00
-Sampling  11%|████▊                                     |  ETA: 0:00:00
-Sampling  12%|████▉                                     |  ETA: 0:00:00
-Sampling  12%|█████                                     |  ETA: 0:00:00
-Sampling  12%|█████▏                                    |  ETA: 0:00:00
-Sampling  13%|█████▍                                    |  ETA: 0:00:00
-Sampling  13%|█████▌                                    |  ETA: 0:00:00
-Sampling  13%|█████▋                                    |  ETA: 0:00:00
-Sampling  14%|█████▊                                    |  ETA: 0:00:00
-Sampling  14%|█████▉                                    |  ETA: 0:00:00
-Sampling  14%|██████                                    |  ETA: 0:00:00
-Sampling  15%|██████▏                                   |  ETA: 0:00:00
-Sampling  15%|██████▎                                   |  ETA: 0:00:00
-Sampling  15%|██████▌                                   |  ETA: 0:00:00
-Sampling  16%|██████▋                                   |  ETA: 0:00:00
-Sampling  16%|██████▊                                   |  ETA: 0:00:00
-Sampling  16%|██████▉                                   |  ETA: 0:00:00
-Sampling  17%|███████                                   |  ETA: 0:00:00
-Sampling  17%|███████▏                                  |  ETA: 0:00:00
-Sampling  17%|███████▎                                  |  ETA: 0:00:00
-Sampling  18%|███████▍                                  |  ETA: 0:00:00
-Sampling  18%|███████▌                                  |  ETA: 0:00:00
-Sampling  18%|███████▊                                  |  ETA: 0:00:00
-Sampling  19%|███████▉                                  |  ETA: 0:00:00
-Sampling  19%|████████                                  |  ETA: 0:00:00
-Sampling  19%|████████▏                                 |  ETA: 0:00:00
-Sampling  20%|████████▎                                 |  ETA: 0:00:00
-Sampling  20%|████████▍                                 |  ETA: 0:00:00
-Sampling  20%|████████▌                                 |  ETA: 0:00:00
-Sampling  21%|████████▋                                 |  ETA: 0:00:00
-Sampling  21%|████████▉                                 |  ETA: 0:00:00
-Sampling  21%|█████████                                 |  ETA: 0:00:00
-Sampling  22%|█████████▏                                |  ETA: 0:00:00
-Sampling  22%|█████████▎                                |  ETA: 0:00:00
-Sampling  22%|█████████▍                                |  ETA: 0:00:00
-Sampling  23%|█████████▌                                |  ETA: 0:00:00
-Sampling  23%|█████████▋                                |  ETA: 0:00:00
-Sampling  23%|█████████▊                                |  ETA: 0:00:00
-Sampling  24%|██████████                                |  ETA: 0:00:00
-Sampling  24%|██████████▏                               |  ETA: 0:00:00
-Sampling  24%|██████████▎                               |  ETA: 0:00:00
-Sampling  25%|██████████▍                               |  ETA: 0:00:00
-Sampling  25%|██████████▌                               |  ETA: 0:00:00
-Sampling  25%|██████████▋                               |  ETA: 0:00:00
-Sampling  26%|██████████▊                               |  ETA: 0:00:00
-Sampling  26%|██████████▉                               |  ETA: 0:00:00
-Sampling  26%|███████████                               |  ETA: 0:00:00
-Sampling  27%|███████████▎                              |  ETA: 0:00:00
-Sampling  27%|███████████▍                              |  ETA: 0:00:00
-Sampling  27%|███████████▌                              |  ETA: 0:00:00
-Sampling  28%|███████████▋                              |  ETA: 0:00:00
-Sampling  28%|███████████▊                              |  ETA: 0:00:00
-Sampling  28%|███████████▉                              |  ETA: 0:00:00
-Sampling  29%|████████████                              |  ETA: 0:00:00
-Sampling  29%|████████████▏                             |  ETA: 0:00:00
-Sampling  29%|████████████▍                             |  ETA: 0:00:00
-Sampling  30%|████████████▌                             |  ETA: 0:00:00
-Sampling  30%|████████████▋                             |  ETA: 0:00:00
-Sampling  30%|████████████▊                             |  ETA: 0:00:00
-Sampling  31%|████████████▉                             |  ETA: 0:00:00
-Sampling  31%|█████████████                             |  ETA: 0:00:00
-Sampling  31%|█████████████▏                            |  ETA: 0:00:00
-Sampling  32%|█████████████▎                            |  ETA: 0:00:00
-Sampling  32%|█████████████▌                            |  ETA: 0:00:00
-Sampling  32%|█████████████▋                            |  ETA: 0:00:00
-Sampling  33%|█████████████▊                            |  ETA: 0:00:00
-Sampling  33%|█████████████▉                            |  ETA: 0:00:00
-Sampling  33%|██████████████                            |  ETA: 0:00:00
-Sampling  34%|██████████████▏                           |  ETA: 0:00:00
-Sampling  34%|██████████████▎                           |  ETA: 0:00:00
-Sampling  34%|██████████████▍                           |  ETA: 0:00:00
-Sampling  35%|██████████████▌                           |  ETA: 0:00:00
-Sampling  35%|██████████████▊                           |  ETA: 0:00:00
-Sampling  35%|██████████████▉                           |  ETA: 0:00:00
-Sampling  36%|███████████████                           |  ETA: 0:00:00
-Sampling  36%|███████████████▏                          |  ETA: 0:00:00
-Sampling  36%|███████████████▎                          |  ETA: 0:00:00
-Sampling  37%|███████████████▍                          |  ETA: 0:00:00
-Sampling  37%|███████████████▌                          |  ETA: 0:00:00
-Sampling  37%|███████████████▋                          |  ETA: 0:00:00
-Sampling  38%|███████████████▉                          |  ETA: 0:00:00
-Sampling  38%|████████████████                          |  ETA: 0:00:00
-Sampling  38%|████████████████▏                         |  ETA: 0:00:00
-Sampling  39%|████████████████▎                         |  ETA: 0:00:00
-Sampling  39%|████████████████▍                         |  ETA: 0:00:00
-Sampling  39%|████████████████▌                         |  ETA: 0:00:00
-Sampling  40%|████████████████▋                         |  ETA: 0:00:00
-Sampling  40%|████████████████▊                         |  ETA: 0:00:00
-Sampling  40%|█████████████████                         |  ETA: 0:00:00
-Sampling  41%|█████████████████▏                        |  ETA: 0:00:00
-Sampling  41%|█████████████████▎                        |  ETA: 0:00:00
-Sampling  41%|█████████████████▍                        |  ETA: 0:00:00
-Sampling  42%|█████████████████▌                        |  ETA: 0:00:00
-Sampling  42%|█████████████████▋                        |  ETA: 0:00:00
-Sampling  42%|█████████████████▊                        |  ETA: 0:00:00
-Sampling  43%|█████████████████▉                        |  ETA: 0:00:00
-Sampling  43%|██████████████████                        |  ETA: 0:00:00
-Sampling  43%|██████████████████▎                       |  ETA: 0:00:00
-Sampling  44%|██████████████████▍                       |  ETA: 0:00:00
-Sampling  44%|██████████████████▌                       |  ETA: 0:00:00
-Sampling  44%|██████████████████▋                       |  ETA: 0:00:00
-Sampling  45%|██████████████████▊                       |  ETA: 0:00:00
-Sampling  45%|██████████████████▉                       |  ETA: 0:00:00
-Sampling  45%|███████████████████                       |  ETA: 0:00:00
-Sampling  46%|███████████████████▏                      |  ETA: 0:00:00
-Sampling  46%|███████████████████▍                      |  ETA: 0:00:00
-Sampling  46%|███████████████████▌                      |  ETA: 0:00:00
-Sampling  47%|███████████████████▋                      |  ETA: 0:00:00
-Sampling  47%|███████████████████▊                      |  ETA: 0:00:00
-Sampling  47%|███████████████████▉                      |  ETA: 0:00:00
-Sampling  48%|████████████████████                      |  ETA: 0:00:00
-Sampling  48%|████████████████████▏                     |  ETA: 0:00:00
-Sampling  48%|████████████████████▎                     |  ETA: 0:00:00
-Sampling  49%|████████████████████▌                     |  ETA: 0:00:00
-Sampling  49%|████████████████████▋                     |  ETA: 0:00:00
-Sampling  49%|████████████████████▊                     |  ETA: 0:00:00
-Sampling  50%|████████████████████▉                     |  ETA: 0:00:00
-Sampling  50%|█████████████████████                     |  ETA: 0:00:00
-Sampling  50%|█████████████████████▏                    |  ETA: 0:00:00
-Sampling  51%|█████████████████████▎                    |  ETA: 0:00:00
-Sampling  51%|█████████████████████▍                    |  ETA: 0:00:00
-Sampling  51%|█████████████████████▌                    |  ETA: 0:00:00
-Sampling  52%|█████████████████████▊                    |  ETA: 0:00:00
-Sampling  52%|█████████████████████▉                    |  ETA: 0:00:00
-Sampling  52%|██████████████████████                    |  ETA: 0:00:00
-Sampling  53%|██████████████████████▏                   |  ETA: 0:00:00
-Sampling  53%|██████████████████████▎                   |  ETA: 0:00:00
-Sampling  53%|██████████████████████▍                   |  ETA: 0:00:00
-Sampling  54%|██████████████████████▌                   |  ETA: 0:00:00
-Sampling  54%|██████████████████████▋                   |  ETA: 0:00:00
-Sampling  54%|██████████████████████▉                   |  ETA: 0:00:00
-Sampling  55%|███████████████████████                   |  ETA: 0:00:00
-Sampling  55%|███████████████████████▏                  |  ETA: 0:00:00
-Sampling  55%|███████████████████████▎                  |  ETA: 0:00:00
-Sampling  56%|███████████████████████▍                  |  ETA: 0:00:00
-Sampling  56%|███████████████████████▌                  |  ETA: 0:00:00
-Sampling  56%|███████████████████████▋                  |  ETA: 0:00:00
-Sampling  57%|███████████████████████▊                  |  ETA: 0:00:00
-Sampling  57%|████████████████████████                  |  ETA: 0:00:00
-Sampling  57%|████████████████████████▏                 |  ETA: 0:00:00
-Sampling  58%|████████████████████████▎                 |  ETA: 0:00:00
-Sampling  58%|████████████████████████▍                 |  ETA: 0:00:00
-Sampling  58%|████████████████████████▌                 |  ETA: 0:00:00
-Sampling  59%|████████████████████████▋                 |  ETA: 0:00:00
-Sampling  59%|████████████████████████▊                 |  ETA: 0:00:00
-Sampling  59%|████████████████████████▉                 |  ETA: 0:00:00
-Sampling  60%|█████████████████████████                 |  ETA: 0:00:00
-Sampling  60%|█████████████████████████▎                |  ETA: 0:00:00
-Sampling  60%|█████████████████████████▍                |  ETA: 0:00:00
-Sampling  61%|█████████████████████████▌                |  ETA: 0:00:00
-Sampling  61%|█████████████████████████▋                |  ETA: 0:00:00
-Sampling  61%|█████████████████████████▊                |  ETA: 0:00:00
-Sampling  62%|█████████████████████████▉                |  ETA: 0:00:00
-Sampling  62%|██████████████████████████                |  ETA: 0:00:00
-Sampling  62%|██████████████████████████▏               |  ETA: 0:00:00
-Sampling  63%|██████████████████████████▍               |  ETA: 0:00:00
-Sampling  63%|██████████████████████████▌               |  ETA: 0:00:00
-Sampling  63%|██████████████████████████▋               |  ETA: 0:00:00
-Sampling  64%|██████████████████████████▊               |  ETA: 0:00:00
-Sampling  64%|██████████████████████████▉               |  ETA: 0:00:00
-Sampling  64%|███████████████████████████               |  ETA: 0:00:00
-Sampling  65%|███████████████████████████▏              |  ETA: 0:00:00
-Sampling  65%|███████████████████████████▎              |  ETA: 0:00:00
-Sampling  65%|███████████████████████████▌              |  ETA: 0:00:00
-Sampling  66%|███████████████████████████▋              |  ETA: 0:00:00
-Sampling  66%|███████████████████████████▊              |  ETA: 0:00:00
-Sampling  66%|███████████████████████████▉              |  ETA: 0:00:00
-Sampling  67%|████████████████████████████              |  ETA: 0:00:00
-Sampling  67%|████████████████████████████▏             |  ETA: 0:00:00
-Sampling  67%|████████████████████████████▎             |  ETA: 0:00:00
-Sampling  68%|████████████████████████████▍             |  ETA: 0:00:00
-Sampling  68%|████████████████████████████▌             |  ETA: 0:00:00
-Sampling  68%|████████████████████████████▊             |  ETA: 0:00:00
-Sampling  69%|████████████████████████████▉             |  ETA: 0:00:00
-Sampling  69%|█████████████████████████████             |  ETA: 0:00:00
-Sampling  69%|█████████████████████████████▏            |  ETA: 0:00:00
-Sampling  70%|█████████████████████████████▎            |  ETA: 0:00:00
-Sampling  70%|█████████████████████████████▍            |  ETA: 0:00:00
-Sampling  70%|█████████████████████████████▌            |  ETA: 0:00:00
-Sampling  71%|█████████████████████████████▋            |  ETA: 0:00:00
-Sampling  71%|█████████████████████████████▉            |  ETA: 0:00:00
-Sampling  71%|██████████████████████████████            |  ETA: 0:00:00
-Sampling  72%|██████████████████████████████▏           |  ETA: 0:00:00
-Sampling  72%|██████████████████████████████▎           |  ETA: 0:00:00
-Sampling  72%|██████████████████████████████▍           |  ETA: 0:00:00
-Sampling  73%|██████████████████████████████▌           |  ETA: 0:00:00
-Sampling  73%|██████████████████████████████▋           |  ETA: 0:00:00
-Sampling  73%|██████████████████████████████▊           |  ETA: 0:00:00
-Sampling  74%|███████████████████████████████           |  ETA: 0:00:00
-Sampling  74%|███████████████████████████████▏          |  ETA: 0:00:00
-Sampling  74%|███████████████████████████████▎          |  ETA: 0:00:00
-Sampling  75%|███████████████████████████████▍          |  ETA: 0:00:00
-Sampling  75%|███████████████████████████████▌          |  ETA: 0:00:00
-Sampling  75%|███████████████████████████████▋          |  ETA: 0:00:00
-Sampling  76%|███████████████████████████████▊          |  ETA: 0:00:00
-Sampling  76%|███████████████████████████████▉          |  ETA: 0:00:00
-Sampling  76%|████████████████████████████████          |  ETA: 0:00:00
-Sampling  77%|████████████████████████████████▎         |  ETA: 0:00:00
-Sampling  77%|████████████████████████████████▍         |  ETA: 0:00:00
-Sampling  77%|████████████████████████████████▌         |  ETA: 0:00:00
-Sampling  78%|████████████████████████████████▋         |  ETA: 0:00:00
-Sampling  78%|████████████████████████████████▊         |  ETA: 0:00:00
-Sampling  78%|████████████████████████████████▉         |  ETA: 0:00:00
-Sampling  79%|█████████████████████████████████         |  ETA: 0:00:00
-Sampling  79%|█████████████████████████████████▏        |  ETA: 0:00:00
-Sampling  79%|█████████████████████████████████▍        |  ETA: 0:00:00
-Sampling  80%|█████████████████████████████████▌        |  ETA: 0:00:00
-Sampling  80%|█████████████████████████████████▋        |  ETA: 0:00:00
-Sampling  80%|█████████████████████████████████▊        |  ETA: 0:00:00
-Sampling  81%|█████████████████████████████████▉        |  ETA: 0:00:00
-Sampling  81%|██████████████████████████████████        |  ETA: 0:00:00
-Sampling  81%|██████████████████████████████████▏       |  ETA: 0:00:00
-Sampling  82%|██████████████████████████████████▎       |  ETA: 0:00:00
-Sampling  82%|██████████████████████████████████▌       |  ETA: 0:00:00
-Sampling  82%|██████████████████████████████████▋       |  ETA: 0:00:00
-Sampling  83%|██████████████████████████████████▊       |  ETA: 0:00:00
-Sampling  83%|██████████████████████████████████▉       |  ETA: 0:00:00
-Sampling  83%|███████████████████████████████████       |  ETA: 0:00:00
-Sampling  84%|███████████████████████████████████▏      |  ETA: 0:00:00
-Sampling  84%|███████████████████████████████████▎      |  ETA: 0:00:00
-Sampling  84%|███████████████████████████████████▍      |  ETA: 0:00:00
-Sampling  85%|███████████████████████████████████▌      |  ETA: 0:00:00
-Sampling  85%|███████████████████████████████████▊      |  ETA: 0:00:00
-Sampling  85%|███████████████████████████████████▉      |  ETA: 0:00:00
-Sampling  86%|████████████████████████████████████      |  ETA: 0:00:00
-Sampling  86%|████████████████████████████████████▏     |  ETA: 0:00:00
-Sampling  86%|████████████████████████████████████▎     |  ETA: 0:00:00
-Sampling  87%|████████████████████████████████████▍     |  ETA: 0:00:00
-Sampling  87%|████████████████████████████████████▌     |  ETA: 0:00:00
-Sampling  87%|████████████████████████████████████▋     |  ETA: 0:00:00
-Sampling  88%|████████████████████████████████████▉     |  ETA: 0:00:00
-Sampling  88%|█████████████████████████████████████     |  ETA: 0:00:00
-Sampling  88%|█████████████████████████████████████▏    |  ETA: 0:00:00
-Sampling  89%|█████████████████████████████████████▎    |  ETA: 0:00:00
-Sampling  89%|█████████████████████████████████████▍    |  ETA: 0:00:00
-Sampling  89%|█████████████████████████████████████▌    |  ETA: 0:00:00
-Sampling  90%|█████████████████████████████████████▋    |  ETA: 0:00:00
-Sampling  90%|█████████████████████████████████████▊    |  ETA: 0:00:00
-Sampling  90%|██████████████████████████████████████    |  ETA: 0:00:00
-Sampling  91%|██████████████████████████████████████▏   |  ETA: 0:00:00
-Sampling  91%|██████████████████████████████████████▎   |  ETA: 0:00:00
-Sampling  91%|██████████████████████████████████████▍   |  ETA: 0:00:00
-Sampling  92%|██████████████████████████████████████▌   |  ETA: 0:00:00
-Sampling  92%|██████████████████████████████████████▋   |  ETA: 0:00:00
-Sampling  92%|██████████████████████████████████████▊   |  ETA: 0:00:00
-Sampling  93%|██████████████████████████████████████▉   |  ETA: 0:00:00
-Sampling  93%|███████████████████████████████████████   |  ETA: 0:00:00
-Sampling  93%|███████████████████████████████████████▎  |  ETA: 0:00:00
-Sampling  94%|███████████████████████████████████████▍  |  ETA: 0:00:00
-Sampling  94%|███████████████████████████████████████▌  |  ETA: 0:00:00
-Sampling  94%|███████████████████████████████████████▋  |  ETA: 0:00:00
-Sampling  95%|███████████████████████████████████████▊  |  ETA: 0:00:00
-Sampling  95%|███████████████████████████████████████▉  |  ETA: 0:00:00
-Sampling  95%|████████████████████████████████████████  |  ETA: 0:00:00
-Sampling  96%|████████████████████████████████████████▏ |  ETA: 0:00:00
-Sampling  96%|████████████████████████████████████████▍ |  ETA: 0:00:00
-Sampling  96%|████████████████████████████████████████▌ |  ETA: 0:00:00
-Sampling  97%|████████████████████████████████████████▋ |  ETA: 0:00:00
-Sampling  97%|████████████████████████████████████████▊ |  ETA: 0:00:00
-Sampling  97%|████████████████████████████████████████▉ |  ETA: 0:00:00
-Sampling  98%|█████████████████████████████████████████ |  ETA: 0:00:00
-Sampling  98%|█████████████████████████████████████████▏|  ETA: 0:00:00
-Sampling  98%|█████████████████████████████████████████▎|  ETA: 0:00:00
-Sampling  99%|█████████████████████████████████████████▌|  ETA: 0:00:00
-Sampling  99%|█████████████████████████████████████████▋|  ETA: 0:00:00
-Sampling  99%|█████████████████████████████████████████▊|  ETA: 0:00:00
-Sampling 100%|█████████████████████████████████████████▉|  ETA: 0:00:00
-Sampling 100%|██████████████████████████████████████████| Time: 0:00:00
-Sampling 100%|██████████████████████████████████████████| Time: 0:00:00
-                       Bond length distribution
-              +----------------------------------------+
-   [1.0, 1.2) |███████████████████████████████▎ 59     | 
-   [1.2, 1.4) |██████████████▍ 27                      | 
-   [1.4, 1.6) |████████████████████▋ 39                | 
-   [1.6, 1.8) |█████████████████████▎ 40               | 
-   [1.8, 2.0) |████████████████████████████████████  68| 
-   [2.0, 2.2) |███████████████████████████████████▌ 67 | 
-              +----------------------------------------+
+ * time: 0.5218861103057861
+[ Info: Generating distribution of bond lengths and radial momenta...
+Sampling   0%|                                          |  ETA: N/A
+Sampling   0%|▏                                         |  ETA: 0:00:05
+Sampling   1%|▎                                         |  ETA: 0:00:06
+Sampling   1%|▍                                         |  ETA: 0:00:04
+Sampling   1%|▌                                         |  ETA: 0:00:03
+Sampling   2%|▊                                         |  ETA: 0:00:02
+Sampling   2%|▉                                         |  ETA: 0:00:02
+Sampling   2%|█                                         |  ETA: 0:00:02
+Sampling   3%|█▏                                        |  ETA: 0:00:02
+Sampling   3%|█▎                                        |  ETA: 0:00:01
+Sampling   3%|█▍                                        |  ETA: 0:00:01
+Sampling   4%|█▌                                        |  ETA: 0:00:01
+Sampling   4%|█▋                                        |  ETA: 0:00:01
+Sampling   4%|█▉                                        |  ETA: 0:00:01
+Sampling   5%|██                                        |  ETA: 0:00:01
+Sampling   5%|██▏                                       |  ETA: 0:00:01
+Sampling   5%|██▎                                       |  ETA: 0:00:01
+Sampling   6%|██▍                                       |  ETA: 0:00:01
+Sampling   6%|██▌                                       |  ETA: 0:00:01
+Sampling   6%|██▋                                       |  ETA: 0:00:01
+Sampling   7%|██▊                                       |  ETA: 0:00:01
+Sampling   7%|███                                       |  ETA: 0:00:01
+Sampling   7%|███▏                                      |  ETA: 0:00:01
+Sampling   8%|███▎                                      |  ETA: 0:00:01
+Sampling   8%|███▍                                      |  ETA: 0:00:00
+Sampling   8%|███▌                                      |  ETA: 0:00:00
+Sampling   9%|███▋                                      |  ETA: 0:00:00
+Sampling   9%|███▊                                      |  ETA: 0:00:00
+Sampling   9%|███▉                                      |  ETA: 0:00:00
+Sampling  10%|████                                      |  ETA: 0:00:00
+Sampling  10%|████▎                                     |  ETA: 0:00:00
+Sampling  10%|████▍                                     |  ETA: 0:00:00
+Sampling  11%|████▌                                     |  ETA: 0:00:00
+Sampling  11%|████▋                                     |  ETA: 0:00:00
+Sampling  11%|████▊                                     |  ETA: 0:00:00
+Sampling  12%|████▉                                     |  ETA: 0:00:00
+Sampling  12%|█████                                     |  ETA: 0:00:00
+Sampling  12%|█████▏                                    |  ETA: 0:00:00
+Sampling  13%|█████▍                                    |  ETA: 0:00:00
+Sampling  13%|█████▌                                    |  ETA: 0:00:00
+Sampling  13%|█████▋                                    |  ETA: 0:00:00
+Sampling  14%|█████▊                                    |  ETA: 0:00:00
+Sampling  14%|█████▉                                    |  ETA: 0:00:00
+Sampling  14%|██████                                    |  ETA: 0:00:00
+Sampling  15%|██████▏                                   |  ETA: 0:00:00
+Sampling  15%|██████▎                                   |  ETA: 0:00:00
+Sampling  15%|██████▌                                   |  ETA: 0:00:00
+Sampling  16%|██████▋                                   |  ETA: 0:00:00
+Sampling  16%|██████▊                                   |  ETA: 0:00:00
+Sampling  16%|██████▉                                   |  ETA: 0:00:00
+Sampling  17%|███████                                   |  ETA: 0:00:00
+Sampling  17%|███████▏                                  |  ETA: 0:00:00
+Sampling  17%|███████▎                                  |  ETA: 0:00:00
+Sampling  18%|███████▍                                  |  ETA: 0:00:00
+Sampling  18%|███████▌                                  |  ETA: 0:00:00
+Sampling  18%|███████▊                                  |  ETA: 0:00:00
+Sampling  19%|███████▉                                  |  ETA: 0:00:00
+Sampling  19%|████████                                  |  ETA: 0:00:00
+Sampling  19%|████████▏                                 |  ETA: 0:00:00
+Sampling  20%|████████▎                                 |  ETA: 0:00:00
+Sampling  20%|████████▍                                 |  ETA: 0:00:00
+Sampling  20%|████████▌                                 |  ETA: 0:00:00
+Sampling  21%|████████▋                                 |  ETA: 0:00:00
+Sampling  21%|████████▉                                 |  ETA: 0:00:00
+Sampling  21%|█████████                                 |  ETA: 0:00:00
+Sampling  22%|█████████▏                                |  ETA: 0:00:00
+Sampling  22%|█████████▎                                |  ETA: 0:00:00
+Sampling  22%|█████████▍                                |  ETA: 0:00:00
+Sampling  23%|█████████▌                                |  ETA: 0:00:00
+Sampling  23%|█████████▋                                |  ETA: 0:00:00
+Sampling  23%|█████████▊                                |  ETA: 0:00:00
+Sampling  24%|██████████                                |  ETA: 0:00:00
+Sampling  24%|██████████▏                               |  ETA: 0:00:00
+Sampling  24%|██████████▎                               |  ETA: 0:00:00
+Sampling  25%|██████████▍                               |  ETA: 0:00:00
+Sampling  25%|██████████▌                               |  ETA: 0:00:00
+Sampling  25%|██████████▋                               |  ETA: 0:00:00
+Sampling  26%|██████████▊                               |  ETA: 0:00:00
+Sampling  26%|██████████▉                               |  ETA: 0:00:00
+Sampling  26%|███████████                               |  ETA: 0:00:00
+Sampling  27%|███████████▎                              |  ETA: 0:00:00
+Sampling  27%|███████████▍                              |  ETA: 0:00:00
+Sampling  27%|███████████▌                              |  ETA: 0:00:00
+Sampling  28%|███████████▋                              |  ETA: 0:00:00
+Sampling  28%|███████████▊                              |  ETA: 0:00:00
+Sampling  28%|███████████▉                              |  ETA: 0:00:00
+Sampling  29%|████████████                              |  ETA: 0:00:00
+Sampling  29%|████████████▏                             |  ETA: 0:00:00
+Sampling  29%|████████████▍                             |  ETA: 0:00:00
+Sampling  30%|████████████▌                             |  ETA: 0:00:00
+Sampling  30%|████████████▋                             |  ETA: 0:00:00
+Sampling  30%|████████████▊                             |  ETA: 0:00:00
+Sampling  31%|████████████▉                             |  ETA: 0:00:00
+Sampling  31%|█████████████                             |  ETA: 0:00:00
+Sampling  31%|█████████████▏                            |  ETA: 0:00:00
+Sampling  32%|█████████████▎                            |  ETA: 0:00:00
+Sampling  32%|█████████████▌                            |  ETA: 0:00:00
+Sampling  32%|█████████████▋                            |  ETA: 0:00:00
+Sampling  33%|█████████████▊                            |  ETA: 0:00:00
+Sampling  33%|█████████████▉                            |  ETA: 0:00:00
+Sampling  33%|██████████████                            |  ETA: 0:00:00
+Sampling  34%|██████████████▏                           |  ETA: 0:00:00
+Sampling  34%|██████████████▎                           |  ETA: 0:00:00
+Sampling  34%|██████████████▍                           |  ETA: 0:00:00
+Sampling  35%|██████████████▌                           |  ETA: 0:00:00
+Sampling  35%|██████████████▊                           |  ETA: 0:00:00
+Sampling  35%|██████████████▉                           |  ETA: 0:00:00
+Sampling  36%|███████████████                           |  ETA: 0:00:00
+Sampling  36%|███████████████▏                          |  ETA: 0:00:00
+Sampling  36%|███████████████▎                          |  ETA: 0:00:00
+Sampling  37%|███████████████▍                          |  ETA: 0:00:00
+Sampling  37%|███████████████▌                          |  ETA: 0:00:00
+Sampling  37%|███████████████▋                          |  ETA: 0:00:00
+Sampling  38%|███████████████▉                          |  ETA: 0:00:00
+Sampling  38%|████████████████                          |  ETA: 0:00:00
+Sampling  38%|████████████████▏                         |  ETA: 0:00:00
+Sampling  39%|████████████████▎                         |  ETA: 0:00:00
+Sampling  39%|████████████████▍                         |  ETA: 0:00:00
+Sampling  39%|████████████████▌                         |  ETA: 0:00:00
+Sampling  40%|████████████████▋                         |  ETA: 0:00:00
+Sampling  40%|████████████████▊                         |  ETA: 0:00:00
+Sampling  40%|█████████████████                         |  ETA: 0:00:00
+Sampling  41%|█████████████████▏                        |  ETA: 0:00:00
+Sampling  41%|█████████████████▎                        |  ETA: 0:00:00
+Sampling  41%|█████████████████▍                        |  ETA: 0:00:00
+Sampling  42%|█████████████████▌                        |  ETA: 0:00:00
+Sampling  42%|█████████████████▋                        |  ETA: 0:00:00
+Sampling  42%|█████████████████▊                        |  ETA: 0:00:00
+Sampling  43%|█████████████████▉                        |  ETA: 0:00:00
+Sampling  43%|██████████████████                        |  ETA: 0:00:00
+Sampling  43%|██████████████████▎                       |  ETA: 0:00:00
+Sampling  44%|██████████████████▍                       |  ETA: 0:00:00
+Sampling  44%|██████████████████▌                       |  ETA: 0:00:00
+Sampling  44%|██████████████████▋                       |  ETA: 0:00:00
+Sampling  45%|██████████████████▊                       |  ETA: 0:00:00
+Sampling  45%|██████████████████▉                       |  ETA: 0:00:00
+Sampling  45%|███████████████████                       |  ETA: 0:00:00
+Sampling  46%|███████████████████▏                      |  ETA: 0:00:00
+Sampling  46%|███████████████████▍                      |  ETA: 0:00:00
+Sampling  46%|███████████████████▌                      |  ETA: 0:00:00
+Sampling  47%|███████████████████▋                      |  ETA: 0:00:00
+Sampling  47%|███████████████████▊                      |  ETA: 0:00:00
+Sampling  47%|███████████████████▉                      |  ETA: 0:00:00
+Sampling  48%|████████████████████                      |  ETA: 0:00:00
+Sampling  48%|████████████████████▏                     |  ETA: 0:00:00
+Sampling  48%|████████████████████▎                     |  ETA: 0:00:00
+Sampling  49%|████████████████████▌                     |  ETA: 0:00:00
+Sampling  49%|████████████████████▋                     |  ETA: 0:00:00
+Sampling  49%|████████████████████▊                     |  ETA: 0:00:00
+Sampling  50%|████████████████████▉                     |  ETA: 0:00:00
+Sampling  50%|█████████████████████                     |  ETA: 0:00:00
+Sampling  50%|█████████████████████▏                    |  ETA: 0:00:00
+Sampling  51%|█████████████████████▎                    |  ETA: 0:00:00
+Sampling  51%|█████████████████████▍                    |  ETA: 0:00:00
+Sampling  51%|█████████████████████▌                    |  ETA: 0:00:00
+Sampling  52%|█████████████████████▊                    |  ETA: 0:00:00
+Sampling  52%|█████████████████████▉                    |  ETA: 0:00:00
+Sampling  52%|██████████████████████                    |  ETA: 0:00:00
+Sampling  53%|██████████████████████▏                   |  ETA: 0:00:00
+Sampling  53%|██████████████████████▎                   |  ETA: 0:00:00
+Sampling  53%|██████████████████████▍                   |  ETA: 0:00:00
+Sampling  54%|██████████████████████▌                   |  ETA: 0:00:00
+Sampling  54%|██████████████████████▋                   |  ETA: 0:00:00
+Sampling  54%|██████████████████████▉                   |  ETA: 0:00:00
+Sampling  55%|███████████████████████                   |  ETA: 0:00:00
+Sampling  55%|███████████████████████▏                  |  ETA: 0:00:00
+Sampling  55%|███████████████████████▎                  |  ETA: 0:00:00
+Sampling  56%|███████████████████████▍                  |  ETA: 0:00:00
+Sampling  56%|███████████████████████▌                  |  ETA: 0:00:00
+Sampling  56%|███████████████████████▋                  |  ETA: 0:00:00
+Sampling  57%|███████████████████████▊                  |  ETA: 0:00:00
+Sampling  57%|████████████████████████                  |  ETA: 0:00:00
+Sampling  57%|████████████████████████▏                 |  ETA: 0:00:00
+Sampling  58%|████████████████████████▎                 |  ETA: 0:00:00
+Sampling  58%|████████████████████████▍                 |  ETA: 0:00:00
+Sampling  58%|████████████████████████▌                 |  ETA: 0:00:00
+Sampling  59%|████████████████████████▋                 |  ETA: 0:00:00
+Sampling  59%|████████████████████████▊                 |  ETA: 0:00:00
+Sampling  59%|████████████████████████▉                 |  ETA: 0:00:00
+Sampling  60%|█████████████████████████                 |  ETA: 0:00:00
+Sampling  60%|█████████████████████████▎                |  ETA: 0:00:00
+Sampling  60%|█████████████████████████▍                |  ETA: 0:00:00
+Sampling  61%|█████████████████████████▌                |  ETA: 0:00:00
+Sampling  61%|█████████████████████████▋                |  ETA: 0:00:00
+Sampling  61%|█████████████████████████▊                |  ETA: 0:00:00
+Sampling  62%|█████████████████████████▉                |  ETA: 0:00:00
+Sampling  62%|██████████████████████████                |  ETA: 0:00:00
+Sampling  62%|██████████████████████████▏               |  ETA: 0:00:00
+Sampling  63%|██████████████████████████▍               |  ETA: 0:00:00
+Sampling  63%|██████████████████████████▌               |  ETA: 0:00:00
+Sampling  63%|██████████████████████████▋               |  ETA: 0:00:00
+Sampling  64%|██████████████████████████▊               |  ETA: 0:00:00
+Sampling  64%|██████████████████████████▉               |  ETA: 0:00:00
+Sampling  64%|███████████████████████████               |  ETA: 0:00:00
+Sampling  65%|███████████████████████████▏              |  ETA: 0:00:00
+Sampling  65%|███████████████████████████▎              |  ETA: 0:00:00
+Sampling  65%|███████████████████████████▌              |  ETA: 0:00:00
+Sampling  66%|███████████████████████████▋              |  ETA: 0:00:00
+Sampling  66%|███████████████████████████▊              |  ETA: 0:00:00
+Sampling  66%|███████████████████████████▉              |  ETA: 0:00:00
+Sampling  67%|████████████████████████████              |  ETA: 0:00:00
+Sampling  67%|████████████████████████████▏             |  ETA: 0:00:00
+Sampling  67%|████████████████████████████▎             |  ETA: 0:00:00
+Sampling  68%|████████████████████████████▍             |  ETA: 0:00:00
+Sampling  68%|████████████████████████████▌             |  ETA: 0:00:00
+Sampling  68%|████████████████████████████▊             |  ETA: 0:00:00
+Sampling  69%|████████████████████████████▉             |  ETA: 0:00:00
+Sampling  69%|█████████████████████████████             |  ETA: 0:00:00
+Sampling  69%|█████████████████████████████▏            |  ETA: 0:00:00
+Sampling  70%|█████████████████████████████▎            |  ETA: 0:00:00
+Sampling  70%|█████████████████████████████▍            |  ETA: 0:00:00
+Sampling  70%|█████████████████████████████▌            |  ETA: 0:00:00
+Sampling  71%|█████████████████████████████▋            |  ETA: 0:00:00
+Sampling  71%|█████████████████████████████▉            |  ETA: 0:00:00
+Sampling  71%|██████████████████████████████            |  ETA: 0:00:00
+Sampling  72%|██████████████████████████████▏           |  ETA: 0:00:00
+Sampling  72%|██████████████████████████████▎           |  ETA: 0:00:00
+Sampling  72%|██████████████████████████████▍           |  ETA: 0:00:00
+Sampling  73%|██████████████████████████████▌           |  ETA: 0:00:00
+Sampling  73%|██████████████████████████████▋           |  ETA: 0:00:00
+Sampling  73%|██████████████████████████████▊           |  ETA: 0:00:00
+Sampling  74%|███████████████████████████████           |  ETA: 0:00:00
+Sampling  74%|███████████████████████████████▏          |  ETA: 0:00:00
+Sampling  74%|███████████████████████████████▎          |  ETA: 0:00:00
+Sampling  75%|███████████████████████████████▍          |  ETA: 0:00:00
+Sampling  75%|███████████████████████████████▌          |  ETA: 0:00:00
+Sampling  75%|███████████████████████████████▋          |  ETA: 0:00:00
+Sampling  76%|███████████████████████████████▊          |  ETA: 0:00:00
+Sampling  76%|███████████████████████████████▉          |  ETA: 0:00:00
+Sampling  76%|████████████████████████████████          |  ETA: 0:00:00
+Sampling  77%|████████████████████████████████▎         |  ETA: 0:00:00
+Sampling  77%|████████████████████████████████▍         |  ETA: 0:00:00
+Sampling  77%|████████████████████████████████▌         |  ETA: 0:00:00
+Sampling  78%|████████████████████████████████▋         |  ETA: 0:00:00
+Sampling  78%|████████████████████████████████▊         |  ETA: 0:00:00
+Sampling  78%|████████████████████████████████▉         |  ETA: 0:00:00
+Sampling  79%|█████████████████████████████████         |  ETA: 0:00:00
+Sampling  79%|█████████████████████████████████▏        |  ETA: 0:00:00
+Sampling  79%|█████████████████████████████████▍        |  ETA: 0:00:00
+Sampling  80%|█████████████████████████████████▌        |  ETA: 0:00:00
+Sampling  80%|█████████████████████████████████▋        |  ETA: 0:00:00
+Sampling  80%|█████████████████████████████████▊        |  ETA: 0:00:00
+Sampling  81%|█████████████████████████████████▉        |  ETA: 0:00:00
+Sampling  81%|██████████████████████████████████        |  ETA: 0:00:00
+Sampling  81%|██████████████████████████████████▏       |  ETA: 0:00:00
+Sampling  82%|██████████████████████████████████▎       |  ETA: 0:00:00
+Sampling  82%|██████████████████████████████████▌       |  ETA: 0:00:00
+Sampling  82%|██████████████████████████████████▋       |  ETA: 0:00:00
+Sampling  83%|██████████████████████████████████▊       |  ETA: 0:00:00
+Sampling  83%|██████████████████████████████████▉       |  ETA: 0:00:00
+Sampling  83%|███████████████████████████████████       |  ETA: 0:00:00
+Sampling  84%|███████████████████████████████████▏      |  ETA: 0:00:00
+Sampling  84%|███████████████████████████████████▎      |  ETA: 0:00:00
+Sampling  84%|███████████████████████████████████▍      |  ETA: 0:00:00
+Sampling  85%|███████████████████████████████████▌      |  ETA: 0:00:00
+Sampling  85%|███████████████████████████████████▊      |  ETA: 0:00:00
+Sampling  85%|███████████████████████████████████▉      |  ETA: 0:00:00
+Sampling  86%|████████████████████████████████████      |  ETA: 0:00:00
+Sampling  86%|████████████████████████████████████▏     |  ETA: 0:00:00
+Sampling  86%|████████████████████████████████████▎     |  ETA: 0:00:00
+Sampling  87%|████████████████████████████████████▍     |  ETA: 0:00:00
+Sampling  87%|████████████████████████████████████▌     |  ETA: 0:00:00
+Sampling  87%|████████████████████████████████████▋     |  ETA: 0:00:00
+Sampling  88%|████████████████████████████████████▉     |  ETA: 0:00:00
+Sampling  88%|█████████████████████████████████████     |  ETA: 0:00:00
+Sampling  88%|█████████████████████████████████████▏    |  ETA: 0:00:00
+Sampling  89%|█████████████████████████████████████▎    |  ETA: 0:00:00
+Sampling  89%|█████████████████████████████████████▍    |  ETA: 0:00:00
+Sampling  89%|█████████████████████████████████████▌    |  ETA: 0:00:00
+Sampling  90%|█████████████████████████████████████▋    |  ETA: 0:00:00
+Sampling  90%|█████████████████████████████████████▊    |  ETA: 0:00:00
+Sampling  90%|██████████████████████████████████████    |  ETA: 0:00:00
+Sampling  91%|██████████████████████████████████████▏   |  ETA: 0:00:00
+Sampling  91%|██████████████████████████████████████▎   |  ETA: 0:00:00
+Sampling  91%|██████████████████████████████████████▍   |  ETA: 0:00:00
+Sampling  92%|██████████████████████████████████████▌   |  ETA: 0:00:00
+Sampling  92%|██████████████████████████████████████▋   |  ETA: 0:00:00
+Sampling  92%|██████████████████████████████████████▊   |  ETA: 0:00:00
+Sampling  93%|██████████████████████████████████████▉   |  ETA: 0:00:00
+Sampling  93%|███████████████████████████████████████   |  ETA: 0:00:00
+Sampling  93%|███████████████████████████████████████▎  |  ETA: 0:00:00
+Sampling  94%|███████████████████████████████████████▍  |  ETA: 0:00:00
+Sampling  94%|███████████████████████████████████████▌  |  ETA: 0:00:00
+Sampling  94%|███████████████████████████████████████▋  |  ETA: 0:00:00
+Sampling  95%|███████████████████████████████████████▊  |  ETA: 0:00:00
+Sampling  95%|███████████████████████████████████████▉  |  ETA: 0:00:00
+Sampling  95%|████████████████████████████████████████  |  ETA: 0:00:00
+Sampling  96%|████████████████████████████████████████▏ |  ETA: 0:00:00
+Sampling  96%|████████████████████████████████████████▍ |  ETA: 0:00:00
+Sampling  96%|████████████████████████████████████████▌ |  ETA: 0:00:00
+Sampling  97%|████████████████████████████████████████▋ |  ETA: 0:00:00
+Sampling  97%|████████████████████████████████████████▊ |  ETA: 0:00:00
+Sampling  97%|████████████████████████████████████████▉ |  ETA: 0:00:00
+Sampling  98%|█████████████████████████████████████████ |  ETA: 0:00:00
+Sampling  98%|█████████████████████████████████████████▏|  ETA: 0:00:00
+Sampling  98%|█████████████████████████████████████████▎|  ETA: 0:00:00
+Sampling  99%|█████████████████████████████████████████▌|  ETA: 0:00:00
+Sampling  99%|█████████████████████████████████████████▋|  ETA: 0:00:00
+Sampling  99%|█████████████████████████████████████████▊|  ETA: 0:00:00
+Sampling 100%|█████████████████████████████████████████▉|  ETA: 0:00:00
+Sampling 100%|██████████████████████████████████████████| Time: 0:00:00
+Sampling 100%|██████████████████████████████████████████| Time: 0:00:00
+                       Bond length distribution
+              +----------------------------------------+
+   [1.0, 1.2) |███████████████████████████████▎ 59     |
+   [1.2, 1.4) |██████████████▍ 27                      |
+   [1.4, 1.6) |████████████████████▋ 39                |
+   [1.6, 1.8) |█████████████████████▎ 40               |
+   [1.8, 2.0) |████████████████████████████████████  68|
+   [2.0, 2.2) |███████████████████████████████████▌ 67 |
+              +----------------------------------------+
                                Frequency
-                           Radial velocity distribution
-                    +----------------------------------------+
-   [-0.012, -0.01 ) |███▌ 5                                  | 
-   [-0.01 , -0.008) |████████████████████████████████████  52| 
-   [-0.008, -0.006) |██████████████████████████▍ 38          | 
-   [-0.006, -0.004) |████████████████▋ 24                    | 
-   [-0.004, -0.002) |██████████▍ 15                          | 
-   [-0.002,  0.0  ) |███████████▊ 17                         | 
-   [-0.0  ,  0.002) |█████████████▊ 20                       | 
-   [ 0.002,  0.004) |████████████▌ 18                        | 
-   [ 0.004,  0.006) |████████████████████▊ 30                | 
-   [ 0.006,  0.008) |███████████████████▍ 28                 | 
-   [ 0.008,  0.01 ) |██████████████████████████████████▋ 50  | 
-   [ 0.01 ,  0.012) |██▏ 3                                   | 
-                    +----------------------------------------+
+                           Radial velocity distribution
+                    +----------------------------------------+
+   [-0.012, -0.01 ) |███▌ 5                                  |
+   [-0.01 , -0.008) |████████████████████████████████████  52|
+   [-0.008, -0.006) |██████████████████████████▍ 38          |
+   [-0.006, -0.004) |████████████████▋ 24                    |
+   [-0.004, -0.002) |██████████▍ 15                          |
+   [-0.002,  0.0  ) |███████████▊ 17                         |
+   [-0.0  ,  0.002) |█████████████▊ 20                       |
+   [ 0.002,  0.004) |████████████▌ 18                        |
+   [ 0.004,  0.006) |████████████████████▊ 30                |
+   [ 0.006,  0.008) |███████████████████▍ 28                 |
+   [ 0.008,  0.01 ) |██████████████████████████████████▋ 50  |
+   [ 0.01 ,  0.012) |██▏ 3                                   |
+                    +----------------------------------------+
                                      Frequency
-[ Info: Generating the requested configurations...
Saving the distribution

Generally it will be desirable to generate a distribution once and re-use it for multiple dynamics simulations. The simplest way to do this is to save the distribution using JLD2.jl. Refer to Saving and loading to learn more.

In order to produce an unweighted distribution, the lateral and angular orientation are randomly selected within the unit cell. As an example of the spacial and orientation distribution generated with this module, a subset of data (300 configurations) is shown below. To run our production simulations, however, a set of 80,000 initial velocities and positions were used.

initial conditions

Data analysis and truncation function

Since we are interested in the dynamics only when the molecule is close to the surface, we can use a callback to terminate the simulation early to save us some time. This requires defining a function that returns true when we want the simulation to terminate. This means we can set our time span relatively long since we expect most simulations to terminate before reaching the time limit.

using Statistics: mean
+[ Info: Generating the requested configurations...
Saving the distribution

Generally it will be desirable to generate a distribution once and re-use it for multiple dynamics simulations. The simplest way to do this is to save the distribution using JLD2.jl. Refer to Saving and loading to learn more.

In order to produce an unweighted distribution, the lateral and angular orientation are randomly selected within the unit cell. As an example of the spacial and orientation distribution generated with this module, a subset of data (300 configurations) is shown below. To run our production simulations, however, a set of 80,000 initial velocities and positions were used.

initial conditions

Data analysis and truncation function

Since we are interested in the dynamics only when the molecule is close to the surface, we can use a callback to terminate the simulation early to save us some time. This requires defining a function that returns true when we want the simulation to terminate. This means we can set our time span relatively long since we expect most simulations to terminate before reaching the time limit.

using Statistics: mean
 using LinearAlgebra: norm
 
 h2distance(p) = norm(p[:,1] .- p[:,2])
@@ -406,4 +406,4 @@
     dt=0.1u"fs", output=OutputPosition, trajectories=20, callback=terminate)

MDEF with neural network friction

Above, we used the LDFA interpretation of MDEF to perform the simulation. However, the H2AgModel actually provides it's own friction tensor trained on ab initio data. This can be used by simply using the model directly, without wrapping it with the LDFAModel.

model = H2AgModel()
 sim = Simulation{MDEF}(atoms, model, cell=cell, temperature=300u"K")
 ensemble = run_dynamics(sim, tspan, distribution;selection=1:20,
-    dt=0.1u"fs", output=OutputPosition, trajectories=20, callback=terminate)

Visualisation

To show the effect of the truncation procedure, we have run 20 trajectories with and without the truncation function starting with an initial translation energy at 1.0 eV. For both figures, the total and kinetic energies are shown in the top panels along with the H-H distance and centre of mass z coordinate for each individual trajectory.

truncation

+ dt=0.1u"fs", output=OutputPosition, trajectories=20, callback=terminate)

Visualisation

To show the effect of the truncation procedure, we have run 20 trajectories with and without the truncation function starting with an initial translation energy at 1.0 eV. For both figures, the total and kinetic energies are shown in the top panels along with the H-H distance and centre of mass z coordinate for each individual trajectory.

truncation

diff --git a/dev/examples/spinboson/index.html b/dev/examples/spinboson/index.html index 8fd594119..e654d0965 100644 --- a/dev/examples/spinboson/index.html +++ b/dev/examples/spinboson/index.html @@ -1,5 +1,5 @@ -Ohmic spin-boson nonequilibrium population dynamics · NQCDynamics.jl

Ohmic spin-boson nonequilibrium population dynamics

The spin-boson model is widely used as a model for condensed phase quantum dynamics. It is defined by a system-bath Hamiltonian where the system is a 2-state spin coupled to a bath of harmonic oscillators. This example shows how to perform nonequilibrium population dynamics with the spin-boson model using a bath characterised by the Ohmic spectral density. We will be using model B from the work of Xing Gao, Maximilian A. C. Saller, Yudan Liu, Aaron Kelly, Jeremy O. Richardson, Eitan Geva (2020).

Our boson bath will have 100 oscillators, each with a mass of 1. Here, we also set up the model with the ohmic density and the parameters that match up with our reference (Xing Gao, Maximilian A. C. Saller, Yudan Liu, Aaron Kelly, Jeremy O. Richardson, Eitan Geva (2020)). The ohmic density is given a cutoff frequency of 2.5 and a Kondo parameter of 0.09. The model is symmetric, with the energy bias between states equal to 0.0, and the coupling between states set to 1.

using NQCDynamics
+Ohmic spin-boson nonequilibrium population dynamics · NQCDynamics.jl

Ohmic spin-boson nonequilibrium population dynamics

The spin-boson model is widely used as a model for condensed phase quantum dynamics. It is defined by a system-bath Hamiltonian where the system is a 2-state spin coupled to a bath of harmonic oscillators. This example shows how to perform nonequilibrium population dynamics with the spin-boson model using a bath characterised by the Ohmic spectral density. We will be using model B from the work of [22].

Our boson bath will have 100 oscillators, each with a mass of 1. Here, we also set up the model with the ohmic density and the parameters that match up with our reference ([22]). The ohmic density is given a cutoff frequency of 2.5 and a Kondo parameter of 0.09. The model is symmetric, with the energy bias between states equal to 0.0, and the coupling between states set to 1.

using NQCDynamics
 N = 100
 atoms = Atoms(fill(1, N))
 β = 5
@@ -16,59 +16,59 @@
     saveat=saveat, trajectories=100, output, reduction=MeanReduction(), dt=0.1)
 output = TimeCorrelationFunctions.PopulationCorrelationFunction(ehrenfest, Diabatic())
 ensemble_ehrenfest = run_dynamics(ehrenfest, (0.0, 20.0), distribution;
-    saveat=saveat, trajectories=100, output, reduction=MeanReduction(), dt=0.1)
[ Info: Sampling randomly from provided distribution.
-[ Info: Performing 100 trajectories.
-[ Info: Finished after 10.172262286 seconds.
-[ Info: Sampling randomly from provided distribution.
-[ Info: Performing 100 trajectories.
-[ Info: Finished after 6.861957245 seconds.

Here, we can see the population difference between the two states.

using Plots
+    saveat=saveat, trajectories=100, output, reduction=MeanReduction(), dt=0.1)
[ Info: Sampling randomly from provided distribution.
+[ Info: Performing 100 trajectories.
+[ Info: Finished after 12.517430047 seconds.
+[ Info: Sampling randomly from provided distribution.
+[ Info: Performing 100 trajectories.
+[ Info: Finished after 8.473678147 seconds.

Here, we can see the population difference between the two states.

using Plots
 plot(saveat, [p[1,1] - p[1,2] for p in ensemble_fssh[:PopulationCorrelationFunction]], label="FSSH")
 plot!(saveat, [p[1,1] - p[1,2] for p in ensemble_ehrenfest[:PopulationCorrelationFunction]], label="Ehrenfest")
 xlabel!("Time /a.u.")
 ylabel!("Population difference")
- + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - -

The exact result for this model, along with various mapping methods can be found in the work of Xing Gao, Maximilian A. C. Saller, Yudan Liu, Aaron Kelly, Jeremy O. Richardson, Eitan Geva (2020). We can see that even with just 100 trajectories, our Ehrenfest result closely matches theirs. The FSSH is quite clearly underconverged with only 100 trajectories due to the discontinuous nature of the individual trajectories. Feel free to try this for yourself and see what the converged FSSH result looks like!

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +

The exact result for this model, along with various mapping methods can be found in the work of [22]. We can see that even with just 100 trajectories, our Ehrenfest result closely matches theirs. The FSSH is quite clearly underconverged with only 100 trajectories due to the discontinuous nature of the individual trajectories. Feel free to try this for yourself and see what the converged FSSH result looks like!

diff --git a/dev/examples/threestatemorse/index.html b/dev/examples/threestatemorse/index.html index 8fc2c93a1..b7ab9438c 100644 --- a/dev/examples/threestatemorse/index.html +++ b/dev/examples/threestatemorse/index.html @@ -1,5 +1,5 @@ -Time-dependent populations with the ThreeStateMorse model · NQCDynamics.jl

Time-dependent populations with the ThreeStateMorse model

In this example we investigate the time-dependent populations of the three state morse model parametrised to describe photodissociation processes (Eduardo A. Coronado, Jianhua Xing, William H. Miller (2001)). This reference introduces three versions of this model with different parameter sets. Our ThreeStateMorse model matches model C from the reference.

First let's visualise the diabats and couplings for the model. You can see two regions where the diabats cross with non-zero coupling where we can expect to see population transfer.

using NQCDynamics
+Time-dependent populations with the ThreeStateMorse model · NQCDynamics.jl

Time-dependent populations with the ThreeStateMorse model

In this example we investigate the time-dependent populations of the three state morse model parametrised to describe photodissociation processes ([23]). This reference introduces three versions of this model with different parameter sets. Our ThreeStateMorse model matches model C from the reference.

First let's visualise the diabats and couplings for the model. You can see two regions where the diabats cross with non-zero coupling where we can expect to see population transfer.

using NQCDynamics
 using CairoMakie
 
 x = range(2, 12, length=200)
@@ -53,4 +53,4 @@
 lines!(ax, x, [p[1,3] for p in ehrenfest_result[:PopulationCorrelationFunction]], label="Ehrenfest State 3", color=:blue, linestyle=:dash)
 axislegend(ax)
 
-fig

To reduce the build time for the documentation the results here are underconverged but already it is clear that both of these methods come close to the exact result shown by Eduardo A. Coronado, Jianhua Xing, William H. Miller (2001). After performing enough trajectories to converge the population dynamics, we would be better able to judge the effectiveness of FSSH and Ehrenfest at reproducing the exact quantum dynamics for this model.

+fig

To reduce the build time for the documentation the results here are underconverged but already it is clear that both of these methods come close to the exact result shown by [23]. After performing enough trajectories to converge the population dynamics, we would be better able to judge the effectiveness of FSSH and Ehrenfest at reproducing the exact quantum dynamics for this model.

diff --git a/dev/examples/tully_scattering/index.html b/dev/examples/tully_scattering/index.html index a7e0c6432..14b511dc3 100644 --- a/dev/examples/tully_scattering/index.html +++ b/dev/examples/tully_scattering/index.html @@ -1,5 +1,5 @@ -Scattering probabilities for TullyModelTwo · NQCDynamics.jl

Scattering probabilities for TullyModelTwo

In this section we aim to reproduce the results of Fig. 5 from John C. Tully (1990). This figure presents the scattering outcomes when a particle interacts with Tully's model 2 with an increasing magnitude of incident kinetic energy.

To reproduce this figure, first, let's set up our system parameters:

using NQCDynamics
+Scattering probabilities for TullyModelTwo · NQCDynamics.jl

Scattering probabilities for TullyModelTwo

In this section we aim to reproduce the results of Fig. 5 from [1]. This figure presents the scattering outcomes when a particle interacts with Tully's model 2 with an increasing magnitude of incident kinetic energy.

To reproduce this figure, first, let's set up our system parameters:

using NQCDynamics
 
 sim = Simulation{FSSH}(Atoms(2000), TullyModelTwo())
Simulation{FSSH{Float64}}:
   Atoms{Float64}([:X], [0], [2000.0])
@@ -55,7 +55,7 @@
  ComponentVector{Float64}(reflection = [0.0, 0.0], transmission = [0.888, 0.112])
  ComponentVector{Float64}(reflection = [0.0, 0.0], transmission = [0.93, 0.07])
  ComponentVector{Float64}(reflection = [0.0, 0.0], transmission = [0.988, 0.012])
- ComponentVector{Float64}(reflection = [0.0, 0.0], transmission = [1.0, 0.0])
Adaptive timespan

Since the trajectories with larger momentum will exit the scattering region sooner, we scale the timespan to save computational time. Using tspan = (0, 2abs(r)/v) allows enough time such that a particle will be able to travel a total distance of 2r at a constant velocity of v. This is sufficient to ensure the particle has left the interaction region. Alternatively, we could define a callback to terminate the simulation early.

Now we can plot our simulation results. We format this plot to match Fig. 3 from Farnaz A. Shakib, Pengfei Huo (2017) which also reproduces Fig. 5 from John C. Tully (1990). We manage to reproduce the FSSH results quite accurately by visual comparison, though a larger number of trajectories would lead to better convergence. Since all of the examples run during the documentation build, we use a minimal number of trajectories to optimise the build time.

using CairoMakie
+ ComponentVector{Float64}(reflection = [0.0, 0.0], transmission = [1.0, 0.0])
Adaptive timespan

Since the trajectories with larger momentum will exit the scattering region sooner, we scale the timespan to save computational time. Using tspan = (0, 2abs(r)/v) allows enough time such that a particle will be able to travel a total distance of 2r at a constant velocity of v. This is sufficient to ensure the particle has left the interaction region. Alternatively, we could define a callback to terminate the simulation early.

Now we can plot our simulation results. We format this plot to match Fig. 3 from [18] which also reproduces Fig. 5 from [1]. We manage to reproduce the FSSH results quite accurately by visual comparison, though a larger number of trajectories would lead to better convergence. Since all of the examples run during the documentation build, we use a minimal number of trajectories to optimise the build time.

using CairoMakie
 
 f = Figure()
 ax = Axis(f[1,1], xlabel="Incident momentum / a.u.", ylabel="Scattering probability")
@@ -69,4 +69,4 @@
 scatter!(ax, momenta, t2; label="T2", color=:blue)
 axislegend(ax)
 
-f

As in Farnaz A. Shakib, Pengfei Huo (2017), R1, T1, T2 refer to reflection on state 1, transmission on state 1 and transmission on state 2 respectively. For this model, surface hopping is successful in closely approximating the exact quantum result, especially at higher momentum values. Refer to John C. Tully (1990) and Farnaz A. Shakib, Pengfei Huo (2017) for a detailed discussion of the results.

+f

As in [18], R1, T1, T2 refer to reflection on state 1, transmission on state 1 and transmission on state 2 respectively. For this model, surface hopping is successful in closely approximating the exact quantum result, especially at higher momentum values. Refer to [1] and [18] for a detailed discussion of the results.

diff --git a/dev/getting_started/index.html b/dev/getting_started/index.html index ed6af2398..7a38e752c 100644 --- a/dev/getting_started/index.html +++ b/dev/getting_started/index.html @@ -1,5 +1,5 @@ -Getting started · NQCDynamics.jl

Getting started

To get started with the package we can identify the necessary ingredients to perform a simple classical dynamics simulation and walk through how to set up the simulation.

Atoms

First, we must define the particles in the simulation. For this purpose we provide the Atoms type which will contain the symbols, atomic numbers and masses for our atoms. Technically these need not be actual atoms and be a generic particle.

If using real atoms, then they can be constructed using the chemical symbols as a Vector of Julia's Symbol types, a Vector{Symbol}:

julia> Atoms([:H, :C])Atoms{Float64}([:H, :C], [1, 6], [1837.4715941070515, 21894.713607956142])

You can see that this contains two atoms labelled by their atomic numbers with their masses in atomic units.

Atomic units

Internally atomic units are used for all quantities. This makes things simple when performing nonadiabatic dynamics. Unitful.jl and UnitfulAtomic.jl can be used to help with unit transformations, and many functions will directly accept Unitful quantities and handle the conversions for you.

Alternatively, if not using real atoms, Atoms can be created using a Vector{<:Real} where the provided numbers are the masses of the particles.

julia> Atoms([1, 2, 3, 4, 5, 6])Atoms{Float64}([:X, :X, :X, :X, :X, :X], [0, 0, 0, 0, 0, 0], [1.0, 2.0, 3.0, 4.0, 5.0, 6.0])

A more detailed look into the Atoms type along with a description of how to save and load structures can be found here.

Representing atomic positions and velocities

This package chooses to separate the dynamical variables from the static atomic parameters included in the Atoms type. This allows us to easily interface with other numerical packages like DifferentialEquations.jl and AdvancedMH.jl. As such, both positions and velocities are represented using Julia's standard Array type, specifically as an Array{T,2} or the Matrix{T} type, which are equivalent. If you are new to Julia, you can find a description of the Array here. The first dimension contains each atomic degree of freedom, and the second dimension contains each atom. For example, a 3D system with two atoms would have positions:

julia> using Symbolics
julia> @variables x1, y1, z1, x2, y2, z26-element Vector{Symbolics.Num}: +Getting started · NQCDynamics.jl

Getting started

To get started with the package we can identify the necessary ingredients to perform a simple classical dynamics simulation and walk through how to set up the simulation.

Atoms

First, we must define the particles in the simulation. For this purpose we provide the Atoms type which will contain the symbols, atomic numbers and masses for our atoms. Technically these need not be actual atoms and be a generic particle.

If using real atoms, then they can be constructed using the chemical symbols as a Vector of Julia's Symbol types, a Vector{Symbol}:

julia> Atoms([:H, :C])Atoms{Float64}([:H, :C], [1, 6], [1837.4715941070515, 21894.713607956142])

You can see that this contains two atoms labelled by their atomic numbers with their masses in atomic units.

Atomic units

Internally atomic units are used for all quantities. This makes things simple when performing nonadiabatic dynamics. Unitful.jl and UnitfulAtomic.jl can be used to help with unit transformations, and many functions will directly accept Unitful quantities and handle the conversions for you.

Alternatively, if not using real atoms, Atoms can be created using a Vector{<:Real} where the provided numbers are the masses of the particles.

julia> Atoms([1, 2, 3, 4, 5, 6])Atoms{Float64}([:X, :X, :X, :X, :X, :X], [0, 0, 0, 0, 0, 0], [1.0, 2.0, 3.0, 4.0, 5.0, 6.0])

A more detailed look into the Atoms type along with a description of how to save and load structures can be found here.

Representing atomic positions and velocities

This package chooses to separate the dynamical variables from the static atomic parameters included in the Atoms type. This allows us to easily interface with other numerical packages like DifferentialEquations.jl and AdvancedMH.jl. As such, both positions and velocities are represented using Julia's standard Array type, specifically as an Array{T,2} or the Matrix{T} type, which are equivalent. If you are new to Julia, you can find a description of the Array here. The first dimension contains each atomic degree of freedom, and the second dimension contains each atom. For example, a 3D system with two atoms would have positions:

julia> using Symbolics
julia> @variables x1, y1, z1, x2, y2, z26-element Vector{Symbolics.Num}: x1 y1 z1 @@ -25,49 +25,49 @@ plot(-5:0.1:5, model)
- + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + +
Warning

Plotting recipes currently only exist for 1D models. For more complex models you will have to handle the plotting manually.

Simulation

To control all simulation parameters in one environment, we use the Simulation type which will contain both the Atoms and Models explained above, along with any extra information required for the simulation.

julia> sim = Simulation{Classical}(Atoms(:H), model)Simulation{Classical}:
   Atoms{Float64}([:H], [1], [1837.4715941070515])
   Harmonic{Float64, Float64, Float64}
@@ -129,49 +129,49 @@
 plot!(solution, :OutputVelocity)
- + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + -

Ensemble simulations

We have shown how to perform a single trajectory, but usually we are interested in performing many and calculating observables using statistical methods. Running more trajectories is as simple as providing the trajectories keyword to run_dynamics, but we'll go through this in more detail in the Ensemble simulations section.

What's next?

Now that we've covered the basics of classical dynamics, we're ready to explore the world of nonadiabatic dynamics. All the dynamics methods follow these patterns and anything you find elsewhere in the documentation should now seem relatively familiar.

+

Ensemble simulations

We have shown how to perform a single trajectory, but usually we are interested in performing many and calculating observables using statistical methods. Running more trajectories is as simple as providing the trajectories keyword to run_dynamics, but we'll go through this in more detail in the Ensemble simulations section.

What's next?

Now that we've covered the basics of classical dynamics, we're ready to explore the world of nonadiabatic dynamics. All the dynamics methods follow these patterns and anything you find elsewhere in the documentation should now seem relatively familiar.

diff --git a/dev/index.html b/dev/index.html index 79129a768..fce7780e0 100644 --- a/dev/index.html +++ b/dev/index.html @@ -1,2 +1,2 @@ -Introduction · NQCDynamics.jl

Introduction

Welcome to the documentation for NQCDynamics, a package for performing nonadiabatic molecular dynamics simulations. The documentation covers both how to use the existing code and describes the intricacies of the implementations, hoping to make further contributions as simple as possible.

Objectives

  • Achieve high performance along with good readability, extensibility, maintainability
  • Handle both simple models and high-dimensional systems
  • Highlight the advantages of Julia in the field of nonadiabatic dynamics
  • Encourage code sharing and reuse within the nonadiabatic dynamics community

Reproducibility is a pressing issue in the field of theoretical chemistry and physics as often studies either do not attempt to provide all necessary data or code for full reproducibility of the work. This can lead to difficulties when attempting to better understand the theory and implementation of the method and makes it difficult for students not only to learn existing models and theories, but also to improve and extend these. This project provides implementations for existing dynamics methods along with a framework that can be used for future research with the goal of encouraging greater code sharing and reuse within the nonadiabatic dynamics community.

Features

Here we provide a list of currently implemented features of the code. We encourage contributions and implementations of methods. To do so, please open up an issue/pull request on Github!

Dynamics methods

Generating initial conditions

Dynamics with DifferentialEquations.jl

The DifferentialEquations ecosystem from the SciML organisation provides a large library of integration algorithms along with a simple interface for implementing new algorithms that can be tailored for specific nonadiabatic dynamics methods. Further, they provide helpful utilities for introducing discontinuities through the callback interface or handling many trajectories at once to obtain ensemble averaged observables with the ensemble interface. We can take advantage of these utilities by basing our dynamics setup on this framework which significantly simplifies the implementation of new methods.

Installation

1. Install Julia

Download and install the current stable release from the Julia website. For most platforms julia is provided as a precompiled binary and do not require any installation procedure. However, you need to specify the path to julia or create a symbolic link to the executable that is in your systempath.

2. Install the NQCRegistry

Since the package is not included in the default registry (General), we must first install the NQCRegistry. This gives access to the core NQCDynamics package along with some dependencies and add-ons. First, enter the Julia REPL by executing julia from the command line. Then press ] to enter pkg mode. The prompt should change from julia> to pkg>. Install the registry directly from Github with:

pkg> registry add "https://github.com/NQCD/NQCRegistry"
Warning

If this is the first time you're using Julia there's a chance that the General registry will not have been installed. Run pkg> registry status to view the installed registries. If General is not present, run pkg> registry add General before proceeding to the next step.

3. Install the package

Now that the registry has been added, the package can be installed in the same way as any other registered Julia package:

pkg> add NQCDynamics

4. Use the package!

julia> using NQCDynamics

You are now free to proceed to the next section and learn how to use the package. If you would like you can complete step 5 to double check your installation.

5. Run the tests (optional)

To check the package has been installed correctly and everything is working, you can execute the tests with:

pkg> test NQCDynamics
Warning

The tests use some extra functionality from the JuliaMolSim registry which can be added directly from Github with pkg> registry add "https://github.com/JuliaMolSim/MolSim". Without this, the tests will not run successfully.

How to use this documentation

The first page to read is the Getting started section which walks through all the ingredients needed to perform a conventional classical molecular dynamics simulation. After this, the reader is free to explore at their leisure since everything else builds directly upon sections from the Getting started page.

+Introduction · NQCDynamics.jl

Introduction

Welcome to the documentation for NQCDynamics, a package for performing nonadiabatic molecular dynamics simulations. The documentation covers both how to use the existing code and describes the intricacies of the implementations, hoping to make further contributions as simple as possible.

Objectives

  • Achieve high performance along with good readability, extensibility, maintainability
  • Handle both simple models and high-dimensional systems
  • Highlight the advantages of Julia in the field of nonadiabatic dynamics
  • Encourage code sharing and reuse within the nonadiabatic dynamics community

Reproducibility is a pressing issue in the field of theoretical chemistry and physics as often studies either do not attempt to provide all necessary data or code for full reproducibility of the work. This can lead to difficulties when attempting to better understand the theory and implementation of the method and makes it difficult for students not only to learn existing models and theories, but also to improve and extend these. This project provides implementations for existing dynamics methods along with a framework that can be used for future research with the goal of encouraging greater code sharing and reuse within the nonadiabatic dynamics community.

Features

Here we provide a list of currently implemented features of the code. We encourage contributions and implementations of methods. To do so, please open up an issue/pull request on Github!

Dynamics methods

Generating initial conditions

Dynamics with DifferentialEquations.jl

The DifferentialEquations ecosystem from the SciML organisation provides a large library of integration algorithms along with a simple interface for implementing new algorithms that can be tailored for specific nonadiabatic dynamics methods. Further, they provide helpful utilities for introducing discontinuities through the callback interface or handling many trajectories at once to obtain ensemble averaged observables with the ensemble interface. We can take advantage of these utilities by basing our dynamics setup on this framework which significantly simplifies the implementation of new methods.

Installation

1. Install Julia

Download and install the current stable release from the Julia website. For most platforms julia is provided as a precompiled binary and do not require any installation procedure. However, you need to specify the path to julia or create a symbolic link to the executable that is in your systempath.

2. Install the NQCRegistry

Since the package is not included in the default registry (General), we must first install the NQCRegistry. This gives access to the core NQCDynamics package along with some dependencies and add-ons. First, enter the Julia REPL by executing julia from the command line. Then press ] to enter pkg mode. The prompt should change from julia> to pkg>. Install the registry directly from Github with:

pkg> registry add "https://github.com/NQCD/NQCRegistry"
Warning

If this is the first time you're using Julia there's a chance that the General registry will not have been installed. Run pkg> registry status to view the installed registries. If General is not present, run pkg> registry add General before proceeding to the next step.

3. Install the package

Now that the registry has been added, the package can be installed in the same way as any other registered Julia package:

pkg> add NQCDynamics

4. Use the package!

julia> using NQCDynamics

You are now free to proceed to the next section and learn how to use the package. If you would like you can complete step 5 to double check your installation.

5. Run the tests (optional)

To check the package has been installed correctly and everything is working, you can execute the tests with:

pkg> test NQCDynamics
Warning

The tests use some extra functionality from the JuliaMolSim registry which can be added directly from Github with pkg> registry add "https://github.com/JuliaMolSim/MolSim". Without this, the tests will not run successfully.

How to use this documentation

The first page to read is the Getting started section which walks through all the ingredients needed to perform a conventional classical molecular dynamics simulation. After this, the reader is free to explore at their leisure since everything else builds directly upon sections from the Getting started page.

diff --git a/dev/initialconditions/ebk/index.html b/dev/initialconditions/ebk/index.html index 4a3d2f379..ff69483a1 100644 --- a/dev/initialconditions/ebk/index.html +++ b/dev/initialconditions/ebk/index.html @@ -1,5 +1,5 @@ -Semiclassical EBK quantisation · NQCDynamics.jl

Semiclassical EBK quantisation

In surface science, it is often of interest to investigate how collisions with surfaces can perturb the quantum states of molecules. In particular, for diatomic molecules, the rotational and vibrational quantum numbers can undergo significant changes when the molecule impacts the surface.

Einstein-Brillouinn-Keller (EBK) quantisation allows for a semiclassical investigation into these phenomena by providing a link between the quantum numbers and classical positions and velocities. The quantisation procedure allows the user to generate a classical distribution with a given set of quantum numbers, then perform semiclassical dynamics and extract the quantum numbers at the end by reversing the procedure.

These three steps can be applied to give insight into the processes taking place during surface scattering and allow us to attempt to predict the experimentally observed change in the quantum numbers.

A detailed yet approachable description of the theory is given by Andrew J. Larkoski, David G. Ellis, Lorenzo J. Curtis (2006) so we shall not delve into the theory here. Briefly, the procedure for a diatomic molecule involves an optimisation process to find the bounds of an integral, then computing the integral to obtain the vibrational quantum number. The rotational quantum number comes directly from the classical angular momentum of the molecule.

Configurations can be generated by randomly selecting bond lengths from the appropriate probability distribution and selecting a matching radial velocity.

Example

In this example we will create a quantised distribution suitable for use as initial conditions for hydrogen scattering simulations.

The simulation can be set up in the usual way, by specifying the atoms along with the model and the simulation cell.

using NQCDynamics
+Semiclassical EBK quantisation · NQCDynamics.jl

Semiclassical EBK quantisation

In surface science, it is often of interest to investigate how collisions with surfaces can perturb the quantum states of molecules. In particular, for diatomic molecules, the rotational and vibrational quantum numbers can undergo significant changes when the molecule impacts the surface.

Einstein-Brillouinn-Keller (EBK) quantisation allows for a semiclassical investigation into these phenomena by providing a link between the quantum numbers and classical positions and velocities. The quantisation procedure allows the user to generate a classical distribution with a given set of quantum numbers, then perform semiclassical dynamics and extract the quantum numbers at the end by reversing the procedure.

These three steps can be applied to give insight into the processes taking place during surface scattering and allow us to attempt to predict the experimentally observed change in the quantum numbers.

A detailed yet approachable description of the theory is given by [4] so we shall not delve into the theory here. Briefly, the procedure for a diatomic molecule involves an optimisation process to find the bounds of an integral, then computing the integral to obtain the vibrational quantum number. The rotational quantum number comes directly from the classical angular momentum of the molecule.

Configurations can be generated by randomly selecting bond lengths from the appropriate probability distribution and selecting a matching radial velocity.

Example

In this example we will create a quantised distribution suitable for use as initial conditions for hydrogen scattering simulations.

The simulation can be set up in the usual way, by specifying the atoms along with the model and the simulation cell.

using NQCDynamics
 using Unitful, UnitfulAtomic
 
 atoms = Atoms([:H, :H])
@@ -54,4 +54,4 @@
 scatter!(x[1,:], y[1,:]; markersize=20, color=colors)
 scatter!(x[2,:], y[2,:]; markersize=20, color=colors)
 
-f

Here we can see that the molecule is randomly distributed within the unit cell. Since we have used a harmonic potential, this could have been produced without using the EBK procedure, but this technique can use any arbitrary potential. In the hydrogen scattering example we build on this example and use the sample procedure to perform scattering simulations starting from this distribution.

+f

Here we can see that the molecule is randomly distributed within the unit cell. Since we have used a harmonic potential, this could have been produced without using the EBK procedure, but this technique can use any arbitrary potential. In the hydrogen scattering example we build on this example and use the sample procedure to perform scattering simulations starting from this distribution.

diff --git a/dev/initialconditions/hamiltonian/index.html b/dev/initialconditions/hamiltonian/index.html index 8b046f947..03bd5c96a 100644 --- a/dev/initialconditions/hamiltonian/index.html +++ b/dev/initialconditions/hamiltonian/index.html @@ -1,25 +1,25 @@ -Thermal Hamiltonian Monte Carlo · NQCDynamics.jl

Thermal Hamiltonian Monte Carlo

Our implementation of Hamiltonian Monte Carlo (HMC) is a light wrapper around the AdvancedHMC.jl package. If you want to learn about the HMC theory, refer to the references and documentation provided with AdvancedHMC.jl.

Currently, our implementation works for systems with classical nuclei only (i.e. Simulation but not RingPolymerSimulation).

Example

In this example we use Hamiltonian Monte Carlo to sample the canonical distribution of a 3 dimensional harmonic oscillator potential containing 4 atoms.

using NQCDynamics
+Thermal Hamiltonian Monte Carlo · NQCDynamics.jl

Thermal Hamiltonian Monte Carlo

Our implementation of Hamiltonian Monte Carlo (HMC) is a light wrapper around the AdvancedHMC.jl package. If you want to learn about the HMC theory, refer to the references and documentation provided with AdvancedHMC.jl.

Currently, our implementation works for systems with classical nuclei only (i.e. Simulation but not RingPolymerSimulation).

Example

In this example we use Hamiltonian Monte Carlo to sample the canonical distribution of a 3 dimensional harmonic oscillator potential containing 4 atoms.

using NQCDynamics
 using Unitful
 using UnitfulAtomic
 
 sim = Simulation(Atoms([:H, :H, :C, :C]), Harmonic(dofs=3); temperature=300u"K")
 r0 = randn(size(sim))
-chain, stats = InitialConditions.ThermalMonteCarlo.run_advancedhmc_sampling(sim, r0, 1e4)
┌ Info: Finished 1000 adapation steps
-  adaptor =
-   StanHMCAdaptor(
-       pc=WelfordVar,
-       ssa=NesterovDualAveraging(γ=0.05, t_0=10.0, κ=0.75, δ=0.5, state.ϵ=1.1515833457419953),
-       init_buffer=75, term_buffer=50, window_size=25,
-       state=window(76, 950), window_splits(100, 150, 250, 450, 950)
-   )
-  κ.τ.integrator = Leapfrog(ϵ=1.15)
-  h.metric = DiagEuclideanMetric([0.0010008028764173797, 0.0 ...])
-┌ Info: Finished 10000 sampling steps for 1 chains in 1.251930149 (s)
-  h = Hamiltonian(metric=DiagEuclideanMetric([0.0010008028764173797, 0.0 ...]), kinetic=AdvancedHMC.GaussianKinetic())
-  κ = AdvancedHMC.HMCKernel{AdvancedHMC.FullMomentumRefreshment, AdvancedHMC.Trajectory{AdvancedHMC.MultinomialTS, AdvancedHMC.Leapfrog{Float64}, AdvancedHMC.GeneralisedNoUTurn{Float64}}}(AdvancedHMC.FullMomentumRefreshment(), Trajectory{AdvancedHMC.MultinomialTS}(integrator=Leapfrog(ϵ=1.15), tc=AdvancedHMC.GeneralisedNoUTurn{Float64}(10, 1000.0)))
-  EBFMI_est = 0.4970816718202242
-  average_acceptance_rate = 0.5828141580821872

The Monte Carlo chain contains the nuclear configurations that we have sampled:

chain
10000-element Vector{Matrix{Float64}}:
+chain, stats = InitialConditions.ThermalMonteCarlo.run_advancedhmc_sampling(sim, r0, 1e4)
┌ Info: Finished 1000 adapation steps
+│   adaptor =
+│    StanHMCAdaptor(
+│        pc=WelfordVar,
+│        ssa=NesterovDualAveraging(γ=0.05, t_0=10.0, κ=0.75, δ=0.5, state.ϵ=1.1515833457419953),
+│        init_buffer=75, term_buffer=50, window_size=25,
+│        state=window(76, 950), window_splits(100, 150, 250, 450, 950)
+│    )
+│   κ.τ.integrator = Leapfrog(ϵ=1.15)
+└   h.metric = DiagEuclideanMetric([0.0010008028764173797, 0.0 ...])
+┌ Info: Finished 10000 sampling steps for 1 chains in 1.578098567 (s)
+│   h = Hamiltonian(metric=DiagEuclideanMetric([0.0010008028764173797, 0.0 ...]), kinetic=AdvancedHMC.GaussianKinetic())
+│   κ = AdvancedHMC.HMCKernel{AdvancedHMC.FullMomentumRefreshment, AdvancedHMC.Trajectory{AdvancedHMC.MultinomialTS, AdvancedHMC.Leapfrog{Float64}, AdvancedHMC.GeneralisedNoUTurn{Float64}}}(AdvancedHMC.FullMomentumRefreshment(), Trajectory{AdvancedHMC.MultinomialTS}(integrator=Leapfrog(ϵ=1.15), tc=AdvancedHMC.GeneralisedNoUTurn{Float64}(10, 1000.0)))
+│   EBFMI_est = 0.4970816718202242
+└   average_acceptance_rate = 0.5828141580821872

The Monte Carlo chain contains the nuclear configurations that we have sampled:

chain
10000-element Vector{Matrix{Float64}}:
  [-0.1470383013015237 -0.38916697802033395 -0.0365173011689246 0.5601646997162351; 0.11909770439312123 -0.37827402979477687 -0.0544090056730967 0.23269287818478546; -0.37571769521474385 -0.43821678708810907 -0.13962548407997555 0.3784940784439885]
  [-0.1470383013015237 -0.38916697802033395 -0.0365173011689246 0.5601646997162351; 0.11909770439312123 -0.37827402979477687 -0.0544090056730967 0.23269287818478546; -0.37571769521474385 -0.43821678708810907 -0.13962548407997555 0.3784940784439885]
  [-0.1470383013015237 -0.38916697802033395 -0.0365173011689246 0.5601646997162351; 0.11909770439312123 -0.37827402979477687 -0.0544090056730967 0.23269287818478546; -0.37571769521474385 -0.43821678708810907 -0.13962548407997555 0.3784940784439885]
@@ -59,4 +59,4 @@
  (n_steps = 3, is_accept = true, acceptance_rate = 0.6117488480399033, log_density = -9.391777466532929, hamiltonian_energy = 10.953419407792731, hamiltonian_energy_error = 1.3594176028810505, max_hamiltonian_energy_error = 1.3594176028810505, tree_depth = 2, numerical_error = false, step_size = 1.1515833457419953, nom_step_size = 1.1515833457419953, is_adapt = false)
  (n_steps = 3, is_accept = true, acceptance_rate = 0.9191684851219196, log_density = -10.422512777975966, hamiltonian_energy = 16.63647822636825, hamiltonian_energy_error = 0.07898128795930504, max_hamiltonian_energy_error = 0.09753614272175781, tree_depth = 2, numerical_error = false, step_size = 1.1515833457419953, nom_step_size = 1.1515833457419953, is_adapt = false)
  (n_steps = 3, is_accept = true, acceptance_rate = 0.9020648114788363, log_density = -11.840339188090256, hamiltonian_energy = 16.668419452622377, hamiltonian_energy_error = 0.301505116728503, max_hamiltonian_energy_error = -1.171921709034482, tree_depth = 2, numerical_error = false, step_size = 1.1515833457419953, nom_step_size = 1.1515833457419953, is_adapt = false)
- (n_steps = 3, is_accept = true, acceptance_rate = 1.0, log_density = -8.40220720242458, hamiltonian_energy = 15.508607430210585, hamiltonian_energy_error = -0.9468536494933097, max_hamiltonian_energy_error = -1.0062262692109112, tree_depth = 2, numerical_error = false, step_size = 1.1515833457419953, nom_step_size = 1.1515833457419953, is_adapt = false)

Here we should see that the energy expectation for the generated ensemble matches with the equipartition theorem:

julia> Estimators.@estimate potential_energy(sim, chain)0.005918315282736026
julia> austrip(sim.temperature) * 3 * 4 / 20.005700260814198944
+ (n_steps = 3, is_accept = true, acceptance_rate = 1.0, log_density = -8.40220720242458, hamiltonian_energy = 15.508607430210585, hamiltonian_energy_error = -0.9468536494933097, max_hamiltonian_energy_error = -1.0062262692109112, tree_depth = 2, numerical_error = false, step_size = 1.1515833457419953, nom_step_size = 1.1515833457419953, is_adapt = false)

Here we should see that the energy expectation for the generated ensemble matches with the equipartition theorem:

julia> Estimators.@estimate potential_energy(sim, chain)0.005918315282736026
julia> austrip(sim.temperature) * 3 * 4 / 20.005700260814198944
diff --git a/dev/initialconditions/langevin/index.html b/dev/initialconditions/langevin/index.html index 288cc7e65..997b0cadc 100644 --- a/dev/initialconditions/langevin/index.html +++ b/dev/initialconditions/langevin/index.html @@ -1,2 +1,2 @@ -Thermal Langevin dynamics · NQCDynamics.jl
+Thermal Langevin dynamics · NQCDynamics.jl
diff --git a/dev/initialconditions/metropolishastings/index.html b/dev/initialconditions/metropolishastings/index.html index 3b18faa64..299f9296f 100644 --- a/dev/initialconditions/metropolishastings/index.html +++ b/dev/initialconditions/metropolishastings/index.html @@ -1,5 +1,5 @@ -Thermal Metropolis-Hastings Monte Carlo · NQCDynamics.jl

Thermal Metropolis-Hastings Monte Carlo

Metropolis-Hastings Monte Carlo is a popular method for sampling the canonical distribution for a molecular system. Our implementations uses AdvancedMH.jl from the Turing organisation.

For a classical Simulation, the algorithm involves proposing new configurations in a random walk starting from an initial configuration. These are accepted or rejected based upon the Metropolis-Hastings criteria. The result is a Markov chain that samples the canonical distribution.

Example

We can perform the sampling by setting up a classical simulation in the usual way and providing an appropriate initial configuration.

using NQCDynamics
+Thermal Metropolis-Hastings Monte Carlo · NQCDynamics.jl

Thermal Metropolis-Hastings Monte Carlo

Metropolis-Hastings Monte Carlo is a popular method for sampling the canonical distribution for a molecular system. Our implementations uses AdvancedMH.jl from the Turing organisation.

For a classical Simulation, the algorithm involves proposing new configurations in a random walk starting from an initial configuration. These are accepted or rejected based upon the Metropolis-Hastings criteria. The result is a Markov chain that samples the canonical distribution.

Example

We can perform the sampling by setting up a classical simulation in the usual way and providing an appropriate initial configuration.

using NQCDynamics
 sim = Simulation(Atoms([:H, :H, :H, :H, :H]), Harmonic(); temperature=15)
 r0 = zeros(size(sim))
1×5 Matrix{Float64}:
  0.0  0.0  0.0  0.0  0.0

Then we must also specify the total number of steps and the size of each step. These can be provided in a dictionary for each species to allow for different step sizes depending on the element in the simulation.

steps = 1e4
@@ -38,96 +38,96 @@
   :O => 0.819876
plot(output.energy)
- + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + +

We can calculate the distance between each atom and plot the bond length throughout the sampling.

using LinearAlgebra
 plot([norm(R[:,1] .- R[:,2]) for R in output.R])
- + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

The result of this simulation seamlessly interfaces with the DynamicalDistribution presented in the previous section and output.R can be readily passed to provide the position distribution. The Monte Carlo sampling does not include velocities but these can be readily obtained from the Maxwell-Boltzmann distribution.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

The result of this simulation seamlessly interfaces with the DynamicalDistribution presented in the previous section and output.R can be readily passed to provide the position distribution. The Monte Carlo sampling does not include velocities but these can be readily obtained from the Maxwell-Boltzmann distribution.

diff --git a/dev/integration_algorithms/index.html b/dev/integration_algorithms/index.html index 8af0e01e7..785f8f88d 100644 --- a/dev/integration_algorithms/index.html +++ b/dev/integration_algorithms/index.html @@ -1,2 +1,2 @@ -Integration algorithms · NQCDynamics.jl

Integration algorithms

At the core of NQCDynamics.jl is the DifferentialEquations.jl package that performs all of the dynamics simulations. Within the sub-packages OrdinaryDiffEq.jl and StochasticDiffEq.jl, a variety of integration algorithms have been implemented that are available to use without needing to implement custom algorithms for specific applications. However, in some cases it can be desirable to implement algorithms that can take advantage of the special structure of the dynamical system at hand. A key example in the field of molecular dynamics is the famous velocity Verlet algorithm that is extremely popular due to its requirement for only a single force evaluation during each time step and symplectic energy conservation properties. In fact, velocity Verlet, along with a variety of other symplectic solvers are also implemented within OrdinaryDiffEq.jl.

For some problems encountered within semiclassical adiabatic and nonadiabatic dynamics, there are a few different algorithms that can be used to obtain improved performance. Ideally, these would be implemented using the DifferentialEquations.jl interface to allow for others to easily use these algorithms for their own problems. However, it can be challenging to implement algorithms with an appropriate level of generality. NQCDynamics.jl contains implementations for a few algorithms using the DifferentialEquations.jl interface but the implementations are not completely generic and are coupled to the rest of the package. In particular, the algorithms rely on specific formats for the dynamical arrays and use some functions that are not provided within the DEProblem. In future it would be great to try to decouple the algorithms and package them separately within the DifferentialEquations.jl ecosystem so that others can use them more easily.

This page describes a few applications where special algorithms are available to enhance performance. In each section it is noted which algorithms are available within NQCDynamics.jl.

Ring polymer propagation

Path integral molecular dynamics and ring polymer molecular dynamics involve solving Hamilton's equations for a classical ring polymer Hamiltonian. The ring polymer Hamiltonian describes many replicas of the system joined together by harmonic springs. The number of replicas or beads required must be increased until convergence is achieved. After adding many beads the ring polymer dynamics becomes hard to integrate, as the ring polymer internal modes become the highest frequency modes in the system, limiting the largest acceptable time step.

To circumvent this difficulty, the ring polymer equations of motion can be partitioned to separate the free ring polymer dynamics from the influence of the external potential. Since the free ring polymer dynamics is entirely harmonic, it is possible to solve this part analytically, allowing for time steps that are not limited by the internal ring polymer frequencies. Recently, the symplectic Cayley modified algorithm has been demonstrated to exhibit strong stability and outperform the original algorithm.

Note

The Cayley modified algorithm was originally introduced by Roman Korol, Nawaf Bou-Rabee, Thomas F. Miller (2019). This paper provides a detailed description of ring polymer dynamics, how the integration algorithm works, and benchmarks the performance of the algorithms.

The Hamiltonian ring polymer integration algorithm has also been extended for thermostatted dynamics: such as for thermal sampling in path integral molecular dynamics, or in thermostatted ring polymer molecular dynamics. As an extension to the Cayley modified algorithm for the Hamiltonian dynamics, the work of Roman Korol, Jorge L. Rosa-Raíces, Nawaf Bou-Rabee, Thomas F. Miller (2020) suggests the BCOCB algorithm as the most effective for ring polymer dynamics with Langevin thermostatting. The BCOCB nomenclature refers to the sub-steps within each time step. B is the external potential, C is the Cayley modified free ring polymer step, and O is the thermostat. In this nomenclature, the integration algorithm in the absence of the thermostat can be referred to as the BCB algorithm.

Tip

NQCDynamics.jl implements both the BCOCB and BCB algorithms for Langevin and Hamiltonian dynamics, respectively. They are the default algorithms when performing adiabatic ring polymer dynamics.

Mixed quantum-classical propagation

Mixed quantum-classical methods such as mean-field Ehrenfest dynamics or surface hopping dynamics involve simultaneous propagation of nuclear and electronic sub-systems. The two sub-systems evolve on different timescales and it can be advantageous to use different time steps or algorithms for each part. Commonly the nuclear part is solved using the velocity Verlet algorithm and the electronic part is handled using a Runge-Kutta method or an exponential integrator.

Note

SHARC and Newton-X, two popular surface hopping codes, use the split-algorithm approach. In SHARC, the nuclear degrees of freedom are propagated using the velocity Verlet algorithm, whilst the wavefunction is propagated using an exponential integrator with a smaller time step. Since an exponential integrator is exact when the propagation operator is constant, reducing the time step would have no benefit if the nuclei remained fixed during the time step. SHARC instead linearly interpolates the propagation operator during the electronic steps so that the nuclei propagation operator changes smoothly during the nuclear time step. This procedure is explained in the SHARC manual. Newton-X allows a few choices for the wavefunction integration algorithm and the nuclear quantities are interpolated similarly to SHARC.

NQCDynamics.jl uses the standard library of OrdinaryDiffEq.jl solvers to run the dynamics for mixed quantum-classical methods. For model Hamiltonians where the evaluation of the electronic quantities is fast it is not necessary to use an augmented Verlet algorithm, instead it is sufficient to use any of the adaptive solvers from OrdinaryDiffEq.jl. However, in future it would be useful to implement some of these partioned algorithms that are able to achieve enhanced performance for large, expensive systems.

For ring polymer mixed quantum-classical methods, it is possible to combine the algorithms used for ring polymer propagation with the partitioning idea from the mixed quantum-classical solvers. Even for model systems, the performance is significantly improved when the ring polymer modes are solved separately such that larger time steps can be used. NQCDynamics.jl implements an augmented form of the BCB algorithm that uses the BCB algorithm for the ring polymer degrees of freedom and uses the Tsit5 algorithm from OrdinaryDiffEq.jl for the electronic part. Currently the time steps for both sub-systems are fixed to be the same, but in future this constraint should be removed. In fact, it would even be possible to use an adaptive solver for the electronic part that can automatically adjust the time step as necessary.

Semiclassical mapping variable propagation

Mapping variable methods describe the coupled nuclear-electronic problem using a classical Hamiltonian, where additional variables have been introduced to represent the electronic populations. As is the case with the ring polymer methods, it is possible to construct symplectic algorithms where each timestep is partitioned into exactly soluble sub-steps. Of particular note is the MInt algorithm described by Matthew S. Church, Timothy J. H. Hele, Gregory S. Ezra, Nandini Ananth (2018). The algorithm is symplectic, symmetric and time-reversible and can also be combined with the ring polymer algorithms for ring polymer dynamics with mapping variables. NQCDynamics.jl implements the MInt algorithm and a variant of the MInt algorithm for ring polymer systems that combines the BCB algorithm for the nuclei with the MInt algorithm for the mapping variables.

Electronic friction propagation

Molecular dynamics with electronic friction is described by Langevin equations of motion, equivalent to classical Hamiltonian dynamics with an additional drag force and stochastic force. In the case of Langevin dynamics with a constant friction coefficient, there has been much interest in developing algorithms of low order that can be used for large molecular dynamics simulations. The work of Benedict Leimkuhler, Charles Matthews (2012) has demonstrated that, although a few choices exist, the BAOAB algorithm performs most favourably.

Tip

The BAOAB algorithm uses the same nomenclature as the ring polymer algorithms introduced in Ring polymer propagation. Each letter represents one component of a single time step. B is the external force step that updates the velocities, A is the position update, and O is the thermostatting step. For ring polymer dynamics the A step encompasses the free ring polymer step.

For electronic friction dynamics, the friction is described by a tensor, not a single number as for traditional Langevin dynamics. However, the BAOAB algorithm is still applicable, but the O step requires the matrix exponential of the friction tensor. Since the tensor is positive semi-definite, it is possible to perform the exponentiation by first diagonalising the tensor. Using this approach, NQCDynamics.jl implements the BAOAB algorithm for tensorial friction and the BCOCB when using a ring polymer system.

Note

The DynamicalSDEProblem in StochasticDiffEq.jl represents systems that contain positions and velocities and have a stochastic component. The DynamicalSDEProblem was originally implemented for performing Langevin thermostatted dynamics simulations using the BAOAB algorithm. At the time of writing, BAOAB is the only algorithm implemented in StochasticDiffEq.jl for these problems. In future it would be useful to implement further algorithms and allow for more general noise profiles.

+Integration algorithms · NQCDynamics.jl

Integration algorithms

At the core of NQCDynamics.jl is the DifferentialEquations.jl package that performs all of the dynamics simulations. Within the sub-packages OrdinaryDiffEq.jl and StochasticDiffEq.jl, a variety of integration algorithms have been implemented that are available to use without needing to implement custom algorithms for specific applications. However, in some cases it can be desirable to implement algorithms that can take advantage of the special structure of the dynamical system at hand. A key example in the field of molecular dynamics is the famous velocity Verlet algorithm that is extremely popular due to its requirement for only a single force evaluation during each time step and symplectic energy conservation properties. In fact, velocity Verlet, along with a variety of other symplectic solvers are also implemented within OrdinaryDiffEq.jl.

For some problems encountered within semiclassical adiabatic and nonadiabatic dynamics, there are a few different algorithms that can be used to obtain improved performance. Ideally, these would be implemented using the DifferentialEquations.jl interface to allow for others to easily use these algorithms for their own problems. However, it can be challenging to implement algorithms with an appropriate level of generality. NQCDynamics.jl contains implementations for a few algorithms using the DifferentialEquations.jl interface but the implementations are not completely generic and are coupled to the rest of the package. In particular, the algorithms rely on specific formats for the dynamical arrays and use some functions that are not provided within the DEProblem. In future it would be great to try to decouple the algorithms and package them separately within the DifferentialEquations.jl ecosystem so that others can use them more easily.

This page describes a few applications where special algorithms are available to enhance performance. In each section it is noted which algorithms are available within NQCDynamics.jl.

Ring polymer propagation

Path integral molecular dynamics and ring polymer molecular dynamics involve solving Hamilton's equations for a classical ring polymer Hamiltonian. The ring polymer Hamiltonian describes many replicas of the system joined together by harmonic springs. The number of replicas or beads required must be increased until convergence is achieved. After adding many beads the ring polymer dynamics becomes hard to integrate, as the ring polymer internal modes become the highest frequency modes in the system, limiting the largest acceptable time step.

To circumvent this difficulty, the ring polymer equations of motion can be partitioned to separate the free ring polymer dynamics from the influence of the external potential. Since the free ring polymer dynamics is entirely harmonic, it is possible to solve this part analytically, allowing for time steps that are not limited by the internal ring polymer frequencies. Recently, the symplectic Cayley modified algorithm has been demonstrated to exhibit strong stability and outperform the original algorithm.

Note

The Cayley modified algorithm was originally introduced by [14]. This paper provides a detailed description of ring polymer dynamics, how the integration algorithm works, and benchmarks the performance of the algorithms.

The Hamiltonian ring polymer integration algorithm has also been extended for thermostatted dynamics: such as for thermal sampling in path integral molecular dynamics, or in thermostatted ring polymer molecular dynamics. As an extension to the Cayley modified algorithm for the Hamiltonian dynamics, the work of [24] suggests the BCOCB algorithm as the most effective for ring polymer dynamics with Langevin thermostatting. The BCOCB nomenclature refers to the sub-steps within each time step. B is the external potential, C is the Cayley modified free ring polymer step, and O is the thermostat. In this nomenclature, the integration algorithm in the absence of the thermostat can be referred to as the BCB algorithm.

Tip

NQCDynamics.jl implements both the BCOCB and BCB algorithms for Langevin and Hamiltonian dynamics, respectively. They are the default algorithms when performing adiabatic ring polymer dynamics.

Mixed quantum-classical propagation

Mixed quantum-classical methods such as mean-field Ehrenfest dynamics or surface hopping dynamics involve simultaneous propagation of nuclear and electronic sub-systems. The two sub-systems evolve on different timescales and it can be advantageous to use different time steps or algorithms for each part. Commonly the nuclear part is solved using the velocity Verlet algorithm and the electronic part is handled using a Runge-Kutta method or an exponential integrator.

Note

SHARC and Newton-X, two popular surface hopping codes, use the split-algorithm approach. In SHARC, the nuclear degrees of freedom are propagated using the velocity Verlet algorithm, whilst the wavefunction is propagated using an exponential integrator with a smaller time step. Since an exponential integrator is exact when the propagation operator is constant, reducing the time step would have no benefit if the nuclei remained fixed during the time step. SHARC instead linearly interpolates the propagation operator during the electronic steps so that the nuclei propagation operator changes smoothly during the nuclear time step. This procedure is explained in the SHARC manual. Newton-X allows a few choices for the wavefunction integration algorithm and the nuclear quantities are interpolated similarly to SHARC.

NQCDynamics.jl uses the standard library of OrdinaryDiffEq.jl solvers to run the dynamics for mixed quantum-classical methods. For model Hamiltonians where the evaluation of the electronic quantities is fast it is not necessary to use an augmented Verlet algorithm, instead it is sufficient to use any of the adaptive solvers from OrdinaryDiffEq.jl. However, in future it would be useful to implement some of these partioned algorithms that are able to achieve enhanced performance for large, expensive systems.

For ring polymer mixed quantum-classical methods, it is possible to combine the algorithms used for ring polymer propagation with the partitioning idea from the mixed quantum-classical solvers. Even for model systems, the performance is significantly improved when the ring polymer modes are solved separately such that larger time steps can be used. NQCDynamics.jl implements an augmented form of the BCB algorithm that uses the BCB algorithm for the ring polymer degrees of freedom and uses the Tsit5 algorithm from OrdinaryDiffEq.jl for the electronic part. Currently the time steps for both sub-systems are fixed to be the same, but in future this constraint should be removed. In fact, it would even be possible to use an adaptive solver for the electronic part that can automatically adjust the time step as necessary.

Semiclassical mapping variable propagation

Mapping variable methods describe the coupled nuclear-electronic problem using a classical Hamiltonian, where additional variables have been introduced to represent the electronic populations. As is the case with the ring polymer methods, it is possible to construct symplectic algorithms where each timestep is partitioned into exactly soluble sub-steps. Of particular note is the MInt algorithm described by [13]. The algorithm is symplectic, symmetric and time-reversible and can also be combined with the ring polymer algorithms for ring polymer dynamics with mapping variables. NQCDynamics.jl implements the MInt algorithm and a variant of the MInt algorithm for ring polymer systems that combines the BCB algorithm for the nuclei with the MInt algorithm for the mapping variables.

Electronic friction propagation

Molecular dynamics with electronic friction is described by Langevin equations of motion, equivalent to classical Hamiltonian dynamics with an additional drag force and stochastic force. In the case of Langevin dynamics with a constant friction coefficient, there has been much interest in developing algorithms of low order that can be used for large molecular dynamics simulations. The work of [7] has demonstrated that, although a few choices exist, the BAOAB algorithm performs most favourably.

Tip

The BAOAB algorithm uses the same nomenclature as the ring polymer algorithms introduced in Ring polymer propagation. Each letter represents one component of a single time step. B is the external force step that updates the velocities, A is the position update, and O is the thermostatting step. For ring polymer dynamics the A step encompasses the free ring polymer step.

For electronic friction dynamics, the friction is described by a tensor, not a single number as for traditional Langevin dynamics. However, the BAOAB algorithm is still applicable, but the O step requires the matrix exponential of the friction tensor. Since the tensor is positive semi-definite, it is possible to perform the exponentiation by first diagonalising the tensor. Using this approach, NQCDynamics.jl implements the BAOAB algorithm for tensorial friction and the BCOCB when using a ring polymer system.

Note

The DynamicalSDEProblem in StochasticDiffEq.jl represents systems that contain positions and velocities and have a stochastic component. The DynamicalSDEProblem was originally implemented for performing Langevin thermostatted dynamics simulations using the BAOAB algorithm. At the time of writing, BAOAB is the only algorithm implemented in StochasticDiffEq.jl for these problems. In future it would be useful to implement further algorithms and allow for more general noise profiles.

diff --git a/dev/parameters.jld2 b/dev/parameters.jld2 index 6a5234151721a960a47552846036bc5316ece2c9..74f3b3ac4182a7aa7583e93b2c067ba8063e223e 100644 GIT binary patch delta 12 Tcmca+cFk;p1*6eMOIc|EA#?;b delta 12 Tcmca+cFk;p1*5@6OIc|EA!-CP diff --git a/dev/references/index.html b/dev/references/index.html index d99cd583e..73c952cc4 100644 --- a/dev/references/index.html +++ b/dev/references/index.html @@ -1,87 +1,87 @@ -References · NQCDynamics.jl

References

Ananth2007
+References · NQCDynamics.jl

References

[1]
-
Nandini Ananth, Charulatha Venkataraman, William H. Miller, Semiclassical description of electronically nonadiabatic dynamics via the initial value representation, https://doi.org/10.1063/1.2759932.
-
Box2021
+
J. C. Tully. Molecular dynamics with electronic transitions. https://doi.org/10.1063/1.459170 (1990).
+
[2]
-
Connor L. Box, Yaolong Zhang, Rongrong Yin, Bin Jiang, Reinhard J. Maurer, Determining the Effect of Hot Electron Dissipation on Molecular Scattering Experiments at Metal Surfaces, https://doi.org/10.1021/jacsau.0c00066.
-
Chowdhury2019
+
C. L. Box, Y. Zhang, R. Yin, B. Jiang and R. J. Maurer. Determining the Effect of Hot Electron Dissipation on Molecular Scattering Experiments at Metal Surfaces. https://doi.org/10.1021/jacsau.0c00066 (2021).
+
[3]
-
Sutirtha N. Chowdhury, Pengfei Huo, State dependent ring polymer molecular dynamics for investigating excited nonadiabatic dynamics, https://doi.org/10.1063/1.5096276.
-
Chowdhury2021
+
N. Gerrits, J. I. Juaristi and J. Meyer. Electronic friction coefficients from the atom-in-jellium model for $Z=1–92$. Phys. Rev. B 102, 155130 (2020).
+
[4]
-
Sutirtha N. Chowdhury, Pengfei Huo, Non-adiabatic Matsubara dynamics and non-adiabatic ring-polymer molecular dynamics, https://doi.org/10.1063/5.0042136.
-
Church2018
+
A. J. Larkoski, D. G. Ellis and L. J. Curtis. Numerical implementation of Einstein-Brillouin-Keller quantization for arbitrary potentials. https://doi.org/10.1119/1.2192788 (2006).
+
[5]
-
Matthew S. Church, Timothy J. H. Hele, Gregory S. Ezra, Nandini Ananth, Nonadiabatic semiclassical dynamics in the mixed quantum-classical initial value representation, https://doi.org/10.1063/1.5005557.
-
Coronado2001
+
N. Ananth, C. Venkataraman and W. H. Miller. Semiclassical description of electronically nonadiabatic dynamics via the initial value representation. https://doi.org/10.1063/1.2759932 (2007).
+
[6]
- -
Craig2004
+
J. E. Subotnik, A. Jain, B. Landry, A. Petit, W. Ouyang and N. Bellonzi. Understanding the Surface Hopping View of Electronic Transitions and Decoherence. https://doi.org/10.1146/annurev-physchem-040215-112245 (2016).
+
[7]
- -
gao2020
+
B. Leimkuhler and C. Matthews. {Rational Construction of Stochastic Numerical Methods for Molecular Sampling}. https://academic.oup.com/amrx/article-pdf/2013/1/34/397230/abs010.pdf (2012).
+
[8]
-
Xing Gao, Maximilian A. C. Saller, Yudan Liu, Aaron Kelly, Jeremy O. Richardson, Eitan Geva, Benchmarking {{Quasiclassical Mapping Hamiltonian Methods}} for {{Simulating Electronically Nonadiabatic Molecular Dynamics}}, Journal of Chemical Theory and Computation, acs.jctc.9b01267, 2020.
-
Gerrits2020
+
H. Risken and H. Haken. {The Fokker-Planck Equation: Methods of Solution and Applications Second Edition}. Springer (1989).
+
[9]
-
Nick Gerrits, J. I\~naki Juaristi, J\"org Meyer, Electronic friction coefficients from the atom-in-jellium model for $Z=1–92$, Phys. Rev. B, 102, 155130, 2020.
-
HammesSchiffer1994
+
J. O. Richardson and M. Thoss. Communication: Nonadiabatic ring-polymer molecular dynamics. https://doi.org/10.1063/1.4816124 (2013).
+
[10]
-
Sharon Hammes‐Schiffer, John C. Tully, Proton transfer in solution: Molecular dynamics with quantum transitions, https://doi.org/10.1063/1.467455.
-
Hase1996
+
J. O. Richardson, P. Meyer, M.-O. Pleinert and M. Thoss. An analysis of nonadiabatic ring-polymer molecular dynamics and its application to vibronic spectra. Chemical Physics 482, 124-134 (2017).
+
[11]
-
William L Hase, Ronald J Duchovic, Xiche Hu, Andrew Komornicki, Kieran F Lim, Da-hong Lu, Gilles H Peslherbe, Kandadai N Swamy, SR Vande Linde, Antonio Varandas, others, VENUS96, A general chemical dynamics computer program, QCPE, 16, 671, 1996.
-
HeGong2021
+
S. N. Chowdhury and P. Huo. State dependent ring polymer molecular dynamics for investigating excited nonadiabatic dynamics. https://doi.org/10.1063/1.5096276 (2019).
+
[12]
-
Xin He, Zhihao Gong, Baihua Wu, Jian Liu, Negative Zero-Point-Energy Parameter in the Meyer–Miller Mapping Model for Nonadiabatic Dynamics, https://doi.org/10.1021/acs.jpclett.1c00232.
-
HeWu2021
+
S. N. Chowdhury and P. Huo. Non-adiabatic Matsubara dynamics and non-adiabatic ring-polymer molecular dynamics. https://doi.org/10.1063/5.0042136 (2021).
+
[13]
-
Xin He, Baihua Wu, Zhihao Gong, Jian Liu, Commutator Matrix in Phase Space Mapping Models for Nonadiabatic Quantum Dynamics, https://doi.org/10.1021/acs.jpca.1c04429.
-
Korol2019
+
M. S. Church, T. J. Hele, G. S. Ezra and N. Ananth. Nonadiabatic semiclassical dynamics in the mixed quantum-classical initial value representation. https://doi.org/10.1063/1.5005557 (2018).
+
[14]
-
Roman Korol, Nawaf Bou-Rabee, Thomas F. Miller, Cayley modification for strongly stable path-integral and ring-polymer molecular dynamics, https://doi.org/10.1063/1.5120282.
-
Korol2020
+
R. Korol, N. Bou-Rabee and T. F. Miller. Cayley modification for strongly stable path-integral and ring-polymer molecular dynamics. https://doi.org/10.1063/1.5120282 (2019).
+
[15]
-
Roman Korol, Jorge L. Rosa-Raíces, Nawaf Bou-Rabee, Thomas F. Miller, Dimension-free path-integral molecular dynamics without preconditioning, https://doi.org/10.1063/1.5134810.
-
landry2013
+
I. R. Craig and D. E. Manolopoulos. Quantum statistics and classical mechanics: Real time correlation functions from ring polymer molecular dynamics. https://doi.org/10.1063/1.1777575 (2004).
+
[16]
-
Brian R. Landry, Martin J. Falk, Joseph E. Subotnik, Communication: {The} Correct Interpretation of Surface Hopping Trajectories: {How} to Calculate Electronic Properties, The Journal of Chemical Physics, 139(21), 211101, 2013.
-
Larkoski2006
+
M. Tuckerman. Statistical Mechanics: Theory and Molecular Simulation. {Oxford University Press} (2010).
+
[17]
-
Andrew J. Larkoski, David G. Ellis, Lorenzo J. Curtis, Numerical implementation of Einstein-Brillouin-Keller quantization for arbitrary potentials, https://doi.org/10.1119/1.2192788.
-
Leimkuhler2012
+
P. Shushkov, R. Li and J. C. Tully. Ring polymer molecular dynamics with surface hopping. https://doi.org/10.1063/1.4766449 (2012).
+
[18]
-
Benedict Leimkuhler, Charles Matthews, {Rational Construction of Stochastic Numerical Methods for Molecular Sampling}, https://academic.oup.com/amrx/article-pdf/2013/1/34/397230/abs010.pdf.
-
Richardson2017
+
F. A. Shakib and P. Huo. Ring Polymer Surface Hopping: Incorporating Nuclear Quantum Effects into Nonadiabatic Molecular Dynamics Simulations. https://doi.org/10.1021/acs.jpclett.7b01343 (2017).
+
[19]
-
Jeremy O. Richardson, Philipp Meyer, Marc-Oliver Pleinert, Michael Thoss, An analysis of nonadiabatic ring-polymer molecular dynamics and its application to vibronic spectra, Chemical Physics, 482, 124-134, 2017.
-
Richardson2013
+
B. R. Landry, M. J. Falk and J. E. Subotnik. Communication: {The} Correct Interpretation of Surface Hopping Trajectories: {How} to Calculate Electronic Properties. The Journal of Chemical Physics 139, 211101 (2013).
+
[20]
-
Jeremy O. Richardson, Michael Thoss, Communication: Nonadiabatic ring-polymer molecular dynamics, https://doi.org/10.1063/1.4816124.
-
Risken1989
+
R. Welsch, K. Song, Q. Shi, S. C. Althorpe and T. F. Miller. Non-equilibrium dynamics from RPMD and CMD. https://doi.org/10.1063/1.4967958 (2016).
+
[21]
-
H. Risken, H. Haken, {The Fokker-Planck Equation: Methods of Solution and Applications Second Edition}, Springer, 1989.
-
Shakib2017
+
Y. Zhang, R. J. Maurer, H. Guo and B. Jiang. Hot-electron effects during reactive scattering of H2 from Ag(111): the interplay between mode-specific electronic friction and the potential energy landscape. Chem. Sci. 10, 1089-1097 (2019).
+
[22]
- -
Shushkov2012
+
X. Gao, M. A. Saller, Y. Liu, A. Kelly, J. O. Richardson and E. Geva. Benchmarking {{Quasiclassical Mapping Hamiltonian Methods}} for {{Simulating Electronically Nonadiabatic Molecular Dynamics}}. Journal of Chemical Theory and Computation, acs.jctc.9b01267 (2020).
+
[23]
-
Philip Shushkov, Richard Li, John C. Tully, Ring polymer molecular dynamics with surface hopping, https://doi.org/10.1063/1.4766449.
-
Subotnik2016
+
E. A. Coronado, J. Xing and W. H. Miller. Ultrafast non-adiabatic dynamics of systems with multiple surface crossings: a test of the Meyer–Miller Hamiltonian with semiclassical initial value representation methods. Chemical Physics Letters 349, 521-529 (2001).
+
[24]
-
Joseph E. Subotnik, Amber Jain, Brian Landry, Andrew Petit, Wenjun Ouyang, Nicole Bellonzi, Understanding the Surface Hopping View of Electronic Transitions and Decoherence, https://doi.org/10.1146/annurev-physchem-040215-112245.
-
tuckerman2010
+
R. Korol, J. L. Rosa-Raíces, N. Bou-Rabee and T. F. Miller. Dimension-free path-integral molecular dynamics without preconditioning. https://doi.org/10.1063/1.5134810 (2020).
+
[25]
-
Mark Tuckerman, Statistical Mechanics: Theory and Molecular Simulation, {Oxford University Press}, 2010.
-
Tully1990
+
X. He, Z. Gong, B. Wu and J. Liu. Negative Zero-Point-Energy Parameter in the Meyer–Miller Mapping Model for Nonadiabatic Dynamics. https://doi.org/10.1021/acs.jpclett.1c00232 (2021).
+
[26]
-
John C. Tully, Molecular dynamics with electronic transitions, https://doi.org/10.1063/1.459170.
-
Welsch2016
+
X. He, B. Wu, Z. Gong and J. Liu. Commutator Matrix in Phase Space Mapping Models for Nonadiabatic Quantum Dynamics. https://doi.org/10.1021/acs.jpca.1c04429 (2021).
+
[27]
-
Ralph Welsch, Kai Song, Qiang Shi, Stuart C. Althorpe, Thomas F. Miller, Non-equilibrium dynamics from RPMD and CMD, https://doi.org/10.1063/1.4967958.
-
Maurer2019
+
S. Hammes‐Schiffer and J. C. Tully. Proton transfer in solution: Molecular dynamics with quantum transitions. https://doi.org/10.1063/1.467455 (1994).
+
[28]
- +
W. L. Hase, R. J. Duchovic, X. Hu, A. Komornicki, K. F. Lim, D.-h. Lu, G. H. Peslherbe, K. N. Swamy, S. V. Linde, A. Varandas and others. VENUS96, A general chemical dynamics computer program. QCPE 16, 671 (1996).
-
+
diff --git a/dev/saving_loading/index.html b/dev/saving_loading/index.html index f7922ea93..2d3231656 100644 --- a/dev/saving_loading/index.html +++ b/dev/saving_loading/index.html @@ -1,5 +1,5 @@ -Saving and loading · NQCDynamics.jl

Saving and loading

If you would like to split your workflow into multiple scripts (e.g. separately generating initial conditions and running dynamics) it is necessary to be able to store intermediate data in files.

When this data is atomic configurations or trajectories, it can be useful to use standard file formats such as those mentioned in the Atoms section previously. However, often it is more convenient to directly save and load Julia objects between sessions. For this purpose, we recommend using FileIO.jl with JLD2.jl.

Note

JLD2 can be used independently of FileIO. However, FileIO provides a unified interface for many file types and allows you to save data to lots of formats with consistent syntax.

As a simple example, suppose that we want the same system parameters across multiple scripts:

using NQCDynamics
+Saving and loading · NQCDynamics.jl

Saving and loading

If you would like to split your workflow into multiple scripts (e.g. separately generating initial conditions and running dynamics) it is necessary to be able to store intermediate data in files.

When this data is atomic configurations or trajectories, it can be useful to use standard file formats such as those mentioned in the Atoms section previously. However, often it is more convenient to directly save and load Julia objects between sessions. For this purpose, we recommend using FileIO.jl with JLD2.jl.

Note

JLD2 can be used independently of FileIO. However, FileIO provides a unified interface for many file types and allows you to save data to lots of formats with consistent syntax.

As a simple example, suppose that we want the same system parameters across multiple scripts:

using NQCDynamics
 
 atoms = Atoms([:H, :H, :C, :C])
 cell = PeriodicCell([10.0 0 0; 0 10.0 0; 0 0 10.0])
@@ -11,4 +11,4 @@
   m: Float64 1.0
   ω: Float64 1.0
   r₀: Float64 0.0
-  dofs: Int64 1

JLD2 is compatible with any Julia type so it widely usable for most of the types you encounter is NQCDynamics.jl and across all Julia packages.

+ dofs: Int64 1

JLD2 is compatible with any Julia type so it widely usable for most of the types you encounter is NQCDynamics.jl and across all Julia packages.

diff --git a/dev/search/index.html b/dev/search/index.html index 72a732189..413199456 100644 --- a/dev/search/index.html +++ b/dev/search/index.html @@ -1,2 +1,2 @@ -Search · NQCDynamics.jl

Loading search...

    +Search · NQCDynamics.jl

    Loading search...

      diff --git a/dev/search_index.js b/dev/search_index.js index 208a9746e..f365fa394 100644 --- a/dev/search_index.js +++ b/dev/search_index.js @@ -1,3 +1,3 @@ var documenterSearchIndex = {"docs": -[{"location":"examples/spinboson/#Ohmic-spin-boson-nonequilibrium-population-dynamics","page":"Ohmic spin-boson nonequilibrium population dynamics","title":"Ohmic spin-boson nonequilibrium population dynamics","text":"","category":"section"},{"location":"examples/spinboson/","page":"Ohmic spin-boson nonequilibrium population dynamics","title":"Ohmic spin-boson nonequilibrium population dynamics","text":"The spin-boson model is widely used as a model for condensed phase quantum dynamics. It is defined by a system-bath Hamiltonian where the system is a 2-state spin coupled to a bath of harmonic oscillators. This example shows how to perform nonequilibrium population dynamics with the spin-boson model using a bath characterised by the Ohmic spectral density. We will be using model B from the work of Xing Gao, Maximilian A. C. Saller, Yudan Liu, Aaron Kelly, Jeremy O. Richardson, Eitan Geva (2020).","category":"page"},{"location":"examples/spinboson/","page":"Ohmic spin-boson nonequilibrium population dynamics","title":"Ohmic spin-boson nonequilibrium population dynamics","text":"Our boson bath will have 100 oscillators, each with a mass of 1. Here, we also set up the model with the ohmic density and the parameters that match up with our reference (Xing Gao, Maximilian A. C. Saller, Yudan Liu, Aaron Kelly, Jeremy O. Richardson, Eitan Geva (2020)). The ohmic density is given a cutoff frequency of 2.5 and a Kondo parameter of 0.09. The model is symmetric, with the energy bias between states equal to 0.0, and the coupling between states set to 1.","category":"page"},{"location":"examples/spinboson/","page":"Ohmic spin-boson nonequilibrium population dynamics","title":"Ohmic spin-boson nonequilibrium population dynamics","text":"using NQCDynamics\nN = 100\natoms = Atoms(fill(1, N))\nβ = 5\nT = 1 / β\ndensity = OhmicSpectralDensity(2.5, 0.09)\nmodel = SpinBoson(density, N, 0.0, 1.0)\nnothing # hide","category":"page"},{"location":"examples/spinboson/#Initial-conditions","page":"Ohmic spin-boson nonequilibrium population dynamics","title":"Initial conditions","text":"","category":"section"},{"location":"examples/spinboson/","page":"Ohmic spin-boson nonequilibrium population dynamics","title":"Ohmic spin-boson nonequilibrium population dynamics","text":"For the initial conditions, we will sample directly from a Wigner distribution for the nuclear degrees of freedom. Since our nuclear degrees of freedom are harmonic, the Wigner distribution has an analytic form and we can use the distributions included in the package. The position and velocity variables we create here are Matrixs of Normal distributions, which are shaped to match the system size (1, N). Inside the DynamicalDistribution they will provide samples that match the size of the system. The initial electronic state is confined to 1 with PureState(1).","category":"page"},{"location":"examples/spinboson/","page":"Ohmic spin-boson nonequilibrium population dynamics","title":"Ohmic spin-boson nonequilibrium population dynamics","text":"position = reshape([PositionHarmonicWigner(ω, β, 1) for ω in model.ωⱼ], 1, :)\nvelocity = reshape([VelocityHarmonicWigner(ω, β, 1) for ω in model.ωⱼ], 1, :)\ndistribution = DynamicalDistribution(velocity, position, (1, 100)) * PureState(1)\nnothing # hide","category":"page"},{"location":"examples/spinboson/#Dynamics","page":"Ohmic spin-boson nonequilibrium population dynamics","title":"Dynamics","text":"","category":"section"},{"location":"examples/spinboson/","page":"Ohmic spin-boson nonequilibrium population dynamics","title":"Ohmic spin-boson nonequilibrium population dynamics","text":"Now that we have a distribution from which we can sample our initial conditions, we can run ensembles of trajectories and calculate the population correlation functions. Let's compare the results obtained using FSSH and Ehrenfest.","category":"page"},{"location":"examples/spinboson/","page":"Ohmic spin-boson nonequilibrium population dynamics","title":"Ohmic spin-boson nonequilibrium population dynamics","text":"fssh = Simulation{FSSH}(atoms, model)\nehrenfest = Simulation{Ehrenfest}(atoms, model)\n\nsaveat = 0:0.1:20\noutput = TimeCorrelationFunctions.PopulationCorrelationFunction(fssh, Diabatic())\nensemble_fssh = run_dynamics(fssh, (0.0, 20.0), distribution;\n saveat=saveat, trajectories=100, output, reduction=MeanReduction(), dt=0.1)\noutput = TimeCorrelationFunctions.PopulationCorrelationFunction(ehrenfest, Diabatic())\nensemble_ehrenfest = run_dynamics(ehrenfest, (0.0, 20.0), distribution;\n saveat=saveat, trajectories=100, output, reduction=MeanReduction(), dt=0.1)\nnothing # hide","category":"page"},{"location":"examples/spinboson/","page":"Ohmic spin-boson nonequilibrium population dynamics","title":"Ohmic spin-boson nonequilibrium population dynamics","text":"Here, we can see the population difference between the two states.","category":"page"},{"location":"examples/spinboson/","page":"Ohmic spin-boson nonequilibrium population dynamics","title":"Ohmic spin-boson nonequilibrium population dynamics","text":"using Plots\nplot(saveat, [p[1,1] - p[1,2] for p in ensemble_fssh[:PopulationCorrelationFunction]], label=\"FSSH\")\nplot!(saveat, [p[1,1] - p[1,2] for p in ensemble_ehrenfest[:PopulationCorrelationFunction]], label=\"Ehrenfest\")\nxlabel!(\"Time /a.u.\")\nylabel!(\"Population difference\")","category":"page"},{"location":"examples/spinboson/","page":"Ohmic spin-boson nonequilibrium population dynamics","title":"Ohmic spin-boson nonequilibrium population dynamics","text":"The exact result for this model, along with various mapping methods can be found in the work of Xing Gao, Maximilian A. C. Saller, Yudan Liu, Aaron Kelly, Jeremy O. Richardson, Eitan Geva (2020). We can see that even with just 100 trajectories, our Ehrenfest result closely matches theirs. The FSSH is quite clearly underconverged with only 100 trajectories due to the discontinuous nature of the individual trajectories. Feel free to try this for yourself and see what the converged FSSH result looks like!","category":"page"},{"location":"examples/tully_scattering/#examples-tully-model-two","page":"Scattering probabilities for TullyModelTwo","title":"Scattering probabilities for TullyModelTwo","text":"","category":"section"},{"location":"examples/tully_scattering/","page":"Scattering probabilities for TullyModelTwo","title":"Scattering probabilities for TullyModelTwo","text":"In this section we aim to reproduce the results of Fig. 5 from John C. Tully (1990). This figure presents the scattering outcomes when a particle interacts with Tully's model 2 with an increasing magnitude of incident kinetic energy.","category":"page"},{"location":"examples/tully_scattering/","page":"Scattering probabilities for TullyModelTwo","title":"Scattering probabilities for TullyModelTwo","text":"To reproduce this figure, first, let's set up our system parameters:","category":"page"},{"location":"examples/tully_scattering/","page":"Scattering probabilities for TullyModelTwo","title":"Scattering probabilities for TullyModelTwo","text":"using NQCDynamics\n\nsim = Simulation{FSSH}(Atoms(2000), TullyModelTwo())","category":"page"},{"location":"examples/tully_scattering/","page":"Scattering probabilities for TullyModelTwo","title":"Scattering probabilities for TullyModelTwo","text":"!!! note Atomic units","category":"page"},{"location":"examples/tully_scattering/","page":"Scattering probabilities for TullyModelTwo","title":"Scattering probabilities for TullyModelTwo","text":"Recall that all of are units are atomic by default, this mass of 2000 is similar to\nthat of a hydrogen atom.","category":"page"},{"location":"examples/tully_scattering/","page":"Scattering probabilities for TullyModelTwo","title":"Scattering probabilities for TullyModelTwo","text":"Each data point in the figure is obtained from an ensemble average of trajectories. We can use our Ensembles setup to run a set of trajectories for every single momentum value. Firstly, we can prepare the parts that will be the same for every ensemble:","category":"page"},{"location":"examples/tully_scattering/","page":"Scattering probabilities for TullyModelTwo","title":"Scattering probabilities for TullyModelTwo","text":"using ComponentArrays: ComponentVector\n\noutput = OutputStateResolvedScattering1D(sim, :adiabatic)","category":"page"},{"location":"examples/tully_scattering/","page":"Scattering probabilities for TullyModelTwo","title":"Scattering probabilities for TullyModelTwo","text":"Here, we are using the OutputStateResolvedScattering1D along with the MeanReduction which will give us the average scattering outcome from the entire ensemble. Each trajectory outputs the scattering outcome along with its final adiabatic state, and the reduction computes the average over all trajectories.","category":"page"},{"location":"examples/tully_scattering/","page":"Scattering probabilities for TullyModelTwo","title":"Scattering probabilities for TullyModelTwo","text":"Next, we can choose how many trajectories we want to perform for each ensemble, and choose the range of momentum values:","category":"page"},{"location":"examples/tully_scattering/","page":"Scattering probabilities for TullyModelTwo","title":"Scattering probabilities for TullyModelTwo","text":"trajectories = 500\nmomenta = 9:2:50","category":"page"},{"location":"examples/tully_scattering/","page":"Scattering probabilities for TullyModelTwo","title":"Scattering probabilities for TullyModelTwo","text":"note: Range notation\nHere we uses Julia's range operator to generate a set of values from 9 to 50 with a spacing of 2: 9, 11, 13, ..., 49. The final value of 50 is not included since a step size of 2 starting from 9 allows us to include only odd numbers.","category":"page"},{"location":"examples/tully_scattering/","page":"Scattering probabilities for TullyModelTwo","title":"Scattering probabilities for TullyModelTwo","text":"Since each ensemble requires different initial conditions, we will specify the trajectory timespan and the distribution inside the loop. Before the loop begins, we will create an empty list to store the results, and append to this list after every iteration. The distribution we create produces initial conditions where each trajectory has momentum k and starts at a position of -5. ","category":"page"},{"location":"examples/tully_scattering/","page":"Scattering probabilities for TullyModelTwo","title":"Scattering probabilities for TullyModelTwo","text":"result = []\nfor k in momenta # Iterate through each momentum value\n v = k / sim.atoms.masses[1] # Starting velocity\n r = -5 # Starting position\n tspan = (0, 2abs(r)/v)\n distribution = DynamicalDistribution(v, -5, size(sim)) * PureState(1, Adiabatic())\n\n out = run_dynamics(sim, tspan, distribution;\n saveat=tspan[end], trajectories, output, reduction=MeanReduction()\n )\n\n push!(result, out[:OutputStateResolvedScattering1D])\nend\n\nresult","category":"page"},{"location":"examples/tully_scattering/","page":"Scattering probabilities for TullyModelTwo","title":"Scattering probabilities for TullyModelTwo","text":"tip: Adaptive timespan\nSince the trajectories with larger momentum will exit the scattering region sooner, we scale the timespan to save computational time. Using tspan = (0, 2abs(r)/v) allows enough time such that a particle will be able to travel a total distance of 2r at a constant velocity of v. This is sufficient to ensure the particle has left the interaction region. Alternatively, we could define a callback to terminate the simulation early.","category":"page"},{"location":"examples/tully_scattering/","page":"Scattering probabilities for TullyModelTwo","title":"Scattering probabilities for TullyModelTwo","text":"Now we can plot our simulation results. We format this plot to match Fig. 3 from Farnaz A. Shakib, Pengfei Huo (2017) which also reproduces Fig. 5 from John C. Tully (1990). We manage to reproduce the FSSH results quite accurately by visual comparison, though a larger number of trajectories would lead to better convergence. Since all of the examples run during the documentation build, we use a minimal number of trajectories to optimise the build time.","category":"page"},{"location":"examples/tully_scattering/","page":"Scattering probabilities for TullyModelTwo","title":"Scattering probabilities for TullyModelTwo","text":"using CairoMakie\n\nf = Figure()\nax = Axis(f[1,1], xlabel=\"Incident momentum / a.u.\", ylabel=\"Scattering probability\")\n\nr1 = [r.reflection[1] for r in result]\nt1 = [r.transmission[1] for r in result]\nt2 = [r.transmission[2] for r in result]\n\nscatter!(ax, momenta, r1; label=\"R1\", color=:red)\nscatter!(ax, momenta, t1; label=\"T1\", color=:green)\nscatter!(ax, momenta, t2; label=\"T2\", color=:blue)\naxislegend(ax)\n\nf","category":"page"},{"location":"examples/tully_scattering/","page":"Scattering probabilities for TullyModelTwo","title":"Scattering probabilities for TullyModelTwo","text":"As in Farnaz A. Shakib, Pengfei Huo (2017), R1, T1, T2 refer to reflection on state 1, transmission on state 1 and transmission on state 2 respectively. For this model, surface hopping is successful in closely approximating the exact quantum result, especially at higher momentum values. Refer to John C. Tully (1990) and Farnaz A. Shakib, Pengfei Huo (2017) for a detailed discussion of the results.","category":"page"},{"location":"api/NQCModels/nninterfaces/#NNInterfaces","page":"NNInterfaces","title":"NNInterfaces","text":"","category":"section"},{"location":"api/NQCModels/nninterfaces/","page":"NNInterfaces","title":"NNInterfaces","text":"Modules=[NNInterfaces]","category":"page"},{"location":"api/NQCModels/nninterfaces/#NNInterfaces.H2AgModel","page":"NNInterfaces","title":"NNInterfaces.H2AgModel","text":"J. Phys. Chem. Lett. 2019, 10, 4962−4967 J. Phys. Chem. C 2020, 124, 186−195\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/frictionmodels/#FrictionModels","page":"FrictionModels","title":"FrictionModels","text":"","category":"section"},{"location":"api/NQCModels/frictionmodels/","page":"FrictionModels","title":"FrictionModels","text":"Modules=[NQCModels.FrictionModels]","category":"page"},{"location":"api/NQCModels/frictionmodels/#NQCModels.FrictionModels.ASEFrictionProvider","page":"FrictionModels","title":"NQCModels.FrictionModels.ASEFrictionProvider","text":"ASEFrictionProvider{A} <: ElectronicFrictionProvider\n\nObtain the electronic friction from an ASE calculator that implements get_friction_tensor. Assumes that the units of friction are \"eV/Å/Å\". Construct by passing the ase atoms object with the calculator already attached.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/frictionmodels/#NQCModels.FrictionModels.AdiabaticFrictionModel","page":"FrictionModels","title":"NQCModels.FrictionModels.AdiabaticFrictionModel","text":"AdiabaticFrictionModel <: AdiabaticModel\n\nAdiabaticFrictionModels must implement potential!, derivative!, and friction!\n\npotential! and friction! should be the same as for the AdiabaticModel.\n\nfriction! must fill an AbstractMatrix with size = (ndofs*natoms, ndofs*natoms).\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/frictionmodels/#NQCModels.FrictionModels.CompositeFrictionModel","page":"FrictionModels","title":"NQCModels.FrictionModels.CompositeFrictionModel","text":"CompositeFrictionModel{M,F} <: AdiabaticFrictionModel\n\nCombine an AdiabaticModel with an ElectronicFrictionProvider.\n\nThis allows for arbitrary composition of potentials and friction providers, such that any adiabatic model can be augmented with any form of electronic friction.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/frictionmodels/#NQCModels.FrictionModels.ElectronicFrictionProvider","page":"FrictionModels","title":"NQCModels.FrictionModels.ElectronicFrictionProvider","text":"ElectronicFrictionProvider\n\nAbstract type for defining models that provide electronic friction only. Subtypes of this should implement friction! and ndofs.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/frictionmodels/#NQCModels.FrictionModels.RandomFriction","page":"FrictionModels","title":"NQCModels.FrictionModels.RandomFriction","text":"RandomFriction <: ElectronicFrictionProvider\n\nProvide a random positive semi-definite matrix of friction values. Used mostly for testing and examples.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/frictionmodels/#NQCModels.FrictionModels.friction!","page":"FrictionModels","title":"NQCModels.FrictionModels.friction!","text":"friction!(model::AdiabaticFrictionModel, F, R:AbstractMatrix)\n\nFill F with the electronic friction as a function of the positions R.\n\nThis need only be implemented for AdiabaticFrictionModels.\n\n\n\n\n\n","category":"function"},{"location":"api/NQCModels/frictionmodels/#NQCModels.FrictionModels.friction-Tuple{NQCModels.FrictionModels.AdiabaticFrictionModel, Any}","page":"FrictionModels","title":"NQCModels.FrictionModels.friction","text":"friction(model::Model, R)\n\nObtain the friction for the current position R.\n\nThis is an allocating version of friction!.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/calculators/#Calculators","page":"Calculators","title":"Calculators","text":"","category":"section"},{"location":"api/NQCDynamics/calculators/","page":"Calculators","title":"Calculators","text":"Modules=[NQCDynamics.Calculators]","category":"page"},{"location":"api/NQCDynamics/calculators/#NQCDynamics.Calculators","page":"Calculators","title":"NQCDynamics.Calculators","text":"Calculators\n\nThis module exists to bridge the gap between the Models and the Dynamics.\n\nHere, we provide functions and types for evaluating and storing quantities obtained from the Models. In addition any further manipulation of those quantities, such as computing eigenvalues, is included here.\n\nThis module is largely needed to facilitate integration of both ring polymer and classical dynamics to allow using the same models and functions for both. Specific ring polymer types are provided that have the extra fields and methods needed to evaluate the quantities for each bead. \n\n\n\n\n\n","category":"module"},{"location":"api/NQCDynamics/calculators/#NQCDynamics.Calculators.quantities","page":"Calculators","title":"NQCDynamics.Calculators.quantities","text":"Each of the quantities specified here has functions: get_quantity(calculator, r) evaluate_quantity!(calculator, r)!\n\nThe user should access only the former. This will ensure quantities are correctly evaluated and cached accordingly.\n\nThe latter is called by the former and is where the details required to calculate the quantity are found.\n\n\n\n\n\n","category":"constant"},{"location":"api/NQCDynamics/calculators/#NQCDynamics.Calculators.AbstractCalculator","page":"Calculators","title":"NQCDynamics.Calculators.AbstractCalculator","text":"AbstractCalculator{M<:Model}\n\nTop-level type for all calculators.\n\nEach concrete calculator contains the Model and the fields to store the quantities obtained from the model.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDynamics/calculators/#NQCDynamics.Calculators.evaluate_nonadiabatic_coupling-Tuple{StaticArraysCore.SMatrix, StaticArraysCore.SVector}","page":"Calculators","title":"NQCDynamics.Calculators.evaluate_nonadiabatic_coupling","text":"References\n\nHammesSchifferTullyJChemPhys10146571994 Eq. (32)\nSubotnikBellonziAnnuRevPhyschem673872016, section 2.3\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/calculators/#NQCDynamics.Calculators.update_electronics!-Tuple{NQCDynamics.Calculators.AbstractDiabaticCalculator, AbstractArray}","page":"Calculators","title":"NQCDynamics.Calculators.update_electronics!","text":"Evaluates all electronic properties for the current position r.\n\nProperties evaluated:\n\nDiabatic potential\nDiabatic derivative\nEigenvalues and eigenvectors\nAdiabatic derivative\nNonadiabatic coupling\n\nThis should no longer be used, instead access the quantities directly with get_quantity(calc, r).\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#DynamicsMethods","page":"DynamicsMethods","title":"DynamicsMethods","text":"","category":"section"},{"location":"api/NQCDynamics/dynamicsmethods/","page":"DynamicsMethods","title":"DynamicsMethods","text":"Modules=[NQCDynamics.DynamicsMethods]","category":"page"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods","text":"This module contains functions and types necessary for performing nonadiabatic molecular dynamics.\n\nDynamics is performed using DifferentialEquations.jl. As such, this module is centered around the implementation of the functions necessary to integrate the dynamics.\n\nFor deterministic Hamiltonian methods, the central function is DynamicsMethods.motion!, which is the inplace form of the function to be integrated by DifferentialEquations.jl.\n\nFurther, methods that have discontinuities, such as surface hopping, use the callback interface provided by DifferentialEquations.jl.\n\n\n\n\n\n","category":"module"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.Method","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.Method","text":"Each type of dynamics subtypes Method which is passed to the AbstractSimulation as a parameter to determine the type of dynamics desired.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.DynamicsVariables-Tuple{NQCDynamics.AbstractSimulation, Any, Any}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.DynamicsVariables","text":"DynamicsVariables(::AbstractSimulation, args...)\n\nFor each dynamics method this function is implemented to provide the variables for the dynamics in the appropriate format.\n\nBy default, DynamicsVariables is set up for the classical case and takes sim, v, r as arguments and returns a ComponentVector(v=v, r=r) which is used as a container for the velocities and positions during classical dynamics.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.create_problem-Tuple{Any, Any, Any}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.create_problem","text":"Provides the DEProblem for each type of simulation.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.get_callbacks-Tuple{NQCDynamics.AbstractSimulation}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.get_callbacks","text":"Select the default callbacks for this simulation type.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.motion!","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.motion!","text":"motion!(du, u, sim, t)\n\nAs per DifferentialEquations.jl, this function is implemented for each method and defines the time derivatives of the DynamicalVariables.\n\nWe require that each implementation ensures du and u are subtypes of DynamicalVariables and sim subtypes AbstractSimulation.\n\n\n\n\n\n","category":"function"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.select_algorithm-Tuple{NQCDynamics.AbstractSimulation}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.select_algorithm","text":"Choose a default algorithm for solving the differential equation.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#ClassicalMethods","page":"DynamicsMethods","title":"ClassicalMethods","text":"","category":"section"},{"location":"api/NQCDynamics/dynamicsmethods/","page":"DynamicsMethods","title":"DynamicsMethods","text":"Modules=[NQCDynamics.DynamicsMethods.ClassicalMethods]","category":"page"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.ClassicalMethods.Classical","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.ClassicalMethods.Classical","text":"Classical <: DynamicsMethods.Method\n\nType for performing classical molecular dynamics.\n\nsim = Simulation{Classical}(Atoms(:H), Harmonic())\n\n# output\n\nSimulation{Classical}:\n Atoms{Float64}([:H], [1], [1837.4715941070515])\n Harmonic{Float64, Float64, Float64}\n m: Float64 1.0\n ω: Float64 1.0\n r₀: Float64 0.0\n dofs: Int64 1\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.ClassicalMethods.Langevin","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.ClassicalMethods.Langevin","text":"Type for performing Langevin molecular dynamics.\n\nusing Unitful\nsim = Simulation{Langevin}(Atoms(:H), Free(); γ=2.5, temperature=100u\"K\")\n\n# output\n\nSimulation{Langevin{Float64}}:\n Atoms{Float64}([:H], [1], [1837.4715941070515])\n Free(1)\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.ClassicalMethods.MDEF","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.ClassicalMethods.MDEF","text":"dr = v dt\ndv = -Delta UM dt - Gamma v dt + sigma sqrt2Gamma dW\n\nGamma is the friction tensor with units of inverse time. For thermal dynamics we set sigma = sqrtkT M, where T is the electronic temperature.\n\nThis is integrated using the BAOAB algorithm where the friction \"O\" step is performed in the tensor's eigenbasis. See src/dynamics/mdef_baoab.jl for details.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.ClassicalMethods.ThermalLangevin","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.ClassicalMethods.ThermalLangevin","text":"Type for performing Langevin ring polymer molecular dynamics.\n\nCurrently there are separate types for classical and ring polymer versions of Langevin dynamics but they should be combined. The reason they are not at the moment is that they use different integration algorithms and require slightly different fields.\n\nusing Unitful\nRingPolymerSimulation{ThermalLangevin}(Atoms(:H), Free(), 10; γ=0.1, temperature=25u\"K\")\n\n# output\n\nRingPolymerSimulation{ThermalLangevin{Float64}}:\n \n Atoms{Float64}([:H], [1], [1837.4715941070515])\n \n Free(1)\n with 10 beads.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.ClassicalMethods.acceleration!-Tuple{Any, Any, Any, NQCDynamics.AbstractSimulation, Any}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.ClassicalMethods.acceleration!","text":"f1 in DifferentialEquations.jl docs.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.ClassicalMethods.friction!-Tuple{Any, Any, NQCDynamics.AbstractSimulation{<:NQCDynamics.DynamicsMethods.ClassicalMethods.AbstractMDEF}, Any}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.ClassicalMethods.friction!","text":"friction!(g, r, sim, t)\n\nEvaluates friction tensor\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#MappingVariableMethods","page":"DynamicsMethods","title":"MappingVariableMethods","text":"","category":"section"},{"location":"api/NQCDynamics/dynamicsmethods/","page":"DynamicsMethods","title":"DynamicsMethods","text":"Modules=[NQCDynamics.DynamicsMethods.MappingVariableMethods]","category":"page"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.MappingVariableMethods.NRPMD","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.MappingVariableMethods.NRPMD","text":"NRPMD{T} <: DynamicsMethods.Method\n\nNonadiabatic ring polymer molecular dynamics Uses Meyer-Miller-Stock-Thoss mapping variables for electronic degrees of freedom and ring polymer formalism for nuclear degrees of freedom.\n\nRingPolymerSimulation{NRPMD}(Atoms(:H), DoubleWell(), 10)\n\n# output\n\nRingPolymerSimulation{NRPMD{Float64}}:\n \n Atoms{Float64}([:H], [1], [1837.4715941070515])\n \n DoubleWell{Int64, Int64, Int64, Int64}\n mass: Int64 1\n ω: Int64 1\n γ: Int64 1\n Δ: Int64 1\n \n with 10 beads.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.MappingVariableMethods.eCMM","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.MappingVariableMethods.eCMM","text":"eCMM{T} <: DynamicsMethods.Method\n\nReferences\n\nXin He, Zhihao Gong, Baihua Wu, Jian Liu (2021)\nXin He, Baihua Wu, Zhihao Gong, Jian Liu (2021)\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDynamics/dynamicsmethods/#SurfaceHoppingMethods","page":"DynamicsMethods","title":"SurfaceHoppingMethods","text":"","category":"section"},{"location":"api/NQCDynamics/dynamicsmethods/","page":"DynamicsMethods","title":"DynamicsMethods","text":"Modules=[NQCDynamics.DynamicsMethods.SurfaceHoppingMethods]","category":"page"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.SurfaceHoppingMethods","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.SurfaceHoppingMethods","text":"SurfaceHoppingMethods\n\nImplementation for surface hopping methods.\n\n\n\n\n\n","category":"module"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.AdiabaticIESH","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.AdiabaticIESH","text":"IESH{T} <: SurfaceHopping\n\nIndependent electron surface hopping.\n\nReferences\n\nShenvi, Roy, Tully, J. Chem. Phys. 130, 174107 (2009)\nRoy, Shenvi, Tully, J. Chem. Phys. 130, 174716 (2009)\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.BCME","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.BCME","text":"BCME{T} <: ClassicalMasterEquation\n\nExtension to CME that incorporates broadening in the potential energy surfaces.\n\nNote that we do not rescale the velocity as this is not mentioned only in the 2016 paper, not any of the later ones, so I presume they later decided not to do it and instead keep it the same as the original CME.\n\nDou, Subotnik, J. Chem. Phys. 144, 024116 (2016)\nDou, Subotnik, J. Phys. Chem. A, 24, 757-771 (2020)\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.CME","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.CME","text":"CME{T} <: ClassicalMasterEquation\n\nSimple surface hopping method for Newns-Anderson (Anderson-Holstein) models.\n\nDou, Nitzan, Subotnik, J. Chem. Phys. 142, 084110 (2015)\nDou, Subotnik, J. Phys. Chem. A, 24, 757-771 (2020)\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.DecoherenceCorrectionEDC","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.DecoherenceCorrectionEDC","text":"DecoherenceCorrectionEDC{T}\n\nEnergy decoherence correction of Granucci and Persico in J. Chem. Phys. 126, 134114 (2007).\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.FSSH","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.FSSH","text":"FSSH{T} <: SurfaceHopping\n\nType for fewest-switches surface hopping\n\nSimulation{FSSH}(Atoms(:H), Free())\n\n# output\n\nSimulation{FSSH{Float64}}:\n Atoms{Float64}([:H], [1], [1837.4715941070515])\n Free(1)\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.SurfaceHopping","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.SurfaceHopping","text":"Abstract type for all surface hopping methods.\n\nSurface hopping methods follow the structure set out in this file. The nuclear and electronic variables are propagated by the motion! function. The surface hopping procedure is handled by the HoppingCallback which uses the functions check_hop! and execute_hop! as its condition and affect!.\n\nTo add a new surface hopping scheme, you must create a new struct and define methods for evaluate_hopping_probability!, select_new_state, and rescale_velocity!.\n\nSee fssh.jl for an example implementation.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.apply_decoherence_correction!-Union{Tuple{T}, Tuple{AbstractVector, NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.DecoherenceCorrectionEDC, Integer, T, AbstractVector, T}} where T","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.apply_decoherence_correction!","text":"Eq. 17 in J. Chem. Phys. 126, 134114 (2007)\n\nModify the wavefunction coefficients in ψ after a successful surface hop.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.calculate_Akj-Tuple{NQCDynamics.AbstractSimulation{<:NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.AbstractIESH}, AbstractMatrix, AbstractMatrix, Number, Vector}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.calculate_Akj","text":"Equation 17 in Shenvi, Roy, Tully 2009. Uses equations 19 and 20.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.calculate_a-Tuple{NQCDynamics.AbstractSimulation{<:NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.SurfaceHopping}, AbstractMatrix}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.calculate_a","text":"calculate_a(sim::AbstractSimulation{<:SurfaceHopping}, coupling::AbstractMatrix)\n\nEquation 40 from Sharon Hammes‐Schiffer, John C. Tully (1994).\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.calculate_b-Tuple{AbstractMatrix, AbstractMatrix}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.calculate_b","text":"calculate_b(coupling::AbstractMatrix, velocity::AbstractMatrix)\n\nEquation 41 from Sharon Hammes‐Schiffer, John C. Tully (1994).\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.compute_overlap!-Tuple{NQCDynamics.AbstractSimulation{<:AdiabaticIESH}, Matrix, Any, Any}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.compute_overlap!","text":"Equation 20 in Shenvi, Roy, Tully 2009.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.evaluate_broadening-NTuple{5, Any}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.evaluate_broadening","text":"evaluate_broadening(h, μ, β, Γ)\n\nEvaluate the convolution of the Fermi function with a Lorentzian.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.evaluate_hopping_probability!-Tuple{NQCDynamics.AbstractSimulation{<:FSSH}, Any, Any}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.evaluate_hopping_probability!","text":"evaluate_hopping_probability!(sim::Simulation{<:FSSH}, u, dt)\n\nEvaluates the probability of hopping from the current state to all other states\n\nImplementation\n\nσ is Hermitan so the choice σ[m,s] or σ[s,m] is irrelevant; we take the real part.\n'd' is skew-symmetric so here the indices are important.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.evaluate_hopping_probability!-Tuple{NQCDynamics.AbstractSimulation{<:NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.AbstractIESH}, Any, Any, Any}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.evaluate_hopping_probability!","text":"Hopping probability according to equation 21 in Shenvi, Roy, Tully 2009.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.evaluate_hopping_probability!-Tuple{NQCDynamics.AbstractSimulation{<:NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.SurfaceHopping}, Any, Any}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.evaluate_hopping_probability!","text":"This function should set the field sim.method.hopping_probability.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.extract_nonadiabatic_coupling-Tuple{Any, Any, Any}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.extract_nonadiabatic_coupling","text":"extract_nonadiabatic_coupling(coupling, new_state, old_state)\n\nExtract the nonadiabatic coupling vector between states new_state and old_state\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.iesh_diabatic_population-Tuple{AbstractMatrix, AbstractMatrix, AbstractVector}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.iesh_diabatic_population","text":"Calculate the diabatic population in J. Chem. Theory Comput. 2022, 18, 4615−4626. Eqs. 12, 13 and 14 describe the steps to calculat it though the code is written to use matrix operations instead of summations to calculate the result.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.perform_rescaling!-Tuple{NQCDynamics.AbstractSimulation{<:NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.SurfaceHopping}, Any, Any, Any}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.perform_rescaling!","text":"perform_rescaling!(\n sim::AbstractSimulation{<:SurfaceHopping}, velocity, velocity_rescale, d\n)\n\nEquation 33 from Sharon Hammes‐Schiffer, John C. Tully (1994).\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.rescale_velocity!-Tuple{NQCDynamics.AbstractSimulation{<:NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.SurfaceHopping}, Any}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.rescale_velocity!","text":"rescale_velocity!(sim::AbstractSimulation{<:SurfaceHopping}, u)::Bool\n\nRescale the velocity in the direction of the nonadiabatic coupling.\n\nReferences\n\nSharon Hammes‐Schiffer, John C. Tully (1994)\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.select_new_state-Tuple{NQCDynamics.AbstractSimulation{<:NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.SurfaceHopping}, Any}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.select_new_state","text":"This function should return the desired state determined by the probability. Should return the original state if no hop is desired.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.unpack_states-Tuple{NQCDynamics.AbstractSimulation{<:FSSH}}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.unpack_states","text":"unpack_states(sim)\n\nGet the two states that we are hopping between.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsUtils.acceleration!-Tuple{Any, Any, Any, Simulation{<:NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.AbstractIESH}, Any, Any}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsUtils.acceleration!","text":"Set the acceleration due to the force from the currently occupied states. See Eq. 12 of Shenvi, Tully JCP 2009 paper.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsUtils.set_quantum_derivative!-Tuple{Any, Any, NQCDynamics.AbstractSimulation{<:AdiabaticIESH}}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsUtils.set_quantum_derivative!","text":"Propagation of electronic wave function happens according to Eq. (14) in the Shenvi, Tully paper (JCP 2009)\n\nIn IESH each electron is independent so we can loop through electrons and set the derivative one at a time, in the standard way for FSSH.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#EhrenfestMethods","page":"DynamicsMethods","title":"EhrenfestMethods","text":"","category":"section"},{"location":"api/NQCDynamics/dynamicsmethods/","page":"DynamicsMethods","title":"DynamicsMethods","text":"Modules=[NQCDynamics.DynamicsMethods.EhrenfestMethods]","category":"page"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.EhrenfestMethods.AbstractEhrenfest","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.EhrenfestMethods.AbstractEhrenfest","text":"Abstract type for Ehrenfest method.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.EhrenfestMethods.Ehrenfest","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.EhrenfestMethods.Ehrenfest","text":"Ehrenfest{T} <: AbstractEhrenfest\n\nEhrenfest molecular dynamics. Classical molecular dynamics where the force is derived by averaging contributions from multiple electronic states.\n\nSimulation{Ehrenfest}(Atoms(:H), DoubleWell())\n\n# output\n\nSimulation{Ehrenfest{Float64}}:\n Atoms{Float64}([:H], [1], [1837.4715941070515])\n DoubleWell{Int64, Int64, Int64, Int64}\n mass: Int64 1\n ω: Int64 1\n γ: Int64 1\n Δ: Int64 1\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDynamics/dynamicsmethods/#IntegrationAlgorithms","page":"DynamicsMethods","title":"IntegrationAlgorithms","text":"","category":"section"},{"location":"api/NQCDynamics/dynamicsmethods/","page":"DynamicsMethods","title":"DynamicsMethods","text":"Modules=[NQCDynamics.DynamicsMethods.IntegrationAlgorithms]","category":"page"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.IntegrationAlgorithms.MInt","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.IntegrationAlgorithms.MInt","text":"MInt <: OrdinaryDiffEq.OrdinaryDiffEqAlgorithm\n\nSecond order symplectic momentum integral algorithm.\n\nReference\n\nJ. Chem. Phys. 148, 102326 (2018)\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.IntegrationAlgorithms.RingPolymerMInt","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.IntegrationAlgorithms.RingPolymerMInt","text":"RingPolymerMInt <: OrdinaryDiffEq.OrdinaryDiffEqAlgorithm\n\nSecond order symplectic momentum integral algorithm applied to NRPMD.\n\nReference\n\nJ. Chem. Phys. 148, 102326 (2018)\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.IntegrationAlgorithms.get_C_propagator-Tuple{AbstractVector, AbstractMatrix, Real}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.IntegrationAlgorithms.get_C_propagator","text":"Get the C propagator for the mapping variables.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.IntegrationAlgorithms.get_D_propagator-Tuple{AbstractVector, AbstractMatrix, Real}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.IntegrationAlgorithms.get_D_propagator","text":"Get the D propagator for the mapping variables.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.IntegrationAlgorithms.get_gamma-Tuple{AbstractMatrix, AbstractVector, Real}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.IntegrationAlgorithms.get_gamma","text":"Get the Γ variable used to calculate the nuclear propagators.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.IntegrationAlgorithms.get_mapping_nuclear_force-Tuple{AbstractVector, AbstractVector, AbstractMatrix, AbstractMatrix, Any}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.IntegrationAlgorithms.get_mapping_nuclear_force","text":"Get the force due to the mapping variables.\n\nEquivalent to this but doesn't allocate: return 0.5 * (q'Eq + p'Ep) - q'Fp\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.IntegrationAlgorithms.get_mapping_nuclear_force-Tuple{AbstractVector, AbstractVector, AbstractMatrix, AbstractMatrix}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.IntegrationAlgorithms.get_mapping_nuclear_force","text":"Get the force due to the mapping variables.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.IntegrationAlgorithms.get_xi-Tuple{AbstractMatrix, AbstractVector, Real}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.IntegrationAlgorithms.get_xi","text":"Get the Ξ variable used to calculate the nuclear propagators.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.IntegrationAlgorithms.set_C_propagator!-Tuple{Any, Any, LinearAlgebra.Eigen, Real}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.IntegrationAlgorithms.set_C_propagator!","text":"Get the C propagator for the mapping variables.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.IntegrationAlgorithms.set_D_propagator!-Tuple{Any, Any, LinearAlgebra.Eigen, Real}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.IntegrationAlgorithms.set_D_propagator!","text":"Get the D propagator for the mapping variables.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.IntegrationAlgorithms.set_gamma!-Tuple{AbstractMatrix, AbstractMatrix, AbstractVector, Real}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.IntegrationAlgorithms.set_gamma!","text":"Get the Γ variable used to calculate the nuclear propagators.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.IntegrationAlgorithms.set_xi!-Tuple{AbstractMatrix, AbstractMatrix, AbstractVector, Real}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.IntegrationAlgorithms.set_xi!","text":"Get the Ξ variable used to calculate the nuclear propagators.\n\n\n\n\n\n","category":"method"},{"location":"dynamicssimulations/dynamicsmethods/langevin/#langevin-dynamics","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"","category":"section"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"Langevin dynamics can be used to sample the canonical ensemble for a classical system. Langevin dynamics are based on classical equations of motion that are modified by an additional drag force and a random force. The Langevin equation of motion can be written as","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"mathbfMddotmathbfR = - nabla_R V(mathbfR) + mathbfF(t) - gamma dotmathbfR","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"where mathbfM are the masses, ddotmathbfR the time-derivative of the positions, i.e., the velocities, nabla_R V(mathbfR) the gradient of the potential and mathbfF(t) the random force that is related to the friction coefficient gamma by the second fluctuation-dissipation theorem.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"Equally the above equation can be written in the form of Ito stochastic differential equations Benedict Leimkuhler, Charles Matthews (2012)","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"beginaligned\ndmathbfR = mathbfM^-1 mathbfP dt\ndmathbfP = -nabla V(mathbfR) - gamma mathbfP dt\n+ sigma mathbfM^12 dmathbfW\nendaligned","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"where sigma = sqrt2gammabeta and mathbfW is a vector of N independent Wiener processes. As usual, mathbfP is the vector of particle momenta and mathbfM their diagonal mass matrix.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"note: Stochastic differential equations\nThere are two mathematical frameworks for handling stochastic differential equations, developed by Ruslan Stratonovich and Kiyosi Ito. To learn about the difference between the two in a physical context refer to H. Risken, H. Haken (1989).","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"As a stochastic differential equation, these two can be integrated immediately using StochasticDiffEq provided by DifferentialEquations, which offers a variety of stochastic solvers. It is possible to exploit the dynamical structure of the differential equations by splitting the integration steps into parts that can be solved exactly. In this context, it has been shown that the BAOAB method from Benedict Leimkuhler, Charles Matthews (2012) achieves good accuracy compared to other similar algorithms and this algorithm is used here as the default.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/#Example","page":"Classical Langevin dynamics","title":"Example","text":"","category":"section"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"Using Langevin dynamics we can sample the canonical ensemble for a simple harmonic oscillator and investigate the energy expectation values.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"Firstly we set up our system parameters. Here, we have two atoms in a harmonic potential at a temperature of 1e-3. We have arbitrarily chosen the dissipation constant gamma = 1, this can be tuned for optimal sampling in more complex systems. ","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"using NQCDynamics\nusing Unitful\n\natoms = Atoms([:H, :C])\ntemperature = 1e-3\nsim = Simulation{Langevin}(atoms, Harmonic(m=atoms.masses[1]); γ=1, temperature)","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"note: Atomic units\nAs usual, all quantities are in atomic units by default.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"Here we can generate a simple starting configuration with zeros for every degree of freedom.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"u = DynamicsVariables(sim, zeros(size(sim)), zeros(size(sim)))","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"Running the dynamics proceeds by providing all the parameters along with any extra keywords. This time we have requested both the positions and velocities to be outputted and have selected a timestep dt. Since the default algorithm is a fixed timestep algorithm an error will be thrown if a timestep is not provided.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"traj = run_dynamics(sim, (0.0, 2000.0), u; output=(OutputPosition, OutputVelocity), dt=0.5)","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"Here, we plot the positions of our two atoms throughout the simulation.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"using Plots\nplot(traj, :OutputPosition, label=[\"Hydrogen\" \"Carbon\"], legend=true)","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"We next plot the velocities. Notice how the carbon atom with its heavier mass has a smaller magnitude throughout.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"plot(traj, :OutputVelocity, label=[\"Hydrogen\" \"Carbon\"], legend=true)","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"Using the configurations from the Langevin simulation we can obtain expectation values along the trajectories. This can be done manually, but we provide the Estimators module to make this as simple as possible.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"!!! note Estimators","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"[Here](@ref `Estimators`) you can find the available quantities that [`Estimators`](@ref) provides.\nTo add new quantities, you must implement a new function inside `src/Estimators.jl`.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"Let's find the expectation for the potential energy during our simulation. This is the potential energy of the final configuration in the simulation:","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"Estimators.potential_energy(sim, traj[:OutputPosition][end])","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"We could evaluate this for every configuration and average it manually. Fortunately however, we have the @estimate macro that will do this for us:","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"Estimators.@estimate potential_energy(sim, traj[:OutputPosition])","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"tip: Tip\nWe can verify this result by comparing to the equipartition theorem which states that each quadratic degree of freedom should contribute frac12kT to the total energy. As this is a harmonic system, this gives us the exact classical potential energy expectation as equal to the temperature, since we have two degrees of freedom and we are in atomic units.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"Similarly, we can evaluate the kinetic energy expectation with:","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"Estimators.@estimate kinetic_energy(sim, traj[:OutputVelocity])","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"Again, this takes a similar value since the total energy is evenly split between the kinetic and potential for a classical harmonic system.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/mdef/#mdef-dynamics","page":"Molecular dynamics with electronic friction (MDEF)","title":"Molecular dynamics with electronic friction (MDEF)","text":"","category":"section"},{"location":"dynamicssimulations/dynamicsmethods/mdef/#Introduction","page":"Molecular dynamics with electronic friction (MDEF)","title":"Introduction","text":"","category":"section"},{"location":"dynamicssimulations/dynamicsmethods/mdef/","page":"Molecular dynamics with electronic friction (MDEF)","title":"Molecular dynamics with electronic friction (MDEF)","text":"A set of fundamental and technologically relevant chemical processes (surface scattering, dissociative chemisorption, surface diffusion, recombinative desorption, etc.) are often catalyzed at the metal surface of several late transition metals (Au, Ag, Cu, Pt, Pd, Rh, etc). These metallic surfaces, unlike other surfaces, are characterized by a dense manifold of electronic states at the Fermi level, which produce continuous conduction and valence bands without a band gap. A theoretical description of the chemical processes at these metal surfaces is often challenging due to the Born-Oppenheimer (BO) approximation no longer being valid. With the breakdown of the Born-Oppenheimer approximation, nonadiabatic effects have to be considered to describe, e.g., the energy exchange that can take place between adsorbate and substrate degrees of freedom (DOF).","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/mdef/","page":"Molecular dynamics with electronic friction (MDEF)","title":"Molecular dynamics with electronic friction (MDEF)","text":"A fully quantum dynamical approach of this complex scenario is currently unfeasible and the gas-surface reaction dynamics are often described using quasi-classical methods where nuclear motion is described classically. Molecular dynamics with electronic friction (MDEF) is one of main methods used to deal with the nonadiabaticity in gas-surface chemical reactions. MDEF has been widely employed to decribe and simulate the nuclear dynamics in several molecular systems. It is a theoretical model based on a ground-state Langevin equation of motion which introduces nonadiabatic effects by using frictional and stochastic forces. This approach was originally introduced by Head-Gordon and Tully and the nonadiabatic effects can be included through different electronic friction models (see section below, LDFA and TDPT). The nuclear coordinates of the adsorbate atoms evolve as follows:","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/mdef/","page":"Molecular dynamics with electronic friction (MDEF)","title":"Molecular dynamics with electronic friction (MDEF)","text":"mathbfMddotmathbfR = - nabla_R V(mathbfR) + mathbfF(t) - Gamma(mathbfR) dotmathbfR","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/mdef/","page":"Molecular dynamics with electronic friction (MDEF)","title":"Molecular dynamics with electronic friction (MDEF)","text":"The first term on the right hand side of the equation corresponds to a conservative force associated with the potential energy surface (PES) as in the adiabatic case. The third term is the friction force and it comes from multiplication between the electronic friction object (Gamma(mathbfR)) and the velocity. Finally, the second term is a temperature and friction-dependent stochastic force which ensures detailed balance.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/mdef/","page":"Molecular dynamics with electronic friction (MDEF)","title":"Molecular dynamics with electronic friction (MDEF)","text":"This figure shows an atom moving near a metal surface M_A. When the atom moves into the region of electron density rho_0^M_A it experiences the forces described above. (Image: ldfa motion)","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/mdef/#Simple-example","page":"Molecular dynamics with electronic friction (MDEF)","title":"Simple example","text":"","category":"section"},{"location":"dynamicssimulations/dynamicsmethods/mdef/","page":"Molecular dynamics with electronic friction (MDEF)","title":"Molecular dynamics with electronic friction (MDEF)","text":"We can explore the MDEF concept first by introducing a model system with non-physical parameters. This will demonstrate the general format and expected results from an MDEF simulation which can explore further in later sections using realistic systems.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/mdef/","page":"Molecular dynamics with electronic friction (MDEF)","title":"Molecular dynamics with electronic friction (MDEF)","text":"Here, we model a single hydrogen atom in a harmonic potential, where the electronic temperature is 300 K. The CompositeFrictionModel allows us to combine any AdiabaticModel with an ElectronicFrictionProvider that will add electronic friction to an otherwise adiabatic system. RandomFriction is used for demonstration purposes only and provides a matrix of random numbers to use in place of the friction.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/mdef/","page":"Molecular dynamics with electronic friction (MDEF)","title":"Molecular dynamics with electronic friction (MDEF)","text":"using NQCDynamics\nusing Unitful\n\natoms = Atoms([:H])\nmodel = CompositeFrictionModel(Harmonic(dofs=3), RandomFriction(3))\nsim = Simulation{MDEF}(atoms, model; temperature=300u\"K\")","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/mdef/","page":"Molecular dynamics with electronic friction (MDEF)","title":"Molecular dynamics with electronic friction (MDEF)","text":"For simplicity, we initialise the system with zero velocity and position for each degree of freedom:","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/mdef/","page":"Molecular dynamics with electronic friction (MDEF)","title":"Molecular dynamics with electronic friction (MDEF)","text":"z = DynamicsVariables(sim, zeros(size(sim)), zeros(size(sim)))","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/mdef/","page":"Molecular dynamics with electronic friction (MDEF)","title":"Molecular dynamics with electronic friction (MDEF)","text":"With these parameters, we can run a single trajectory and visualise the total energy as a function of time.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/mdef/","page":"Molecular dynamics with electronic friction (MDEF)","title":"Molecular dynamics with electronic friction (MDEF)","text":"using Plots\n\nsolution = run_dynamics(sim, (0.0, 100u\"fs\"), z, dt=0.5u\"fs\", output=OutputTotalEnergy)\nplot(solution, :OutputTotalEnergy)","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/mdef/","page":"Molecular dynamics with electronic friction (MDEF)","title":"Molecular dynamics with electronic friction (MDEF)","text":"note: Note\n:hamiltonian in the output tuple refers to the classical Hamiltonian that generates the classical equations of motion. Since we are performing MDEF we see that the total energy fluctuates.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/mdef/","page":"Molecular dynamics with electronic friction (MDEF)","title":"Molecular dynamics with electronic friction (MDEF)","text":"Now let's see what happens if we make the electronic temperature a function of time. For any simulation, temperature can be provided as a time-dependent function which allows variable temperature simulations. In the context of MDEF, this temperature can be used to represent the use of lasers to provide extra energy to the electrons in the metal.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/mdef/","page":"Molecular dynamics with electronic friction (MDEF)","title":"Molecular dynamics with electronic friction (MDEF)","text":"temperature_function(t) = exp(-(t - 50u\"fs\")^2 / 20u\"fs^2\") * 300u\"K\"\nnothing # hide","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/mdef/","page":"Molecular dynamics with electronic friction (MDEF)","title":"Molecular dynamics with electronic friction (MDEF)","text":"warning: Warning\nThe time argument enters this function as a Unitful.jl quantity, and it is important to make sure the unit of the return value is temperature.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/mdef/","page":"Molecular dynamics with electronic friction (MDEF)","title":"Molecular dynamics with electronic friction (MDEF)","text":"Now we can re-simulate, replacing the fixed temperature with the function we have defined.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/mdef/","page":"Molecular dynamics with electronic friction (MDEF)","title":"Molecular dynamics with electronic friction (MDEF)","text":"sim = Simulation{MDEF}(atoms, model; temperature=temperature_function)\nsolution = run_dynamics(sim, (0.0, 100u\"fs\"), z, dt=0.5u\"fs\",\n output=OutputTotalEnergy)\nplot(solution, :OutputTotalEnergy)","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/mdef/","page":"Molecular dynamics with electronic friction (MDEF)","title":"Molecular dynamics with electronic friction (MDEF)","text":"This time we see a peak in the energy in the middle of the simulation which coincides with the peak in temperature at 50 fs. Having viewed this simple example, we can now explore the different ways the friction coefficient can be obtained from ab initio simulations. ","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/mdef/#Local-density-friction-approximation-(LDFA)","page":"Molecular dynamics with electronic friction (MDEF)","title":"Local density friction approximation (LDFA)","text":"","category":"section"},{"location":"dynamicssimulations/dynamicsmethods/mdef/","page":"Molecular dynamics with electronic friction (MDEF)","title":"Molecular dynamics with electronic friction (MDEF)","text":"Local density friction approximation (LDFA) is a theoretical model which describes the electronic friction Gamma(mathbfR) term in the above equation based on the local electron density of the metal substrate. This approximation assumes a scalar friction coefficient (Gamma(R_i)) for each adsorbate atom. The underlying assumption to this approximation is that any atom only sees an anisotropic (scalar) density that only depends on the local surroundings. In the LDFA theoretical framework the above equation of motion is used, except the friction matrix is diagonal, each element coming from the local density of each atom.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/mdef/","page":"Molecular dynamics with electronic friction (MDEF)","title":"Molecular dynamics with electronic friction (MDEF)","text":"In our current LDFA implementation, a set of pre-calculated electronic friction coefficients (eta_ei) computed at different Wigner-Seitz radius (r_s) are used to fit and get an analytical expression to connect any r_s values with an single electronic friction coefficient by means of cubic Spline functions. The Wigner-Sietz radius is connected to the metal substrate electron density by the following equation, ","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/mdef/","page":"Molecular dynamics with electronic friction (MDEF)","title":"Molecular dynamics with electronic friction (MDEF)","text":" r_s(rho) = (frac34pi rho (mathbfr_i))^13","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/mdef/","page":"Molecular dynamics with electronic friction (MDEF)","title":"Molecular dynamics with electronic friction (MDEF)","text":"In this way, the electron density associated with the current substrate atom position is used to compute the respective friction coefficient through fitting function for each point of the trajectory. Visit the CubeLDFAModel.jl to learn more about how this is evaluated.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/mdef/#Time-dependent-Perturbation-theory-(TDPT)","page":"Molecular dynamics with electronic friction (MDEF)","title":"Time-dependent Perturbation theory (TDPT)","text":"","category":"section"},{"location":"dynamicssimulations/dynamicsmethods/mdef/","page":"Molecular dynamics with electronic friction (MDEF)","title":"Molecular dynamics with electronic friction (MDEF)","text":"A more general formulation of the electronic friction object was also developed under the umbrella of electronic friction tensor(EFT) or orbital-dependent electronic friction (ODF) approaches. Both formulations are essentially equivalent and they incorporate the isotropy nature of the electronic friction object by a multidimentional tensor (Lambda_ij) instead of a single coefficient as usually computed at LDFA level. The electronic friction elements can be computed by first-principle calculations in the context of first-order time-dependent perturbation theory (TDPT) at the density functional theory (DFT) level. Each electronic friction tensor (EFT) elements corresponds to relaxation rate due to electron-nuclear coupling along the Cartesian coordinate i due to motion in the j direction. The electronic friction tensor elements can be computed by using the Fermi's golden rule. Lambda_ij is an object with (3Ntimes3N)-dimension where N is often the total number of adsorbate atoms considered explicitly on the study system. View the friction models page to learn about how this can be used.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/mdef/","page":"Molecular dynamics with electronic friction (MDEF)","title":"Molecular dynamics with electronic friction (MDEF)","text":"tip: TDPT friction and LDFA in action?\nIf you would like to see an example using both LDFA and TDPT during full dimensional dynamics, refer to the reactive scattering example.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/ehrenfest/#ehrenfest-dynamics","page":"Ehrenfest molecular dynamics","title":"Ehrenfest molecular dynamics","text":"","category":"section"},{"location":"dynamicssimulations/dynamicsmethods/ehrenfest/","page":"Ehrenfest molecular dynamics","title":"Ehrenfest molecular dynamics","text":"The Ehrenfest method is a mixed quantum-classical dynamics method in which the total wavefunction is factorized into slow (nuclear) variables, which are treated classically, and fast ones (electrons) which remain quantum-mechanical. In the Ehrenfest method, nuclei move according to classical mechanics on a potential energy surface given by the expectation value of the electronic Hamiltonian. ","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/ehrenfest/","page":"Ehrenfest molecular dynamics","title":"Ehrenfest molecular dynamics","text":"The time dependence of the electronic wavefunction is expanded into an adiabatic basis and follows the time-dependent Schr\\\"odinger equation.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/ehrenfest/","page":"Ehrenfest molecular dynamics","title":"Ehrenfest molecular dynamics","text":"ihbar dotc_i(t) = V_i(mathbfR) c_i (t)\n- ihbar sum_j dotmathbfR cdot mathbfd_ij(mathbfR)c_j(t)","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/ehrenfest/#Example","page":"Ehrenfest molecular dynamics","title":"Example","text":"","category":"section"},{"location":"dynamicssimulations/dynamicsmethods/ehrenfest/","page":"Ehrenfest molecular dynamics","title":"Ehrenfest molecular dynamics","text":"Below the example of the Ehrenfest implementation is presented, using model from Nandini Ananth, Charulatha Venkataraman, William H. Miller (2007).","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/ehrenfest/","page":"Ehrenfest molecular dynamics","title":"Ehrenfest molecular dynamics","text":"At the start, we assign atoms and initialise the simulation using the mass and model from NQCModels.jl.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/ehrenfest/","page":"Ehrenfest molecular dynamics","title":"Ehrenfest molecular dynamics","text":"using NQCDynamics\n\natoms = Atoms(1980)\nsim = Simulation{Ehrenfest}(atoms, AnanthModelOne())","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/ehrenfest/","page":"Ehrenfest molecular dynamics","title":"Ehrenfest molecular dynamics","text":"Next, the initial distribution is created:","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/ehrenfest/","page":"Ehrenfest molecular dynamics","title":"Ehrenfest molecular dynamics","text":"using Distributions\ne = 0.03\nk = sqrt(e*2*atoms.masses[1])\nr = Normal(-5, 1/sqrt(0.25))\nv = k / atoms.masses[1]\ndistribution = DynamicalDistribution(v, r, size(sim))* PureState(1, Adiabatic())","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/ehrenfest/","page":"Ehrenfest molecular dynamics","title":"Ehrenfest molecular dynamics","text":"To run an ensemble simulation we additionally choose number of trajectories n_traj and timespan tspan and we pass all the established settings to the run_dynamics function. In this example we output velocities by specifying output=OutputVelocity and store the final values in the final_velocities array. Following that, we calculate final momenta.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/ehrenfest/","page":"Ehrenfest molecular dynamics","title":"Ehrenfest molecular dynamics","text":"n_traj = 10\ntspan = (0.0, 3000.0)\nsolution = run_dynamics(sim, tspan, distribution; \n trajectories=n_traj, output=OutputVelocity, dt=1.0)\nfinal_velocities = [r[:OutputVelocity][end] for r in solution]\nmomenta = reduce(vcat, final_velocities*atoms.masses[1])","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/ehrenfest/","page":"Ehrenfest molecular dynamics","title":"Ehrenfest molecular dynamics","text":"Resulting momenta can be plotted by using StatsPlots package.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/ehrenfest/","page":"Ehrenfest molecular dynamics","title":"Ehrenfest molecular dynamics","text":"using StatsPlots\nplot(density(momenta))\nxlims!(-20,20)","category":"page"},{"location":"ensemble_simulations/#ensembles","page":"Ensemble simulations","title":"Ensemble simulations","text":"","category":"section"},{"location":"ensemble_simulations/","page":"Ensemble simulations","title":"Ensemble simulations","text":"Typically we'll be interested in computing observables based upon the statistics obtained from many trajectories. Technically it is possible to manually run many trajectories using the single trajectory procedure introduced in the Getting started section. However, by using the methods introduced on this page it is possible to run many trajectories at once, using parallelism and computing ensemble observables automatically.","category":"page"},{"location":"ensemble_simulations/","page":"Ensemble simulations","title":"Ensemble simulations","text":"The key function for performing ensemble simulations is run_dynamics.","category":"page"},{"location":"ensemble_simulations/","page":"Ensemble simulations","title":"Ensemble simulations","text":"run_dynamics","category":"page"},{"location":"ensemble_simulations/#NQCDynamics.Ensembles.run_dynamics","page":"Ensemble simulations","title":"NQCDynamics.Ensembles.run_dynamics","text":"run_dynamics(sim::AbstractSimulation, tspan, distribution;\n output,\n selection::Union{Nothing,AbstractVector}=nothing,\n reduction=AppendReduction(),\n ensemble_algorithm=SciMLBase.EnsembleSerial(),\n algorithm=DynamicsMethods.select_algorithm(sim),\n trajectories=1,\n kwargs...\n )\n\nRun trajectories for timespan tspan sampling from distribution.\n\nKeywords\n\noutput either a single function or a Tuple of functions with the signature f(sol, i) that takes the DifferentialEquations solution and returns the desired output quantity.\nselection should be an AbstractVector containing the indices to sample from the distribution. By default, nothing leads to random sampling.\nreduction defines how the data is reduced across trajectories. Options are AppendReduction(), MeanReduction(), SumReduction and FileReduction(filename).\nensemble_algorithm is the algorithm from DifferentialEquations which determines which form of parallelism is used.\nalgorithm is the algorithm used to integrate the equations of motion.\ntrajectories is the number of trajectories to perform.\nkwargs... any additional keywords are passed to DifferentialEquations solve`.\n\n\n\n\n\n","category":"function"},{"location":"ensemble_simulations/","page":"Ensemble simulations","title":"Ensemble simulations","text":"This is the same function used to perform single trajectory simulations, but by replacing the single initial condition with a distribution and changing the number of trajectories it is possible to run an ensemble of trajectories. The distributions are defined such that they can be sampled to provide initial conditions for each trajectory. The Storing and sampling distributions page details the format the distributions must take.","category":"page"},{"location":"ensemble_simulations/","page":"Ensemble simulations","title":"Ensemble simulations","text":"Internally, the DifferentialEquations.jl ensemble infrastructure is used to handle per trajectory parallelism. The ensemble_algorithm keyword takes one of the EnsembleAlgorithms. To use these, you must first add using DiffEqBase to your script.","category":"page"},{"location":"ensemble_simulations/#Example","page":"Ensemble simulations","title":"Example","text":"","category":"section"},{"location":"ensemble_simulations/","page":"Ensemble simulations","title":"Ensemble simulations","text":"To demonstrate usage of run_dynamics, let's investigate different ways to calculate the time-dependent population with FSSH.","category":"page"},{"location":"ensemble_simulations/","page":"Ensemble simulations","title":"Ensemble simulations","text":"First, we set up our system using one of Tully's simple models (John C. Tully (1990)).","category":"page"},{"location":"ensemble_simulations/","page":"Ensemble simulations","title":"Ensemble simulations","text":"using NQCDynamics\n\natoms = Atoms(2000)\nmodel = TullyModelOne()\nsim = Simulation{FSSH}(atoms, model)\nnothing # hide","category":"page"},{"location":"ensemble_simulations/","page":"Ensemble simulations","title":"Ensemble simulations","text":"As mentioned above, before running the ensemble, we must prepare a distribution to generate initial conditions for each trajectory. This procedure is detailed in the Storing and sampling distributions section.","category":"page"},{"location":"ensemble_simulations/","page":"Ensemble simulations","title":"Ensemble simulations","text":"using Distributions: Normal # Import the Normal distribution\n\nk = 10 # Initial momentum = 10\nv = k / atoms.masses[1] # Convert momentum to velocity\nr = Normal(-8) # Create Normal distribution centred at -8 for sampling initial position\nnuclear_distribution = DynamicalDistribution(v, r, (1,1)) # Combine position and velocity\nelectronic_distribution = PureState(2) # Create nonequilibrium electronic distribution\nproduct_distribution = nuclear_distribution * electronic_distribution\nnothing # hide","category":"page"},{"location":"ensemble_simulations/","page":"Ensemble simulations","title":"Ensemble simulations","text":"In this case, we have used a deterministic momentum of 10 a.u. and a gaussian position distribution with width 1 centered at -8 a.u.. The electronic variables will be sampled such that the initial population is confined to the second state by PureState(2).","category":"page"},{"location":"ensemble_simulations/","page":"Ensemble simulations","title":"Ensemble simulations","text":"The final step before running the dynamics is to decide how to output the results. The simplest option is to use the built-in tuple format familiar from run_dynamics.","category":"page"},{"location":"ensemble_simulations/","page":"Ensemble simulations","title":"Ensemble simulations","text":"ensemble = run_dynamics(sim, (0.0, 3000.0), product_distribution;\n trajectories=20, output=OutputDiabaticPopulation)\nnothing # hide","category":"page"},{"location":"ensemble_simulations/","page":"Ensemble simulations","title":"Ensemble simulations","text":"This is equivalent to performing single trajectories in a loop and manually re-sampling the initial conditions each time. However, here we have been able to do this more concisely, using internal mechanisms for sampling from the product_distribution.","category":"page"},{"location":"ensemble_simulations/","page":"Ensemble simulations","title":"Ensemble simulations","text":"The output of this function is a vector containing the output from each trajectory. Each entry is equivalent to the output from a call to run_dynamics and can be plotted by iterating through ensemble.","category":"page"},{"location":"ensemble_simulations/","page":"Ensemble simulations","title":"Ensemble simulations","text":"using Plots\n\np = plot(legend=false)\nfor traj in ensemble\n plot!(traj[:Time], [population[2] - population[1] for population in traj[:OutputDiabaticPopulation]])\nend\np","category":"page"},{"location":"ensemble_simulations/","page":"Ensemble simulations","title":"Ensemble simulations","text":"This plot shows the population difference between the two states for each trajectory. To approximate the exact quantum dynamics for this model, the average over all trajectories should be computed. Instead of manually averaging the result, we can use reduction=MeanReduction() or reduction=SumReduction() which will reduce the data accordingly before outputting the result:","category":"page"},{"location":"ensemble_simulations/","page":"Ensemble simulations","title":"Ensemble simulations","text":"ensemble = run_dynamics(sim, (0.0, 3000.0), product_distribution;\n trajectories=20, output=OutputDiabaticPopulation, reduction=MeanReduction(), saveat=0.0:10.0:3000.0)\nplot(ensemble, :OutputDiabaticPopulation)","category":"page"},{"location":"ensemble_simulations/","page":"Ensemble simulations","title":"Ensemble simulations","text":"note: Note\nHere we have also specified the saveat keyword to ensure the output is saved at the same points for every trajectory, otherwise the averaging will not work. This is necessary because we are using an integrator with adaptive timestepping that will save at different points for each trajectory.","category":"page"},{"location":"ensemble_simulations/","page":"Ensemble simulations","title":"Ensemble simulations","text":"This workflow can be applied for any of the quantities defined in the DynamicsOutputs submodule. If we want a more complex output, such as a scattering probability or a time-correlation function, we can provide a function to the output argument as described in the DifferentialEquations.jl documentation. The advantage of this approach is that memory can be saved by reducing the data as the trajectories accumulate, it also allows greater flexibility when modifying the output.","category":"page"},{"location":"ensemble_simulations/","page":"Ensemble simulations","title":"Ensemble simulations","text":"Inside the Ensembles submodule we define a few premade functions of this sort, but here we can demonstrate how to reformulate the previous simulation using the alternative format.","category":"page"},{"location":"ensemble_simulations/","page":"Ensemble simulations","title":"Ensemble simulations","text":"function output_function(sol, i)\n output = zeros(2,div(3000, 50) + 1)\n for (i,u) in enumerate(sol.u)\n output[:,i] .= Estimators.diabatic_population(sim, u)\n end\n return output\nend\n\nensemble = run_dynamics(sim, (0.0, 3000.0), product_distribution;\n trajectories=20, output=output_function, reduction=MeanReduction(), saveat=50.0)","category":"page"},{"location":"ensemble_simulations/","page":"Ensemble simulations","title":"Ensemble simulations","text":"This function provides us the same output as above, but this gives us the flexibility to calculate any observable we want.","category":"page"},{"location":"ensemble_simulations/","page":"Ensemble simulations","title":"Ensemble simulations","text":"Throughout the documentation, ensemble simulations like this one are used to demonstrate many of the dynamics methods. Now that you have understood the contents of this page, all of the ensemble simulations will appear familiar.","category":"page"},{"location":"api/NQCDynamics/timecorrelationfunctions/#TimeCorrelationFunctions","page":"TimeCorrelationFunctions","title":"TimeCorrelationFunctions","text":"","category":"section"},{"location":"api/NQCDynamics/timecorrelationfunctions/","page":"TimeCorrelationFunctions","title":"TimeCorrelationFunctions","text":"Modules=[NQCDynamics.TimeCorrelationFunctions]","category":"page"},{"location":"api/NQCDynamics/timecorrelationfunctions/#NQCDynamics.TimeCorrelationFunctions","page":"TimeCorrelationFunctions","title":"NQCDynamics.TimeCorrelationFunctions","text":"TimeCorrelationFunctions\n\nThis module defines extra types that can be used as Ensemble outputs when computing time-correlation functions. It hopes to provide a minimal interface that reduces code repetition when implementing different correlation functions.\n\n\n\n\n\n","category":"module"},{"location":"api/NQCDynamics/timecorrelationfunctions/#NQCDynamics.TimeCorrelationFunctions.PopulationCorrelationFunction","page":"TimeCorrelationFunctions","title":"NQCDynamics.TimeCorrelationFunctions.PopulationCorrelationFunction","text":"PopulationCorrelationFunction{T,S<:AbstractSimulation} <: TimeCorrelationFunction\n\nOutput type for computing the population correlation function. The statetype determines the population type (diabatic or adiabatic). sim must also be provided to access the parameters to compute the population.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDynamics/timecorrelationfunctions/#NQCDynamics.TimeCorrelationFunctions.TimeCorrelationFunction","page":"TimeCorrelationFunctions","title":"NQCDynamics.TimeCorrelationFunctions.TimeCorrelationFunction","text":"TimeCorrelationFunction\n\nAbstract type for defining time correlation functions\n\n\n\n\n\n","category":"type"},{"location":"saving_loading/#saving-and-loading","page":"Saving and loading","title":"Saving and loading","text":"","category":"section"},{"location":"saving_loading/","page":"Saving and loading","title":"Saving and loading","text":"If you would like to split your workflow into multiple scripts (e.g. separately generating initial conditions and running dynamics) it is necessary to be able to store intermediate data in files.","category":"page"},{"location":"saving_loading/","page":"Saving and loading","title":"Saving and loading","text":"When this data is atomic configurations or trajectories, it can be useful to use standard file formats such as those mentioned in the Atoms section previously. However, often it is more convenient to directly save and load Julia objects between sessions. For this purpose, we recommend using FileIO.jl with JLD2.jl.","category":"page"},{"location":"saving_loading/","page":"Saving and loading","title":"Saving and loading","text":"note: Note\nJLD2 can be used independently of FileIO. However, FileIO provides a unified interface for many file types and allows you to save data to lots of formats with consistent syntax.","category":"page"},{"location":"saving_loading/","page":"Saving and loading","title":"Saving and loading","text":"As a simple example, suppose that we want the same system parameters across multiple scripts:","category":"page"},{"location":"saving_loading/","page":"Saving and loading","title":"Saving and loading","text":"using NQCDynamics\n\natoms = Atoms([:H, :H, :C, :C])\ncell = PeriodicCell([10.0 0 0; 0 10.0 0; 0 0 10.0])\nmodel = Harmonic()\nnothing # hide","category":"page"},{"location":"saving_loading/","page":"Saving and loading","title":"Saving and loading","text":"Instead of redefining these in every script, we can save them to a file, then load them back in whenever we need them using FileIO.","category":"page"},{"location":"saving_loading/","page":"Saving and loading","title":"Saving and loading","text":"This creates a file \"parameters.jld2\" containing all of our system parameters:","category":"page"},{"location":"saving_loading/","page":"Saving and loading","title":"Saving and loading","text":"using FileIO\nsave(\"parameters.jld2\", Dict(\"atoms\"=>atoms, \"cell\"=>cell, \"model\"=>model))","category":"page"},{"location":"saving_loading/","page":"Saving and loading","title":"Saving and loading","text":"In a separate Julia session we can re-load these parameters. As detailed in the JLD2 documentation we can select the data to load by specifying extra arguments to load.","category":"page"},{"location":"saving_loading/","page":"Saving and loading","title":"Saving and loading","text":"using NQCDynamics, FileIO\n\nparameters = load(\"parameters.jld2\")\natoms = load(\"parameters.jld2\", \"atoms\")\ncell = load(\"parameters.jld2\", \"cell\")\nmodel = load(\"parameters.jld2\", \"model\")","category":"page"},{"location":"saving_loading/","page":"Saving and loading","title":"Saving and loading","text":"JLD2 is compatible with any Julia type so it widely usable for most of the types you encounter is NQCDynamics.jl and across all Julia packages.","category":"page"},{"location":"NQCModels/neuralnetworkmodels/#Neural-network-models","page":"Neural network models","title":"Neural network models","text":"","category":"section"},{"location":"NQCModels/neuralnetworkmodels/","page":"Neural network models","title":"Neural network models","text":"Using the ASE interface we can directly use models trained using SchNetPack.","category":"page"},{"location":"NQCModels/neuralnetworkmodels/","page":"Neural network models","title":"Neural network models","text":"danger: Danger\nThe examples on this page do not run during the documentation build due to schnetpack causing segfaults when installed in the build environment. The causes of this is not currently clear but we have temporarily disabled these examples in the build.However, the examples should still be correct and you are welcome to try them with your own schnetpack trained models.","category":"page"},{"location":"NQCModels/neuralnetworkmodels/","page":"Neural network models","title":"Neural network models","text":"To use a SchNet model, please load any pre-trained model into a given path you can access. Here, our SchNet model is named \"best_model\" as is common in SchNet and provide the relative path.","category":"page"},{"location":"NQCModels/neuralnetworkmodels/","page":"Neural network models","title":"Neural network models","text":"First we load the model into an ase calculator and attach it to our diatomic hydrogen molecule.","category":"page"},{"location":"NQCModels/neuralnetworkmodels/","page":"Neural network models","title":"Neural network models","text":"using PyCall\n\nase = pyimport(\"ase\")\nspkutils = pyimport(\"schnetpack.utils\")\nspkinterfaces = pyimport(\"schnetpack.interfaces\")\n\nspk_model = spkutils.load_model(\"../assets/schnetpack/best_model\"; map_location=\"cpu\")\n\nh2 = ase.Atoms(\"H2\", [(0, 0, 0), (0, 0, 0.74)])\n\ncalc = spkinterfaces.SpkCalculator(spk_model, energy=\"energy\", forces=\"forces\")\nh2.set_calculator(calc)","category":"page"},{"location":"NQCModels/neuralnetworkmodels/","page":"Neural network models","title":"Neural network models","text":"We can obtain the energies and forces from ase directly in the usual way, converting them to atomic units using UnifulAtomic.","category":"page"},{"location":"NQCModels/neuralnetworkmodels/","page":"Neural network models","title":"Neural network models","text":"using Unitful, UnitfulAtomic;\naustrip(h2.get_total_energy() * u\"eV\")\naustrip.(h2.get_forces() .* u\"eV/Å\")","category":"page"},{"location":"NQCModels/neuralnetworkmodels/","page":"Neural network models","title":"Neural network models","text":"warning: Warning\nNote that this is an arbitrary model not trained on H2, hence the calculation of the potential energy and forces most likely do not make sense.","category":"page"},{"location":"NQCModels/neuralnetworkmodels/","page":"Neural network models","title":"Neural network models","text":"Then, we can convert the ASE output into the format used in NQCModels, which makes it possible to use the SchNet model e.g. for molecular dynamics calculations within NQCDynamics.jl:","category":"page"},{"location":"NQCModels/neuralnetworkmodels/","page":"Neural network models","title":"Neural network models","text":"using NQCModels;\nmodel = AdiabaticASEModel(h2);\n\nr = [0 0; 0 0; 0 ustrip(auconvert(0.74u\"Å\"))]\n\npotential(model, r)\nderivative(model, r)","category":"page"},{"location":"api/NQCModels/adiabaticmodels/#AdiabaticModels","page":"AdiabaticModels","title":"AdiabaticModels","text":"","category":"section"},{"location":"api/NQCModels/adiabaticmodels/","page":"AdiabaticModels","title":"AdiabaticModels","text":"Modules=[NQCModels.AdiabaticModels]","category":"page"},{"location":"api/NQCModels/adiabaticmodels/#NQCModels.AdiabaticModels","page":"AdiabaticModels","title":"NQCModels.AdiabaticModels","text":"AdiabaticModels\n\nAll models defined within this module have only a single electronic state and return potentials as scalars and derivatives as simple arrays.\n\nThe central abstract type is the AdiabaticModel, which all models should subtype.\n\n\n\n\n\n","category":"module"},{"location":"api/NQCModels/adiabaticmodels/#NQCModels.AdiabaticModels.AdiabaticASEModel","page":"AdiabaticModels","title":"NQCModels.AdiabaticModels.AdiabaticASEModel","text":"AdiabaticASEModel{A} <: AdiabaticModel\n\nWrapper for an ase.Atoms object that has a calculator attached. This will synchronise the positions with the ase object and handle the unit conversions.\n\nImplements both potential and derivative!.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/adiabaticmodels/#NQCModels.AdiabaticModels.AdiabaticModel","page":"AdiabaticModels","title":"NQCModels.AdiabaticModels.AdiabaticModel","text":"AdiabaticModel <: Model\n\nAdiabaticModels represent the potentials from classical molecular dynamics where the potential is a function of the position.\n\nImplementation\n\nAdiabaticModels should implement:\n\npotential(model, R)\nderivative!(model, D, R) (this is the derivative of the potential energy with respect to the positions)\nndofs(model) (these are the degrees of freedom)\n\nExample\n\nThis example creates a 2 dimensional adiabatic model MyModel. We implement the 3 compulsory functions then evaluate the potential. Here, the argument R is an AbstractMatrix since this is a 2D model that can accept multiple atoms.\n\nstruct MyModel{P} <: NQCModels.AdiabaticModels.AdiabaticModel\n param::P\nend\n\nNQCModels.ndofs(::MyModel) = 2\n\nNQCModels.potential(model::MyModel, R::AbstractMatrix) = model.param*sum(R.^2)\nNQCModels.derivative!(model::MyModel, D, R::AbstractMatrix) = D .= model.param*2R\n\nmodel = MyModel(10)\n\nNQCModels.potential(model, [1 2; 3 4])\n\n# output\n\n300\n\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/adiabaticmodels/#NQCModels.AdiabaticModels.DarlingHollowayElbow","page":"AdiabaticModels","title":"NQCModels.AdiabaticModels.DarlingHollowayElbow","text":"DarlingHollowayElbow()\n\nAdiabatic elbow potential from Darling and Holloway: Faraday Discuss., 1993, 96, 43-54\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/adiabaticmodels/#NQCModels.AdiabaticModels.DiatomicHarmonic","page":"AdiabaticModels","title":"NQCModels.AdiabaticModels.DiatomicHarmonic","text":"DiatomicHarmonic(r₀=1.0)\n\nHarmonic interaction between two particles.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/adiabaticmodels/#NQCModels.AdiabaticModels.Free","page":"AdiabaticModels","title":"NQCModels.AdiabaticModels.Free","text":"Free()\n\nZero external potential everywhere. Useful for modelling free particles.\n\njulia> model, R = Free(3), rand(3, 10);\n\njulia> potential(model, R)\n0.0\n\njulia> derivative(model, R)\n3×10 Matrix{Float64}:\n 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/adiabaticmodels/#NQCModels.AdiabaticModels.Harmonic","page":"AdiabaticModels","title":"NQCModels.AdiabaticModels.Harmonic","text":"Harmonic(m=1.0, ω=1.0, r₀=0.0)\n\nAdiabatic harmonic potential. V(x) = mω^2(x-r₀)^2 2\n\njulia> using Symbolics;\n\njulia> @variables x, m, ω, r₀;\n\njulia> model = Harmonic(m=m, ω=ω, r₀=r₀);\n\njulia> potential(model, hcat(x))\n0.5m*(ω^2)*((x - r₀)^2)\n\njulia> derivative(model, hcat(x))\n1×1 Matrix{Num}:\n m*(x - r₀)*(ω^2)\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/adiabaticmodels/#NQCModels.AdiabaticModels.Morse","page":"AdiabaticModels","title":"NQCModels.AdiabaticModels.Morse","text":"Parameters.@with_kw struct Morse{T} <: AdiabaticModel\n\nReferences\n\nJ. Chem. Phys. 88, 4535 (1988)\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/adiabaticmodels/#NQCModels.AdiabaticModels.eigenenergy-Tuple{Morse, Any}","page":"AdiabaticModels","title":"NQCModels.AdiabaticModels.eigenenergy","text":"Eq. 43\n\n\n\n\n\n","category":"method"},{"location":"api/NQCModels/adiabaticmodels/#NQCModels.AdiabaticModels.getλ-Tuple{Morse}","page":"AdiabaticModels","title":"NQCModels.AdiabaticModels.getλ","text":"Eq. 36\n\n\n\n\n\n","category":"method"},{"location":"api/NQCModels/adiabaticmodels/#NQCModels.AdiabaticModels.getω₀-Tuple{Morse}","page":"AdiabaticModels","title":"NQCModels.AdiabaticModels.getω₀","text":"Eq. 44\n\n\n\n\n\n","category":"method"},{"location":"atoms/#atoms","page":"Atoms","title":"Handling Atoms","text":"","category":"section"},{"location":"atoms/","page":"Atoms","title":"Atoms","text":"This package makes the choice to separate the atomic parameters from their positions and velocities for ease of use with the differential equations solvers. This contrasts somewhat with most other software packages where these would be usually by joined together into a single object.","category":"page"},{"location":"atoms/","page":"Atoms","title":"Atoms","text":"The atomic parameters here are contained within the Atoms type introduced earlier in the Getting started section. As mentioned previously, there exist some basic constructors which use either elemental symbols or numbers to initialise the parameters:","category":"page"},{"location":"atoms/","page":"Atoms","title":"Atoms","text":"using NQCDynamics\nAtoms([:H, :H, :H])\nAtoms([1, 2, 3])","category":"page"},{"location":"atoms/","page":"Atoms","title":"Atoms","text":"If there are many atoms, you can use Julia's array manipulation utilities to create large vectors with many atoms types. For example, if adding an adsorbate to a metal surface, it could be initialised as:","category":"page"},{"location":"atoms/","page":"Atoms","title":"Atoms","text":"au = fill(:Au, 40)\nno = [:N, :O]\nauno = [au; no]\nAtoms(auno)","category":"page"},{"location":"atoms/#reading-and-writing","page":"Atoms","title":"Reading and writing atomic structures","text":"","category":"section"},{"location":"atoms/","page":"Atoms","title":"Atoms","text":"When using a complex system however, it is likely more effective to read structures directly from a file. We provide two ways to do this, either using the ExtXYZ.jl package which works for xyz files. Or instead there is a conversion to and from the ase.Atoms type which can be used when PyCall.jl is loaded.","category":"page"},{"location":"atoms/","page":"Atoms","title":"Atoms","text":"First we can use ase to build a system and write it to an .xyz file.","category":"page"},{"location":"atoms/","page":"Atoms","title":"Atoms","text":"using PyCall\n\nbuild = pyimport(\"ase.build\")\n\nslab = build.fcc100(\"Al\", size=(2, 2, 3))\nbuild.add_adsorbate(slab, \"Au\", 1.7, \"hollow\")\nslab.center(axis=2, vacuum=4.0)\n\nslab.write(\"slab.xyz\")","category":"page"},{"location":"atoms/","page":"Atoms","title":"Atoms","text":"Now we can read it in with the read_extxyz function.","category":"page"},{"location":"atoms/","page":"Atoms","title":"Atoms","text":"atoms, positions, cell = read_extxyz(\"slab.xyz\")\natoms\npositions\ncell","category":"page"},{"location":"atoms/","page":"Atoms","title":"Atoms","text":"Similarly, we can write the file with write_extxyz:","category":"page"},{"location":"atoms/","page":"Atoms","title":"Atoms","text":"write_extxyz(\"out.xyz\", atoms, positions, cell)","category":"page"},{"location":"atoms/","page":"Atoms","title":"Atoms","text":"Both of these functions also work with trajectories such that the positions will be a vector of configurations, whilst the atoms and cell will remain unchanged.","category":"page"},{"location":"atoms/","page":"Atoms","title":"Atoms","text":"If not using .xyz files, we can directly use the IO capability of ase to read or the write the files. This can be done by using the conversions between our data types and the ase.Atoms object.","category":"page"},{"location":"atoms/","page":"Atoms","title":"Atoms","text":"atoms = Atoms([:H, :H, :C])\nase_atoms = NQCBase.convert_to_ase_atoms(atoms, rand(3, 3))\nNQCBase.convert_from_ase_atoms(ase_atoms)","category":"page"},{"location":"atoms/","page":"Atoms","title":"Atoms","text":"These conversions work both ways such that you can read any file format using ase then convert the ase.Atoms object to our types afterwards. Then at the end when you are finished, you can convert them back and write your output with ase.","category":"page"},{"location":"api/NQCBase/nqcbase/#NQCBase","page":"NQCBase","title":"NQCBase","text":"","category":"section"},{"location":"api/NQCBase/nqcbase/","page":"NQCBase","title":"NQCBase","text":"Modules=[NQCBase]","category":"page"},{"location":"api/NQCBase/nqcbase/#NQCBase.Atoms","page":"NQCBase","title":"NQCBase.Atoms","text":"Atoms{T<:AbstractFloat}\n\nBasic atomic parameters: element symbols, numbers and masses\n\nMasses are converted to atomic units. Constructed using either element symbols or masses.\n\njulia> Atoms(:H)\nAtoms{Float64}([:H], [1], [1837.4715941070515])\n\njulia> Atoms([:H, :H, :H, :C])\nAtoms{Float64}([:H, :H, :H, :C], [1, 1, 1, 6], [1837.4715941070515, 1837.4715941070515, 1837.4715941070515, 21894.713607956142])\n\njulia> Atoms([100, 200])\nAtoms{Float64}([:X, :X], [0, 0], [100.0, 200.0])\n\n\n\n\n\n","category":"type"},{"location":"api/NQCBase/nqcbase/#NQCBase.PeriodicCell","page":"NQCBase","title":"NQCBase.PeriodicCell","text":"PeriodicCell{T<:AbstractFloat} <: AbstractCell\n\nOptionally periodic cell\n\n\n\n\n\n","category":"type"},{"location":"api/NQCBase/nqcbase/#NQCBase.check_atoms_in_cell-Tuple{PeriodicCell, AbstractMatrix}","page":"NQCBase","title":"NQCBase.check_atoms_in_cell","text":"check_atoms_in_cell(cell::PeriodicCell, R::AbstractMatrix)::Bool\n\nTrue if all atoms are inside the cell, false otherwise.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCBase/nqcbase/#NQCBase.read_extxyz-Tuple{Any}","page":"NQCBase","title":"NQCBase.read_extxyz","text":"read_extxyz(file)\n\nUses ExtXYZ.jl to read a .extxyz file\n\n\n\n\n\n","category":"method"},{"location":"api/NQCBase/nqcbase/#NQCBase.write_extxyz-Tuple{Any, Any, Matrix, Any}","page":"NQCBase","title":"NQCBase.write_extxyz","text":"write_extxyz(file, atoms, R, cell)\n\nUses ExtXYZ.jl to write a .extxyz file\n\nR can be either a single configuration (Matrix) or many (Vector{<:Matrix}).\n\n\n\n\n\n","category":"method"},{"location":"NQCDistributions/overview/#NQCDistributions.jl","page":"NQCDistributions.jl","title":"NQCDistributions.jl","text":"","category":"section"},{"location":"NQCDistributions/overview/#Storing-and-sampling-distributions","page":"NQCDistributions.jl","title":"Storing and sampling distributions","text":"","category":"section"},{"location":"NQCDistributions/overview/","page":"NQCDistributions.jl","title":"NQCDistributions.jl","text":"In order to perform ensembles of trajectories, it is useful to have a convenient way to generate distributions of velocities and positions which can be sampled to initialise trajectories. The NQCDistributions.jl package contains the types and functions that seek to address this requirement as painlessly as possible. ","category":"page"},{"location":"NQCDistributions/overview/","page":"NQCDistributions.jl","title":"NQCDistributions.jl","text":"For quantum classical nonadiabatic dynamics simulations, the initial distributions contain both nuclear and electronic degrees of freedom.","category":"page"},{"location":"NQCDistributions/overview/","page":"NQCDistributions.jl","title":"NQCDistributions.jl","text":"note: Note\nCurrently, we allow for product distributions only, where the nuclear and electronic distributions are separable. In the future it would be great to remove this restriction, if you are interested, please open an issue on GitHub.","category":"page"},{"location":"NQCDistributions/overview/","page":"NQCDistributions.jl","title":"NQCDistributions.jl","text":"This page describes the types that can be used to represent nuclear and electronic distributions and demonstrates how they can be combined into a product distribution.","category":"page"},{"location":"NQCDistributions/overview/#Nuclear-Distributions","page":"NQCDistributions.jl","title":"Nuclear Distributions","text":"","category":"section"},{"location":"NQCDistributions/overview/#DynamicalDistribution","page":"NQCDistributions.jl","title":"DynamicalDistribution","text":"","category":"section"},{"location":"NQCDistributions/overview/","page":"NQCDistributions.jl","title":"NQCDistributions.jl","text":"When handling distributions for the nuclear degrees of freedom, the DynamicalDistribution type can be used to store initial velocities and positions:","category":"page"},{"location":"NQCDistributions/overview/","page":"NQCDistributions.jl","title":"NQCDistributions.jl","text":"using NQCDynamics","category":"page"},{"location":"NQCDistributions/overview/","page":"NQCDistributions.jl","title":"NQCDistributions.jl","text":"d = DynamicalDistribution(10, 5, (3, 2))\nnothing # hide","category":"page"},{"location":"NQCDistributions/overview/","page":"NQCDistributions.jl","title":"NQCDistributions.jl","text":"Here, we have created a delta distribution with fixed velocities and positions, the final argument specifies the size of each sample. The (3, 2) case shown here would be appropriate when using 2 atoms each with 3 degrees of freedom.","category":"page"},{"location":"NQCDistributions/overview/","page":"NQCDistributions.jl","title":"NQCDistributions.jl","text":"rand(d)","category":"page"},{"location":"NQCDistributions/overview/","page":"NQCDistributions.jl","title":"NQCDistributions.jl","text":"DynamicalDistribution is flexible and each of the first two arguments can be Real, Vector or Sampleable.","category":"page"},{"location":"NQCDistributions/overview/","page":"NQCDistributions.jl","title":"NQCDistributions.jl","text":"note: Note\nReals are used whenever the same value is desired for every sample, as above.\nVectors can be provided when sampling a provided vector of configurations.\nSampleables are provided by Distributions.jl and can be used when specifying an analytic distribution such as the Maxwell-Boltzmann distribution for velocities.","category":"page"},{"location":"NQCDistributions/overview/","page":"NQCDistributions.jl","title":"NQCDistributions.jl","text":"Each of these options can be composed in any combination, let's see the case where we have an analytic distribution of positions and a preset collection of velocities:","category":"page"},{"location":"NQCDistributions/overview/","page":"NQCDistributions.jl","title":"NQCDistributions.jl","text":"using Distributions\n\nvelocity = [[1.0 1.0;1.0 1.0], [2.0 2.0; 2.0 2.0], [3.0 3.0; 3.0 3.0]] \nposition = Normal()\nd = DynamicalDistribution(velocity, position, (2, 2))\nrand(d)","category":"page"},{"location":"NQCDistributions/overview/","page":"NQCDistributions.jl","title":"NQCDistributions.jl","text":"This has generated normally distributed positions along with one of the three velocities we provided.","category":"page"},{"location":"NQCDistributions/overview/#VelocityBoltzmann","page":"NQCDistributions.jl","title":"VelocityBoltzmann","text":"","category":"section"},{"location":"NQCDistributions/overview/","page":"NQCDistributions.jl","title":"NQCDistributions.jl","text":"When performing equilibrium simulations it is often desirable to initialise trajectories when thermal velocities. These can be obtained for each atom from a gaussian distribution of the appropriate width, or alternatively, using the VelocityBoltzmann distribution which simplifies the process. This takes the temperature, masses and size of the system and ensures the samples you obtain are of the correct shape:","category":"page"},{"location":"NQCDistributions/overview/","page":"NQCDistributions.jl","title":"NQCDistributions.jl","text":"using NQCDynamics\nusing Unitful\n\nvelocity = VelocityBoltzmann(300u\"K\", rand(10), (3, 10))\nrand(velocity)","category":"page"},{"location":"NQCDistributions/overview/","page":"NQCDistributions.jl","title":"NQCDistributions.jl","text":"This can be handed directly to the DynamicalDistribution when Boltzmann velocities are required.","category":"page"},{"location":"NQCDistributions/overview/","page":"NQCDistributions.jl","title":"NQCDistributions.jl","text":"distribution = DynamicalDistribution(velocity, 1, (3, 10))\nrand(distribution)","category":"page"},{"location":"NQCDistributions/overview/#Wigner-distributions","page":"NQCDistributions.jl","title":"Wigner distributions","text":"","category":"section"},{"location":"NQCDistributions/overview/","page":"NQCDistributions.jl","title":"NQCDistributions.jl","text":"For harmonic oscillator systems, we have implemented the analytic Wigner distribution. These are just mormal distributions of the appropriate width but can be accessed easily as in the following:","category":"page"},{"location":"NQCDistributions/overview/","page":"NQCDistributions.jl","title":"NQCDistributions.jl","text":"using NQCDistributions \n\nomega = 1.0;\nbeta = 1e-3;\nmass = 10;\n\ndist = PositionHarmonicWigner(omega, beta, mass, centre=0.0)\nrand(dist)\ndist = VelocityHarmonicWigner(omega, beta, mass)\nrand(dist)","category":"page"},{"location":"NQCDistributions/overview/","page":"NQCDistributions.jl","title":"NQCDistributions.jl","text":"These can also be given to the DynamicalDistribution since they are just univariate normal distributions.","category":"page"},{"location":"NQCDistributions/overview/#Electronic-distributions","page":"NQCDistributions.jl","title":"Electronic distributions","text":"","category":"section"},{"location":"NQCDistributions/overview/","page":"NQCDistributions.jl","title":"NQCDistributions.jl","text":"For nonadiabatic dynamics, the initial electronic variables must also be sampled. For this, we can use an ElectronicDistribution which will tell our simulation how we want to sample the initial variables. Currently, two of these are provided, the PureState and the MixedState. The PureState is used for nonequilibrium simulations when the population is confined to a single state, whereas MixedState allows for a mixed state distribution.","category":"page"},{"location":"NQCDistributions/overview/","page":"NQCDistributions.jl","title":"NQCDistributions.jl","text":"using NQCDistributions \n\nPureState(1, Diabatic())\nPureState(2, Adiabatic())\nMixedState([1, 2], Diabatic())","category":"page"},{"location":"NQCDistributions/overview/","page":"NQCDistributions.jl","title":"NQCDistributions.jl","text":"These structs contain only the minimal information about the distributions, whereas the sampling of the distribution is handled separately by each of the different methods.","category":"page"},{"location":"NQCDistributions/overview/#Sampling-the-nuclear-distribution","page":"NQCDistributions.jl","title":"Sampling the nuclear distribution","text":"","category":"section"},{"location":"NQCDistributions/overview/","page":"NQCDistributions.jl","title":"NQCDistributions.jl","text":"To learn how to generate configurations to use with the DynamicalDistribution, read on to the next sections about the included sampling methods.","category":"page"},{"location":"api/NQCDynamics/initialconditions/#InitialConditions","page":"InitialConditions","title":"InitialConditions","text":"","category":"section"},{"location":"api/NQCDynamics/initialconditions/","page":"InitialConditions","title":"InitialConditions","text":"Modules=[NQCDynamics.InitialConditions]","category":"page"},{"location":"api/NQCDynamics/initialconditions/#NQCDynamics.InitialConditions","page":"InitialConditions","title":"NQCDynamics.InitialConditions","text":"InitialConditions\n\nFunctions and types for generating initial conditions for simulations.\n\n\n\n\n\n","category":"module"},{"location":"api/NQCDynamics/initialconditions/#ThermalMonteCarlo","page":"InitialConditions","title":"ThermalMonteCarlo","text":"","category":"section"},{"location":"api/NQCDynamics/initialconditions/","page":"InitialConditions","title":"InitialConditions","text":"Modules=[NQCDynamics.InitialConditions.ThermalMonteCarlo]","category":"page"},{"location":"api/NQCDynamics/initialconditions/#NQCDynamics.InitialConditions.ThermalMonteCarlo.run_advancedhmc_sampling-Tuple{Simulation, Any, Any}","page":"InitialConditions","title":"NQCDynamics.InitialConditions.ThermalMonteCarlo.run_advancedhmc_sampling","text":"run_advancedhmc_sampling(sim::Simulation, r, n_samples;\n target_acceptance=0.5, kwargs...)\n\nPerform Hamiltonian Monte Carlo sampling for the simulation sim using AdvancedHMC.jl.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/initialconditions/#NQCDynamics.InitialConditions.ThermalMonteCarlo.run_advancedmh_sampling-Tuple{NQCDynamics.AbstractSimulation, Any, Real, Dict{Symbol, <:Real}}","page":"InitialConditions","title":"NQCDynamics.InitialConditions.ThermalMonteCarlo.run_advancedmh_sampling","text":"run_advancedhmc_sampling(sim, r, steps, σ; move_ratio=0.0, internal_ratio=0.0)\n\nSample the configuration space for the simulation sim starting from r.\n\nTotal number of steps is given by steps and σ is the dictionary of step sizes for each species.\n\nmove_ratio defaults to 0.0 and denotes the fraction of system moved each step. If move_ratio = 0, every degree of freedom is moved at each step. If move_ratio = 1, then nothing will happen. Experiment with this parameter to achieve optimal sampling.\n\ninternal_ratio works as for move_ratio but for the internal modes of the ring polymer.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/initialconditions/#QuantisedDiatomic","page":"InitialConditions","title":"QuantisedDiatomic","text":"","category":"section"},{"location":"api/NQCDynamics/initialconditions/","page":"InitialConditions","title":"InitialConditions","text":"Modules=[NQCDynamics.InitialConditions.QuantisedDiatomic]","category":"page"},{"location":"api/NQCDynamics/initialconditions/#NQCDynamics.InitialConditions.QuantisedDiatomic","page":"InitialConditions","title":"NQCDynamics.InitialConditions.QuantisedDiatomic","text":"QuantisedDiatomic\n\nThis module exports two user facing functions:\n\ngenerate_configurations Creates a set of velocities and positions for diatomic molecule with specified vibrational ν and rotational J quantum numbers.\nquantise_diatomic Obtains vibrational ν and rotational J quantum numbers for a diatomic molecule with a given set of velocities and positions.\n\nThe central concept of this module is the EBK procedure which is nicely detailed here: Andrew J. Larkoski, David G. Ellis, Lorenzo J. Curtis (2006)\n\nInspired by VENUS96: William L Hase, Ronald J Duchovic, Xiche Hu, Andrew Komornicki, Kieran F Lim, Da-hong Lu, Gilles H Peslherbe, Kandadai N Swamy, SR Vande Linde, Antonio Varandas, others (1996)\n\n\n\n\n\n","category":"module"},{"location":"api/NQCDynamics/initialconditions/#NQCDynamics.InitialConditions.QuantisedDiatomic.apply_random_rotation!-Tuple{Any, Any}","page":"InitialConditions","title":"NQCDynamics.InitialConditions.QuantisedDiatomic.apply_random_rotation!","text":"Randomly rotate each column of two 3*N matrix, same rotation for all columns.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/initialconditions/#NQCDynamics.InitialConditions.QuantisedDiatomic.calculate_diatomic_energy-Tuple{Real, NQCModels.AdiabaticModels.AdiabaticModel, NQCDynamics.InitialConditions.QuantisedDiatomic.EvaluationEnvironment}","page":"InitialConditions","title":"NQCDynamics.InitialConditions.QuantisedDiatomic.calculate_diatomic_energy","text":"calculate_diatomic_energy(model::AdiabaticModel, bond_length::Real;\n height=10, normal_vector=[0, 0, 1])\n\nReturns potential energy of diatomic with bond_length at height from surface.\n\nOrients molecule parallel to the surface at the specified height, the surface is assumed to intersect the origin. This requires that the model implicitly provides the surface, or works fine without one.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/initialconditions/#NQCDynamics.InitialConditions.QuantisedDiatomic.combine_slab_and_molecule-Tuple{Any, Any, Any}","page":"InitialConditions","title":"NQCDynamics.InitialConditions.QuantisedDiatomic.combine_slab_and_molecule","text":"combine_slab_and_molecule(atom_indices, molecule, slab)\n\nRevert the transformation separate_slab_and_molecule\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/initialconditions/#NQCDynamics.InitialConditions.QuantisedDiatomic.configure_diatomic-Tuple{Any, Any, Any, Any, NQCDynamics.InitialConditions.QuantisedDiatomic.EvaluationEnvironment, NQCDynamics.InitialConditions.QuantisedDiatomic.GenerationParameters, Any}","page":"InitialConditions","title":"NQCDynamics.InitialConditions.QuantisedDiatomic.configure_diatomic","text":"Randomly orient molecule in space for a given bond length and radial momentum\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/initialconditions/#NQCDynamics.InitialConditions.QuantisedDiatomic.find_total_energy-Tuple{NQCDynamics.InitialConditions.QuantisedDiatomic.EffectivePotential, Any}","page":"InitialConditions","title":"NQCDynamics.InitialConditions.QuantisedDiatomic.find_total_energy","text":"find_total_energy(V::EffectivePotential, ν)\n\nReturns the energy associated with the specified quantum numbers\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/initialconditions/#NQCDynamics.InitialConditions.QuantisedDiatomic.generate_configurations-Tuple{Any, Any, Any}","page":"InitialConditions","title":"NQCDynamics.InitialConditions.QuantisedDiatomic.generate_configurations","text":"generate_configurations(sim, ν, J; samples=1000, height=10, normal_vector=[0, 0, 1],\n translational_energy=0, direction=[0, 0, -1], position=[0, 0, height])\n\nGenerate positions and momenta for given quantum numbers\n\ntranslational_energy, direction and position specify the kinetic energy in a specific direction with the molecule placed with centre of mass at position.\n\nKeyword arguments height and normal_vector become relevant if the potential requires specific placement of the molecule. These allow the molecule to be placed at a distance height in the direction normal_vector when performing potential evaluations.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/initialconditions/#NQCDynamics.InitialConditions.QuantisedDiatomic.quantise_diatomic-Tuple{Simulation, Matrix, Matrix}","page":"InitialConditions","title":"NQCDynamics.InitialConditions.QuantisedDiatomic.quantise_diatomic","text":"quantise_diatomic(sim::Simulation, v::Matrix, r::Matrix;\n height=10, normal_vector=[0, 0, 1])\n\nQuantise the vibrational and rotational degrees of freedom for the specified positions and velocities\n\nWhen evaluating the potential, the molecule is moved to height in direction normal_vector. If the potential is independent of centre of mass position, this has no effect. Otherwise, be sure to modify these parameters to give the intended behaviour.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/initialconditions/#NQCDynamics.InitialConditions.QuantisedDiatomic.select_random_bond_lengths-Tuple{Any, Any, Any}","page":"InitialConditions","title":"NQCDynamics.InitialConditions.QuantisedDiatomic.select_random_bond_lengths","text":"Pick a random bond length and corresponding radial momentum that matches the radial probability distribution.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/initialconditions/#NQCDynamics.InitialConditions.QuantisedDiatomic.separate_slab_and_molecule-Tuple{Any, Any}","page":"InitialConditions","title":"NQCDynamics.InitialConditions.QuantisedDiatomic.separate_slab_and_molecule","text":"separate_slab_and_molecule(atom_indices, r)\n\nGet the coordinates of the molecule and slab separately.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/initialconditions/#NQCDynamics.InitialConditions.QuantisedDiatomic.sqrt_avoid_negatives-Tuple{Any}","page":"InitialConditions","title":"NQCDynamics.InitialConditions.QuantisedDiatomic.sqrt_avoid_negatives","text":"sqrt_avoid_negatives(x)\n\nSame as sqrt but returns zero(x) if x is negative. Used here just in case the endpoints are a little off.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/initialconditions/#MetropolisHastings","page":"InitialConditions","title":"MetropolisHastings","text":"","category":"section"},{"location":"api/NQCDynamics/initialconditions/","page":"InitialConditions","title":"InitialConditions","text":"Modules=[NQCDynamics.InitialConditions.MetropolisHastings]","category":"page"},{"location":"api/NQCDynamics/initialconditions/#NQCDynamics.InitialConditions.MetropolisHastings","page":"InitialConditions","title":"NQCDynamics.InitialConditions.MetropolisHastings","text":"MetropolisHastings\n\nSampling of the initial conditions using the Metropolis-Hastings Markov chain Monte Carlo method.\n\nIncluded within is the ability to sample the canonical distribution for adiabatic classical and ring polymer systems.\n\nUsage involves creating an instance of an AbstractSystem{MonteCarlo} and calling run_monte_carlo_sampling.\n\n\n\n\n\n","category":"module"},{"location":"api/NQCDynamics/initialconditions/#NQCDynamics.InitialConditions.MetropolisHastings.MonteCarlo","page":"InitialConditions","title":"NQCDynamics.InitialConditions.MetropolisHastings.MonteCarlo","text":"Parameters for Monte carlo simulations.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDynamics/initialconditions/#NQCDynamics.InitialConditions.MetropolisHastings.MonteCarloOutput","page":"InitialConditions","title":"NQCDynamics.InitialConditions.MetropolisHastings.MonteCarloOutput","text":"Container for storing simulation quantities\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDynamics/initialconditions/#NQCDynamics.InitialConditions.MetropolisHastings.acceptance_probability-Tuple{Simulation, NQCDynamics.InitialConditions.MetropolisHastings.MonteCarlo}","page":"InitialConditions","title":"NQCDynamics.InitialConditions.MetropolisHastings.acceptance_probability","text":"acceptance_probability(system::AbstractSystem{MonteCarlo})\n\nReturn the Metropolis-Hastings acceptance probability.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/initialconditions/#NQCDynamics.InitialConditions.MetropolisHastings.apply_random_perturbation!-Tuple{Atoms, NQCDynamics.InitialConditions.MetropolisHastings.MonteCarloParameters, AbstractMatrix, Integer, Integer}","page":"InitialConditions","title":"NQCDynamics.InitialConditions.MetropolisHastings.apply_random_perturbation!","text":"apply_random_perturbation!(system::AbstractSystem{MonteCarlo}, R::AbstractMatrix, atom::Integer)\n\nRandomly perturb the xyz coordinates of a single atom.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/initialconditions/#NQCDynamics.InitialConditions.MetropolisHastings.assess_proposal!-Tuple{NQCDynamics.AbstractSimulation, NQCDynamics.InitialConditions.MetropolisHastings.MonteCarloParameters, Any, Any, Any, Integer}","page":"InitialConditions","title":"NQCDynamics.InitialConditions.MetropolisHastings.assess_proposal!","text":"assess_proposal!(system::AbstractSystem{MonteCarlo}, Rᵢ, Rₚ, output, i)\n\nUpdate the energy, check for acceptance, and update the output. \n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/initialconditions/#NQCDynamics.InitialConditions.MetropolisHastings.propose_centroid_move!-Union{Tuple{T}, Tuple{RingPolymerSimulation, NQCDynamics.InitialConditions.MetropolisHastings.PathIntegralMonteCarlo, Array{T, 3}, Array{T, 3}, Integer}} where T<:AbstractFloat","page":"InitialConditions","title":"NQCDynamics.InitialConditions.MetropolisHastings.propose_centroid_move!","text":"propose_centroid_move!(system::RingPolymerSystem{MonteCarlo}, Rᵢ::Array{T, 3}, Rₚ::Array{T, 3}) where {T<:AbstractFloat}\n\nPropose a move for the ring polymer centroid for one atom.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/initialconditions/#NQCDynamics.InitialConditions.MetropolisHastings.propose_move!-Tuple{Simulation, NQCDynamics.InitialConditions.MetropolisHastings.MonteCarlo, Matrix, Matrix, Integer}","page":"InitialConditions","title":"NQCDynamics.InitialConditions.MetropolisHastings.propose_move!","text":"propose_move!(system::System{MonteCarlo}, Rᵢ::Matrix{T}, Rₚ::Matrix{T}) where {T<:AbstractFloat}\n\nPropose simple cartesian move for a single atom.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/initialconditions/#NQCDynamics.InitialConditions.MetropolisHastings.propose_normal_mode_move!-Union{Tuple{T}, Tuple{RingPolymerSimulation, NQCDynamics.InitialConditions.MetropolisHastings.PathIntegralMonteCarlo, Array{T, 3}, Array{T, 3}, Integer}} where T","page":"InitialConditions","title":"NQCDynamics.InitialConditions.MetropolisHastings.propose_normal_mode_move!","text":"propose_normal_mode_move!(system::RingPolymerSystem{MonteCarlo}, Rᵢ::Array{T, 3}, Rₚ::Array{T, 3}) where {T}\n\nPropose a move for a single normal mode for a single atom.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/initialconditions/#NQCDynamics.InitialConditions.MetropolisHastings.run_main_loop!-Tuple{Simulation, NQCDynamics.InitialConditions.MetropolisHastings.MonteCarlo, Matrix, Matrix, NQCDynamics.InitialConditions.MetropolisHastings.MonteCarloOutput}","page":"InitialConditions","title":"NQCDynamics.InitialConditions.MetropolisHastings.run_main_loop!","text":"run_main_loop!(system::System{MonteCarlo}, Rᵢ::Matrix, Rₚ::Matrix, output::MonteCarloOutput)\n\nMain loop for classical systems.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/initialconditions/#NQCDynamics.InitialConditions.MetropolisHastings.run_main_loop!-Union{Tuple{T}, Tuple{RingPolymerSimulation, NQCDynamics.InitialConditions.MetropolisHastings.PathIntegralMonteCarlo, Array{T, 3}, Array{T, 3}, NQCDynamics.InitialConditions.MetropolisHastings.MonteCarloOutput}} where T","page":"InitialConditions","title":"NQCDynamics.InitialConditions.MetropolisHastings.run_main_loop!","text":"Main loop for ring polymer systems.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/initialconditions/#NQCDynamics.InitialConditions.MetropolisHastings.run_monte_carlo_sampling-Union{Tuple{T}, Tuple{Simulation, Matrix{T}, Dict{Symbol, T}, Real}} where T","page":"InitialConditions","title":"NQCDynamics.InitialConditions.MetropolisHastings.run_monte_carlo_sampling","text":"run_monte_carlo_sampling(sim::AbstractSimulation, monte::MonteCarloParameters, R0)\n\nPerform Monte Carlo sampling for the system defined by the sim and monte parameters.\n\nFrom the initial positions specified R0 the system will be explored using the Metropolis-Hastings algorithm.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/initialconditions/#NQCDynamics.InitialConditions.MetropolisHastings.write_output!-Tuple{NQCDynamics.InitialConditions.MetropolisHastings.MonteCarloOutput, AbstractArray, AbstractFloat}","page":"InitialConditions","title":"NQCDynamics.InitialConditions.MetropolisHastings.write_output!","text":"write_output!(output::MonteCarloOutput, Rᵢ::AbstractArray, energy::AbstractFloat, i::Integer)\n\nStore the current configuration and associated energy.\n\n\n\n\n\n","category":"method"},{"location":"examples/reactive_scattering/#example-h2scattering","page":"Reactive scattering from a metal surface","title":"Reactive scattering from a metal surface","text":"","category":"section"},{"location":"examples/reactive_scattering/","page":"Reactive scattering from a metal surface","title":"Reactive scattering from a metal surface","text":"Our implementation allows us to simulate vibrational de-excitation probability during reactive scattering events at metal surfaces for any diatomic molecule with a suitable model to describe energies and forces (and friction coefficients for MDEF simulations). Here, we investigate the reactive scattering of hydrogen on a Ag(111) metal surface as a prototypical example.","category":"page"},{"location":"examples/reactive_scattering/","page":"Reactive scattering from a metal surface","title":"Reactive scattering from a metal surface","text":"To run this kind of simulation, a set of initial positions and velocities (mathbfR and mathbfdotR) with ro-vibrational quantum states nu and j have to be generated (see EBK quantisation). With a specific ro-vibrational quantum state it is possible to compute different properties after molecular collision and energy transfer with the metal surface like the vibrational de-excitation probabilities discussed here.","category":"page"},{"location":"examples/reactive_scattering/","page":"Reactive scattering from a metal surface","title":"Reactive scattering from a metal surface","text":"In order to reproduce the state-to-state vibrational de-excitation probability results presented originally by Yaolong Zhang, Reinhard J. Maurer, Hua Guo, Bin Jiang (2019) for this system, the same initial conditions were generated with QuantisedDiatomic.generate_configurations setting the initial ro-vibrational quantum state to (nu=2 j=0) as was explored in the original paper. ","category":"page"},{"location":"examples/reactive_scattering/","page":"Reactive scattering from a metal surface","title":"Reactive scattering from a metal surface","text":"As shown earlier in the EBK documentation we are able to generate a semiclassically quantised distribution for a diatomic molecule on a collision course with a metal surface. In this example we follow the EBK example using the H2AgModel to prepare our initial distribution and run our simulation.","category":"page"},{"location":"examples/reactive_scattering/","page":"Reactive scattering from a metal surface","title":"Reactive scattering from a metal surface","text":"Specifically, we have produced a set of initial conditions with different translational energy (translational_energy keyword) ranging from 0.2 to 1.4 eV, locating the hydrogen molecule 8 Å away from the metal surface (height keyword) with a normal incidence.","category":"page"},{"location":"examples/reactive_scattering/","page":"Reactive scattering from a metal surface","title":"Reactive scattering from a metal surface","text":"note: Atomic units\nAs usual, all quantities default to atomic units. Here we use Unitful to input the translational energy and height using different units, where they are later converted internally.","category":"page"},{"location":"examples/reactive_scattering/","page":"Reactive scattering from a metal surface","title":"Reactive scattering from a metal surface","text":"using NQCDynamics\nusing NNInterfaces\nusing Unitful\nusing NQCDynamics.InitialConditions: QuantisedDiatomic\nusing JLD2\n\natoms = Atoms([:H, :H])\nmodel = H2AgModel()\ncell = PeriodicCell([11.1175 -5.5588 0.0; 0.0 9.628 0.0; 0.0 0.0 70.3079])\nsim = Simulation(atoms, model; cell=cell)\n\nν, J = 2, 0 # selected ro-vibrational quantum states \nnsamples = 300 # number of configurations \nEk = 0.5u\"eV\" # Translational energy [eV] ; range considered [0.2-1.4] eV\nz = 8.0u\"Å\" # Height [Å] ; fixed at 8 Å\n\nconfigurations = QuantisedDiatomic.generate_configurations(sim, ν, J;\n samples=nsamples, translational_energy=Ek, height=z)\nv = first.(configurations)\nr = last.(configurations)\n\ndistribution = DynamicalDistribution(v, r, (3,2))\nnothing # hide","category":"page"},{"location":"examples/reactive_scattering/","page":"Reactive scattering from a metal surface","title":"Reactive scattering from a metal surface","text":"tip: Saving the distribution\nGenerally it will be desirable to generate a distribution once and re-use it for multiple dynamics simulations. The simplest way to do this is to save the distribution using JLD2.jl. Refer to Saving and loading to learn more.","category":"page"},{"location":"examples/reactive_scattering/","page":"Reactive scattering from a metal surface","title":"Reactive scattering from a metal surface","text":"In order to produce an unweighted distribution, the lateral and angular orientation are randomly selected within the unit cell. As an example of the spacial and orientation distribution generated with this module, a subset of data (300 configurations) is shown below. To run our production simulations, however, a set of 80,000 initial velocities and positions were used.","category":"page"},{"location":"examples/reactive_scattering/","page":"Reactive scattering from a metal surface","title":"Reactive scattering from a metal surface","text":"(Image: initial conditions)","category":"page"},{"location":"examples/reactive_scattering/#Data-analysis-and-truncation-function","page":"Reactive scattering from a metal surface","title":"Data analysis and truncation function","text":"","category":"section"},{"location":"examples/reactive_scattering/","page":"Reactive scattering from a metal surface","title":"Reactive scattering from a metal surface","text":"Since we are interested in the dynamics only when the molecule is close to the surface, we can use a callback to terminate the simulation early to save us some time. This requires defining a function that returns true when we want the simulation to terminate. This means we can set our time span relatively long since we expect most simulations to terminate before reaching the time limit.","category":"page"},{"location":"examples/reactive_scattering/","page":"Reactive scattering from a metal surface","title":"Reactive scattering from a metal surface","text":"using Statistics: mean\nusing LinearAlgebra: norm\n\nh2distance(p) = norm(p[:,1] .- p[:,2])\n\n\"Terminates simulation if returns `true`.\" \nfunction termination_condition(u, t, integrator)::Bool\n R = get_positions(u)\n zcom = au_to_ang(mean(R[3,:])) # Convert vertical centre of mass to angstrom\n if zcom > 8.1 # Scattering event\n return true\n elseif au_to_ang(h2distance(R)) > 2.5 # Reactive event\n return true\n else\n return false\n end\nend\n\nterminate = DynamicsUtils.TerminatingCallback(termination_condition)\ntspan = (0.0, 420.0u\"fs\")\nnothing # hide","category":"page"},{"location":"examples/reactive_scattering/","page":"Reactive scattering from a metal surface","title":"Reactive scattering from a metal surface","text":"In this example, we consider the outcome a reactive event if the H-H bond length is larger than 2.5 Å in any point of during the trajectory and a scattering event if the molecule rebounds to a vertical distance from the metal surface greater than 8.1 Å.","category":"page"},{"location":"examples/reactive_scattering/#MDEF-with-the-LDFA","page":"Reactive scattering from a metal surface","title":"MDEF with the LDFA","text":"","category":"section"},{"location":"examples/reactive_scattering/","page":"Reactive scattering from a metal surface","title":"Reactive scattering from a metal surface","text":"Now that we have set up the initial distribution and some of our simulation parameters, we can choose which form of friction we would like use. First, let's use the LDFA implementation provided by the CubeLDFAModel. This takes a .cube file containing the electron density and will provide the friction during the dynamics. Here we have given the new model our model from above, which will provide the forces.","category":"page"},{"location":"examples/reactive_scattering/","page":"Reactive scattering from a metal surface","title":"Reactive scattering from a metal surface","text":"using CubeLDFAModel\nmodel = LDFAModel(model, \"../assets/friction/test.cube\", atoms, friction_atoms=[1,2], cell)","category":"page"},{"location":"examples/reactive_scattering/","page":"Reactive scattering from a metal surface","title":"Reactive scattering from a metal surface","text":"Now we can pass all the variables defined so far to the Simulation and run multiple trajectories using run_dynamics.","category":"page"},{"location":"examples/reactive_scattering/","page":"Reactive scattering from a metal surface","title":"Reactive scattering from a metal surface","text":"sim = Simulation{MDEF}(atoms, model, cell=cell, temperature=300u\"K\")\nensemble = run_dynamics(sim, tspan, distribution;selection=1:20,\n dt=0.1u\"fs\", output=OutputPosition, trajectories=20, callback=terminate)","category":"page"},{"location":"examples/reactive_scattering/#MDEF-with-neural-network-friction","page":"Reactive scattering from a metal surface","title":"MDEF with neural network friction","text":"","category":"section"},{"location":"examples/reactive_scattering/","page":"Reactive scattering from a metal surface","title":"Reactive scattering from a metal surface","text":"Above, we used the LDFA interpretation of MDEF to perform the simulation. However, the H2AgModel actually provides it's own friction tensor trained on ab initio data. This can be used by simply using the model directly, without wrapping it with the LDFAModel.","category":"page"},{"location":"examples/reactive_scattering/","page":"Reactive scattering from a metal surface","title":"Reactive scattering from a metal surface","text":"model = H2AgModel()\nsim = Simulation{MDEF}(atoms, model, cell=cell, temperature=300u\"K\")\nensemble = run_dynamics(sim, tspan, distribution;selection=1:20,\n dt=0.1u\"fs\", output=OutputPosition, trajectories=20, callback=terminate)","category":"page"},{"location":"examples/reactive_scattering/#Visualisation","page":"Reactive scattering from a metal surface","title":"Visualisation","text":"","category":"section"},{"location":"examples/reactive_scattering/","page":"Reactive scattering from a metal surface","title":"Reactive scattering from a metal surface","text":"To show the effect of the truncation procedure, we have run 20 trajectories with and without the truncation function starting with an initial translation energy at 1.0 eV. For both figures, the total and kinetic energies are shown in the top panels along with the H-H distance and centre of mass z coordinate for each individual trajectory.","category":"page"},{"location":"examples/reactive_scattering/","page":"Reactive scattering from a metal surface","title":"Reactive scattering from a metal surface","text":"(Image: truncation)","category":"page"},{"location":"NQCModels/overview/#NQCModels.jl","page":"NQCModels.jl","title":"NQCModels.jl","text":"","category":"section"},{"location":"NQCModels/overview/","page":"NQCModels.jl","title":"NQCModels.jl","text":"To perform nonadiabatic molecular dynamics simulations, it is necessary to define the system Hamiltonian. For simple models, this often comes in the form of small matrix in the diabatic representation but equally the electronic Hamiltonian could be obtained directly from ab initio electronic structure theory.","category":"page"},{"location":"NQCModels/overview/","page":"NQCModels.jl","title":"NQCModels.jl","text":"NQCModels.jl is a package that aims to provide a common interface for defining these models that is flexible enough to allow for a wide range of specifications and requirements. NQCDynamics.jl uses this interface to obtain the potentials and couplings necessary to perform the dynamics simulations. Along with the minimal interface, NQCModels.jl also provides a small set of popular models often used in the field of nonadiabatic dynamics.","category":"page"},{"location":"NQCModels/overview/","page":"NQCModels.jl","title":"NQCModels.jl","text":"note: Note\nTaking advantages of Julia's seamless modularity, NQCModels.jl is designed as a separate package so that it can also be used independently from the main package.","category":"page"},{"location":"NQCModels/overview/","page":"NQCModels.jl","title":"NQCModels.jl","text":"Depending on the quantities provided by the Model, we use Julia's abstract type system to group models that provide the same quantities. Currently, there are two top-level abstract types: AdiabaticModel and DiabaticModel. The AdiabaticModel is used for adiabatic dynamics, providing only the potential and force used in classical mechanics. The DiabaticModel is used for nonadiabatic dynamics, where the potential is instead a Hermitian matrix.","category":"page"},{"location":"NQCModels/overview/","page":"NQCModels.jl","title":"NQCModels.jl","text":"In the Getting started section we briefly touched on how the AdiabaticModel works and introduced one of the included models. Here let's take a look at a DiabaticModel, which is more appropriate for nonadiabatic dynamics.","category":"page"},{"location":"NQCModels/overview/","page":"NQCModels.jl","title":"NQCModels.jl","text":"The DoubleWell is a two state, 1 dimensional model where each state is harmonic with linear coupling to the single degree of freedom.","category":"page"},{"location":"NQCModels/overview/","page":"NQCModels.jl","title":"NQCModels.jl","text":"using NQCModels\n\nmodel = DoubleWell()","category":"page"},{"location":"NQCModels/overview/","page":"NQCModels.jl","title":"NQCModels.jl","text":"Our DoubleWell implements the functions potential, derivative, nstates and ndofs that return the potential, the derivative of the potential, the number of states, and the number of degrees of freedom, respectively.","category":"page"},{"location":"NQCModels/overview/","page":"NQCModels.jl","title":"NQCModels.jl","text":"potential(model, 0.2)\nderivative(model, 0.2)\nnstates(model)\nndofs(model)","category":"page"},{"location":"NQCModels/overview/","page":"NQCModels.jl","title":"NQCModels.jl","text":"Since this is a 1D model, the position argument that appears in the derivative and the potential is a real number. For higher dimensional models with multiple atoms, the position will need to be provided as an AbstractMatrix.","category":"page"},{"location":"NQCModels/overview/","page":"NQCModels.jl","title":"NQCModels.jl","text":"To understand how this can extend to another dimension, we can take a quick look at the GatesHollowayElbow model which is another two state diabatic model, but this one uses two dimensions to model a diatomic molecule interacting with a surface. The two coordinates are the molecular bond length and the distance from the surface. Technically, the model has been defined such that there are two atoms, each with only a single degree of freedom. This allows us to use different masses for each of the coordinates when performing dynamics.","category":"page"},{"location":"NQCModels/overview/","page":"NQCModels.jl","title":"NQCModels.jl","text":"model = GatesHollowayElbow()\npotential(model, [1.0 1.0])\nderivative(model, [1.0 1.0])\nnstates(model)\nndofs(model)","category":"page"},{"location":"NQCModels/overview/","page":"NQCModels.jl","title":"NQCModels.jl","text":"Here we see how the derivative now becomes a Matrix with size matching our input, but each entry is a Hermitian containing the elementwise derivative of the potential with respect to each degree of freedom. In this case, the Matrix has size = (1, 2), but it should be clear how this can extend to arbitrary numbers of atoms and degrees of freedom for complex models.","category":"page"},{"location":"NQCModels/overview/","page":"NQCModels.jl","title":"NQCModels.jl","text":"The models currently available can be seen in type tree of the Model below. The leaves of the tree are the concrete models, whereas each branch is one of the abstract types. Each of these models can be seen in the Analytic model library and many shall return later when we investigate the dynamics methods.","category":"page"},{"location":"NQCModels/overview/","page":"NQCModels.jl","title":"NQCModels.jl","text":"import AbstractTrees # hide\nimport InteractiveUtils: subtypes # hide\nimport NQCModels: Model # hide\nAbstractTrees.children(x::Type) = subtypes(x) # hide\nAbstractTrees.print_tree(Model) # hide","category":"page"},{"location":"NQCModels/overview/","page":"NQCModels.jl","title":"NQCModels.jl","text":"note: Contributing new models\nTo learn more about NQCModels.jl and learn how to implement new models, visit the developer documentation.","category":"page"},{"location":"devdocs/new_methods/#Contributing-a-new-method","page":"Contributing a new method","title":"Contributing a new method","text":"","category":"section"},{"location":"devdocs/new_methods/","page":"Contributing a new method","title":"Contributing a new method","text":"A key goal of NQCDynamics.jl is to provide an accessible toolkit for implementing new nonadiabatic dynamics methods. This page details the steps you must take in order to create a new dynamics method. The existing methods are stored inside the DynamicsMethods submodule, and this is where new methods should be implemented. Technically, it is possible to implement new methods completely separately from the package by importing and extending the relevant functions but if you would like to include your method in the package, it should be added within this submodule.","category":"page"},{"location":"devdocs/new_methods/","page":"Contributing a new method","title":"Contributing a new method","text":"note: Note\nGenerally, each method has its own file, though similar methods are grouped into submodules and share functionality across files. For example, multiple surface hopping methods have been implemented in the submodule DynamicsMethods.SurfaceHoppingMethods, where some functions are shared across the files. ","category":"page"},{"location":"devdocs/new_methods/#Basic-implementation","page":"Contributing a new method","title":"Basic implementation","text":"","category":"section"},{"location":"devdocs/new_methods/","page":"Contributing a new method","title":"Contributing a new method","text":"To implement a new dynamics method, the necessary steps are:","category":"page"},{"location":"devdocs/new_methods/#Create-a-new-subtype-of-DynamicsMethods.Method.","page":"Contributing a new method","title":"Create a new subtype of DynamicsMethods.Method.","text":"","category":"section"},{"location":"devdocs/new_methods/","page":"Contributing a new method","title":"Contributing a new method","text":"This Method acts as an extra parameter inside the simulation that allows us to specify any extra information needed for our dynamics method. This can be a good place to include any temporary arrays and parameters for the simulation. Refer to the Julia manual section on Composite Types to learn how this types are created. Here, our type is called MyMethod and we have included an a parameter that will influence our dynamics:","category":"page"},{"location":"devdocs/new_methods/","page":"Contributing a new method","title":"Contributing a new method","text":"using NQCDynamics\n\nstruct MyMethod <: DynamicsMethods.Method\n a::Float64\nend","category":"page"},{"location":"devdocs/new_methods/#Implement-DynamicsVariables","page":"Contributing a new method","title":"Implement DynamicsVariables","text":"","category":"section"},{"location":"devdocs/new_methods/","page":"Contributing a new method","title":"Contributing a new method","text":"This function returns an AbstractArray of the variables to be used as the initial condition for the simulation. The array should contain all of the variables that will change during the dynamics.","category":"page"},{"location":"devdocs/new_methods/","page":"Contributing a new method","title":"Contributing a new method","text":"tip: Choosing an array format\nThe only constraint on the array type is that they are AbstractArrays. It could be a simple matrix or vector, but usually we use ComponentArrays.jl to structure the variables. The ComponentVector allows us to collect variables of different types into a convenient format to perform dynamics.","category":"page"},{"location":"devdocs/new_methods/","page":"Contributing a new method","title":"Contributing a new method","text":"For classical dynamics, this would include only the positions and velocities, however, for FSSH we must also include the continuous electronic variables and the discrete state.","category":"page"},{"location":"devdocs/new_methods/","page":"Contributing a new method","title":"Contributing a new method","text":"note: Discrete variables\nSome methods such as FSSH have discontinuous variables, like the current occupied state. Discrete variables be handled separately using DEDataArrays.jl. For surface hopping methods, we have the SurfaceHoppingVariables type that uses this to combine a ComponentVector containing the continuous variables and the discrete state label.","category":"page"},{"location":"devdocs/new_methods/","page":"Contributing a new method","title":"Contributing a new method","text":"For our new method, MyMethod, we implement the DynamicsVariables function and return a ComponentVector containing the velocities, positions and extra variables x. Inside this function we are free to take any inputs and manipulate them before returning the result. As an example, suppose that our x variables are randomly generated each time we run the dynamics, this could be done as follows:","category":"page"},{"location":"devdocs/new_methods/","page":"Contributing a new method","title":"Contributing a new method","text":"using ComponentArrays\n\nfunction DynamicsMethods.DynamicsVariables(sim::Simulation{<:MyMethod}, v, r, k)\n return ComponentVector(v=v, r=r, x=rand()*k)\nend","category":"page"},{"location":"devdocs/new_methods/","page":"Contributing a new method","title":"Contributing a new method","text":"Here, we take the velocities v, positions r and assign them to the output as we would for classical dynamics, but we also generate a random between 0 and k, where k was given as input.","category":"page"},{"location":"devdocs/new_methods/#Implement-motion!(du,-u,-sim,-t)","page":"Contributing a new method","title":"Implement motion!(du, u, sim, t)","text":"","category":"section"},{"location":"devdocs/new_methods/","page":"Contributing a new method","title":"Contributing a new method","text":"This function should fill du with the time-derivative of the dynamics variables u in the usual way expected by DifferentialEquations.jl. We use the in-place version, where each element of du is filled with the time derivative of the correponding element in u.","category":"page"},{"location":"devdocs/new_methods/","page":"Contributing a new method","title":"Contributing a new method","text":"Inside the DynamicsUtils submodule there are some useful functions like velocity! and divide_by_mass! which can handle some of the common parts of the motion! function. You are free to perform whatever manipulations you like inside this function, but note that motion! is a performance critical function, called numerous times during the simulation, so you should attempt to minimise allocations inside this function.","category":"page"},{"location":"devdocs/new_methods/","page":"Contributing a new method","title":"Contributing a new method","text":"note: Note\nBy convention in Julia, functions that end with the ! modify at least one of their arguments.","category":"page"},{"location":"devdocs/new_methods/","page":"Contributing a new method","title":"Contributing a new method","text":"function DynamicsMethods.motion!(du, u, sim::Simulation{MyMethod}, t)\n\n DynamicsUtils.velocity!(du.r, u.v, u.r, sim, t) # Set du.r equal to the velocity\n\n # Set the acceleration of the particles\n du.v .= -sim.method.a .* u.r # Use the `a` parameter we stored in the `method`.\n DynamicsUtils.divide_by_mass!(du.v, sim.atoms.masses) # Divide du.v by the mass\n\n du.x .= 1 ./ u.x # Set time derivative of `x`.\n\n return nothing # The return of this function is not used so the return is unimportant\nend","category":"page"},{"location":"devdocs/new_methods/","page":"Contributing a new method","title":"Contributing a new method","text":"Here we have set the time derivative of the positions equal to the velocity, the time derivative of the velocities equal to the acceleration where the force involves the parameter a. Finally, the time derivative of the extra x variable is also set.","category":"page"},{"location":"devdocs/new_methods/#Solve-a-trajectory","page":"Contributing a new method","title":"Solve a trajectory","text":"","category":"section"},{"location":"devdocs/new_methods/","page":"Contributing a new method","title":"Contributing a new method","text":"To perform a simulation with our new method, we can write a script in the usual format and run the dynamics. In this script, we have a single atom with a mass of 1 with a single degree of freedom. We match this by initialising the positions and velocities equal to random 1x1 matrices. The a parameter of the method has been set equal to 2.0, and the initial value of x has been set to 0.5.","category":"page"},{"location":"devdocs/new_methods/","page":"Contributing a new method","title":"Contributing a new method","text":"sim = Simulation(Atoms(1), Free(), MyMethod(2.0))\nu = DynamicsVariables(sim, rand(1,1), rand(1,1), [0.5])\n\nsol = run_dynamics(sim, (0.0, 5.0), u, output=(OutputPosition, OutputVelocity, OutputDynamicsVariables))","category":"page"},{"location":"devdocs/new_methods/","page":"Contributing a new method","title":"Contributing a new method","text":"note: Note\nIn the definition of our motion! method, we have accessed only the atoms field of the simulation. This means that the model we pass to the Simulation constructor is not used. Generally the model is accessed through the calculator interface and examples of its usage can be found by referring the implementations of the existing methods.","category":"page"},{"location":"devdocs/new_methods/","page":"Contributing a new method","title":"Contributing a new method","text":"To visualise the result we can plot each of the quantities from the output table:","category":"page"},{"location":"devdocs/new_methods/","page":"Contributing a new method","title":"Contributing a new method","text":"using Plots\n\nplot(sol, :OutputPosition, label=\"Position\")\nplot!(sol, :OutputVelocity, label=\"Velocity\")\nplot!(sol, :OutputDynamicsVariables, label=\"Dynamics variables\", legend=true)\nylabel!(\"Value(t)\")","category":"page"},{"location":"devdocs/new_methods/","page":"Contributing a new method","title":"Contributing a new method","text":"note: Note\nThe additional x parameter that we created cannot be accessed in the output tuple with a pre-existing function as with position and velocity since it is not a standard quantity. Instead, we request OutputDynamicsVariables which contains all of the dynamical variables. In the plot, two of the lines labelled DynamicsVariables overlap the position and velocity result. The unique line labelled Dynamics variables is the x variable. When implementing your method, if you want to add new output quantities you should do this inside the DynamicsOutputs submodule.","category":"page"},{"location":"devdocs/new_methods/#Advanced-tips","page":"Contributing a new method","title":"Advanced tips","text":"","category":"section"},{"location":"devdocs/new_methods/#Is-there-a-custom-algorithm-you-can-implement?","page":"Contributing a new method","title":"Is there a custom algorithm you can implement?","text":"","category":"section"},{"location":"devdocs/new_methods/","page":"Contributing a new method","title":"Contributing a new method","text":"Some dynamics methods have special algorithms that are tailored to the specific problem and achieve better performance than the general algorithms include in DifferentialEquations.jl. For example, ring polymer methods typically use a symplectic scheme to solve for the internal modes of the ring polymer, allowing much larger timesteps. The DifferentialEquations.jl framework provides a simple interface for adding new algorithms, check out the developer documentation to learn how it works. You can also find some examples of custom algorithms in the DynamicsMethods.IntegrationAlgorithms module.","category":"page"},{"location":"devdocs/models/#devdocs-model","page":"Implementing a new model","title":"Implementing a new model","text":"","category":"section"},{"location":"devdocs/models/","page":"Implementing a new model","title":"Implementing a new model","text":"NQCModels.jl aims to provide a unified interface for defining model Hamiltonians for nonadiabatic dynamics simulations.","category":"page"},{"location":"devdocs/models/","page":"Implementing a new model","title":"Implementing a new model","text":"Here, we walk through the implementation of a few different types of model to explain the interface.","category":"page"},{"location":"devdocs/models/#Abstract-types","page":"Implementing a new model","title":"Abstract types","text":"","category":"section"},{"location":"devdocs/models/","page":"Implementing a new model","title":"Implementing a new model","text":"Julia's abstract type system can be likened to the inheritance concept from object-oriented programming or the trait system from Rust. It allows us to defined shared behaviour for a groups of structs and allows us to define a common set of functions that all of the concrete types must implement.","category":"page"},{"location":"devdocs/models/","page":"Implementing a new model","title":"Implementing a new model","text":"In NQCModels.jl the top level abstract type is the Model, under which all of our models must fall. The second tier below this includes the two abstract types AdiabaticModel and DiabaticModel. These form the two distinct branches within the NQCModels type hierachy and the shared behaviour across the branches is minimal. The AdiabaticModel describes the familiar form from molecular dynamics that provides a single potential energy surface. The DiabaticModel instead provides multiple potential energy surfaces with couplings between them. As implied by the name, these are in the diabatic representation. If the desired model does not fall under either of these branches, a new abstract type should be created.","category":"page"},{"location":"devdocs/models/#Minor-branches","page":"Implementing a new model","title":"Minor branches","text":"","category":"section"},{"location":"devdocs/models/","page":"Implementing a new model","title":"Implementing a new model","text":"Under the two main branches there also exists some specialised abstract types that are useful in some cases, such as when using many electronic states, or when implementing extra functions is required. See the docstrings for more info:","category":"page"},{"location":"devdocs/models/","page":"Implementing a new model","title":"Implementing a new model","text":"AdiabaticFrictionModel\nLargeDiabaticModel\nDiabaticFrictionModel","category":"page"},{"location":"devdocs/models/#Example-implementations","page":"Implementing a new model","title":"Example implementations","text":"","category":"section"},{"location":"devdocs/models/","page":"Implementing a new model","title":"Implementing a new model","text":"To implement a new model, you first select the abstract type, where you should first take a look at the docstring for the abstract type (click on the links above). There, a list of the functions that need to be implemented along with an example implementation are provided.","category":"page"},{"location":"devdocs/models/","page":"Implementing a new model","title":"Implementing a new model","text":"For further examples, you can also take a look into the source code of the NQCModels.jl package to see how the analytic models have been implemented. If you have any issues or questions about implementing a new model, open up an issue on Github and we can work together to resolve the problem. ","category":"page"},{"location":"initialconditions/langevin/#langevin-sampling","page":"Thermal Langevin dynamics","title":"Thermal Langevin dynamics","text":"","category":"section"},{"location":"initialconditions/langevin/","page":"Thermal Langevin dynamics","title":"Thermal Langevin dynamics","text":"Thermal initial conditions can be obtained directly from a Langevin dynamics simulations. See the Langevin dynamics page for more info.","category":"page"},{"location":"api/NQCDynamics/estimators/#Estimators","page":"Estimators","title":"Estimators","text":"","category":"section"},{"location":"api/NQCDynamics/estimators/","page":"Estimators","title":"Estimators","text":"Modules=[NQCDynamics.Estimators]","category":"page"},{"location":"api/NQCDynamics/estimators/#NQCDynamics.Estimators","page":"Estimators","title":"NQCDynamics.Estimators","text":"Estimators\n\nFunctions for computing thermal expectation values as ensemble averages.\n\n\n\n\n\n","category":"module"},{"location":"api/NQCDynamics/estimators/#NQCDynamics.Estimators.adiabatic_population","page":"Estimators","title":"NQCDynamics.Estimators.adiabatic_population","text":"adiabatic_population\n\n\n\n\n\n","category":"function"},{"location":"api/NQCDynamics/estimators/#NQCDynamics.Estimators.diabatic_population","page":"Estimators","title":"NQCDynamics.Estimators.diabatic_population","text":"diabatic_population\n\n\n\n\n\n","category":"function"},{"location":"api/NQCDynamics/estimators/#NQCDynamics.Estimators.kinetic_energy-Tuple{Simulation, Any}","page":"Estimators","title":"NQCDynamics.Estimators.kinetic_energy","text":"kinetic_energy(sim, u)\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/estimators/#NQCDynamics.Estimators.potential_energy-Tuple{NQCDynamics.AbstractSimulation, Any}","page":"Estimators","title":"NQCDynamics.Estimators.potential_energy","text":"potential_energy(sim, u)\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/estimators/#NQCDynamics.Estimators.radius_of_gyration-Union{Tuple{T}, Tuple{RingPolymerSimulation, AbstractArray{T, 3}}} where T","page":"Estimators","title":"NQCDynamics.Estimators.radius_of_gyration","text":"radius_of_gyration(sim, r)\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/estimators/#NQCDynamics.Estimators.total_energy-Tuple{NQCDynamics.AbstractSimulation, Any}","page":"Estimators","title":"NQCDynamics.Estimators.total_energy","text":"total_energy(sim, u)\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/estimators/#NQCDynamics.Estimators.@estimate-Tuple{Any}","page":"Estimators","title":"NQCDynamics.Estimators.@estimate","text":"@estimate f(simulation, vector)\n\nEvaluate f(simulation, vector[i]) for all i and return the average.\n\nCan be used for any function defined in Estimators.jl.\n\n\n\n\n\n","category":"macro"},{"location":"NQCModels/analyticmodels/#Analytic-model-library","page":"Analytic model library","title":"Analytic model library","text":"","category":"section"},{"location":"NQCModels/analyticmodels/","page":"Analytic model library","title":"Analytic model library","text":"This page plots many of the analytic models included in NQCDynamics.","category":"page"},{"location":"NQCModels/analyticmodels/","page":"Analytic model library","title":"Analytic model library","text":"tip: Tip\nTo produce the plots we use two of Julia's plotting options Plots and Makie. Plots has a mature recipe system that allows us to define custom plots for the 1D models but we use Makie to produce the more complex images. Each of these has their pros and cons and if you are interested in producing plots using Julia you should visit their documentation to decide which is best for you.","category":"page"},{"location":"NQCModels/analyticmodels/#[AdiabaticModels](@ref-NQCModels.AdiabaticModels)","page":"Analytic model library","title":"AdiabaticModels","text":"","category":"section"},{"location":"NQCModels/analyticmodels/","page":"Analytic model library","title":"Analytic model library","text":"These models are used for classical dynamics and provide a single potential energy surface.","category":"page"},{"location":"NQCModels/analyticmodels/#[Harmonic](@ref)","page":"Analytic model library","title":"Harmonic","text":"","category":"section"},{"location":"NQCModels/analyticmodels/","page":"Analytic model library","title":"Analytic model library","text":"using NQCModels, Plots\nplot(-10:0.1:10, Harmonic())","category":"page"},{"location":"NQCModels/analyticmodels/#[DiatomicHarmonic](@ref)","page":"Analytic model library","title":"DiatomicHarmonic","text":"","category":"section"},{"location":"NQCModels/analyticmodels/","page":"Analytic model library","title":"Analytic model library","text":"using NQCModels\nusing Plots\n\nmodel = DiatomicHarmonic(r₀=10.0)\nf(x,y) = potential(model, [x y 0])\ncontour(-10:0.1:10, -10:0.1:10, f, fill=true)\nxlabel!(\"x coordinate /a₀\")\nylabel!(\"y coordinate /a₀\")","category":"page"},{"location":"NQCModels/analyticmodels/#[DarlingHollowayElbow](@ref)","page":"Analytic model library","title":"DarlingHollowayElbow","text":"","category":"section"},{"location":"NQCModels/analyticmodels/","page":"Analytic model library","title":"Analytic model library","text":"using NQCModels\nusing NQCBase: eV_to_au\nusing CairoMakie\n\nmodel = DarlingHollowayElbow()\nV(x,z) = potential(model, [x, z])\n\nx = range(-0.5, 3.5, length=200)\nz = range(-0.5, 4.5, length=200)\n\nf = Figure()\nax = Axis(f[1,1], xlabel=\"Bond length /a₀\", ylabel=\"Surface molecule distance /a₀\")\n\nlevels = eV_to_au.([-0.1, 0.1, 0.3, 0.5, 0.7, 0.9, 1.1])\ncontourf!(ax, x, z, V, levels=levels)\ncontour!(ax, x, z, V, levels=levels, color=:black)\nColorbar(f[1,2], limits=(-0.1, 1.1))\nxlims!(-0.5, 3.5)\nylims!(-0.5, 4.5)\nf","category":"page"},{"location":"NQCModels/analyticmodels/#[DiabaticModels](@ref-NQCModels.DiabaticModels)","page":"Analytic model library","title":"DiabaticModels","text":"","category":"section"},{"location":"NQCModels/analyticmodels/","page":"Analytic model library","title":"Analytic model library","text":"These models define a Hermitian potential operator in a diabatic basis. These can be used for various forms of nonadiabatic dynamics.","category":"page"},{"location":"NQCModels/analyticmodels/#[TullyModelOne](@ref)","page":"Analytic model library","title":"TullyModelOne","text":"","category":"section"},{"location":"NQCModels/analyticmodels/","page":"Analytic model library","title":"Analytic model library","text":"using NQCModels, Plots\nplot(-10:0.1:10, TullyModelOne(); coupling=true)","category":"page"},{"location":"NQCModels/analyticmodels/#[TullyModelTwo](@ref)","page":"Analytic model library","title":"TullyModelTwo","text":"","category":"section"},{"location":"NQCModels/analyticmodels/","page":"Analytic model library","title":"Analytic model library","text":"using NQCModels, Plots\nplot(-10:0.1:10, TullyModelTwo(); coupling=true)","category":"page"},{"location":"NQCModels/analyticmodels/#[TullyModelThree](@ref)","page":"Analytic model library","title":"TullyModelThree","text":"","category":"section"},{"location":"NQCModels/analyticmodels/","page":"Analytic model library","title":"Analytic model library","text":"using NQCModels, Plots\nplot(-10:0.1:10, TullyModelThree(); coupling=true)","category":"page"},{"location":"NQCModels/analyticmodels/#[ThreeStateMorse](@ref)","page":"Analytic model library","title":"ThreeStateMorse","text":"","category":"section"},{"location":"NQCModels/analyticmodels/","page":"Analytic model library","title":"Analytic model library","text":"using NQCModels, Plots\nplot(2:0.01:12, ThreeStateMorse(), ylims=(0, 0.06), coupling=true)","category":"page"},{"location":"NQCModels/analyticmodels/#[OuyangModelOne](@ref)","page":"Analytic model library","title":"OuyangModelOne","text":"","category":"section"},{"location":"NQCModels/analyticmodels/","page":"Analytic model library","title":"Analytic model library","text":"using NQCModels, Plots\nplot(-10:0.1:10, OuyangModelOne())","category":"page"},{"location":"NQCModels/analyticmodels/#[DoubleWell](@ref)","page":"Analytic model library","title":"DoubleWell","text":"","category":"section"},{"location":"NQCModels/analyticmodels/","page":"Analytic model library","title":"Analytic model library","text":"using NQCModels, Plots\nplot(-5:0.1:5, DoubleWell(); coupling=true)","category":"page"},{"location":"NQCModels/analyticmodels/#[GatesHollowayElbow](@ref)","page":"Analytic model library","title":"GatesHollowayElbow","text":"","category":"section"},{"location":"NQCModels/analyticmodels/","page":"Analytic model library","title":"Analytic model library","text":"using NQCModels\nusing CairoMakie\n\nmodel = GatesHollowayElbow()\nv1(x,z) = potential(model, [x z])[1,1]\nv2(x,z) = potential(model, [x z])[2,2]\ncoupling(x,z) = potential(model, [x z])[1,2]\n\nx = range(-0.5, 4.0, length=200)\nz = range(-0.5, 4.0, length=200)\n\nf = Figure()\nax = Axis(f[1,1], xlabel=\"x coordinate\", ylabel=\"z coordinate\", limits=(-0.5, 4.0, -0.5, 4.0))\n\ncontour!(ax, x, z, coupling, color=:black, levels=10, label=\"V12\")\ncontour!(ax, x, z, v1, color=:blue, levels=0:0.01:0.1, label=\"V11\")\ncontour!(ax, x, z, v2, color=:red, levels=0:0.01:0.1, label=\"V22\")\nf","category":"page"},{"location":"#Introduction","page":"Introduction","title":"Introduction","text":"","category":"section"},{"location":"","page":"Introduction","title":"Introduction","text":"Welcome to the documentation for NQCDynamics, a package for performing nonadiabatic molecular dynamics simulations. The documentation covers both how to use the existing code and describes the intricacies of the implementations, hoping to make further contributions as simple as possible.","category":"page"},{"location":"#Objectives","page":"Introduction","title":"Objectives","text":"","category":"section"},{"location":"","page":"Introduction","title":"Introduction","text":"Achieve high performance along with good readability, extensibility, maintainability\nHandle both simple models and high-dimensional systems\nHighlight the advantages of Julia in the field of nonadiabatic dynamics\nEncourage code sharing and reuse within the nonadiabatic dynamics community","category":"page"},{"location":"","page":"Introduction","title":"Introduction","text":"Reproducibility is a pressing issue in the field of theoretical chemistry and physics as often studies either do not attempt to provide all necessary data or code for full reproducibility of the work. This can lead to difficulties when attempting to better understand the theory and implementation of the method and makes it difficult for students not only to learn existing models and theories, but also to improve and extend these. This project provides implementations for existing dynamics methods along with a framework that can be used for future research with the goal of encouraging greater code sharing and reuse within the nonadiabatic dynamics community.","category":"page"},{"location":"#Features","page":"Introduction","title":"Features","text":"","category":"section"},{"location":"","page":"Introduction","title":"Introduction","text":"Here we provide a list of currently implemented features of the code. We encourage contributions and implementations of methods. To do so, please open up an issue/pull request on Github!","category":"page"},{"location":"#Dynamics-methods","page":"Introduction","title":"Dynamics methods","text":"","category":"section"},{"location":"","page":"Introduction","title":"Introduction","text":"Classical molecular dynamics\nClassical Langevin dynamics\nFewest-switches surface hopping (FSSH)\nMolecular dynamics with electronic friction (MDEF)\nRing polymer molecular dynamics (RPMD)\nNonadiabatic ring polymer molecular dynamics (NRPMD)\nRing polymer surface hopping (RPSH)\nEhrenfest molecular dynamics","category":"page"},{"location":"#Generating-initial-conditions","page":"Introduction","title":"Generating initial conditions","text":"","category":"section"},{"location":"","page":"Introduction","title":"Introduction","text":"Thermal Metropolis-Hastings Monte Carlo\nThermal Hamiltonian Monte Carlo\nLangevin dynamics\nSemiclassical EBK quantisation","category":"page"},{"location":"#Dynamics-with-DifferentialEquations.jl","page":"Introduction","title":"Dynamics with DifferentialEquations.jl","text":"","category":"section"},{"location":"","page":"Introduction","title":"Introduction","text":"The DifferentialEquations ecosystem from the SciML organisation provides a large library of integration algorithms along with a simple interface for implementing new algorithms that can be tailored for specific nonadiabatic dynamics methods. Further, they provide helpful utilities for introducing discontinuities through the callback interface or handling many trajectories at once to obtain ensemble averaged observables with the ensemble interface. We can take advantage of these utilities by basing our dynamics setup on this framework which significantly simplifies the implementation of new methods.","category":"page"},{"location":"#Installation","page":"Introduction","title":"Installation","text":"","category":"section"},{"location":"#.-Install-Julia","page":"Introduction","title":"1. Install Julia","text":"","category":"section"},{"location":"","page":"Introduction","title":"Introduction","text":"Download and install the current stable release from the Julia website. For most platforms julia is provided as a precompiled binary and do not require any installation procedure. However, you need to specify the path to julia or create a symbolic link to the executable that is in your systempath. ","category":"page"},{"location":"#.-Install-the-NQCRegistry","page":"Introduction","title":"2. Install the NQCRegistry","text":"","category":"section"},{"location":"","page":"Introduction","title":"Introduction","text":"Since the package is not included in the default registry (General), we must first install the NQCRegistry. This gives access to the core NQCDynamics package along with some dependencies and add-ons. First, enter the Julia REPL by executing julia from the command line. Then press ] to enter pkg mode. The prompt should change from julia> to pkg>. Install the registry directly from Github with: ","category":"page"},{"location":"","page":"Introduction","title":"Introduction","text":"pkg> registry add \"https://github.com/NQCD/NQCRegistry\"","category":"page"},{"location":"","page":"Introduction","title":"Introduction","text":"warning: Warning\nIf this is the first time you're using Julia there's a chance that the General registry will not have been installed. Run pkg> registry status to view the installed registries. If General is not present, run pkg> registry add General before proceeding to the next step.","category":"page"},{"location":"#.-Install-the-package","page":"Introduction","title":"3. Install the package","text":"","category":"section"},{"location":"","page":"Introduction","title":"Introduction","text":"Now that the registry has been added, the package can be installed in the same way as any other registered Julia package:","category":"page"},{"location":"","page":"Introduction","title":"Introduction","text":"pkg> add NQCDynamics","category":"page"},{"location":"#.-Use-the-package!","page":"Introduction","title":"4. Use the package!","text":"","category":"section"},{"location":"","page":"Introduction","title":"Introduction","text":"julia> using NQCDynamics","category":"page"},{"location":"","page":"Introduction","title":"Introduction","text":"You are now free to proceed to the next section and learn how to use the package. If you would like you can complete step 5 to double check your installation.","category":"page"},{"location":"#.-Run-the-tests-(optional)","page":"Introduction","title":"5. Run the tests (optional)","text":"","category":"section"},{"location":"","page":"Introduction","title":"Introduction","text":"To check the package has been installed correctly and everything is working, you can execute the tests with:","category":"page"},{"location":"","page":"Introduction","title":"Introduction","text":"pkg> test NQCDynamics","category":"page"},{"location":"","page":"Introduction","title":"Introduction","text":"warning: Warning\nThe tests use some extra functionality from the JuliaMolSim registry which can be added directly from Github with pkg> registry add \"https://github.com/JuliaMolSim/MolSim\". Without this, the tests will not run successfully.","category":"page"},{"location":"#How-to-use-this-documentation","page":"Introduction","title":"How to use this documentation","text":"","category":"section"},{"location":"","page":"Introduction","title":"Introduction","text":"The first page to read is the Getting started section which walks through all the ingredients needed to perform a conventional classical molecular dynamics simulation. After this, the reader is free to explore at their leisure since everything else builds directly upon sections from the Getting started page.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpsh/#rpsh-dynamics","page":"Ring polymer surface hopping (RPSH)","title":"Ring polymer surface hopping (RPSH)","text":"","category":"section"},{"location":"dynamicssimulations/dynamicsmethods/rpsh/","page":"Ring polymer surface hopping (RPSH)","title":"Ring polymer surface hopping (RPSH)","text":"Ring polymer surface hopping was one of the early attempts to extend RPMD to the realm of nonadiabatic dynamics Philip Shushkov, Richard Li, John C. Tully (2012). On the surface, the concept is reasonably simple. Since RPMD proceeds on a single adiabatic surface, it should be possible to directly combine the FSSH scheme with ring polymer dynamics to approximately include nuclear quantum effects in the surface hopping dynamics. However, there are some ambiguities surrounding the exact implementation when considering how to couple the electronic equations to the nuclear equations and how the velocity rescaling should be implemented.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpsh/","page":"Ring polymer surface hopping (RPSH)","title":"Ring polymer surface hopping (RPSH)","text":"Originally, two varieties were proposed: the bead approximation and the centroid approximation. The centroid approximation is the simpler of the two and involves directly replacing the classical particle in the FSSH algorithm with the ring polymer centroid. This means that the nonadiabatic couplings evaluated at the centroid and the centroid velocity are used to propagate the electronic equations, and the kinetic energy is conserved on the centroid level. This is the version that is implemented here.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpsh/","page":"Ring polymer surface hopping (RPSH)","title":"Ring polymer surface hopping (RPSH)","text":"The bead approximation involves evaluating the nonadiabatic couplings for every bead and using these contributions from every bead to propagate the electronics. This version acts to conserve the kinetic energy for the entire ring polymer. Philip Shushkov, Richard Li, John C. Tully (2012) describes both the centroid and bead approximations, Farnaz A. Shakib, Pengfei Huo (2017) uses the centroid approximation.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpsh/#Example","page":"Ring polymer surface hopping (RPSH)","title":"Example","text":"","category":"section"},{"location":"dynamicssimulations/dynamicsmethods/rpsh/","page":"Ring polymer surface hopping (RPSH)","title":"Ring polymer surface hopping (RPSH)","text":"In this example we can apply RPSH to the ThreeStateMorse model as shown in the supporting info of Farnaz A. Shakib, Pengfei Huo (2017). This model has a single particle with mass of 20000 a.u. and we use 4 beads for the ring polymer.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpsh/","page":"Ring polymer surface hopping (RPSH)","title":"Ring polymer surface hopping (RPSH)","text":"using NQCDynamics\nusing Unitful\n\natoms = Atoms(20000)\nmodel = ThreeStateMorse()\nsim = RingPolymerSimulation{FSSH}(atoms, model, 4; temperature=300u\"K\")\nnothing # hide","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpsh/","page":"Ring polymer surface hopping (RPSH)","title":"Ring polymer surface hopping (RPSH)","text":"For our initial conditions let's use a position distribution centred at 2.1 a.u. with Boltzmann velocities at 300 K.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpsh/","page":"Ring polymer surface hopping (RPSH)","title":"Ring polymer surface hopping (RPSH)","text":"using Distributions: Normal\n\nposition = Normal(2.1, 1 / sqrt(20000 * 0.005))\nvelocity = VelocityBoltzmann(300u\"K\" * nbeads(sim), masses(sim), (1,1))\ndistribution = DynamicalDistribution(velocity, position, size(sim)) * PureState(1)\nnothing # hide","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpsh/","page":"Ring polymer surface hopping (RPSH)","title":"Ring polymer surface hopping (RPSH)","text":"Now let's run an ensemble of trajectories that sample from this distribution. For the output we will receive the diabatic population at intervals of t=50 and it will be averaged over all trajectories by the :mean keyword.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpsh/","page":"Ring polymer surface hopping (RPSH)","title":"Ring polymer surface hopping (RPSH)","text":"solution = run_dynamics(sim, (0.0, 3000.0), distribution;\n saveat=50, trajectories=50, dt=1,\n output=TimeCorrelationFunctions.PopulationCorrelationFunction(sim, Diabatic()),\n reduction=MeanReduction())","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpsh/","page":"Ring polymer surface hopping (RPSH)","title":"Ring polymer surface hopping (RPSH)","text":"note: Note\nIn the examples section at the end of the documentation we will return to this model and compare the performance of multiple methods.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpsh/","page":"Ring polymer surface hopping (RPSH)","title":"Ring polymer surface hopping (RPSH)","text":"Here we plot diabatic population of each state as a function of time. The result closely resembles the literature reference (Farnaz A. Shakib, Pengfei Huo (2017)). The small discrepancy that occurs at around t=2000 is due to our use of an alternative method to calculate the diabatic populations. A discussion on this topic is available from Brian R. Landry, Martin J. Falk, Joseph E. Subotnik (2013).","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpsh/","page":"Ring polymer surface hopping (RPSH)","title":"Ring polymer surface hopping (RPSH)","text":"using Plots\n\nplot(0:50:3000, [p[1,1] for p in solution[:PopulationCorrelationFunction]], label=\"State 1\")\nplot!(0:50:3000, [p[1,2] for p in solution[:PopulationCorrelationFunction]], label=\"State 2\")\nplot!(0:50:3000, [p[1,3] for p in solution[:PopulationCorrelationFunction]], label=\"State 3\")\nxlabel!(\"Time /a.u.\")\nylabel!(\"Population\")","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpsh/","page":"Ring polymer surface hopping (RPSH)","title":"Ring polymer surface hopping (RPSH)","text":"For our simulation we are using a Normal distribution to initialise our ring polymer configuration. Since ring polymer surface hopping has not been rigorously derived, this choice is somewhat arbitrary and it is possible that better results could be achieved using a free ring polymer distribution instead. Ralph Welsch, Kai Song, Qiang Shi, Stuart C. Althorpe, Thomas F. Miller (2016) provides a theoretical description of how nonequilibrium simulations using RPMD should be performed. This techniques here should likely be applied to RPSH too.","category":"page"},{"location":"references/#References","page":"References","title":"References","text":"","category":"section"},{"location":"references/","page":"References","title":"References","text":"","category":"page"},{"location":"examples/threestatemorse/#Time-dependent-populations-with-the-ThreeStateMorse-model","page":"Time-dependent populations with the ThreeStateMorse model","title":"Time-dependent populations with the ThreeStateMorse model","text":"","category":"section"},{"location":"examples/threestatemorse/","page":"Time-dependent populations with the ThreeStateMorse model","title":"Time-dependent populations with the ThreeStateMorse model","text":"In this example we investigate the time-dependent populations of the three state morse model parametrised to describe photodissociation processes (Eduardo A. Coronado, Jianhua Xing, William H. Miller (2001)). This reference introduces three versions of this model with different parameter sets. Our ThreeStateMorse model matches model C from the reference.","category":"page"},{"location":"examples/threestatemorse/","page":"Time-dependent populations with the ThreeStateMorse model","title":"Time-dependent populations with the ThreeStateMorse model","text":"First let's visualise the diabats and couplings for the model. You can see two regions where the diabats cross with non-zero coupling where we can expect to see population transfer.","category":"page"},{"location":"examples/threestatemorse/","page":"Time-dependent populations with the ThreeStateMorse model","title":"Time-dependent populations with the ThreeStateMorse model","text":"using NQCDynamics\nusing CairoMakie\n\nx = range(2, 12, length=200)\nmodel = ThreeStateMorse()\nV = potential.(model, x)\n\nfig = Figure()\nax = Axis(fig[1,1], xlabel=\"Nuclear coordinate /a.u.\", ylabel=\"Potential energy /a.u.\")\n\nlines!(ax, x, [v[1,1] for v in V], label=\"State 1\")\nlines!(ax, x, [v[2,2] for v in V], label=\"State 2\")\nlines!(ax, x, [v[3,3] for v in V], label=\"State 3\")\n\nlines!(ax, x, [v[1,2] for v in V], label=\"Coupling 12\")\nlines!(ax, x, [v[2,3] for v in V], label=\"Coupling 23\")\nlines!(ax, x, [v[1,3] for v in V], label=\"Coupling 13\")\n\nxlims!(2, 12)\nylims!(0, 0.06)\naxislegend(ax)\n\nfig ","category":"page"},{"location":"examples/threestatemorse/","page":"Time-dependent populations with the ThreeStateMorse model","title":"Time-dependent populations with the ThreeStateMorse model","text":"To this model we can apply any of the methods capable of starting the population on a single diabatic state and returning the population as a function of time. Here, let's use FSSH and Ehrenfest. We can expect the nuclear quantum effects here to be minimal since the nuclear mass is chosen to be 20000. ","category":"page"},{"location":"examples/threestatemorse/","page":"Time-dependent populations with the ThreeStateMorse model","title":"Time-dependent populations with the ThreeStateMorse model","text":"m = 20000\natoms = Atoms(m)\nnothing # hide","category":"page"},{"location":"examples/threestatemorse/","page":"Time-dependent populations with the ThreeStateMorse model","title":"Time-dependent populations with the ThreeStateMorse model","text":"For our initial conditions, we use the Wigner distribution for a Harmonic oscillator centred at 2.1 with a frequency of 5e-3 at a temperature of 300 K. This distribution is chosen to mimic a thermal ground state distribution before photoexcitation.","category":"page"},{"location":"examples/threestatemorse/","page":"Time-dependent populations with the ThreeStateMorse model","title":"Time-dependent populations with the ThreeStateMorse model","text":"using Distributions: Normal\nusing Unitful, UnitfulAtomic\n\nω = 5e-3\nβ = 1/austrip(300u\"K\")\nposition = PositionHarmonicWigner(ω, β, m; centre=2.1)\nvelocity = VelocityHarmonicWigner(ω, β, m)\ndistribution = DynamicalDistribution(velocity, position, (1,1)) * PureState(1)\nnothing # hide","category":"page"},{"location":"examples/threestatemorse/","page":"Time-dependent populations with the ThreeStateMorse model","title":"Time-dependent populations with the ThreeStateMorse model","text":"Now let's run the two simulations using Ehrenfest and FSSH. For both simulations we use the same initial distribution and average the results using reduction=:mean. TimeCorrelationFunctions.PopulationCorrelationFunction will correlate the intial population with the final population at each timestep.","category":"page"},{"location":"examples/threestatemorse/","page":"Time-dependent populations with the ThreeStateMorse model","title":"Time-dependent populations with the ThreeStateMorse model","text":"sim = Simulation{FSSH}(atoms, model)\nfssh_result = run_dynamics(sim, (0.0, 3000.0), distribution;\n saveat=10, trajectories=50,\n output=TimeCorrelationFunctions.PopulationCorrelationFunction(sim, Diabatic()),\n reduction=MeanReduction(), dt=1.0)\nsim = Simulation{Ehrenfest}(atoms, model)\nehrenfest_result = run_dynamics(sim, (0.0, 3000.0), distribution;\n saveat=10, trajectories=50,\n output=TimeCorrelationFunctions.PopulationCorrelationFunction(sim, Diabatic()),\n reduction=MeanReduction(), dt=1.0)\n\nfig = Figure()\nax = Axis(fig[1,1], xlabel=\"Time /a.u.\", ylabel=\"Population\")\n\nx = 0:10:3000\nlines!(ax, x, [p[1,1] for p in fssh_result[:PopulationCorrelationFunction]], label=\"FSSH State 1\", color=:red)\nlines!(ax, x, [p[1,2] for p in fssh_result[:PopulationCorrelationFunction]], label=\"FSSH State 2\", color=:green)\nlines!(ax, x, [p[1,3] for p in fssh_result[:PopulationCorrelationFunction]], label=\"FSSH State 3\", color=:blue)\n\nlines!(ax, x, [p[1,1] for p in ehrenfest_result[:PopulationCorrelationFunction]], label=\"Ehrenfest State 1\", color=:red, linestyle=:dash)\nlines!(ax, x, [p[1,2] for p in ehrenfest_result[:PopulationCorrelationFunction]], label=\"Ehrenfest State 2\", color=:green, linestyle=:dash)\nlines!(ax, x, [p[1,3] for p in ehrenfest_result[:PopulationCorrelationFunction]], label=\"Ehrenfest State 3\", color=:blue, linestyle=:dash)\naxislegend(ax)\n\nfig","category":"page"},{"location":"examples/threestatemorse/","page":"Time-dependent populations with the ThreeStateMorse model","title":"Time-dependent populations with the ThreeStateMorse model","text":"To reduce the build time for the documentation the results here are underconverged but already it is clear that both of these methods come close to the exact result shown by Eduardo A. Coronado, Jianhua Xing, William H. Miller (2001). After performing enough trajectories to converge the population dynamics, we would be better able to judge the effectiveness of FSSH and Ehrenfest at reproducing the exact quantum dynamics for this model.","category":"page"},{"location":"devdocs/diffeq/#DifferentialEquations.jl-integration","page":"DifferentialEquations.jl integration","title":"DifferentialEquations.jl integration","text":"","category":"section"},{"location":"devdocs/diffeq/","page":"DifferentialEquations.jl integration","title":"DifferentialEquations.jl integration","text":"NQCDynamics.jl is built directly on top of the established DifferentialEquations.jl that provides a vast array of features. By using DifferentialEquations.jl to perform the dynamics, we can immediately exploit many of these features to save us a lot of work. This page details some of the features from DifferentialEquations.jl that we have used.","category":"page"},{"location":"devdocs/diffeq/#devdocs-callbacks","page":"DifferentialEquations.jl integration","title":"Callbacks","text":"","category":"section"},{"location":"devdocs/diffeq/","page":"DifferentialEquations.jl integration","title":"DifferentialEquations.jl integration","text":"Callbacks allow us to introduce extra code during the dynamics without needing to meddle with the integration code directly. On the developer side, [Callbacks] is the mechanism used for the saving in the run_dynamics function and the surface hopping procedure during FSSH. The user can also write their own callbacks and give these to any of the dynamics functions to manipulate the progress of the dynamics or introduce their own saving mechanism.","category":"page"},{"location":"devdocs/diffeq/","page":"DifferentialEquations.jl integration","title":"DifferentialEquations.jl integration","text":"We also provide two pre-made callbacks which can be given to the dynamics functions. These are the TerminatingCallback, for terminating the simulation early, and the CellBoundaryCallback that can be used to ensure the atoms obey the periodicity of the simulation cell.","category":"page"},{"location":"devdocs/diffeq/","page":"DifferentialEquations.jl integration","title":"DifferentialEquations.jl integration","text":"Here, we can show how these callbacks can be used in tandem to alter the course of the simulation. Let's look at a classical dynamics simulation without any extra callbacks:","category":"page"},{"location":"devdocs/diffeq/","page":"DifferentialEquations.jl integration","title":"DifferentialEquations.jl integration","text":"using NQCDynamics\nusing Plots\n\natoms = Atoms(:C)\nmodel = NQCModels.Harmonic()\ncell = PeriodicCell(hcat(50))\nsim = Simulation(atoms, model; cell=cell)\n\nz = DynamicsVariables(sim, hcat(1.0), zeros(1,1))\n\nsolution = run_dynamics(sim, (0.0, 300), z; dt=1.0, output=OutputPosition)\nplot(solution, :OutputPosition, label=\"No callbacks\", legend=true)","category":"page"},{"location":"devdocs/diffeq/","page":"DifferentialEquations.jl integration","title":"DifferentialEquations.jl integration","text":"Now we can introduce callbacks and observe the difference:","category":"page"},{"location":"devdocs/diffeq/","page":"DifferentialEquations.jl integration","title":"DifferentialEquations.jl integration","text":"solution = run_dynamics(sim, (0.0, 300), z; callback=DynamicsUtils.CellBoundaryCallback(), dt=1.0, output=OutputPosition)\nplot!(solution, :OutputPosition, label=\"Cell boundary\" )\n\nusing DiffEqBase: CallbackSet\nterminate(u, t, integrator) = t > 100\ncallbacks = CallbackSet(DynamicsUtils.CellBoundaryCallback(), DynamicsUtils.TerminatingCallback(terminate))\nsolution = run_dynamics(sim, (0.0, 300), z; callback=callbacks, dt=1.0, output=OutputPosition)\nplot!(solution, :OutputPosition, label=\"Cell + termination\")","category":"page"},{"location":"devdocs/diffeq/","page":"DifferentialEquations.jl integration","title":"DifferentialEquations.jl integration","text":"See how the callbacks have altered the dynamics? The atom no longer leaves the simulation cell, and the termination caused the simulation to exit early. ","category":"page"},{"location":"devdocs/diffeq/","page":"DifferentialEquations.jl integration","title":"DifferentialEquations.jl integration","text":"The callback setup we're using is exactly that provided by DifferentialEquations.jl, if you want more details on callbacks, please refer to their documentation.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/classical/#classical-dynamics","page":"Classical molecular dynamics","title":"Classical molecular dynamics","text":"","category":"section"},{"location":"dynamicssimulations/dynamicsmethods/classical/","page":"Classical molecular dynamics","title":"Classical molecular dynamics","text":"Classical (molecular) dynamics proceeds by solving the dynamics for a system governed by a classical Hamiltonian containing the kinetic energy of the particles and a potential energy function:","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/classical/","page":"Classical molecular dynamics","title":"Classical molecular dynamics","text":"H = fracP^22M + V(R)","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/classical/","page":"Classical molecular dynamics","title":"Classical molecular dynamics","text":"To integrate the equations we use the VelocityVerlet() algorithm from DifferentialEquations.jl, which is one of the most widely used algorithms for molecular dynamics.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/classical/#Example","page":"Classical molecular dynamics","title":"Example","text":"","category":"section"},{"location":"dynamicssimulations/dynamicsmethods/classical/","page":"Classical molecular dynamics","title":"Classical molecular dynamics","text":"We can create two particles with mass = 1 and attach a DiatomicHarmonic interaction which provides a harmonic interatomic potential.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/classical/","page":"Classical molecular dynamics","title":"Classical molecular dynamics","text":"note: Note\nRecall that the constructor for Simulation(...) when called without a type parameter as below defaults to Simulation{Classical}(...).","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/classical/","page":"Classical molecular dynamics","title":"Classical molecular dynamics","text":"using NQCDynamics\nusing Plots\n\nsim = Simulation(Atoms([1, 1]), DiatomicHarmonic())\nv = rand(3, 2)\nu0 = DynamicsVariables(sim, zeros(3, 2), hcat(randn(3), randn(3).+1))\n\ntraj = run_dynamics(sim, (0.0, 10.0), u0; dt=0.1, output=OutputPosition)\n\nplot(traj, :OutputPosition)","category":"page"},{"location":"api/NQCDynamics/ringpolymers/#RingPolymers","page":"RingPolymers","title":"RingPolymers","text":"","category":"section"},{"location":"api/NQCDynamics/ringpolymers/","page":"RingPolymers","title":"RingPolymers","text":"Modules=[NQCDynamics.RingPolymers]","category":"page"},{"location":"api/NQCDynamics/ringpolymers/#NQCDynamics.RingPolymers.RingPolymerParameters-Union{Tuple{T}, Tuple{Integer, Real, AbstractVector{Symbol}, Vector{Symbol}}} where T","page":"RingPolymers","title":"NQCDynamics.RingPolymers.RingPolymerParameters","text":"Constructor for choosing specific elements to be quantum.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/ringpolymers/#NQCDynamics.RingPolymers.RingPolymerParameters-Union{Tuple{T}, Tuple{Integer, Real, Integer}} where T","page":"RingPolymers","title":"NQCDynamics.RingPolymers.RingPolymerParameters","text":"Constructor for the case where all nuclei are quantum.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/ringpolymers/#NQCDynamics.RingPolymers.cayley_propagator-Union{Tuple{T}, Tuple{NQCDynamics.RingPolymers.RingPolymerParameters{T}, Real}} where T","page":"RingPolymers","title":"NQCDynamics.RingPolymers.cayley_propagator","text":"cayley_propagator(beads::RingPolymerParameters{T}, dt::Real; half::Bool=true) where {T}\n\nJ. Chem. Phys. 151, 124103 (2019); doi: 10.1063/1.5120282\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/ringpolymers/#NQCDynamics.RingPolymers.get_spring_energy-Tuple{NQCDynamics.RingPolymers.RingPolymerParameters, Any, Any}","page":"RingPolymers","title":"NQCDynamics.RingPolymers.get_spring_energy","text":"get_spring_energy(beads::RingPolymerParameters, masses, R)\n\nCalculate the ring polymer spring potential.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/ringpolymers/#NQCDynamics.RingPolymers.get_spring_matrix-Tuple{Integer, Real}","page":"RingPolymers","title":"NQCDynamics.RingPolymers.get_spring_matrix","text":"get_L(n_beads, mass, ω_n)\n\nReturn the Circulant symmetric matrix for the ring polymer springs.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/ensembles/#Ensembles","page":"Ensembles","title":"Ensembles","text":"","category":"section"},{"location":"api/NQCDynamics/ensembles/","page":"Ensembles","title":"Ensembles","text":"Modules=[NQCDynamics.Ensembles]","category":"page"},{"location":"api/NQCDynamics/ensembles/#NQCDynamics.Ensembles","page":"Ensembles","title":"NQCDynamics.Ensembles","text":"Ensembles\n\nThis module provides the main function run_dynamics. This serves to run multiple trajectories for a given simulation type, sampling from an initial distribution.\n\n\n\n\n\n","category":"module"},{"location":"api/NQCDynamics/ensembles/#NQCDynamics.Ensembles.EnsembleSaver","page":"Ensembles","title":"NQCDynamics.Ensembles.EnsembleSaver","text":"EnsembleSaver{F<:Tuple}\n\nStore a tuple of functions with the signature f(sol) where sol is a DiffEq solution object. EnsembleSaver will evaluate each of these functions and return the result in a Dictionary.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDynamics/ensembles/#NQCDynamics.Ensembles.MeanReduction","page":"Ensembles","title":"NQCDynamics.Ensembles.MeanReduction","text":"Average the outputs over all trajectories.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDynamics/ensembles/#NQCDynamics.Ensembles.OrderedSelection","page":"Ensembles","title":"NQCDynamics.Ensembles.OrderedSelection","text":"Select the initial conditions from the distribution in order. \n\n\n\n\n\n","category":"type"},{"location":"api/NQCDynamics/ensembles/#NQCDynamics.Ensembles.RandomSelection","page":"Ensembles","title":"NQCDynamics.Ensembles.RandomSelection","text":"Obtain initial conditions by randomly sampling the distribution.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDynamics/ensembles/#NQCDynamics.Ensembles.SumReduction","page":"Ensembles","title":"NQCDynamics.Ensembles.SumReduction","text":"Sum the outputs from each trajectory.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDynamics/ensembles/#NQCDynamics.Ensembles.run_dynamics-Tuple{NQCDynamics.AbstractSimulation, Any, Any}","page":"Ensembles","title":"NQCDynamics.Ensembles.run_dynamics","text":"run_dynamics(sim::AbstractSimulation, tspan, distribution;\n output,\n selection::Union{Nothing,AbstractVector}=nothing,\n reduction=AppendReduction(),\n ensemble_algorithm=SciMLBase.EnsembleSerial(),\n algorithm=DynamicsMethods.select_algorithm(sim),\n trajectories=1,\n kwargs...\n )\n\nRun trajectories for timespan tspan sampling from distribution.\n\nKeywords\n\noutput either a single function or a Tuple of functions with the signature f(sol, i) that takes the DifferentialEquations solution and returns the desired output quantity.\nselection should be an AbstractVector containing the indices to sample from the distribution. By default, nothing leads to random sampling.\nreduction defines how the data is reduced across trajectories. Options are AppendReduction(), MeanReduction(), SumReduction and FileReduction(filename).\nensemble_algorithm is the algorithm from DifferentialEquations which determines which form of parallelism is used.\nalgorithm is the algorithm used to integrate the equations of motion.\ntrajectories is the number of trajectories to perform.\nkwargs... any additional keywords are passed to DifferentialEquations solve`.\n\n\n\n\n\n","category":"method"},{"location":"integration_algorithms/#Integration-algorithms","page":"Integration algorithms","title":"Integration algorithms","text":"","category":"section"},{"location":"integration_algorithms/","page":"Integration algorithms","title":"Integration algorithms","text":"At the core of NQCDynamics.jl is the DifferentialEquations.jl package that performs all of the dynamics simulations. Within the sub-packages OrdinaryDiffEq.jl and StochasticDiffEq.jl, a variety of integration algorithms have been implemented that are available to use without needing to implement custom algorithms for specific applications. However, in some cases it can be desirable to implement algorithms that can take advantage of the special structure of the dynamical system at hand. A key example in the field of molecular dynamics is the famous velocity Verlet algorithm that is extremely popular due to its requirement for only a single force evaluation during each time step and symplectic energy conservation properties. In fact, velocity Verlet, along with a variety of other symplectic solvers are also implemented within OrdinaryDiffEq.jl.","category":"page"},{"location":"integration_algorithms/","page":"Integration algorithms","title":"Integration algorithms","text":"For some problems encountered within semiclassical adiabatic and nonadiabatic dynamics, there are a few different algorithms that can be used to obtain improved performance. Ideally, these would be implemented using the DifferentialEquations.jl interface to allow for others to easily use these algorithms for their own problems. However, it can be challenging to implement algorithms with an appropriate level of generality. NQCDynamics.jl contains implementations for a few algorithms using the DifferentialEquations.jl interface but the implementations are not completely generic and are coupled to the rest of the package. In particular, the algorithms rely on specific formats for the dynamical arrays and use some functions that are not provided within the DEProblem. In future it would be great to try to decouple the algorithms and package them separately within the DifferentialEquations.jl ecosystem so that others can use them more easily.","category":"page"},{"location":"integration_algorithms/","page":"Integration algorithms","title":"Integration algorithms","text":"This page describes a few applications where special algorithms are available to enhance performance. In each section it is noted which algorithms are available within NQCDynamics.jl.","category":"page"},{"location":"integration_algorithms/#Ring-polymer-propagation","page":"Integration algorithms","title":"Ring polymer propagation","text":"","category":"section"},{"location":"integration_algorithms/","page":"Integration algorithms","title":"Integration algorithms","text":"Path integral molecular dynamics and ring polymer molecular dynamics involve solving Hamilton's equations for a classical ring polymer Hamiltonian. The ring polymer Hamiltonian describes many replicas of the system joined together by harmonic springs. The number of replicas or beads required must be increased until convergence is achieved. After adding many beads the ring polymer dynamics becomes hard to integrate, as the ring polymer internal modes become the highest frequency modes in the system, limiting the largest acceptable time step.","category":"page"},{"location":"integration_algorithms/","page":"Integration algorithms","title":"Integration algorithms","text":"To circumvent this difficulty, the ring polymer equations of motion can be partitioned to separate the free ring polymer dynamics from the influence of the external potential. Since the free ring polymer dynamics is entirely harmonic, it is possible to solve this part analytically, allowing for time steps that are not limited by the internal ring polymer frequencies. Recently, the symplectic Cayley modified algorithm has been demonstrated to exhibit strong stability and outperform the original algorithm.","category":"page"},{"location":"integration_algorithms/","page":"Integration algorithms","title":"Integration algorithms","text":"note: Note\nThe Cayley modified algorithm was originally introduced by Roman Korol, Nawaf Bou-Rabee, Thomas F. Miller (2019). This paper provides a detailed description of ring polymer dynamics, how the integration algorithm works, and benchmarks the performance of the algorithms. ","category":"page"},{"location":"integration_algorithms/","page":"Integration algorithms","title":"Integration algorithms","text":"The Hamiltonian ring polymer integration algorithm has also been extended for thermostatted dynamics: such as for thermal sampling in path integral molecular dynamics, or in thermostatted ring polymer molecular dynamics. As an extension to the Cayley modified algorithm for the Hamiltonian dynamics, the work of Roman Korol, Jorge L. Rosa-Raíces, Nawaf Bou-Rabee, Thomas F. Miller (2020) suggests the BCOCB algorithm as the most effective for ring polymer dynamics with Langevin thermostatting. The BCOCB nomenclature refers to the sub-steps within each time step. B is the external potential, C is the Cayley modified free ring polymer step, and O is the thermostat. In this nomenclature, the integration algorithm in the absence of the thermostat can be referred to as the BCB algorithm.","category":"page"},{"location":"integration_algorithms/","page":"Integration algorithms","title":"Integration algorithms","text":"tip: Tip\nNQCDynamics.jl implements both the BCOCB and BCB algorithms for Langevin and Hamiltonian dynamics, respectively. They are the default algorithms when performing adiabatic ring polymer dynamics.","category":"page"},{"location":"integration_algorithms/#Mixed-quantum-classical-propagation","page":"Integration algorithms","title":"Mixed quantum-classical propagation","text":"","category":"section"},{"location":"integration_algorithms/","page":"Integration algorithms","title":"Integration algorithms","text":"Mixed quantum-classical methods such as mean-field Ehrenfest dynamics or surface hopping dynamics involve simultaneous propagation of nuclear and electronic sub-systems. The two sub-systems evolve on different timescales and it can be advantageous to use different time steps or algorithms for each part. Commonly the nuclear part is solved using the velocity Verlet algorithm and the electronic part is handled using a Runge-Kutta method or an exponential integrator.","category":"page"},{"location":"integration_algorithms/","page":"Integration algorithms","title":"Integration algorithms","text":"note: Note\nSHARC and Newton-X, two popular surface hopping codes, use the split-algorithm approach. In SHARC, the nuclear degrees of freedom are propagated using the velocity Verlet algorithm, whilst the wavefunction is propagated using an exponential integrator with a smaller time step. Since an exponential integrator is exact when the propagation operator is constant, reducing the time step would have no benefit if the nuclei remained fixed during the time step. SHARC instead linearly interpolates the propagation operator during the electronic steps so that the nuclei propagation operator changes smoothly during the nuclear time step. This procedure is explained in the SHARC manual. Newton-X allows a few choices for the wavefunction integration algorithm and the nuclear quantities are interpolated similarly to SHARC.","category":"page"},{"location":"integration_algorithms/","page":"Integration algorithms","title":"Integration algorithms","text":"NQCDynamics.jl uses the standard library of OrdinaryDiffEq.jl solvers to run the dynamics for mixed quantum-classical methods. For model Hamiltonians where the evaluation of the electronic quantities is fast it is not necessary to use an augmented Verlet algorithm, instead it is sufficient to use any of the adaptive solvers from OrdinaryDiffEq.jl. However, in future it would be useful to implement some of these partioned algorithms that are able to achieve enhanced performance for large, expensive systems.","category":"page"},{"location":"integration_algorithms/","page":"Integration algorithms","title":"Integration algorithms","text":"For ring polymer mixed quantum-classical methods, it is possible to combine the algorithms used for ring polymer propagation with the partitioning idea from the mixed quantum-classical solvers. Even for model systems, the performance is significantly improved when the ring polymer modes are solved separately such that larger time steps can be used. NQCDynamics.jl implements an augmented form of the BCB algorithm that uses the BCB algorithm for the ring polymer degrees of freedom and uses the Tsit5 algorithm from OrdinaryDiffEq.jl for the electronic part. Currently the time steps for both sub-systems are fixed to be the same, but in future this constraint should be removed. In fact, it would even be possible to use an adaptive solver for the electronic part that can automatically adjust the time step as necessary.","category":"page"},{"location":"integration_algorithms/#Semiclassical-mapping-variable-propagation","page":"Integration algorithms","title":"Semiclassical mapping variable propagation","text":"","category":"section"},{"location":"integration_algorithms/","page":"Integration algorithms","title":"Integration algorithms","text":"Mapping variable methods describe the coupled nuclear-electronic problem using a classical Hamiltonian, where additional variables have been introduced to represent the electronic populations. As is the case with the ring polymer methods, it is possible to construct symplectic algorithms where each timestep is partitioned into exactly soluble sub-steps. Of particular note is the MInt algorithm described by Matthew S. Church, Timothy J. H. Hele, Gregory S. Ezra, Nandini Ananth (2018). The algorithm is symplectic, symmetric and time-reversible and can also be combined with the ring polymer algorithms for ring polymer dynamics with mapping variables. NQCDynamics.jl implements the MInt algorithm and a variant of the MInt algorithm for ring polymer systems that combines the BCB algorithm for the nuclei with the MInt algorithm for the mapping variables.","category":"page"},{"location":"integration_algorithms/#Electronic-friction-propagation","page":"Integration algorithms","title":"Electronic friction propagation","text":"","category":"section"},{"location":"integration_algorithms/","page":"Integration algorithms","title":"Integration algorithms","text":"Molecular dynamics with electronic friction is described by Langevin equations of motion, equivalent to classical Hamiltonian dynamics with an additional drag force and stochastic force. In the case of Langevin dynamics with a constant friction coefficient, there has been much interest in developing algorithms of low order that can be used for large molecular dynamics simulations. The work of Benedict Leimkuhler, Charles Matthews (2012) has demonstrated that, although a few choices exist, the BAOAB algorithm performs most favourably.","category":"page"},{"location":"integration_algorithms/","page":"Integration algorithms","title":"Integration algorithms","text":"tip: Tip\nThe BAOAB algorithm uses the same nomenclature as the ring polymer algorithms introduced in Ring polymer propagation. Each letter represents one component of a single time step. B is the external force step that updates the velocities, A is the position update, and O is the thermostatting step. For ring polymer dynamics the A step encompasses the free ring polymer step.","category":"page"},{"location":"integration_algorithms/","page":"Integration algorithms","title":"Integration algorithms","text":"For electronic friction dynamics, the friction is described by a tensor, not a single number as for traditional Langevin dynamics. However, the BAOAB algorithm is still applicable, but the O step requires the matrix exponential of the friction tensor. Since the tensor is positive semi-definite, it is possible to perform the exponentiation by first diagonalising the tensor. Using this approach, NQCDynamics.jl implements the BAOAB algorithm for tensorial friction and the BCOCB when using a ring polymer system. ","category":"page"},{"location":"integration_algorithms/","page":"Integration algorithms","title":"Integration algorithms","text":"note: Note\nThe DynamicalSDEProblem in StochasticDiffEq.jl represents systems that contain positions and velocities and have a stochastic component. The DynamicalSDEProblem was originally implemented for performing Langevin thermostatted dynamics simulations using the BAOAB algorithm. At the time of writing, BAOAB is the only algorithm implemented in StochasticDiffEq.jl for these problems. In future it would be useful to implement further algorithms and allow for more general noise profiles.","category":"page"},{"location":"api/NQCDistributions/nqcdistributions/#NQCDistributions","page":"NQCDistributions","title":"NQCDistributions","text":"","category":"section"},{"location":"api/NQCDistributions/nqcdistributions/","page":"NQCDistributions","title":"NQCDistributions","text":"Modules=[NQCDistributions]","category":"page"},{"location":"api/NQCDistributions/nqcdistributions/#NQCDistributions.Adiabatic","page":"NQCDistributions","title":"NQCDistributions.Adiabatic","text":"Singleton type for labelling states as adiabatic.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDistributions/nqcdistributions/#NQCDistributions.ConfigurationVector","page":"NQCDistributions","title":"NQCDistributions.ConfigurationVector","text":"ConfigurationVector{S<:AbstractVector}\n\nSample from a provided vector of configurations.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDistributions/nqcdistributions/#NQCDistributions.Diabatic","page":"NQCDistributions","title":"NQCDistributions.Diabatic","text":"Singleton type for labelling states as diabatic.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDistributions/nqcdistributions/#NQCDistributions.DynamicalDistribution","page":"NQCDistributions","title":"NQCDistributions.DynamicalDistribution","text":"DynamicalDistribution(velocity, position, dims)\n\nSampleable struct containing distributions for velocity and position. dims determines the size of each sample and should match the size of the system: (ndofs, natoms).\n\nExample\n\njulia> using NQCDistributions: DynamicalDistribution;\n\njulia> d = DynamicalDistribution([[1.0;;], [2.0;;], [3.0;;]], 0.1, (1, 1));\n\njulia> rand(d)\nComponentVector{Float64}(v = [1.0;;], r = [0.1;;])\n\njulia> d[2]\nComponentVector{Float64}(v = [2.0;;], r = [0.1;;])\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDistributions/nqcdistributions/#NQCDistributions.ElectronicDistribution","page":"NQCDistributions","title":"NQCDistributions.ElectronicDistribution","text":"ElectronicDistribution{S}\n\nAbstract type for distributions of electronic degrees of freedom only.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDistributions/nqcdistributions/#NQCDistributions.FermiDiracState","page":"NQCDistributions","title":"NQCDistributions.FermiDiracState","text":"FermiDiracState{S,T,A} <: ElectronicDistribution{S}\n\nElectronic distribution for Fermions following Fermi-Dirac distribution.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDistributions/nqcdistributions/#NQCDistributions.FixedArray","page":"NQCDistributions","title":"NQCDistributions.FixedArray","text":"FixedArray{S<:AbstractArray}\n\nReturn the same configuration every time.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDistributions/nqcdistributions/#NQCDistributions.FixedFill","page":"NQCDistributions","title":"NQCDistributions.FixedFill","text":"FixedFill{S<:Real}\n\nFill all degrees of freedom with the same value every time.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDistributions/nqcdistributions/#NQCDistributions.MixedState","page":"NQCDistributions","title":"NQCDistributions.MixedState","text":"MixedState{T,S} <: ElectronicDistribution{S}\n\nElectronic distribution for representing a mixed state with non-zero population in multiple states.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDistributions/nqcdistributions/#NQCDistributions.PositionHarmonicRingPolymer-Union{Tuple{T}, Tuple{Any, Any, Any, Tuple{Int64, Int64, Int64}}} where T","page":"NQCDistributions","title":"NQCDistributions.PositionHarmonicRingPolymer","text":"PositionHarmonicRingPolymer{T}(ω, β, m, dims::Dims{3}; centre=0, classical=Int[])\n\nRing polymer position distribution in a 1D harmonic potential\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDistributions/nqcdistributions/#NQCDistributions.PureState","page":"NQCDistributions","title":"NQCDistributions.PureState","text":"PureState{S} <: ElectronicDistribution{S}\n\nElectronic distribution for representing a system confined to a single state.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDistributions/nqcdistributions/#NQCDistributions.RingPolymerWrapper","page":"NQCDistributions","title":"NQCDistributions.RingPolymerWrapper","text":"RingPolymerWrapper{S}\n\nWrap other distributions to convert them to ring polymer distributions.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDistributions/nqcdistributions/#NQCDistributions.SampleableComponent","page":"NQCDistributions","title":"NQCDistributions.SampleableComponent","text":"SampleableComponent(sampleable, dims)\n\nConverts a general sampleable that provides configurations into one of the component types defined below. dims should be the size of the desired samples and must be consistent with the provided sampleable.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDistributions/nqcdistributions/#NQCDistributions.UnivariateArray","page":"NQCDistributions","title":"NQCDistributions.UnivariateArray","text":"UnivariateArray{N,S<:Sampleable{Univariate}}\n\nFill each degree of freedom from a different Univariate distribution.\n\nThe size of the matrix of sampleables should match the system size.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDistributions/nqcdistributions/#NQCDistributions.UnivariateFill","page":"NQCDistributions","title":"NQCDistributions.UnivariateFill","text":"UnivariateFill{S<:Sampleable{Univariate}}\n\nFill all degrees of freedom from single Univariate distribution.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDistributions/nqcdistributions/#NQCDistributions.MomentumHarmonicWigner-Tuple{Any, Any, Any}","page":"NQCDistributions","title":"NQCDistributions.MomentumHarmonicWigner","text":"MomentumHarmonicWigner(ω, β, m)\n\nWigner distribution in a 1D harmonic potential for the momentum\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDistributions/nqcdistributions/#NQCDistributions.PositionHarmonicWigner-Tuple{Any, Any, Any}","page":"NQCDistributions","title":"NQCDistributions.PositionHarmonicWigner","text":"PositionHarmonicWigner(ω, β)\n\nWigner distribution in a 1D harmonic potential for the position\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDistributions/nqcdistributions/#NQCDistributions.Q-Tuple{Any, Any}","page":"NQCDistributions","title":"NQCDistributions.Q","text":"Quantum corrector for the Wigner distribution\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDistributions/nqcdistributions/#NQCDistributions.VelocityBoltzmann-Tuple{Any, AbstractVector, Tuple{Int64, Int64}}","page":"NQCDistributions","title":"NQCDistributions.VelocityBoltzmann","text":"VelocityBoltzmann(temperature, masses::AbstractVector, dims::Dims{2})\n\nGenerate a Boltzmann of velocities for each degree of freedom.\n\nArguments\n\ntemperature - Atomic units or Unitful\nmasses - Vector of masses for each atom\ndims - (ndofs, natoms). natoms must equal length(masses)\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDistributions/nqcdistributions/#NQCDistributions.VelocityHarmonicWigner-Tuple{Any, Any, Any}","page":"NQCDistributions","title":"NQCDistributions.VelocityHarmonicWigner","text":"VelocityHarmonicWigner(ω, β, m)\n\nWigner distribution in a 1D harmonic potential for the velocity\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/nonadiabaticmoleculardynamics/#NQCDynamics","page":"NQCDynamics","title":"NQCDynamics","text":"","category":"section"},{"location":"api/NQCDynamics/nonadiabaticmoleculardynamics/","page":"NQCDynamics","title":"NQCDynamics","text":"Modules=[NQCDynamics]","category":"page"},{"location":"api/NQCDynamics/nonadiabaticmoleculardynamics/#NQCDynamics.Simulation-Union{Tuple{T}, Tuple{M}, Tuple{Atoms{T}, NQCModels.Model, M}} where {M, T}","page":"NQCDynamics","title":"NQCDynamics.Simulation","text":"Simulation(atoms::Atoms{T}, model::Model, method::M;\n temperature=0u\"K\", cell::AbstractCell=InfiniteCell()) where {M,S,T}\n\nSimulation parameters that controls the types of atoms, interactions, dynamics method, temperature and simulation cell.\n\n\n\n\n\n","category":"method"},{"location":"dynamicssimulations/dynamicsmethods/fssh/#fssh-dynamics","page":"Fewest-switches surface hopping (FSSH)","title":"Fewest-switches surface hopping (FSSH)","text":"","category":"section"},{"location":"dynamicssimulations/dynamicsmethods/fssh/","page":"Fewest-switches surface hopping (FSSH)","title":"Fewest-switches surface hopping (FSSH)","text":"Tully's FSSH John C. Tully (1990) is one of the most popular methods for nonadiabatic molecular dynamics and is classified as a mixed-quantum classical method, where the nuclei are treated classically and the electrons are treated quantum mechanically.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/fssh/","page":"Fewest-switches surface hopping (FSSH)","title":"Fewest-switches surface hopping (FSSH)","text":"The central concept that governs surface hopping methods is that the nuclei evolve on a single adiabatic potential energy surface at any given moment. At each timestep, a hopping probability is evaluated. If the hopping probability is larger than a uniform random number between 0 and 1, the active state is switched and the adiabatic propagation continues on the new electronic state. When this algorithm is applied to an ensemble of trajectories, the discrete adiabatic state populations approximate the quantum mechanical populations for each state.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/fssh/","page":"Fewest-switches surface hopping (FSSH)","title":"Fewest-switches surface hopping (FSSH)","text":"The surface hopping classical Hamiltonian can be written as","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/fssh/","page":"Fewest-switches surface hopping (FSSH)","title":"Fewest-switches surface hopping (FSSH)","text":"H(t) = frac12 mathbfP^T mathbfM^-1 mathbfP + sum_i delta(s(t) - i) E_i(mathbfR)","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/fssh/","page":"Fewest-switches surface hopping (FSSH)","title":"Fewest-switches surface hopping (FSSH)","text":"where mathbfP is the vector of momenta, mathbfR the positions, and mathbfM the diagonal mass matrix. s(t) can be viewed as a digital signal that takes on the value of the currently occupied adiabatic state. As such, this Hamiltonian describes classical dynamics that proceeds under the influence of the potential E_i(mathbfR) when s(t) = i. The summation runs over all adiabatic states.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/fssh/","page":"Fewest-switches surface hopping (FSSH)","title":"Fewest-switches surface hopping (FSSH)","text":"Of course, to integrate the associated equations of motion, s(t) must be obtained. This quantity is obtained stochastically for each trajectory by making probabilistic hops between surfaces. The probabilities are obtained by integrating the electronic Schrödinger equation alongside the dynamics as","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/fssh/","page":"Fewest-switches surface hopping (FSSH)","title":"Fewest-switches surface hopping (FSSH)","text":"ihbar dotc_i(t) = E_i(mathbfR) c_i (t)\n- ihbar sum_j dotmathbfR cdot mathbfd_ij(mathbfR)c_j(t)","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/fssh/","page":"Fewest-switches surface hopping (FSSH)","title":"Fewest-switches surface hopping (FSSH)","text":"In this equation, c_i(t) are the complex coefficients for state i and mathbfd_ij is the nonadiabatic coupling between adiabatic states i and j. The hopping probability is calculated as","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/fssh/","page":"Fewest-switches surface hopping (FSSH)","title":"Fewest-switches surface hopping (FSSH)","text":"gamma_i to j = sum_alpha 2 fracP_alphaM_alpha\nRe(fracsigma_jisigma_ii) d_alpha ij dt","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/fssh/","page":"Fewest-switches surface hopping (FSSH)","title":"Fewest-switches surface hopping (FSSH)","text":"At each timestep, a random number between 0 and 1 is generated which is compared to the probabilities. If the probability is higher than the random number, then a hop is attempted.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/fssh/","page":"Fewest-switches surface hopping (FSSH)","title":"Fewest-switches surface hopping (FSSH)","text":"Additionally in the fewest-switches scheme, the energy is conserved for each trajectory by rescaling the momenta whenever a hop is performed. As such, when a hop is attempted, it will only be successful when there is sufficient kinetic energy for the energy to be conserved after the hop. If there is insufficient kinetic energy, this is termed a frustrated hop, and the dynamics proceeds without performing a hop. When a hop is successful, the kinetic energy is adjusted and s(t) takes on the value of the newly occupied state. For a more detailed description of the algorithm and the momentum rescaling procedure, please refer to Joseph E. Subotnik, Amber Jain, Brian Landry, Andrew Petit, Wenjun Ouyang, Nicole Bellonzi (2016). In this reference, the notion of reversing the momenta during frustrated hops is discussed. In our implementation we leave the frustrated trajectories unchanged, though it is suggested that the momentum reversal procedure may lead to better results in some cases.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/fssh/#Algorithm","page":"Fewest-switches surface hopping (FSSH)","title":"Algorithm","text":"","category":"section"},{"location":"dynamicssimulations/dynamicsmethods/fssh/","page":"Fewest-switches surface hopping (FSSH)","title":"Fewest-switches surface hopping (FSSH)","text":"Integrate classical dynamics for one timestep\nIntegrate electronic dynamics for one timestep\nEvaluate hopping probability\nPerform hop if sufficient probability and kinetic energy\nRescale velocity if hop is performed\nReturn to step 1","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/fssh/","page":"Fewest-switches surface hopping (FSSH)","title":"Fewest-switches surface hopping (FSSH)","text":"note: Note\nWith DifferentialEquations.jl we use a callback to perform the surface hopping procedure such that steps 1 and 2 are performed by the DifferentialEquations solvers and steps 3, 4, 5 are performed by the callback.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/fssh/#Example","page":"Fewest-switches surface hopping (FSSH)","title":"Example","text":"","category":"section"},{"location":"dynamicssimulations/dynamicsmethods/fssh/","page":"Fewest-switches surface hopping (FSSH)","title":"Fewest-switches surface hopping (FSSH)","text":"In this section we can investigate the results obtained for a single trajectory using FSSH.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/fssh/","page":"Fewest-switches surface hopping (FSSH)","title":"Fewest-switches surface hopping (FSSH)","text":"First, the simulation parameters are created. Here, we have a single atom with a mass of 2000 a.u. and we are using Tully's third model (John C. Tully (1990)), provided by NQCModels.jl.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/fssh/","page":"Fewest-switches surface hopping (FSSH)","title":"Fewest-switches surface hopping (FSSH)","text":"using Random; Random.seed!(10) # hide\nusing NQCDynamics\n\natoms = Atoms(2000)\nsim = Simulation{FSSH}(atoms, TullyModelThree())","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/fssh/","page":"Fewest-switches surface hopping (FSSH)","title":"Fewest-switches surface hopping (FSSH)","text":"The DynamicsVariables constructor has some extra arguments for FSSH. The first three match the classical case, but we also provide the initial state and whether we want this state to be Adiabatic() or Diabatic(). The type of state can be important when considering the ordering of the states. The adiabatic states are always arranged from lowest to highest energy, whereas the diabatic states will be ordered as defined in the model. You can inspect the fields of u to ensure the initialisation has proceeded as you intend.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/fssh/","page":"Fewest-switches surface hopping (FSSH)","title":"Fewest-switches surface hopping (FSSH)","text":"u = DynamicsVariables(sim, [20/2000;;], [-10.;;], PureState(1, Adiabatic()))","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/fssh/","page":"Fewest-switches surface hopping (FSSH)","title":"Fewest-switches surface hopping (FSSH)","text":"Finally, the trajectory can be run by passing all the parameters we have set up so far. Here, we request both the OutputDiscreteState output which is equal to s(t) and OutputDiabaticPopulation, which gives us the population of each diabatic state along the trajectory.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/fssh/","page":"Fewest-switches surface hopping (FSSH)","title":"Fewest-switches surface hopping (FSSH)","text":"traj = run_dynamics(sim, (0.0, 2000.0), u, output=(OutputDiscreteState, OutputDiabaticPopulation))","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/fssh/","page":"Fewest-switches surface hopping (FSSH)","title":"Fewest-switches surface hopping (FSSH)","text":"Now we can plot s(t) throughout the trajectory. The FSSH algorithm attempts to minimise the total number of hops; in the limit of infinite hops the result would tend to the mean-field (Ehrenfest) result, which is what FSSH attempts to avoid.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/fssh/","page":"Fewest-switches surface hopping (FSSH)","title":"Fewest-switches surface hopping (FSSH)","text":"using Plots\nplot(traj, :OutputDiscreteState)","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/fssh/","page":"Fewest-switches surface hopping (FSSH)","title":"Fewest-switches surface hopping (FSSH)","text":"Similarly, we can plot the diabatic populations. Since FSSH is performed in the adiabatic representation, even in the case of few hops, the diabatic populations can look dramatically different depending on the complexity of the model Hamiltonian. ","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/fssh/","page":"Fewest-switches surface hopping (FSSH)","title":"Fewest-switches surface hopping (FSSH)","text":"plot(traj, :OutputDiabaticPopulation)","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/fssh/","page":"Fewest-switches surface hopping (FSSH)","title":"Fewest-switches surface hopping (FSSH)","text":"Another example is available where we use FSSH and other methods to reproduce some of the results from John C. Tully (1990).","category":"page"},{"location":"api/NQCModels/nonadiabaticmodels/#NQCModels","page":"NQCModels","title":"NQCModels","text":"","category":"section"},{"location":"api/NQCModels/nonadiabaticmodels/","page":"NQCModels","title":"NQCModels","text":"Modules=[NQCModels]","category":"page"},{"location":"api/NQCModels/nonadiabaticmodels/#NQCModels.NQCModels","page":"NQCModels","title":"NQCModels.NQCModels","text":"NQCModels define the potentials and derivatives that govern the dynamics of the particles. These can exist as analytic models or as interfaces to other codes. \n\n\n\n\n\n","category":"module"},{"location":"api/NQCModels/nonadiabaticmodels/#NQCModels.Model","page":"NQCModels","title":"NQCModels.Model","text":"Top-level type for models.\n\nImplementation\n\nWhen adding new models, this should not be directly subtyped. Instead, depending on the intended functionality of the model, one of the child abstract types should be subtyped. If an appropriate type is not already available, a new abstract subtype should be created. \n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/nonadiabaticmodels/#NQCModels.derivative!-Tuple{NQCModels.Model, Any, AbstractMatrix}","page":"NQCModels","title":"NQCModels.derivative!","text":"derivative!(model::Model, D, R::AbstractMatrix)\n\nFill D with the derivative of the electronic potential as a function of the positions R.\n\nThis must be implemented for all models.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCModels/nonadiabaticmodels/#NQCModels.derivative-Tuple{NQCModels.Model, Any}","page":"NQCModels","title":"NQCModels.derivative","text":"derivative(model::Model, R)\n\nAllocating version of derivative!, this definition should be suitable for all models.\n\nImplement zero_derivative to allocate an appropriate array then implement derivative! to fill the array.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCModels/nonadiabaticmodels/#NQCModels.ndofs-Tuple{NQCModels.Model}","page":"NQCModels","title":"NQCModels.ndofs","text":"ndofs(::Model)\n\nGet the number of degrees of freedom for every atom in the model. Usually 1 or 3.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCModels/nonadiabaticmodels/#NQCModels.nstates-Tuple{NQCModels.Model}","page":"NQCModels","title":"NQCModels.nstates","text":"nstates(::Model)\n\nGet the number of electronic states in the model.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCModels/nonadiabaticmodels/#NQCModels.potential!-Tuple{NQCModels.Model, Any, AbstractMatrix}","page":"NQCModels","title":"NQCModels.potential!","text":"potential!(model::Model, V, R::AbstractMatrix)\n\nIn-place version of potential, used only when mutable arrays are preferred.\n\nCurrently used only for LargeDiabaticModels, see diabatic/DiabaticModels.jl.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCModels/nonadiabaticmodels/#NQCModels.potential-Tuple{NQCModels.Model, AbstractMatrix}","page":"NQCModels","title":"NQCModels.potential","text":"potential(model::Model, R::AbstractMatrix)\n\nEvaluate the potential at position R for the given model.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCModels/nonadiabaticmodels/#NQCModels.zero_derivative","page":"NQCModels","title":"NQCModels.zero_derivative","text":"zero_derivative(model::Model, R)\n\nCreate an zeroed array of the right size to match the derivative.\n\n\n\n\n\n","category":"function"},{"location":"api/NQCDynamics/dynamicsutils/#DynamicsUtils","page":"DynamicsUtils","title":"DynamicsUtils","text":"","category":"section"},{"location":"api/NQCDynamics/dynamicsutils/","page":"DynamicsUtils","title":"DynamicsUtils","text":"Modules=[NQCDynamics.DynamicsUtils]","category":"page"},{"location":"api/NQCDynamics/dynamicsutils/#NQCDynamics.DynamicsUtils","page":"DynamicsUtils","title":"NQCDynamics.DynamicsUtils","text":"DynamicsUtils\n\nUtilities for dynamics simulations. Includes:\n\nBasic dynamics variables functions\nDensity matrix dynamics functions\nStandard callbacks to use during dynamics\nPlotting recipes for outputs\n\n\n\n\n\n","category":"module"},{"location":"api/NQCDynamics/dynamicsutils/#NQCDynamics.DynamicsUtils.CellBoundaryCallback-Tuple{}","page":"DynamicsUtils","title":"NQCDynamics.DynamicsUtils.CellBoundaryCallback","text":"CellBoundaryCallback()\n\nWhenever atoms leave the simulation cell, enforce the periodicity by wrapping the positions at the cell boundary.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsutils/#NQCDynamics.DynamicsUtils.TerminateCellCallback-Tuple{}","page":"DynamicsUtils","title":"NQCDynamics.DynamicsUtils.TerminateCellCallback","text":"TerminateCellCallback()\n\nIf the atoms leave the simulation cell, terminate the simulation.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsutils/#NQCDynamics.DynamicsUtils.TerminatingCallback-Tuple{Any}","page":"DynamicsUtils","title":"NQCDynamics.DynamicsUtils.TerminatingCallback","text":"TerminatingCallback(func)\n\nProvide a function that returns true when the simulation should terminate.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsutils/#NQCDynamics.DynamicsUtils.apply_interbead_coupling!-Union{Tuple{T}, Tuple{AbstractArray{T, 3}, AbstractArray{T, 3}, RingPolymerSimulation}} where T","page":"DynamicsUtils","title":"NQCDynamics.DynamicsUtils.apply_interbead_coupling!","text":"apply_interbead_coupling!(du::DynamicalVariables, u::DynamicalVariables,\n sim::RingPolymerSimulation)\n\nApplies the force that arises from the harmonic springs between adjacent beads.\n\nOnly applies the force for atoms labelled as quantum within the RingPolymerParameters.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsutils/#NQCDynamics.DynamicsUtils.commutator!-Tuple{Any, Any, Any}","page":"DynamicsUtils","title":"NQCDynamics.DynamicsUtils.commutator!","text":"commutator!(C, A, B)\n\nCalculate C = AB - BA.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsutils/#NQCDynamics.DynamicsUtils.divide_by_mass!-Tuple{Any, Any}","page":"DynamicsUtils","title":"NQCDynamics.DynamicsUtils.divide_by_mass!","text":"divide_by_mass!(dv, masses)\n\nDivide the contents of dv by the masses. Assumes dv is an array of size (dofs, atoms) or (dofs, atoms, beads). masses is the vector of masses for each atom that matches length with the second dimension.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsutils/#NQCDynamics.DynamicsUtils.velocity!-NTuple{5, Any}","page":"DynamicsUtils","title":"NQCDynamics.DynamicsUtils.velocity!","text":"velocity!(dr, v, r, sim, t)\n\nWrite the velocity v into dr. Has extra arguments to work with Dynamical(O/S)DEProblems.\n\n\n\n\n\n","category":"method"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/#nrpmd-dynamics","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","text":"","category":"section"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/#Theory","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Theory","text":"","category":"section"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","text":"Nonadiabatic ring polymer molecular dynamics (NRPMD) is a method that uses the ring polymer formalism to include quantum effects in the nuclear dynamics and mapping variables for the electronic degrees of freedom. (Jeremy O. Richardson, Michael Thoss (2013), Jeremy O. Richardson, Philipp Meyer, Marc-Oliver Pleinert, Michael Thoss (2017), Sutirtha N. Chowdhury, Pengfei Huo (2019)) This results in a classical dynamics in an extended phasespace of the ring polymer with each bead coupled to a set of classical mapping variables. Originally, this method was proposed as a simple combination of the Meyer-Miller-Stock-Thoss mapping formalism with RPMD but has since been rigorously derived from nonadiabatic Matsubara dynamics (Sutirtha N. Chowdhury, Pengfei Huo (2021)).","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","text":"The classical Hamiltonian conserved by NRPMD is given by","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","text":"H_N = sum_alpha=1^N left\nfracP_alpha^22M + V_0(R_alpha)\n+ fracM2beta_N^2hbar^2 (R_alpha - R_alpha-1)^2\n+ frac1hbar sum_nmV_nm(R_alpha)\n(q_alpha_nq_alpha_m + p_alpha_np_alpha_m - delta_nmhbar)\nright","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","text":"which contains N replicas with positions R_alpha and momenta P_alpha joined by harmonic springs. M is the mass, beta_N = beta N is the inverse temperature scaled by the number of beads. V_0(R_alpha) is the state independent potential. V_nm are the matrix elements of the diabatic potential. The sum runs over all pairs of states. Each replica has a set of mapping variables q_alpha_n and p_alpha_n that interact only within the set associated with a single replica. The consequence of this is that the electronic dynamics is not contaminated by interbead coupling.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","text":"The equations of motion obtained from this Hamiltonian are","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","text":"beginaligned\ndotR_alpha = fracP_alphaM\n\ndotP_alpha =\n- fracMbeta_N^2 hbar^2(2 R_alpha - R_alpha+1 - R_alpha-1)\n- nabla_R_alpha V_0(R_alpha)\n- frac12hbarsum_nm nabla_R_alpha V_nm(R_alpha)\n(q_alpha_nq_alpha_m + p_alpha_np_alpha_m - delta_nmhbar)\n\ndotq_alpha_n =\nfrac1hbar sum_m V_nm(R_alpha)p_alpha_m\n\ndotp_alpha_n =\n-frac1hbar sum_m V_nm(R_alpha)q_alpha_m\nendaligned","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/#Implementation-details","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Implementation details","text":"","category":"section"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/#Solving-the-differential-equations","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Solving the differential equations","text":"","category":"section"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","text":"For mapping variable methods of this type, a symplectic algorithm (Matthew S. Church, Timothy J. H. Hele, Gregory S. Ezra, Nandini Ananth (2018)) exists. This algorithm has the advantage of long time stability and can be easily combined with the standard algorithms for ring polymer time-evolution. For NRPMD we have implemented this algorithm using the Cayley modified ring polymer propagator (Roman Korol, Nawaf Bou-Rabee, Thomas F. Miller (2019)) and obtain accurate and efficient dynamics. For few beads, similar performance to the OrdinaryDiffEq.jl algorithms is obtained, but as the number of beads increases this algorithm becomes more effective.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/#Generating-the-initial-distribution","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Generating the initial distribution","text":"","category":"section"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","text":"Currently, we provide this functionality only for nonequilibrium simulations where the nuclear part of the distribution is separable from the electronic part. Typically, the nuclear distribution will be sampled using Langevin dynamics or Monte Carlo sampling and the electronic variables are confined to a single electronic state. This is appropriate for modelling photoexcitation dynamics but is not yet suitable for equilibrium simulations. Equilibrium dynamics would require also sampling a thermal distribution for the mapping variables.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/#Form-of-the-Hamiltonian","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Form of the Hamiltonian","text":"","category":"section"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","text":"The diabatic models defined in NQCModels.jl are of the appropriate form for this method though they provide the potential as a single matrix, rather than separating the state-dependent and independent parts. It has been suggested that defining the Hamiltonian such that the lowest eigenvalue of the diabatic matrix is zero everywhere leads to improved convergence in the sampling (Jeremy O. Richardson, Michael Thoss (2013)). However, here we have not done this for simplicity when defining the models.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/#Example","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Example","text":"","category":"section"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","text":"Using NRPMD we can reproduce the Fig. 3a in the 2019 paper of Chowdhury and Huo (Sutirtha N. Chowdhury, Pengfei Huo (2019)).","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","text":"First we generate a thermal ring polymer distribution in a harmonic potential. A simple way to do this is to use Monte Carlo sampling for the positions and obtain velocities from a Boltzmann distribution.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","text":"using NQCDynamics\n\natom = Atoms(1)\n\nsim = RingPolymerSimulation(atom, Harmonic(dofs=1), 4; temperature=1/16)\n\nr0 = zeros(size(sim))\nsteps = 5e3 # Number of Monte Carlo steps\nstep_size = Dict(:X=>1.0) # Monte Carlo step size for species :X\noutput = InitialConditions.ThermalMonteCarlo.run_advancedmh_sampling(sim, r0, steps, step_size)\nvelocities = VelocityBoltzmann(1/16, masses(sim), (1,1))\n\ndistribution = DynamicalDistribution(velocities, output, size(sim)) * PureState(1)","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","text":"note: `size(sim)`\nsize(sim) returns the system size as (degrees of freedom, number of atoms, number of beads).","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","text":"tip: Monte Carlo sampling\nFurther information on Monte Carlo sampling can be found here.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","text":"We can check the distribution by plotting the phasespace diagram for each of the points in our distribution:","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","text":"using CairoMakie\n\nnuclear = distribution.nuclear\nflat_position = reduce(vcat, (nuclear.position[i][:] for i in 1:length(nuclear)))\nflat_velocity = reduce(vcat, (rand(nuclear.velocity)[:] for _ in 1:length(nuclear)))\nscatter(flat_position, flat_velocity)","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","text":"note: `reduce(vcat, ...)`\nHere we have used reduce in combination with vcat to vertically concatenate all of the information into a single array for plotting.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","text":"The simulation method is given as the type parameter {NRPMD} and the simulation constructor is given the atoms, model, number of beads, temperature and degrees of freedom.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","text":"sim = RingPolymerSimulation{NRPMD}(atom, DoubleWell(γ=0.1), 4; temperature=1/16)","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","text":"Next, we can use this distribution as a starting point for the dynamics simulations. This will result in each trajectory starting from a random configuration in the distribution. For NRPMD, the electronic variables are sampled from a Gaussian, independent of the initial electronic state. The electronic state is introduced in the correlation function expression when correlating the initial and final populations.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","text":"The quantities output by the ensemble simulation are specified by the output and the reduction. The output follows the DifferentialEquations format where we provide a function that determines the output of each trajectory. The reduction can be one of :mean, :append, or :sum, which will determine how the data from each trajectory is combined.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","text":"note: Ensemble simulations\nFurther details on ensemble simulations are available here.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","text":"output = TimeCorrelationFunctions.PopulationCorrelationFunction(sim, Diabatic())\nnothing # hide","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","text":"Finally, we can combine the parameters and run the simulation. The resulting plot shows the time dependent population difference and closely matches the figure from the paper we were attempting to reproduce. Nice!","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","text":"ensemble = run_dynamics(sim, (0.0, 30.0), distribution;\n trajectories=100, output, reduction=MeanReduction(), dt=0.1)\n\nplt = lines(0:0.1:30, [p[1,1]-p[2,1] for p in ensemble[:PopulationCorrelationFunction]])\nplt.axis.xlabel = \"Time\"\nplt.axis.ylabel = \"Population difference\"\nplt","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpmd/#rpmd-dynamics","page":"Ring polymer molecular dynamics (RPMD)","title":"Ring polymer molecular dynamics (RPMD)","text":"","category":"section"},{"location":"dynamicssimulations/dynamicsmethods/rpmd/","page":"Ring polymer molecular dynamics (RPMD)","title":"Ring polymer molecular dynamics (RPMD)","text":"Ring polymer molecular dynamics is a quantum dynamics methods that attempts to approximate Kubo-transformed real-time correlation functions (Ian R. Craig, David E. Manolopoulos (2004)).","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpmd/","page":"Ring polymer molecular dynamics (RPMD)","title":"Ring polymer molecular dynamics (RPMD)","text":"The idea is to exploit the classical isomorphism that maps a quantum particle onto the extended phasespace of a classical ring polymer. It can be shown that the quantum partition function for a system can be manipulated such that it resembles the classical partition function of a system containing many replicas of the original particle joined to together with harmonic springs in a ring. In the limit of infinite beads or replicas in the ring polymer, the isomorphism becomes exact and it is possible to evaluate quantum expectation values by evaluating ensemble averages for the classical ring polymer system. This is referred to as the field of imaginary-time path integrals and the techniques used are Path Integral Monte Carlo (PIMC) and Path Integral Molecular Dynamics (PIMD) depending on whether molecular dynamics or Monte Carlo methods are used to explore the phasespace (Mark Tuckerman (2010)).","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpmd/","page":"Ring polymer molecular dynamics (RPMD)","title":"Ring polymer molecular dynamics (RPMD)","text":"RPMD was proposed as a heuristic extension of imaginary-time path integrals to evaluate real-time dynamical quantities. To perform RPMD, it is necessary to solve Hamilton's equations for the ring polymer Hamiltonian:","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpmd/","page":"Ring polymer molecular dynamics (RPMD)","title":"Ring polymer molecular dynamics (RPMD)","text":"H = sum_alpha^N frac12 mathbfP_alpha^T mathbfM mathbfP_alpha\n+ frac12 omega_N^2\n(mathbfR_alpha - mathbfR_alpha+1)^T\nmathbfM\n(mathbfR_alpha - mathbfR_alpha+1)\n+ V(mathbfR_alpha)","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpmd/","page":"Ring polymer molecular dynamics (RPMD)","title":"Ring polymer molecular dynamics (RPMD)","text":"where the ring polymer spring constant omega_N = 1 hbarbeta_N and beta_N = beta N.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpmd/","page":"Ring polymer molecular dynamics (RPMD)","title":"Ring polymer molecular dynamics (RPMD)","text":"When the initial distribution is taken as the thermal ring polymer distribution and this Hamiltonian is used to generate configurations at later times, the correlation functions obtained can be used to approximate real-time quantum correlation functions.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpmd/#Example","page":"Ring polymer molecular dynamics (RPMD)","title":"Example","text":"","category":"section"},{"location":"dynamicssimulations/dynamicsmethods/rpmd/","page":"Ring polymer molecular dynamics (RPMD)","title":"Ring polymer molecular dynamics (RPMD)","text":"Let us perform some simple adiabatic ring polymer dynamics to get a feel for what the ring polymer dynamics looks like. We set up a 2D system for one hydrogen atom by giving the Free model 2 degrees of freedom and specify that the ring polymer should have 50 beads.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpmd/","page":"Ring polymer molecular dynamics (RPMD)","title":"Ring polymer molecular dynamics (RPMD)","text":"using NQCDynamics\nusing Unitful\n\natoms = Atoms([:H])\nsim = RingPolymerSimulation(atoms, Free(2), 50; temperature=100u\"K\")","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpmd/","page":"Ring polymer molecular dynamics (RPMD)","title":"Ring polymer molecular dynamics (RPMD)","text":"note: Atomic units\nRecall that the quantities are always in atomic units unless Unitful.jl has been used to specify alternative units. The temperature here has been specified using Kelvin.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpmd/","page":"Ring polymer molecular dynamics (RPMD)","title":"Ring polymer molecular dynamics (RPMD)","text":"We initialise the simulation with zero velocity and a random distribution for the ring polymer bead positions. For a real RPMD simulation you will use the thermal ring polymer distribution obtained from a PIMC or Langevin simulation but here for simplicity we use a normally distributed configuration.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpmd/","page":"Ring polymer molecular dynamics (RPMD)","title":"Ring polymer molecular dynamics (RPMD)","text":"u = DynamicsVariables(sim, zeros(size(sim)), randn(size(sim)))\nnothing # hide","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpmd/","page":"Ring polymer molecular dynamics (RPMD)","title":"Ring polymer molecular dynamics (RPMD)","text":"tip: Tip\nTo learn how to work with the thermal ring polymer phase space, refer to the Storing and sampling distributions section.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpmd/","page":"Ring polymer molecular dynamics (RPMD)","title":"Ring polymer molecular dynamics (RPMD)","text":"Now we can run the simulation, for which we use the time interval 0.0 to 500.0 and a time step of dt = 2.5:","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpmd/","page":"Ring polymer molecular dynamics (RPMD)","title":"Ring polymer molecular dynamics (RPMD)","text":"dt = 2.5\ntraj = run_dynamics(sim, (0.0, 500.0), u; output=OutputPosition, dt=dt)\nnothing # hide","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpmd/","page":"Ring polymer molecular dynamics (RPMD)","title":"Ring polymer molecular dynamics (RPMD)","text":"We can visualise this ring polymer trajectory with a 2D scatter plot that shows how the ring polymer evolves in time. Here, we have joined the adjacent beads together with lines, with the end and start beads joined with a different color. This animation shows the cyclic nature of the ring polymer, and how every bead is connected to its two neighbours.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpmd/","page":"Ring polymer molecular dynamics (RPMD)","title":"Ring polymer molecular dynamics (RPMD)","text":"using CairoMakie\n\nrs = traj[:OutputPosition]\n\nindex = Observable(1)\nxs = @lift(rs[$index][1,1,:])\nys = @lift(rs[$index][2,1,:])\nclose_loop_x = @lift([rs[$index][1,1,end], rs[$index][1,1,begin]])\nclose_loop_y = @lift([rs[$index][2,1,end], rs[$index][2,1,begin]])\nfig = scatter(xs, ys, axis = (title = @lift(\"t = $(round(Int, dt*($index-1)))\"),))\nlines!(xs, ys)\nlines!(close_loop_x, close_loop_y)\nxlims!(-3, 3)\nylims!(-3, 3)\n\ntimestamps = 1:length(traj[:OutputPosition])\nfilepath = \"../../assets/figures/rpmd.mp4\" # hide\nrecord(fig, filepath, timestamps;\n framerate = 30) do i\n index[] = i\nend\nnothing # hide","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpmd/","page":"Ring polymer molecular dynamics (RPMD)","title":"Ring polymer molecular dynamics (RPMD)","text":"(Image: rpmd fig)","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpmd/","page":"Ring polymer molecular dynamics (RPMD)","title":"Ring polymer molecular dynamics (RPMD)","text":"note: Note\nWe have used Makie's animation features to produce this animation. If you want information how Makie works, take a look at the Makie documentation.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpmd/","page":"Ring polymer molecular dynamics (RPMD)","title":"Ring polymer molecular dynamics (RPMD)","text":"Since this package is focused on nonadiabatic dynamics, you won't see much adiabatic RPMD elsewhere in the documentation but it's useful to understand how the original adiabatic version works before moving onto the nonadiabatic extensions.","category":"page"},{"location":"initialconditions/metropolishastings/#mhmc-sampling","page":"Thermal Metropolis-Hastings Monte Carlo","title":"Thermal Metropolis-Hastings Monte Carlo","text":"","category":"section"},{"location":"initialconditions/metropolishastings/","page":"Thermal Metropolis-Hastings Monte Carlo","title":"Thermal Metropolis-Hastings Monte Carlo","text":"Metropolis-Hastings Monte Carlo is a popular method for sampling the canonical distribution for a molecular system. Our implementations uses AdvancedMH.jl from the Turing organisation.","category":"page"},{"location":"initialconditions/metropolishastings/","page":"Thermal Metropolis-Hastings Monte Carlo","title":"Thermal Metropolis-Hastings Monte Carlo","text":"For a classical Simulation, the algorithm involves proposing new configurations in a random walk starting from an initial configuration. These are accepted or rejected based upon the Metropolis-Hastings criteria. The result is a Markov chain that samples the canonical distribution.","category":"page"},{"location":"initialconditions/metropolishastings/#Example","page":"Thermal Metropolis-Hastings Monte Carlo","title":"Example","text":"","category":"section"},{"location":"initialconditions/metropolishastings/","page":"Thermal Metropolis-Hastings Monte Carlo","title":"Thermal Metropolis-Hastings Monte Carlo","text":"We can perform the sampling by setting up a classical simulation in the usual way and providing an appropriate initial configuration.","category":"page"},{"location":"initialconditions/metropolishastings/","page":"Thermal Metropolis-Hastings Monte Carlo","title":"Thermal Metropolis-Hastings Monte Carlo","text":"using NQCDynamics\nsim = Simulation(Atoms([:H, :H, :H, :H, :H]), Harmonic(); temperature=15)\nr0 = zeros(size(sim))","category":"page"},{"location":"initialconditions/metropolishastings/","page":"Thermal Metropolis-Hastings Monte Carlo","title":"Thermal Metropolis-Hastings Monte Carlo","text":"Then we must also specify the total number of steps and the size of each step. These can be provided in a dictionary for each species to allow for different step sizes depending on the element in the simulation.","category":"page"},{"location":"initialconditions/metropolishastings/","page":"Thermal Metropolis-Hastings Monte Carlo","title":"Thermal Metropolis-Hastings Monte Carlo","text":"steps = 1e4\nstep_size = Dict(:H=>1)","category":"page"},{"location":"initialconditions/metropolishastings/","page":"Thermal Metropolis-Hastings Monte Carlo","title":"Thermal Metropolis-Hastings Monte Carlo","text":"Now we can run the sampling. The extra keyword argument move_ratio is used to specify the fraction of the system moved during each Monte Carlo step. If we attempt to move the entire system at once, we can expect a very low acceptance ratio, whereas is we move only a single atom, the sampling will take much longer. You will likely have to experiment with this parameter to achieve optimal sampling.","category":"page"},{"location":"initialconditions/metropolishastings/","page":"Thermal Metropolis-Hastings Monte Carlo","title":"Thermal Metropolis-Hastings Monte Carlo","text":"using NQCDynamics.InitialConditions: ThermalMonteCarlo\nchain = ThermalMonteCarlo.run_advancedmh_sampling(sim, r0, steps, step_size; move_ratio=0.5)","category":"page"},{"location":"initialconditions/metropolishastings/","page":"Thermal Metropolis-Hastings Monte Carlo","title":"Thermal Metropolis-Hastings Monte Carlo","text":"Now that our sampling is complete we can evaluate the potential energy expectation value. Here we use the @estimate macro which will evaluate the given function for every configuration inside chain and return the average. Here we can see that the energy we obtain closely matches that predicted by the equipartition theorem.","category":"page"},{"location":"initialconditions/metropolishastings/","page":"Thermal Metropolis-Hastings Monte Carlo","title":"Thermal Metropolis-Hastings Monte Carlo","text":"Estimators.@estimate potential_energy(sim, chain)\nsim.temperature / 2 * 5","category":"page"},{"location":"initialconditions/metropolishastings/#Legacy-version","page":"Thermal Metropolis-Hastings Monte Carlo","title":"Legacy version","text":"","category":"section"},{"location":"initialconditions/metropolishastings/","page":"Thermal Metropolis-Hastings Monte Carlo","title":"Thermal Metropolis-Hastings Monte Carlo","text":"Prior to the use of AdvancedMH.jl, an alternative version of the algorithm was implemented that works for both classical and ring polymer systems. This is currently still included in the code but should be regarded as deprecated and will likely be removed/combined with the AdvancedMH.jl version.","category":"page"},{"location":"initialconditions/metropolishastings/","page":"Thermal Metropolis-Hastings Monte Carlo","title":"Thermal Metropolis-Hastings Monte Carlo","text":"Here, we use the legacy version to obtain a thermal distribution in a simple model system.","category":"page"},{"location":"initialconditions/metropolishastings/","page":"Thermal Metropolis-Hastings Monte Carlo","title":"Thermal Metropolis-Hastings Monte Carlo","text":"using NQCDynamics\nusing Plots","category":"page"},{"location":"initialconditions/metropolishastings/","page":"Thermal Metropolis-Hastings Monte Carlo","title":"Thermal Metropolis-Hastings Monte Carlo","text":"First we set up the system in the usual way, here we're using an NO molecule with a harmonic interaction between the atoms. Notice that we use Unitful.jl to specify the temperature.","category":"page"},{"location":"initialconditions/metropolishastings/","page":"Thermal Metropolis-Hastings Monte Carlo","title":"Thermal Metropolis-Hastings Monte Carlo","text":"using Unitful\n\natoms = Atoms([:N, :O])\nmodel = DiatomicHarmonic(1.0)\n\nsim = Simulation{Classical}(atoms, model; temperature=300u\"K\")\nnothing # hide","category":"page"},{"location":"initialconditions/metropolishastings/","page":"Thermal Metropolis-Hastings Monte Carlo","title":"Thermal Metropolis-Hastings Monte Carlo","text":"Then we have to specify the parameters for the Monte Carlo simulation and perform the sampling. Δ contains the step sizes for each of the species, R0 the initial geometry and passes the number of monte carlo passes we perform (passes*n_atoms steps total).","category":"page"},{"location":"initialconditions/metropolishastings/","page":"Thermal Metropolis-Hastings Monte Carlo","title":"Thermal Metropolis-Hastings Monte Carlo","text":"Δ = Dict([(:N, 0.1), (:O, 0.1)])\nR0 = [1.0 0.0; 0.0 0.0; 0.0 0.0]\npasses = 1000\noutput = InitialConditions.MetropolisHastings.run_monte_carlo_sampling(sim, R0, Δ, passes)\nnothing # hide","category":"page"},{"location":"initialconditions/metropolishastings/","page":"Thermal Metropolis-Hastings Monte Carlo","title":"Thermal Metropolis-Hastings Monte Carlo","text":"Output has three fields: the acceptance rates for each species and the energies and geometries obtained during sampling.","category":"page"},{"location":"initialconditions/metropolishastings/","page":"Thermal Metropolis-Hastings Monte Carlo","title":"Thermal Metropolis-Hastings Monte Carlo","text":"output.acceptance","category":"page"},{"location":"initialconditions/metropolishastings/","page":"Thermal Metropolis-Hastings Monte Carlo","title":"Thermal Metropolis-Hastings Monte Carlo","text":"plot(output.energy)\nxlabel!(\"Step\") # hide\nylabel!(\"Energy\") # hide","category":"page"},{"location":"initialconditions/metropolishastings/","page":"Thermal Metropolis-Hastings Monte Carlo","title":"Thermal Metropolis-Hastings Monte Carlo","text":"We can calculate the distance between each atom and plot the bond length throughout the sampling.","category":"page"},{"location":"initialconditions/metropolishastings/","page":"Thermal Metropolis-Hastings Monte Carlo","title":"Thermal Metropolis-Hastings Monte Carlo","text":"using LinearAlgebra\nplot([norm(R[:,1] .- R[:,2]) for R in output.R])\nxlabel!(\"Step\") # hide\nylabel!(\"Bond length\") # hide","category":"page"},{"location":"initialconditions/metropolishastings/","page":"Thermal Metropolis-Hastings Monte Carlo","title":"Thermal Metropolis-Hastings Monte Carlo","text":"The result of this simulation seamlessly interfaces with the DynamicalDistribution presented in the previous section and output.R can be readily passed to provide the position distribution. The Monte Carlo sampling does not include velocities but these can be readily obtained from the Maxwell-Boltzmann distribution.","category":"page"},{"location":"api/NQCDynamics/dynamicsoutputs/#DynamicsOutputs","page":"DynamicsOutputs","title":"DynamicsOutputs","text":"","category":"section"},{"location":"api/NQCDynamics/dynamicsoutputs/","page":"DynamicsOutputs","title":"DynamicsOutputs","text":"Here are all the functions that you can specify in the output tuple when using run_dynamics. To add more, simply add a new function in the DynamicsOutputs module. ","category":"page"},{"location":"api/NQCDynamics/dynamicsoutputs/","page":"DynamicsOutputs","title":"DynamicsOutputs","text":"Modules=[NQCDynamics.DynamicsOutputs]\nPrivate=false","category":"page"},{"location":"api/NQCDynamics/dynamicsoutputs/#NQCDynamics.DynamicsOutputs","page":"DynamicsOutputs","title":"NQCDynamics.DynamicsOutputs","text":"DynamicsOutputs\n\nDefines a set of functions that can be used to calculate outputs for dynamics simulations.\n\n\n\n\n\n","category":"module"},{"location":"api/NQCDynamics/dynamicsoutputs/#NQCDynamics.DynamicsOutputs.OutputDissociation","page":"DynamicsOutputs","title":"NQCDynamics.DynamicsOutputs.OutputDissociation","text":"Output a 1 if the molecule has dissociated, 0 otherwise.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDynamics/dynamicsoutputs/#NQCDynamics.DynamicsOutputs.OutputQuantisedDiatomic","page":"DynamicsOutputs","title":"NQCDynamics.DynamicsOutputs.OutputQuantisedDiatomic","text":"Output the vibrational and rotational quantum numbers of the final image.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDynamics/dynamicsoutputs/#NQCDynamics.DynamicsOutputs.OutputStateResolvedScattering1D","page":"DynamicsOutputs","title":"NQCDynamics.DynamicsOutputs.OutputStateResolvedScattering1D","text":"Output a ComponentVector with fields reflection and transmission containing the probability of the outcome. Each index in the arrays refers to the adiabatic state.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDynamics/dynamicsoutputs/#NQCDynamics.DynamicsOutputs.OutputAdiabaticPopulation-Tuple{Any, Any}","page":"DynamicsOutputs","title":"NQCDynamics.DynamicsOutputs.OutputAdiabaticPopulation","text":"OutputAdiabaticPopulation(sol, i)\n\nOutput the adiabatic population at each timestep during the trajectory.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsoutputs/#NQCDynamics.DynamicsOutputs.OutputCentroidPosition-Tuple{Any, Any}","page":"DynamicsOutputs","title":"NQCDynamics.DynamicsOutputs.OutputCentroidPosition","text":"OutputCentroidPosition(sol, i)\n\nOutput the position of the ring polymer centroid at each timestep during the trajectory.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsoutputs/#NQCDynamics.DynamicsOutputs.OutputCentroidVelocity-Tuple{Any, Any}","page":"DynamicsOutputs","title":"NQCDynamics.DynamicsOutputs.OutputCentroidVelocity","text":"OutputCentroidVelocity(sol, i)\n\nOutput the velocity of the ring polymer centroid at each timestep during the trajectory. \n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsoutputs/#NQCDynamics.DynamicsOutputs.OutputDiabaticPopulation-Tuple{Any, Any}","page":"DynamicsOutputs","title":"NQCDynamics.DynamicsOutputs.OutputDiabaticPopulation","text":"OutputDiabaticPopulation(sol, i)\n\nOutput the diabatic population at each timestep during the trajectory.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsoutputs/#NQCDynamics.DynamicsOutputs.OutputDiscreteState-Tuple{Any, Any}","page":"DynamicsOutputs","title":"NQCDynamics.DynamicsOutputs.OutputDiscreteState","text":"OutputDiscreteState(sol, i)\n\nOutput the discrete state variable at each timestep during the trajectory. This is used for surface hopping simulations and returns the variable that determines the currently occupied adiabatic state.\n\nRequires that the dynamics variable has a field state.\n\nUse OutputDiabaticPopulation or OutputAdiabaticPopulation to get the population estimators.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsoutputs/#NQCDynamics.DynamicsOutputs.OutputDynamicsVariables-Tuple{Any, Any}","page":"DynamicsOutputs","title":"NQCDynamics.DynamicsOutputs.OutputDynamicsVariables","text":"OutputDynamicsVariables(sol, i)\n\nOutput all of the dynamics variables at each timestep during the trajectory.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsoutputs/#NQCDynamics.DynamicsOutputs.OutputFinal-Tuple{Any, Any}","page":"DynamicsOutputs","title":"NQCDynamics.DynamicsOutputs.OutputFinal","text":"Output the end point of each trajectory.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsoutputs/#NQCDynamics.DynamicsOutputs.OutputKineticEnergy-Tuple{Any, Any}","page":"DynamicsOutputs","title":"NQCDynamics.DynamicsOutputs.OutputKineticEnergy","text":"OutputKineticEnergy(sol, i)\n\nEvaluate the classical kinetic energy at each timestep during the trajectory.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsoutputs/#NQCDynamics.DynamicsOutputs.OutputMappingMomentum-Tuple{Any, Any}","page":"DynamicsOutputs","title":"NQCDynamics.DynamicsOutputs.OutputMappingMomentum","text":"OutputMappingMomentum(sol, i)\n\nOutput the momentum mapping variable at each timestep during the trajectory.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsoutputs/#NQCDynamics.DynamicsOutputs.OutputMappingPosition-Tuple{Any, Any}","page":"DynamicsOutputs","title":"NQCDynamics.DynamicsOutputs.OutputMappingPosition","text":"OutputMappingPosition(sol, i)\n\nOutput the position mapping variables at each timestep during the trajectory.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsoutputs/#NQCDynamics.DynamicsOutputs.OutputPosition-Tuple{Any, Any}","page":"DynamicsOutputs","title":"NQCDynamics.DynamicsOutputs.OutputPosition","text":"OutputPosition(sol, i)\n\nOutput the position at each timestep during the trajectory.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsoutputs/#NQCDynamics.DynamicsOutputs.OutputPotentialEnergy-Tuple{Any, Any}","page":"DynamicsOutputs","title":"NQCDynamics.DynamicsOutputs.OutputPotentialEnergy","text":"OutputPotentialEnergy(sol, i)\n\nOutput the adiabatic potential energy at each timestep during the trajectory.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsoutputs/#NQCDynamics.DynamicsOutputs.OutputQuantumSubsystem-Tuple{Any, Any}","page":"DynamicsOutputs","title":"NQCDynamics.DynamicsOutputs.OutputQuantumSubsystem","text":"OutputQuantumSubsystem(sol, i)\n\nOutput the quantum subsystem at each timestep during the trajectory. Usually this will refer to a wavefunction or density matrix but will depend on the particular dynamics method.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsoutputs/#NQCDynamics.DynamicsOutputs.OutputSurfaceHops-Tuple{Any, Any}","page":"DynamicsOutputs","title":"NQCDynamics.DynamicsOutputs.OutputSurfaceHops","text":"Output the total number of surface hops during the trajectory\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsoutputs/#NQCDynamics.DynamicsOutputs.OutputTotalAdiabaticPopulation-Tuple{Any, Any}","page":"DynamicsOutputs","title":"NQCDynamics.DynamicsOutputs.OutputTotalAdiabaticPopulation","text":"OutputTotalAdiabaticPopulation(sol, i)\n\nOutput the total adiabatic population at each timestep during the trajectory.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsoutputs/#NQCDynamics.DynamicsOutputs.OutputTotalDiabaticPopulation-Tuple{Any, Any}","page":"DynamicsOutputs","title":"NQCDynamics.DynamicsOutputs.OutputTotalDiabaticPopulation","text":"OutputTotalDiabaticPopulation(sol, i)\n\nOutput the total diabatic population at eah timestep during the trajectory.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsoutputs/#NQCDynamics.DynamicsOutputs.OutputTotalEnergy-Tuple{Any, Any}","page":"DynamicsOutputs","title":"NQCDynamics.DynamicsOutputs.OutputTotalEnergy","text":"OutputTotalEnergy(sol, i)\n\nEvaluate the classical Hamiltonian at each timestep during the trajectory.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsoutputs/#NQCDynamics.DynamicsOutputs.OutputVelocity-Tuple{Any, Any}","page":"DynamicsOutputs","title":"NQCDynamics.DynamicsOutputs.OutputVelocity","text":"OutputVelocity(sol, i)\n\nOutput the velocity at each timestep during the trajectory.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsoutputs/#Internals","page":"DynamicsOutputs","title":"Internals","text":"","category":"section"},{"location":"api/NQCDynamics/dynamicsoutputs/","page":"DynamicsOutputs","title":"DynamicsOutputs","text":"Modules=[NQCDynamics.DynamicsOutputs]\nPublic=false","category":"page"},{"location":"api/NQCModels/cubeldfamodel/#CubeLDFAModel","page":"CubeLDFAModel","title":"CubeLDFAModel","text":"","category":"section"},{"location":"api/NQCModels/cubeldfamodel/","page":"CubeLDFAModel","title":"CubeLDFAModel","text":"Modules=[CubeLDFAModel]","category":"page"},{"location":"api/NQCModels/cubeldfamodel/#CubeLDFAModel.CubeLDFAModel","page":"CubeLDFAModel","title":"CubeLDFAModel.CubeLDFAModel","text":"This uses a cube file to attach friction coefficients to existing models by fitting the data provided by Gerrits et al. in PHYSICAL REVIEW B 102, 155130 (2020).\n\n\n\n\n\n","category":"module"},{"location":"api/NQCModels/cubeldfamodel/#CubeLDFAModel.LDFAModel","page":"CubeLDFAModel","title":"CubeLDFAModel.LDFAModel","text":"LDFAModel(model::Model, filename, atoms, cell;\n friction_atoms=collect(range(atoms)),\n )\n\nWrapper for existing models that adds LDFA friction.\n\nThis model uses a cube file to evaluate the electron density used to calculate the friction. This model assumes that the cube file has units of bohr for the grid and cell distances, but provides the density in Å^-3, as is the default in FHI-aims.\n\n\n\n\n\n","category":"type"},{"location":"NQCModels/frictionmodels/#models-friction","page":"Electronic friction models","title":"Electronic friction models","text":"","category":"section"},{"location":"NQCModels/frictionmodels/","page":"Electronic friction models","title":"Electronic friction models","text":"To perform molecular dynamics with electronic friction (MDEF) a specific type of model must be used that provides the friction tensor used to propagate the dynamics.","category":"page"},{"location":"NQCModels/frictionmodels/","page":"Electronic friction models","title":"Electronic friction models","text":"As detailed in the MDEF page, there are two ways to obtain friction values, either from the local density friction approximation (LDFA), or from time-dependent perturbation theory (TDPT). The models on this page describe our existing implementations.","category":"page"},{"location":"NQCModels/frictionmodels/#Analytic-models","page":"Electronic friction models","title":"Analytic models","text":"","category":"section"},{"location":"NQCModels/frictionmodels/","page":"Electronic friction models","title":"Electronic friction models","text":"Since ab initio friction calculations are often expensive it is useful to have some models that we can use to test different friction methods. The DiabaticFrictionModel is the abstract type that groups together the diabatic models for which electronic friction can be evaluated. These have many electronic states, modelling the electronic structure characteristic of a metal. The friction is calculated for these models directly from the nonadiabatic couplings with the equation:","category":"page"},{"location":"NQCModels/frictionmodels/","page":"Electronic friction models","title":"Electronic friction models","text":"γ = 2pihbar sum_j 1dHjjdH1 delta(omega_j) omega_j","category":"page"},{"location":"NQCModels/frictionmodels/","page":"Electronic friction models","title":"Electronic friction models","text":"where the delta function is approximated by a normalised Gaussian function and the sum runs over the adiabatic states (Connor L. Box, Yaolong Zhang, Rongrong Yin, Bin Jiang, Reinhard J. Maurer (2021)). The matrix elements in this equation are the position derivatives of the diabatic hamiltonian converted to the adiabatic representation.","category":"page"},{"location":"NQCModels/frictionmodels/","page":"Electronic friction models","title":"Electronic friction models","text":"warning: Warning\nThe analytic friction models and the equation above are experimental and subject to change.","category":"page"},{"location":"NQCModels/frictionmodels/#models-cubeldfa","page":"Electronic friction models","title":"CubeLDFAModel.jl","text":"","category":"section"},{"location":"NQCModels/frictionmodels/","page":"Electronic friction models","title":"Electronic friction models","text":"Our LDFA implementation is given in CubeLDFAModel.jl which takes a .cube file containing the electron density and evaluates the friction based upon this local density.","category":"page"},{"location":"NQCModels/frictionmodels/","page":"Electronic friction models","title":"Electronic friction models","text":"The model works by fitting the LDA data provided by Nick Gerrits, J. I\\~naki Juaristi, J\\\"org Meyer (2020) that provides the LDFA friction coefficient as a function of the Wigner-Seitz radius. When the model is initialised, the LDA data from Nick Gerrits, J. I\\~naki Juaristi, J\\\"org Meyer (2020) is interpolated using DataInterpolations.jl with a cubic spline. Then, whenever required, the density at the current position is taken directly from the .cube file and converted to the Wigner-Seitz radius with the following relation:","category":"page"},{"location":"NQCModels/frictionmodels/","page":"Electronic friction models","title":"Electronic friction models","text":"r_s(rho) = (frac34pi rho (mathbfr_i))^13","category":"page"},{"location":"NQCModels/frictionmodels/","page":"Electronic friction models","title":"Electronic friction models","text":"Then, the interpolation function is evaluated with this value for the radius, which gives the LDA friction. Optimally, this would be done via an ab initio calculation to get the electron density, but this model instead uses a pre-computed .cube file to get the density with minimal cost. This makes the assumption that the density does not change throughout the dynamics, or that the surface is assumed to be frozen in place.","category":"page"},{"location":"NQCModels/frictionmodels/","page":"Electronic friction models","title":"Electronic friction models","text":"This graph shows how we interpolate the LDA data and evaluate the friction coefficient as a function of the Wigner-Seitz radius. (Image: ldfa graph)","category":"page"},{"location":"NQCModels/frictionmodels/","page":"Electronic friction models","title":"Electronic friction models","text":"The reactive scattering example uses this model to investigate the scattering of a diatomic molecule from a metal surface.","category":"page"},{"location":"NQCModels/frictionmodels/#NNInterfaces.jl","page":"Electronic friction models","title":"NNInterfaces.jl","text":"","category":"section"},{"location":"NQCModels/frictionmodels/","page":"Electronic friction models","title":"Electronic friction models","text":"Another way to perform MDEF simulations is the use one of the models from NNInterfaces.jl that uses a neural network to obtain the time-dependent perturbation theory friction from the atomic positions. As with LDFA, one of these models is used in the reactive scattering example.","category":"page"},{"location":"initialconditions/hamiltonian/#hmc-sampling","page":"Thermal Hamiltonian Monte Carlo","title":"Thermal Hamiltonian Monte Carlo","text":"","category":"section"},{"location":"initialconditions/hamiltonian/","page":"Thermal Hamiltonian Monte Carlo","title":"Thermal Hamiltonian Monte Carlo","text":"Our implementation of Hamiltonian Monte Carlo (HMC) is a light wrapper around the AdvancedHMC.jl package. If you want to learn about the HMC theory, refer to the references and documentation provided with AdvancedHMC.jl.","category":"page"},{"location":"initialconditions/hamiltonian/","page":"Thermal Hamiltonian Monte Carlo","title":"Thermal Hamiltonian Monte Carlo","text":"Currently, our implementation works for systems with classical nuclei only (i.e. Simulation but not RingPolymerSimulation).","category":"page"},{"location":"initialconditions/hamiltonian/#Example","page":"Thermal Hamiltonian Monte Carlo","title":"Example","text":"","category":"section"},{"location":"initialconditions/hamiltonian/","page":"Thermal Hamiltonian Monte Carlo","title":"Thermal Hamiltonian Monte Carlo","text":"In this example we use Hamiltonian Monte Carlo to sample the canonical distribution of a 3 dimensional harmonic oscillator potential containing 4 atoms.","category":"page"},{"location":"initialconditions/hamiltonian/","page":"Thermal Hamiltonian Monte Carlo","title":"Thermal Hamiltonian Monte Carlo","text":"using NQCDynamics\nusing Unitful\nusing UnitfulAtomic\n\nsim = Simulation(Atoms([:H, :H, :C, :C]), Harmonic(dofs=3); temperature=300u\"K\")\nr0 = randn(size(sim))\nchain, stats = InitialConditions.ThermalMonteCarlo.run_advancedhmc_sampling(sim, r0, 1e4)\nnothing # hide","category":"page"},{"location":"initialconditions/hamiltonian/","page":"Thermal Hamiltonian Monte Carlo","title":"Thermal Hamiltonian Monte Carlo","text":"The Monte Carlo chain contains the nuclear configurations that we have sampled:","category":"page"},{"location":"initialconditions/hamiltonian/","page":"Thermal Hamiltonian Monte Carlo","title":"Thermal Hamiltonian Monte Carlo","text":"chain","category":"page"},{"location":"initialconditions/hamiltonian/","page":"Thermal Hamiltonian Monte Carlo","title":"Thermal Hamiltonian Monte Carlo","text":"and stats contains extra information about the sampling procedure:","category":"page"},{"location":"initialconditions/hamiltonian/","page":"Thermal Hamiltonian Monte Carlo","title":"Thermal Hamiltonian Monte Carlo","text":"stats","category":"page"},{"location":"initialconditions/hamiltonian/","page":"Thermal Hamiltonian Monte Carlo","title":"Thermal Hamiltonian Monte Carlo","text":"Here we should see that the energy expectation for the generated ensemble matches with the equipartition theorem:","category":"page"},{"location":"initialconditions/hamiltonian/","page":"Thermal Hamiltonian Monte Carlo","title":"Thermal Hamiltonian Monte Carlo","text":"Estimators.@estimate potential_energy(sim, chain)\naustrip(sim.temperature) * 3 * 4 / 2","category":"page"},{"location":"api/NQCModels/diabaticmodels/#DiabaticModels","page":"DiabaticModels","title":"DiabaticModels","text":"","category":"section"},{"location":"api/NQCModels/diabaticmodels/","page":"DiabaticModels","title":"DiabaticModels","text":"Modules=[NQCModels.DiabaticModels]","category":"page"},{"location":"api/NQCModels/diabaticmodels/#NQCModels.DiabaticModels","page":"DiabaticModels","title":"NQCModels.DiabaticModels","text":"DiabaticModels\n\nModels defined within this module subtype the DiabaticModel and provide potentials as Hermitian matrices and derivatives as arrays of Hermitian matrices.\n\n\n\n\n\n","category":"module"},{"location":"api/NQCModels/diabaticmodels/#NQCModels.DiabaticModels.AltDebyeSpectralDensity","page":"DiabaticModels","title":"NQCModels.DiabaticModels.AltDebyeSpectralDensity","text":"AltDebyeSpectralDensity{T} <: SpectralDensity\n\nStandard Debye spectral density but uses an alternative discretization scheme that requires a cutoff parameter ωᵐ.\n\nReferences\n\nNajeh Rekik, Chang-Yu Hsieh, Holly Freedman, Gabriel Hanna, J. Chem. Phys. 138, 144106 (2013)\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/diabaticmodels/#NQCModels.DiabaticModels.AnanthModelOne","page":"DiabaticModels","title":"NQCModels.DiabaticModels.AnanthModelOne","text":"AnanthModelOne(a=0.01, b=1.6, c=0.005, d=1.0)\n\nAnanth's simple avoided crossing model (similar to Tully's first model) from J. Chem. Phys. 127, 084114 (2007).\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/diabaticmodels/#NQCModels.DiabaticModels.AnanthModelTwo","page":"DiabaticModels","title":"NQCModels.DiabaticModels.AnanthModelTwo","text":"AnanthModelTwo(a=0.04, b=0.01, c=0.005, d=1.0, e=0.7, f=1.6)\n\nAnanth's asymmetric model from J. Chem. Phys. 127, 084114 (2007).\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/diabaticmodels/#NQCModels.DiabaticModels.BosonBath","page":"DiabaticModels","title":"NQCModels.DiabaticModels.BosonBath","text":"BosonBath(density::SpectralDensity, N::Integer)\n\nBosonic bath with given spectral density.\n\nUseful for sampling the bath uncoupled from the spin for spin-boson dynamics.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/diabaticmodels/#NQCModels.DiabaticModels.DebyeSpectralDensity","page":"DiabaticModels","title":"NQCModels.DiabaticModels.DebyeSpectralDensity","text":"DebyeSpectralDensity{T} <: SpectralDensity\n\nDebye density as detailed in: Xin He, Jian Liu, J. Chem. Phys. 151, 024105 (2019)\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/diabaticmodels/#NQCModels.DiabaticModels.DiabaticFrictionModel","page":"DiabaticModels","title":"NQCModels.DiabaticModels.DiabaticFrictionModel","text":"DiabaticFrictionModel <: LargeDiabaticModel\n\nThese models are defined identically to the LargeDiabaticModel but allocate extra temporary arrays when used with NQCDynamics.jl.\n\nThis allows for the calculation of electronic friction internally from the diabatic potential after diagonalisation and calculation of nonadiabatic couplings.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/diabaticmodels/#NQCModels.DiabaticModels.DiabaticModel","page":"DiabaticModels","title":"NQCModels.DiabaticModels.DiabaticModel","text":"DiabaticModel <: Model\n\nDiabaticModels are used when a system has multiple electronic states that are presented in the diabatic representation. This is the case for the majority of model systems.\n\nImplementation\n\nDiabaticModels should implement:\n\npotential(model, R)\nderivative!(model, D, R)\nnstates(model)\nndofs(model)\n\nExample\n\nIn this example we create a simple 2 state, 1 dimensional diabatic model MyModel. As noted above, we implement the 4 relevant functions then evaluate the potential. Since this is a 1D model the argument R accepts a Real value.\n\nusing StaticArrays: SMatrix\nusing LinearAlgebra: Hermitian\n\nstruct MyModel <: NQCModels.DiabaticModels.DiabaticModel end\n\nNQCModels.nstates(::MyModel) = 2\nNQCModels.ndofs(::MyModel) = 1\n\nfunction NQCModels.potential(::MyModel, R::Real) \n V11 = R\n V22 = -R\n V12 = 1\n return Hermitian(SMatrix{2,2}(V11, V12, V12, V22))\nend\n\nfunction NQCModels.derivative!(::MyModel, D, R::Real)\n return Hermitian(SMatrix{2,2}(1, 0, 0, 1))\nend\n\nmodel = MyModel()\nNQCModels.potential(model, 10)\n\n# output\n\n2×2 Hermitian{Int64, SMatrix{2, 2, Int64, 4}}:\n 10 1\n 1 -10\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/diabaticmodels/#NQCModels.DiabaticModels.DoubleWell","page":"DiabaticModels","title":"NQCModels.DiabaticModels.DoubleWell","text":"DoubleWell(mass=1, ω=1, γ=1, Δ=1)\n\nTwo state double well, also called the one-dimensional spin-boson model. See: J. Chem. Phys. 150, 244102 (2019)\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/diabaticmodels/#NQCModels.DiabaticModels.ErpenbeckThoss","page":"DiabaticModels","title":"NQCModels.DiabaticModels.ErpenbeckThoss","text":"struct ErpenbeckThoss{T<:AbstractFloat} <: DiabaticModel\n\n1D two-state diabatic system capable of modelling a molecule adsorbed on a metal surface or a single-molecule junction.\n\nIn the two references, all of the parameters are identical except for the particle mass m and the vertical shift c applied to the ϵ₀ state. Both references modify the shift to ensure the quantum ground-state has an energy of 0 eV. Note that the mass m is specified in atomic mass units (amu) not atomic units. We calculate the offset automatically in the constructor from the Morse potential zero-point energy.\n\nReferences\n\nPHYSICAL REVIEW B 97, 235452 (2018)\nJ. Chem. Phys. 151, 191101 (2019)\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/diabaticmodels/#NQCModels.DiabaticModels.FullGaussLegendre","page":"DiabaticModels","title":"NQCModels.DiabaticModels.FullGaussLegendre","text":"FullGaussLegendre{T} <: WideBandBathDiscretisation\n\nUse Gauss-Legendre quadrature to discretise the continuum across the entire band width. This is similar to the ShenviGaussLegendre except that splits the continuum at the Fermi level into two halves.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/diabaticmodels/#NQCModels.DiabaticModels.GatesHollowayElbow","page":"DiabaticModels","title":"NQCModels.DiabaticModels.GatesHollowayElbow","text":"GatesHollowayElbow()\n\nSimple two state elbow potential from Gates and Holloway: Journal of Electron Spectroscopy and Related Phenomena, 64/65 (1993) 633-639\n\nHas two diabatic states each comprised of the sum of a Morse and a repulsive potential. The coupling between them is an exponential function of z (distance from the surface).\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/diabaticmodels/#NQCModels.DiabaticModels.LargeDiabaticModel","page":"DiabaticModels","title":"NQCModels.DiabaticModels.LargeDiabaticModel","text":"LargeDiabaticModel <: DiabaticModel\n\nSame as the DiabaticModels but uses normal Julia arrays instead of StaticArrays and must implement the inplace potential! rather than potential. This is useful when nstates is very large and StaticArrays are no longer efficient.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/diabaticmodels/#NQCModels.DiabaticModels.MiaoSubotnik","page":"DiabaticModels","title":"NQCModels.DiabaticModels.MiaoSubotnik","text":"MiaoSubotnik{T<:AbstractFloat} <: DiabaticModel\n\nDouble well model with parameters matching those of Miao and Subotnik in the reference. This model should be paired with the AndersonHolstein model to couple to the bath of metallic states.\n\nReferences\n\nJ. Chem. Phys. 150, 041711 (2019)\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/diabaticmodels/#NQCModels.DiabaticModels.OhmicSpectralDensity","page":"DiabaticModels","title":"NQCModels.DiabaticModels.OhmicSpectralDensity","text":"OhmicSpectralDensity{T} <: SpectralDensity\n\nOhmic density as detailed in: Xin He, Jian Liu, J. Chem. Phys. 151, 024105 (2019)\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/diabaticmodels/#NQCModels.DiabaticModels.OuyangModelOne","page":"DiabaticModels","title":"NQCModels.DiabaticModels.OuyangModelOne","text":"OuyangModelOne(A=0.01, B=1.6, Γ=1e-4, N=10, ΔE=1.6e-2, D=1.0)\n\nModel #1 from Ouyang and Subotnik. See also Ouyang's thesis.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/diabaticmodels/#NQCModels.DiabaticModels.ReferenceGaussLegendre","page":"DiabaticModels","title":"NQCModels.DiabaticModels.ReferenceGaussLegendre","text":"ReferenceGaussLegendre{T}\n\nImplementation translated from Fortran code used for simulations of Shenvi et al. in J. Chem. Phys. 130, 174107 (2009). Two differences from ShenviGaussLegendre:\n\nPosition of minus sign in energy levels has been corrected.\nDivision by sqrt(ΔE) in the coupling. \n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/diabaticmodels/#NQCModels.DiabaticModels.ShenviGaussLegendre","page":"DiabaticModels","title":"NQCModels.DiabaticModels.ShenviGaussLegendre","text":"ShenviGaussLegendre{T}\n\nDefined as described by Shenvi et al. in J. Chem. Phys. 130, 174107 (2009). The position of the negative sign for the state energy level has been moved to ensure the states are sorted from lowest to highest.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/diabaticmodels/#NQCModels.DiabaticModels.SpinBoson","page":"DiabaticModels","title":"NQCModels.DiabaticModels.SpinBoson","text":"SpinBoson(density::SpectralDensity, N::Integer, ϵ, Δ)\n\nSpin boson model with N bosons with given spectral density.\n\nReferences\n\nXin He, Jian Liu, J. Chem. Phys. 151, 024105 (2019)\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/diabaticmodels/#NQCModels.DiabaticModels.ThreeStateMorse","page":"DiabaticModels","title":"NQCModels.DiabaticModels.ThreeStateMorse","text":"ThreeStateMorse()\n\nThree state morse potential referred to as Model IA here: J. Chem. Phys. 150, 244102 (2019) \n\nModels IB and IC retain the same functional form and need only a change of parameters.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/diabaticmodels/#NQCModels.DiabaticModels.TrapezoidalRule","page":"DiabaticModels","title":"NQCModels.DiabaticModels.TrapezoidalRule","text":"TrapezoidalRule{B,T} <: WideBandBathDiscretisation\n\nDiscretise wide band continuum using trapezoidal rule. Leads to evenly spaced states and constant coupling.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/diabaticmodels/#NQCModels.DiabaticModels.TullyModelOne","page":"DiabaticModels","title":"NQCModels.DiabaticModels.TullyModelOne","text":"TullyModelOne(a=0.01, b=1.6, c=0.005, d=1.0)\n\nTully's simple avoided crossing model from J. Chem. Phys. 93, 1061 (1990).\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/diabaticmodels/#NQCModels.DiabaticModels.TullyModelThree","page":"DiabaticModels","title":"NQCModels.DiabaticModels.TullyModelThree","text":"TullyModelThree(a=0.0006, b=0.1, c=0.9)\n\nTully's extended coupling with reflection model from J. Chem. Phys. 93, 1061 (1990).\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/diabaticmodels/#NQCModels.DiabaticModels.TullyModelTwo","page":"DiabaticModels","title":"NQCModels.DiabaticModels.TullyModelTwo","text":"TullyModelTwo(a=0.1, b=0.28, c=0.015, d=0.06, e=0.05)\n\nTully's dual avoided crossing model from J. Chem. Phys. 93, 1061 (1990).\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/diabaticmodels/#NQCModels.DiabaticModels.discretize-Tuple{NQCModels.DiabaticModels.SpectralDensity, Integer}","page":"DiabaticModels","title":"NQCModels.DiabaticModels.discretize","text":"Discretize a given spectral density for N oscillators. Returns frequencies and couplings.\n\n\n\n\n\n","category":"method"},{"location":"NQCModels/ase/#ASE-interface","page":"ASE interface","title":"ASE interface","text":"","category":"section"},{"location":"NQCModels/ase/","page":"ASE interface","title":"ASE interface","text":"The easiest way to obtain potentials and forces from established codes is to use the interfaces implemented in ASE.","category":"page"},{"location":"NQCModels/ase/","page":"ASE interface","title":"ASE interface","text":"We provide the AdiabaticASEModel which wraps an ASE atoms object and its associated calculator to implement the required potential and derivative functions.","category":"page"},{"location":"NQCModels/ase/","page":"ASE interface","title":"ASE interface","text":"note: Note\nThe interface works by calling the relevant Python functions using PyCall. To use PyCall, you must make sure that your python version contains all the relevant packages, such as ase. PyCall can be configured to use a particular pre-installed Python or install its own. Refer to the PyCall README for installation and configuration instructions.","category":"page"},{"location":"NQCModels/ase/#Example","page":"ASE interface","title":"Example","text":"","category":"section"},{"location":"NQCModels/ase/","page":"ASE interface","title":"ASE interface","text":"First, it is necessary to import ase and create the ase.Atoms object and attach the desired calculator. This works exactly as in Python:","category":"page"},{"location":"NQCModels/ase/","page":"ASE interface","title":"ASE interface","text":"using PyCall\n\nase = pyimport(\"ase\")\nemt = pyimport(\"ase.calculators.emt\")\n\nh2 = ase.Atoms(\"H2\", [(0, 0, 0), (0, 0, 0.74)])\nh2.calc = emt.EMT()\nnothing # hide","category":"page"},{"location":"NQCModels/ase/","page":"ASE interface","title":"ASE interface","text":"Next, the AdiabaticASEModel is created by passing the ase.Atoms object directly to the model:","category":"page"},{"location":"NQCModels/ase/","page":"ASE interface","title":"ASE interface","text":"using NQCModels\nmodel = AdiabaticASEModel(h2)","category":"page"},{"location":"NQCModels/ase/","page":"ASE interface","title":"ASE interface","text":"Now the model can be used in the same way as any of the previously introduced analytic models.","category":"page"},{"location":"NQCModels/ase/","page":"ASE interface","title":"ASE interface","text":"potential(model, rand(3, 2))\nderivative(model, rand(3, 2))","category":"page"},{"location":"NQCModels/ase/","page":"ASE interface","title":"ASE interface","text":"tip: Tip\nIn theory, this should work with any of the ASE calculators that correctly implement the get_potential_energy and get_forces functions. For instance, you can use SchNetPack (SPK) by passing their ASE calculator to the AdiabaticASEModel. Take a look at Neural network models to learn more.","category":"page"},{"location":"api/NQCDynamics/numericutils/#Numerical-utilities","page":"Numerical utilities","title":"Numerical utilities","text":"","category":"section"},{"location":"api/NQCDynamics/numericutils/","page":"Numerical utilities","title":"Numerical utilities","text":"Modules=[NQCDynamics.FastDeterminant]","category":"page"},{"location":"api/NQCDynamics/numericutils/#NQCDynamics.FastDeterminant","page":"Numerical utilities","title":"NQCDynamics.FastDeterminant","text":"FastDeterminant\n\nWhen computing many determinants in a loop the allocation and GC of the temporary arrays for the pivots and workspace can contribute a large portion of the total runtime.\n\nUsing FastLapackInterface we can reduce the allocations and improve the runtime performance.\n\n\n\n\n\n","category":"module"},{"location":"api/NQCDynamics/numericutils/#NQCDynamics.FastDeterminant.det!-Tuple{AbstractMatrix, FastLapackInterface.LUWs}","page":"Numerical utilities","title":"NQCDynamics.FastDeterminant.det!","text":"det!(A::AbstractMatrix, ws::LUWs)\n\nSame as det but the user must provide the LU workspace from FastLapackInterface.\n\n\n\n\n\n","category":"method"},{"location":"getting_started/#Getting-started","page":"Getting started","title":"Getting started","text":"","category":"section"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"To get started with the package we can identify the necessary ingredients to perform a simple classical dynamics simulation and walk through how to set up the simulation.","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"using NQCDynamics","category":"page"},{"location":"getting_started/#Atoms","page":"Getting started","title":"Atoms","text":"","category":"section"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"First, we must define the particles in the simulation. For this purpose we provide the Atoms type which will contain the symbols, atomic numbers and masses for our atoms. Technically these need not be actual atoms and be a generic particle.","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"If using real atoms, then they can be constructed using the chemical symbols as a Vector of Julia's Symbol types, a Vector{Symbol}:","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"Atoms([:H, :C])","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"You can see that this contains two atoms labelled by their atomic numbers with their masses in atomic units.","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"note: Atomic units\nInternally atomic units are used for all quantities. This makes things simple when performing nonadiabatic dynamics. Unitful.jl and UnitfulAtomic.jl can be used to help with unit transformations, and many functions will directly accept Unitful quantities and handle the conversions for you.","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"Alternatively, if not using real atoms, Atoms can be created using a Vector{<:Real} where the provided numbers are the masses of the particles.","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"Atoms([1, 2, 3, 4, 5, 6])","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"A more detailed look into the Atoms type along with a description of how to save and load structures can be found here.","category":"page"},{"location":"getting_started/#Representing-atomic-positions-and-velocities","page":"Getting started","title":"Representing atomic positions and velocities","text":"","category":"section"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"This package chooses to separate the dynamical variables from the static atomic parameters included in the Atoms type. This allows us to easily interface with other numerical packages like DifferentialEquations.jl and AdvancedMH.jl. As such, both positions and velocities are represented using Julia's standard Array type, specifically as an Array{T,2} or the Matrix{T} type, which are equivalent. If you are new to Julia, you can find a description of the Array here. The first dimension contains each atomic degree of freedom, and the second dimension contains each atom. For example, a 3D system with two atoms would have positions:","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"using Symbolics\n@variables x1, y1, z1, x2, y2, z2\nr = [x1 x2;\n y1 y2;\n z1 z2]","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"info: Adding external packages\nSymbolics is a package available from the General registry. You will have to add it to your current environment using pkg> add Symbolics to be able to reproduce this example. Throughout the documentation we occasionally use external packages, if you run into an error you will likely have to add the package before being able to use it. Refer to the Julia manual for further information on installing packages.","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"For a 1D system it would be necessary to create a 1x1 matrix:","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"r = fill(x1, (1,1))","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"Velocities are handled in the same way as positions and the data structures are the same. Usually manual initialisation like this will only be necessary for small model systems, whereas full dimensional model system will be read from a file instead. This is explored in the Atoms documentation.","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"tip: Ring polymer simulations?\nWe can also perform simulations using ring polymers which have multiple replicas of each atom, these are implemented using Array{T,3} where the third dimension is used for each ring polymer bead. For more information, see the ring polymer methods in the dynamics methods section.","category":"page"},{"location":"getting_started/#Models","page":"Getting started","title":"Models","text":"","category":"section"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"The next ingredient required to set up the simulation is the Model, i.e., the potentials in which the system evolves. These Models are provided by NQCModels.jl, which is a convenient infrastructure for defining different kinds of models for adiabatic and nonadiabatic dynamics. These models can range from simple analytic potentials all the way up to multi-dimensional ab initio potentials. Refer to the NQCModels.jl page for information on the available models and a description of how to implement further models.","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"For now we can look at an AdiabaticModel which provides a simple harmonic potential energy function.","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"model = Harmonic()","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"Here, the four parameters (m, ω, r₀ and dofs) for this model are shown along with their types and default values. These values can be modified by specifying a new value in the constructor. For example for m:","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"model = Harmonic(m=0.4)","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"tip: Check out Parameters.jl\nMany of the models use Parameters.jl to provide convenient keyword constructors and formatted printing for the models. The Harmonic model above is defined using the @with_kw macro from Parameters.jl to give it a set of default parameters. Each of these can be modified by specifying a new value using keyword arguments in the constructor as demonstrated above.","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"Adiabatic models implement two functions to calculate the total energy and the forces, respectively: potential(model, R) and derivative(model, R).","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"Let's try these out and take a look at the results:","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"potential(model, hcat(25.0))\nderivative(model, hcat(25.0))","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"note: Why hcat?\nAll models accept an R::AbstractMatrix for the argument representing the positions of the particles in the system. These are structured such that size(R) = (dofs, natoms) where dofs is the number of degrees of freedom for each atom, and natoms is the number of atoms in the simulation.Since this is a 1D model, we use hcat to quickly create a 1x1 matrix.","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"To make sure the model is what we expect, we can plot the potential and derivative using a custom plotting recipe. This looks pretty harmonic to me!","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"using Plots\n\nplot(-5:0.1:5, model)","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"warning: Warning\nPlotting recipes currently only exist for 1D models. For more complex models you will have to handle the plotting manually.","category":"page"},{"location":"getting_started/#Simulation","page":"Getting started","title":"Simulation","text":"","category":"section"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"To control all simulation parameters in one environment, we use the Simulation type which will contain both the Atoms and Models explained above, along with any extra information required for the simulation.","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"sim = Simulation{Classical}(Atoms(:H), model)","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"Here, we have specified that each atom has a single degree of freedom and have not provided a simulation cell. Classical is a type parameter, and specifies the dynamics method that we want to use. Check out Dynamics methods to learn about the other kinds of dynamics available.","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"note: Note\nTechnically Simulation(atoms, model) is equivalent to Simulation{Classical}(atoms, model) since Classical is the default.","category":"page"},{"location":"getting_started/#Dynamics-variables","page":"Getting started","title":"Dynamics variables","text":"","category":"section"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"The final ingredient before we can perform our simulation is the initial positions and velocities of our particles. For each dynamics type, the method DynamicsVariables is implemented and creates the dynamics variables for us. For classical dynamics we must provide a Matrix of velocities and of positions. These should have size = (dofs, natoms), matching the arguments of the potential and derivative functions. Usually the initial coordinates would have some physical significance, perhaps sampled from a relevant distribution, but here we use random numbers for simplicity.","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"v = rand(3, 3);\nr = rand(3, 3);\nDynamicsVariables(sim, v, r)","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"note: Note\nSince DifferentialEquations.jl requires AbstractArrays for the dynamics variables, we use ComponentArrays.jl which allow us to conveniently store all the required information for different types of dynamics.","category":"page"},{"location":"getting_started/#Bringing-it-all-together","page":"Getting started","title":"Bringing it all together","text":"","category":"section"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"We have now covered all the parts necessary to perform our first classical dynamics simulation. Let's quickly set up our simulation parameters using what we've learned. Here we'll have two atoms in a harmonic potential, each with a single degree of freedom.","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"using NQCDynamics # hide\n\natoms = Atoms([:H, :C])\nsim = Simulation{Classical}(atoms, Harmonic(ω=50.0))\nz = DynamicsVariables(sim, randn(size(sim)), randn(size(sim)))\n\nnothing # hide","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"Now, we can finally run the trajectory using the run_dynamics function. This takes three positional arguments: the simulation parameters sim, the time span we want to solve fortspan, and the dynamics variablesz. For classical dynamics we also provide a timestepdtsince we're using theVelocityVerlet` algorithm by default.","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"note: Integration algorithms\nEach method will default to an appropriate integration algorithm though it is possible to specify via a keyword argument to run_dynamics if an alternative algorithm is preferred. Refer to the dynamics documentation for more information.","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"The final keyword argument output is used to specify the quantities we want to save during the dynamics. A list of the available quantities can be found here.","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"tip: Output format\nrun_dynamics returns a Dictionary from Dictionaries.jl that has entries containing the time and the output quantities saved at each time step.","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"tspan = (0.0, 50.0)\nsolution = run_dynamics(sim, (0.0, 50.0), z;\n dt=0.1, output=(OutputPosition, OutputVelocity))","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"Here you can see the output containing the time steps and the output quantities we specified. These can be accessed directly as shown here:","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"solution[:Time]\nsolution[:OutputPosition]","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"As with the models, we provide custom plotting recipes to quickly visualise the results before performing further analysis by manually accessing the fields of the solution table. To use these recipes, simply provide the solution to the plot function from Plots.jl and give the name of the output quantity as the second argument. This will only work if this quantity was specified in run_dynamics.","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"using Plots # hide\nplot(solution, :OutputPosition)\nplot!(solution, :OutputVelocity)","category":"page"},{"location":"getting_started/#Ensemble-simulations","page":"Getting started","title":"Ensemble simulations","text":"","category":"section"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"We have shown how to perform a single trajectory, but usually we are interested in performing many and calculating observables using statistical methods. Running more trajectories is as simple as providing the trajectories keyword to run_dynamics, but we'll go through this in more detail in the Ensemble simulations section.","category":"page"},{"location":"getting_started/#What's-next?","page":"Getting started","title":"What's next?","text":"","category":"section"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"Now that we've covered the basics of classical dynamics, we're ready to explore the world of nonadiabatic dynamics. All the dynamics methods follow these patterns and anything you find elsewhere in the documentation should now seem relatively familiar.","category":"page"},{"location":"initialconditions/ebk/#ebk-sampling","page":"Semiclassical EBK quantisation","title":"Semiclassical EBK quantisation","text":"","category":"section"},{"location":"initialconditions/ebk/","page":"Semiclassical EBK quantisation","title":"Semiclassical EBK quantisation","text":"In surface science, it is often of interest to investigate how collisions with surfaces can perturb the quantum states of molecules. In particular, for diatomic molecules, the rotational and vibrational quantum numbers can undergo significant changes when the molecule impacts the surface.","category":"page"},{"location":"initialconditions/ebk/","page":"Semiclassical EBK quantisation","title":"Semiclassical EBK quantisation","text":"Einstein-Brillouinn-Keller (EBK) quantisation allows for a semiclassical investigation into these phenomena by providing a link between the quantum numbers and classical positions and velocities. The quantisation procedure allows the user to generate a classical distribution with a given set of quantum numbers, then perform semiclassical dynamics and extract the quantum numbers at the end by reversing the procedure.","category":"page"},{"location":"initialconditions/ebk/","page":"Semiclassical EBK quantisation","title":"Semiclassical EBK quantisation","text":"These three steps can be applied to give insight into the processes taking place during surface scattering and allow us to attempt to predict the experimentally observed change in the quantum numbers.","category":"page"},{"location":"initialconditions/ebk/","page":"Semiclassical EBK quantisation","title":"Semiclassical EBK quantisation","text":"A detailed yet approachable description of the theory is given by Andrew J. Larkoski, David G. Ellis, Lorenzo J. Curtis (2006) so we shall not delve into the theory here. Briefly, the procedure for a diatomic molecule involves an optimisation process to find the bounds of an integral, then computing the integral to obtain the vibrational quantum number. The rotational quantum number comes directly from the classical angular momentum of the molecule.","category":"page"},{"location":"initialconditions/ebk/","page":"Semiclassical EBK quantisation","title":"Semiclassical EBK quantisation","text":"Configurations can be generated by randomly selecting bond lengths from the appropriate probability distribution and selecting a matching radial velocity.","category":"page"},{"location":"initialconditions/ebk/#Example","page":"Semiclassical EBK quantisation","title":"Example","text":"","category":"section"},{"location":"initialconditions/ebk/","page":"Semiclassical EBK quantisation","title":"Semiclassical EBK quantisation","text":"In this example we will create a quantised distribution suitable for use as initial conditions for hydrogen scattering simulations.","category":"page"},{"location":"initialconditions/ebk/","page":"Semiclassical EBK quantisation","title":"Semiclassical EBK quantisation","text":"The simulation can be set up in the usual way, by specifying the atoms along with the model and the simulation cell.","category":"page"},{"location":"initialconditions/ebk/","page":"Semiclassical EBK quantisation","title":"Semiclassical EBK quantisation","text":"using NQCDynamics\nusing Unitful, UnitfulAtomic\n\natoms = Atoms([:H, :H])\nmodel = DiatomicHarmonic()\ncell = PeriodicCell(austrip.([5.883 -2.942 0; 0 5.095 0; 0 0 20] .* u\"Å\"))\nsim = Simulation(atoms, model; cell=cell)","category":"page"},{"location":"initialconditions/ebk/","page":"Semiclassical EBK quantisation","title":"Semiclassical EBK quantisation","text":"The distribution is generated using the QuantisedDiatomic.generate_configurations function. We have to provide the desired vibrational ν and rotational J quantum numbers, along with the number of samples and some other options as keyword arguments. In addition to the rotational and vibrational energy we have applied a translational impulse of 1 eV and positioned the molecule at a height of 10 bohr.","category":"page"},{"location":"initialconditions/ebk/","page":"Semiclassical EBK quantisation","title":"Semiclassical EBK quantisation","text":"using NQCDynamics.InitialConditions: QuantisedDiatomic\n\nν, J = 2, 0\nnsamples = 150\n\nconfigurations = QuantisedDiatomic.generate_configurations(sim, ν, J;\n samples=nsamples, translational_energy=1u\"eV\", height=10)","category":"page"},{"location":"initialconditions/ebk/","page":"Semiclassical EBK quantisation","title":"Semiclassical EBK quantisation","text":"The output contains both the positions and velocities, these can be passed directly to the DynamicalDistribution for use with dynamics. Here however, let's focus on the positions and visualise the distribution.","category":"page"},{"location":"initialconditions/ebk/","page":"Semiclassical EBK quantisation","title":"Semiclassical EBK quantisation","text":"This collects the x and y coordinate for each atom:","category":"page"},{"location":"initialconditions/ebk/","page":"Semiclassical EBK quantisation","title":"Semiclassical EBK quantisation","text":"r = last.(configurations)\nx = hcat([i[1,:] for i in r]...)\ny = hcat([i[2,:] for i in r]...)","category":"page"},{"location":"initialconditions/ebk/","page":"Semiclassical EBK quantisation","title":"Semiclassical EBK quantisation","text":"Now we can plot the distribution using CairoMakie","category":"page"},{"location":"initialconditions/ebk/","page":"Semiclassical EBK quantisation","title":"Semiclassical EBK quantisation","text":"using CairoMakie\n\nf = Figure()\nax = Axis(f[1,1], xlabel=\"x coordinate / bohr\", ylabel=\"y coordinate / bohr\")\nax.aspect = AxisAspect(1)\nhidedecorations!(ax; ticks=false, ticklabels=false, label=false)\n\nfor i=1:nsamples\n lines!([x[1,i], x[2,i]], [y[1,i], y[2,i]], linewidth=5, color=:black)\nend\n\ncolors = rand(nsamples)\nscatter!(x[1,:], y[1,:]; markersize=20, color=colors)\nscatter!(x[2,:], y[2,:]; markersize=20, color=colors)\n\nf","category":"page"},{"location":"initialconditions/ebk/","page":"Semiclassical EBK quantisation","title":"Semiclassical EBK quantisation","text":"Here we can see that the molecule is randomly distributed within the unit cell. Since we have used a harmonic potential, this could have been produced without using the EBK procedure, but this technique can use any arbitrary potential. In the hydrogen scattering example we build on this example and use the sample procedure to perform scattering simulations starting from this distribution.","category":"page"},{"location":"dynamicssimulations/dynamicssimulations/#dynamicssimulations","page":"Introduction","title":"Introduction","text":"","category":"section"},{"location":"dynamicssimulations/dynamicssimulations/","page":"Introduction","title":"Introduction","text":"Performing dynamics simulations is at the core of this package's functionality (as you might have guessed from the name). This section of the documentation will describe how to perform dynamics simulations, building on the introduction from Getting started.","category":"page"},{"location":"dynamicssimulations/dynamicssimulations/","page":"Introduction","title":"Introduction","text":"Since we use DifferentialEquations to perform the dynamics, it is most natural to split up the system parameters from the dynamics variables. This manifests itself as two separate data types: the Simulation, and the DynamicsVariables.","category":"page"},{"location":"dynamicssimulations/dynamicssimulations/","page":"Introduction","title":"Introduction","text":"info: Info\nIf you intend to implement a new dynamics method, we recommend reading DifferentialEquations.jl to understand more deeply how this package works.","category":"page"},{"location":"dynamicssimulations/dynamicssimulations/","page":"Introduction","title":"Introduction","text":"The Simulation holds all the static information about the system: the atoms, the model, the temperature, the cell and the dynamics method.","category":"page"},{"location":"dynamicssimulations/dynamicssimulations/","page":"Introduction","title":"Introduction","text":"using NQCDynamics # hide\natoms = Atoms(2000) # Single atom with mass = 2000 a.u.\nsim = Simulation{Ehrenfest}(atoms, TullyModelOne(); temperature=0, cell=InfiniteCell())","category":"page"},{"location":"dynamicssimulations/dynamicssimulations/","page":"Introduction","title":"Introduction","text":"Here we have initialised the simulation parameters, including the default temperature and cell explicitly. sim takes the place of the p parameter seen throughout DifferentialEquations.","category":"page"},{"location":"dynamicssimulations/dynamicssimulations/","page":"Introduction","title":"Introduction","text":"For DifferentialEquations to allow for a wide variety of solvers, the input arrays DynamicsVariables must be AbstractArrays. In nonadiabatic dynamics simulations, we usually have different groups of variables that behave in particular ways. For example: for mapping variable methods we have positions, velocities, and two sets of mapping variables representing the electronic degrees of freedom.","category":"page"},{"location":"dynamicssimulations/dynamicssimulations/","page":"Introduction","title":"Introduction","text":"For this purpose we use the ComponentVector, which allows us to arbitrarily partition the variables into their subgroups. This allows us to keep all the variables in a single array as required by DifferentialEquations, whilst still having them partitioned for convenient computation and readable code.","category":"page"},{"location":"dynamicssimulations/dynamicssimulations/","page":"Introduction","title":"Introduction","text":"v0 = hcat(10) / 2000\nr0 = hcat(-5)\nu0 = DynamicsVariables(sim, v0, r0, PureState(1))","category":"page"},{"location":"dynamicssimulations/dynamicssimulations/","page":"Introduction","title":"Introduction","text":"Since each dynamics method has a different set of variables, each method implements DynamicsVariables(sim, args...), which will convert the input into the correct structure. This helps to ensure each method follows a similar workflow, making it easy to switch between different methods. The output of this function takes the place of the u argument seen throughout DifferentialEquations.","category":"page"},{"location":"dynamicssimulations/dynamicssimulations/","page":"Introduction","title":"Introduction","text":"With both the Simulation and DynamicsVariables in hand, the central function is run_dynamics which allows us to perform a single dynamics trajectory. run_dynamics takes the simulation parameters sim and the initial conditions u0, along with a time span tspan that the trajectory will cover.","category":"page"},{"location":"dynamicssimulations/dynamicssimulations/","page":"Introduction","title":"Introduction","text":"tspan = (0.0, 2000.0)\nrun_dynamics(sim, tspan, u0; output=OutputDynamicsVariables, dt=1.0)","category":"page"},{"location":"dynamicssimulations/dynamicssimulations/","page":"Introduction","title":"Introduction","text":"The output is a dictionary containing entries for :Time and our requested output quantity. Output is a required keyword and the code will error unless at least one quantity is specified. By passing a Tuple to the output keyword argument we can ask for multiple quantities.","category":"page"},{"location":"dynamicssimulations/dynamicssimulations/","page":"Introduction","title":"Introduction","text":"out = run_dynamics(sim, tspan, u0; output=(OutputPosition, OutputAdiabaticPopulation), dt=1.0)","category":"page"},{"location":"dynamicssimulations/dynamicssimulations/","page":"Introduction","title":"Introduction","text":"The quantities that are available are listed here. More quantities can be added by defining new functions with the signature f(sol, i). The first argument is the DifferentialEquations.jl solution object and the second is the trajectory index.","category":"page"},{"location":"dynamicssimulations/dynamicssimulations/","page":"Introduction","title":"Introduction","text":"This time we can see that the output contains the two quantities that we asked for.","category":"page"},{"location":"dynamicssimulations/dynamicssimulations/","page":"Introduction","title":"Introduction","text":"using Plots\nplot(out, :OutputPosition)","category":"page"},{"location":"dynamicssimulations/dynamicssimulations/","page":"Introduction","title":"Introduction","text":"plot(out, :OutputAdiabaticPopulation)","category":"page"},{"location":"dynamicssimulations/dynamicssimulations/","page":"Introduction","title":"Introduction","text":"note: Note\nHere we have used a special plot recipe that will automatically plot any quantity against time. This is useful when investigating the results of a single trajectory.","category":"page"},{"location":"dynamicssimulations/dynamicssimulations/","page":"Introduction","title":"Introduction","text":"All of the dynamics methods work in a similar way. For details on a specific method along with examples, please see the method specific page in the sidebar under Dynamics methods.","category":"page"}] +[{"location":"examples/spinboson/#Ohmic-spin-boson-nonequilibrium-population-dynamics","page":"Ohmic spin-boson nonequilibrium population dynamics","title":"Ohmic spin-boson nonequilibrium population dynamics","text":"","category":"section"},{"location":"examples/spinboson/","page":"Ohmic spin-boson nonequilibrium population dynamics","title":"Ohmic spin-boson nonequilibrium population dynamics","text":"The spin-boson model is widely used as a model for condensed phase quantum dynamics. It is defined by a system-bath Hamiltonian where the system is a 2-state spin coupled to a bath of harmonic oscillators. This example shows how to perform nonequilibrium population dynamics with the spin-boson model using a bath characterised by the Ohmic spectral density. We will be using model B from the work of [22].","category":"page"},{"location":"examples/spinboson/","page":"Ohmic spin-boson nonequilibrium population dynamics","title":"Ohmic spin-boson nonequilibrium population dynamics","text":"Our boson bath will have 100 oscillators, each with a mass of 1. Here, we also set up the model with the ohmic density and the parameters that match up with our reference ([22]). The ohmic density is given a cutoff frequency of 2.5 and a Kondo parameter of 0.09. The model is symmetric, with the energy bias between states equal to 0.0, and the coupling between states set to 1.","category":"page"},{"location":"examples/spinboson/","page":"Ohmic spin-boson nonequilibrium population dynamics","title":"Ohmic spin-boson nonequilibrium population dynamics","text":"using NQCDynamics\nN = 100\natoms = Atoms(fill(1, N))\nβ = 5\nT = 1 / β\ndensity = OhmicSpectralDensity(2.5, 0.09)\nmodel = SpinBoson(density, N, 0.0, 1.0)\nnothing # hide","category":"page"},{"location":"examples/spinboson/#Initial-conditions","page":"Ohmic spin-boson nonequilibrium population dynamics","title":"Initial conditions","text":"","category":"section"},{"location":"examples/spinboson/","page":"Ohmic spin-boson nonequilibrium population dynamics","title":"Ohmic spin-boson nonequilibrium population dynamics","text":"For the initial conditions, we will sample directly from a Wigner distribution for the nuclear degrees of freedom. Since our nuclear degrees of freedom are harmonic, the Wigner distribution has an analytic form and we can use the distributions included in the package. The position and velocity variables we create here are Matrixs of Normal distributions, which are shaped to match the system size (1, N). Inside the DynamicalDistribution they will provide samples that match the size of the system. The initial electronic state is confined to 1 with PureState(1).","category":"page"},{"location":"examples/spinboson/","page":"Ohmic spin-boson nonequilibrium population dynamics","title":"Ohmic spin-boson nonequilibrium population dynamics","text":"position = reshape([PositionHarmonicWigner(ω, β, 1) for ω in model.ωⱼ], 1, :)\nvelocity = reshape([VelocityHarmonicWigner(ω, β, 1) for ω in model.ωⱼ], 1, :)\ndistribution = DynamicalDistribution(velocity, position, (1, 100)) * PureState(1)\nnothing # hide","category":"page"},{"location":"examples/spinboson/#Dynamics","page":"Ohmic spin-boson nonequilibrium population dynamics","title":"Dynamics","text":"","category":"section"},{"location":"examples/spinboson/","page":"Ohmic spin-boson nonequilibrium population dynamics","title":"Ohmic spin-boson nonequilibrium population dynamics","text":"Now that we have a distribution from which we can sample our initial conditions, we can run ensembles of trajectories and calculate the population correlation functions. Let's compare the results obtained using FSSH and Ehrenfest.","category":"page"},{"location":"examples/spinboson/","page":"Ohmic spin-boson nonequilibrium population dynamics","title":"Ohmic spin-boson nonequilibrium population dynamics","text":"fssh = Simulation{FSSH}(atoms, model)\nehrenfest = Simulation{Ehrenfest}(atoms, model)\n\nsaveat = 0:0.1:20\noutput = TimeCorrelationFunctions.PopulationCorrelationFunction(fssh, Diabatic())\nensemble_fssh = run_dynamics(fssh, (0.0, 20.0), distribution;\n saveat=saveat, trajectories=100, output, reduction=MeanReduction(), dt=0.1)\noutput = TimeCorrelationFunctions.PopulationCorrelationFunction(ehrenfest, Diabatic())\nensemble_ehrenfest = run_dynamics(ehrenfest, (0.0, 20.0), distribution;\n saveat=saveat, trajectories=100, output, reduction=MeanReduction(), dt=0.1)\nnothing # hide","category":"page"},{"location":"examples/spinboson/","page":"Ohmic spin-boson nonequilibrium population dynamics","title":"Ohmic spin-boson nonequilibrium population dynamics","text":"Here, we can see the population difference between the two states.","category":"page"},{"location":"examples/spinboson/","page":"Ohmic spin-boson nonequilibrium population dynamics","title":"Ohmic spin-boson nonequilibrium population dynamics","text":"using Plots\nplot(saveat, [p[1,1] - p[1,2] for p in ensemble_fssh[:PopulationCorrelationFunction]], label=\"FSSH\")\nplot!(saveat, [p[1,1] - p[1,2] for p in ensemble_ehrenfest[:PopulationCorrelationFunction]], label=\"Ehrenfest\")\nxlabel!(\"Time /a.u.\")\nylabel!(\"Population difference\")","category":"page"},{"location":"examples/spinboson/","page":"Ohmic spin-boson nonequilibrium population dynamics","title":"Ohmic spin-boson nonequilibrium population dynamics","text":"The exact result for this model, along with various mapping methods can be found in the work of [22]. We can see that even with just 100 trajectories, our Ehrenfest result closely matches theirs. The FSSH is quite clearly underconverged with only 100 trajectories due to the discontinuous nature of the individual trajectories. Feel free to try this for yourself and see what the converged FSSH result looks like!","category":"page"},{"location":"examples/tully_scattering/#examples-tully-model-two","page":"Scattering probabilities for TullyModelTwo","title":"Scattering probabilities for TullyModelTwo","text":"","category":"section"},{"location":"examples/tully_scattering/","page":"Scattering probabilities for TullyModelTwo","title":"Scattering probabilities for TullyModelTwo","text":"In this section we aim to reproduce the results of Fig. 5 from [1]. This figure presents the scattering outcomes when a particle interacts with Tully's model 2 with an increasing magnitude of incident kinetic energy.","category":"page"},{"location":"examples/tully_scattering/","page":"Scattering probabilities for TullyModelTwo","title":"Scattering probabilities for TullyModelTwo","text":"To reproduce this figure, first, let's set up our system parameters:","category":"page"},{"location":"examples/tully_scattering/","page":"Scattering probabilities for TullyModelTwo","title":"Scattering probabilities for TullyModelTwo","text":"using NQCDynamics\n\nsim = Simulation{FSSH}(Atoms(2000), TullyModelTwo())","category":"page"},{"location":"examples/tully_scattering/","page":"Scattering probabilities for TullyModelTwo","title":"Scattering probabilities for TullyModelTwo","text":"!!! note Atomic units","category":"page"},{"location":"examples/tully_scattering/","page":"Scattering probabilities for TullyModelTwo","title":"Scattering probabilities for TullyModelTwo","text":"Recall that all of are units are atomic by default, this mass of 2000 is similar to\nthat of a hydrogen atom.","category":"page"},{"location":"examples/tully_scattering/","page":"Scattering probabilities for TullyModelTwo","title":"Scattering probabilities for TullyModelTwo","text":"Each data point in the figure is obtained from an ensemble average of trajectories. We can use our Ensembles setup to run a set of trajectories for every single momentum value. Firstly, we can prepare the parts that will be the same for every ensemble:","category":"page"},{"location":"examples/tully_scattering/","page":"Scattering probabilities for TullyModelTwo","title":"Scattering probabilities for TullyModelTwo","text":"using ComponentArrays: ComponentVector\n\noutput = OutputStateResolvedScattering1D(sim, :adiabatic)","category":"page"},{"location":"examples/tully_scattering/","page":"Scattering probabilities for TullyModelTwo","title":"Scattering probabilities for TullyModelTwo","text":"Here, we are using the OutputStateResolvedScattering1D along with the MeanReduction which will give us the average scattering outcome from the entire ensemble. Each trajectory outputs the scattering outcome along with its final adiabatic state, and the reduction computes the average over all trajectories.","category":"page"},{"location":"examples/tully_scattering/","page":"Scattering probabilities for TullyModelTwo","title":"Scattering probabilities for TullyModelTwo","text":"Next, we can choose how many trajectories we want to perform for each ensemble, and choose the range of momentum values:","category":"page"},{"location":"examples/tully_scattering/","page":"Scattering probabilities for TullyModelTwo","title":"Scattering probabilities for TullyModelTwo","text":"trajectories = 500\nmomenta = 9:2:50","category":"page"},{"location":"examples/tully_scattering/","page":"Scattering probabilities for TullyModelTwo","title":"Scattering probabilities for TullyModelTwo","text":"note: Range notation\nHere we uses Julia's range operator to generate a set of values from 9 to 50 with a spacing of 2: 9, 11, 13, ..., 49. The final value of 50 is not included since a step size of 2 starting from 9 allows us to include only odd numbers.","category":"page"},{"location":"examples/tully_scattering/","page":"Scattering probabilities for TullyModelTwo","title":"Scattering probabilities for TullyModelTwo","text":"Since each ensemble requires different initial conditions, we will specify the trajectory timespan and the distribution inside the loop. Before the loop begins, we will create an empty list to store the results, and append to this list after every iteration. The distribution we create produces initial conditions where each trajectory has momentum k and starts at a position of -5. ","category":"page"},{"location":"examples/tully_scattering/","page":"Scattering probabilities for TullyModelTwo","title":"Scattering probabilities for TullyModelTwo","text":"result = []\nfor k in momenta # Iterate through each momentum value\n v = k / sim.atoms.masses[1] # Starting velocity\n r = -5 # Starting position\n tspan = (0, 2abs(r)/v)\n distribution = DynamicalDistribution(v, -5, size(sim)) * PureState(1, Adiabatic())\n\n out = run_dynamics(sim, tspan, distribution;\n saveat=tspan[end], trajectories, output, reduction=MeanReduction()\n )\n\n push!(result, out[:OutputStateResolvedScattering1D])\nend\n\nresult","category":"page"},{"location":"examples/tully_scattering/","page":"Scattering probabilities for TullyModelTwo","title":"Scattering probabilities for TullyModelTwo","text":"tip: Adaptive timespan\nSince the trajectories with larger momentum will exit the scattering region sooner, we scale the timespan to save computational time. Using tspan = (0, 2abs(r)/v) allows enough time such that a particle will be able to travel a total distance of 2r at a constant velocity of v. This is sufficient to ensure the particle has left the interaction region. Alternatively, we could define a callback to terminate the simulation early.","category":"page"},{"location":"examples/tully_scattering/","page":"Scattering probabilities for TullyModelTwo","title":"Scattering probabilities for TullyModelTwo","text":"Now we can plot our simulation results. We format this plot to match Fig. 3 from [18] which also reproduces Fig. 5 from [1]. We manage to reproduce the FSSH results quite accurately by visual comparison, though a larger number of trajectories would lead to better convergence. Since all of the examples run during the documentation build, we use a minimal number of trajectories to optimise the build time.","category":"page"},{"location":"examples/tully_scattering/","page":"Scattering probabilities for TullyModelTwo","title":"Scattering probabilities for TullyModelTwo","text":"using CairoMakie\n\nf = Figure()\nax = Axis(f[1,1], xlabel=\"Incident momentum / a.u.\", ylabel=\"Scattering probability\")\n\nr1 = [r.reflection[1] for r in result]\nt1 = [r.transmission[1] for r in result]\nt2 = [r.transmission[2] for r in result]\n\nscatter!(ax, momenta, r1; label=\"R1\", color=:red)\nscatter!(ax, momenta, t1; label=\"T1\", color=:green)\nscatter!(ax, momenta, t2; label=\"T2\", color=:blue)\naxislegend(ax)\n\nf","category":"page"},{"location":"examples/tully_scattering/","page":"Scattering probabilities for TullyModelTwo","title":"Scattering probabilities for TullyModelTwo","text":"As in [18], R1, T1, T2 refer to reflection on state 1, transmission on state 1 and transmission on state 2 respectively. For this model, surface hopping is successful in closely approximating the exact quantum result, especially at higher momentum values. Refer to [1] and [18] for a detailed discussion of the results.","category":"page"},{"location":"api/NQCModels/nninterfaces/#NNInterfaces","page":"NNInterfaces","title":"NNInterfaces","text":"","category":"section"},{"location":"api/NQCModels/nninterfaces/","page":"NNInterfaces","title":"NNInterfaces","text":"Modules=[NNInterfaces]","category":"page"},{"location":"api/NQCModels/nninterfaces/#NNInterfaces.H2AgModel","page":"NNInterfaces","title":"NNInterfaces.H2AgModel","text":"J. Phys. Chem. Lett. 2019, 10, 4962−4967 J. Phys. Chem. C 2020, 124, 186−195\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/frictionmodels/#FrictionModels","page":"FrictionModels","title":"FrictionModels","text":"","category":"section"},{"location":"api/NQCModels/frictionmodels/","page":"FrictionModels","title":"FrictionModels","text":"Modules=[NQCModels.FrictionModels]","category":"page"},{"location":"api/NQCModels/frictionmodels/#NQCModels.FrictionModels.ASEFrictionProvider","page":"FrictionModels","title":"NQCModels.FrictionModels.ASEFrictionProvider","text":"ASEFrictionProvider{A} <: ElectronicFrictionProvider\n\nObtain the electronic friction from an ASE calculator that implements get_friction_tensor. Assumes that the units of friction are \"eV/Å/Å\". Construct by passing the ase atoms object with the calculator already attached.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/frictionmodels/#NQCModels.FrictionModels.AdiabaticFrictionModel","page":"FrictionModels","title":"NQCModels.FrictionModels.AdiabaticFrictionModel","text":"AdiabaticFrictionModel <: AdiabaticModel\n\nAdiabaticFrictionModels must implement potential!, derivative!, and friction!\n\npotential! and friction! should be the same as for the AdiabaticModel.\n\nfriction! must fill an AbstractMatrix with size = (ndofs*natoms, ndofs*natoms).\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/frictionmodels/#NQCModels.FrictionModels.CompositeFrictionModel","page":"FrictionModels","title":"NQCModels.FrictionModels.CompositeFrictionModel","text":"CompositeFrictionModel{M,F} <: AdiabaticFrictionModel\n\nCombine an AdiabaticModel with an ElectronicFrictionProvider.\n\nThis allows for arbitrary composition of potentials and friction providers, such that any adiabatic model can be augmented with any form of electronic friction.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/frictionmodels/#NQCModels.FrictionModels.ElectronicFrictionProvider","page":"FrictionModels","title":"NQCModels.FrictionModels.ElectronicFrictionProvider","text":"ElectronicFrictionProvider\n\nAbstract type for defining models that provide electronic friction only. Subtypes of this should implement friction! and ndofs.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/frictionmodels/#NQCModels.FrictionModels.RandomFriction","page":"FrictionModels","title":"NQCModels.FrictionModels.RandomFriction","text":"RandomFriction <: ElectronicFrictionProvider\n\nProvide a random positive semi-definite matrix of friction values. Used mostly for testing and examples.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/frictionmodels/#NQCModels.FrictionModels.friction!","page":"FrictionModels","title":"NQCModels.FrictionModels.friction!","text":"friction!(model::AdiabaticFrictionModel, F, R:AbstractMatrix)\n\nFill F with the electronic friction as a function of the positions R.\n\nThis need only be implemented for AdiabaticFrictionModels.\n\n\n\n\n\n","category":"function"},{"location":"api/NQCModels/frictionmodels/#NQCModels.FrictionModels.friction-Tuple{NQCModels.FrictionModels.AdiabaticFrictionModel, Any}","page":"FrictionModels","title":"NQCModels.FrictionModels.friction","text":"friction(model::Model, R)\n\nObtain the friction for the current position R.\n\nThis is an allocating version of friction!.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/calculators/#Calculators","page":"Calculators","title":"Calculators","text":"","category":"section"},{"location":"api/NQCDynamics/calculators/","page":"Calculators","title":"Calculators","text":"Modules=[NQCDynamics.Calculators]","category":"page"},{"location":"api/NQCDynamics/calculators/#NQCDynamics.Calculators","page":"Calculators","title":"NQCDynamics.Calculators","text":"Calculators\n\nThis module exists to bridge the gap between the Models and the Dynamics.\n\nHere, we provide functions and types for evaluating and storing quantities obtained from the Models. In addition any further manipulation of those quantities, such as computing eigenvalues, is included here.\n\nThis module is largely needed to facilitate integration of both ring polymer and classical dynamics to allow using the same models and functions for both. Specific ring polymer types are provided that have the extra fields and methods needed to evaluate the quantities for each bead. \n\n\n\n\n\n","category":"module"},{"location":"api/NQCDynamics/calculators/#NQCDynamics.Calculators.quantities","page":"Calculators","title":"NQCDynamics.Calculators.quantities","text":"Each of the quantities specified here has functions: get_quantity(calculator, r) evaluate_quantity!(calculator, r)!\n\nThe user should access only the former. This will ensure quantities are correctly evaluated and cached accordingly.\n\nThe latter is called by the former and is where the details required to calculate the quantity are found.\n\n\n\n\n\n","category":"constant"},{"location":"api/NQCDynamics/calculators/#NQCDynamics.Calculators.AbstractCalculator","page":"Calculators","title":"NQCDynamics.Calculators.AbstractCalculator","text":"AbstractCalculator{M<:Model}\n\nTop-level type for all calculators.\n\nEach concrete calculator contains the Model and the fields to store the quantities obtained from the model.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDynamics/calculators/#NQCDynamics.Calculators.evaluate_nonadiabatic_coupling-Tuple{StaticArraysCore.SMatrix, StaticArraysCore.SVector}","page":"Calculators","title":"NQCDynamics.Calculators.evaluate_nonadiabatic_coupling","text":"References\n\nHammesSchifferTullyJChemPhys10146571994 Eq. (32)\nSubotnikBellonziAnnuRevPhyschem673872016, section 2.3\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/calculators/#NQCDynamics.Calculators.update_electronics!-Tuple{NQCDynamics.Calculators.AbstractDiabaticCalculator, AbstractArray}","page":"Calculators","title":"NQCDynamics.Calculators.update_electronics!","text":"Evaluates all electronic properties for the current position r.\n\nProperties evaluated:\n\nDiabatic potential\nDiabatic derivative\nEigenvalues and eigenvectors\nAdiabatic derivative\nNonadiabatic coupling\n\nThis should no longer be used, instead access the quantities directly with get_quantity(calc, r).\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#DynamicsMethods","page":"DynamicsMethods","title":"DynamicsMethods","text":"","category":"section"},{"location":"api/NQCDynamics/dynamicsmethods/","page":"DynamicsMethods","title":"DynamicsMethods","text":"Modules=[NQCDynamics.DynamicsMethods]","category":"page"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods","text":"This module contains functions and types necessary for performing nonadiabatic molecular dynamics.\n\nDynamics is performed using DifferentialEquations.jl. As such, this module is centered around the implementation of the functions necessary to integrate the dynamics.\n\nFor deterministic Hamiltonian methods, the central function is DynamicsMethods.motion!, which is the inplace form of the function to be integrated by DifferentialEquations.jl.\n\nFurther, methods that have discontinuities, such as surface hopping, use the callback interface provided by DifferentialEquations.jl.\n\n\n\n\n\n","category":"module"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.Method","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.Method","text":"Each type of dynamics subtypes Method which is passed to the AbstractSimulation as a parameter to determine the type of dynamics desired.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.DynamicsVariables-Tuple{NQCDynamics.AbstractSimulation, Any, Any}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.DynamicsVariables","text":"DynamicsVariables(::AbstractSimulation, args...)\n\nFor each dynamics method this function is implemented to provide the variables for the dynamics in the appropriate format.\n\nBy default, DynamicsVariables is set up for the classical case and takes sim, v, r as arguments and returns a ComponentVector(v=v, r=r) which is used as a container for the velocities and positions during classical dynamics.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.create_problem-Tuple{Any, Any, Any}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.create_problem","text":"Provides the DEProblem for each type of simulation.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.get_callbacks-Tuple{NQCDynamics.AbstractSimulation}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.get_callbacks","text":"Select the default callbacks for this simulation type.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.motion!","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.motion!","text":"motion!(du, u, sim, t)\n\nAs per DifferentialEquations.jl, this function is implemented for each method and defines the time derivatives of the DynamicalVariables.\n\nWe require that each implementation ensures du and u are subtypes of DynamicalVariables and sim subtypes AbstractSimulation.\n\n\n\n\n\n","category":"function"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.select_algorithm-Tuple{NQCDynamics.AbstractSimulation}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.select_algorithm","text":"Choose a default algorithm for solving the differential equation.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#ClassicalMethods","page":"DynamicsMethods","title":"ClassicalMethods","text":"","category":"section"},{"location":"api/NQCDynamics/dynamicsmethods/","page":"DynamicsMethods","title":"DynamicsMethods","text":"Modules=[NQCDynamics.DynamicsMethods.ClassicalMethods]","category":"page"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.ClassicalMethods.Classical","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.ClassicalMethods.Classical","text":"Classical <: DynamicsMethods.Method\n\nType for performing classical molecular dynamics.\n\nsim = Simulation{Classical}(Atoms(:H), Harmonic())\n\n# output\n\nSimulation{Classical}:\n Atoms{Float64}([:H], [1], [1837.4715941070515])\n Harmonic{Float64, Float64, Float64}\n m: Float64 1.0\n ω: Float64 1.0\n r₀: Float64 0.0\n dofs: Int64 1\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.ClassicalMethods.Langevin","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.ClassicalMethods.Langevin","text":"Type for performing Langevin molecular dynamics.\n\nusing Unitful\nsim = Simulation{Langevin}(Atoms(:H), Free(); γ=2.5, temperature=100u\"K\")\n\n# output\n\nSimulation{Langevin{Float64}}:\n Atoms{Float64}([:H], [1], [1837.4715941070515])\n Free(1)\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.ClassicalMethods.MDEF","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.ClassicalMethods.MDEF","text":"dr = v dt\ndv = -Delta UM dt - Gamma v dt + sigma sqrt2Gamma dW\n\nGamma is the friction tensor with units of inverse time. For thermal dynamics we set sigma = sqrtkT M, where T is the electronic temperature.\n\nThis is integrated using the BAOAB algorithm where the friction \"O\" step is performed in the tensor's eigenbasis. See src/dynamics/mdef_baoab.jl for details.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.ClassicalMethods.ThermalLangevin","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.ClassicalMethods.ThermalLangevin","text":"Type for performing Langevin ring polymer molecular dynamics.\n\nCurrently there are separate types for classical and ring polymer versions of Langevin dynamics but they should be combined. The reason they are not at the moment is that they use different integration algorithms and require slightly different fields.\n\nusing Unitful\nRingPolymerSimulation{ThermalLangevin}(Atoms(:H), Free(), 10; γ=0.1, temperature=25u\"K\")\n\n# output\n\nRingPolymerSimulation{ThermalLangevin{Float64}}:\n \n Atoms{Float64}([:H], [1], [1837.4715941070515])\n \n Free(1)\n with 10 beads.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.ClassicalMethods.acceleration!-Tuple{Any, Any, Any, NQCDynamics.AbstractSimulation, Any}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.ClassicalMethods.acceleration!","text":"f1 in DifferentialEquations.jl docs.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.ClassicalMethods.friction!-Tuple{Any, Any, NQCDynamics.AbstractSimulation{<:NQCDynamics.DynamicsMethods.ClassicalMethods.AbstractMDEF}, Any}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.ClassicalMethods.friction!","text":"friction!(g, r, sim, t)\n\nEvaluates friction tensor\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#MappingVariableMethods","page":"DynamicsMethods","title":"MappingVariableMethods","text":"","category":"section"},{"location":"api/NQCDynamics/dynamicsmethods/","page":"DynamicsMethods","title":"DynamicsMethods","text":"Modules=[NQCDynamics.DynamicsMethods.MappingVariableMethods]","category":"page"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.MappingVariableMethods.NRPMD","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.MappingVariableMethods.NRPMD","text":"NRPMD{T} <: DynamicsMethods.Method\n\nNonadiabatic ring polymer molecular dynamics Uses Meyer-Miller-Stock-Thoss mapping variables for electronic degrees of freedom and ring polymer formalism for nuclear degrees of freedom.\n\nRingPolymerSimulation{NRPMD}(Atoms(:H), DoubleWell(), 10)\n\n# output\n\nRingPolymerSimulation{NRPMD{Float64}}:\n \n Atoms{Float64}([:H], [1], [1837.4715941070515])\n \n DoubleWell{Int64, Int64, Int64, Int64}\n mass: Int64 1\n ω: Int64 1\n γ: Int64 1\n Δ: Int64 1\n \n with 10 beads.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.MappingVariableMethods.eCMM","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.MappingVariableMethods.eCMM","text":"eCMM{T} <: DynamicsMethods.Method\n\nReferences\n\n[25]\n[26]\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDynamics/dynamicsmethods/#SurfaceHoppingMethods","page":"DynamicsMethods","title":"SurfaceHoppingMethods","text":"","category":"section"},{"location":"api/NQCDynamics/dynamicsmethods/","page":"DynamicsMethods","title":"DynamicsMethods","text":"Modules=[NQCDynamics.DynamicsMethods.SurfaceHoppingMethods]","category":"page"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.SurfaceHoppingMethods","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.SurfaceHoppingMethods","text":"SurfaceHoppingMethods\n\nImplementation for surface hopping methods.\n\n\n\n\n\n","category":"module"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.AdiabaticIESH","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.AdiabaticIESH","text":"IESH{T} <: SurfaceHopping\n\nIndependent electron surface hopping.\n\nReferences\n\nShenvi, Roy, Tully, J. Chem. Phys. 130, 174107 (2009)\nRoy, Shenvi, Tully, J. Chem. Phys. 130, 174716 (2009)\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.BCME","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.BCME","text":"BCME{T} <: ClassicalMasterEquation\n\nExtension to CME that incorporates broadening in the potential energy surfaces.\n\nNote that we do not rescale the velocity as this is not mentioned only in the 2016 paper, not any of the later ones, so I presume they later decided not to do it and instead keep it the same as the original CME.\n\nDou, Subotnik, J. Chem. Phys. 144, 024116 (2016)\nDou, Subotnik, J. Phys. Chem. A, 24, 757-771 (2020)\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.CME","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.CME","text":"CME{T} <: ClassicalMasterEquation\n\nSimple surface hopping method for Newns-Anderson (Anderson-Holstein) models.\n\nDou, Nitzan, Subotnik, J. Chem. Phys. 142, 084110 (2015)\nDou, Subotnik, J. Phys. Chem. A, 24, 757-771 (2020)\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.DecoherenceCorrectionEDC","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.DecoherenceCorrectionEDC","text":"DecoherenceCorrectionEDC{T}\n\nEnergy decoherence correction of Granucci and Persico in J. Chem. Phys. 126, 134114 (2007).\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.FSSH","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.FSSH","text":"FSSH{T} <: SurfaceHopping\n\nType for fewest-switches surface hopping\n\nSimulation{FSSH}(Atoms(:H), Free())\n\n# output\n\nSimulation{FSSH{Float64}}:\n Atoms{Float64}([:H], [1], [1837.4715941070515])\n Free(1)\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.SurfaceHopping","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.SurfaceHopping","text":"Abstract type for all surface hopping methods.\n\nSurface hopping methods follow the structure set out in this file. The nuclear and electronic variables are propagated by the motion! function. The surface hopping procedure is handled by the HoppingCallback which uses the functions check_hop! and execute_hop! as its condition and affect!.\n\nTo add a new surface hopping scheme, you must create a new struct and define methods for evaluate_hopping_probability!, select_new_state, and rescale_velocity!.\n\nSee fssh.jl for an example implementation.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.apply_decoherence_correction!-Union{Tuple{T}, Tuple{AbstractVector, NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.DecoherenceCorrectionEDC, Integer, T, AbstractVector, T}} where T","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.apply_decoherence_correction!","text":"Eq. 17 in J. Chem. Phys. 126, 134114 (2007)\n\nModify the wavefunction coefficients in ψ after a successful surface hop.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.calculate_Akj-Tuple{NQCDynamics.AbstractSimulation{<:NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.AbstractIESH}, AbstractMatrix, AbstractMatrix, Number, Vector}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.calculate_Akj","text":"Equation 17 in Shenvi, Roy, Tully 2009. Uses equations 19 and 20.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.calculate_a-Tuple{NQCDynamics.AbstractSimulation{<:NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.SurfaceHopping}, AbstractMatrix}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.calculate_a","text":"calculate_a(sim::AbstractSimulation{<:SurfaceHopping}, coupling::AbstractMatrix)\n\nEquation 40 from [27].\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.calculate_b-Tuple{AbstractMatrix, AbstractMatrix}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.calculate_b","text":"calculate_b(coupling::AbstractMatrix, velocity::AbstractMatrix)\n\nEquation 41 from [27].\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.compute_overlap!-Tuple{NQCDynamics.AbstractSimulation{<:AdiabaticIESH}, Matrix, Any, Any}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.compute_overlap!","text":"Equation 20 in Shenvi, Roy, Tully 2009.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.evaluate_broadening-NTuple{5, Any}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.evaluate_broadening","text":"evaluate_broadening(h, μ, β, Γ)\n\nEvaluate the convolution of the Fermi function with a Lorentzian.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.evaluate_hopping_probability!-Tuple{NQCDynamics.AbstractSimulation{<:FSSH}, Any, Any}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.evaluate_hopping_probability!","text":"evaluate_hopping_probability!(sim::Simulation{<:FSSH}, u, dt)\n\nEvaluates the probability of hopping from the current state to all other states\n\nImplementation\n\nσ is Hermitan so the choice σ[m,s] or σ[s,m] is irrelevant; we take the real part.\n'd' is skew-symmetric so here the indices are important.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.evaluate_hopping_probability!-Tuple{NQCDynamics.AbstractSimulation{<:NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.AbstractIESH}, Any, Any, Any}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.evaluate_hopping_probability!","text":"Hopping probability according to equation 21 in Shenvi, Roy, Tully 2009.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.evaluate_hopping_probability!-Tuple{NQCDynamics.AbstractSimulation{<:NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.SurfaceHopping}, Any, Any}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.evaluate_hopping_probability!","text":"This function should set the field sim.method.hopping_probability.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.extract_nonadiabatic_coupling-Tuple{Any, Any, Any}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.extract_nonadiabatic_coupling","text":"extract_nonadiabatic_coupling(coupling, new_state, old_state)\n\nExtract the nonadiabatic coupling vector between states new_state and old_state\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.iesh_diabatic_population-Tuple{AbstractMatrix, AbstractMatrix, AbstractVector}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.iesh_diabatic_population","text":"Calculate the diabatic population in J. Chem. Theory Comput. 2022, 18, 4615−4626. Eqs. 12, 13 and 14 describe the steps to calculat it though the code is written to use matrix operations instead of summations to calculate the result.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.perform_rescaling!-Tuple{NQCDynamics.AbstractSimulation{<:NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.SurfaceHopping}, Any, Any, Any}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.perform_rescaling!","text":"perform_rescaling!(\n sim::AbstractSimulation{<:SurfaceHopping}, velocity, velocity_rescale, d\n)\n\nEquation 33 from [27].\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.rescale_velocity!-Tuple{NQCDynamics.AbstractSimulation{<:NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.SurfaceHopping}, Any}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.rescale_velocity!","text":"rescale_velocity!(sim::AbstractSimulation{<:SurfaceHopping}, u)::Bool\n\nRescale the velocity in the direction of the nonadiabatic coupling.\n\nReferences\n\n[27]\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.select_new_state-Tuple{NQCDynamics.AbstractSimulation{<:NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.SurfaceHopping}, Any}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.select_new_state","text":"This function should return the desired state determined by the probability. Should return the original state if no hop is desired.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.unpack_states-Tuple{NQCDynamics.AbstractSimulation{<:FSSH}}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.unpack_states","text":"unpack_states(sim)\n\nGet the two states that we are hopping between.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsUtils.acceleration!-Tuple{Any, Any, Any, Simulation{<:NQCDynamics.DynamicsMethods.SurfaceHoppingMethods.AbstractIESH}, Any, Any}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsUtils.acceleration!","text":"Set the acceleration due to the force from the currently occupied states. See Eq. 12 of Shenvi, Tully JCP 2009 paper.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsUtils.set_quantum_derivative!-Tuple{Any, Any, NQCDynamics.AbstractSimulation{<:AdiabaticIESH}}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsUtils.set_quantum_derivative!","text":"Propagation of electronic wave function happens according to Eq. (14) in the Shenvi, Tully paper (JCP 2009)\n\nIn IESH each electron is independent so we can loop through electrons and set the derivative one at a time, in the standard way for FSSH.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#EhrenfestMethods","page":"DynamicsMethods","title":"EhrenfestMethods","text":"","category":"section"},{"location":"api/NQCDynamics/dynamicsmethods/","page":"DynamicsMethods","title":"DynamicsMethods","text":"Modules=[NQCDynamics.DynamicsMethods.EhrenfestMethods]","category":"page"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.EhrenfestMethods.AbstractEhrenfest","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.EhrenfestMethods.AbstractEhrenfest","text":"Abstract type for Ehrenfest method.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.EhrenfestMethods.Ehrenfest","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.EhrenfestMethods.Ehrenfest","text":"Ehrenfest{T} <: AbstractEhrenfest\n\nEhrenfest molecular dynamics. Classical molecular dynamics where the force is derived by averaging contributions from multiple electronic states.\n\nSimulation{Ehrenfest}(Atoms(:H), DoubleWell())\n\n# output\n\nSimulation{Ehrenfest{Float64}}:\n Atoms{Float64}([:H], [1], [1837.4715941070515])\n DoubleWell{Int64, Int64, Int64, Int64}\n mass: Int64 1\n ω: Int64 1\n γ: Int64 1\n Δ: Int64 1\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDynamics/dynamicsmethods/#IntegrationAlgorithms","page":"DynamicsMethods","title":"IntegrationAlgorithms","text":"","category":"section"},{"location":"api/NQCDynamics/dynamicsmethods/","page":"DynamicsMethods","title":"DynamicsMethods","text":"Modules=[NQCDynamics.DynamicsMethods.IntegrationAlgorithms]","category":"page"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.IntegrationAlgorithms.MInt","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.IntegrationAlgorithms.MInt","text":"MInt <: OrdinaryDiffEq.OrdinaryDiffEqAlgorithm\n\nSecond order symplectic momentum integral algorithm.\n\nReference\n\nJ. Chem. Phys. 148, 102326 (2018)\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.IntegrationAlgorithms.RingPolymerMInt","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.IntegrationAlgorithms.RingPolymerMInt","text":"RingPolymerMInt <: OrdinaryDiffEq.OrdinaryDiffEqAlgorithm\n\nSecond order symplectic momentum integral algorithm applied to NRPMD.\n\nReference\n\nJ. Chem. Phys. 148, 102326 (2018)\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.IntegrationAlgorithms.get_C_propagator-Tuple{AbstractVector, AbstractMatrix, Real}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.IntegrationAlgorithms.get_C_propagator","text":"Get the C propagator for the mapping variables.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.IntegrationAlgorithms.get_D_propagator-Tuple{AbstractVector, AbstractMatrix, Real}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.IntegrationAlgorithms.get_D_propagator","text":"Get the D propagator for the mapping variables.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.IntegrationAlgorithms.get_gamma-Tuple{AbstractMatrix, AbstractVector, Real}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.IntegrationAlgorithms.get_gamma","text":"Get the Γ variable used to calculate the nuclear propagators.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.IntegrationAlgorithms.get_mapping_nuclear_force-Tuple{AbstractVector, AbstractVector, AbstractMatrix, AbstractMatrix, Any}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.IntegrationAlgorithms.get_mapping_nuclear_force","text":"Get the force due to the mapping variables.\n\nEquivalent to this but doesn't allocate: return 0.5 * (q'Eq + p'Ep) - q'Fp\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.IntegrationAlgorithms.get_mapping_nuclear_force-Tuple{AbstractVector, AbstractVector, AbstractMatrix, AbstractMatrix}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.IntegrationAlgorithms.get_mapping_nuclear_force","text":"Get the force due to the mapping variables.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.IntegrationAlgorithms.get_xi-Tuple{AbstractMatrix, AbstractVector, Real}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.IntegrationAlgorithms.get_xi","text":"Get the Ξ variable used to calculate the nuclear propagators.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.IntegrationAlgorithms.set_C_propagator!-Tuple{Any, Any, LinearAlgebra.Eigen, Real}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.IntegrationAlgorithms.set_C_propagator!","text":"Get the C propagator for the mapping variables.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.IntegrationAlgorithms.set_D_propagator!-Tuple{Any, Any, LinearAlgebra.Eigen, Real}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.IntegrationAlgorithms.set_D_propagator!","text":"Get the D propagator for the mapping variables.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.IntegrationAlgorithms.set_gamma!-Tuple{AbstractMatrix, AbstractMatrix, AbstractVector, Real}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.IntegrationAlgorithms.set_gamma!","text":"Get the Γ variable used to calculate the nuclear propagators.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsmethods/#NQCDynamics.DynamicsMethods.IntegrationAlgorithms.set_xi!-Tuple{AbstractMatrix, AbstractMatrix, AbstractVector, Real}","page":"DynamicsMethods","title":"NQCDynamics.DynamicsMethods.IntegrationAlgorithms.set_xi!","text":"Get the Ξ variable used to calculate the nuclear propagators.\n\n\n\n\n\n","category":"method"},{"location":"dynamicssimulations/dynamicsmethods/langevin/#langevin-dynamics","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"","category":"section"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"Langevin dynamics can be used to sample the canonical ensemble for a classical system. Langevin dynamics are based on classical equations of motion that are modified by an additional drag force and a random force. The Langevin equation of motion can be written as","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"mathbfMddotmathbfR = - nabla_R V(mathbfR) + mathbfF(t) - gamma dotmathbfR","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"where mathbfM are the masses, ddotmathbfR the time-derivative of the positions, i.e., the velocities, nabla_R V(mathbfR) the gradient of the potential and mathbfF(t) the random force that is related to the friction coefficient gamma by the second fluctuation-dissipation theorem.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"Equally the above equation can be written in the form of Ito stochastic differential equations [7]","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"beginaligned\ndmathbfR = mathbfM^-1 mathbfP dt\ndmathbfP = -nabla V(mathbfR) - gamma mathbfP dt\n+ sigma mathbfM^12 dmathbfW\nendaligned","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"where sigma = sqrt2gammabeta and mathbfW is a vector of N independent Wiener processes. As usual, mathbfP is the vector of particle momenta and mathbfM their diagonal mass matrix.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"note: Stochastic differential equations\nThere are two mathematical frameworks for handling stochastic differential equations, developed by Ruslan Stratonovich and Kiyosi Ito. To learn about the difference between the two in a physical context refer to [8].","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"As a stochastic differential equation, these two can be integrated immediately using StochasticDiffEq provided by DifferentialEquations, which offers a variety of stochastic solvers. It is possible to exploit the dynamical structure of the differential equations by splitting the integration steps into parts that can be solved exactly. In this context, it has been shown that the BAOAB method from [7] achieves good accuracy compared to other similar algorithms and this algorithm is used here as the default.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/#Example","page":"Classical Langevin dynamics","title":"Example","text":"","category":"section"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"Using Langevin dynamics we can sample the canonical ensemble for a simple harmonic oscillator and investigate the energy expectation values.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"Firstly we set up our system parameters. Here, we have two atoms in a harmonic potential at a temperature of 1e-3. We have arbitrarily chosen the dissipation constant gamma = 1, this can be tuned for optimal sampling in more complex systems. ","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"using NQCDynamics\nusing Unitful\n\natoms = Atoms([:H, :C])\ntemperature = 1e-3\nsim = Simulation{Langevin}(atoms, Harmonic(m=atoms.masses[1]); γ=1, temperature)","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"note: Atomic units\nAs usual, all quantities are in atomic units by default.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"Here we can generate a simple starting configuration with zeros for every degree of freedom.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"u = DynamicsVariables(sim, zeros(size(sim)), zeros(size(sim)))","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"Running the dynamics proceeds by providing all the parameters along with any extra keywords. This time we have requested both the positions and velocities to be outputted and have selected a timestep dt. Since the default algorithm is a fixed timestep algorithm an error will be thrown if a timestep is not provided.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"traj = run_dynamics(sim, (0.0, 2000.0), u; output=(OutputPosition, OutputVelocity), dt=0.5)","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"Here, we plot the positions of our two atoms throughout the simulation.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"using Plots\nplot(traj, :OutputPosition, label=[\"Hydrogen\" \"Carbon\"], legend=true)","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"We next plot the velocities. Notice how the carbon atom with its heavier mass has a smaller magnitude throughout.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"plot(traj, :OutputVelocity, label=[\"Hydrogen\" \"Carbon\"], legend=true)","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"Using the configurations from the Langevin simulation we can obtain expectation values along the trajectories. This can be done manually, but we provide the Estimators module to make this as simple as possible.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"!!! note Estimators","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"[Here](@ref `Estimators`) you can find the available quantities that [`Estimators`](@ref) provides.\nTo add new quantities, you must implement a new function inside `src/Estimators.jl`.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"Let's find the expectation for the potential energy during our simulation. This is the potential energy of the final configuration in the simulation:","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"Estimators.potential_energy(sim, traj[:OutputPosition][end])","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"We could evaluate this for every configuration and average it manually. Fortunately however, we have the @estimate macro that will do this for us:","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"Estimators.@estimate potential_energy(sim, traj[:OutputPosition])","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"tip: Tip\nWe can verify this result by comparing to the equipartition theorem which states that each quadratic degree of freedom should contribute frac12kT to the total energy. As this is a harmonic system, this gives us the exact classical potential energy expectation as equal to the temperature, since we have two degrees of freedom and we are in atomic units.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"Similarly, we can evaluate the kinetic energy expectation with:","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"Estimators.@estimate kinetic_energy(sim, traj[:OutputVelocity])","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/langevin/","page":"Classical Langevin dynamics","title":"Classical Langevin dynamics","text":"Again, this takes a similar value since the total energy is evenly split between the kinetic and potential for a classical harmonic system.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/mdef/#mdef-dynamics","page":"Molecular dynamics with electronic friction (MDEF)","title":"Molecular dynamics with electronic friction (MDEF)","text":"","category":"section"},{"location":"dynamicssimulations/dynamicsmethods/mdef/#Introduction","page":"Molecular dynamics with electronic friction (MDEF)","title":"Introduction","text":"","category":"section"},{"location":"dynamicssimulations/dynamicsmethods/mdef/","page":"Molecular dynamics with electronic friction (MDEF)","title":"Molecular dynamics with electronic friction (MDEF)","text":"A set of fundamental and technologically relevant chemical processes (surface scattering, dissociative chemisorption, surface diffusion, recombinative desorption, etc.) are often catalyzed at the metal surface of several late transition metals (Au, Ag, Cu, Pt, Pd, Rh, etc). These metallic surfaces, unlike other surfaces, are characterized by a dense manifold of electronic states at the Fermi level, which produce continuous conduction and valence bands without a band gap. A theoretical description of the chemical processes at these metal surfaces is often challenging due to the Born-Oppenheimer (BO) approximation no longer being valid. With the breakdown of the Born-Oppenheimer approximation, nonadiabatic effects have to be considered to describe, e.g., the energy exchange that can take place between adsorbate and substrate degrees of freedom (DOF).","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/mdef/","page":"Molecular dynamics with electronic friction (MDEF)","title":"Molecular dynamics with electronic friction (MDEF)","text":"A fully quantum dynamical approach of this complex scenario is currently unfeasible and the gas-surface reaction dynamics are often described using quasi-classical methods where nuclear motion is described classically. Molecular dynamics with electronic friction (MDEF) is one of main methods used to deal with the nonadiabaticity in gas-surface chemical reactions. MDEF has been widely employed to decribe and simulate the nuclear dynamics in several molecular systems. It is a theoretical model based on a ground-state Langevin equation of motion which introduces nonadiabatic effects by using frictional and stochastic forces. This approach was originally introduced by Head-Gordon and Tully and the nonadiabatic effects can be included through different electronic friction models (see section below, LDFA and TDPT). The nuclear coordinates of the adsorbate atoms evolve as follows:","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/mdef/","page":"Molecular dynamics with electronic friction (MDEF)","title":"Molecular dynamics with electronic friction (MDEF)","text":"mathbfMddotmathbfR = - nabla_R V(mathbfR) + mathbfF(t) - Gamma(mathbfR) dotmathbfR","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/mdef/","page":"Molecular dynamics with electronic friction (MDEF)","title":"Molecular dynamics with electronic friction (MDEF)","text":"The first term on the right hand side of the equation corresponds to a conservative force associated with the potential energy surface (PES) as in the adiabatic case. The third term is the friction force and it comes from multiplication between the electronic friction object (Gamma(mathbfR)) and the velocity. Finally, the second term is a temperature and friction-dependent stochastic force which ensures detailed balance.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/mdef/","page":"Molecular dynamics with electronic friction (MDEF)","title":"Molecular dynamics with electronic friction (MDEF)","text":"This figure shows an atom moving near a metal surface M_A. When the atom moves into the region of electron density rho_0^M_A it experiences the forces described above. (Image: ldfa motion)","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/mdef/#Simple-example","page":"Molecular dynamics with electronic friction (MDEF)","title":"Simple example","text":"","category":"section"},{"location":"dynamicssimulations/dynamicsmethods/mdef/","page":"Molecular dynamics with electronic friction (MDEF)","title":"Molecular dynamics with electronic friction (MDEF)","text":"We can explore the MDEF concept first by introducing a model system with non-physical parameters. This will demonstrate the general format and expected results from an MDEF simulation which can explore further in later sections using realistic systems.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/mdef/","page":"Molecular dynamics with electronic friction (MDEF)","title":"Molecular dynamics with electronic friction (MDEF)","text":"Here, we model a single hydrogen atom in a harmonic potential, where the electronic temperature is 300 K. The CompositeFrictionModel allows us to combine any AdiabaticModel with an ElectronicFrictionProvider that will add electronic friction to an otherwise adiabatic system. RandomFriction is used for demonstration purposes only and provides a matrix of random numbers to use in place of the friction.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/mdef/","page":"Molecular dynamics with electronic friction (MDEF)","title":"Molecular dynamics with electronic friction (MDEF)","text":"using NQCDynamics\nusing Unitful\n\natoms = Atoms([:H])\nmodel = CompositeFrictionModel(Harmonic(dofs=3), RandomFriction(3))\nsim = Simulation{MDEF}(atoms, model; temperature=300u\"K\")","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/mdef/","page":"Molecular dynamics with electronic friction (MDEF)","title":"Molecular dynamics with electronic friction (MDEF)","text":"For simplicity, we initialise the system with zero velocity and position for each degree of freedom:","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/mdef/","page":"Molecular dynamics with electronic friction (MDEF)","title":"Molecular dynamics with electronic friction (MDEF)","text":"z = DynamicsVariables(sim, zeros(size(sim)), zeros(size(sim)))","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/mdef/","page":"Molecular dynamics with electronic friction (MDEF)","title":"Molecular dynamics with electronic friction (MDEF)","text":"With these parameters, we can run a single trajectory and visualise the total energy as a function of time.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/mdef/","page":"Molecular dynamics with electronic friction (MDEF)","title":"Molecular dynamics with electronic friction (MDEF)","text":"using Plots\n\nsolution = run_dynamics(sim, (0.0, 100u\"fs\"), z, dt=0.5u\"fs\", output=OutputTotalEnergy)\nplot(solution, :OutputTotalEnergy)","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/mdef/","page":"Molecular dynamics with electronic friction (MDEF)","title":"Molecular dynamics with electronic friction (MDEF)","text":"note: Note\n:hamiltonian in the output tuple refers to the classical Hamiltonian that generates the classical equations of motion. Since we are performing MDEF we see that the total energy fluctuates.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/mdef/","page":"Molecular dynamics with electronic friction (MDEF)","title":"Molecular dynamics with electronic friction (MDEF)","text":"Now let's see what happens if we make the electronic temperature a function of time. For any simulation, temperature can be provided as a time-dependent function which allows variable temperature simulations. In the context of MDEF, this temperature can be used to represent the use of lasers to provide extra energy to the electrons in the metal.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/mdef/","page":"Molecular dynamics with electronic friction (MDEF)","title":"Molecular dynamics with electronic friction (MDEF)","text":"temperature_function(t) = exp(-(t - 50u\"fs\")^2 / 20u\"fs^2\") * 300u\"K\"\nnothing # hide","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/mdef/","page":"Molecular dynamics with electronic friction (MDEF)","title":"Molecular dynamics with electronic friction (MDEF)","text":"warning: Warning\nThe time argument enters this function as a Unitful.jl quantity, and it is important to make sure the unit of the return value is temperature.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/mdef/","page":"Molecular dynamics with electronic friction (MDEF)","title":"Molecular dynamics with electronic friction (MDEF)","text":"Now we can re-simulate, replacing the fixed temperature with the function we have defined.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/mdef/","page":"Molecular dynamics with electronic friction (MDEF)","title":"Molecular dynamics with electronic friction (MDEF)","text":"sim = Simulation{MDEF}(atoms, model; temperature=temperature_function)\nsolution = run_dynamics(sim, (0.0, 100u\"fs\"), z, dt=0.5u\"fs\",\n output=OutputTotalEnergy)\nplot(solution, :OutputTotalEnergy)","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/mdef/","page":"Molecular dynamics with electronic friction (MDEF)","title":"Molecular dynamics with electronic friction (MDEF)","text":"This time we see a peak in the energy in the middle of the simulation which coincides with the peak in temperature at 50 fs. Having viewed this simple example, we can now explore the different ways the friction coefficient can be obtained from ab initio simulations. ","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/mdef/#Local-density-friction-approximation-(LDFA)","page":"Molecular dynamics with electronic friction (MDEF)","title":"Local density friction approximation (LDFA)","text":"","category":"section"},{"location":"dynamicssimulations/dynamicsmethods/mdef/","page":"Molecular dynamics with electronic friction (MDEF)","title":"Molecular dynamics with electronic friction (MDEF)","text":"Local density friction approximation (LDFA) is a theoretical model which describes the electronic friction Gamma(mathbfR) term in the above equation based on the local electron density of the metal substrate. This approximation assumes a scalar friction coefficient (Gamma(R_i)) for each adsorbate atom. The underlying assumption to this approximation is that any atom only sees an anisotropic (scalar) density that only depends on the local surroundings. In the LDFA theoretical framework the above equation of motion is used, except the friction matrix is diagonal, each element coming from the local density of each atom.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/mdef/","page":"Molecular dynamics with electronic friction (MDEF)","title":"Molecular dynamics with electronic friction (MDEF)","text":"In our current LDFA implementation, a set of pre-calculated electronic friction coefficients (eta_ei) computed at different Wigner-Seitz radius (r_s) are used to fit and get an analytical expression to connect any r_s values with an single electronic friction coefficient by means of cubic Spline functions. The Wigner-Sietz radius is connected to the metal substrate electron density by the following equation, ","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/mdef/","page":"Molecular dynamics with electronic friction (MDEF)","title":"Molecular dynamics with electronic friction (MDEF)","text":" r_s(rho) = (frac34pi rho (mathbfr_i))^13","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/mdef/","page":"Molecular dynamics with electronic friction (MDEF)","title":"Molecular dynamics with electronic friction (MDEF)","text":"In this way, the electron density associated with the current substrate atom position is used to compute the respective friction coefficient through fitting function for each point of the trajectory. Visit the CubeLDFAModel.jl to learn more about how this is evaluated.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/mdef/#Time-dependent-Perturbation-theory-(TDPT)","page":"Molecular dynamics with electronic friction (MDEF)","title":"Time-dependent Perturbation theory (TDPT)","text":"","category":"section"},{"location":"dynamicssimulations/dynamicsmethods/mdef/","page":"Molecular dynamics with electronic friction (MDEF)","title":"Molecular dynamics with electronic friction (MDEF)","text":"A more general formulation of the electronic friction object was also developed under the umbrella of electronic friction tensor(EFT) or orbital-dependent electronic friction (ODF) approaches. Both formulations are essentially equivalent and they incorporate the isotropy nature of the electronic friction object by a multidimentional tensor (Lambda_ij) instead of a single coefficient as usually computed at LDFA level. The electronic friction elements can be computed by first-principle calculations in the context of first-order time-dependent perturbation theory (TDPT) at the density functional theory (DFT) level. Each electronic friction tensor (EFT) elements corresponds to relaxation rate due to electron-nuclear coupling along the Cartesian coordinate i due to motion in the j direction. The electronic friction tensor elements can be computed by using the Fermi's golden rule. Lambda_ij is an object with (3Ntimes3N)-dimension where N is often the total number of adsorbate atoms considered explicitly on the study system. View the friction models page to learn about how this can be used.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/mdef/","page":"Molecular dynamics with electronic friction (MDEF)","title":"Molecular dynamics with electronic friction (MDEF)","text":"tip: TDPT friction and LDFA in action?\nIf you would like to see an example using both LDFA and TDPT during full dimensional dynamics, refer to the reactive scattering example.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/ehrenfest/#ehrenfest-dynamics","page":"Ehrenfest molecular dynamics","title":"Ehrenfest molecular dynamics","text":"","category":"section"},{"location":"dynamicssimulations/dynamicsmethods/ehrenfest/","page":"Ehrenfest molecular dynamics","title":"Ehrenfest molecular dynamics","text":"The Ehrenfest method is a mixed quantum-classical dynamics method in which the total wavefunction is factorized into slow (nuclear) variables, which are treated classically, and fast ones (electrons) which remain quantum-mechanical. In the Ehrenfest method, nuclei move according to classical mechanics on a potential energy surface given by the expectation value of the electronic Hamiltonian. ","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/ehrenfest/","page":"Ehrenfest molecular dynamics","title":"Ehrenfest molecular dynamics","text":"The time dependence of the electronic wavefunction is expanded into an adiabatic basis and follows the time-dependent Schr\\\"odinger equation.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/ehrenfest/","page":"Ehrenfest molecular dynamics","title":"Ehrenfest molecular dynamics","text":"ihbar dotc_i(t) = V_i(mathbfR) c_i (t)\n- ihbar sum_j dotmathbfR cdot mathbfd_ij(mathbfR)c_j(t)","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/ehrenfest/#Example","page":"Ehrenfest molecular dynamics","title":"Example","text":"","category":"section"},{"location":"dynamicssimulations/dynamicsmethods/ehrenfest/","page":"Ehrenfest molecular dynamics","title":"Ehrenfest molecular dynamics","text":"Below the example of the Ehrenfest implementation is presented, using model from [5].","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/ehrenfest/","page":"Ehrenfest molecular dynamics","title":"Ehrenfest molecular dynamics","text":"At the start, we assign atoms and initialise the simulation using the mass and model from NQCModels.jl.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/ehrenfest/","page":"Ehrenfest molecular dynamics","title":"Ehrenfest molecular dynamics","text":"using NQCDynamics\n\natoms = Atoms(1980)\nsim = Simulation{Ehrenfest}(atoms, AnanthModelOne())","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/ehrenfest/","page":"Ehrenfest molecular dynamics","title":"Ehrenfest molecular dynamics","text":"Next, the initial distribution is created:","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/ehrenfest/","page":"Ehrenfest molecular dynamics","title":"Ehrenfest molecular dynamics","text":"using Distributions\ne = 0.03\nk = sqrt(e*2*atoms.masses[1])\nr = Normal(-5, 1/sqrt(0.25))\nv = k / atoms.masses[1]\ndistribution = DynamicalDistribution(v, r, size(sim))* PureState(1, Adiabatic())","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/ehrenfest/","page":"Ehrenfest molecular dynamics","title":"Ehrenfest molecular dynamics","text":"To run an ensemble simulation we additionally choose number of trajectories n_traj and timespan tspan and we pass all the established settings to the run_dynamics function. In this example we output velocities by specifying output=OutputVelocity and store the final values in the final_velocities array. Following that, we calculate final momenta.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/ehrenfest/","page":"Ehrenfest molecular dynamics","title":"Ehrenfest molecular dynamics","text":"n_traj = 10\ntspan = (0.0, 3000.0)\nsolution = run_dynamics(sim, tspan, distribution; \n trajectories=n_traj, output=OutputVelocity, dt=1.0)\nfinal_velocities = [r[:OutputVelocity][end] for r in solution]\nmomenta = reduce(vcat, final_velocities*atoms.masses[1])","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/ehrenfest/","page":"Ehrenfest molecular dynamics","title":"Ehrenfest molecular dynamics","text":"Resulting momenta can be plotted by using StatsPlots package.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/ehrenfest/","page":"Ehrenfest molecular dynamics","title":"Ehrenfest molecular dynamics","text":"using StatsPlots\nplot(density(momenta))\nxlims!(-20,20)","category":"page"},{"location":"ensemble_simulations/#ensembles","page":"Ensemble simulations","title":"Ensemble simulations","text":"","category":"section"},{"location":"ensemble_simulations/","page":"Ensemble simulations","title":"Ensemble simulations","text":"Typically we'll be interested in computing observables based upon the statistics obtained from many trajectories. Technically it is possible to manually run many trajectories using the single trajectory procedure introduced in the Getting started section. However, by using the methods introduced on this page it is possible to run many trajectories at once, using parallelism and computing ensemble observables automatically.","category":"page"},{"location":"ensemble_simulations/","page":"Ensemble simulations","title":"Ensemble simulations","text":"The key function for performing ensemble simulations is run_dynamics.","category":"page"},{"location":"ensemble_simulations/","page":"Ensemble simulations","title":"Ensemble simulations","text":"run_dynamics","category":"page"},{"location":"ensemble_simulations/#NQCDynamics.Ensembles.run_dynamics","page":"Ensemble simulations","title":"NQCDynamics.Ensembles.run_dynamics","text":"run_dynamics(sim::AbstractSimulation, tspan, distribution;\n output,\n selection::Union{Nothing,AbstractVector}=nothing,\n reduction=AppendReduction(),\n ensemble_algorithm=SciMLBase.EnsembleSerial(),\n algorithm=DynamicsMethods.select_algorithm(sim),\n trajectories=1,\n kwargs...\n )\n\nRun trajectories for timespan tspan sampling from distribution.\n\nKeywords\n\noutput either a single function or a Tuple of functions with the signature f(sol, i) that takes the DifferentialEquations solution and returns the desired output quantity.\nselection should be an AbstractVector containing the indices to sample from the distribution. By default, nothing leads to random sampling.\nreduction defines how the data is reduced across trajectories. Options are AppendReduction(), MeanReduction(), SumReduction and FileReduction(filename).\nensemble_algorithm is the algorithm from DifferentialEquations which determines which form of parallelism is used.\nalgorithm is the algorithm used to integrate the equations of motion.\ntrajectories is the number of trajectories to perform.\nkwargs... any additional keywords are passed to DifferentialEquations solve`.\n\n\n\n\n\n","category":"function"},{"location":"ensemble_simulations/","page":"Ensemble simulations","title":"Ensemble simulations","text":"This is the same function used to perform single trajectory simulations, but by replacing the single initial condition with a distribution and changing the number of trajectories it is possible to run an ensemble of trajectories. The distributions are defined such that they can be sampled to provide initial conditions for each trajectory. The Storing and sampling distributions page details the format the distributions must take.","category":"page"},{"location":"ensemble_simulations/","page":"Ensemble simulations","title":"Ensemble simulations","text":"Internally, the DifferentialEquations.jl ensemble infrastructure is used to handle per trajectory parallelism. The ensemble_algorithm keyword takes one of the EnsembleAlgorithms. To use these, you must first add using DiffEqBase to your script.","category":"page"},{"location":"ensemble_simulations/#Example","page":"Ensemble simulations","title":"Example","text":"","category":"section"},{"location":"ensemble_simulations/","page":"Ensemble simulations","title":"Ensemble simulations","text":"To demonstrate usage of run_dynamics, let's investigate different ways to calculate the time-dependent population with FSSH.","category":"page"},{"location":"ensemble_simulations/","page":"Ensemble simulations","title":"Ensemble simulations","text":"First, we set up our system using one of Tully's simple models ([1]).","category":"page"},{"location":"ensemble_simulations/","page":"Ensemble simulations","title":"Ensemble simulations","text":"using NQCDynamics\n\natoms = Atoms(2000)\nmodel = TullyModelOne()\nsim = Simulation{FSSH}(atoms, model)\nnothing # hide","category":"page"},{"location":"ensemble_simulations/","page":"Ensemble simulations","title":"Ensemble simulations","text":"As mentioned above, before running the ensemble, we must prepare a distribution to generate initial conditions for each trajectory. This procedure is detailed in the Storing and sampling distributions section.","category":"page"},{"location":"ensemble_simulations/","page":"Ensemble simulations","title":"Ensemble simulations","text":"using Distributions: Normal # Import the Normal distribution\n\nk = 10 # Initial momentum = 10\nv = k / atoms.masses[1] # Convert momentum to velocity\nr = Normal(-8) # Create Normal distribution centred at -8 for sampling initial position\nnuclear_distribution = DynamicalDistribution(v, r, (1,1)) # Combine position and velocity\nelectronic_distribution = PureState(2) # Create nonequilibrium electronic distribution\nproduct_distribution = nuclear_distribution * electronic_distribution\nnothing # hide","category":"page"},{"location":"ensemble_simulations/","page":"Ensemble simulations","title":"Ensemble simulations","text":"In this case, we have used a deterministic momentum of 10 a.u. and a gaussian position distribution with width 1 centered at -8 a.u.. The electronic variables will be sampled such that the initial population is confined to the second state by PureState(2).","category":"page"},{"location":"ensemble_simulations/","page":"Ensemble simulations","title":"Ensemble simulations","text":"The final step before running the dynamics is to decide how to output the results. The simplest option is to use the built-in tuple format familiar from run_dynamics.","category":"page"},{"location":"ensemble_simulations/","page":"Ensemble simulations","title":"Ensemble simulations","text":"ensemble = run_dynamics(sim, (0.0, 3000.0), product_distribution;\n trajectories=20, output=OutputDiabaticPopulation)\nnothing # hide","category":"page"},{"location":"ensemble_simulations/","page":"Ensemble simulations","title":"Ensemble simulations","text":"This is equivalent to performing single trajectories in a loop and manually re-sampling the initial conditions each time. However, here we have been able to do this more concisely, using internal mechanisms for sampling from the product_distribution.","category":"page"},{"location":"ensemble_simulations/","page":"Ensemble simulations","title":"Ensemble simulations","text":"The output of this function is a vector containing the output from each trajectory. Each entry is equivalent to the output from a call to run_dynamics and can be plotted by iterating through ensemble.","category":"page"},{"location":"ensemble_simulations/","page":"Ensemble simulations","title":"Ensemble simulations","text":"using Plots\n\np = plot(legend=false)\nfor traj in ensemble\n plot!(traj[:Time], [population[2] - population[1] for population in traj[:OutputDiabaticPopulation]])\nend\np","category":"page"},{"location":"ensemble_simulations/","page":"Ensemble simulations","title":"Ensemble simulations","text":"This plot shows the population difference between the two states for each trajectory. To approximate the exact quantum dynamics for this model, the average over all trajectories should be computed. Instead of manually averaging the result, we can use reduction=MeanReduction() or reduction=SumReduction() which will reduce the data accordingly before outputting the result:","category":"page"},{"location":"ensemble_simulations/","page":"Ensemble simulations","title":"Ensemble simulations","text":"ensemble = run_dynamics(sim, (0.0, 3000.0), product_distribution;\n trajectories=20, output=OutputDiabaticPopulation, reduction=MeanReduction(), saveat=0.0:10.0:3000.0)\nplot(ensemble, :OutputDiabaticPopulation)","category":"page"},{"location":"ensemble_simulations/","page":"Ensemble simulations","title":"Ensemble simulations","text":"note: Note\nHere we have also specified the saveat keyword to ensure the output is saved at the same points for every trajectory, otherwise the averaging will not work. This is necessary because we are using an integrator with adaptive timestepping that will save at different points for each trajectory.","category":"page"},{"location":"ensemble_simulations/","page":"Ensemble simulations","title":"Ensemble simulations","text":"This workflow can be applied for any of the quantities defined in the DynamicsOutputs submodule. If we want a more complex output, such as a scattering probability or a time-correlation function, we can provide a function to the output argument as described in the DifferentialEquations.jl documentation. The advantage of this approach is that memory can be saved by reducing the data as the trajectories accumulate, it also allows greater flexibility when modifying the output.","category":"page"},{"location":"ensemble_simulations/","page":"Ensemble simulations","title":"Ensemble simulations","text":"Inside the Ensembles submodule we define a few premade functions of this sort, but here we can demonstrate how to reformulate the previous simulation using the alternative format.","category":"page"},{"location":"ensemble_simulations/","page":"Ensemble simulations","title":"Ensemble simulations","text":"function output_function(sol, i)\n output = zeros(2,div(3000, 50) + 1)\n for (i,u) in enumerate(sol.u)\n output[:,i] .= Estimators.diabatic_population(sim, u)\n end\n return output\nend\n\nensemble = run_dynamics(sim, (0.0, 3000.0), product_distribution;\n trajectories=20, output=output_function, reduction=MeanReduction(), saveat=50.0)","category":"page"},{"location":"ensemble_simulations/","page":"Ensemble simulations","title":"Ensemble simulations","text":"This function provides us the same output as above, but this gives us the flexibility to calculate any observable we want.","category":"page"},{"location":"ensemble_simulations/","page":"Ensemble simulations","title":"Ensemble simulations","text":"Throughout the documentation, ensemble simulations like this one are used to demonstrate many of the dynamics methods. Now that you have understood the contents of this page, all of the ensemble simulations will appear familiar.","category":"page"},{"location":"api/NQCDynamics/timecorrelationfunctions/#TimeCorrelationFunctions","page":"TimeCorrelationFunctions","title":"TimeCorrelationFunctions","text":"","category":"section"},{"location":"api/NQCDynamics/timecorrelationfunctions/","page":"TimeCorrelationFunctions","title":"TimeCorrelationFunctions","text":"Modules=[NQCDynamics.TimeCorrelationFunctions]","category":"page"},{"location":"api/NQCDynamics/timecorrelationfunctions/#NQCDynamics.TimeCorrelationFunctions","page":"TimeCorrelationFunctions","title":"NQCDynamics.TimeCorrelationFunctions","text":"TimeCorrelationFunctions\n\nThis module defines extra types that can be used as Ensemble outputs when computing time-correlation functions. It hopes to provide a minimal interface that reduces code repetition when implementing different correlation functions.\n\n\n\n\n\n","category":"module"},{"location":"api/NQCDynamics/timecorrelationfunctions/#NQCDynamics.TimeCorrelationFunctions.PopulationCorrelationFunction","page":"TimeCorrelationFunctions","title":"NQCDynamics.TimeCorrelationFunctions.PopulationCorrelationFunction","text":"PopulationCorrelationFunction{T,S<:AbstractSimulation} <: TimeCorrelationFunction\n\nOutput type for computing the population correlation function. The statetype determines the population type (diabatic or adiabatic). sim must also be provided to access the parameters to compute the population.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDynamics/timecorrelationfunctions/#NQCDynamics.TimeCorrelationFunctions.TimeCorrelationFunction","page":"TimeCorrelationFunctions","title":"NQCDynamics.TimeCorrelationFunctions.TimeCorrelationFunction","text":"TimeCorrelationFunction\n\nAbstract type for defining time correlation functions\n\n\n\n\n\n","category":"type"},{"location":"saving_loading/#saving-and-loading","page":"Saving and loading","title":"Saving and loading","text":"","category":"section"},{"location":"saving_loading/","page":"Saving and loading","title":"Saving and loading","text":"If you would like to split your workflow into multiple scripts (e.g. separately generating initial conditions and running dynamics) it is necessary to be able to store intermediate data in files.","category":"page"},{"location":"saving_loading/","page":"Saving and loading","title":"Saving and loading","text":"When this data is atomic configurations or trajectories, it can be useful to use standard file formats such as those mentioned in the Atoms section previously. However, often it is more convenient to directly save and load Julia objects between sessions. For this purpose, we recommend using FileIO.jl with JLD2.jl.","category":"page"},{"location":"saving_loading/","page":"Saving and loading","title":"Saving and loading","text":"note: Note\nJLD2 can be used independently of FileIO. However, FileIO provides a unified interface for many file types and allows you to save data to lots of formats with consistent syntax.","category":"page"},{"location":"saving_loading/","page":"Saving and loading","title":"Saving and loading","text":"As a simple example, suppose that we want the same system parameters across multiple scripts:","category":"page"},{"location":"saving_loading/","page":"Saving and loading","title":"Saving and loading","text":"using NQCDynamics\n\natoms = Atoms([:H, :H, :C, :C])\ncell = PeriodicCell([10.0 0 0; 0 10.0 0; 0 0 10.0])\nmodel = Harmonic()\nnothing # hide","category":"page"},{"location":"saving_loading/","page":"Saving and loading","title":"Saving and loading","text":"Instead of redefining these in every script, we can save them to a file, then load them back in whenever we need them using FileIO.","category":"page"},{"location":"saving_loading/","page":"Saving and loading","title":"Saving and loading","text":"This creates a file \"parameters.jld2\" containing all of our system parameters:","category":"page"},{"location":"saving_loading/","page":"Saving and loading","title":"Saving and loading","text":"using FileIO\nsave(\"parameters.jld2\", Dict(\"atoms\"=>atoms, \"cell\"=>cell, \"model\"=>model))","category":"page"},{"location":"saving_loading/","page":"Saving and loading","title":"Saving and loading","text":"In a separate Julia session we can re-load these parameters. As detailed in the JLD2 documentation we can select the data to load by specifying extra arguments to load.","category":"page"},{"location":"saving_loading/","page":"Saving and loading","title":"Saving and loading","text":"using NQCDynamics, FileIO\n\nparameters = load(\"parameters.jld2\")\natoms = load(\"parameters.jld2\", \"atoms\")\ncell = load(\"parameters.jld2\", \"cell\")\nmodel = load(\"parameters.jld2\", \"model\")","category":"page"},{"location":"saving_loading/","page":"Saving and loading","title":"Saving and loading","text":"JLD2 is compatible with any Julia type so it widely usable for most of the types you encounter is NQCDynamics.jl and across all Julia packages.","category":"page"},{"location":"NQCModels/neuralnetworkmodels/#Neural-network-models","page":"Neural network models","title":"Neural network models","text":"","category":"section"},{"location":"NQCModels/neuralnetworkmodels/","page":"Neural network models","title":"Neural network models","text":"Using the ASE interface we can directly use models trained using SchNetPack.","category":"page"},{"location":"NQCModels/neuralnetworkmodels/","page":"Neural network models","title":"Neural network models","text":"danger: Danger\nThe examples on this page do not run during the documentation build due to schnetpack causing segfaults when installed in the build environment. The causes of this is not currently clear but we have temporarily disabled these examples in the build.However, the examples should still be correct and you are welcome to try them with your own schnetpack trained models.","category":"page"},{"location":"NQCModels/neuralnetworkmodels/","page":"Neural network models","title":"Neural network models","text":"To use a SchNet model, please load any pre-trained model into a given path you can access. Here, our SchNet model is named \"best_model\" as is common in SchNet and provide the relative path.","category":"page"},{"location":"NQCModels/neuralnetworkmodels/","page":"Neural network models","title":"Neural network models","text":"First we load the model into an ase calculator and attach it to our diatomic hydrogen molecule.","category":"page"},{"location":"NQCModels/neuralnetworkmodels/","page":"Neural network models","title":"Neural network models","text":"using PyCall\n\nase = pyimport(\"ase\")\nspkutils = pyimport(\"schnetpack.utils\")\nspkinterfaces = pyimport(\"schnetpack.interfaces\")\n\nspk_model = spkutils.load_model(\"../assets/schnetpack/best_model\"; map_location=\"cpu\")\n\nh2 = ase.Atoms(\"H2\", [(0, 0, 0), (0, 0, 0.74)])\n\ncalc = spkinterfaces.SpkCalculator(spk_model, energy=\"energy\", forces=\"forces\")\nh2.set_calculator(calc)","category":"page"},{"location":"NQCModels/neuralnetworkmodels/","page":"Neural network models","title":"Neural network models","text":"We can obtain the energies and forces from ase directly in the usual way, converting them to atomic units using UnifulAtomic.","category":"page"},{"location":"NQCModels/neuralnetworkmodels/","page":"Neural network models","title":"Neural network models","text":"using Unitful, UnitfulAtomic;\naustrip(h2.get_total_energy() * u\"eV\")\naustrip.(h2.get_forces() .* u\"eV/Å\")","category":"page"},{"location":"NQCModels/neuralnetworkmodels/","page":"Neural network models","title":"Neural network models","text":"warning: Warning\nNote that this is an arbitrary model not trained on H2, hence the calculation of the potential energy and forces most likely do not make sense.","category":"page"},{"location":"NQCModels/neuralnetworkmodels/","page":"Neural network models","title":"Neural network models","text":"Then, we can convert the ASE output into the format used in NQCModels, which makes it possible to use the SchNet model e.g. for molecular dynamics calculations within NQCDynamics.jl:","category":"page"},{"location":"NQCModels/neuralnetworkmodels/","page":"Neural network models","title":"Neural network models","text":"using NQCModels;\nmodel = AdiabaticASEModel(h2);\n\nr = [0 0; 0 0; 0 ustrip(auconvert(0.74u\"Å\"))]\n\npotential(model, r)\nderivative(model, r)","category":"page"},{"location":"api/NQCModels/adiabaticmodels/#AdiabaticModels","page":"AdiabaticModels","title":"AdiabaticModels","text":"","category":"section"},{"location":"api/NQCModels/adiabaticmodels/","page":"AdiabaticModels","title":"AdiabaticModels","text":"Modules=[NQCModels.AdiabaticModels]","category":"page"},{"location":"api/NQCModels/adiabaticmodels/#NQCModels.AdiabaticModels","page":"AdiabaticModels","title":"NQCModels.AdiabaticModels","text":"AdiabaticModels\n\nAll models defined within this module have only a single electronic state and return potentials as scalars and derivatives as simple arrays.\n\nThe central abstract type is the AdiabaticModel, which all models should subtype.\n\n\n\n\n\n","category":"module"},{"location":"api/NQCModels/adiabaticmodels/#NQCModels.AdiabaticModels.AdiabaticASEModel","page":"AdiabaticModels","title":"NQCModels.AdiabaticModels.AdiabaticASEModel","text":"AdiabaticASEModel{A} <: AdiabaticModel\n\nWrapper for an ase.Atoms object that has a calculator attached. This will synchronise the positions with the ase object and handle the unit conversions.\n\nImplements both potential and derivative!.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/adiabaticmodels/#NQCModels.AdiabaticModels.AdiabaticModel","page":"AdiabaticModels","title":"NQCModels.AdiabaticModels.AdiabaticModel","text":"AdiabaticModel <: Model\n\nAdiabaticModels represent the potentials from classical molecular dynamics where the potential is a function of the position.\n\nImplementation\n\nAdiabaticModels should implement:\n\npotential(model, R)\nderivative!(model, D, R) (this is the derivative of the potential energy with respect to the positions)\nndofs(model) (these are the degrees of freedom)\n\nExample\n\nThis example creates a 2 dimensional adiabatic model MyModel. We implement the 3 compulsory functions then evaluate the potential. Here, the argument R is an AbstractMatrix since this is a 2D model that can accept multiple atoms.\n\nstruct MyModel{P} <: NQCModels.AdiabaticModels.AdiabaticModel\n param::P\nend\n\nNQCModels.ndofs(::MyModel) = 2\n\nNQCModels.potential(model::MyModel, R::AbstractMatrix) = model.param*sum(R.^2)\nNQCModels.derivative!(model::MyModel, D, R::AbstractMatrix) = D .= model.param*2R\n\nmodel = MyModel(10)\n\nNQCModels.potential(model, [1 2; 3 4])\n\n# output\n\n300\n\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/adiabaticmodels/#NQCModels.AdiabaticModels.DarlingHollowayElbow","page":"AdiabaticModels","title":"NQCModels.AdiabaticModels.DarlingHollowayElbow","text":"DarlingHollowayElbow()\n\nAdiabatic elbow potential from Darling and Holloway: Faraday Discuss., 1993, 96, 43-54\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/adiabaticmodels/#NQCModels.AdiabaticModels.DiatomicHarmonic","page":"AdiabaticModels","title":"NQCModels.AdiabaticModels.DiatomicHarmonic","text":"DiatomicHarmonic(r₀=1.0)\n\nHarmonic interaction between two particles.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/adiabaticmodels/#NQCModels.AdiabaticModels.Free","page":"AdiabaticModels","title":"NQCModels.AdiabaticModels.Free","text":"Free()\n\nZero external potential everywhere. Useful for modelling free particles.\n\njulia> model, R = Free(3), rand(3, 10);\n\njulia> potential(model, R)\n0.0\n\njulia> derivative(model, R)\n3×10 Matrix{Float64}:\n 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/adiabaticmodels/#NQCModels.AdiabaticModels.Harmonic","page":"AdiabaticModels","title":"NQCModels.AdiabaticModels.Harmonic","text":"Harmonic(m=1.0, ω=1.0, r₀=0.0)\n\nAdiabatic harmonic potential. V(x) = mω^2(x-r₀)^2 2\n\njulia> using Symbolics;\n\njulia> @variables x, m, ω, r₀;\n\njulia> model = Harmonic(m=m, ω=ω, r₀=r₀);\n\njulia> potential(model, hcat(x))\n0.5m*(ω^2)*((x - r₀)^2)\n\njulia> derivative(model, hcat(x))\n1×1 Matrix{Num}:\n m*(x - r₀)*(ω^2)\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/adiabaticmodels/#NQCModels.AdiabaticModels.Morse","page":"AdiabaticModels","title":"NQCModels.AdiabaticModels.Morse","text":"Parameters.@with_kw struct Morse{T} <: AdiabaticModel\n\nReferences\n\nJ. Chem. Phys. 88, 4535 (1988)\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/adiabaticmodels/#NQCModels.AdiabaticModels.eigenenergy-Tuple{Morse, Any}","page":"AdiabaticModels","title":"NQCModels.AdiabaticModels.eigenenergy","text":"Eq. 43\n\n\n\n\n\n","category":"method"},{"location":"api/NQCModels/adiabaticmodels/#NQCModels.AdiabaticModels.getλ-Tuple{Morse}","page":"AdiabaticModels","title":"NQCModels.AdiabaticModels.getλ","text":"Eq. 36\n\n\n\n\n\n","category":"method"},{"location":"api/NQCModels/adiabaticmodels/#NQCModels.AdiabaticModels.getω₀-Tuple{Morse}","page":"AdiabaticModels","title":"NQCModels.AdiabaticModels.getω₀","text":"Eq. 44\n\n\n\n\n\n","category":"method"},{"location":"atoms/#atoms","page":"Atoms","title":"Handling Atoms","text":"","category":"section"},{"location":"atoms/","page":"Atoms","title":"Atoms","text":"This package makes the choice to separate the atomic parameters from their positions and velocities for ease of use with the differential equations solvers. This contrasts somewhat with most other software packages where these would be usually by joined together into a single object.","category":"page"},{"location":"atoms/","page":"Atoms","title":"Atoms","text":"The atomic parameters here are contained within the Atoms type introduced earlier in the Getting started section. As mentioned previously, there exist some basic constructors which use either elemental symbols or numbers to initialise the parameters:","category":"page"},{"location":"atoms/","page":"Atoms","title":"Atoms","text":"using NQCDynamics\nAtoms([:H, :H, :H])\nAtoms([1, 2, 3])","category":"page"},{"location":"atoms/","page":"Atoms","title":"Atoms","text":"If there are many atoms, you can use Julia's array manipulation utilities to create large vectors with many atoms types. For example, if adding an adsorbate to a metal surface, it could be initialised as:","category":"page"},{"location":"atoms/","page":"Atoms","title":"Atoms","text":"au = fill(:Au, 40)\nno = [:N, :O]\nauno = [au; no]\nAtoms(auno)","category":"page"},{"location":"atoms/#reading-and-writing","page":"Atoms","title":"Reading and writing atomic structures","text":"","category":"section"},{"location":"atoms/","page":"Atoms","title":"Atoms","text":"When using a complex system however, it is likely more effective to read structures directly from a file. We provide two ways to do this, either using the ExtXYZ.jl package which works for xyz files. Or instead there is a conversion to and from the ase.Atoms type which can be used when PyCall.jl is loaded.","category":"page"},{"location":"atoms/","page":"Atoms","title":"Atoms","text":"First we can use ase to build a system and write it to an .xyz file.","category":"page"},{"location":"atoms/","page":"Atoms","title":"Atoms","text":"using PyCall\n\nbuild = pyimport(\"ase.build\")\n\nslab = build.fcc100(\"Al\", size=(2, 2, 3))\nbuild.add_adsorbate(slab, \"Au\", 1.7, \"hollow\")\nslab.center(axis=2, vacuum=4.0)\n\nslab.write(\"slab.xyz\")","category":"page"},{"location":"atoms/","page":"Atoms","title":"Atoms","text":"Now we can read it in with the read_extxyz function.","category":"page"},{"location":"atoms/","page":"Atoms","title":"Atoms","text":"atoms, positions, cell = read_extxyz(\"slab.xyz\")\natoms\npositions\ncell","category":"page"},{"location":"atoms/","page":"Atoms","title":"Atoms","text":"Similarly, we can write the file with write_extxyz:","category":"page"},{"location":"atoms/","page":"Atoms","title":"Atoms","text":"write_extxyz(\"out.xyz\", atoms, positions, cell)","category":"page"},{"location":"atoms/","page":"Atoms","title":"Atoms","text":"Both of these functions also work with trajectories such that the positions will be a vector of configurations, whilst the atoms and cell will remain unchanged.","category":"page"},{"location":"atoms/","page":"Atoms","title":"Atoms","text":"If not using .xyz files, we can directly use the IO capability of ase to read or the write the files. This can be done by using the conversions between our data types and the ase.Atoms object.","category":"page"},{"location":"atoms/","page":"Atoms","title":"Atoms","text":"atoms = Atoms([:H, :H, :C])\nase_atoms = NQCBase.convert_to_ase_atoms(atoms, rand(3, 3))\nNQCBase.convert_from_ase_atoms(ase_atoms)","category":"page"},{"location":"atoms/","page":"Atoms","title":"Atoms","text":"These conversions work both ways such that you can read any file format using ase then convert the ase.Atoms object to our types afterwards. Then at the end when you are finished, you can convert them back and write your output with ase.","category":"page"},{"location":"api/NQCBase/nqcbase/#NQCBase","page":"NQCBase","title":"NQCBase","text":"","category":"section"},{"location":"api/NQCBase/nqcbase/","page":"NQCBase","title":"NQCBase","text":"Modules=[NQCBase]","category":"page"},{"location":"api/NQCBase/nqcbase/#NQCBase.Atoms","page":"NQCBase","title":"NQCBase.Atoms","text":"Atoms{T<:AbstractFloat}\n\nBasic atomic parameters: element symbols, numbers and masses\n\nMasses are converted to atomic units. Constructed using either element symbols or masses.\n\njulia> Atoms(:H)\nAtoms{Float64}([:H], [1], [1837.4715941070515])\n\njulia> Atoms([:H, :H, :H, :C])\nAtoms{Float64}([:H, :H, :H, :C], [1, 1, 1, 6], [1837.4715941070515, 1837.4715941070515, 1837.4715941070515, 21894.713607956142])\n\njulia> Atoms([100, 200])\nAtoms{Float64}([:X, :X], [0, 0], [100.0, 200.0])\n\n\n\n\n\n","category":"type"},{"location":"api/NQCBase/nqcbase/#NQCBase.PeriodicCell","page":"NQCBase","title":"NQCBase.PeriodicCell","text":"PeriodicCell{T<:AbstractFloat} <: AbstractCell\n\nOptionally periodic cell\n\n\n\n\n\n","category":"type"},{"location":"api/NQCBase/nqcbase/#NQCBase.check_atoms_in_cell-Tuple{PeriodicCell, AbstractMatrix}","page":"NQCBase","title":"NQCBase.check_atoms_in_cell","text":"check_atoms_in_cell(cell::PeriodicCell, R::AbstractMatrix)::Bool\n\nTrue if all atoms are inside the cell, false otherwise.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCBase/nqcbase/#NQCBase.read_extxyz-Tuple{Any}","page":"NQCBase","title":"NQCBase.read_extxyz","text":"read_extxyz(file)\n\nUses ExtXYZ.jl to read a .extxyz file\n\n\n\n\n\n","category":"method"},{"location":"api/NQCBase/nqcbase/#NQCBase.write_extxyz-Tuple{Any, Any, Matrix, Any}","page":"NQCBase","title":"NQCBase.write_extxyz","text":"write_extxyz(file, atoms, R, cell)\n\nUses ExtXYZ.jl to write a .extxyz file\n\nR can be either a single configuration (Matrix) or many (Vector{<:Matrix}).\n\n\n\n\n\n","category":"method"},{"location":"NQCDistributions/overview/#NQCDistributions.jl","page":"NQCDistributions.jl","title":"NQCDistributions.jl","text":"","category":"section"},{"location":"NQCDistributions/overview/#Storing-and-sampling-distributions","page":"NQCDistributions.jl","title":"Storing and sampling distributions","text":"","category":"section"},{"location":"NQCDistributions/overview/","page":"NQCDistributions.jl","title":"NQCDistributions.jl","text":"In order to perform ensembles of trajectories, it is useful to have a convenient way to generate distributions of velocities and positions which can be sampled to initialise trajectories. The NQCDistributions.jl package contains the types and functions that seek to address this requirement as painlessly as possible. ","category":"page"},{"location":"NQCDistributions/overview/","page":"NQCDistributions.jl","title":"NQCDistributions.jl","text":"For quantum classical nonadiabatic dynamics simulations, the initial distributions contain both nuclear and electronic degrees of freedom.","category":"page"},{"location":"NQCDistributions/overview/","page":"NQCDistributions.jl","title":"NQCDistributions.jl","text":"note: Note\nCurrently, we allow for product distributions only, where the nuclear and electronic distributions are separable. In the future it would be great to remove this restriction, if you are interested, please open an issue on GitHub.","category":"page"},{"location":"NQCDistributions/overview/","page":"NQCDistributions.jl","title":"NQCDistributions.jl","text":"This page describes the types that can be used to represent nuclear and electronic distributions and demonstrates how they can be combined into a product distribution.","category":"page"},{"location":"NQCDistributions/overview/#Nuclear-Distributions","page":"NQCDistributions.jl","title":"Nuclear Distributions","text":"","category":"section"},{"location":"NQCDistributions/overview/#DynamicalDistribution","page":"NQCDistributions.jl","title":"DynamicalDistribution","text":"","category":"section"},{"location":"NQCDistributions/overview/","page":"NQCDistributions.jl","title":"NQCDistributions.jl","text":"When handling distributions for the nuclear degrees of freedom, the DynamicalDistribution type can be used to store initial velocities and positions:","category":"page"},{"location":"NQCDistributions/overview/","page":"NQCDistributions.jl","title":"NQCDistributions.jl","text":"using NQCDynamics","category":"page"},{"location":"NQCDistributions/overview/","page":"NQCDistributions.jl","title":"NQCDistributions.jl","text":"d = DynamicalDistribution(10, 5, (3, 2))\nnothing # hide","category":"page"},{"location":"NQCDistributions/overview/","page":"NQCDistributions.jl","title":"NQCDistributions.jl","text":"Here, we have created a delta distribution with fixed velocities and positions, the final argument specifies the size of each sample. The (3, 2) case shown here would be appropriate when using 2 atoms each with 3 degrees of freedom.","category":"page"},{"location":"NQCDistributions/overview/","page":"NQCDistributions.jl","title":"NQCDistributions.jl","text":"rand(d)","category":"page"},{"location":"NQCDistributions/overview/","page":"NQCDistributions.jl","title":"NQCDistributions.jl","text":"DynamicalDistribution is flexible and each of the first two arguments can be Real, Vector or Sampleable.","category":"page"},{"location":"NQCDistributions/overview/","page":"NQCDistributions.jl","title":"NQCDistributions.jl","text":"note: Note\nReals are used whenever the same value is desired for every sample, as above.\nVectors can be provided when sampling a provided vector of configurations.\nSampleables are provided by Distributions.jl and can be used when specifying an analytic distribution such as the Maxwell-Boltzmann distribution for velocities.","category":"page"},{"location":"NQCDistributions/overview/","page":"NQCDistributions.jl","title":"NQCDistributions.jl","text":"Each of these options can be composed in any combination, let's see the case where we have an analytic distribution of positions and a preset collection of velocities:","category":"page"},{"location":"NQCDistributions/overview/","page":"NQCDistributions.jl","title":"NQCDistributions.jl","text":"using Distributions\n\nvelocity = [[1.0 1.0;1.0 1.0], [2.0 2.0; 2.0 2.0], [3.0 3.0; 3.0 3.0]] \nposition = Normal()\nd = DynamicalDistribution(velocity, position, (2, 2))\nrand(d)","category":"page"},{"location":"NQCDistributions/overview/","page":"NQCDistributions.jl","title":"NQCDistributions.jl","text":"This has generated normally distributed positions along with one of the three velocities we provided.","category":"page"},{"location":"NQCDistributions/overview/#VelocityBoltzmann","page":"NQCDistributions.jl","title":"VelocityBoltzmann","text":"","category":"section"},{"location":"NQCDistributions/overview/","page":"NQCDistributions.jl","title":"NQCDistributions.jl","text":"When performing equilibrium simulations it is often desirable to initialise trajectories when thermal velocities. These can be obtained for each atom from a gaussian distribution of the appropriate width, or alternatively, using the VelocityBoltzmann distribution which simplifies the process. This takes the temperature, masses and size of the system and ensures the samples you obtain are of the correct shape:","category":"page"},{"location":"NQCDistributions/overview/","page":"NQCDistributions.jl","title":"NQCDistributions.jl","text":"using NQCDynamics\nusing Unitful\n\nvelocity = VelocityBoltzmann(300u\"K\", rand(10), (3, 10))\nrand(velocity)","category":"page"},{"location":"NQCDistributions/overview/","page":"NQCDistributions.jl","title":"NQCDistributions.jl","text":"This can be handed directly to the DynamicalDistribution when Boltzmann velocities are required.","category":"page"},{"location":"NQCDistributions/overview/","page":"NQCDistributions.jl","title":"NQCDistributions.jl","text":"distribution = DynamicalDistribution(velocity, 1, (3, 10))\nrand(distribution)","category":"page"},{"location":"NQCDistributions/overview/#Wigner-distributions","page":"NQCDistributions.jl","title":"Wigner distributions","text":"","category":"section"},{"location":"NQCDistributions/overview/","page":"NQCDistributions.jl","title":"NQCDistributions.jl","text":"For harmonic oscillator systems, we have implemented the analytic Wigner distribution. These are just mormal distributions of the appropriate width but can be accessed easily as in the following:","category":"page"},{"location":"NQCDistributions/overview/","page":"NQCDistributions.jl","title":"NQCDistributions.jl","text":"using NQCDistributions \n\nomega = 1.0;\nbeta = 1e-3;\nmass = 10;\n\ndist = PositionHarmonicWigner(omega, beta, mass, centre=0.0)\nrand(dist)\ndist = VelocityHarmonicWigner(omega, beta, mass)\nrand(dist)","category":"page"},{"location":"NQCDistributions/overview/","page":"NQCDistributions.jl","title":"NQCDistributions.jl","text":"These can also be given to the DynamicalDistribution since they are just univariate normal distributions.","category":"page"},{"location":"NQCDistributions/overview/#Electronic-distributions","page":"NQCDistributions.jl","title":"Electronic distributions","text":"","category":"section"},{"location":"NQCDistributions/overview/","page":"NQCDistributions.jl","title":"NQCDistributions.jl","text":"For nonadiabatic dynamics, the initial electronic variables must also be sampled. For this, we can use an ElectronicDistribution which will tell our simulation how we want to sample the initial variables. Currently, two of these are provided, the PureState and the MixedState. The PureState is used for nonequilibrium simulations when the population is confined to a single state, whereas MixedState allows for a mixed state distribution.","category":"page"},{"location":"NQCDistributions/overview/","page":"NQCDistributions.jl","title":"NQCDistributions.jl","text":"using NQCDistributions \n\nPureState(1, Diabatic())\nPureState(2, Adiabatic())\nMixedState([1, 2], Diabatic())","category":"page"},{"location":"NQCDistributions/overview/","page":"NQCDistributions.jl","title":"NQCDistributions.jl","text":"These structs contain only the minimal information about the distributions, whereas the sampling of the distribution is handled separately by each of the different methods.","category":"page"},{"location":"NQCDistributions/overview/#Sampling-the-nuclear-distribution","page":"NQCDistributions.jl","title":"Sampling the nuclear distribution","text":"","category":"section"},{"location":"NQCDistributions/overview/","page":"NQCDistributions.jl","title":"NQCDistributions.jl","text":"To learn how to generate configurations to use with the DynamicalDistribution, read on to the next sections about the included sampling methods.","category":"page"},{"location":"api/NQCDynamics/initialconditions/#InitialConditions","page":"InitialConditions","title":"InitialConditions","text":"","category":"section"},{"location":"api/NQCDynamics/initialconditions/","page":"InitialConditions","title":"InitialConditions","text":"Modules=[NQCDynamics.InitialConditions]","category":"page"},{"location":"api/NQCDynamics/initialconditions/#NQCDynamics.InitialConditions","page":"InitialConditions","title":"NQCDynamics.InitialConditions","text":"InitialConditions\n\nFunctions and types for generating initial conditions for simulations.\n\n\n\n\n\n","category":"module"},{"location":"api/NQCDynamics/initialconditions/#ThermalMonteCarlo","page":"InitialConditions","title":"ThermalMonteCarlo","text":"","category":"section"},{"location":"api/NQCDynamics/initialconditions/","page":"InitialConditions","title":"InitialConditions","text":"Modules=[NQCDynamics.InitialConditions.ThermalMonteCarlo]","category":"page"},{"location":"api/NQCDynamics/initialconditions/#NQCDynamics.InitialConditions.ThermalMonteCarlo.run_advancedhmc_sampling-Tuple{Simulation, Any, Any}","page":"InitialConditions","title":"NQCDynamics.InitialConditions.ThermalMonteCarlo.run_advancedhmc_sampling","text":"run_advancedhmc_sampling(sim::Simulation, r, n_samples;\n target_acceptance=0.5, kwargs...)\n\nPerform Hamiltonian Monte Carlo sampling for the simulation sim using AdvancedHMC.jl.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/initialconditions/#NQCDynamics.InitialConditions.ThermalMonteCarlo.run_advancedmh_sampling-Tuple{NQCDynamics.AbstractSimulation, Any, Real, Dict{Symbol, <:Real}}","page":"InitialConditions","title":"NQCDynamics.InitialConditions.ThermalMonteCarlo.run_advancedmh_sampling","text":"run_advancedhmc_sampling(sim, r, steps, σ; move_ratio=0.0, internal_ratio=0.0)\n\nSample the configuration space for the simulation sim starting from r.\n\nTotal number of steps is given by steps and σ is the dictionary of step sizes for each species.\n\nmove_ratio defaults to 0.0 and denotes the fraction of system moved each step. If move_ratio = 0, every degree of freedom is moved at each step. If move_ratio = 1, then nothing will happen. Experiment with this parameter to achieve optimal sampling.\n\ninternal_ratio works as for move_ratio but for the internal modes of the ring polymer.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/initialconditions/#QuantisedDiatomic","page":"InitialConditions","title":"QuantisedDiatomic","text":"","category":"section"},{"location":"api/NQCDynamics/initialconditions/","page":"InitialConditions","title":"InitialConditions","text":"Modules=[NQCDynamics.InitialConditions.QuantisedDiatomic]","category":"page"},{"location":"api/NQCDynamics/initialconditions/#NQCDynamics.InitialConditions.QuantisedDiatomic","page":"InitialConditions","title":"NQCDynamics.InitialConditions.QuantisedDiatomic","text":"QuantisedDiatomic\n\nThis module exports two user facing functions:\n\ngenerate_configurations Creates a set of velocities and positions for diatomic molecule with specified vibrational ν and rotational J quantum numbers.\nquantise_diatomic Obtains vibrational ν and rotational J quantum numbers for a diatomic molecule with a given set of velocities and positions.\n\nThe central concept of this module is the EBK procedure which is nicely detailed here: [4]\n\nInspired by VENUS96: [28]\n\n\n\n\n\n","category":"module"},{"location":"api/NQCDynamics/initialconditions/#NQCDynamics.InitialConditions.QuantisedDiatomic.apply_random_rotation!-Tuple{Any, Any}","page":"InitialConditions","title":"NQCDynamics.InitialConditions.QuantisedDiatomic.apply_random_rotation!","text":"Randomly rotate each column of two 3*N matrix, same rotation for all columns.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/initialconditions/#NQCDynamics.InitialConditions.QuantisedDiatomic.calculate_diatomic_energy-Tuple{Real, NQCModels.AdiabaticModels.AdiabaticModel, NQCDynamics.InitialConditions.QuantisedDiatomic.EvaluationEnvironment}","page":"InitialConditions","title":"NQCDynamics.InitialConditions.QuantisedDiatomic.calculate_diatomic_energy","text":"calculate_diatomic_energy(model::AdiabaticModel, bond_length::Real;\n height=10, normal_vector=[0, 0, 1])\n\nReturns potential energy of diatomic with bond_length at height from surface.\n\nOrients molecule parallel to the surface at the specified height, the surface is assumed to intersect the origin. This requires that the model implicitly provides the surface, or works fine without one.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/initialconditions/#NQCDynamics.InitialConditions.QuantisedDiatomic.combine_slab_and_molecule-Tuple{Any, Any, Any}","page":"InitialConditions","title":"NQCDynamics.InitialConditions.QuantisedDiatomic.combine_slab_and_molecule","text":"combine_slab_and_molecule(atom_indices, molecule, slab)\n\nRevert the transformation separate_slab_and_molecule\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/initialconditions/#NQCDynamics.InitialConditions.QuantisedDiatomic.configure_diatomic-Tuple{Any, Any, Any, Any, NQCDynamics.InitialConditions.QuantisedDiatomic.EvaluationEnvironment, NQCDynamics.InitialConditions.QuantisedDiatomic.GenerationParameters, Any}","page":"InitialConditions","title":"NQCDynamics.InitialConditions.QuantisedDiatomic.configure_diatomic","text":"Randomly orient molecule in space for a given bond length and radial momentum\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/initialconditions/#NQCDynamics.InitialConditions.QuantisedDiatomic.find_total_energy-Tuple{NQCDynamics.InitialConditions.QuantisedDiatomic.EffectivePotential, Any}","page":"InitialConditions","title":"NQCDynamics.InitialConditions.QuantisedDiatomic.find_total_energy","text":"find_total_energy(V::EffectivePotential, ν)\n\nReturns the energy associated with the specified quantum numbers\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/initialconditions/#NQCDynamics.InitialConditions.QuantisedDiatomic.generate_configurations-Tuple{Any, Any, Any}","page":"InitialConditions","title":"NQCDynamics.InitialConditions.QuantisedDiatomic.generate_configurations","text":"generate_configurations(sim, ν, J; samples=1000, height=10, normal_vector=[0, 0, 1],\n translational_energy=0, direction=[0, 0, -1], position=[0, 0, height])\n\nGenerate positions and momenta for given quantum numbers\n\ntranslational_energy, direction and position specify the kinetic energy in a specific direction with the molecule placed with centre of mass at position.\n\nKeyword arguments height and normal_vector become relevant if the potential requires specific placement of the molecule. These allow the molecule to be placed at a distance height in the direction normal_vector when performing potential evaluations.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/initialconditions/#NQCDynamics.InitialConditions.QuantisedDiatomic.quantise_diatomic-Tuple{Simulation, Matrix, Matrix}","page":"InitialConditions","title":"NQCDynamics.InitialConditions.QuantisedDiatomic.quantise_diatomic","text":"quantise_diatomic(sim::Simulation, v::Matrix, r::Matrix;\n height=10, normal_vector=[0, 0, 1])\n\nQuantise the vibrational and rotational degrees of freedom for the specified positions and velocities\n\nWhen evaluating the potential, the molecule is moved to height in direction normal_vector. If the potential is independent of centre of mass position, this has no effect. Otherwise, be sure to modify these parameters to give the intended behaviour.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/initialconditions/#NQCDynamics.InitialConditions.QuantisedDiatomic.select_random_bond_lengths-Tuple{Any, Any, Any}","page":"InitialConditions","title":"NQCDynamics.InitialConditions.QuantisedDiatomic.select_random_bond_lengths","text":"Pick a random bond length and corresponding radial momentum that matches the radial probability distribution.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/initialconditions/#NQCDynamics.InitialConditions.QuantisedDiatomic.separate_slab_and_molecule-Tuple{Any, Any}","page":"InitialConditions","title":"NQCDynamics.InitialConditions.QuantisedDiatomic.separate_slab_and_molecule","text":"separate_slab_and_molecule(atom_indices, r)\n\nGet the coordinates of the molecule and slab separately.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/initialconditions/#NQCDynamics.InitialConditions.QuantisedDiatomic.sqrt_avoid_negatives-Tuple{Any}","page":"InitialConditions","title":"NQCDynamics.InitialConditions.QuantisedDiatomic.sqrt_avoid_negatives","text":"sqrt_avoid_negatives(x)\n\nSame as sqrt but returns zero(x) if x is negative. Used here just in case the endpoints are a little off.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/initialconditions/#MetropolisHastings","page":"InitialConditions","title":"MetropolisHastings","text":"","category":"section"},{"location":"api/NQCDynamics/initialconditions/","page":"InitialConditions","title":"InitialConditions","text":"Modules=[NQCDynamics.InitialConditions.MetropolisHastings]","category":"page"},{"location":"api/NQCDynamics/initialconditions/#NQCDynamics.InitialConditions.MetropolisHastings","page":"InitialConditions","title":"NQCDynamics.InitialConditions.MetropolisHastings","text":"MetropolisHastings\n\nSampling of the initial conditions using the Metropolis-Hastings Markov chain Monte Carlo method.\n\nIncluded within is the ability to sample the canonical distribution for adiabatic classical and ring polymer systems.\n\nUsage involves creating an instance of an AbstractSystem{MonteCarlo} and calling run_monte_carlo_sampling.\n\n\n\n\n\n","category":"module"},{"location":"api/NQCDynamics/initialconditions/#NQCDynamics.InitialConditions.MetropolisHastings.MonteCarlo","page":"InitialConditions","title":"NQCDynamics.InitialConditions.MetropolisHastings.MonteCarlo","text":"Parameters for Monte carlo simulations.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDynamics/initialconditions/#NQCDynamics.InitialConditions.MetropolisHastings.MonteCarloOutput","page":"InitialConditions","title":"NQCDynamics.InitialConditions.MetropolisHastings.MonteCarloOutput","text":"Container for storing simulation quantities\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDynamics/initialconditions/#NQCDynamics.InitialConditions.MetropolisHastings.acceptance_probability-Tuple{Simulation, NQCDynamics.InitialConditions.MetropolisHastings.MonteCarlo}","page":"InitialConditions","title":"NQCDynamics.InitialConditions.MetropolisHastings.acceptance_probability","text":"acceptance_probability(system::AbstractSystem{MonteCarlo})\n\nReturn the Metropolis-Hastings acceptance probability.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/initialconditions/#NQCDynamics.InitialConditions.MetropolisHastings.apply_random_perturbation!-Tuple{Atoms, NQCDynamics.InitialConditions.MetropolisHastings.MonteCarloParameters, AbstractMatrix, Integer, Integer}","page":"InitialConditions","title":"NQCDynamics.InitialConditions.MetropolisHastings.apply_random_perturbation!","text":"apply_random_perturbation!(system::AbstractSystem{MonteCarlo}, R::AbstractMatrix, atom::Integer)\n\nRandomly perturb the xyz coordinates of a single atom.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/initialconditions/#NQCDynamics.InitialConditions.MetropolisHastings.assess_proposal!-Tuple{NQCDynamics.AbstractSimulation, NQCDynamics.InitialConditions.MetropolisHastings.MonteCarloParameters, Any, Any, Any, Integer}","page":"InitialConditions","title":"NQCDynamics.InitialConditions.MetropolisHastings.assess_proposal!","text":"assess_proposal!(system::AbstractSystem{MonteCarlo}, Rᵢ, Rₚ, output, i)\n\nUpdate the energy, check for acceptance, and update the output. \n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/initialconditions/#NQCDynamics.InitialConditions.MetropolisHastings.propose_centroid_move!-Union{Tuple{T}, Tuple{RingPolymerSimulation, NQCDynamics.InitialConditions.MetropolisHastings.PathIntegralMonteCarlo, Array{T, 3}, Array{T, 3}, Integer}} where T<:AbstractFloat","page":"InitialConditions","title":"NQCDynamics.InitialConditions.MetropolisHastings.propose_centroid_move!","text":"propose_centroid_move!(system::RingPolymerSystem{MonteCarlo}, Rᵢ::Array{T, 3}, Rₚ::Array{T, 3}) where {T<:AbstractFloat}\n\nPropose a move for the ring polymer centroid for one atom.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/initialconditions/#NQCDynamics.InitialConditions.MetropolisHastings.propose_move!-Tuple{Simulation, NQCDynamics.InitialConditions.MetropolisHastings.MonteCarlo, Matrix, Matrix, Integer}","page":"InitialConditions","title":"NQCDynamics.InitialConditions.MetropolisHastings.propose_move!","text":"propose_move!(system::System{MonteCarlo}, Rᵢ::Matrix{T}, Rₚ::Matrix{T}) where {T<:AbstractFloat}\n\nPropose simple cartesian move for a single atom.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/initialconditions/#NQCDynamics.InitialConditions.MetropolisHastings.propose_normal_mode_move!-Union{Tuple{T}, Tuple{RingPolymerSimulation, NQCDynamics.InitialConditions.MetropolisHastings.PathIntegralMonteCarlo, Array{T, 3}, Array{T, 3}, Integer}} where T","page":"InitialConditions","title":"NQCDynamics.InitialConditions.MetropolisHastings.propose_normal_mode_move!","text":"propose_normal_mode_move!(system::RingPolymerSystem{MonteCarlo}, Rᵢ::Array{T, 3}, Rₚ::Array{T, 3}) where {T}\n\nPropose a move for a single normal mode for a single atom.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/initialconditions/#NQCDynamics.InitialConditions.MetropolisHastings.run_main_loop!-Tuple{Simulation, NQCDynamics.InitialConditions.MetropolisHastings.MonteCarlo, Matrix, Matrix, NQCDynamics.InitialConditions.MetropolisHastings.MonteCarloOutput}","page":"InitialConditions","title":"NQCDynamics.InitialConditions.MetropolisHastings.run_main_loop!","text":"run_main_loop!(system::System{MonteCarlo}, Rᵢ::Matrix, Rₚ::Matrix, output::MonteCarloOutput)\n\nMain loop for classical systems.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/initialconditions/#NQCDynamics.InitialConditions.MetropolisHastings.run_main_loop!-Union{Tuple{T}, Tuple{RingPolymerSimulation, NQCDynamics.InitialConditions.MetropolisHastings.PathIntegralMonteCarlo, Array{T, 3}, Array{T, 3}, NQCDynamics.InitialConditions.MetropolisHastings.MonteCarloOutput}} where T","page":"InitialConditions","title":"NQCDynamics.InitialConditions.MetropolisHastings.run_main_loop!","text":"Main loop for ring polymer systems.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/initialconditions/#NQCDynamics.InitialConditions.MetropolisHastings.run_monte_carlo_sampling-Union{Tuple{T}, Tuple{Simulation, Matrix{T}, Dict{Symbol, T}, Real}} where T","page":"InitialConditions","title":"NQCDynamics.InitialConditions.MetropolisHastings.run_monte_carlo_sampling","text":"run_monte_carlo_sampling(sim::AbstractSimulation, monte::MonteCarloParameters, R0)\n\nPerform Monte Carlo sampling for the system defined by the sim and monte parameters.\n\nFrom the initial positions specified R0 the system will be explored using the Metropolis-Hastings algorithm.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/initialconditions/#NQCDynamics.InitialConditions.MetropolisHastings.write_output!-Tuple{NQCDynamics.InitialConditions.MetropolisHastings.MonteCarloOutput, AbstractArray, AbstractFloat}","page":"InitialConditions","title":"NQCDynamics.InitialConditions.MetropolisHastings.write_output!","text":"write_output!(output::MonteCarloOutput, Rᵢ::AbstractArray, energy::AbstractFloat, i::Integer)\n\nStore the current configuration and associated energy.\n\n\n\n\n\n","category":"method"},{"location":"examples/reactive_scattering/#example-h2scattering","page":"Reactive scattering from a metal surface","title":"Reactive scattering from a metal surface","text":"","category":"section"},{"location":"examples/reactive_scattering/","page":"Reactive scattering from a metal surface","title":"Reactive scattering from a metal surface","text":"Our implementation allows us to simulate vibrational de-excitation probability during reactive scattering events at metal surfaces for any diatomic molecule with a suitable model to describe energies and forces (and friction coefficients for MDEF simulations). Here, we investigate the reactive scattering of hydrogen on a Ag(111) metal surface as a prototypical example.","category":"page"},{"location":"examples/reactive_scattering/","page":"Reactive scattering from a metal surface","title":"Reactive scattering from a metal surface","text":"To run this kind of simulation, a set of initial positions and velocities (mathbfR and mathbfdotR) with ro-vibrational quantum states nu and j have to be generated (see EBK quantisation). With a specific ro-vibrational quantum state it is possible to compute different properties after molecular collision and energy transfer with the metal surface like the vibrational de-excitation probabilities discussed here.","category":"page"},{"location":"examples/reactive_scattering/","page":"Reactive scattering from a metal surface","title":"Reactive scattering from a metal surface","text":"In order to reproduce the state-to-state vibrational de-excitation probability results presented originally by [21] for this system, the same initial conditions were generated with QuantisedDiatomic.generate_configurations setting the initial ro-vibrational quantum state to (nu=2 j=0) as was explored in the original paper. ","category":"page"},{"location":"examples/reactive_scattering/","page":"Reactive scattering from a metal surface","title":"Reactive scattering from a metal surface","text":"As shown earlier in the EBK documentation we are able to generate a semiclassically quantised distribution for a diatomic molecule on a collision course with a metal surface. In this example we follow the EBK example using the H2AgModel to prepare our initial distribution and run our simulation.","category":"page"},{"location":"examples/reactive_scattering/","page":"Reactive scattering from a metal surface","title":"Reactive scattering from a metal surface","text":"Specifically, we have produced a set of initial conditions with different translational energy (translational_energy keyword) ranging from 0.2 to 1.4 eV, locating the hydrogen molecule 8 Å away from the metal surface (height keyword) with a normal incidence.","category":"page"},{"location":"examples/reactive_scattering/","page":"Reactive scattering from a metal surface","title":"Reactive scattering from a metal surface","text":"note: Atomic units\nAs usual, all quantities default to atomic units. Here we use Unitful to input the translational energy and height using different units, where they are later converted internally.","category":"page"},{"location":"examples/reactive_scattering/","page":"Reactive scattering from a metal surface","title":"Reactive scattering from a metal surface","text":"using NQCDynamics\nusing NNInterfaces\nusing Unitful\nusing NQCDynamics.InitialConditions: QuantisedDiatomic\nusing JLD2\n\natoms = Atoms([:H, :H])\nmodel = H2AgModel()\ncell = PeriodicCell([11.1175 -5.5588 0.0; 0.0 9.628 0.0; 0.0 0.0 70.3079])\nsim = Simulation(atoms, model; cell=cell)\n\nν, J = 2, 0 # selected ro-vibrational quantum states \nnsamples = 300 # number of configurations \nEk = 0.5u\"eV\" # Translational energy [eV] ; range considered [0.2-1.4] eV\nz = 8.0u\"Å\" # Height [Å] ; fixed at 8 Å\n\nconfigurations = QuantisedDiatomic.generate_configurations(sim, ν, J;\n samples=nsamples, translational_energy=Ek, height=z)\nv = first.(configurations)\nr = last.(configurations)\n\ndistribution = DynamicalDistribution(v, r, (3,2))\nnothing # hide","category":"page"},{"location":"examples/reactive_scattering/","page":"Reactive scattering from a metal surface","title":"Reactive scattering from a metal surface","text":"tip: Saving the distribution\nGenerally it will be desirable to generate a distribution once and re-use it for multiple dynamics simulations. The simplest way to do this is to save the distribution using JLD2.jl. Refer to Saving and loading to learn more.","category":"page"},{"location":"examples/reactive_scattering/","page":"Reactive scattering from a metal surface","title":"Reactive scattering from a metal surface","text":"In order to produce an unweighted distribution, the lateral and angular orientation are randomly selected within the unit cell. As an example of the spacial and orientation distribution generated with this module, a subset of data (300 configurations) is shown below. To run our production simulations, however, a set of 80,000 initial velocities and positions were used.","category":"page"},{"location":"examples/reactive_scattering/","page":"Reactive scattering from a metal surface","title":"Reactive scattering from a metal surface","text":"(Image: initial conditions)","category":"page"},{"location":"examples/reactive_scattering/#Data-analysis-and-truncation-function","page":"Reactive scattering from a metal surface","title":"Data analysis and truncation function","text":"","category":"section"},{"location":"examples/reactive_scattering/","page":"Reactive scattering from a metal surface","title":"Reactive scattering from a metal surface","text":"Since we are interested in the dynamics only when the molecule is close to the surface, we can use a callback to terminate the simulation early to save us some time. This requires defining a function that returns true when we want the simulation to terminate. This means we can set our time span relatively long since we expect most simulations to terminate before reaching the time limit.","category":"page"},{"location":"examples/reactive_scattering/","page":"Reactive scattering from a metal surface","title":"Reactive scattering from a metal surface","text":"using Statistics: mean\nusing LinearAlgebra: norm\n\nh2distance(p) = norm(p[:,1] .- p[:,2])\n\n\"Terminates simulation if returns `true`.\" \nfunction termination_condition(u, t, integrator)::Bool\n R = get_positions(u)\n zcom = au_to_ang(mean(R[3,:])) # Convert vertical centre of mass to angstrom\n if zcom > 8.1 # Scattering event\n return true\n elseif au_to_ang(h2distance(R)) > 2.5 # Reactive event\n return true\n else\n return false\n end\nend\n\nterminate = DynamicsUtils.TerminatingCallback(termination_condition)\ntspan = (0.0, 420.0u\"fs\")\nnothing # hide","category":"page"},{"location":"examples/reactive_scattering/","page":"Reactive scattering from a metal surface","title":"Reactive scattering from a metal surface","text":"In this example, we consider the outcome a reactive event if the H-H bond length is larger than 2.5 Å in any point of during the trajectory and a scattering event if the molecule rebounds to a vertical distance from the metal surface greater than 8.1 Å.","category":"page"},{"location":"examples/reactive_scattering/#MDEF-with-the-LDFA","page":"Reactive scattering from a metal surface","title":"MDEF with the LDFA","text":"","category":"section"},{"location":"examples/reactive_scattering/","page":"Reactive scattering from a metal surface","title":"Reactive scattering from a metal surface","text":"Now that we have set up the initial distribution and some of our simulation parameters, we can choose which form of friction we would like use. First, let's use the LDFA implementation provided by the CubeLDFAModel. This takes a .cube file containing the electron density and will provide the friction during the dynamics. Here we have given the new model our model from above, which will provide the forces.","category":"page"},{"location":"examples/reactive_scattering/","page":"Reactive scattering from a metal surface","title":"Reactive scattering from a metal surface","text":"using CubeLDFAModel\nmodel = LDFAModel(model, \"../assets/friction/test.cube\", atoms, friction_atoms=[1,2], cell)","category":"page"},{"location":"examples/reactive_scattering/","page":"Reactive scattering from a metal surface","title":"Reactive scattering from a metal surface","text":"Now we can pass all the variables defined so far to the Simulation and run multiple trajectories using run_dynamics.","category":"page"},{"location":"examples/reactive_scattering/","page":"Reactive scattering from a metal surface","title":"Reactive scattering from a metal surface","text":"sim = Simulation{MDEF}(atoms, model, cell=cell, temperature=300u\"K\")\nensemble = run_dynamics(sim, tspan, distribution;selection=1:20,\n dt=0.1u\"fs\", output=OutputPosition, trajectories=20, callback=terminate)","category":"page"},{"location":"examples/reactive_scattering/#MDEF-with-neural-network-friction","page":"Reactive scattering from a metal surface","title":"MDEF with neural network friction","text":"","category":"section"},{"location":"examples/reactive_scattering/","page":"Reactive scattering from a metal surface","title":"Reactive scattering from a metal surface","text":"Above, we used the LDFA interpretation of MDEF to perform the simulation. However, the H2AgModel actually provides it's own friction tensor trained on ab initio data. This can be used by simply using the model directly, without wrapping it with the LDFAModel.","category":"page"},{"location":"examples/reactive_scattering/","page":"Reactive scattering from a metal surface","title":"Reactive scattering from a metal surface","text":"model = H2AgModel()\nsim = Simulation{MDEF}(atoms, model, cell=cell, temperature=300u\"K\")\nensemble = run_dynamics(sim, tspan, distribution;selection=1:20,\n dt=0.1u\"fs\", output=OutputPosition, trajectories=20, callback=terminate)","category":"page"},{"location":"examples/reactive_scattering/#Visualisation","page":"Reactive scattering from a metal surface","title":"Visualisation","text":"","category":"section"},{"location":"examples/reactive_scattering/","page":"Reactive scattering from a metal surface","title":"Reactive scattering from a metal surface","text":"To show the effect of the truncation procedure, we have run 20 trajectories with and without the truncation function starting with an initial translation energy at 1.0 eV. For both figures, the total and kinetic energies are shown in the top panels along with the H-H distance and centre of mass z coordinate for each individual trajectory.","category":"page"},{"location":"examples/reactive_scattering/","page":"Reactive scattering from a metal surface","title":"Reactive scattering from a metal surface","text":"(Image: truncation)","category":"page"},{"location":"NQCModels/overview/#NQCModels.jl","page":"NQCModels.jl","title":"NQCModels.jl","text":"","category":"section"},{"location":"NQCModels/overview/","page":"NQCModels.jl","title":"NQCModels.jl","text":"To perform nonadiabatic molecular dynamics simulations, it is necessary to define the system Hamiltonian. For simple models, this often comes in the form of small matrix in the diabatic representation but equally the electronic Hamiltonian could be obtained directly from ab initio electronic structure theory.","category":"page"},{"location":"NQCModels/overview/","page":"NQCModels.jl","title":"NQCModels.jl","text":"NQCModels.jl is a package that aims to provide a common interface for defining these models that is flexible enough to allow for a wide range of specifications and requirements. NQCDynamics.jl uses this interface to obtain the potentials and couplings necessary to perform the dynamics simulations. Along with the minimal interface, NQCModels.jl also provides a small set of popular models often used in the field of nonadiabatic dynamics.","category":"page"},{"location":"NQCModels/overview/","page":"NQCModels.jl","title":"NQCModels.jl","text":"note: Note\nTaking advantages of Julia's seamless modularity, NQCModels.jl is designed as a separate package so that it can also be used independently from the main package.","category":"page"},{"location":"NQCModels/overview/","page":"NQCModels.jl","title":"NQCModels.jl","text":"Depending on the quantities provided by the Model, we use Julia's abstract type system to group models that provide the same quantities. Currently, there are two top-level abstract types: AdiabaticModel and DiabaticModel. The AdiabaticModel is used for adiabatic dynamics, providing only the potential and force used in classical mechanics. The DiabaticModel is used for nonadiabatic dynamics, where the potential is instead a Hermitian matrix.","category":"page"},{"location":"NQCModels/overview/","page":"NQCModels.jl","title":"NQCModels.jl","text":"In the Getting started section we briefly touched on how the AdiabaticModel works and introduced one of the included models. Here let's take a look at a DiabaticModel, which is more appropriate for nonadiabatic dynamics.","category":"page"},{"location":"NQCModels/overview/","page":"NQCModels.jl","title":"NQCModels.jl","text":"The DoubleWell is a two state, 1 dimensional model where each state is harmonic with linear coupling to the single degree of freedom.","category":"page"},{"location":"NQCModels/overview/","page":"NQCModels.jl","title":"NQCModels.jl","text":"using NQCModels\n\nmodel = DoubleWell()","category":"page"},{"location":"NQCModels/overview/","page":"NQCModels.jl","title":"NQCModels.jl","text":"Our DoubleWell implements the functions potential, derivative, nstates and ndofs that return the potential, the derivative of the potential, the number of states, and the number of degrees of freedom, respectively.","category":"page"},{"location":"NQCModels/overview/","page":"NQCModels.jl","title":"NQCModels.jl","text":"potential(model, 0.2)\nderivative(model, 0.2)\nnstates(model)\nndofs(model)","category":"page"},{"location":"NQCModels/overview/","page":"NQCModels.jl","title":"NQCModels.jl","text":"Since this is a 1D model, the position argument that appears in the derivative and the potential is a real number. For higher dimensional models with multiple atoms, the position will need to be provided as an AbstractMatrix.","category":"page"},{"location":"NQCModels/overview/","page":"NQCModels.jl","title":"NQCModels.jl","text":"To understand how this can extend to another dimension, we can take a quick look at the GatesHollowayElbow model which is another two state diabatic model, but this one uses two dimensions to model a diatomic molecule interacting with a surface. The two coordinates are the molecular bond length and the distance from the surface. Technically, the model has been defined such that there are two atoms, each with only a single degree of freedom. This allows us to use different masses for each of the coordinates when performing dynamics.","category":"page"},{"location":"NQCModels/overview/","page":"NQCModels.jl","title":"NQCModels.jl","text":"model = GatesHollowayElbow()\npotential(model, [1.0 1.0])\nderivative(model, [1.0 1.0])\nnstates(model)\nndofs(model)","category":"page"},{"location":"NQCModels/overview/","page":"NQCModels.jl","title":"NQCModels.jl","text":"Here we see how the derivative now becomes a Matrix with size matching our input, but each entry is a Hermitian containing the elementwise derivative of the potential with respect to each degree of freedom. In this case, the Matrix has size = (1, 2), but it should be clear how this can extend to arbitrary numbers of atoms and degrees of freedom for complex models.","category":"page"},{"location":"NQCModels/overview/","page":"NQCModels.jl","title":"NQCModels.jl","text":"The models currently available can be seen in type tree of the Model below. The leaves of the tree are the concrete models, whereas each branch is one of the abstract types. Each of these models can be seen in the Analytic model library and many shall return later when we investigate the dynamics methods.","category":"page"},{"location":"NQCModels/overview/","page":"NQCModels.jl","title":"NQCModels.jl","text":"import AbstractTrees # hide\nimport InteractiveUtils: subtypes # hide\nimport NQCModels: Model # hide\nAbstractTrees.children(x::Type) = subtypes(x) # hide\nAbstractTrees.print_tree(Model) # hide","category":"page"},{"location":"NQCModels/overview/","page":"NQCModels.jl","title":"NQCModels.jl","text":"note: Contributing new models\nTo learn more about NQCModels.jl and learn how to implement new models, visit the developer documentation.","category":"page"},{"location":"devdocs/new_methods/#Contributing-a-new-method","page":"Contributing a new method","title":"Contributing a new method","text":"","category":"section"},{"location":"devdocs/new_methods/","page":"Contributing a new method","title":"Contributing a new method","text":"A key goal of NQCDynamics.jl is to provide an accessible toolkit for implementing new nonadiabatic dynamics methods. This page details the steps you must take in order to create a new dynamics method. The existing methods are stored inside the DynamicsMethods submodule, and this is where new methods should be implemented. Technically, it is possible to implement new methods completely separately from the package by importing and extending the relevant functions but if you would like to include your method in the package, it should be added within this submodule.","category":"page"},{"location":"devdocs/new_methods/","page":"Contributing a new method","title":"Contributing a new method","text":"note: Note\nGenerally, each method has its own file, though similar methods are grouped into submodules and share functionality across files. For example, multiple surface hopping methods have been implemented in the submodule DynamicsMethods.SurfaceHoppingMethods, where some functions are shared across the files. ","category":"page"},{"location":"devdocs/new_methods/#Basic-implementation","page":"Contributing a new method","title":"Basic implementation","text":"","category":"section"},{"location":"devdocs/new_methods/","page":"Contributing a new method","title":"Contributing a new method","text":"To implement a new dynamics method, the necessary steps are:","category":"page"},{"location":"devdocs/new_methods/#Create-a-new-subtype-of-DynamicsMethods.Method.","page":"Contributing a new method","title":"Create a new subtype of DynamicsMethods.Method.","text":"","category":"section"},{"location":"devdocs/new_methods/","page":"Contributing a new method","title":"Contributing a new method","text":"This Method acts as an extra parameter inside the simulation that allows us to specify any extra information needed for our dynamics method. This can be a good place to include any temporary arrays and parameters for the simulation. Refer to the Julia manual section on Composite Types to learn how this types are created. Here, our type is called MyMethod and we have included an a parameter that will influence our dynamics:","category":"page"},{"location":"devdocs/new_methods/","page":"Contributing a new method","title":"Contributing a new method","text":"using NQCDynamics\n\nstruct MyMethod <: DynamicsMethods.Method\n a::Float64\nend","category":"page"},{"location":"devdocs/new_methods/#Implement-DynamicsVariables","page":"Contributing a new method","title":"Implement DynamicsVariables","text":"","category":"section"},{"location":"devdocs/new_methods/","page":"Contributing a new method","title":"Contributing a new method","text":"This function returns an AbstractArray of the variables to be used as the initial condition for the simulation. The array should contain all of the variables that will change during the dynamics.","category":"page"},{"location":"devdocs/new_methods/","page":"Contributing a new method","title":"Contributing a new method","text":"tip: Choosing an array format\nThe only constraint on the array type is that they are AbstractArrays. It could be a simple matrix or vector, but usually we use ComponentArrays.jl to structure the variables. The ComponentVector allows us to collect variables of different types into a convenient format to perform dynamics.","category":"page"},{"location":"devdocs/new_methods/","page":"Contributing a new method","title":"Contributing a new method","text":"For classical dynamics, this would include only the positions and velocities, however, for FSSH we must also include the continuous electronic variables and the discrete state.","category":"page"},{"location":"devdocs/new_methods/","page":"Contributing a new method","title":"Contributing a new method","text":"note: Discrete variables\nSome methods such as FSSH have discontinuous variables, like the current occupied state. Discrete variables be handled separately using DEDataArrays.jl. For surface hopping methods, we have the SurfaceHoppingVariables type that uses this to combine a ComponentVector containing the continuous variables and the discrete state label.","category":"page"},{"location":"devdocs/new_methods/","page":"Contributing a new method","title":"Contributing a new method","text":"For our new method, MyMethod, we implement the DynamicsVariables function and return a ComponentVector containing the velocities, positions and extra variables x. Inside this function we are free to take any inputs and manipulate them before returning the result. As an example, suppose that our x variables are randomly generated each time we run the dynamics, this could be done as follows:","category":"page"},{"location":"devdocs/new_methods/","page":"Contributing a new method","title":"Contributing a new method","text":"using ComponentArrays\n\nfunction DynamicsMethods.DynamicsVariables(sim::Simulation{<:MyMethod}, v, r, k)\n return ComponentVector(v=v, r=r, x=rand()*k)\nend","category":"page"},{"location":"devdocs/new_methods/","page":"Contributing a new method","title":"Contributing a new method","text":"Here, we take the velocities v, positions r and assign them to the output as we would for classical dynamics, but we also generate a random between 0 and k, where k was given as input.","category":"page"},{"location":"devdocs/new_methods/#Implement-motion!(du,-u,-sim,-t)","page":"Contributing a new method","title":"Implement motion!(du, u, sim, t)","text":"","category":"section"},{"location":"devdocs/new_methods/","page":"Contributing a new method","title":"Contributing a new method","text":"This function should fill du with the time-derivative of the dynamics variables u in the usual way expected by DifferentialEquations.jl. We use the in-place version, where each element of du is filled with the time derivative of the correponding element in u.","category":"page"},{"location":"devdocs/new_methods/","page":"Contributing a new method","title":"Contributing a new method","text":"Inside the DynamicsUtils submodule there are some useful functions like velocity! and divide_by_mass! which can handle some of the common parts of the motion! function. You are free to perform whatever manipulations you like inside this function, but note that motion! is a performance critical function, called numerous times during the simulation, so you should attempt to minimise allocations inside this function.","category":"page"},{"location":"devdocs/new_methods/","page":"Contributing a new method","title":"Contributing a new method","text":"note: Note\nBy convention in Julia, functions that end with the ! modify at least one of their arguments.","category":"page"},{"location":"devdocs/new_methods/","page":"Contributing a new method","title":"Contributing a new method","text":"function DynamicsMethods.motion!(du, u, sim::Simulation{MyMethod}, t)\n\n DynamicsUtils.velocity!(du.r, u.v, u.r, sim, t) # Set du.r equal to the velocity\n\n # Set the acceleration of the particles\n du.v .= -sim.method.a .* u.r # Use the `a` parameter we stored in the `method`.\n DynamicsUtils.divide_by_mass!(du.v, sim.atoms.masses) # Divide du.v by the mass\n\n du.x .= 1 ./ u.x # Set time derivative of `x`.\n\n return nothing # The return of this function is not used so the return is unimportant\nend","category":"page"},{"location":"devdocs/new_methods/","page":"Contributing a new method","title":"Contributing a new method","text":"Here we have set the time derivative of the positions equal to the velocity, the time derivative of the velocities equal to the acceleration where the force involves the parameter a. Finally, the time derivative of the extra x variable is also set.","category":"page"},{"location":"devdocs/new_methods/#Solve-a-trajectory","page":"Contributing a new method","title":"Solve a trajectory","text":"","category":"section"},{"location":"devdocs/new_methods/","page":"Contributing a new method","title":"Contributing a new method","text":"To perform a simulation with our new method, we can write a script in the usual format and run the dynamics. In this script, we have a single atom with a mass of 1 with a single degree of freedom. We match this by initialising the positions and velocities equal to random 1x1 matrices. The a parameter of the method has been set equal to 2.0, and the initial value of x has been set to 0.5.","category":"page"},{"location":"devdocs/new_methods/","page":"Contributing a new method","title":"Contributing a new method","text":"sim = Simulation(Atoms(1), Free(), MyMethod(2.0))\nu = DynamicsVariables(sim, rand(1,1), rand(1,1), [0.5])\n\nsol = run_dynamics(sim, (0.0, 5.0), u, output=(OutputPosition, OutputVelocity, OutputDynamicsVariables))","category":"page"},{"location":"devdocs/new_methods/","page":"Contributing a new method","title":"Contributing a new method","text":"note: Note\nIn the definition of our motion! method, we have accessed only the atoms field of the simulation. This means that the model we pass to the Simulation constructor is not used. Generally the model is accessed through the calculator interface and examples of its usage can be found by referring the implementations of the existing methods.","category":"page"},{"location":"devdocs/new_methods/","page":"Contributing a new method","title":"Contributing a new method","text":"To visualise the result we can plot each of the quantities from the output table:","category":"page"},{"location":"devdocs/new_methods/","page":"Contributing a new method","title":"Contributing a new method","text":"using Plots\n\nplot(sol, :OutputPosition, label=\"Position\")\nplot!(sol, :OutputVelocity, label=\"Velocity\")\nplot!(sol, :OutputDynamicsVariables, label=\"Dynamics variables\", legend=true)\nylabel!(\"Value(t)\")","category":"page"},{"location":"devdocs/new_methods/","page":"Contributing a new method","title":"Contributing a new method","text":"note: Note\nThe additional x parameter that we created cannot be accessed in the output tuple with a pre-existing function as with position and velocity since it is not a standard quantity. Instead, we request OutputDynamicsVariables which contains all of the dynamical variables. In the plot, two of the lines labelled DynamicsVariables overlap the position and velocity result. The unique line labelled Dynamics variables is the x variable. When implementing your method, if you want to add new output quantities you should do this inside the DynamicsOutputs submodule.","category":"page"},{"location":"devdocs/new_methods/#Advanced-tips","page":"Contributing a new method","title":"Advanced tips","text":"","category":"section"},{"location":"devdocs/new_methods/#Is-there-a-custom-algorithm-you-can-implement?","page":"Contributing a new method","title":"Is there a custom algorithm you can implement?","text":"","category":"section"},{"location":"devdocs/new_methods/","page":"Contributing a new method","title":"Contributing a new method","text":"Some dynamics methods have special algorithms that are tailored to the specific problem and achieve better performance than the general algorithms include in DifferentialEquations.jl. For example, ring polymer methods typically use a symplectic scheme to solve for the internal modes of the ring polymer, allowing much larger timesteps. The DifferentialEquations.jl framework provides a simple interface for adding new algorithms, check out the developer documentation to learn how it works. You can also find some examples of custom algorithms in the DynamicsMethods.IntegrationAlgorithms module.","category":"page"},{"location":"devdocs/models/#devdocs-model","page":"Implementing a new model","title":"Implementing a new model","text":"","category":"section"},{"location":"devdocs/models/","page":"Implementing a new model","title":"Implementing a new model","text":"NQCModels.jl aims to provide a unified interface for defining model Hamiltonians for nonadiabatic dynamics simulations.","category":"page"},{"location":"devdocs/models/","page":"Implementing a new model","title":"Implementing a new model","text":"Here, we walk through the implementation of a few different types of model to explain the interface.","category":"page"},{"location":"devdocs/models/#Abstract-types","page":"Implementing a new model","title":"Abstract types","text":"","category":"section"},{"location":"devdocs/models/","page":"Implementing a new model","title":"Implementing a new model","text":"Julia's abstract type system can be likened to the inheritance concept from object-oriented programming or the trait system from Rust. It allows us to defined shared behaviour for a groups of structs and allows us to define a common set of functions that all of the concrete types must implement.","category":"page"},{"location":"devdocs/models/","page":"Implementing a new model","title":"Implementing a new model","text":"In NQCModels.jl the top level abstract type is the Model, under which all of our models must fall. The second tier below this includes the two abstract types AdiabaticModel and DiabaticModel. These form the two distinct branches within the NQCModels type hierachy and the shared behaviour across the branches is minimal. The AdiabaticModel describes the familiar form from molecular dynamics that provides a single potential energy surface. The DiabaticModel instead provides multiple potential energy surfaces with couplings between them. As implied by the name, these are in the diabatic representation. If the desired model does not fall under either of these branches, a new abstract type should be created.","category":"page"},{"location":"devdocs/models/#Minor-branches","page":"Implementing a new model","title":"Minor branches","text":"","category":"section"},{"location":"devdocs/models/","page":"Implementing a new model","title":"Implementing a new model","text":"Under the two main branches there also exists some specialised abstract types that are useful in some cases, such as when using many electronic states, or when implementing extra functions is required. See the docstrings for more info:","category":"page"},{"location":"devdocs/models/","page":"Implementing a new model","title":"Implementing a new model","text":"AdiabaticFrictionModel\nLargeDiabaticModel\nDiabaticFrictionModel","category":"page"},{"location":"devdocs/models/#Example-implementations","page":"Implementing a new model","title":"Example implementations","text":"","category":"section"},{"location":"devdocs/models/","page":"Implementing a new model","title":"Implementing a new model","text":"To implement a new model, you first select the abstract type, where you should first take a look at the docstring for the abstract type (click on the links above). There, a list of the functions that need to be implemented along with an example implementation are provided.","category":"page"},{"location":"devdocs/models/","page":"Implementing a new model","title":"Implementing a new model","text":"For further examples, you can also take a look into the source code of the NQCModels.jl package to see how the analytic models have been implemented. If you have any issues or questions about implementing a new model, open up an issue on Github and we can work together to resolve the problem. ","category":"page"},{"location":"initialconditions/langevin/#langevin-sampling","page":"Thermal Langevin dynamics","title":"Thermal Langevin dynamics","text":"","category":"section"},{"location":"initialconditions/langevin/","page":"Thermal Langevin dynamics","title":"Thermal Langevin dynamics","text":"Thermal initial conditions can be obtained directly from a Langevin dynamics simulations. See the Langevin dynamics page for more info.","category":"page"},{"location":"api/NQCDynamics/estimators/#Estimators","page":"Estimators","title":"Estimators","text":"","category":"section"},{"location":"api/NQCDynamics/estimators/","page":"Estimators","title":"Estimators","text":"Modules=[NQCDynamics.Estimators]","category":"page"},{"location":"api/NQCDynamics/estimators/#NQCDynamics.Estimators","page":"Estimators","title":"NQCDynamics.Estimators","text":"Estimators\n\nFunctions for computing thermal expectation values as ensemble averages.\n\n\n\n\n\n","category":"module"},{"location":"api/NQCDynamics/estimators/#NQCDynamics.Estimators.adiabatic_population","page":"Estimators","title":"NQCDynamics.Estimators.adiabatic_population","text":"adiabatic_population\n\n\n\n\n\n","category":"function"},{"location":"api/NQCDynamics/estimators/#NQCDynamics.Estimators.diabatic_population","page":"Estimators","title":"NQCDynamics.Estimators.diabatic_population","text":"diabatic_population\n\n\n\n\n\n","category":"function"},{"location":"api/NQCDynamics/estimators/#NQCDynamics.Estimators.kinetic_energy-Tuple{Simulation, Any}","page":"Estimators","title":"NQCDynamics.Estimators.kinetic_energy","text":"kinetic_energy(sim, u)\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/estimators/#NQCDynamics.Estimators.potential_energy-Tuple{NQCDynamics.AbstractSimulation, Any}","page":"Estimators","title":"NQCDynamics.Estimators.potential_energy","text":"potential_energy(sim, u)\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/estimators/#NQCDynamics.Estimators.radius_of_gyration-Union{Tuple{T}, Tuple{RingPolymerSimulation, AbstractArray{T, 3}}} where T","page":"Estimators","title":"NQCDynamics.Estimators.radius_of_gyration","text":"radius_of_gyration(sim, r)\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/estimators/#NQCDynamics.Estimators.total_energy-Tuple{NQCDynamics.AbstractSimulation, Any}","page":"Estimators","title":"NQCDynamics.Estimators.total_energy","text":"total_energy(sim, u)\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/estimators/#NQCDynamics.Estimators.@estimate-Tuple{Any}","page":"Estimators","title":"NQCDynamics.Estimators.@estimate","text":"@estimate f(simulation, vector)\n\nEvaluate f(simulation, vector[i]) for all i and return the average.\n\nCan be used for any function defined in Estimators.jl.\n\n\n\n\n\n","category":"macro"},{"location":"NQCModels/analyticmodels/#Analytic-model-library","page":"Analytic model library","title":"Analytic model library","text":"","category":"section"},{"location":"NQCModels/analyticmodels/","page":"Analytic model library","title":"Analytic model library","text":"This page plots many of the analytic models included in NQCDynamics.","category":"page"},{"location":"NQCModels/analyticmodels/","page":"Analytic model library","title":"Analytic model library","text":"tip: Tip\nTo produce the plots we use two of Julia's plotting options Plots and Makie. Plots has a mature recipe system that allows us to define custom plots for the 1D models but we use Makie to produce the more complex images. Each of these has their pros and cons and if you are interested in producing plots using Julia you should visit their documentation to decide which is best for you.","category":"page"},{"location":"NQCModels/analyticmodels/#[AdiabaticModels](@ref-NQCModels.AdiabaticModels)","page":"Analytic model library","title":"AdiabaticModels","text":"","category":"section"},{"location":"NQCModels/analyticmodels/","page":"Analytic model library","title":"Analytic model library","text":"These models are used for classical dynamics and provide a single potential energy surface.","category":"page"},{"location":"NQCModels/analyticmodels/#[Harmonic](@ref)","page":"Analytic model library","title":"Harmonic","text":"","category":"section"},{"location":"NQCModels/analyticmodels/","page":"Analytic model library","title":"Analytic model library","text":"using NQCModels, Plots\nplot(-10:0.1:10, Harmonic())","category":"page"},{"location":"NQCModels/analyticmodels/#[DiatomicHarmonic](@ref)","page":"Analytic model library","title":"DiatomicHarmonic","text":"","category":"section"},{"location":"NQCModels/analyticmodels/","page":"Analytic model library","title":"Analytic model library","text":"using NQCModels\nusing Plots\n\nmodel = DiatomicHarmonic(r₀=10.0)\nf(x,y) = potential(model, [x y 0])\ncontour(-10:0.1:10, -10:0.1:10, f, fill=true)\nxlabel!(\"x coordinate /a₀\")\nylabel!(\"y coordinate /a₀\")","category":"page"},{"location":"NQCModels/analyticmodels/#[DarlingHollowayElbow](@ref)","page":"Analytic model library","title":"DarlingHollowayElbow","text":"","category":"section"},{"location":"NQCModels/analyticmodels/","page":"Analytic model library","title":"Analytic model library","text":"using NQCModels\nusing NQCBase: eV_to_au\nusing CairoMakie\n\nmodel = DarlingHollowayElbow()\nV(x,z) = potential(model, [x, z])\n\nx = range(-0.5, 3.5, length=200)\nz = range(-0.5, 4.5, length=200)\n\nf = Figure()\nax = Axis(f[1,1], xlabel=\"Bond length /a₀\", ylabel=\"Surface molecule distance /a₀\")\n\nlevels = eV_to_au.([-0.1, 0.1, 0.3, 0.5, 0.7, 0.9, 1.1])\ncontourf!(ax, x, z, V, levels=levels)\ncontour!(ax, x, z, V, levels=levels, color=:black)\nColorbar(f[1,2], limits=(-0.1, 1.1))\nxlims!(-0.5, 3.5)\nylims!(-0.5, 4.5)\nf","category":"page"},{"location":"NQCModels/analyticmodels/#[DiabaticModels](@ref-NQCModels.DiabaticModels)","page":"Analytic model library","title":"DiabaticModels","text":"","category":"section"},{"location":"NQCModels/analyticmodels/","page":"Analytic model library","title":"Analytic model library","text":"These models define a Hermitian potential operator in a diabatic basis. These can be used for various forms of nonadiabatic dynamics.","category":"page"},{"location":"NQCModels/analyticmodels/#[TullyModelOne](@ref)","page":"Analytic model library","title":"TullyModelOne","text":"","category":"section"},{"location":"NQCModels/analyticmodels/","page":"Analytic model library","title":"Analytic model library","text":"using NQCModels, Plots\nplot(-10:0.1:10, TullyModelOne(); coupling=true)","category":"page"},{"location":"NQCModels/analyticmodels/#[TullyModelTwo](@ref)","page":"Analytic model library","title":"TullyModelTwo","text":"","category":"section"},{"location":"NQCModels/analyticmodels/","page":"Analytic model library","title":"Analytic model library","text":"using NQCModels, Plots\nplot(-10:0.1:10, TullyModelTwo(); coupling=true)","category":"page"},{"location":"NQCModels/analyticmodels/#[TullyModelThree](@ref)","page":"Analytic model library","title":"TullyModelThree","text":"","category":"section"},{"location":"NQCModels/analyticmodels/","page":"Analytic model library","title":"Analytic model library","text":"using NQCModels, Plots\nplot(-10:0.1:10, TullyModelThree(); coupling=true)","category":"page"},{"location":"NQCModels/analyticmodels/#[ThreeStateMorse](@ref)","page":"Analytic model library","title":"ThreeStateMorse","text":"","category":"section"},{"location":"NQCModels/analyticmodels/","page":"Analytic model library","title":"Analytic model library","text":"using NQCModels, Plots\nplot(2:0.01:12, ThreeStateMorse(), ylims=(0, 0.06), coupling=true)","category":"page"},{"location":"NQCModels/analyticmodels/#[OuyangModelOne](@ref)","page":"Analytic model library","title":"OuyangModelOne","text":"","category":"section"},{"location":"NQCModels/analyticmodels/","page":"Analytic model library","title":"Analytic model library","text":"using NQCModels, Plots\nplot(-10:0.1:10, OuyangModelOne())","category":"page"},{"location":"NQCModels/analyticmodels/#[DoubleWell](@ref)","page":"Analytic model library","title":"DoubleWell","text":"","category":"section"},{"location":"NQCModels/analyticmodels/","page":"Analytic model library","title":"Analytic model library","text":"using NQCModels, Plots\nplot(-5:0.1:5, DoubleWell(); coupling=true)","category":"page"},{"location":"NQCModels/analyticmodels/#[GatesHollowayElbow](@ref)","page":"Analytic model library","title":"GatesHollowayElbow","text":"","category":"section"},{"location":"NQCModels/analyticmodels/","page":"Analytic model library","title":"Analytic model library","text":"using NQCModels\nusing CairoMakie\n\nmodel = GatesHollowayElbow()\nv1(x,z) = potential(model, [x z])[1,1]\nv2(x,z) = potential(model, [x z])[2,2]\ncoupling(x,z) = potential(model, [x z])[1,2]\n\nx = range(-0.5, 4.0, length=200)\nz = range(-0.5, 4.0, length=200)\n\nf = Figure()\nax = Axis(f[1,1], xlabel=\"x coordinate\", ylabel=\"z coordinate\", limits=(-0.5, 4.0, -0.5, 4.0))\n\ncontour!(ax, x, z, coupling, color=:black, levels=10, label=\"V12\")\ncontour!(ax, x, z, v1, color=:blue, levels=0:0.01:0.1, label=\"V11\")\ncontour!(ax, x, z, v2, color=:red, levels=0:0.01:0.1, label=\"V22\")\nf","category":"page"},{"location":"#Introduction","page":"Introduction","title":"Introduction","text":"","category":"section"},{"location":"","page":"Introduction","title":"Introduction","text":"Welcome to the documentation for NQCDynamics, a package for performing nonadiabatic molecular dynamics simulations. The documentation covers both how to use the existing code and describes the intricacies of the implementations, hoping to make further contributions as simple as possible.","category":"page"},{"location":"#Objectives","page":"Introduction","title":"Objectives","text":"","category":"section"},{"location":"","page":"Introduction","title":"Introduction","text":"Achieve high performance along with good readability, extensibility, maintainability\nHandle both simple models and high-dimensional systems\nHighlight the advantages of Julia in the field of nonadiabatic dynamics\nEncourage code sharing and reuse within the nonadiabatic dynamics community","category":"page"},{"location":"","page":"Introduction","title":"Introduction","text":"Reproducibility is a pressing issue in the field of theoretical chemistry and physics as often studies either do not attempt to provide all necessary data or code for full reproducibility of the work. This can lead to difficulties when attempting to better understand the theory and implementation of the method and makes it difficult for students not only to learn existing models and theories, but also to improve and extend these. This project provides implementations for existing dynamics methods along with a framework that can be used for future research with the goal of encouraging greater code sharing and reuse within the nonadiabatic dynamics community.","category":"page"},{"location":"#Features","page":"Introduction","title":"Features","text":"","category":"section"},{"location":"","page":"Introduction","title":"Introduction","text":"Here we provide a list of currently implemented features of the code. We encourage contributions and implementations of methods. To do so, please open up an issue/pull request on Github!","category":"page"},{"location":"#Dynamics-methods","page":"Introduction","title":"Dynamics methods","text":"","category":"section"},{"location":"","page":"Introduction","title":"Introduction","text":"Classical molecular dynamics\nClassical Langevin dynamics\nFewest-switches surface hopping (FSSH)\nMolecular dynamics with electronic friction (MDEF)\nRing polymer molecular dynamics (RPMD)\nNonadiabatic ring polymer molecular dynamics (NRPMD)\nRing polymer surface hopping (RPSH)\nEhrenfest molecular dynamics","category":"page"},{"location":"#Generating-initial-conditions","page":"Introduction","title":"Generating initial conditions","text":"","category":"section"},{"location":"","page":"Introduction","title":"Introduction","text":"Thermal Metropolis-Hastings Monte Carlo\nThermal Hamiltonian Monte Carlo\nLangevin dynamics\nSemiclassical EBK quantisation","category":"page"},{"location":"#Dynamics-with-DifferentialEquations.jl","page":"Introduction","title":"Dynamics with DifferentialEquations.jl","text":"","category":"section"},{"location":"","page":"Introduction","title":"Introduction","text":"The DifferentialEquations ecosystem from the SciML organisation provides a large library of integration algorithms along with a simple interface for implementing new algorithms that can be tailored for specific nonadiabatic dynamics methods. Further, they provide helpful utilities for introducing discontinuities through the callback interface or handling many trajectories at once to obtain ensemble averaged observables with the ensemble interface. We can take advantage of these utilities by basing our dynamics setup on this framework which significantly simplifies the implementation of new methods.","category":"page"},{"location":"#Installation","page":"Introduction","title":"Installation","text":"","category":"section"},{"location":"#.-Install-Julia","page":"Introduction","title":"1. Install Julia","text":"","category":"section"},{"location":"","page":"Introduction","title":"Introduction","text":"Download and install the current stable release from the Julia website. For most platforms julia is provided as a precompiled binary and do not require any installation procedure. However, you need to specify the path to julia or create a symbolic link to the executable that is in your systempath. ","category":"page"},{"location":"#.-Install-the-NQCRegistry","page":"Introduction","title":"2. Install the NQCRegistry","text":"","category":"section"},{"location":"","page":"Introduction","title":"Introduction","text":"Since the package is not included in the default registry (General), we must first install the NQCRegistry. This gives access to the core NQCDynamics package along with some dependencies and add-ons. First, enter the Julia REPL by executing julia from the command line. Then press ] to enter pkg mode. The prompt should change from julia> to pkg>. Install the registry directly from Github with: ","category":"page"},{"location":"","page":"Introduction","title":"Introduction","text":"pkg> registry add \"https://github.com/NQCD/NQCRegistry\"","category":"page"},{"location":"","page":"Introduction","title":"Introduction","text":"warning: Warning\nIf this is the first time you're using Julia there's a chance that the General registry will not have been installed. Run pkg> registry status to view the installed registries. If General is not present, run pkg> registry add General before proceeding to the next step.","category":"page"},{"location":"#.-Install-the-package","page":"Introduction","title":"3. Install the package","text":"","category":"section"},{"location":"","page":"Introduction","title":"Introduction","text":"Now that the registry has been added, the package can be installed in the same way as any other registered Julia package:","category":"page"},{"location":"","page":"Introduction","title":"Introduction","text":"pkg> add NQCDynamics","category":"page"},{"location":"#.-Use-the-package!","page":"Introduction","title":"4. Use the package!","text":"","category":"section"},{"location":"","page":"Introduction","title":"Introduction","text":"julia> using NQCDynamics","category":"page"},{"location":"","page":"Introduction","title":"Introduction","text":"You are now free to proceed to the next section and learn how to use the package. If you would like you can complete step 5 to double check your installation.","category":"page"},{"location":"#.-Run-the-tests-(optional)","page":"Introduction","title":"5. Run the tests (optional)","text":"","category":"section"},{"location":"","page":"Introduction","title":"Introduction","text":"To check the package has been installed correctly and everything is working, you can execute the tests with:","category":"page"},{"location":"","page":"Introduction","title":"Introduction","text":"pkg> test NQCDynamics","category":"page"},{"location":"","page":"Introduction","title":"Introduction","text":"warning: Warning\nThe tests use some extra functionality from the JuliaMolSim registry which can be added directly from Github with pkg> registry add \"https://github.com/JuliaMolSim/MolSim\". Without this, the tests will not run successfully.","category":"page"},{"location":"#How-to-use-this-documentation","page":"Introduction","title":"How to use this documentation","text":"","category":"section"},{"location":"","page":"Introduction","title":"Introduction","text":"The first page to read is the Getting started section which walks through all the ingredients needed to perform a conventional classical molecular dynamics simulation. After this, the reader is free to explore at their leisure since everything else builds directly upon sections from the Getting started page.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpsh/#rpsh-dynamics","page":"Ring polymer surface hopping (RPSH)","title":"Ring polymer surface hopping (RPSH)","text":"","category":"section"},{"location":"dynamicssimulations/dynamicsmethods/rpsh/","page":"Ring polymer surface hopping (RPSH)","title":"Ring polymer surface hopping (RPSH)","text":"Ring polymer surface hopping was one of the early attempts to extend RPMD to the realm of nonadiabatic dynamics [17]. On the surface, the concept is reasonably simple. Since RPMD proceeds on a single adiabatic surface, it should be possible to directly combine the FSSH scheme with ring polymer dynamics to approximately include nuclear quantum effects in the surface hopping dynamics. However, there are some ambiguities surrounding the exact implementation when considering how to couple the electronic equations to the nuclear equations and how the velocity rescaling should be implemented.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpsh/","page":"Ring polymer surface hopping (RPSH)","title":"Ring polymer surface hopping (RPSH)","text":"Originally, two varieties were proposed: the bead approximation and the centroid approximation. The centroid approximation is the simpler of the two and involves directly replacing the classical particle in the FSSH algorithm with the ring polymer centroid. This means that the nonadiabatic couplings evaluated at the centroid and the centroid velocity are used to propagate the electronic equations, and the kinetic energy is conserved on the centroid level. This is the version that is implemented here.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpsh/","page":"Ring polymer surface hopping (RPSH)","title":"Ring polymer surface hopping (RPSH)","text":"The bead approximation involves evaluating the nonadiabatic couplings for every bead and using these contributions from every bead to propagate the electronics. This version acts to conserve the kinetic energy for the entire ring polymer. [17] describes both the centroid and bead approximations, [18] uses the centroid approximation.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpsh/#Example","page":"Ring polymer surface hopping (RPSH)","title":"Example","text":"","category":"section"},{"location":"dynamicssimulations/dynamicsmethods/rpsh/","page":"Ring polymer surface hopping (RPSH)","title":"Ring polymer surface hopping (RPSH)","text":"In this example we can apply RPSH to the ThreeStateMorse model as shown in the supporting info of [18]. This model has a single particle with mass of 20000 a.u. and we use 4 beads for the ring polymer.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpsh/","page":"Ring polymer surface hopping (RPSH)","title":"Ring polymer surface hopping (RPSH)","text":"using NQCDynamics\nusing Unitful\n\natoms = Atoms(20000)\nmodel = ThreeStateMorse()\nsim = RingPolymerSimulation{FSSH}(atoms, model, 4; temperature=300u\"K\")\nnothing # hide","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpsh/","page":"Ring polymer surface hopping (RPSH)","title":"Ring polymer surface hopping (RPSH)","text":"For our initial conditions let's use a position distribution centred at 2.1 a.u. with Boltzmann velocities at 300 K.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpsh/","page":"Ring polymer surface hopping (RPSH)","title":"Ring polymer surface hopping (RPSH)","text":"using Distributions: Normal\n\nposition = Normal(2.1, 1 / sqrt(20000 * 0.005))\nvelocity = VelocityBoltzmann(300u\"K\" * nbeads(sim), masses(sim), (1,1))\ndistribution = DynamicalDistribution(velocity, position, size(sim)) * PureState(1)\nnothing # hide","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpsh/","page":"Ring polymer surface hopping (RPSH)","title":"Ring polymer surface hopping (RPSH)","text":"Now let's run an ensemble of trajectories that sample from this distribution. For the output we will receive the diabatic population at intervals of t=50 and it will be averaged over all trajectories by the :mean keyword.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpsh/","page":"Ring polymer surface hopping (RPSH)","title":"Ring polymer surface hopping (RPSH)","text":"solution = run_dynamics(sim, (0.0, 3000.0), distribution;\n saveat=50, trajectories=50, dt=1,\n output=TimeCorrelationFunctions.PopulationCorrelationFunction(sim, Diabatic()),\n reduction=MeanReduction())","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpsh/","page":"Ring polymer surface hopping (RPSH)","title":"Ring polymer surface hopping (RPSH)","text":"note: Note\nIn the examples section at the end of the documentation we will return to this model and compare the performance of multiple methods.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpsh/","page":"Ring polymer surface hopping (RPSH)","title":"Ring polymer surface hopping (RPSH)","text":"Here we plot diabatic population of each state as a function of time. The result closely resembles the literature reference ([18]). The small discrepancy that occurs at around t=2000 is due to our use of an alternative method to calculate the diabatic populations. A discussion on this topic is available from [19].","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpsh/","page":"Ring polymer surface hopping (RPSH)","title":"Ring polymer surface hopping (RPSH)","text":"using Plots\n\nplot(0:50:3000, [p[1,1] for p in solution[:PopulationCorrelationFunction]], label=\"State 1\")\nplot!(0:50:3000, [p[1,2] for p in solution[:PopulationCorrelationFunction]], label=\"State 2\")\nplot!(0:50:3000, [p[1,3] for p in solution[:PopulationCorrelationFunction]], label=\"State 3\")\nxlabel!(\"Time /a.u.\")\nylabel!(\"Population\")","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpsh/","page":"Ring polymer surface hopping (RPSH)","title":"Ring polymer surface hopping (RPSH)","text":"For our simulation we are using a Normal distribution to initialise our ring polymer configuration. Since ring polymer surface hopping has not been rigorously derived, this choice is somewhat arbitrary and it is possible that better results could be achieved using a free ring polymer distribution instead. [20] provides a theoretical description of how nonequilibrium simulations using RPMD should be performed. This techniques here should likely be applied to RPSH too.","category":"page"},{"location":"references/#References","page":"References","title":"References","text":"","category":"section"},{"location":"references/","page":"References","title":"References","text":"","category":"page"},{"location":"examples/threestatemorse/#Time-dependent-populations-with-the-ThreeStateMorse-model","page":"Time-dependent populations with the ThreeStateMorse model","title":"Time-dependent populations with the ThreeStateMorse model","text":"","category":"section"},{"location":"examples/threestatemorse/","page":"Time-dependent populations with the ThreeStateMorse model","title":"Time-dependent populations with the ThreeStateMorse model","text":"In this example we investigate the time-dependent populations of the three state morse model parametrised to describe photodissociation processes ([23]). This reference introduces three versions of this model with different parameter sets. Our ThreeStateMorse model matches model C from the reference.","category":"page"},{"location":"examples/threestatemorse/","page":"Time-dependent populations with the ThreeStateMorse model","title":"Time-dependent populations with the ThreeStateMorse model","text":"First let's visualise the diabats and couplings for the model. You can see two regions where the diabats cross with non-zero coupling where we can expect to see population transfer.","category":"page"},{"location":"examples/threestatemorse/","page":"Time-dependent populations with the ThreeStateMorse model","title":"Time-dependent populations with the ThreeStateMorse model","text":"using NQCDynamics\nusing CairoMakie\n\nx = range(2, 12, length=200)\nmodel = ThreeStateMorse()\nV = potential.(model, x)\n\nfig = Figure()\nax = Axis(fig[1,1], xlabel=\"Nuclear coordinate /a.u.\", ylabel=\"Potential energy /a.u.\")\n\nlines!(ax, x, [v[1,1] for v in V], label=\"State 1\")\nlines!(ax, x, [v[2,2] for v in V], label=\"State 2\")\nlines!(ax, x, [v[3,3] for v in V], label=\"State 3\")\n\nlines!(ax, x, [v[1,2] for v in V], label=\"Coupling 12\")\nlines!(ax, x, [v[2,3] for v in V], label=\"Coupling 23\")\nlines!(ax, x, [v[1,3] for v in V], label=\"Coupling 13\")\n\nxlims!(2, 12)\nylims!(0, 0.06)\naxislegend(ax)\n\nfig ","category":"page"},{"location":"examples/threestatemorse/","page":"Time-dependent populations with the ThreeStateMorse model","title":"Time-dependent populations with the ThreeStateMorse model","text":"To this model we can apply any of the methods capable of starting the population on a single diabatic state and returning the population as a function of time. Here, let's use FSSH and Ehrenfest. We can expect the nuclear quantum effects here to be minimal since the nuclear mass is chosen to be 20000. ","category":"page"},{"location":"examples/threestatemorse/","page":"Time-dependent populations with the ThreeStateMorse model","title":"Time-dependent populations with the ThreeStateMorse model","text":"m = 20000\natoms = Atoms(m)\nnothing # hide","category":"page"},{"location":"examples/threestatemorse/","page":"Time-dependent populations with the ThreeStateMorse model","title":"Time-dependent populations with the ThreeStateMorse model","text":"For our initial conditions, we use the Wigner distribution for a Harmonic oscillator centred at 2.1 with a frequency of 5e-3 at a temperature of 300 K. This distribution is chosen to mimic a thermal ground state distribution before photoexcitation.","category":"page"},{"location":"examples/threestatemorse/","page":"Time-dependent populations with the ThreeStateMorse model","title":"Time-dependent populations with the ThreeStateMorse model","text":"using Distributions: Normal\nusing Unitful, UnitfulAtomic\n\nω = 5e-3\nβ = 1/austrip(300u\"K\")\nposition = PositionHarmonicWigner(ω, β, m; centre=2.1)\nvelocity = VelocityHarmonicWigner(ω, β, m)\ndistribution = DynamicalDistribution(velocity, position, (1,1)) * PureState(1)\nnothing # hide","category":"page"},{"location":"examples/threestatemorse/","page":"Time-dependent populations with the ThreeStateMorse model","title":"Time-dependent populations with the ThreeStateMorse model","text":"Now let's run the two simulations using Ehrenfest and FSSH. For both simulations we use the same initial distribution and average the results using reduction=:mean. TimeCorrelationFunctions.PopulationCorrelationFunction will correlate the intial population with the final population at each timestep.","category":"page"},{"location":"examples/threestatemorse/","page":"Time-dependent populations with the ThreeStateMorse model","title":"Time-dependent populations with the ThreeStateMorse model","text":"sim = Simulation{FSSH}(atoms, model)\nfssh_result = run_dynamics(sim, (0.0, 3000.0), distribution;\n saveat=10, trajectories=50,\n output=TimeCorrelationFunctions.PopulationCorrelationFunction(sim, Diabatic()),\n reduction=MeanReduction(), dt=1.0)\nsim = Simulation{Ehrenfest}(atoms, model)\nehrenfest_result = run_dynamics(sim, (0.0, 3000.0), distribution;\n saveat=10, trajectories=50,\n output=TimeCorrelationFunctions.PopulationCorrelationFunction(sim, Diabatic()),\n reduction=MeanReduction(), dt=1.0)\n\nfig = Figure()\nax = Axis(fig[1,1], xlabel=\"Time /a.u.\", ylabel=\"Population\")\n\nx = 0:10:3000\nlines!(ax, x, [p[1,1] for p in fssh_result[:PopulationCorrelationFunction]], label=\"FSSH State 1\", color=:red)\nlines!(ax, x, [p[1,2] for p in fssh_result[:PopulationCorrelationFunction]], label=\"FSSH State 2\", color=:green)\nlines!(ax, x, [p[1,3] for p in fssh_result[:PopulationCorrelationFunction]], label=\"FSSH State 3\", color=:blue)\n\nlines!(ax, x, [p[1,1] for p in ehrenfest_result[:PopulationCorrelationFunction]], label=\"Ehrenfest State 1\", color=:red, linestyle=:dash)\nlines!(ax, x, [p[1,2] for p in ehrenfest_result[:PopulationCorrelationFunction]], label=\"Ehrenfest State 2\", color=:green, linestyle=:dash)\nlines!(ax, x, [p[1,3] for p in ehrenfest_result[:PopulationCorrelationFunction]], label=\"Ehrenfest State 3\", color=:blue, linestyle=:dash)\naxislegend(ax)\n\nfig","category":"page"},{"location":"examples/threestatemorse/","page":"Time-dependent populations with the ThreeStateMorse model","title":"Time-dependent populations with the ThreeStateMorse model","text":"To reduce the build time for the documentation the results here are underconverged but already it is clear that both of these methods come close to the exact result shown by [23]. After performing enough trajectories to converge the population dynamics, we would be better able to judge the effectiveness of FSSH and Ehrenfest at reproducing the exact quantum dynamics for this model.","category":"page"},{"location":"devdocs/diffeq/#DifferentialEquations.jl-integration","page":"DifferentialEquations.jl integration","title":"DifferentialEquations.jl integration","text":"","category":"section"},{"location":"devdocs/diffeq/","page":"DifferentialEquations.jl integration","title":"DifferentialEquations.jl integration","text":"NQCDynamics.jl is built directly on top of the established DifferentialEquations.jl that provides a vast array of features. By using DifferentialEquations.jl to perform the dynamics, we can immediately exploit many of these features to save us a lot of work. This page details some of the features from DifferentialEquations.jl that we have used.","category":"page"},{"location":"devdocs/diffeq/#devdocs-callbacks","page":"DifferentialEquations.jl integration","title":"Callbacks","text":"","category":"section"},{"location":"devdocs/diffeq/","page":"DifferentialEquations.jl integration","title":"DifferentialEquations.jl integration","text":"Callbacks allow us to introduce extra code during the dynamics without needing to meddle with the integration code directly. On the developer side, [Callbacks] is the mechanism used for the saving in the run_dynamics function and the surface hopping procedure during FSSH. The user can also write their own callbacks and give these to any of the dynamics functions to manipulate the progress of the dynamics or introduce their own saving mechanism.","category":"page"},{"location":"devdocs/diffeq/","page":"DifferentialEquations.jl integration","title":"DifferentialEquations.jl integration","text":"We also provide two pre-made callbacks which can be given to the dynamics functions. These are the TerminatingCallback, for terminating the simulation early, and the CellBoundaryCallback that can be used to ensure the atoms obey the periodicity of the simulation cell.","category":"page"},{"location":"devdocs/diffeq/","page":"DifferentialEquations.jl integration","title":"DifferentialEquations.jl integration","text":"Here, we can show how these callbacks can be used in tandem to alter the course of the simulation. Let's look at a classical dynamics simulation without any extra callbacks:","category":"page"},{"location":"devdocs/diffeq/","page":"DifferentialEquations.jl integration","title":"DifferentialEquations.jl integration","text":"using NQCDynamics\nusing Plots\n\natoms = Atoms(:C)\nmodel = NQCModels.Harmonic()\ncell = PeriodicCell(hcat(50))\nsim = Simulation(atoms, model; cell=cell)\n\nz = DynamicsVariables(sim, hcat(1.0), zeros(1,1))\n\nsolution = run_dynamics(sim, (0.0, 300), z; dt=1.0, output=OutputPosition)\nplot(solution, :OutputPosition, label=\"No callbacks\", legend=true)","category":"page"},{"location":"devdocs/diffeq/","page":"DifferentialEquations.jl integration","title":"DifferentialEquations.jl integration","text":"Now we can introduce callbacks and observe the difference:","category":"page"},{"location":"devdocs/diffeq/","page":"DifferentialEquations.jl integration","title":"DifferentialEquations.jl integration","text":"solution = run_dynamics(sim, (0.0, 300), z; callback=DynamicsUtils.CellBoundaryCallback(), dt=1.0, output=OutputPosition)\nplot!(solution, :OutputPosition, label=\"Cell boundary\" )\n\nusing DiffEqBase: CallbackSet\nterminate(u, t, integrator) = t > 100\ncallbacks = CallbackSet(DynamicsUtils.CellBoundaryCallback(), DynamicsUtils.TerminatingCallback(terminate))\nsolution = run_dynamics(sim, (0.0, 300), z; callback=callbacks, dt=1.0, output=OutputPosition)\nplot!(solution, :OutputPosition, label=\"Cell + termination\")","category":"page"},{"location":"devdocs/diffeq/","page":"DifferentialEquations.jl integration","title":"DifferentialEquations.jl integration","text":"See how the callbacks have altered the dynamics? The atom no longer leaves the simulation cell, and the termination caused the simulation to exit early. ","category":"page"},{"location":"devdocs/diffeq/","page":"DifferentialEquations.jl integration","title":"DifferentialEquations.jl integration","text":"The callback setup we're using is exactly that provided by DifferentialEquations.jl, if you want more details on callbacks, please refer to their documentation.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/classical/#classical-dynamics","page":"Classical molecular dynamics","title":"Classical molecular dynamics","text":"","category":"section"},{"location":"dynamicssimulations/dynamicsmethods/classical/","page":"Classical molecular dynamics","title":"Classical molecular dynamics","text":"Classical (molecular) dynamics proceeds by solving the dynamics for a system governed by a classical Hamiltonian containing the kinetic energy of the particles and a potential energy function:","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/classical/","page":"Classical molecular dynamics","title":"Classical molecular dynamics","text":"H = fracP^22M + V(R)","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/classical/","page":"Classical molecular dynamics","title":"Classical molecular dynamics","text":"To integrate the equations we use the VelocityVerlet() algorithm from DifferentialEquations.jl, which is one of the most widely used algorithms for molecular dynamics.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/classical/#Example","page":"Classical molecular dynamics","title":"Example","text":"","category":"section"},{"location":"dynamicssimulations/dynamicsmethods/classical/","page":"Classical molecular dynamics","title":"Classical molecular dynamics","text":"We can create two particles with mass = 1 and attach a DiatomicHarmonic interaction which provides a harmonic interatomic potential.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/classical/","page":"Classical molecular dynamics","title":"Classical molecular dynamics","text":"note: Note\nRecall that the constructor for Simulation(...) when called without a type parameter as below defaults to Simulation{Classical}(...).","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/classical/","page":"Classical molecular dynamics","title":"Classical molecular dynamics","text":"using NQCDynamics\nusing Plots\n\nsim = Simulation(Atoms([1, 1]), DiatomicHarmonic())\nv = rand(3, 2)\nu0 = DynamicsVariables(sim, zeros(3, 2), hcat(randn(3), randn(3).+1))\n\ntraj = run_dynamics(sim, (0.0, 10.0), u0; dt=0.1, output=OutputPosition)\n\nplot(traj, :OutputPosition)","category":"page"},{"location":"api/NQCDynamics/ringpolymers/#RingPolymers","page":"RingPolymers","title":"RingPolymers","text":"","category":"section"},{"location":"api/NQCDynamics/ringpolymers/","page":"RingPolymers","title":"RingPolymers","text":"Modules=[NQCDynamics.RingPolymers]","category":"page"},{"location":"api/NQCDynamics/ringpolymers/#NQCDynamics.RingPolymers.RingPolymerParameters-Union{Tuple{T}, Tuple{Integer, Real, AbstractVector{Symbol}, Vector{Symbol}}} where T","page":"RingPolymers","title":"NQCDynamics.RingPolymers.RingPolymerParameters","text":"Constructor for choosing specific elements to be quantum.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/ringpolymers/#NQCDynamics.RingPolymers.RingPolymerParameters-Union{Tuple{T}, Tuple{Integer, Real, Integer}} where T","page":"RingPolymers","title":"NQCDynamics.RingPolymers.RingPolymerParameters","text":"Constructor for the case where all nuclei are quantum.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/ringpolymers/#NQCDynamics.RingPolymers.cayley_propagator-Union{Tuple{T}, Tuple{NQCDynamics.RingPolymers.RingPolymerParameters{T}, Real}} where T","page":"RingPolymers","title":"NQCDynamics.RingPolymers.cayley_propagator","text":"cayley_propagator(beads::RingPolymerParameters{T}, dt::Real; half::Bool=true) where {T}\n\nJ. Chem. Phys. 151, 124103 (2019); doi: 10.1063/1.5120282\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/ringpolymers/#NQCDynamics.RingPolymers.get_spring_energy-Tuple{NQCDynamics.RingPolymers.RingPolymerParameters, Any, Any}","page":"RingPolymers","title":"NQCDynamics.RingPolymers.get_spring_energy","text":"get_spring_energy(beads::RingPolymerParameters, masses, R)\n\nCalculate the ring polymer spring potential.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/ringpolymers/#NQCDynamics.RingPolymers.get_spring_matrix-Tuple{Integer, Real}","page":"RingPolymers","title":"NQCDynamics.RingPolymers.get_spring_matrix","text":"get_L(n_beads, mass, ω_n)\n\nReturn the Circulant symmetric matrix for the ring polymer springs.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/ensembles/#Ensembles","page":"Ensembles","title":"Ensembles","text":"","category":"section"},{"location":"api/NQCDynamics/ensembles/","page":"Ensembles","title":"Ensembles","text":"Modules=[NQCDynamics.Ensembles]","category":"page"},{"location":"api/NQCDynamics/ensembles/#NQCDynamics.Ensembles","page":"Ensembles","title":"NQCDynamics.Ensembles","text":"Ensembles\n\nThis module provides the main function run_dynamics. This serves to run multiple trajectories for a given simulation type, sampling from an initial distribution.\n\n\n\n\n\n","category":"module"},{"location":"api/NQCDynamics/ensembles/#NQCDynamics.Ensembles.EnsembleSaver","page":"Ensembles","title":"NQCDynamics.Ensembles.EnsembleSaver","text":"EnsembleSaver{F<:Tuple}\n\nStore a tuple of functions with the signature f(sol) where sol is a DiffEq solution object. EnsembleSaver will evaluate each of these functions and return the result in a Dictionary.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDynamics/ensembles/#NQCDynamics.Ensembles.MeanReduction","page":"Ensembles","title":"NQCDynamics.Ensembles.MeanReduction","text":"Average the outputs over all trajectories.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDynamics/ensembles/#NQCDynamics.Ensembles.OrderedSelection","page":"Ensembles","title":"NQCDynamics.Ensembles.OrderedSelection","text":"Select the initial conditions from the distribution in order. \n\n\n\n\n\n","category":"type"},{"location":"api/NQCDynamics/ensembles/#NQCDynamics.Ensembles.RandomSelection","page":"Ensembles","title":"NQCDynamics.Ensembles.RandomSelection","text":"Obtain initial conditions by randomly sampling the distribution.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDynamics/ensembles/#NQCDynamics.Ensembles.SumReduction","page":"Ensembles","title":"NQCDynamics.Ensembles.SumReduction","text":"Sum the outputs from each trajectory.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDynamics/ensembles/#NQCDynamics.Ensembles.run_dynamics-Tuple{NQCDynamics.AbstractSimulation, Any, Any}","page":"Ensembles","title":"NQCDynamics.Ensembles.run_dynamics","text":"run_dynamics(sim::AbstractSimulation, tspan, distribution;\n output,\n selection::Union{Nothing,AbstractVector}=nothing,\n reduction=AppendReduction(),\n ensemble_algorithm=SciMLBase.EnsembleSerial(),\n algorithm=DynamicsMethods.select_algorithm(sim),\n trajectories=1,\n kwargs...\n )\n\nRun trajectories for timespan tspan sampling from distribution.\n\nKeywords\n\noutput either a single function or a Tuple of functions with the signature f(sol, i) that takes the DifferentialEquations solution and returns the desired output quantity.\nselection should be an AbstractVector containing the indices to sample from the distribution. By default, nothing leads to random sampling.\nreduction defines how the data is reduced across trajectories. Options are AppendReduction(), MeanReduction(), SumReduction and FileReduction(filename).\nensemble_algorithm is the algorithm from DifferentialEquations which determines which form of parallelism is used.\nalgorithm is the algorithm used to integrate the equations of motion.\ntrajectories is the number of trajectories to perform.\nkwargs... any additional keywords are passed to DifferentialEquations solve`.\n\n\n\n\n\n","category":"method"},{"location":"integration_algorithms/#Integration-algorithms","page":"Integration algorithms","title":"Integration algorithms","text":"","category":"section"},{"location":"integration_algorithms/","page":"Integration algorithms","title":"Integration algorithms","text":"At the core of NQCDynamics.jl is the DifferentialEquations.jl package that performs all of the dynamics simulations. Within the sub-packages OrdinaryDiffEq.jl and StochasticDiffEq.jl, a variety of integration algorithms have been implemented that are available to use without needing to implement custom algorithms for specific applications. However, in some cases it can be desirable to implement algorithms that can take advantage of the special structure of the dynamical system at hand. A key example in the field of molecular dynamics is the famous velocity Verlet algorithm that is extremely popular due to its requirement for only a single force evaluation during each time step and symplectic energy conservation properties. In fact, velocity Verlet, along with a variety of other symplectic solvers are also implemented within OrdinaryDiffEq.jl.","category":"page"},{"location":"integration_algorithms/","page":"Integration algorithms","title":"Integration algorithms","text":"For some problems encountered within semiclassical adiabatic and nonadiabatic dynamics, there are a few different algorithms that can be used to obtain improved performance. Ideally, these would be implemented using the DifferentialEquations.jl interface to allow for others to easily use these algorithms for their own problems. However, it can be challenging to implement algorithms with an appropriate level of generality. NQCDynamics.jl contains implementations for a few algorithms using the DifferentialEquations.jl interface but the implementations are not completely generic and are coupled to the rest of the package. In particular, the algorithms rely on specific formats for the dynamical arrays and use some functions that are not provided within the DEProblem. In future it would be great to try to decouple the algorithms and package them separately within the DifferentialEquations.jl ecosystem so that others can use them more easily.","category":"page"},{"location":"integration_algorithms/","page":"Integration algorithms","title":"Integration algorithms","text":"This page describes a few applications where special algorithms are available to enhance performance. In each section it is noted which algorithms are available within NQCDynamics.jl.","category":"page"},{"location":"integration_algorithms/#Ring-polymer-propagation","page":"Integration algorithms","title":"Ring polymer propagation","text":"","category":"section"},{"location":"integration_algorithms/","page":"Integration algorithms","title":"Integration algorithms","text":"Path integral molecular dynamics and ring polymer molecular dynamics involve solving Hamilton's equations for a classical ring polymer Hamiltonian. The ring polymer Hamiltonian describes many replicas of the system joined together by harmonic springs. The number of replicas or beads required must be increased until convergence is achieved. After adding many beads the ring polymer dynamics becomes hard to integrate, as the ring polymer internal modes become the highest frequency modes in the system, limiting the largest acceptable time step.","category":"page"},{"location":"integration_algorithms/","page":"Integration algorithms","title":"Integration algorithms","text":"To circumvent this difficulty, the ring polymer equations of motion can be partitioned to separate the free ring polymer dynamics from the influence of the external potential. Since the free ring polymer dynamics is entirely harmonic, it is possible to solve this part analytically, allowing for time steps that are not limited by the internal ring polymer frequencies. Recently, the symplectic Cayley modified algorithm has been demonstrated to exhibit strong stability and outperform the original algorithm.","category":"page"},{"location":"integration_algorithms/","page":"Integration algorithms","title":"Integration algorithms","text":"note: Note\nThe Cayley modified algorithm was originally introduced by [14]. This paper provides a detailed description of ring polymer dynamics, how the integration algorithm works, and benchmarks the performance of the algorithms. ","category":"page"},{"location":"integration_algorithms/","page":"Integration algorithms","title":"Integration algorithms","text":"The Hamiltonian ring polymer integration algorithm has also been extended for thermostatted dynamics: such as for thermal sampling in path integral molecular dynamics, or in thermostatted ring polymer molecular dynamics. As an extension to the Cayley modified algorithm for the Hamiltonian dynamics, the work of [24] suggests the BCOCB algorithm as the most effective for ring polymer dynamics with Langevin thermostatting. The BCOCB nomenclature refers to the sub-steps within each time step. B is the external potential, C is the Cayley modified free ring polymer step, and O is the thermostat. In this nomenclature, the integration algorithm in the absence of the thermostat can be referred to as the BCB algorithm.","category":"page"},{"location":"integration_algorithms/","page":"Integration algorithms","title":"Integration algorithms","text":"tip: Tip\nNQCDynamics.jl implements both the BCOCB and BCB algorithms for Langevin and Hamiltonian dynamics, respectively. They are the default algorithms when performing adiabatic ring polymer dynamics.","category":"page"},{"location":"integration_algorithms/#Mixed-quantum-classical-propagation","page":"Integration algorithms","title":"Mixed quantum-classical propagation","text":"","category":"section"},{"location":"integration_algorithms/","page":"Integration algorithms","title":"Integration algorithms","text":"Mixed quantum-classical methods such as mean-field Ehrenfest dynamics or surface hopping dynamics involve simultaneous propagation of nuclear and electronic sub-systems. The two sub-systems evolve on different timescales and it can be advantageous to use different time steps or algorithms for each part. Commonly the nuclear part is solved using the velocity Verlet algorithm and the electronic part is handled using a Runge-Kutta method or an exponential integrator.","category":"page"},{"location":"integration_algorithms/","page":"Integration algorithms","title":"Integration algorithms","text":"note: Note\nSHARC and Newton-X, two popular surface hopping codes, use the split-algorithm approach. In SHARC, the nuclear degrees of freedom are propagated using the velocity Verlet algorithm, whilst the wavefunction is propagated using an exponential integrator with a smaller time step. Since an exponential integrator is exact when the propagation operator is constant, reducing the time step would have no benefit if the nuclei remained fixed during the time step. SHARC instead linearly interpolates the propagation operator during the electronic steps so that the nuclei propagation operator changes smoothly during the nuclear time step. This procedure is explained in the SHARC manual. Newton-X allows a few choices for the wavefunction integration algorithm and the nuclear quantities are interpolated similarly to SHARC.","category":"page"},{"location":"integration_algorithms/","page":"Integration algorithms","title":"Integration algorithms","text":"NQCDynamics.jl uses the standard library of OrdinaryDiffEq.jl solvers to run the dynamics for mixed quantum-classical methods. For model Hamiltonians where the evaluation of the electronic quantities is fast it is not necessary to use an augmented Verlet algorithm, instead it is sufficient to use any of the adaptive solvers from OrdinaryDiffEq.jl. However, in future it would be useful to implement some of these partioned algorithms that are able to achieve enhanced performance for large, expensive systems.","category":"page"},{"location":"integration_algorithms/","page":"Integration algorithms","title":"Integration algorithms","text":"For ring polymer mixed quantum-classical methods, it is possible to combine the algorithms used for ring polymer propagation with the partitioning idea from the mixed quantum-classical solvers. Even for model systems, the performance is significantly improved when the ring polymer modes are solved separately such that larger time steps can be used. NQCDynamics.jl implements an augmented form of the BCB algorithm that uses the BCB algorithm for the ring polymer degrees of freedom and uses the Tsit5 algorithm from OrdinaryDiffEq.jl for the electronic part. Currently the time steps for both sub-systems are fixed to be the same, but in future this constraint should be removed. In fact, it would even be possible to use an adaptive solver for the electronic part that can automatically adjust the time step as necessary.","category":"page"},{"location":"integration_algorithms/#Semiclassical-mapping-variable-propagation","page":"Integration algorithms","title":"Semiclassical mapping variable propagation","text":"","category":"section"},{"location":"integration_algorithms/","page":"Integration algorithms","title":"Integration algorithms","text":"Mapping variable methods describe the coupled nuclear-electronic problem using a classical Hamiltonian, where additional variables have been introduced to represent the electronic populations. As is the case with the ring polymer methods, it is possible to construct symplectic algorithms where each timestep is partitioned into exactly soluble sub-steps. Of particular note is the MInt algorithm described by [13]. The algorithm is symplectic, symmetric and time-reversible and can also be combined with the ring polymer algorithms for ring polymer dynamics with mapping variables. NQCDynamics.jl implements the MInt algorithm and a variant of the MInt algorithm for ring polymer systems that combines the BCB algorithm for the nuclei with the MInt algorithm for the mapping variables.","category":"page"},{"location":"integration_algorithms/#Electronic-friction-propagation","page":"Integration algorithms","title":"Electronic friction propagation","text":"","category":"section"},{"location":"integration_algorithms/","page":"Integration algorithms","title":"Integration algorithms","text":"Molecular dynamics with electronic friction is described by Langevin equations of motion, equivalent to classical Hamiltonian dynamics with an additional drag force and stochastic force. In the case of Langevin dynamics with a constant friction coefficient, there has been much interest in developing algorithms of low order that can be used for large molecular dynamics simulations. The work of [7] has demonstrated that, although a few choices exist, the BAOAB algorithm performs most favourably.","category":"page"},{"location":"integration_algorithms/","page":"Integration algorithms","title":"Integration algorithms","text":"tip: Tip\nThe BAOAB algorithm uses the same nomenclature as the ring polymer algorithms introduced in Ring polymer propagation. Each letter represents one component of a single time step. B is the external force step that updates the velocities, A is the position update, and O is the thermostatting step. For ring polymer dynamics the A step encompasses the free ring polymer step.","category":"page"},{"location":"integration_algorithms/","page":"Integration algorithms","title":"Integration algorithms","text":"For electronic friction dynamics, the friction is described by a tensor, not a single number as for traditional Langevin dynamics. However, the BAOAB algorithm is still applicable, but the O step requires the matrix exponential of the friction tensor. Since the tensor is positive semi-definite, it is possible to perform the exponentiation by first diagonalising the tensor. Using this approach, NQCDynamics.jl implements the BAOAB algorithm for tensorial friction and the BCOCB when using a ring polymer system. ","category":"page"},{"location":"integration_algorithms/","page":"Integration algorithms","title":"Integration algorithms","text":"note: Note\nThe DynamicalSDEProblem in StochasticDiffEq.jl represents systems that contain positions and velocities and have a stochastic component. The DynamicalSDEProblem was originally implemented for performing Langevin thermostatted dynamics simulations using the BAOAB algorithm. At the time of writing, BAOAB is the only algorithm implemented in StochasticDiffEq.jl for these problems. In future it would be useful to implement further algorithms and allow for more general noise profiles.","category":"page"},{"location":"api/NQCDistributions/nqcdistributions/#NQCDistributions","page":"NQCDistributions","title":"NQCDistributions","text":"","category":"section"},{"location":"api/NQCDistributions/nqcdistributions/","page":"NQCDistributions","title":"NQCDistributions","text":"Modules=[NQCDistributions]","category":"page"},{"location":"api/NQCDistributions/nqcdistributions/#NQCDistributions.Adiabatic","page":"NQCDistributions","title":"NQCDistributions.Adiabatic","text":"Singleton type for labelling states as adiabatic.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDistributions/nqcdistributions/#NQCDistributions.ConfigurationVector","page":"NQCDistributions","title":"NQCDistributions.ConfigurationVector","text":"ConfigurationVector{S<:AbstractVector}\n\nSample from a provided vector of configurations.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDistributions/nqcdistributions/#NQCDistributions.Diabatic","page":"NQCDistributions","title":"NQCDistributions.Diabatic","text":"Singleton type for labelling states as diabatic.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDistributions/nqcdistributions/#NQCDistributions.DynamicalDistribution","page":"NQCDistributions","title":"NQCDistributions.DynamicalDistribution","text":"DynamicalDistribution(velocity, position, dims)\n\nSampleable struct containing distributions for velocity and position. dims determines the size of each sample and should match the size of the system: (ndofs, natoms).\n\nExample\n\njulia> using NQCDistributions: DynamicalDistribution;\n\njulia> d = DynamicalDistribution([[1.0;;], [2.0;;], [3.0;;]], 0.1, (1, 1));\n\njulia> rand(d)\nComponentVector{Float64}(v = [1.0;;], r = [0.1;;])\n\njulia> d[2]\nComponentVector{Float64}(v = [2.0;;], r = [0.1;;])\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDistributions/nqcdistributions/#NQCDistributions.ElectronicDistribution","page":"NQCDistributions","title":"NQCDistributions.ElectronicDistribution","text":"ElectronicDistribution{S}\n\nAbstract type for distributions of electronic degrees of freedom only.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDistributions/nqcdistributions/#NQCDistributions.FermiDiracState","page":"NQCDistributions","title":"NQCDistributions.FermiDiracState","text":"FermiDiracState{S,T,A} <: ElectronicDistribution{S}\n\nElectronic distribution for Fermions following Fermi-Dirac distribution.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDistributions/nqcdistributions/#NQCDistributions.FixedArray","page":"NQCDistributions","title":"NQCDistributions.FixedArray","text":"FixedArray{S<:AbstractArray}\n\nReturn the same configuration every time.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDistributions/nqcdistributions/#NQCDistributions.FixedFill","page":"NQCDistributions","title":"NQCDistributions.FixedFill","text":"FixedFill{S<:Real}\n\nFill all degrees of freedom with the same value every time.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDistributions/nqcdistributions/#NQCDistributions.MixedState","page":"NQCDistributions","title":"NQCDistributions.MixedState","text":"MixedState{T,S} <: ElectronicDistribution{S}\n\nElectronic distribution for representing a mixed state with non-zero population in multiple states.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDistributions/nqcdistributions/#NQCDistributions.PositionHarmonicRingPolymer-Union{Tuple{T}, Tuple{Any, Any, Any, Tuple{Int64, Int64, Int64}}} where T","page":"NQCDistributions","title":"NQCDistributions.PositionHarmonicRingPolymer","text":"PositionHarmonicRingPolymer{T}(ω, β, m, dims::Dims{3}; centre=0, classical=Int[])\n\nRing polymer position distribution in a 1D harmonic potential\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDistributions/nqcdistributions/#NQCDistributions.PureState","page":"NQCDistributions","title":"NQCDistributions.PureState","text":"PureState{S} <: ElectronicDistribution{S}\n\nElectronic distribution for representing a system confined to a single state.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDistributions/nqcdistributions/#NQCDistributions.RingPolymerWrapper","page":"NQCDistributions","title":"NQCDistributions.RingPolymerWrapper","text":"RingPolymerWrapper{S}\n\nWrap other distributions to convert them to ring polymer distributions.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDistributions/nqcdistributions/#NQCDistributions.SampleableComponent","page":"NQCDistributions","title":"NQCDistributions.SampleableComponent","text":"SampleableComponent(sampleable, dims)\n\nConverts a general sampleable that provides configurations into one of the component types defined below. dims should be the size of the desired samples and must be consistent with the provided sampleable.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDistributions/nqcdistributions/#NQCDistributions.UnivariateArray","page":"NQCDistributions","title":"NQCDistributions.UnivariateArray","text":"UnivariateArray{N,S<:Sampleable{Univariate}}\n\nFill each degree of freedom from a different Univariate distribution.\n\nThe size of the matrix of sampleables should match the system size.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDistributions/nqcdistributions/#NQCDistributions.UnivariateFill","page":"NQCDistributions","title":"NQCDistributions.UnivariateFill","text":"UnivariateFill{S<:Sampleable{Univariate}}\n\nFill all degrees of freedom from single Univariate distribution.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDistributions/nqcdistributions/#NQCDistributions.MomentumHarmonicWigner-Tuple{Any, Any, Any}","page":"NQCDistributions","title":"NQCDistributions.MomentumHarmonicWigner","text":"MomentumHarmonicWigner(ω, β, m)\n\nWigner distribution in a 1D harmonic potential for the momentum\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDistributions/nqcdistributions/#NQCDistributions.PositionHarmonicWigner-Tuple{Any, Any, Any}","page":"NQCDistributions","title":"NQCDistributions.PositionHarmonicWigner","text":"PositionHarmonicWigner(ω, β)\n\nWigner distribution in a 1D harmonic potential for the position\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDistributions/nqcdistributions/#NQCDistributions.Q-Tuple{Any, Any}","page":"NQCDistributions","title":"NQCDistributions.Q","text":"Quantum corrector for the Wigner distribution\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDistributions/nqcdistributions/#NQCDistributions.VelocityBoltzmann-Tuple{Any, AbstractVector, Tuple{Int64, Int64}}","page":"NQCDistributions","title":"NQCDistributions.VelocityBoltzmann","text":"VelocityBoltzmann(temperature, masses::AbstractVector, dims::Dims{2})\n\nGenerate a Boltzmann of velocities for each degree of freedom.\n\nArguments\n\ntemperature - Atomic units or Unitful\nmasses - Vector of masses for each atom\ndims - (ndofs, natoms). natoms must equal length(masses)\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDistributions/nqcdistributions/#NQCDistributions.VelocityHarmonicWigner-Tuple{Any, Any, Any}","page":"NQCDistributions","title":"NQCDistributions.VelocityHarmonicWigner","text":"VelocityHarmonicWigner(ω, β, m)\n\nWigner distribution in a 1D harmonic potential for the velocity\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/nonadiabaticmoleculardynamics/#NQCDynamics","page":"NQCDynamics","title":"NQCDynamics","text":"","category":"section"},{"location":"api/NQCDynamics/nonadiabaticmoleculardynamics/","page":"NQCDynamics","title":"NQCDynamics","text":"Modules=[NQCDynamics]","category":"page"},{"location":"api/NQCDynamics/nonadiabaticmoleculardynamics/#NQCDynamics.Simulation-Union{Tuple{T}, Tuple{M}, Tuple{Atoms{T}, NQCModels.Model, M}} where {M, T}","page":"NQCDynamics","title":"NQCDynamics.Simulation","text":"Simulation(atoms::Atoms{T}, model::Model, method::M;\n temperature=0u\"K\", cell::AbstractCell=InfiniteCell()) where {M,S,T}\n\nSimulation parameters that controls the types of atoms, interactions, dynamics method, temperature and simulation cell.\n\n\n\n\n\n","category":"method"},{"location":"dynamicssimulations/dynamicsmethods/fssh/#fssh-dynamics","page":"Fewest-switches surface hopping (FSSH)","title":"Fewest-switches surface hopping (FSSH)","text":"","category":"section"},{"location":"dynamicssimulations/dynamicsmethods/fssh/","page":"Fewest-switches surface hopping (FSSH)","title":"Fewest-switches surface hopping (FSSH)","text":"Tully's FSSH [1] is one of the most popular methods for nonadiabatic molecular dynamics and is classified as a mixed-quantum classical method, where the nuclei are treated classically and the electrons are treated quantum mechanically.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/fssh/","page":"Fewest-switches surface hopping (FSSH)","title":"Fewest-switches surface hopping (FSSH)","text":"The central concept that governs surface hopping methods is that the nuclei evolve on a single adiabatic potential energy surface at any given moment. At each timestep, a hopping probability is evaluated. If the hopping probability is larger than a uniform random number between 0 and 1, the active state is switched and the adiabatic propagation continues on the new electronic state. When this algorithm is applied to an ensemble of trajectories, the discrete adiabatic state populations approximate the quantum mechanical populations for each state.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/fssh/","page":"Fewest-switches surface hopping (FSSH)","title":"Fewest-switches surface hopping (FSSH)","text":"The surface hopping classical Hamiltonian can be written as","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/fssh/","page":"Fewest-switches surface hopping (FSSH)","title":"Fewest-switches surface hopping (FSSH)","text":"H(t) = frac12 mathbfP^T mathbfM^-1 mathbfP + sum_i delta(s(t) - i) E_i(mathbfR)","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/fssh/","page":"Fewest-switches surface hopping (FSSH)","title":"Fewest-switches surface hopping (FSSH)","text":"where mathbfP is the vector of momenta, mathbfR the positions, and mathbfM the diagonal mass matrix. s(t) can be viewed as a digital signal that takes on the value of the currently occupied adiabatic state. As such, this Hamiltonian describes classical dynamics that proceeds under the influence of the potential E_i(mathbfR) when s(t) = i. The summation runs over all adiabatic states.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/fssh/","page":"Fewest-switches surface hopping (FSSH)","title":"Fewest-switches surface hopping (FSSH)","text":"Of course, to integrate the associated equations of motion, s(t) must be obtained. This quantity is obtained stochastically for each trajectory by making probabilistic hops between surfaces. The probabilities are obtained by integrating the electronic Schrödinger equation alongside the dynamics as","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/fssh/","page":"Fewest-switches surface hopping (FSSH)","title":"Fewest-switches surface hopping (FSSH)","text":"ihbar dotc_i(t) = E_i(mathbfR) c_i (t)\n- ihbar sum_j dotmathbfR cdot mathbfd_ij(mathbfR)c_j(t)","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/fssh/","page":"Fewest-switches surface hopping (FSSH)","title":"Fewest-switches surface hopping (FSSH)","text":"In this equation, c_i(t) are the complex coefficients for state i and mathbfd_ij is the nonadiabatic coupling between adiabatic states i and j. The hopping probability is calculated as","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/fssh/","page":"Fewest-switches surface hopping (FSSH)","title":"Fewest-switches surface hopping (FSSH)","text":"gamma_i to j = sum_alpha 2 fracP_alphaM_alpha\nRe(fracsigma_jisigma_ii) d_alpha ij dt","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/fssh/","page":"Fewest-switches surface hopping (FSSH)","title":"Fewest-switches surface hopping (FSSH)","text":"At each timestep, a random number between 0 and 1 is generated which is compared to the probabilities. If the probability is higher than the random number, then a hop is attempted.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/fssh/","page":"Fewest-switches surface hopping (FSSH)","title":"Fewest-switches surface hopping (FSSH)","text":"Additionally in the fewest-switches scheme, the energy is conserved for each trajectory by rescaling the momenta whenever a hop is performed. As such, when a hop is attempted, it will only be successful when there is sufficient kinetic energy for the energy to be conserved after the hop. If there is insufficient kinetic energy, this is termed a frustrated hop, and the dynamics proceeds without performing a hop. When a hop is successful, the kinetic energy is adjusted and s(t) takes on the value of the newly occupied state. For a more detailed description of the algorithm and the momentum rescaling procedure, please refer to [6]. In this reference, the notion of reversing the momenta during frustrated hops is discussed. In our implementation we leave the frustrated trajectories unchanged, though it is suggested that the momentum reversal procedure may lead to better results in some cases.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/fssh/#Algorithm","page":"Fewest-switches surface hopping (FSSH)","title":"Algorithm","text":"","category":"section"},{"location":"dynamicssimulations/dynamicsmethods/fssh/","page":"Fewest-switches surface hopping (FSSH)","title":"Fewest-switches surface hopping (FSSH)","text":"Integrate classical dynamics for one timestep\nIntegrate electronic dynamics for one timestep\nEvaluate hopping probability\nPerform hop if sufficient probability and kinetic energy\nRescale velocity if hop is performed\nReturn to step 1","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/fssh/","page":"Fewest-switches surface hopping (FSSH)","title":"Fewest-switches surface hopping (FSSH)","text":"note: Note\nWith DifferentialEquations.jl we use a callback to perform the surface hopping procedure such that steps 1 and 2 are performed by the DifferentialEquations solvers and steps 3, 4, 5 are performed by the callback.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/fssh/#Example","page":"Fewest-switches surface hopping (FSSH)","title":"Example","text":"","category":"section"},{"location":"dynamicssimulations/dynamicsmethods/fssh/","page":"Fewest-switches surface hopping (FSSH)","title":"Fewest-switches surface hopping (FSSH)","text":"In this section we can investigate the results obtained for a single trajectory using FSSH.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/fssh/","page":"Fewest-switches surface hopping (FSSH)","title":"Fewest-switches surface hopping (FSSH)","text":"First, the simulation parameters are created. Here, we have a single atom with a mass of 2000 a.u. and we are using Tully's third model ([1]), provided by NQCModels.jl.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/fssh/","page":"Fewest-switches surface hopping (FSSH)","title":"Fewest-switches surface hopping (FSSH)","text":"using Random; Random.seed!(10) # hide\nusing NQCDynamics\n\natoms = Atoms(2000)\nsim = Simulation{FSSH}(atoms, TullyModelThree())","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/fssh/","page":"Fewest-switches surface hopping (FSSH)","title":"Fewest-switches surface hopping (FSSH)","text":"The DynamicsVariables constructor has some extra arguments for FSSH. The first three match the classical case, but we also provide the initial state and whether we want this state to be Adiabatic() or Diabatic(). The type of state can be important when considering the ordering of the states. The adiabatic states are always arranged from lowest to highest energy, whereas the diabatic states will be ordered as defined in the model. You can inspect the fields of u to ensure the initialisation has proceeded as you intend.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/fssh/","page":"Fewest-switches surface hopping (FSSH)","title":"Fewest-switches surface hopping (FSSH)","text":"u = DynamicsVariables(sim, [20/2000;;], [-10.;;], PureState(1, Adiabatic()))","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/fssh/","page":"Fewest-switches surface hopping (FSSH)","title":"Fewest-switches surface hopping (FSSH)","text":"Finally, the trajectory can be run by passing all the parameters we have set up so far. Here, we request both the OutputDiscreteState output which is equal to s(t) and OutputDiabaticPopulation, which gives us the population of each diabatic state along the trajectory.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/fssh/","page":"Fewest-switches surface hopping (FSSH)","title":"Fewest-switches surface hopping (FSSH)","text":"traj = run_dynamics(sim, (0.0, 2000.0), u, output=(OutputDiscreteState, OutputDiabaticPopulation))","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/fssh/","page":"Fewest-switches surface hopping (FSSH)","title":"Fewest-switches surface hopping (FSSH)","text":"Now we can plot s(t) throughout the trajectory. The FSSH algorithm attempts to minimise the total number of hops; in the limit of infinite hops the result would tend to the mean-field (Ehrenfest) result, which is what FSSH attempts to avoid.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/fssh/","page":"Fewest-switches surface hopping (FSSH)","title":"Fewest-switches surface hopping (FSSH)","text":"using Plots\nplot(traj, :OutputDiscreteState)","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/fssh/","page":"Fewest-switches surface hopping (FSSH)","title":"Fewest-switches surface hopping (FSSH)","text":"Similarly, we can plot the diabatic populations. Since FSSH is performed in the adiabatic representation, even in the case of few hops, the diabatic populations can look dramatically different depending on the complexity of the model Hamiltonian. ","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/fssh/","page":"Fewest-switches surface hopping (FSSH)","title":"Fewest-switches surface hopping (FSSH)","text":"plot(traj, :OutputDiabaticPopulation)","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/fssh/","page":"Fewest-switches surface hopping (FSSH)","title":"Fewest-switches surface hopping (FSSH)","text":"Another example is available where we use FSSH and other methods to reproduce some of the results from [1].","category":"page"},{"location":"api/NQCModels/nonadiabaticmodels/#NQCModels","page":"NQCModels","title":"NQCModels","text":"","category":"section"},{"location":"api/NQCModels/nonadiabaticmodels/","page":"NQCModels","title":"NQCModels","text":"Modules=[NQCModels]","category":"page"},{"location":"api/NQCModels/nonadiabaticmodels/#NQCModels.NQCModels","page":"NQCModels","title":"NQCModels.NQCModels","text":"NQCModels define the potentials and derivatives that govern the dynamics of the particles. These can exist as analytic models or as interfaces to other codes. \n\n\n\n\n\n","category":"module"},{"location":"api/NQCModels/nonadiabaticmodels/#NQCModels.Model","page":"NQCModels","title":"NQCModels.Model","text":"Top-level type for models.\n\nImplementation\n\nWhen adding new models, this should not be directly subtyped. Instead, depending on the intended functionality of the model, one of the child abstract types should be subtyped. If an appropriate type is not already available, a new abstract subtype should be created. \n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/nonadiabaticmodels/#NQCModels.derivative!-Tuple{NQCModels.Model, Any, AbstractMatrix}","page":"NQCModels","title":"NQCModels.derivative!","text":"derivative!(model::Model, D, R::AbstractMatrix)\n\nFill D with the derivative of the electronic potential as a function of the positions R.\n\nThis must be implemented for all models.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCModels/nonadiabaticmodels/#NQCModels.derivative-Tuple{NQCModels.Model, Any}","page":"NQCModels","title":"NQCModels.derivative","text":"derivative(model::Model, R)\n\nAllocating version of derivative!, this definition should be suitable for all models.\n\nImplement zero_derivative to allocate an appropriate array then implement derivative! to fill the array.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCModels/nonadiabaticmodels/#NQCModels.ndofs-Tuple{NQCModels.Model}","page":"NQCModels","title":"NQCModels.ndofs","text":"ndofs(::Model)\n\nGet the number of degrees of freedom for every atom in the model. Usually 1 or 3.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCModels/nonadiabaticmodels/#NQCModels.nstates-Tuple{NQCModels.Model}","page":"NQCModels","title":"NQCModels.nstates","text":"nstates(::Model)\n\nGet the number of electronic states in the model.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCModels/nonadiabaticmodels/#NQCModels.potential!-Tuple{NQCModels.Model, Any, AbstractMatrix}","page":"NQCModels","title":"NQCModels.potential!","text":"potential!(model::Model, V, R::AbstractMatrix)\n\nIn-place version of potential, used only when mutable arrays are preferred.\n\nCurrently used only for LargeDiabaticModels, see diabatic/DiabaticModels.jl.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCModels/nonadiabaticmodels/#NQCModels.potential-Tuple{NQCModels.Model, AbstractMatrix}","page":"NQCModels","title":"NQCModels.potential","text":"potential(model::Model, R::AbstractMatrix)\n\nEvaluate the potential at position R for the given model.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCModels/nonadiabaticmodels/#NQCModels.zero_derivative","page":"NQCModels","title":"NQCModels.zero_derivative","text":"zero_derivative(model::Model, R)\n\nCreate an zeroed array of the right size to match the derivative.\n\n\n\n\n\n","category":"function"},{"location":"api/NQCDynamics/dynamicsutils/#DynamicsUtils","page":"DynamicsUtils","title":"DynamicsUtils","text":"","category":"section"},{"location":"api/NQCDynamics/dynamicsutils/","page":"DynamicsUtils","title":"DynamicsUtils","text":"Modules=[NQCDynamics.DynamicsUtils]","category":"page"},{"location":"api/NQCDynamics/dynamicsutils/#NQCDynamics.DynamicsUtils","page":"DynamicsUtils","title":"NQCDynamics.DynamicsUtils","text":"DynamicsUtils\n\nUtilities for dynamics simulations. Includes:\n\nBasic dynamics variables functions\nDensity matrix dynamics functions\nStandard callbacks to use during dynamics\nPlotting recipes for outputs\n\n\n\n\n\n","category":"module"},{"location":"api/NQCDynamics/dynamicsutils/#NQCDynamics.DynamicsUtils.CellBoundaryCallback-Tuple{}","page":"DynamicsUtils","title":"NQCDynamics.DynamicsUtils.CellBoundaryCallback","text":"CellBoundaryCallback()\n\nWhenever atoms leave the simulation cell, enforce the periodicity by wrapping the positions at the cell boundary.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsutils/#NQCDynamics.DynamicsUtils.TerminateCellCallback-Tuple{}","page":"DynamicsUtils","title":"NQCDynamics.DynamicsUtils.TerminateCellCallback","text":"TerminateCellCallback()\n\nIf the atoms leave the simulation cell, terminate the simulation.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsutils/#NQCDynamics.DynamicsUtils.TerminatingCallback-Tuple{Any}","page":"DynamicsUtils","title":"NQCDynamics.DynamicsUtils.TerminatingCallback","text":"TerminatingCallback(func)\n\nProvide a function that returns true when the simulation should terminate.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsutils/#NQCDynamics.DynamicsUtils.apply_interbead_coupling!-Union{Tuple{T}, Tuple{AbstractArray{T, 3}, AbstractArray{T, 3}, RingPolymerSimulation}} where T","page":"DynamicsUtils","title":"NQCDynamics.DynamicsUtils.apply_interbead_coupling!","text":"apply_interbead_coupling!(du::DynamicalVariables, u::DynamicalVariables,\n sim::RingPolymerSimulation)\n\nApplies the force that arises from the harmonic springs between adjacent beads.\n\nOnly applies the force for atoms labelled as quantum within the RingPolymerParameters.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsutils/#NQCDynamics.DynamicsUtils.commutator!-Tuple{Any, Any, Any}","page":"DynamicsUtils","title":"NQCDynamics.DynamicsUtils.commutator!","text":"commutator!(C, A, B)\n\nCalculate C = AB - BA.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsutils/#NQCDynamics.DynamicsUtils.divide_by_mass!-Tuple{Any, Any}","page":"DynamicsUtils","title":"NQCDynamics.DynamicsUtils.divide_by_mass!","text":"divide_by_mass!(dv, masses)\n\nDivide the contents of dv by the masses. Assumes dv is an array of size (dofs, atoms) or (dofs, atoms, beads). masses is the vector of masses for each atom that matches length with the second dimension.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsutils/#NQCDynamics.DynamicsUtils.velocity!-NTuple{5, Any}","page":"DynamicsUtils","title":"NQCDynamics.DynamicsUtils.velocity!","text":"velocity!(dr, v, r, sim, t)\n\nWrite the velocity v into dr. Has extra arguments to work with Dynamical(O/S)DEProblems.\n\n\n\n\n\n","category":"method"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/#nrpmd-dynamics","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","text":"","category":"section"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/#Theory","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Theory","text":"","category":"section"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","text":"Nonadiabatic ring polymer molecular dynamics (NRPMD) is a method that uses the ring polymer formalism to include quantum effects in the nuclear dynamics and mapping variables for the electronic degrees of freedom. ([9], [10], [11]) This results in a classical dynamics in an extended phasespace of the ring polymer with each bead coupled to a set of classical mapping variables. Originally, this method was proposed as a simple combination of the Meyer-Miller-Stock-Thoss mapping formalism with RPMD but has since been rigorously derived from nonadiabatic Matsubara dynamics ([12]).","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","text":"The classical Hamiltonian conserved by NRPMD is given by","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","text":"H_N = sum_alpha=1^N left\nfracP_alpha^22M + V_0(R_alpha)\n+ fracM2beta_N^2hbar^2 (R_alpha - R_alpha-1)^2\n+ frac1hbar sum_nmV_nm(R_alpha)\n(q_alpha_nq_alpha_m + p_alpha_np_alpha_m - delta_nmhbar)\nright","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","text":"which contains N replicas with positions R_alpha and momenta P_alpha joined by harmonic springs. M is the mass, beta_N = beta N is the inverse temperature scaled by the number of beads. V_0(R_alpha) is the state independent potential. V_nm are the matrix elements of the diabatic potential. The sum runs over all pairs of states. Each replica has a set of mapping variables q_alpha_n and p_alpha_n that interact only within the set associated with a single replica. The consequence of this is that the electronic dynamics is not contaminated by interbead coupling.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","text":"The equations of motion obtained from this Hamiltonian are","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","text":"beginaligned\ndotR_alpha = fracP_alphaM\n\ndotP_alpha =\n- fracMbeta_N^2 hbar^2(2 R_alpha - R_alpha+1 - R_alpha-1)\n- nabla_R_alpha V_0(R_alpha)\n- frac12hbarsum_nm nabla_R_alpha V_nm(R_alpha)\n(q_alpha_nq_alpha_m + p_alpha_np_alpha_m - delta_nmhbar)\n\ndotq_alpha_n =\nfrac1hbar sum_m V_nm(R_alpha)p_alpha_m\n\ndotp_alpha_n =\n-frac1hbar sum_m V_nm(R_alpha)q_alpha_m\nendaligned","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/#Implementation-details","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Implementation details","text":"","category":"section"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/#Solving-the-differential-equations","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Solving the differential equations","text":"","category":"section"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","text":"For mapping variable methods of this type, a symplectic algorithm ([13]) exists. This algorithm has the advantage of long time stability and can be easily combined with the standard algorithms for ring polymer time-evolution. For NRPMD we have implemented this algorithm using the Cayley modified ring polymer propagator ([14]) and obtain accurate and efficient dynamics. For few beads, similar performance to the OrdinaryDiffEq.jl algorithms is obtained, but as the number of beads increases this algorithm becomes more effective.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/#Generating-the-initial-distribution","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Generating the initial distribution","text":"","category":"section"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","text":"Currently, we provide this functionality only for nonequilibrium simulations where the nuclear part of the distribution is separable from the electronic part. Typically, the nuclear distribution will be sampled using Langevin dynamics or Monte Carlo sampling and the electronic variables are confined to a single electronic state. This is appropriate for modelling photoexcitation dynamics but is not yet suitable for equilibrium simulations. Equilibrium dynamics would require also sampling a thermal distribution for the mapping variables.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/#Form-of-the-Hamiltonian","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Form of the Hamiltonian","text":"","category":"section"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","text":"The diabatic models defined in NQCModels.jl are of the appropriate form for this method though they provide the potential as a single matrix, rather than separating the state-dependent and independent parts. It has been suggested that defining the Hamiltonian such that the lowest eigenvalue of the diabatic matrix is zero everywhere leads to improved convergence in the sampling ([9]). However, here we have not done this for simplicity when defining the models.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/#Example","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Example","text":"","category":"section"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","text":"Using NRPMD we can reproduce the Fig. 3a in the 2019 paper of Chowdhury and Huo ([11]).","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","text":"First we generate a thermal ring polymer distribution in a harmonic potential. A simple way to do this is to use Monte Carlo sampling for the positions and obtain velocities from a Boltzmann distribution.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","text":"using NQCDynamics\n\natom = Atoms(1)\n\nsim = RingPolymerSimulation(atom, Harmonic(dofs=1), 4; temperature=1/16)\n\nr0 = zeros(size(sim))\nsteps = 5e3 # Number of Monte Carlo steps\nstep_size = Dict(:X=>1.0) # Monte Carlo step size for species :X\noutput = InitialConditions.ThermalMonteCarlo.run_advancedmh_sampling(sim, r0, steps, step_size)\nvelocities = VelocityBoltzmann(1/16, masses(sim), (1,1))\n\ndistribution = DynamicalDistribution(velocities, output, size(sim)) * PureState(1)","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","text":"note: `size(sim)`\nsize(sim) returns the system size as (degrees of freedom, number of atoms, number of beads).","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","text":"tip: Monte Carlo sampling\nFurther information on Monte Carlo sampling can be found here.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","text":"We can check the distribution by plotting the phasespace diagram for each of the points in our distribution:","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","text":"using CairoMakie\n\nnuclear = distribution.nuclear\nflat_position = reduce(vcat, (nuclear.position[i][:] for i in 1:length(nuclear)))\nflat_velocity = reduce(vcat, (rand(nuclear.velocity)[:] for _ in 1:length(nuclear)))\nscatter(flat_position, flat_velocity)","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","text":"note: `reduce(vcat, ...)`\nHere we have used reduce in combination with vcat to vertically concatenate all of the information into a single array for plotting.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","text":"The simulation method is given as the type parameter {NRPMD} and the simulation constructor is given the atoms, model, number of beads, temperature and degrees of freedom.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","text":"sim = RingPolymerSimulation{NRPMD}(atom, DoubleWell(γ=0.1), 4; temperature=1/16)","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","text":"Next, we can use this distribution as a starting point for the dynamics simulations. This will result in each trajectory starting from a random configuration in the distribution. For NRPMD, the electronic variables are sampled from a Gaussian, independent of the initial electronic state. The electronic state is introduced in the correlation function expression when correlating the initial and final populations.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","text":"The quantities output by the ensemble simulation are specified by the output and the reduction. The output follows the DifferentialEquations format where we provide a function that determines the output of each trajectory. The reduction can be one of :mean, :append, or :sum, which will determine how the data from each trajectory is combined.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","text":"note: Ensemble simulations\nFurther details on ensemble simulations are available here.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","text":"output = TimeCorrelationFunctions.PopulationCorrelationFunction(sim, Diabatic())\nnothing # hide","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","text":"Finally, we can combine the parameters and run the simulation. The resulting plot shows the time dependent population difference and closely matches the figure from the paper we were attempting to reproduce. Nice!","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/nrpmd/","page":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","title":"Nonadiabatic ring polymer molecular dynamics (NRPMD)","text":"ensemble = run_dynamics(sim, (0.0, 30.0), distribution;\n trajectories=100, output, reduction=MeanReduction(), dt=0.1)\n\nplt = lines(0:0.1:30, [p[1,1]-p[2,1] for p in ensemble[:PopulationCorrelationFunction]])\nplt.axis.xlabel = \"Time\"\nplt.axis.ylabel = \"Population difference\"\nplt","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpmd/#rpmd-dynamics","page":"Ring polymer molecular dynamics (RPMD)","title":"Ring polymer molecular dynamics (RPMD)","text":"","category":"section"},{"location":"dynamicssimulations/dynamicsmethods/rpmd/","page":"Ring polymer molecular dynamics (RPMD)","title":"Ring polymer molecular dynamics (RPMD)","text":"Ring polymer molecular dynamics is a quantum dynamics methods that attempts to approximate Kubo-transformed real-time correlation functions ([15]).","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpmd/","page":"Ring polymer molecular dynamics (RPMD)","title":"Ring polymer molecular dynamics (RPMD)","text":"The idea is to exploit the classical isomorphism that maps a quantum particle onto the extended phasespace of a classical ring polymer. It can be shown that the quantum partition function for a system can be manipulated such that it resembles the classical partition function of a system containing many replicas of the original particle joined to together with harmonic springs in a ring. In the limit of infinite beads or replicas in the ring polymer, the isomorphism becomes exact and it is possible to evaluate quantum expectation values by evaluating ensemble averages for the classical ring polymer system. This is referred to as the field of imaginary-time path integrals and the techniques used are Path Integral Monte Carlo (PIMC) and Path Integral Molecular Dynamics (PIMD) depending on whether molecular dynamics or Monte Carlo methods are used to explore the phasespace ([16]).","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpmd/","page":"Ring polymer molecular dynamics (RPMD)","title":"Ring polymer molecular dynamics (RPMD)","text":"RPMD was proposed as a heuristic extension of imaginary-time path integrals to evaluate real-time dynamical quantities. To perform RPMD, it is necessary to solve Hamilton's equations for the ring polymer Hamiltonian:","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpmd/","page":"Ring polymer molecular dynamics (RPMD)","title":"Ring polymer molecular dynamics (RPMD)","text":"H = sum_alpha^N frac12 mathbfP_alpha^T mathbfM mathbfP_alpha\n+ frac12 omega_N^2\n(mathbfR_alpha - mathbfR_alpha+1)^T\nmathbfM\n(mathbfR_alpha - mathbfR_alpha+1)\n+ V(mathbfR_alpha)","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpmd/","page":"Ring polymer molecular dynamics (RPMD)","title":"Ring polymer molecular dynamics (RPMD)","text":"where the ring polymer spring constant omega_N = 1 hbarbeta_N and beta_N = beta N.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpmd/","page":"Ring polymer molecular dynamics (RPMD)","title":"Ring polymer molecular dynamics (RPMD)","text":"When the initial distribution is taken as the thermal ring polymer distribution and this Hamiltonian is used to generate configurations at later times, the correlation functions obtained can be used to approximate real-time quantum correlation functions.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpmd/#Example","page":"Ring polymer molecular dynamics (RPMD)","title":"Example","text":"","category":"section"},{"location":"dynamicssimulations/dynamicsmethods/rpmd/","page":"Ring polymer molecular dynamics (RPMD)","title":"Ring polymer molecular dynamics (RPMD)","text":"Let us perform some simple adiabatic ring polymer dynamics to get a feel for what the ring polymer dynamics looks like. We set up a 2D system for one hydrogen atom by giving the Free model 2 degrees of freedom and specify that the ring polymer should have 50 beads.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpmd/","page":"Ring polymer molecular dynamics (RPMD)","title":"Ring polymer molecular dynamics (RPMD)","text":"using NQCDynamics\nusing Unitful\n\natoms = Atoms([:H])\nsim = RingPolymerSimulation(atoms, Free(2), 50; temperature=100u\"K\")","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpmd/","page":"Ring polymer molecular dynamics (RPMD)","title":"Ring polymer molecular dynamics (RPMD)","text":"note: Atomic units\nRecall that the quantities are always in atomic units unless Unitful.jl has been used to specify alternative units. The temperature here has been specified using Kelvin.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpmd/","page":"Ring polymer molecular dynamics (RPMD)","title":"Ring polymer molecular dynamics (RPMD)","text":"We initialise the simulation with zero velocity and a random distribution for the ring polymer bead positions. For a real RPMD simulation you will use the thermal ring polymer distribution obtained from a PIMC or Langevin simulation but here for simplicity we use a normally distributed configuration.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpmd/","page":"Ring polymer molecular dynamics (RPMD)","title":"Ring polymer molecular dynamics (RPMD)","text":"u = DynamicsVariables(sim, zeros(size(sim)), randn(size(sim)))\nnothing # hide","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpmd/","page":"Ring polymer molecular dynamics (RPMD)","title":"Ring polymer molecular dynamics (RPMD)","text":"tip: Tip\nTo learn how to work with the thermal ring polymer phase space, refer to the Storing and sampling distributions section.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpmd/","page":"Ring polymer molecular dynamics (RPMD)","title":"Ring polymer molecular dynamics (RPMD)","text":"Now we can run the simulation, for which we use the time interval 0.0 to 500.0 and a time step of dt = 2.5:","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpmd/","page":"Ring polymer molecular dynamics (RPMD)","title":"Ring polymer molecular dynamics (RPMD)","text":"dt = 2.5\ntraj = run_dynamics(sim, (0.0, 500.0), u; output=OutputPosition, dt=dt)\nnothing # hide","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpmd/","page":"Ring polymer molecular dynamics (RPMD)","title":"Ring polymer molecular dynamics (RPMD)","text":"We can visualise this ring polymer trajectory with a 2D scatter plot that shows how the ring polymer evolves in time. Here, we have joined the adjacent beads together with lines, with the end and start beads joined with a different color. This animation shows the cyclic nature of the ring polymer, and how every bead is connected to its two neighbours.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpmd/","page":"Ring polymer molecular dynamics (RPMD)","title":"Ring polymer molecular dynamics (RPMD)","text":"using CairoMakie\n\nrs = traj[:OutputPosition]\n\nindex = Observable(1)\nxs = @lift(rs[$index][1,1,:])\nys = @lift(rs[$index][2,1,:])\nclose_loop_x = @lift([rs[$index][1,1,end], rs[$index][1,1,begin]])\nclose_loop_y = @lift([rs[$index][2,1,end], rs[$index][2,1,begin]])\nfig = scatter(xs, ys, axis = (title = @lift(\"t = $(round(Int, dt*($index-1)))\"),))\nlines!(xs, ys)\nlines!(close_loop_x, close_loop_y)\nxlims!(-3, 3)\nylims!(-3, 3)\n\ntimestamps = 1:length(traj[:OutputPosition])\nfilepath = \"../../assets/figures/rpmd.mp4\" # hide\nrecord(fig, filepath, timestamps;\n framerate = 30) do i\n index[] = i\nend\nnothing # hide","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpmd/","page":"Ring polymer molecular dynamics (RPMD)","title":"Ring polymer molecular dynamics (RPMD)","text":"(Image: rpmd fig)","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpmd/","page":"Ring polymer molecular dynamics (RPMD)","title":"Ring polymer molecular dynamics (RPMD)","text":"note: Note\nWe have used Makie's animation features to produce this animation. If you want information how Makie works, take a look at the Makie documentation.","category":"page"},{"location":"dynamicssimulations/dynamicsmethods/rpmd/","page":"Ring polymer molecular dynamics (RPMD)","title":"Ring polymer molecular dynamics (RPMD)","text":"Since this package is focused on nonadiabatic dynamics, you won't see much adiabatic RPMD elsewhere in the documentation but it's useful to understand how the original adiabatic version works before moving onto the nonadiabatic extensions.","category":"page"},{"location":"initialconditions/metropolishastings/#mhmc-sampling","page":"Thermal Metropolis-Hastings Monte Carlo","title":"Thermal Metropolis-Hastings Monte Carlo","text":"","category":"section"},{"location":"initialconditions/metropolishastings/","page":"Thermal Metropolis-Hastings Monte Carlo","title":"Thermal Metropolis-Hastings Monte Carlo","text":"Metropolis-Hastings Monte Carlo is a popular method for sampling the canonical distribution for a molecular system. Our implementations uses AdvancedMH.jl from the Turing organisation.","category":"page"},{"location":"initialconditions/metropolishastings/","page":"Thermal Metropolis-Hastings Monte Carlo","title":"Thermal Metropolis-Hastings Monte Carlo","text":"For a classical Simulation, the algorithm involves proposing new configurations in a random walk starting from an initial configuration. These are accepted or rejected based upon the Metropolis-Hastings criteria. The result is a Markov chain that samples the canonical distribution.","category":"page"},{"location":"initialconditions/metropolishastings/#Example","page":"Thermal Metropolis-Hastings Monte Carlo","title":"Example","text":"","category":"section"},{"location":"initialconditions/metropolishastings/","page":"Thermal Metropolis-Hastings Monte Carlo","title":"Thermal Metropolis-Hastings Monte Carlo","text":"We can perform the sampling by setting up a classical simulation in the usual way and providing an appropriate initial configuration.","category":"page"},{"location":"initialconditions/metropolishastings/","page":"Thermal Metropolis-Hastings Monte Carlo","title":"Thermal Metropolis-Hastings Monte Carlo","text":"using NQCDynamics\nsim = Simulation(Atoms([:H, :H, :H, :H, :H]), Harmonic(); temperature=15)\nr0 = zeros(size(sim))","category":"page"},{"location":"initialconditions/metropolishastings/","page":"Thermal Metropolis-Hastings Monte Carlo","title":"Thermal Metropolis-Hastings Monte Carlo","text":"Then we must also specify the total number of steps and the size of each step. These can be provided in a dictionary for each species to allow for different step sizes depending on the element in the simulation.","category":"page"},{"location":"initialconditions/metropolishastings/","page":"Thermal Metropolis-Hastings Monte Carlo","title":"Thermal Metropolis-Hastings Monte Carlo","text":"steps = 1e4\nstep_size = Dict(:H=>1)","category":"page"},{"location":"initialconditions/metropolishastings/","page":"Thermal Metropolis-Hastings Monte Carlo","title":"Thermal Metropolis-Hastings Monte Carlo","text":"Now we can run the sampling. The extra keyword argument move_ratio is used to specify the fraction of the system moved during each Monte Carlo step. If we attempt to move the entire system at once, we can expect a very low acceptance ratio, whereas is we move only a single atom, the sampling will take much longer. You will likely have to experiment with this parameter to achieve optimal sampling.","category":"page"},{"location":"initialconditions/metropolishastings/","page":"Thermal Metropolis-Hastings Monte Carlo","title":"Thermal Metropolis-Hastings Monte Carlo","text":"using NQCDynamics.InitialConditions: ThermalMonteCarlo\nchain = ThermalMonteCarlo.run_advancedmh_sampling(sim, r0, steps, step_size; move_ratio=0.5)","category":"page"},{"location":"initialconditions/metropolishastings/","page":"Thermal Metropolis-Hastings Monte Carlo","title":"Thermal Metropolis-Hastings Monte Carlo","text":"Now that our sampling is complete we can evaluate the potential energy expectation value. Here we use the @estimate macro which will evaluate the given function for every configuration inside chain and return the average. Here we can see that the energy we obtain closely matches that predicted by the equipartition theorem.","category":"page"},{"location":"initialconditions/metropolishastings/","page":"Thermal Metropolis-Hastings Monte Carlo","title":"Thermal Metropolis-Hastings Monte Carlo","text":"Estimators.@estimate potential_energy(sim, chain)\nsim.temperature / 2 * 5","category":"page"},{"location":"initialconditions/metropolishastings/#Legacy-version","page":"Thermal Metropolis-Hastings Monte Carlo","title":"Legacy version","text":"","category":"section"},{"location":"initialconditions/metropolishastings/","page":"Thermal Metropolis-Hastings Monte Carlo","title":"Thermal Metropolis-Hastings Monte Carlo","text":"Prior to the use of AdvancedMH.jl, an alternative version of the algorithm was implemented that works for both classical and ring polymer systems. This is currently still included in the code but should be regarded as deprecated and will likely be removed/combined with the AdvancedMH.jl version.","category":"page"},{"location":"initialconditions/metropolishastings/","page":"Thermal Metropolis-Hastings Monte Carlo","title":"Thermal Metropolis-Hastings Monte Carlo","text":"Here, we use the legacy version to obtain a thermal distribution in a simple model system.","category":"page"},{"location":"initialconditions/metropolishastings/","page":"Thermal Metropolis-Hastings Monte Carlo","title":"Thermal Metropolis-Hastings Monte Carlo","text":"using NQCDynamics\nusing Plots","category":"page"},{"location":"initialconditions/metropolishastings/","page":"Thermal Metropolis-Hastings Monte Carlo","title":"Thermal Metropolis-Hastings Monte Carlo","text":"First we set up the system in the usual way, here we're using an NO molecule with a harmonic interaction between the atoms. Notice that we use Unitful.jl to specify the temperature.","category":"page"},{"location":"initialconditions/metropolishastings/","page":"Thermal Metropolis-Hastings Monte Carlo","title":"Thermal Metropolis-Hastings Monte Carlo","text":"using Unitful\n\natoms = Atoms([:N, :O])\nmodel = DiatomicHarmonic(1.0)\n\nsim = Simulation{Classical}(atoms, model; temperature=300u\"K\")\nnothing # hide","category":"page"},{"location":"initialconditions/metropolishastings/","page":"Thermal Metropolis-Hastings Monte Carlo","title":"Thermal Metropolis-Hastings Monte Carlo","text":"Then we have to specify the parameters for the Monte Carlo simulation and perform the sampling. Δ contains the step sizes for each of the species, R0 the initial geometry and passes the number of monte carlo passes we perform (passes*n_atoms steps total).","category":"page"},{"location":"initialconditions/metropolishastings/","page":"Thermal Metropolis-Hastings Monte Carlo","title":"Thermal Metropolis-Hastings Monte Carlo","text":"Δ = Dict([(:N, 0.1), (:O, 0.1)])\nR0 = [1.0 0.0; 0.0 0.0; 0.0 0.0]\npasses = 1000\noutput = InitialConditions.MetropolisHastings.run_monte_carlo_sampling(sim, R0, Δ, passes)\nnothing # hide","category":"page"},{"location":"initialconditions/metropolishastings/","page":"Thermal Metropolis-Hastings Monte Carlo","title":"Thermal Metropolis-Hastings Monte Carlo","text":"Output has three fields: the acceptance rates for each species and the energies and geometries obtained during sampling.","category":"page"},{"location":"initialconditions/metropolishastings/","page":"Thermal Metropolis-Hastings Monte Carlo","title":"Thermal Metropolis-Hastings Monte Carlo","text":"output.acceptance","category":"page"},{"location":"initialconditions/metropolishastings/","page":"Thermal Metropolis-Hastings Monte Carlo","title":"Thermal Metropolis-Hastings Monte Carlo","text":"plot(output.energy)\nxlabel!(\"Step\") # hide\nylabel!(\"Energy\") # hide","category":"page"},{"location":"initialconditions/metropolishastings/","page":"Thermal Metropolis-Hastings Monte Carlo","title":"Thermal Metropolis-Hastings Monte Carlo","text":"We can calculate the distance between each atom and plot the bond length throughout the sampling.","category":"page"},{"location":"initialconditions/metropolishastings/","page":"Thermal Metropolis-Hastings Monte Carlo","title":"Thermal Metropolis-Hastings Monte Carlo","text":"using LinearAlgebra\nplot([norm(R[:,1] .- R[:,2]) for R in output.R])\nxlabel!(\"Step\") # hide\nylabel!(\"Bond length\") # hide","category":"page"},{"location":"initialconditions/metropolishastings/","page":"Thermal Metropolis-Hastings Monte Carlo","title":"Thermal Metropolis-Hastings Monte Carlo","text":"The result of this simulation seamlessly interfaces with the DynamicalDistribution presented in the previous section and output.R can be readily passed to provide the position distribution. The Monte Carlo sampling does not include velocities but these can be readily obtained from the Maxwell-Boltzmann distribution.","category":"page"},{"location":"api/NQCDynamics/dynamicsoutputs/#DynamicsOutputs","page":"DynamicsOutputs","title":"DynamicsOutputs","text":"","category":"section"},{"location":"api/NQCDynamics/dynamicsoutputs/","page":"DynamicsOutputs","title":"DynamicsOutputs","text":"Here are all the functions that you can specify in the output tuple when using run_dynamics. To add more, simply add a new function in the DynamicsOutputs module. ","category":"page"},{"location":"api/NQCDynamics/dynamicsoutputs/","page":"DynamicsOutputs","title":"DynamicsOutputs","text":"Modules=[NQCDynamics.DynamicsOutputs]\nPrivate=false","category":"page"},{"location":"api/NQCDynamics/dynamicsoutputs/#NQCDynamics.DynamicsOutputs","page":"DynamicsOutputs","title":"NQCDynamics.DynamicsOutputs","text":"DynamicsOutputs\n\nDefines a set of functions that can be used to calculate outputs for dynamics simulations.\n\n\n\n\n\n","category":"module"},{"location":"api/NQCDynamics/dynamicsoutputs/#NQCDynamics.DynamicsOutputs.OutputDissociation","page":"DynamicsOutputs","title":"NQCDynamics.DynamicsOutputs.OutputDissociation","text":"Output a 1 if the molecule has dissociated, 0 otherwise.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDynamics/dynamicsoutputs/#NQCDynamics.DynamicsOutputs.OutputQuantisedDiatomic","page":"DynamicsOutputs","title":"NQCDynamics.DynamicsOutputs.OutputQuantisedDiatomic","text":"Output the vibrational and rotational quantum numbers of the final image.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDynamics/dynamicsoutputs/#NQCDynamics.DynamicsOutputs.OutputStateResolvedScattering1D","page":"DynamicsOutputs","title":"NQCDynamics.DynamicsOutputs.OutputStateResolvedScattering1D","text":"Output a ComponentVector with fields reflection and transmission containing the probability of the outcome. Each index in the arrays refers to the adiabatic state.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCDynamics/dynamicsoutputs/#NQCDynamics.DynamicsOutputs.OutputAdiabaticPopulation-Tuple{Any, Any}","page":"DynamicsOutputs","title":"NQCDynamics.DynamicsOutputs.OutputAdiabaticPopulation","text":"OutputAdiabaticPopulation(sol, i)\n\nOutput the adiabatic population at each timestep during the trajectory.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsoutputs/#NQCDynamics.DynamicsOutputs.OutputCentroidPosition-Tuple{Any, Any}","page":"DynamicsOutputs","title":"NQCDynamics.DynamicsOutputs.OutputCentroidPosition","text":"OutputCentroidPosition(sol, i)\n\nOutput the position of the ring polymer centroid at each timestep during the trajectory.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsoutputs/#NQCDynamics.DynamicsOutputs.OutputCentroidVelocity-Tuple{Any, Any}","page":"DynamicsOutputs","title":"NQCDynamics.DynamicsOutputs.OutputCentroidVelocity","text":"OutputCentroidVelocity(sol, i)\n\nOutput the velocity of the ring polymer centroid at each timestep during the trajectory. \n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsoutputs/#NQCDynamics.DynamicsOutputs.OutputDiabaticPopulation-Tuple{Any, Any}","page":"DynamicsOutputs","title":"NQCDynamics.DynamicsOutputs.OutputDiabaticPopulation","text":"OutputDiabaticPopulation(sol, i)\n\nOutput the diabatic population at each timestep during the trajectory.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsoutputs/#NQCDynamics.DynamicsOutputs.OutputDiscreteState-Tuple{Any, Any}","page":"DynamicsOutputs","title":"NQCDynamics.DynamicsOutputs.OutputDiscreteState","text":"OutputDiscreteState(sol, i)\n\nOutput the discrete state variable at each timestep during the trajectory. This is used for surface hopping simulations and returns the variable that determines the currently occupied adiabatic state.\n\nRequires that the dynamics variable has a field state.\n\nUse OutputDiabaticPopulation or OutputAdiabaticPopulation to get the population estimators.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsoutputs/#NQCDynamics.DynamicsOutputs.OutputDynamicsVariables-Tuple{Any, Any}","page":"DynamicsOutputs","title":"NQCDynamics.DynamicsOutputs.OutputDynamicsVariables","text":"OutputDynamicsVariables(sol, i)\n\nOutput all of the dynamics variables at each timestep during the trajectory.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsoutputs/#NQCDynamics.DynamicsOutputs.OutputFinal-Tuple{Any, Any}","page":"DynamicsOutputs","title":"NQCDynamics.DynamicsOutputs.OutputFinal","text":"Output the end point of each trajectory.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsoutputs/#NQCDynamics.DynamicsOutputs.OutputKineticEnergy-Tuple{Any, Any}","page":"DynamicsOutputs","title":"NQCDynamics.DynamicsOutputs.OutputKineticEnergy","text":"OutputKineticEnergy(sol, i)\n\nEvaluate the classical kinetic energy at each timestep during the trajectory.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsoutputs/#NQCDynamics.DynamicsOutputs.OutputMappingMomentum-Tuple{Any, Any}","page":"DynamicsOutputs","title":"NQCDynamics.DynamicsOutputs.OutputMappingMomentum","text":"OutputMappingMomentum(sol, i)\n\nOutput the momentum mapping variable at each timestep during the trajectory.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsoutputs/#NQCDynamics.DynamicsOutputs.OutputMappingPosition-Tuple{Any, Any}","page":"DynamicsOutputs","title":"NQCDynamics.DynamicsOutputs.OutputMappingPosition","text":"OutputMappingPosition(sol, i)\n\nOutput the position mapping variables at each timestep during the trajectory.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsoutputs/#NQCDynamics.DynamicsOutputs.OutputPosition-Tuple{Any, Any}","page":"DynamicsOutputs","title":"NQCDynamics.DynamicsOutputs.OutputPosition","text":"OutputPosition(sol, i)\n\nOutput the position at each timestep during the trajectory.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsoutputs/#NQCDynamics.DynamicsOutputs.OutputPotentialEnergy-Tuple{Any, Any}","page":"DynamicsOutputs","title":"NQCDynamics.DynamicsOutputs.OutputPotentialEnergy","text":"OutputPotentialEnergy(sol, i)\n\nOutput the adiabatic potential energy at each timestep during the trajectory.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsoutputs/#NQCDynamics.DynamicsOutputs.OutputQuantumSubsystem-Tuple{Any, Any}","page":"DynamicsOutputs","title":"NQCDynamics.DynamicsOutputs.OutputQuantumSubsystem","text":"OutputQuantumSubsystem(sol, i)\n\nOutput the quantum subsystem at each timestep during the trajectory. Usually this will refer to a wavefunction or density matrix but will depend on the particular dynamics method.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsoutputs/#NQCDynamics.DynamicsOutputs.OutputSurfaceHops-Tuple{Any, Any}","page":"DynamicsOutputs","title":"NQCDynamics.DynamicsOutputs.OutputSurfaceHops","text":"Output the total number of surface hops during the trajectory\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsoutputs/#NQCDynamics.DynamicsOutputs.OutputTotalAdiabaticPopulation-Tuple{Any, Any}","page":"DynamicsOutputs","title":"NQCDynamics.DynamicsOutputs.OutputTotalAdiabaticPopulation","text":"OutputTotalAdiabaticPopulation(sol, i)\n\nOutput the total adiabatic population at each timestep during the trajectory.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsoutputs/#NQCDynamics.DynamicsOutputs.OutputTotalDiabaticPopulation-Tuple{Any, Any}","page":"DynamicsOutputs","title":"NQCDynamics.DynamicsOutputs.OutputTotalDiabaticPopulation","text":"OutputTotalDiabaticPopulation(sol, i)\n\nOutput the total diabatic population at eah timestep during the trajectory.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsoutputs/#NQCDynamics.DynamicsOutputs.OutputTotalEnergy-Tuple{Any, Any}","page":"DynamicsOutputs","title":"NQCDynamics.DynamicsOutputs.OutputTotalEnergy","text":"OutputTotalEnergy(sol, i)\n\nEvaluate the classical Hamiltonian at each timestep during the trajectory.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsoutputs/#NQCDynamics.DynamicsOutputs.OutputVelocity-Tuple{Any, Any}","page":"DynamicsOutputs","title":"NQCDynamics.DynamicsOutputs.OutputVelocity","text":"OutputVelocity(sol, i)\n\nOutput the velocity at each timestep during the trajectory.\n\n\n\n\n\n","category":"method"},{"location":"api/NQCDynamics/dynamicsoutputs/#Internals","page":"DynamicsOutputs","title":"Internals","text":"","category":"section"},{"location":"api/NQCDynamics/dynamicsoutputs/","page":"DynamicsOutputs","title":"DynamicsOutputs","text":"Modules=[NQCDynamics.DynamicsOutputs]\nPublic=false","category":"page"},{"location":"api/NQCModels/cubeldfamodel/#CubeLDFAModel","page":"CubeLDFAModel","title":"CubeLDFAModel","text":"","category":"section"},{"location":"api/NQCModels/cubeldfamodel/","page":"CubeLDFAModel","title":"CubeLDFAModel","text":"Modules=[CubeLDFAModel]","category":"page"},{"location":"api/NQCModels/cubeldfamodel/#CubeLDFAModel.CubeLDFAModel","page":"CubeLDFAModel","title":"CubeLDFAModel.CubeLDFAModel","text":"This uses a cube file to attach friction coefficients to existing models by fitting the data provided by Gerrits et al. in PHYSICAL REVIEW B 102, 155130 (2020).\n\n\n\n\n\n","category":"module"},{"location":"api/NQCModels/cubeldfamodel/#CubeLDFAModel.LDFAModel","page":"CubeLDFAModel","title":"CubeLDFAModel.LDFAModel","text":"LDFAModel(model::Model, filename, atoms, cell;\n friction_atoms=collect(range(atoms)),\n )\n\nWrapper for existing models that adds LDFA friction.\n\nThis model uses a cube file to evaluate the electron density used to calculate the friction. This model assumes that the cube file has units of bohr for the grid and cell distances, but provides the density in Å^-3, as is the default in FHI-aims.\n\n\n\n\n\n","category":"type"},{"location":"NQCModels/frictionmodels/#models-friction","page":"Electronic friction models","title":"Electronic friction models","text":"","category":"section"},{"location":"NQCModels/frictionmodels/","page":"Electronic friction models","title":"Electronic friction models","text":"To perform molecular dynamics with electronic friction (MDEF) a specific type of model must be used that provides the friction tensor used to propagate the dynamics.","category":"page"},{"location":"NQCModels/frictionmodels/","page":"Electronic friction models","title":"Electronic friction models","text":"As detailed in the MDEF page, there are two ways to obtain friction values, either from the local density friction approximation (LDFA), or from time-dependent perturbation theory (TDPT). The models on this page describe our existing implementations.","category":"page"},{"location":"NQCModels/frictionmodels/#Analytic-models","page":"Electronic friction models","title":"Analytic models","text":"","category":"section"},{"location":"NQCModels/frictionmodels/","page":"Electronic friction models","title":"Electronic friction models","text":"Since ab initio friction calculations are often expensive it is useful to have some models that we can use to test different friction methods. The DiabaticFrictionModel is the abstract type that groups together the diabatic models for which electronic friction can be evaluated. These have many electronic states, modelling the electronic structure characteristic of a metal. The friction is calculated for these models directly from the nonadiabatic couplings with the equation:","category":"page"},{"location":"NQCModels/frictionmodels/","page":"Electronic friction models","title":"Electronic friction models","text":"γ = 2pihbar sum_j 1dHjjdH1 delta(omega_j) omega_j","category":"page"},{"location":"NQCModels/frictionmodels/","page":"Electronic friction models","title":"Electronic friction models","text":"where the delta function is approximated by a normalised Gaussian function and the sum runs over the adiabatic states ([2]). The matrix elements in this equation are the position derivatives of the diabatic hamiltonian converted to the adiabatic representation.","category":"page"},{"location":"NQCModels/frictionmodels/","page":"Electronic friction models","title":"Electronic friction models","text":"warning: Warning\nThe analytic friction models and the equation above are experimental and subject to change.","category":"page"},{"location":"NQCModels/frictionmodels/#models-cubeldfa","page":"Electronic friction models","title":"CubeLDFAModel.jl","text":"","category":"section"},{"location":"NQCModels/frictionmodels/","page":"Electronic friction models","title":"Electronic friction models","text":"Our LDFA implementation is given in CubeLDFAModel.jl which takes a .cube file containing the electron density and evaluates the friction based upon this local density.","category":"page"},{"location":"NQCModels/frictionmodels/","page":"Electronic friction models","title":"Electronic friction models","text":"The model works by fitting the LDA data provided by [3] that provides the LDFA friction coefficient as a function of the Wigner-Seitz radius. When the model is initialised, the LDA data from [3] is interpolated using DataInterpolations.jl with a cubic spline. Then, whenever required, the density at the current position is taken directly from the .cube file and converted to the Wigner-Seitz radius with the following relation:","category":"page"},{"location":"NQCModels/frictionmodels/","page":"Electronic friction models","title":"Electronic friction models","text":"r_s(rho) = (frac34pi rho (mathbfr_i))^13","category":"page"},{"location":"NQCModels/frictionmodels/","page":"Electronic friction models","title":"Electronic friction models","text":"Then, the interpolation function is evaluated with this value for the radius, which gives the LDA friction. Optimally, this would be done via an ab initio calculation to get the electron density, but this model instead uses a pre-computed .cube file to get the density with minimal cost. This makes the assumption that the density does not change throughout the dynamics, or that the surface is assumed to be frozen in place.","category":"page"},{"location":"NQCModels/frictionmodels/","page":"Electronic friction models","title":"Electronic friction models","text":"This graph shows how we interpolate the LDA data and evaluate the friction coefficient as a function of the Wigner-Seitz radius. (Image: ldfa graph)","category":"page"},{"location":"NQCModels/frictionmodels/","page":"Electronic friction models","title":"Electronic friction models","text":"The reactive scattering example uses this model to investigate the scattering of a diatomic molecule from a metal surface.","category":"page"},{"location":"NQCModels/frictionmodels/#NNInterfaces.jl","page":"Electronic friction models","title":"NNInterfaces.jl","text":"","category":"section"},{"location":"NQCModels/frictionmodels/","page":"Electronic friction models","title":"Electronic friction models","text":"Another way to perform MDEF simulations is the use one of the models from NNInterfaces.jl that uses a neural network to obtain the time-dependent perturbation theory friction from the atomic positions. As with LDFA, one of these models is used in the reactive scattering example.","category":"page"},{"location":"initialconditions/hamiltonian/#hmc-sampling","page":"Thermal Hamiltonian Monte Carlo","title":"Thermal Hamiltonian Monte Carlo","text":"","category":"section"},{"location":"initialconditions/hamiltonian/","page":"Thermal Hamiltonian Monte Carlo","title":"Thermal Hamiltonian Monte Carlo","text":"Our implementation of Hamiltonian Monte Carlo (HMC) is a light wrapper around the AdvancedHMC.jl package. If you want to learn about the HMC theory, refer to the references and documentation provided with AdvancedHMC.jl.","category":"page"},{"location":"initialconditions/hamiltonian/","page":"Thermal Hamiltonian Monte Carlo","title":"Thermal Hamiltonian Monte Carlo","text":"Currently, our implementation works for systems with classical nuclei only (i.e. Simulation but not RingPolymerSimulation).","category":"page"},{"location":"initialconditions/hamiltonian/#Example","page":"Thermal Hamiltonian Monte Carlo","title":"Example","text":"","category":"section"},{"location":"initialconditions/hamiltonian/","page":"Thermal Hamiltonian Monte Carlo","title":"Thermal Hamiltonian Monte Carlo","text":"In this example we use Hamiltonian Monte Carlo to sample the canonical distribution of a 3 dimensional harmonic oscillator potential containing 4 atoms.","category":"page"},{"location":"initialconditions/hamiltonian/","page":"Thermal Hamiltonian Monte Carlo","title":"Thermal Hamiltonian Monte Carlo","text":"using NQCDynamics\nusing Unitful\nusing UnitfulAtomic\n\nsim = Simulation(Atoms([:H, :H, :C, :C]), Harmonic(dofs=3); temperature=300u\"K\")\nr0 = randn(size(sim))\nchain, stats = InitialConditions.ThermalMonteCarlo.run_advancedhmc_sampling(sim, r0, 1e4)\nnothing # hide","category":"page"},{"location":"initialconditions/hamiltonian/","page":"Thermal Hamiltonian Monte Carlo","title":"Thermal Hamiltonian Monte Carlo","text":"The Monte Carlo chain contains the nuclear configurations that we have sampled:","category":"page"},{"location":"initialconditions/hamiltonian/","page":"Thermal Hamiltonian Monte Carlo","title":"Thermal Hamiltonian Monte Carlo","text":"chain","category":"page"},{"location":"initialconditions/hamiltonian/","page":"Thermal Hamiltonian Monte Carlo","title":"Thermal Hamiltonian Monte Carlo","text":"and stats contains extra information about the sampling procedure:","category":"page"},{"location":"initialconditions/hamiltonian/","page":"Thermal Hamiltonian Monte Carlo","title":"Thermal Hamiltonian Monte Carlo","text":"stats","category":"page"},{"location":"initialconditions/hamiltonian/","page":"Thermal Hamiltonian Monte Carlo","title":"Thermal Hamiltonian Monte Carlo","text":"Here we should see that the energy expectation for the generated ensemble matches with the equipartition theorem:","category":"page"},{"location":"initialconditions/hamiltonian/","page":"Thermal Hamiltonian Monte Carlo","title":"Thermal Hamiltonian Monte Carlo","text":"Estimators.@estimate potential_energy(sim, chain)\naustrip(sim.temperature) * 3 * 4 / 2","category":"page"},{"location":"api/NQCModels/diabaticmodels/#DiabaticModels","page":"DiabaticModels","title":"DiabaticModels","text":"","category":"section"},{"location":"api/NQCModels/diabaticmodels/","page":"DiabaticModels","title":"DiabaticModels","text":"Modules=[NQCModels.DiabaticModels]","category":"page"},{"location":"api/NQCModels/diabaticmodels/#NQCModels.DiabaticModels","page":"DiabaticModels","title":"NQCModels.DiabaticModels","text":"DiabaticModels\n\nModels defined within this module subtype the DiabaticModel and provide potentials as Hermitian matrices and derivatives as arrays of Hermitian matrices.\n\n\n\n\n\n","category":"module"},{"location":"api/NQCModels/diabaticmodels/#NQCModels.DiabaticModels.AltDebyeSpectralDensity","page":"DiabaticModels","title":"NQCModels.DiabaticModels.AltDebyeSpectralDensity","text":"AltDebyeSpectralDensity{T} <: SpectralDensity\n\nStandard Debye spectral density but uses an alternative discretization scheme that requires a cutoff parameter ωᵐ.\n\nReferences\n\nNajeh Rekik, Chang-Yu Hsieh, Holly Freedman, Gabriel Hanna, J. Chem. Phys. 138, 144106 (2013)\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/diabaticmodels/#NQCModels.DiabaticModels.AnanthModelOne","page":"DiabaticModels","title":"NQCModels.DiabaticModels.AnanthModelOne","text":"AnanthModelOne(a=0.01, b=1.6, c=0.005, d=1.0)\n\nAnanth's simple avoided crossing model (similar to Tully's first model) from J. Chem. Phys. 127, 084114 (2007).\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/diabaticmodels/#NQCModels.DiabaticModels.AnanthModelTwo","page":"DiabaticModels","title":"NQCModels.DiabaticModels.AnanthModelTwo","text":"AnanthModelTwo(a=0.04, b=0.01, c=0.005, d=1.0, e=0.7, f=1.6)\n\nAnanth's asymmetric model from J. Chem. Phys. 127, 084114 (2007).\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/diabaticmodels/#NQCModels.DiabaticModels.BosonBath","page":"DiabaticModels","title":"NQCModels.DiabaticModels.BosonBath","text":"BosonBath(density::SpectralDensity, N::Integer)\n\nBosonic bath with given spectral density.\n\nUseful for sampling the bath uncoupled from the spin for spin-boson dynamics.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/diabaticmodels/#NQCModels.DiabaticModels.DebyeSpectralDensity","page":"DiabaticModels","title":"NQCModels.DiabaticModels.DebyeSpectralDensity","text":"DebyeSpectralDensity{T} <: SpectralDensity\n\nDebye density as detailed in: Xin He, Jian Liu, J. Chem. Phys. 151, 024105 (2019)\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/diabaticmodels/#NQCModels.DiabaticModels.DiabaticFrictionModel","page":"DiabaticModels","title":"NQCModels.DiabaticModels.DiabaticFrictionModel","text":"DiabaticFrictionModel <: LargeDiabaticModel\n\nThese models are defined identically to the LargeDiabaticModel but allocate extra temporary arrays when used with NQCDynamics.jl.\n\nThis allows for the calculation of electronic friction internally from the diabatic potential after diagonalisation and calculation of nonadiabatic couplings.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/diabaticmodels/#NQCModels.DiabaticModels.DiabaticModel","page":"DiabaticModels","title":"NQCModels.DiabaticModels.DiabaticModel","text":"DiabaticModel <: Model\n\nDiabaticModels are used when a system has multiple electronic states that are presented in the diabatic representation. This is the case for the majority of model systems.\n\nImplementation\n\nDiabaticModels should implement:\n\npotential(model, R)\nderivative!(model, D, R)\nnstates(model)\nndofs(model)\n\nExample\n\nIn this example we create a simple 2 state, 1 dimensional diabatic model MyModel. As noted above, we implement the 4 relevant functions then evaluate the potential. Since this is a 1D model the argument R accepts a Real value.\n\nusing StaticArrays: SMatrix\nusing LinearAlgebra: Hermitian\n\nstruct MyModel <: NQCModels.DiabaticModels.DiabaticModel end\n\nNQCModels.nstates(::MyModel) = 2\nNQCModels.ndofs(::MyModel) = 1\n\nfunction NQCModels.potential(::MyModel, R::Real) \n V11 = R\n V22 = -R\n V12 = 1\n return Hermitian(SMatrix{2,2}(V11, V12, V12, V22))\nend\n\nfunction NQCModels.derivative!(::MyModel, D, R::Real)\n return Hermitian(SMatrix{2,2}(1, 0, 0, 1))\nend\n\nmodel = MyModel()\nNQCModels.potential(model, 10)\n\n# output\n\n2×2 Hermitian{Int64, SMatrix{2, 2, Int64, 4}}:\n 10 1\n 1 -10\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/diabaticmodels/#NQCModels.DiabaticModels.DoubleWell","page":"DiabaticModels","title":"NQCModels.DiabaticModels.DoubleWell","text":"DoubleWell(mass=1, ω=1, γ=1, Δ=1)\n\nTwo state double well, also called the one-dimensional spin-boson model. See: J. Chem. Phys. 150, 244102 (2019)\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/diabaticmodels/#NQCModels.DiabaticModels.ErpenbeckThoss","page":"DiabaticModels","title":"NQCModels.DiabaticModels.ErpenbeckThoss","text":"struct ErpenbeckThoss{T<:AbstractFloat} <: DiabaticModel\n\n1D two-state diabatic system capable of modelling a molecule adsorbed on a metal surface or a single-molecule junction.\n\nIn the two references, all of the parameters are identical except for the particle mass m and the vertical shift c applied to the ϵ₀ state. Both references modify the shift to ensure the quantum ground-state has an energy of 0 eV. Note that the mass m is specified in atomic mass units (amu) not atomic units. We calculate the offset automatically in the constructor from the Morse potential zero-point energy.\n\nReferences\n\nPHYSICAL REVIEW B 97, 235452 (2018)\nJ. Chem. Phys. 151, 191101 (2019)\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/diabaticmodels/#NQCModels.DiabaticModels.FullGaussLegendre","page":"DiabaticModels","title":"NQCModels.DiabaticModels.FullGaussLegendre","text":"FullGaussLegendre{T} <: WideBandBathDiscretisation\n\nUse Gauss-Legendre quadrature to discretise the continuum across the entire band width. This is similar to the ShenviGaussLegendre except that splits the continuum at the Fermi level into two halves.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/diabaticmodels/#NQCModels.DiabaticModels.GatesHollowayElbow","page":"DiabaticModels","title":"NQCModels.DiabaticModels.GatesHollowayElbow","text":"GatesHollowayElbow()\n\nSimple two state elbow potential from Gates and Holloway: Journal of Electron Spectroscopy and Related Phenomena, 64/65 (1993) 633-639\n\nHas two diabatic states each comprised of the sum of a Morse and a repulsive potential. The coupling between them is an exponential function of z (distance from the surface).\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/diabaticmodels/#NQCModels.DiabaticModels.LargeDiabaticModel","page":"DiabaticModels","title":"NQCModels.DiabaticModels.LargeDiabaticModel","text":"LargeDiabaticModel <: DiabaticModel\n\nSame as the DiabaticModels but uses normal Julia arrays instead of StaticArrays and must implement the inplace potential! rather than potential. This is useful when nstates is very large and StaticArrays are no longer efficient.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/diabaticmodels/#NQCModels.DiabaticModels.MiaoSubotnik","page":"DiabaticModels","title":"NQCModels.DiabaticModels.MiaoSubotnik","text":"MiaoSubotnik{T<:AbstractFloat} <: DiabaticModel\n\nDouble well model with parameters matching those of Miao and Subotnik in the reference. This model should be paired with the AndersonHolstein model to couple to the bath of metallic states.\n\nReferences\n\nJ. Chem. Phys. 150, 041711 (2019)\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/diabaticmodels/#NQCModels.DiabaticModels.OhmicSpectralDensity","page":"DiabaticModels","title":"NQCModels.DiabaticModels.OhmicSpectralDensity","text":"OhmicSpectralDensity{T} <: SpectralDensity\n\nOhmic density as detailed in: Xin He, Jian Liu, J. Chem. Phys. 151, 024105 (2019)\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/diabaticmodels/#NQCModels.DiabaticModels.OuyangModelOne","page":"DiabaticModels","title":"NQCModels.DiabaticModels.OuyangModelOne","text":"OuyangModelOne(A=0.01, B=1.6, Γ=1e-4, N=10, ΔE=1.6e-2, D=1.0)\n\nModel #1 from Ouyang and Subotnik. See also Ouyang's thesis.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/diabaticmodels/#NQCModels.DiabaticModels.ReferenceGaussLegendre","page":"DiabaticModels","title":"NQCModels.DiabaticModels.ReferenceGaussLegendre","text":"ReferenceGaussLegendre{T}\n\nImplementation translated from Fortran code used for simulations of Shenvi et al. in J. Chem. Phys. 130, 174107 (2009). Two differences from ShenviGaussLegendre:\n\nPosition of minus sign in energy levels has been corrected.\nDivision by sqrt(ΔE) in the coupling. \n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/diabaticmodels/#NQCModels.DiabaticModels.ShenviGaussLegendre","page":"DiabaticModels","title":"NQCModels.DiabaticModels.ShenviGaussLegendre","text":"ShenviGaussLegendre{T}\n\nDefined as described by Shenvi et al. in J. Chem. Phys. 130, 174107 (2009). The position of the negative sign for the state energy level has been moved to ensure the states are sorted from lowest to highest.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/diabaticmodels/#NQCModels.DiabaticModels.SpinBoson","page":"DiabaticModels","title":"NQCModels.DiabaticModels.SpinBoson","text":"SpinBoson(density::SpectralDensity, N::Integer, ϵ, Δ)\n\nSpin boson model with N bosons with given spectral density.\n\nReferences\n\nXin He, Jian Liu, J. Chem. Phys. 151, 024105 (2019)\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/diabaticmodels/#NQCModels.DiabaticModels.ThreeStateMorse","page":"DiabaticModels","title":"NQCModels.DiabaticModels.ThreeStateMorse","text":"ThreeStateMorse()\n\nThree state morse potential referred to as Model IA here: J. Chem. Phys. 150, 244102 (2019) \n\nModels IB and IC retain the same functional form and need only a change of parameters.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/diabaticmodels/#NQCModels.DiabaticModels.TrapezoidalRule","page":"DiabaticModels","title":"NQCModels.DiabaticModels.TrapezoidalRule","text":"TrapezoidalRule{B,T} <: WideBandBathDiscretisation\n\nDiscretise wide band continuum using trapezoidal rule. Leads to evenly spaced states and constant coupling.\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/diabaticmodels/#NQCModels.DiabaticModels.TullyModelOne","page":"DiabaticModels","title":"NQCModels.DiabaticModels.TullyModelOne","text":"TullyModelOne(a=0.01, b=1.6, c=0.005, d=1.0)\n\nTully's simple avoided crossing model from J. Chem. Phys. 93, 1061 (1990).\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/diabaticmodels/#NQCModels.DiabaticModels.TullyModelThree","page":"DiabaticModels","title":"NQCModels.DiabaticModels.TullyModelThree","text":"TullyModelThree(a=0.0006, b=0.1, c=0.9)\n\nTully's extended coupling with reflection model from J. Chem. Phys. 93, 1061 (1990).\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/diabaticmodels/#NQCModels.DiabaticModels.TullyModelTwo","page":"DiabaticModels","title":"NQCModels.DiabaticModels.TullyModelTwo","text":"TullyModelTwo(a=0.1, b=0.28, c=0.015, d=0.06, e=0.05)\n\nTully's dual avoided crossing model from J. Chem. Phys. 93, 1061 (1990).\n\n\n\n\n\n","category":"type"},{"location":"api/NQCModels/diabaticmodels/#NQCModels.DiabaticModels.discretize-Tuple{NQCModels.DiabaticModels.SpectralDensity, Integer}","page":"DiabaticModels","title":"NQCModels.DiabaticModels.discretize","text":"Discretize a given spectral density for N oscillators. Returns frequencies and couplings.\n\n\n\n\n\n","category":"method"},{"location":"NQCModels/ase/#ASE-interface","page":"ASE interface","title":"ASE interface","text":"","category":"section"},{"location":"NQCModels/ase/","page":"ASE interface","title":"ASE interface","text":"The easiest way to obtain potentials and forces from established codes is to use the interfaces implemented in ASE.","category":"page"},{"location":"NQCModels/ase/","page":"ASE interface","title":"ASE interface","text":"We provide the AdiabaticASEModel which wraps an ASE atoms object and its associated calculator to implement the required potential and derivative functions.","category":"page"},{"location":"NQCModels/ase/","page":"ASE interface","title":"ASE interface","text":"note: Note\nThe interface works by calling the relevant Python functions using PyCall. To use PyCall, you must make sure that your python version contains all the relevant packages, such as ase. PyCall can be configured to use a particular pre-installed Python or install its own. Refer to the PyCall README for installation and configuration instructions.","category":"page"},{"location":"NQCModels/ase/#Example","page":"ASE interface","title":"Example","text":"","category":"section"},{"location":"NQCModels/ase/","page":"ASE interface","title":"ASE interface","text":"First, it is necessary to import ase and create the ase.Atoms object and attach the desired calculator. This works exactly as in Python:","category":"page"},{"location":"NQCModels/ase/","page":"ASE interface","title":"ASE interface","text":"using PyCall\n\nase = pyimport(\"ase\")\nemt = pyimport(\"ase.calculators.emt\")\n\nh2 = ase.Atoms(\"H2\", [(0, 0, 0), (0, 0, 0.74)])\nh2.calc = emt.EMT()\nnothing # hide","category":"page"},{"location":"NQCModels/ase/","page":"ASE interface","title":"ASE interface","text":"Next, the AdiabaticASEModel is created by passing the ase.Atoms object directly to the model:","category":"page"},{"location":"NQCModels/ase/","page":"ASE interface","title":"ASE interface","text":"using NQCModels\nmodel = AdiabaticASEModel(h2)","category":"page"},{"location":"NQCModels/ase/","page":"ASE interface","title":"ASE interface","text":"Now the model can be used in the same way as any of the previously introduced analytic models.","category":"page"},{"location":"NQCModels/ase/","page":"ASE interface","title":"ASE interface","text":"potential(model, rand(3, 2))\nderivative(model, rand(3, 2))","category":"page"},{"location":"NQCModels/ase/","page":"ASE interface","title":"ASE interface","text":"tip: Tip\nIn theory, this should work with any of the ASE calculators that correctly implement the get_potential_energy and get_forces functions. For instance, you can use SchNetPack (SPK) by passing their ASE calculator to the AdiabaticASEModel. Take a look at Neural network models to learn more.","category":"page"},{"location":"api/NQCDynamics/numericutils/#Numerical-utilities","page":"Numerical utilities","title":"Numerical utilities","text":"","category":"section"},{"location":"api/NQCDynamics/numericutils/","page":"Numerical utilities","title":"Numerical utilities","text":"Modules=[NQCDynamics.FastDeterminant]","category":"page"},{"location":"api/NQCDynamics/numericutils/#NQCDynamics.FastDeterminant","page":"Numerical utilities","title":"NQCDynamics.FastDeterminant","text":"FastDeterminant\n\nWhen computing many determinants in a loop the allocation and GC of the temporary arrays for the pivots and workspace can contribute a large portion of the total runtime.\n\nUsing FastLapackInterface we can reduce the allocations and improve the runtime performance.\n\n\n\n\n\n","category":"module"},{"location":"api/NQCDynamics/numericutils/#NQCDynamics.FastDeterminant.det!-Tuple{AbstractMatrix, FastLapackInterface.LUWs}","page":"Numerical utilities","title":"NQCDynamics.FastDeterminant.det!","text":"det!(A::AbstractMatrix, ws::LUWs)\n\nSame as det but the user must provide the LU workspace from FastLapackInterface.\n\n\n\n\n\n","category":"method"},{"location":"getting_started/#Getting-started","page":"Getting started","title":"Getting started","text":"","category":"section"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"To get started with the package we can identify the necessary ingredients to perform a simple classical dynamics simulation and walk through how to set up the simulation.","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"using NQCDynamics","category":"page"},{"location":"getting_started/#Atoms","page":"Getting started","title":"Atoms","text":"","category":"section"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"First, we must define the particles in the simulation. For this purpose we provide the Atoms type which will contain the symbols, atomic numbers and masses for our atoms. Technically these need not be actual atoms and be a generic particle.","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"If using real atoms, then they can be constructed using the chemical symbols as a Vector of Julia's Symbol types, a Vector{Symbol}:","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"Atoms([:H, :C])","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"You can see that this contains two atoms labelled by their atomic numbers with their masses in atomic units.","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"note: Atomic units\nInternally atomic units are used for all quantities. This makes things simple when performing nonadiabatic dynamics. Unitful.jl and UnitfulAtomic.jl can be used to help with unit transformations, and many functions will directly accept Unitful quantities and handle the conversions for you.","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"Alternatively, if not using real atoms, Atoms can be created using a Vector{<:Real} where the provided numbers are the masses of the particles.","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"Atoms([1, 2, 3, 4, 5, 6])","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"A more detailed look into the Atoms type along with a description of how to save and load structures can be found here.","category":"page"},{"location":"getting_started/#Representing-atomic-positions-and-velocities","page":"Getting started","title":"Representing atomic positions and velocities","text":"","category":"section"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"This package chooses to separate the dynamical variables from the static atomic parameters included in the Atoms type. This allows us to easily interface with other numerical packages like DifferentialEquations.jl and AdvancedMH.jl. As such, both positions and velocities are represented using Julia's standard Array type, specifically as an Array{T,2} or the Matrix{T} type, which are equivalent. If you are new to Julia, you can find a description of the Array here. The first dimension contains each atomic degree of freedom, and the second dimension contains each atom. For example, a 3D system with two atoms would have positions:","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"using Symbolics\n@variables x1, y1, z1, x2, y2, z2\nr = [x1 x2;\n y1 y2;\n z1 z2]","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"info: Adding external packages\nSymbolics is a package available from the General registry. You will have to add it to your current environment using pkg> add Symbolics to be able to reproduce this example. Throughout the documentation we occasionally use external packages, if you run into an error you will likely have to add the package before being able to use it. Refer to the Julia manual for further information on installing packages.","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"For a 1D system it would be necessary to create a 1x1 matrix:","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"r = fill(x1, (1,1))","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"Velocities are handled in the same way as positions and the data structures are the same. Usually manual initialisation like this will only be necessary for small model systems, whereas full dimensional model system will be read from a file instead. This is explored in the Atoms documentation.","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"tip: Ring polymer simulations?\nWe can also perform simulations using ring polymers which have multiple replicas of each atom, these are implemented using Array{T,3} where the third dimension is used for each ring polymer bead. For more information, see the ring polymer methods in the dynamics methods section.","category":"page"},{"location":"getting_started/#Models","page":"Getting started","title":"Models","text":"","category":"section"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"The next ingredient required to set up the simulation is the Model, i.e., the potentials in which the system evolves. These Models are provided by NQCModels.jl, which is a convenient infrastructure for defining different kinds of models for adiabatic and nonadiabatic dynamics. These models can range from simple analytic potentials all the way up to multi-dimensional ab initio potentials. Refer to the NQCModels.jl page for information on the available models and a description of how to implement further models.","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"For now we can look at an AdiabaticModel which provides a simple harmonic potential energy function.","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"model = Harmonic()","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"Here, the four parameters (m, ω, r₀ and dofs) for this model are shown along with their types and default values. These values can be modified by specifying a new value in the constructor. For example for m:","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"model = Harmonic(m=0.4)","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"tip: Check out Parameters.jl\nMany of the models use Parameters.jl to provide convenient keyword constructors and formatted printing for the models. The Harmonic model above is defined using the @with_kw macro from Parameters.jl to give it a set of default parameters. Each of these can be modified by specifying a new value using keyword arguments in the constructor as demonstrated above.","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"Adiabatic models implement two functions to calculate the total energy and the forces, respectively: potential(model, R) and derivative(model, R).","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"Let's try these out and take a look at the results:","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"potential(model, hcat(25.0))\nderivative(model, hcat(25.0))","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"note: Why hcat?\nAll models accept an R::AbstractMatrix for the argument representing the positions of the particles in the system. These are structured such that size(R) = (dofs, natoms) where dofs is the number of degrees of freedom for each atom, and natoms is the number of atoms in the simulation.Since this is a 1D model, we use hcat to quickly create a 1x1 matrix.","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"To make sure the model is what we expect, we can plot the potential and derivative using a custom plotting recipe. This looks pretty harmonic to me!","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"using Plots\n\nplot(-5:0.1:5, model)","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"warning: Warning\nPlotting recipes currently only exist for 1D models. For more complex models you will have to handle the plotting manually.","category":"page"},{"location":"getting_started/#Simulation","page":"Getting started","title":"Simulation","text":"","category":"section"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"To control all simulation parameters in one environment, we use the Simulation type which will contain both the Atoms and Models explained above, along with any extra information required for the simulation.","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"sim = Simulation{Classical}(Atoms(:H), model)","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"Here, we have specified that each atom has a single degree of freedom and have not provided a simulation cell. Classical is a type parameter, and specifies the dynamics method that we want to use. Check out Dynamics methods to learn about the other kinds of dynamics available.","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"note: Note\nTechnically Simulation(atoms, model) is equivalent to Simulation{Classical}(atoms, model) since Classical is the default.","category":"page"},{"location":"getting_started/#Dynamics-variables","page":"Getting started","title":"Dynamics variables","text":"","category":"section"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"The final ingredient before we can perform our simulation is the initial positions and velocities of our particles. For each dynamics type, the method DynamicsVariables is implemented and creates the dynamics variables for us. For classical dynamics we must provide a Matrix of velocities and of positions. These should have size = (dofs, natoms), matching the arguments of the potential and derivative functions. Usually the initial coordinates would have some physical significance, perhaps sampled from a relevant distribution, but here we use random numbers for simplicity.","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"v = rand(3, 3);\nr = rand(3, 3);\nDynamicsVariables(sim, v, r)","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"note: Note\nSince DifferentialEquations.jl requires AbstractArrays for the dynamics variables, we use ComponentArrays.jl which allow us to conveniently store all the required information for different types of dynamics.","category":"page"},{"location":"getting_started/#Bringing-it-all-together","page":"Getting started","title":"Bringing it all together","text":"","category":"section"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"We have now covered all the parts necessary to perform our first classical dynamics simulation. Let's quickly set up our simulation parameters using what we've learned. Here we'll have two atoms in a harmonic potential, each with a single degree of freedom.","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"using NQCDynamics # hide\n\natoms = Atoms([:H, :C])\nsim = Simulation{Classical}(atoms, Harmonic(ω=50.0))\nz = DynamicsVariables(sim, randn(size(sim)), randn(size(sim)))\n\nnothing # hide","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"Now, we can finally run the trajectory using the run_dynamics function. This takes three positional arguments: the simulation parameters sim, the time span we want to solve fortspan, and the dynamics variablesz. For classical dynamics we also provide a timestepdtsince we're using theVelocityVerlet` algorithm by default.","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"note: Integration algorithms\nEach method will default to an appropriate integration algorithm though it is possible to specify via a keyword argument to run_dynamics if an alternative algorithm is preferred. Refer to the dynamics documentation for more information.","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"The final keyword argument output is used to specify the quantities we want to save during the dynamics. A list of the available quantities can be found here.","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"tip: Output format\nrun_dynamics returns a Dictionary from Dictionaries.jl that has entries containing the time and the output quantities saved at each time step.","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"tspan = (0.0, 50.0)\nsolution = run_dynamics(sim, (0.0, 50.0), z;\n dt=0.1, output=(OutputPosition, OutputVelocity))","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"Here you can see the output containing the time steps and the output quantities we specified. These can be accessed directly as shown here:","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"solution[:Time]\nsolution[:OutputPosition]","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"As with the models, we provide custom plotting recipes to quickly visualise the results before performing further analysis by manually accessing the fields of the solution table. To use these recipes, simply provide the solution to the plot function from Plots.jl and give the name of the output quantity as the second argument. This will only work if this quantity was specified in run_dynamics.","category":"page"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"using Plots # hide\nplot(solution, :OutputPosition)\nplot!(solution, :OutputVelocity)","category":"page"},{"location":"getting_started/#Ensemble-simulations","page":"Getting started","title":"Ensemble simulations","text":"","category":"section"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"We have shown how to perform a single trajectory, but usually we are interested in performing many and calculating observables using statistical methods. Running more trajectories is as simple as providing the trajectories keyword to run_dynamics, but we'll go through this in more detail in the Ensemble simulations section.","category":"page"},{"location":"getting_started/#What's-next?","page":"Getting started","title":"What's next?","text":"","category":"section"},{"location":"getting_started/","page":"Getting started","title":"Getting started","text":"Now that we've covered the basics of classical dynamics, we're ready to explore the world of nonadiabatic dynamics. All the dynamics methods follow these patterns and anything you find elsewhere in the documentation should now seem relatively familiar.","category":"page"},{"location":"initialconditions/ebk/#ebk-sampling","page":"Semiclassical EBK quantisation","title":"Semiclassical EBK quantisation","text":"","category":"section"},{"location":"initialconditions/ebk/","page":"Semiclassical EBK quantisation","title":"Semiclassical EBK quantisation","text":"In surface science, it is often of interest to investigate how collisions with surfaces can perturb the quantum states of molecules. In particular, for diatomic molecules, the rotational and vibrational quantum numbers can undergo significant changes when the molecule impacts the surface.","category":"page"},{"location":"initialconditions/ebk/","page":"Semiclassical EBK quantisation","title":"Semiclassical EBK quantisation","text":"Einstein-Brillouinn-Keller (EBK) quantisation allows for a semiclassical investigation into these phenomena by providing a link between the quantum numbers and classical positions and velocities. The quantisation procedure allows the user to generate a classical distribution with a given set of quantum numbers, then perform semiclassical dynamics and extract the quantum numbers at the end by reversing the procedure.","category":"page"},{"location":"initialconditions/ebk/","page":"Semiclassical EBK quantisation","title":"Semiclassical EBK quantisation","text":"These three steps can be applied to give insight into the processes taking place during surface scattering and allow us to attempt to predict the experimentally observed change in the quantum numbers.","category":"page"},{"location":"initialconditions/ebk/","page":"Semiclassical EBK quantisation","title":"Semiclassical EBK quantisation","text":"A detailed yet approachable description of the theory is given by [4] so we shall not delve into the theory here. Briefly, the procedure for a diatomic molecule involves an optimisation process to find the bounds of an integral, then computing the integral to obtain the vibrational quantum number. The rotational quantum number comes directly from the classical angular momentum of the molecule.","category":"page"},{"location":"initialconditions/ebk/","page":"Semiclassical EBK quantisation","title":"Semiclassical EBK quantisation","text":"Configurations can be generated by randomly selecting bond lengths from the appropriate probability distribution and selecting a matching radial velocity.","category":"page"},{"location":"initialconditions/ebk/#Example","page":"Semiclassical EBK quantisation","title":"Example","text":"","category":"section"},{"location":"initialconditions/ebk/","page":"Semiclassical EBK quantisation","title":"Semiclassical EBK quantisation","text":"In this example we will create a quantised distribution suitable for use as initial conditions for hydrogen scattering simulations.","category":"page"},{"location":"initialconditions/ebk/","page":"Semiclassical EBK quantisation","title":"Semiclassical EBK quantisation","text":"The simulation can be set up in the usual way, by specifying the atoms along with the model and the simulation cell.","category":"page"},{"location":"initialconditions/ebk/","page":"Semiclassical EBK quantisation","title":"Semiclassical EBK quantisation","text":"using NQCDynamics\nusing Unitful, UnitfulAtomic\n\natoms = Atoms([:H, :H])\nmodel = DiatomicHarmonic()\ncell = PeriodicCell(austrip.([5.883 -2.942 0; 0 5.095 0; 0 0 20] .* u\"Å\"))\nsim = Simulation(atoms, model; cell=cell)","category":"page"},{"location":"initialconditions/ebk/","page":"Semiclassical EBK quantisation","title":"Semiclassical EBK quantisation","text":"The distribution is generated using the QuantisedDiatomic.generate_configurations function. We have to provide the desired vibrational ν and rotational J quantum numbers, along with the number of samples and some other options as keyword arguments. In addition to the rotational and vibrational energy we have applied a translational impulse of 1 eV and positioned the molecule at a height of 10 bohr.","category":"page"},{"location":"initialconditions/ebk/","page":"Semiclassical EBK quantisation","title":"Semiclassical EBK quantisation","text":"using NQCDynamics.InitialConditions: QuantisedDiatomic\n\nν, J = 2, 0\nnsamples = 150\n\nconfigurations = QuantisedDiatomic.generate_configurations(sim, ν, J;\n samples=nsamples, translational_energy=1u\"eV\", height=10)","category":"page"},{"location":"initialconditions/ebk/","page":"Semiclassical EBK quantisation","title":"Semiclassical EBK quantisation","text":"The output contains both the positions and velocities, these can be passed directly to the DynamicalDistribution for use with dynamics. Here however, let's focus on the positions and visualise the distribution.","category":"page"},{"location":"initialconditions/ebk/","page":"Semiclassical EBK quantisation","title":"Semiclassical EBK quantisation","text":"This collects the x and y coordinate for each atom:","category":"page"},{"location":"initialconditions/ebk/","page":"Semiclassical EBK quantisation","title":"Semiclassical EBK quantisation","text":"r = last.(configurations)\nx = hcat([i[1,:] for i in r]...)\ny = hcat([i[2,:] for i in r]...)","category":"page"},{"location":"initialconditions/ebk/","page":"Semiclassical EBK quantisation","title":"Semiclassical EBK quantisation","text":"Now we can plot the distribution using CairoMakie","category":"page"},{"location":"initialconditions/ebk/","page":"Semiclassical EBK quantisation","title":"Semiclassical EBK quantisation","text":"using CairoMakie\n\nf = Figure()\nax = Axis(f[1,1], xlabel=\"x coordinate / bohr\", ylabel=\"y coordinate / bohr\")\nax.aspect = AxisAspect(1)\nhidedecorations!(ax; ticks=false, ticklabels=false, label=false)\n\nfor i=1:nsamples\n lines!([x[1,i], x[2,i]], [y[1,i], y[2,i]], linewidth=5, color=:black)\nend\n\ncolors = rand(nsamples)\nscatter!(x[1,:], y[1,:]; markersize=20, color=colors)\nscatter!(x[2,:], y[2,:]; markersize=20, color=colors)\n\nf","category":"page"},{"location":"initialconditions/ebk/","page":"Semiclassical EBK quantisation","title":"Semiclassical EBK quantisation","text":"Here we can see that the molecule is randomly distributed within the unit cell. Since we have used a harmonic potential, this could have been produced without using the EBK procedure, but this technique can use any arbitrary potential. In the hydrogen scattering example we build on this example and use the sample procedure to perform scattering simulations starting from this distribution.","category":"page"},{"location":"dynamicssimulations/dynamicssimulations/#dynamicssimulations","page":"Introduction","title":"Introduction","text":"","category":"section"},{"location":"dynamicssimulations/dynamicssimulations/","page":"Introduction","title":"Introduction","text":"Performing dynamics simulations is at the core of this package's functionality (as you might have guessed from the name). This section of the documentation will describe how to perform dynamics simulations, building on the introduction from Getting started.","category":"page"},{"location":"dynamicssimulations/dynamicssimulations/","page":"Introduction","title":"Introduction","text":"Since we use DifferentialEquations to perform the dynamics, it is most natural to split up the system parameters from the dynamics variables. This manifests itself as two separate data types: the Simulation, and the DynamicsVariables.","category":"page"},{"location":"dynamicssimulations/dynamicssimulations/","page":"Introduction","title":"Introduction","text":"info: Info\nIf you intend to implement a new dynamics method, we recommend reading DifferentialEquations.jl to understand more deeply how this package works.","category":"page"},{"location":"dynamicssimulations/dynamicssimulations/","page":"Introduction","title":"Introduction","text":"The Simulation holds all the static information about the system: the atoms, the model, the temperature, the cell and the dynamics method.","category":"page"},{"location":"dynamicssimulations/dynamicssimulations/","page":"Introduction","title":"Introduction","text":"using NQCDynamics # hide\natoms = Atoms(2000) # Single atom with mass = 2000 a.u.\nsim = Simulation{Ehrenfest}(atoms, TullyModelOne(); temperature=0, cell=InfiniteCell())","category":"page"},{"location":"dynamicssimulations/dynamicssimulations/","page":"Introduction","title":"Introduction","text":"Here we have initialised the simulation parameters, including the default temperature and cell explicitly. sim takes the place of the p parameter seen throughout DifferentialEquations.","category":"page"},{"location":"dynamicssimulations/dynamicssimulations/","page":"Introduction","title":"Introduction","text":"For DifferentialEquations to allow for a wide variety of solvers, the input arrays DynamicsVariables must be AbstractArrays. In nonadiabatic dynamics simulations, we usually have different groups of variables that behave in particular ways. For example: for mapping variable methods we have positions, velocities, and two sets of mapping variables representing the electronic degrees of freedom.","category":"page"},{"location":"dynamicssimulations/dynamicssimulations/","page":"Introduction","title":"Introduction","text":"For this purpose we use the ComponentVector, which allows us to arbitrarily partition the variables into their subgroups. This allows us to keep all the variables in a single array as required by DifferentialEquations, whilst still having them partitioned for convenient computation and readable code.","category":"page"},{"location":"dynamicssimulations/dynamicssimulations/","page":"Introduction","title":"Introduction","text":"v0 = hcat(10) / 2000\nr0 = hcat(-5)\nu0 = DynamicsVariables(sim, v0, r0, PureState(1))","category":"page"},{"location":"dynamicssimulations/dynamicssimulations/","page":"Introduction","title":"Introduction","text":"Since each dynamics method has a different set of variables, each method implements DynamicsVariables(sim, args...), which will convert the input into the correct structure. This helps to ensure each method follows a similar workflow, making it easy to switch between different methods. The output of this function takes the place of the u argument seen throughout DifferentialEquations.","category":"page"},{"location":"dynamicssimulations/dynamicssimulations/","page":"Introduction","title":"Introduction","text":"With both the Simulation and DynamicsVariables in hand, the central function is run_dynamics which allows us to perform a single dynamics trajectory. run_dynamics takes the simulation parameters sim and the initial conditions u0, along with a time span tspan that the trajectory will cover.","category":"page"},{"location":"dynamicssimulations/dynamicssimulations/","page":"Introduction","title":"Introduction","text":"tspan = (0.0, 2000.0)\nrun_dynamics(sim, tspan, u0; output=OutputDynamicsVariables, dt=1.0)","category":"page"},{"location":"dynamicssimulations/dynamicssimulations/","page":"Introduction","title":"Introduction","text":"The output is a dictionary containing entries for :Time and our requested output quantity. Output is a required keyword and the code will error unless at least one quantity is specified. By passing a Tuple to the output keyword argument we can ask for multiple quantities.","category":"page"},{"location":"dynamicssimulations/dynamicssimulations/","page":"Introduction","title":"Introduction","text":"out = run_dynamics(sim, tspan, u0; output=(OutputPosition, OutputAdiabaticPopulation), dt=1.0)","category":"page"},{"location":"dynamicssimulations/dynamicssimulations/","page":"Introduction","title":"Introduction","text":"The quantities that are available are listed here. More quantities can be added by defining new functions with the signature f(sol, i). The first argument is the DifferentialEquations.jl solution object and the second is the trajectory index.","category":"page"},{"location":"dynamicssimulations/dynamicssimulations/","page":"Introduction","title":"Introduction","text":"This time we can see that the output contains the two quantities that we asked for.","category":"page"},{"location":"dynamicssimulations/dynamicssimulations/","page":"Introduction","title":"Introduction","text":"using Plots\nplot(out, :OutputPosition)","category":"page"},{"location":"dynamicssimulations/dynamicssimulations/","page":"Introduction","title":"Introduction","text":"plot(out, :OutputAdiabaticPopulation)","category":"page"},{"location":"dynamicssimulations/dynamicssimulations/","page":"Introduction","title":"Introduction","text":"note: Note\nHere we have used a special plot recipe that will automatically plot any quantity against time. This is useful when investigating the results of a single trajectory.","category":"page"},{"location":"dynamicssimulations/dynamicssimulations/","page":"Introduction","title":"Introduction","text":"All of the dynamics methods work in a similar way. For details on a specific method along with examples, please see the method specific page in the sidebar under Dynamics methods.","category":"page"}] }