From 9bb5dac3f784e3de597d2ab0d0cf8427b69df356 Mon Sep 17 00:00:00 2001 From: "Documenter.jl" Date: Mon, 15 Jan 2024 15:56:24 +0000 Subject: [PATCH] build based on cfaa529 --- stable | 2 +- v1 | 2 +- v1.0 | 2 +- v1.0.3/.documenter-siteinfo.json | 1 + v1.0.3/assets/documenter.js | 889 ++++++++++++++++++++++ v1.0.3/assets/themes/documenter-dark.css | 7 + v1.0.3/assets/themes/documenter-light.css | 9 + v1.0.3/assets/themeswap.js | 84 ++ v1.0.3/assets/warner.js | 52 ++ v1.0.3/custom/index.html | 110 +++ v1.0.3/debugging/index.html | 68 ++ v1.0.3/figure/Automa.png | Bin 0 -> 88675 bytes v1.0.3/figure/actions.png | Bin 0 -> 17030 bytes v1.0.3/figure/alt.png | Bin 0 -> 12743 bytes v1.0.3/figure/cat.png | Bin 0 -> 4603 bytes v1.0.3/figure/kleenestar.png | Bin 0 -> 12368 bytes v1.0.3/figure/large_dfa.png | Bin 0 -> 19790 bytes v1.0.3/figure/large_machine.png | Bin 0 -> 10743 bytes v1.0.3/figure/larger.png | Bin 0 -> 40695 bytes v1.0.3/figure/preconditions.png | Bin 0 -> 10979 bytes v1.0.3/figure/simple.png | Bin 0 -> 6574 bytes v1.0.3/index.html | 48 ++ v1.0.3/io/index.html | 120 +++ v1.0.3/parser/index.html | 122 +++ v1.0.3/reader/index.html | 60 ++ v1.0.3/regex/index.html | 17 + v1.0.3/search_index.js | 3 + v1.0.3/siteinfo.js | 1 + v1.0.3/theory/index.html | 2 + v1.0.3/tokenizer/index.html | 94 +++ v1.0.3/validators/index.html | 32 + versions.js | 2 +- 32 files changed, 1723 insertions(+), 4 deletions(-) create mode 100644 v1.0.3/.documenter-siteinfo.json create mode 100644 v1.0.3/assets/documenter.js create mode 100644 v1.0.3/assets/themes/documenter-dark.css create mode 100644 v1.0.3/assets/themes/documenter-light.css create mode 100644 v1.0.3/assets/themeswap.js create mode 100644 v1.0.3/assets/warner.js create mode 100644 v1.0.3/custom/index.html create mode 100644 v1.0.3/debugging/index.html create mode 100644 v1.0.3/figure/Automa.png create mode 100644 v1.0.3/figure/actions.png create mode 100644 v1.0.3/figure/alt.png create mode 100644 v1.0.3/figure/cat.png create mode 100644 v1.0.3/figure/kleenestar.png create mode 100644 v1.0.3/figure/large_dfa.png create mode 100644 v1.0.3/figure/large_machine.png create mode 100644 v1.0.3/figure/larger.png create mode 100644 v1.0.3/figure/preconditions.png create mode 100644 v1.0.3/figure/simple.png create mode 100644 v1.0.3/index.html create mode 100644 v1.0.3/io/index.html create mode 100644 v1.0.3/parser/index.html create mode 100644 v1.0.3/reader/index.html create mode 100644 v1.0.3/regex/index.html create mode 100644 v1.0.3/search_index.js create mode 100644 v1.0.3/siteinfo.js create mode 100644 v1.0.3/theory/index.html create mode 100644 v1.0.3/tokenizer/index.html create mode 100644 v1.0.3/validators/index.html diff --git a/stable b/stable index b4822439..13637f44 120000 --- a/stable +++ b/stable @@ -1 +1 @@ -v1.0.2 \ No newline at end of file +v1.0.3 \ No newline at end of file diff --git a/v1 b/v1 index b4822439..13637f44 120000 --- a/v1 +++ b/v1 @@ -1 +1 @@ -v1.0.2 \ No newline at end of file +v1.0.3 \ No newline at end of file diff --git a/v1.0 b/v1.0 index b4822439..13637f44 120000 --- a/v1.0 +++ b/v1.0 @@ -1 +1 @@ -v1.0.2 \ No newline at end of file +v1.0.3 \ No newline at end of file diff --git a/v1.0.3/.documenter-siteinfo.json b/v1.0.3/.documenter-siteinfo.json new file mode 100644 index 00000000..f8803872 --- /dev/null +++ b/v1.0.3/.documenter-siteinfo.json @@ -0,0 +1 @@ +{"documenter":{"julia_version":"1.10.0","generation_timestamp":"2024-01-15T15:56:21","documenter_version":"1.2.1"}} \ No newline at end of file diff --git a/v1.0.3/assets/documenter.js b/v1.0.3/assets/documenter.js new file mode 100644 index 00000000..f5311607 --- /dev/null +++ b/v1.0.3/assets/documenter.js @@ -0,0 +1,889 @@ +// Generated by Documenter.jl +requirejs.config({ + paths: { + 'highlight-julia': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/languages/julia.min', + 'headroom': 'https://cdnjs.cloudflare.com/ajax/libs/headroom/0.12.0/headroom.min', + 'jqueryui': 'https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.13.2/jquery-ui.min', + 'minisearch': 'https://cdn.jsdelivr.net/npm/minisearch@6.1.0/dist/umd/index.min', + 'katex-auto-render': 'https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/contrib/auto-render.min', + 'jquery': 'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.0/jquery.min', + 'headroom-jquery': 'https://cdnjs.cloudflare.com/ajax/libs/headroom/0.12.0/jQuery.headroom.min', + 'katex': 'https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min', + 'highlight': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min', + 'highlight-julia-repl': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/languages/julia-repl.min', + }, + shim: { + "highlight-julia": { + "deps": [ + "highlight" + ] + }, + "katex-auto-render": { + "deps": [ + "katex" + ] + }, + "headroom-jquery": { + "deps": [ + "jquery", + "headroom" + ] + }, + "highlight-julia-repl": { + "deps": [ + "highlight" + ] + } +} +}); +//////////////////////////////////////////////////////////////////////////////// +require(['jquery', 'katex', 'katex-auto-render'], function($, katex, renderMathInElement) { +$(document).ready(function() { + renderMathInElement( + document.body, + { + "delimiters": [ + { + "left": "$", + "right": "$", + "display": false + }, + { + "left": "$$", + "right": "$$", + "display": true + }, + { + "left": "\\[", + "right": "\\]", + "display": true + } + ] +} + + ); +}) + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery', 'highlight', 'highlight-julia', 'highlight-julia-repl'], function($) { +$(document).ready(function() { + hljs.highlightAll(); +}) + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +let timer = 0; +var isExpanded = true; + +$(document).on("click", ".docstring header", function () { + let articleToggleTitle = "Expand docstring"; + + debounce(() => { + if ($(this).siblings("section").is(":visible")) { + $(this) + .find(".docstring-article-toggle-button") + .removeClass("fa-chevron-down") + .addClass("fa-chevron-right"); + } else { + $(this) + .find(".docstring-article-toggle-button") + .removeClass("fa-chevron-right") + .addClass("fa-chevron-down"); + + articleToggleTitle = "Collapse docstring"; + } + + $(this) + .find(".docstring-article-toggle-button") + .prop("title", articleToggleTitle); + $(this).siblings("section").slideToggle(); + }); +}); + +$(document).on("click", ".docs-article-toggle-button", function () { + let articleToggleTitle = "Expand docstring"; + let navArticleToggleTitle = "Expand all docstrings"; + + debounce(() => { + if (isExpanded) { + $(this).removeClass("fa-chevron-up").addClass("fa-chevron-down"); + $(".docstring-article-toggle-button") + .removeClass("fa-chevron-down") + .addClass("fa-chevron-right"); + + isExpanded = false; + + $(".docstring section").slideUp(); + } else { + $(this).removeClass("fa-chevron-down").addClass("fa-chevron-up"); + $(".docstring-article-toggle-button") + .removeClass("fa-chevron-right") + .addClass("fa-chevron-down"); + + isExpanded = true; + articleToggleTitle = "Collapse docstring"; + navArticleToggleTitle = "Collapse all docstrings"; + + $(".docstring section").slideDown(); + } + + $(this).prop("title", navArticleToggleTitle); + $(".docstring-article-toggle-button").prop("title", articleToggleTitle); + }); +}); + +function debounce(callback, timeout = 300) { + if (Date.now() - timer > timeout) { + callback(); + } + + clearTimeout(timer); + + timer = Date.now(); +} + +}) +//////////////////////////////////////////////////////////////////////////////// +require([], function() { +function addCopyButtonCallbacks() { + for (const el of document.getElementsByTagName("pre")) { + const button = document.createElement("button"); + button.classList.add("copy-button", "fa-solid", "fa-copy"); + button.setAttribute("aria-label", "Copy this code block"); + button.setAttribute("title", "Copy"); + + el.appendChild(button); + + const success = function () { + button.classList.add("success", "fa-check"); + button.classList.remove("fa-copy"); + }; + + const failure = function () { + button.classList.add("error", "fa-xmark"); + button.classList.remove("fa-copy"); + }; + + button.addEventListener("click", function () { + copyToClipboard(el.innerText).then(success, failure); + + setTimeout(function () { + button.classList.add("fa-copy"); + button.classList.remove("success", "fa-check", "fa-xmark"); + }, 5000); + }); + } +} + +function copyToClipboard(text) { + // clipboard API is only available in secure contexts + if (window.navigator && window.navigator.clipboard) { + return window.navigator.clipboard.writeText(text); + } else { + return new Promise(function (resolve, reject) { + try { + const el = document.createElement("textarea"); + el.textContent = text; + el.style.position = "fixed"; + el.style.opacity = 0; + document.body.appendChild(el); + el.select(); + document.execCommand("copy"); + + resolve(); + } catch (err) { + reject(err); + } finally { + document.body.removeChild(el); + } + }); + } +} + +if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", addCopyButtonCallbacks); +} else { + addCopyButtonCallbacks(); +} + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery', 'headroom', 'headroom-jquery'], function($, Headroom) { + +// Manages the top navigation bar (hides it when the user starts scrolling down on the +// mobile). +window.Headroom = Headroom; // work around buggy module loading? +$(document).ready(function () { + $("#documenter .docs-navbar").headroom({ + tolerance: { up: 10, down: 10 }, + }); +}); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery', 'minisearch'], function($, minisearch) { + +// In general, most search related things will have "search" as a prefix. +// To get an in-depth about the thought process you can refer: https://hetarth02.hashnode.dev/series/gsoc + +let results = []; +let timer = undefined; + +let data = documenterSearchIndex["docs"].map((x, key) => { + x["id"] = key; // minisearch requires a unique for each object + return x; +}); + +// list below is the lunr 2.1.3 list minus the intersect with names(Base) +// (all, any, get, in, is, only, which) and (do, else, for, let, where, while, with) +// ideally we'd just filter the original list but it's not available as a variable +const stopWords = new Set([ + "a", + "able", + "about", + "across", + "after", + "almost", + "also", + "am", + "among", + "an", + "and", + "are", + "as", + "at", + "be", + "because", + "been", + "but", + "by", + "can", + "cannot", + "could", + "dear", + "did", + "does", + "either", + "ever", + "every", + "from", + "got", + "had", + "has", + "have", + "he", + "her", + "hers", + "him", + "his", + "how", + "however", + "i", + "if", + "into", + "it", + "its", + "just", + "least", + "like", + "likely", + "may", + "me", + "might", + "most", + "must", + "my", + "neither", + "no", + "nor", + "not", + "of", + "off", + "often", + "on", + "or", + "other", + "our", + "own", + "rather", + "said", + "say", + "says", + "she", + "should", + "since", + "so", + "some", + "than", + "that", + "the", + "their", + "them", + "then", + "there", + "these", + "they", + "this", + "tis", + "to", + "too", + "twas", + "us", + "wants", + "was", + "we", + "were", + "what", + "when", + "who", + "whom", + "why", + "will", + "would", + "yet", + "you", + "your", +]); + +let index = new minisearch({ + fields: ["title", "text"], // fields to index for full-text search + storeFields: ["location", "title", "text", "category", "page"], // fields to return with search results + processTerm: (term) => { + let word = stopWords.has(term) ? null : term; + if (word) { + // custom trimmer that doesn't strip @ and !, which are used in julia macro and function names + word = word + .replace(/^[^a-zA-Z0-9@!]+/, "") + .replace(/[^a-zA-Z0-9@!]+$/, ""); + } + + return word ?? null; + }, + // add . as a separator, because otherwise "title": "Documenter.Anchors.add!", would not find anything if searching for "add!", only for the entire qualification + tokenize: (string) => string.split(/[\s\-\.]+/), + // options which will be applied during the search + searchOptions: { + boost: { title: 100 }, + fuzzy: 2, + processTerm: (term) => { + let word = stopWords.has(term) ? null : term; + if (word) { + word = word + .replace(/^[^a-zA-Z0-9@!]+/, "") + .replace(/[^a-zA-Z0-9@!]+$/, ""); + } + + return word ?? null; + }, + tokenize: (string) => string.split(/[\s\-\.]+/), + }, +}); + +index.addAll(data); + +let filters = [...new Set(data.map((x) => x.category))]; +var modal_filters = make_modal_body_filters(filters); +var filter_results = []; + +$(document).on("keyup", ".documenter-search-input", function (event) { + // Adding a debounce to prevent disruptions from super-speed typing! + debounce(() => update_search(filter_results), 300); +}); + +$(document).on("click", ".search-filter", function () { + if ($(this).hasClass("search-filter-selected")) { + $(this).removeClass("search-filter-selected"); + } else { + $(this).addClass("search-filter-selected"); + } + + // Adding a debounce to prevent disruptions from crazy clicking! + debounce(() => get_filters(), 300); +}); + +/** + * A debounce function, takes a function and an optional timeout in milliseconds + * + * @function callback + * @param {number} timeout + */ +function debounce(callback, timeout = 300) { + clearTimeout(timer); + timer = setTimeout(callback, timeout); +} + +/** + * Make/Update the search component + * + * @param {string[]} selected_filters + */ +function update_search(selected_filters = []) { + let initial_search_body = ` +
Type something to get started!
+ `; + + let querystring = $(".documenter-search-input").val(); + + if (querystring.trim()) { + results = index.search(querystring, { + filter: (result) => { + // Filtering results + if (selected_filters.length === 0) { + return result.score >= 1; + } else { + return ( + result.score >= 1 && selected_filters.includes(result.category) + ); + } + }, + }); + + let search_result_container = ``; + let search_divider = `
`; + + if (results.length) { + let links = []; + let count = 0; + let search_results = ""; + + results.forEach(function (result) { + if (result.location) { + // Checking for duplication of results for the same page + if (!links.includes(result.location)) { + search_results += make_search_result(result, querystring); + count++; + } + + links.push(result.location); + } + }); + + let result_count = `
${count} result(s)
`; + + search_result_container = ` +
+ ${modal_filters} + ${search_divider} + ${result_count} +
+ ${search_results} +
+
+ `; + } else { + search_result_container = ` +
+ ${modal_filters} + ${search_divider} +
0 result(s)
+
+
No result found!
+ `; + } + + if ($(".search-modal-card-body").hasClass("is-justify-content-center")) { + $(".search-modal-card-body").removeClass("is-justify-content-center"); + } + + $(".search-modal-card-body").html(search_result_container); + } else { + filter_results = []; + modal_filters = make_modal_body_filters(filters, filter_results); + + if (!$(".search-modal-card-body").hasClass("is-justify-content-center")) { + $(".search-modal-card-body").addClass("is-justify-content-center"); + } + + $(".search-modal-card-body").html(initial_search_body); + } +} + +/** + * Make the modal filter html + * + * @param {string[]} filters + * @param {string[]} selected_filters + * @returns string + */ +function make_modal_body_filters(filters, selected_filters = []) { + let str = ``; + + filters.forEach((val) => { + if (selected_filters.includes(val)) { + str += `${val}`; + } else { + str += `${val}`; + } + }); + + let filter_html = ` +
+ Filters: + ${str} +
+ `; + + return filter_html; +} + +/** + * Make the result component given a minisearch result data object and the value of the search input as queryString. + * To view the result object structure, refer: https://lucaong.github.io/minisearch/modules/_minisearch_.html#searchresult + * + * @param {object} result + * @param {string} querystring + * @returns string + */ +function make_search_result(result, querystring) { + let search_divider = `
`; + let display_link = + result.location.slice(Math.max(0), Math.min(50, result.location.length)) + + (result.location.length > 30 ? "..." : ""); // To cut-off the link because it messes with the overflow of the whole div + + if (result.page !== "") { + display_link += ` (${result.page})`; + } + + let textindex = new RegExp(`\\b${querystring}\\b`, "i").exec(result.text); + let text = + textindex !== null + ? result.text.slice( + Math.max(textindex.index - 100, 0), + Math.min( + textindex.index + querystring.length + 100, + result.text.length + ) + ) + : ""; // cut-off text before and after from the match + + let display_result = text.length + ? "..." + + text.replace( + new RegExp(`\\b${querystring}\\b`, "i"), // For first occurrence + '$&' + ) + + "..." + : ""; // highlights the match + + let in_code = false; + if (!["page", "section"].includes(result.category.toLowerCase())) { + in_code = true; + } + + // We encode the full url to escape some special characters which can lead to broken links + let result_div = ` + +
+
${result.title}
+
${result.category}
+
+

+ ${display_result} +

+
+ ${display_link} +
+
+ ${search_divider} + `; + + return result_div; +} + +/** + * Get selected filters, remake the filter html and lastly update the search modal + */ +function get_filters() { + let ele = $(".search-filters .search-filter-selected").get(); + filter_results = ele.map((x) => $(x).text().toLowerCase()); + modal_filters = make_modal_body_filters(filters, filter_results); + update_search(filter_results); +} + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +// Modal settings dialog +$(document).ready(function () { + var settings = $("#documenter-settings"); + $("#documenter-settings-button").click(function () { + settings.toggleClass("is-active"); + }); + // Close the dialog if X is clicked + $("#documenter-settings button.delete").click(function () { + settings.removeClass("is-active"); + }); + // Close dialog if ESC is pressed + $(document).keyup(function (e) { + if (e.keyCode == 27) settings.removeClass("is-active"); + }); +}); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +let search_modal_header = ` + +`; + +let initial_search_body = ` +
Type something to get started!
+`; + +let search_modal_footer = ` + +`; + +$(document.body).append( + ` + + ` +); + +document.querySelector(".docs-search-query").addEventListener("click", () => { + openModal(); +}); + +document.querySelector(".close-search-modal").addEventListener("click", () => { + closeModal(); +}); + +$(document).on("click", ".search-result-link", function () { + closeModal(); +}); + +document.addEventListener("keydown", (event) => { + if ((event.ctrlKey || event.metaKey) && event.key === "/") { + openModal(); + } else if (event.key === "Escape") { + closeModal(); + } + + return false; +}); + +// Functions to open and close a modal +function openModal() { + let searchModal = document.querySelector("#search-modal"); + + searchModal.classList.add("is-active"); + document.querySelector(".documenter-search-input").focus(); +} + +function closeModal() { + let searchModal = document.querySelector("#search-modal"); + let initial_search_body = ` +
Type something to get started!
+ `; + + searchModal.classList.remove("is-active"); + document.querySelector(".documenter-search-input").blur(); + + if (!$(".search-modal-card-body").hasClass("is-justify-content-center")) { + $(".search-modal-card-body").addClass("is-justify-content-center"); + } + + $(".documenter-search-input").val(""); + $(".search-modal-card-body").html(initial_search_body); +} + +document + .querySelector("#search-modal .modal-background") + .addEventListener("click", () => { + closeModal(); + }); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +// Manages the showing and hiding of the sidebar. +$(document).ready(function () { + var sidebar = $("#documenter > .docs-sidebar"); + var sidebar_button = $("#documenter-sidebar-button"); + sidebar_button.click(function (ev) { + ev.preventDefault(); + sidebar.toggleClass("visible"); + if (sidebar.hasClass("visible")) { + // Makes sure that the current menu item is visible in the sidebar. + $("#documenter .docs-menu a.is-active").focus(); + } + }); + $("#documenter > .docs-main").bind("click", function (ev) { + if ($(ev.target).is(sidebar_button)) { + return; + } + if (sidebar.hasClass("visible")) { + sidebar.removeClass("visible"); + } + }); +}); + +// Resizes the package name / sitename in the sidebar if it is too wide. +// Inspired by: https://github.com/davatron5000/FitText.js +$(document).ready(function () { + e = $("#documenter .docs-autofit"); + function resize() { + var L = parseInt(e.css("max-width"), 10); + var L0 = e.width(); + if (L0 > L) { + var h0 = parseInt(e.css("font-size"), 10); + e.css("font-size", (L * h0) / L0); + // TODO: make sure it survives resizes? + } + } + // call once and then register events + resize(); + $(window).resize(resize); + $(window).on("orientationchange", resize); +}); + +// Scroll the navigation bar to the currently selected menu item +$(document).ready(function () { + var sidebar = $("#documenter .docs-menu").get(0); + var active = $("#documenter .docs-menu .is-active").get(0); + if (typeof active !== "undefined") { + sidebar.scrollTop = active.offsetTop - sidebar.offsetTop - 15; + } +}); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +// Theme picker setup +$(document).ready(function () { + // onchange callback + $("#documenter-themepicker").change(function themepick_callback(ev) { + var themename = $("#documenter-themepicker option:selected").attr("value"); + if (themename === "auto") { + // set_theme(window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'); + window.localStorage.removeItem("documenter-theme"); + } else { + // set_theme(themename); + window.localStorage.setItem("documenter-theme", themename); + } + // We re-use the global function from themeswap.js to actually do the swapping. + set_theme_from_local_storage(); + }); + + // Make sure that the themepicker displays the correct theme when the theme is retrieved + // from localStorage + if (typeof window.localStorage !== "undefined") { + var theme = window.localStorage.getItem("documenter-theme"); + if (theme !== null) { + $("#documenter-themepicker option").each(function (i, e) { + e.selected = e.value === theme; + }); + } + } +}); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +// update the version selector with info from the siteinfo.js and ../versions.js files +$(document).ready(function () { + // If the version selector is disabled with DOCUMENTER_VERSION_SELECTOR_DISABLED in the + // siteinfo.js file, we just return immediately and not display the version selector. + if ( + typeof DOCUMENTER_VERSION_SELECTOR_DISABLED === "boolean" && + DOCUMENTER_VERSION_SELECTOR_DISABLED + ) { + return; + } + + var version_selector = $("#documenter .docs-version-selector"); + var version_selector_select = $("#documenter .docs-version-selector select"); + + version_selector_select.change(function (x) { + target_href = version_selector_select + .children("option:selected") + .get(0).value; + window.location.href = target_href; + }); + + // add the current version to the selector based on siteinfo.js, but only if the selector is empty + if ( + typeof DOCUMENTER_CURRENT_VERSION !== "undefined" && + $("#version-selector > option").length == 0 + ) { + var option = $( + "" + ); + version_selector_select.append(option); + } + + if (typeof DOC_VERSIONS !== "undefined") { + var existing_versions = version_selector_select.children("option"); + var existing_versions_texts = existing_versions.map(function (i, x) { + return x.text; + }); + DOC_VERSIONS.forEach(function (each) { + var version_url = documenterBaseURL + "/../" + each + "/"; + var existing_id = $.inArray(each, existing_versions_texts); + // if not already in the version selector, add it as a new option, + // otherwise update the old option with the URL and enable it + if (existing_id == -1) { + var option = $( + "" + ); + version_selector_select.append(option); + } else { + var option = existing_versions[existing_id]; + option.value = version_url; + option.disabled = false; + } + }); + } + + // only show the version selector if the selector has been populated + if (version_selector_select.children("option").length > 0) { + version_selector.toggleClass("visible"); + } +}); + +}) diff --git a/v1.0.3/assets/themes/documenter-dark.css b/v1.0.3/assets/themes/documenter-dark.css new file mode 100644 index 00000000..9f5449f4 --- /dev/null +++ b/v1.0.3/assets/themes/documenter-dark.css @@ -0,0 +1,7 @@ +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:1rem;height:2.5em;justify-content:flex-start;line-height:1.5;padding-bottom:calc(0.5em - 1px);padding-left:calc(0.75em - 1px);padding-right:calc(0.75em - 1px);padding-top:calc(0.5em - 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}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{-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 .pagination:not(:last-child),html.theme--documenter-dark .message:not(:last-child),html.theme--documenter-dark .level:not(:last-child),html.theme--documenter-dark .breadcrumb: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{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-moz-appearance:none;-webkit-appearance:none;background-color:rgba(10,10,10,0.2);border:none;border-radius:9999px;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:9999px;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 .navbar-burger{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0}/*! minireset.css v0.0.6 | 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,video{height:auto;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:inherit}.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-primary-light{color:#f1f5f9 !important}a.has-text-primary-light:hover,a.has-text-primary-light:focus{color:#cddbe9 !important}.has-background-primary-light{background-color:#f1f5f9 !important}.has-text-primary-dark{color:#4d7eb2 !important}a.has-text-primary-dark:hover,a.has-text-primary-dark:focus{color:#7198c1 !important}.has-background-primary-dark{background-color:#4d7eb2 !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-link-light{color:#edfdf9 !important}a.has-text-link-light:hover,a.has-text-link-light:focus{color:#c0f6ec !important}.has-background-link-light{background-color:#edfdf9 !important}.has-text-link-dark{color:#15987e !important}a.has-text-link-dark:hover,a.has-text-link-dark:focus{color:#1bc5a4 !important}.has-background-link-dark{background-color:#15987e !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-info-light{color:#ebf7ff !important}a.has-text-info-light:hover,a.has-text-info-light:focus{color:#b9e2fe !important}.has-background-info-light{background-color:#ebf7ff !important}.has-text-info-dark{color:#0e9dfb !important}a.has-text-info-dark:hover,a.has-text-info-dark:focus{color:#40b1fc !important}.has-background-info-dark{background-color:#0e9dfb !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-success-light{color:#ebfff3 !important}a.has-text-success-light:hover,a.has-text-success-light:focus{color:#b8ffd6 !important}.has-background-success-light{background-color:#ebfff3 !important}.has-text-success-dark{color:#00eb64 !important}a.has-text-success-dark:hover,a.has-text-success-dark:focus{color:#1fff7e !important}.has-background-success-dark{background-color:#00eb64 !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-warning-light{color:#fffaeb !important}a.has-text-warning-light:hover,a.has-text-warning-light:focus{color:#ffedb8 !important}.has-background-warning-light{background-color:#fffaeb !important}.has-text-warning-dark{color:#d19c00 !important}a.has-text-warning-dark:hover,a.has-text-warning-dark:focus{color:#ffbf05 !important}.has-background-warning-dark{background-color:#d19c00 !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-danger-light{color:#fdeeec !important}a.has-text-danger-light:hover,a.has-text-danger-light:focus{color:#fac3bd !important}.has-background-danger-light{background-color:#fdeeec !important}.has-text-danger-dark{color:#ec311d !important}a.has-text-danger-dark:hover,a.has-text-danger-dark:focus{color:#f05c4c !important}.has-background-danger-dark{background-color:#ec311d !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}.is-flex-direction-row{flex-direction:row !important}.is-flex-direction-row-reverse{flex-direction:row-reverse !important}.is-flex-direction-column{flex-direction:column !important}.is-flex-direction-column-reverse{flex-direction:column-reverse !important}.is-flex-wrap-nowrap{flex-wrap:nowrap !important}.is-flex-wrap-wrap{flex-wrap:wrap !important}.is-flex-wrap-wrap-reverse{flex-wrap:wrap-reverse !important}.is-justify-content-flex-start{justify-content:flex-start !important}.is-justify-content-flex-end{justify-content:flex-end !important}.is-justify-content-center{justify-content:center !important}.is-justify-content-space-between{justify-content:space-between !important}.is-justify-content-space-around{justify-content:space-around !important}.is-justify-content-space-evenly{justify-content:space-evenly !important}.is-justify-content-start{justify-content:start !important}.is-justify-content-end{justify-content:end !important}.is-justify-content-left{justify-content:left !important}.is-justify-content-right{justify-content:right !important}.is-align-content-flex-start{align-content:flex-start !important}.is-align-content-flex-end{align-content:flex-end !important}.is-align-content-center{align-content:center !important}.is-align-content-space-between{align-content:space-between !important}.is-align-content-space-around{align-content:space-around !important}.is-align-content-space-evenly{align-content:space-evenly !important}.is-align-content-stretch{align-content:stretch !important}.is-align-content-start{align-content:start !important}.is-align-content-end{align-content:end !important}.is-align-content-baseline{align-content:baseline !important}.is-align-items-stretch{align-items:stretch !important}.is-align-items-flex-start{align-items:flex-start !important}.is-align-items-flex-end{align-items:flex-end !important}.is-align-items-center{align-items:center !important}.is-align-items-baseline{align-items:baseline !important}.is-align-items-start{align-items:start !important}.is-align-items-end{align-items:end !important}.is-align-items-self-start{align-items:self-start !important}.is-align-items-self-end{align-items:self-end !important}.is-align-self-auto{align-self:auto !important}.is-align-self-flex-start{align-self:flex-start !important}.is-align-self-flex-end{align-self:flex-end !important}.is-align-self-center{align-self:center !important}.is-align-self-baseline{align-self:baseline !important}.is-align-self-stretch{align-self:stretch !important}.is-flex-grow-0{flex-grow:0 !important}.is-flex-grow-1{flex-grow:1 !important}.is-flex-grow-2{flex-grow:2 !important}.is-flex-grow-3{flex-grow:3 !important}.is-flex-grow-4{flex-grow:4 !important}.is-flex-grow-5{flex-grow:5 !important}.is-flex-shrink-0{flex-shrink:0 !important}.is-flex-shrink-1{flex-shrink:1 !important}.is-flex-shrink-2{flex-shrink:2 !important}.is-flex-shrink-3{flex-shrink:3 !important}.is-flex-shrink-4{flex-shrink:4 !important}.is-flex-shrink-5{flex-shrink:5 !important}.is-clearfix::after{clear:both;content:" ";display:table}.is-pulled-left{float:left !important}.is-pulled-right{float:right !important}.is-radiusless{border-radius:0 !important}.is-shadowless{box-shadow:none !important}.is-clickable{cursor:pointer !important;pointer-events:all !important}.is-clipped{overflow:hidden !important}.is-relative{position:relative !important}.is-marginless{margin:0 !important}.is-paddingless{padding:0 !important}.m-0{margin:0 !important}.mt-0{margin-top:0 !important}.mr-0{margin-right:0 !important}.mb-0{margin-bottom:0 !important}.ml-0{margin-left:0 !important}.mx-0{margin-left:0 !important;margin-right:0 !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.m-1{margin:.25rem !important}.mt-1{margin-top:.25rem !important}.mr-1{margin-right:.25rem !important}.mb-1{margin-bottom:.25rem !important}.ml-1{margin-left:.25rem !important}.mx-1{margin-left:.25rem !important;margin-right:.25rem !important}.my-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.m-2{margin:.5rem !important}.mt-2{margin-top:.5rem !important}.mr-2{margin-right:.5rem !important}.mb-2{margin-bottom:.5rem !important}.ml-2{margin-left:.5rem !important}.mx-2{margin-left:.5rem !important;margin-right:.5rem !important}.my-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.m-3{margin:.75rem !important}.mt-3{margin-top:.75rem !important}.mr-3{margin-right:.75rem !important}.mb-3{margin-bottom:.75rem !important}.ml-3{margin-left:.75rem !important}.mx-3{margin-left:.75rem !important;margin-right:.75rem !important}.my-3{margin-top:.75rem !important;margin-bottom:.75rem !important}.m-4{margin:1rem !important}.mt-4{margin-top:1rem !important}.mr-4{margin-right:1rem !important}.mb-4{margin-bottom:1rem !important}.ml-4{margin-left:1rem !important}.mx-4{margin-left:1rem !important;margin-right:1rem !important}.my-4{margin-top:1rem !important;margin-bottom:1rem !important}.m-5{margin:1.5rem !important}.mt-5{margin-top:1.5rem !important}.mr-5{margin-right:1.5rem !important}.mb-5{margin-bottom:1.5rem !important}.ml-5{margin-left:1.5rem !important}.mx-5{margin-left:1.5rem !important;margin-right:1.5rem !important}.my-5{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.m-6{margin:3rem !important}.mt-6{margin-top:3rem !important}.mr-6{margin-right:3rem !important}.mb-6{margin-bottom:3rem !important}.ml-6{margin-left:3rem !important}.mx-6{margin-left:3rem !important;margin-right:3rem !important}.my-6{margin-top:3rem !important;margin-bottom:3rem !important}.m-auto{margin:auto !important}.mt-auto{margin-top:auto !important}.mr-auto{margin-right:auto !important}.mb-auto{margin-bottom:auto !important}.ml-auto{margin-left:auto !important}.mx-auto{margin-left:auto !important;margin-right:auto !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}.p-0{padding:0 !important}.pt-0{padding-top:0 !important}.pr-0{padding-right:0 !important}.pb-0{padding-bottom:0 !important}.pl-0{padding-left:0 !important}.px-0{padding-left:0 !important;padding-right:0 !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.p-1{padding:.25rem !important}.pt-1{padding-top:.25rem !important}.pr-1{padding-right:.25rem !important}.pb-1{padding-bottom:.25rem !important}.pl-1{padding-left:.25rem !important}.px-1{padding-left:.25rem !important;padding-right:.25rem !important}.py-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.p-2{padding:.5rem !important}.pt-2{padding-top:.5rem !important}.pr-2{padding-right:.5rem !important}.pb-2{padding-bottom:.5rem !important}.pl-2{padding-left:.5rem !important}.px-2{padding-left:.5rem !important;padding-right:.5rem !important}.py-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.p-3{padding:.75rem !important}.pt-3{padding-top:.75rem !important}.pr-3{padding-right:.75rem !important}.pb-3{padding-bottom:.75rem !important}.pl-3{padding-left:.75rem !important}.px-3{padding-left:.75rem !important;padding-right:.75rem !important}.py-3{padding-top:.75rem !important;padding-bottom:.75rem !important}.p-4{padding:1rem !important}.pt-4{padding-top:1rem !important}.pr-4{padding-right:1rem !important}.pb-4{padding-bottom:1rem !important}.pl-4{padding-left:1rem !important}.px-4{padding-left:1rem !important;padding-right:1rem !important}.py-4{padding-top:1rem !important;padding-bottom:1rem !important}.p-5{padding:1.5rem !important}.pt-5{padding-top:1.5rem !important}.pr-5{padding-right:1.5rem !important}.pb-5{padding-bottom:1.5rem !important}.pl-5{padding-left:1.5rem !important}.px-5{padding-left:1.5rem !important;padding-right:1.5rem !important}.py-5{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.p-6{padding:3rem !important}.pt-6{padding-top:3rem !important}.pr-6{padding-right:3rem !important}.pb-6{padding-bottom:3rem !important}.pl-6{padding-left:3rem !important}.px-6{padding-left:3rem !important;padding-right:3rem !important}.py-6{padding-top:3rem !important;padding-bottom:3rem !important}.p-auto{padding:auto !important}.pt-auto{padding-top:auto !important}.pr-auto{padding-right:auto !important}.pb-auto{padding-bottom:auto !important}.pl-auto{padding-left:auto !important}.px-auto{padding-left:auto !important;padding-right:auto !important}.py-auto{padding-top:auto !important;padding-bottom:auto !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,html.theme--documenter-dark .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}.is-underlined{text-decoration:underline !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}}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 +*/}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 optgroup,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:inherit}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 0.5em 1em -0.125em 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.5em - 1px);padding-left:1em;padding-right:1em;padding-top:calc(0.5em - 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.5em - 1px);margin-right:.25em}html.theme--documenter-dark .button .icon:last-child:not(:first-child){margin-left:.25em;margin-right:calc(-0.5em - 1px)}html.theme--documenter-dark .button .icon:first-child:last-child{margin-left:calc(-0.5em - 1px);margin-right:calc(-0.5em - 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-ghost{background:none;border-color:rgba(0,0,0,0);color:#1abc9c;text-decoration:none}html.theme--documenter-dark .button.is-ghost:hover,html.theme--documenter-dark .button.is-ghost.is-hovered{color:#1abc9c;text-decoration:underline}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:#fff;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:#0a0a0a;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:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light:hover,html.theme--documenter-dark .button.is-light.is-hovered{background-color:#e5eaec;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light:focus,html.theme--documenter-dark .button.is-light.is-focused{border-color:transparent;color:rgba(0,0,0,0.7)}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:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light{background-color:#ecf0f1;border-color:#ecf0f1;box-shadow:none}html.theme--documenter-dark .button.is-light.is-inverted{background-color:rgba(0,0,0,0.7);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:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light.is-inverted{background-color:rgba(0,0,0,0.7);border-color:transparent;box-shadow:none;color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-loading::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !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:rgba(0,0,0,0.7)}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 rgba(0,0,0,0.7) rgba(0,0,0,0.7) !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:rgba(0,0,0,0.7);color:rgba(0,0,0,0.7)}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:rgba(0,0,0,0.7);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:rgba(0,0,0,0.7);box-shadow:none;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-dark,html.theme--documenter-dark .content kbd.button{background-color:#282f2f;border-color:transparent;color:#fff}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:#fff}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:#fff}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:#fff}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:#282f2f;box-shadow:none}html.theme--documenter-dark .button.is-dark.is-inverted,html.theme--documenter-dark .content kbd.button.is-inverted{background-color:#fff;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:#f2f2f2}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:#fff;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 #fff #fff !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:#fff}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 #fff #fff !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:#fff;color:#fff}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:#fff;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:#fff;box-shadow:none;color:#fff}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:#375a7f;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-primary.is-light,html.theme--documenter-dark .docstring>section>a.button.is-light.docs-sourcelink{background-color:#f1f5f9;color:#4d7eb2}html.theme--documenter-dark .button.is-primary.is-light:hover,html.theme--documenter-dark .docstring>section>a.button.is-light.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-light.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-light.is-hovered.docs-sourcelink{background-color:#e8eef5;border-color:transparent;color:#4d7eb2}html.theme--documenter-dark .button.is-primary.is-light:active,html.theme--documenter-dark .docstring>section>a.button.is-light.docs-sourcelink:active,html.theme--documenter-dark .button.is-primary.is-light.is-active,html.theme--documenter-dark .docstring>section>a.button.is-light.is-active.docs-sourcelink{background-color:#dfe8f1;border-color:transparent;color:#4d7eb2}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:#1abc9c;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-link.is-light{background-color:#edfdf9;color:#15987e}html.theme--documenter-dark .button.is-link.is-light:hover,html.theme--documenter-dark .button.is-link.is-light.is-hovered{background-color:#e2fbf6;border-color:transparent;color:#15987e}html.theme--documenter-dark .button.is-link.is-light:active,html.theme--documenter-dark .button.is-link.is-light.is-active{background-color:#d7f9f3;border-color:transparent;color:#15987e}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:#024c7d;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-info.is-light{background-color:#ebf7ff;color:#0e9dfb}html.theme--documenter-dark .button.is-info.is-light:hover,html.theme--documenter-dark .button.is-info.is-light.is-hovered{background-color:#def2fe;border-color:transparent;color:#0e9dfb}html.theme--documenter-dark .button.is-info.is-light:active,html.theme--documenter-dark .button.is-info.is-light.is-active{background-color:#d2edfe;border-color:transparent;color:#0e9dfb}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:#008438;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-success.is-light{background-color:#ebfff3;color:#00eb64}html.theme--documenter-dark .button.is-success.is-light:hover,html.theme--documenter-dark .button.is-success.is-light.is-hovered{background-color:#deffec;border-color:transparent;color:#00eb64}html.theme--documenter-dark .button.is-success.is-light:active,html.theme--documenter-dark .button.is-success.is-light.is-active{background-color:#d1ffe5;border-color:transparent;color:#00eb64}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:#ad8100;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-warning.is-light{background-color:#fffaeb;color:#d19c00}html.theme--documenter-dark .button.is-warning.is-light:hover,html.theme--documenter-dark .button.is-warning.is-light.is-hovered{background-color:#fff7de;border-color:transparent;color:#d19c00}html.theme--documenter-dark .button.is-warning.is-light:active,html.theme--documenter-dark .button.is-warning.is-light.is-active{background-color:#fff3d1;border-color:transparent;color:#d19c00}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:#9e1b0d;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-danger.is-light{background-color:#fdeeec;color:#ec311d}html.theme--documenter-dark .button.is-danger.is-light:hover,html.theme--documenter-dark .button.is-danger.is-light.is-hovered{background-color:#fce3e0;border-color:transparent;color:#ec311d}html.theme--documenter-dark .button.is-danger.is-light:active,html.theme--documenter-dark .button.is-danger.is-light.is-active{background-color:#fcd8d5;border-color:transparent;color:#ec311d}html.theme--documenter-dark .button.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.button{font-size:.75rem}html.theme--documenter-dark .button.is-small:not(.is-rounded),html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.button:not(.is-rounded){border-radius:3px}html.theme--documenter-dark .button.is-normal{font-size:1rem}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:#5e6d6f;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 * 0.5));top:calc(50% - (1em * 0.5));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:9999px;padding-left:calc(1em + 0.25em);padding-right:calc(1em + 0.25em)}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:.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){font-size:.75rem}html.theme--documenter-dark .buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large):not(.is-rounded){border-radius:3px}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}@media screen and (max-width: 768px){html.theme--documenter-dark .button.is-responsive.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-responsive{font-size:.5625rem}html.theme--documenter-dark .button.is-responsive,html.theme--documenter-dark .button.is-responsive.is-normal{font-size:.65625rem}html.theme--documenter-dark .button.is-responsive.is-medium{font-size:.75rem}html.theme--documenter-dark .button.is-responsive.is-large{font-size:1rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .button.is-responsive.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-responsive{font-size:.65625rem}html.theme--documenter-dark .button.is-responsive,html.theme--documenter-dark .button.is-responsive.is-normal{font-size:.75rem}html.theme--documenter-dark .button.is-responsive.is-medium{font-size:1rem}html.theme--documenter-dark .button.is-responsive.is-large{font-size:1.25rem}}html.theme--documenter-dark .container{flex-grow:1;margin:0 auto;position:relative;width:auto}html.theme--documenter-dark .container.is-fluid{max-width:none !important;padding-left:32px;padding-right:32px;width:100%}@media screen and (min-width: 1056px){html.theme--documenter-dark .container{max-width:992px}}@media screen and (max-width: 1215px){html.theme--documenter-dark .container.is-widescreen:not(.is-max-desktop){max-width:1152px}}@media screen and (max-width: 1407px){html.theme--documenter-dark .container.is-fullhd:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}@media screen and (min-width: 1216px){html.theme--documenter-dark .container:not(.is-max-desktop){max-width:1152px}}@media screen and (min-width: 1408px){html.theme--documenter-dark .container:not(.is-max-desktop):not(.is-max-widescreen){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:inherit}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:.75rem}html.theme--documenter-dark .content.is-normal{font-size:1rem}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 .icon-text{align-items:flex-start;color:inherit;display:inline-flex;flex-wrap:wrap;line-height:1.5rem;vertical-align:top}html.theme--documenter-dark .icon-text .icon{flex-grow:0;flex-shrink:0}html.theme--documenter-dark .icon-text .icon:not(:last-child){margin-right:.25em}html.theme--documenter-dark .icon-text .icon:not(:first-child){margin-left:.25em}html.theme--documenter-dark div.icon-text{display:flex}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:9999px}html.theme--documenter-dark .image.is-fullwidth,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-fullwidth{width:100%}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;position:relative;padding:1.25rem 2.5rem 1.25rem 1.5rem}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{right:.5rem;position:absolute;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:rgba(0,0,0,0.7)}html.theme--documenter-dark .notification.is-dark,html.theme--documenter-dark .content kbd.notification{background-color:#282f2f;color:#fff}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-primary.is-light,html.theme--documenter-dark .docstring>section>a.notification.is-light.docs-sourcelink{background-color:#f1f5f9;color:#4d7eb2}html.theme--documenter-dark .notification.is-link{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .notification.is-link.is-light{background-color:#edfdf9;color:#15987e}html.theme--documenter-dark .notification.is-info{background-color:#024c7d;color:#fff}html.theme--documenter-dark .notification.is-info.is-light{background-color:#ebf7ff;color:#0e9dfb}html.theme--documenter-dark .notification.is-success{background-color:#008438;color:#fff}html.theme--documenter-dark .notification.is-success.is-light{background-color:#ebfff3;color:#00eb64}html.theme--documenter-dark .notification.is-warning{background-color:#ad8100;color:#fff}html.theme--documenter-dark .notification.is-warning.is-light{background-color:#fffaeb;color:#d19c00}html.theme--documenter-dark .notification.is-danger{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .notification.is-danger.is-light{background-color:#fdeeec;color:#ec311d}html.theme--documenter-dark .progress{-moz-appearance:none;-webkit-appearance:none;border:none;border-radius:9999px;display:block;height:1rem;overflow:hidden;padding:0;width:100%}html.theme--documenter-dark .progress::-webkit-progress-bar{background-color:#343c3d}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%, #343c3d 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%, #343c3d 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%, #343c3d 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%, #343c3d 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%, #343c3d 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%, #343c3d 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%, #343c3d 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%, #343c3d 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%, #343c3d 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%, #343c3d 30%)}html.theme--documenter-dark .progress:indeterminate{animation-duration:1.5s;animation-iteration-count:infinite;animation-name:moveIndeterminate;animation-timing-function:linear;background-color:#343c3d;background-image:linear-gradient(to right, #fff 30%, #343c3d 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:indeterminate::-ms-fill{animation-name:none}html.theme--documenter-dark .progress.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.progress{height:.75rem}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:rgba(0,0,0,0.7)}html.theme--documenter-dark .table td.is-dark,html.theme--documenter-dark .table th.is-dark{background-color:#282f2f;border-color:#282f2f;color:#fff}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 td.is-vcentered,html.theme--documenter-dark .table th.is-vcentered{vertical-align:middle}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:.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:1rem}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-top-left-radius:0;border-bottom-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-top-right-radius:0;border-bottom-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:.75rem;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:.25rem;margin-right:-.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:rgba(0,0,0,0.7)}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:#fff}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-primary.is-light:not(body),html.theme--documenter-dark .content kbd.is-primary.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-light:not(body){background-color:#f1f5f9;color:#4d7eb2}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-link.is-light:not(body),html.theme--documenter-dark .content kbd.is-link.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-link.is-light:not(body){background-color:#edfdf9;color:#15987e}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-info.is-light:not(body),html.theme--documenter-dark .content kbd.is-info.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-info.is-light:not(body){background-color:#ebf7ff;color:#0e9dfb}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-success.is-light:not(body),html.theme--documenter-dark .content kbd.is-success.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-success.is-light:not(body){background-color:#ebfff3;color:#00eb64}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-warning.is-light:not(body),html.theme--documenter-dark .content kbd.is-warning.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-warning.is-light:not(body){background-color:#fffaeb;color:#d19c00}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-danger.is-light:not(body),html.theme--documenter-dark .content kbd.is-danger.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-danger.is-light:not(body){background-color:#fdeeec;color:#ec311d}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:.75rem}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:1rem}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:-.375em;margin-right:.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:.1875em;margin-right:-.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:-.375em;margin-right:-.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:9999px}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: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:1rem}html.theme--documenter-dark .title.is-7{font-size:.75rem}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:1rem}html.theme--documenter-dark .subtitle.is-7{font-size:.75rem}html.theme--documenter-dark .heading{display:block;font-size:11px;letter-spacing:1px;margin-bottom:5px;text-transform:uppercase}html.theme--documenter-dark .number{align-items:center;background-color:#282f2f;border-radius:9999px;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:#868c98}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:#868c98}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:#868c98}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:#868c98}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 0.0625em 0.125em rgba(10,10,10,0.05);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:.75rem}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:9999px;padding-left:calc(calc(0.75em - 1px) + 0.375em);padding-right:calc(calc(0.75em - 1px) + 0.375em)}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:calc(0.75em - 1px);resize:vertical}html.theme--documenter-dark .textarea:not([rows]){max-height:40em;min-height:8em}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,html.theme--documenter-dark .radio input[disabled],html.theme--documenter-dark .checkbox input[disabled]{color:#fff;cursor:not-allowed}html.theme--documenter-dark .radio+.radio{margin-left:.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.5em}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:9999px;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:.75rem}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 !important;opacity:0.5}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:.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:.75rem}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:rgba(0,0,0,0.7)}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:rgba(0,0,0,0.7)}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:rgba(0,0,0,0.7)}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:rgba(0,0,0,0.7)}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:#fff}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:#fff}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:#fff}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:#fff}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:.75rem}html.theme--documenter-dark .file.is-normal{font-size:1rem}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:#232829;color:#f2f2f2}html.theme--documenter-dark .file-label:hover .file-name{border-color:#596668}html.theme--documenter-dark .file-label:active .file-cta{background-color:#1d2122;color:#f2f2f2}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:#282f2f;color:#fff}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:inherit;text-overflow:ellipsis}html.theme--documenter-dark .file-icon{align-items:center;display:flex;height:1em;justify-content:center;margin-right:.5em;width:1em}html.theme--documenter-dark .file-icon .fa{font-size:14px}html.theme--documenter-dark .label{color:#f2f2f2;display:block;font-size:1rem;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:.75rem}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:.75rem;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:.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:.75rem;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:.75rem}}html.theme--documenter-dark .control{box-sizing:border-box;clear:both;font-size:1rem;position:relative;text-align:inherit}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:#282f2f}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:.75rem}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:#5e6d6f;height:2.5em;pointer-events:none;position:absolute;top:0;width:2.5em;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.5em}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.5em}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:.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:.75rem}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:1rem;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:.5em}html.theme--documenter-dark .breadcrumb .icon:last-child{margin-left:.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:.75rem}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;border-radius:.25rem;box-shadow:#171717;color:#fff;max-width:100%;position:relative}html.theme--documenter-dark .card-footer:first-child,html.theme--documenter-dark .card-content:first-child,html.theme--documenter-dark .card-header:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}html.theme--documenter-dark .card-footer:last-child,html.theme--documenter-dark .card-content:last-child,html.theme--documenter-dark .card-header:last-child{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}html.theme--documenter-dark .card-header{background-color:rgba(0,0,0,0);align-items:stretch;box-shadow:0 0.125em 0.25em 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 1rem}html.theme--documenter-dark .card-header-title.is-centered{justify-content:center}html.theme--documenter-dark .card-header-icon{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0;align-items:center;cursor:pointer;display:flex;justify-content:center;padding:0.75rem 1rem}html.theme--documenter-dark .card-image{display:block;position:relative}html.theme--documenter-dark .card-image:first-child img{border-top-left-radius:.25rem;border-top-right-radius:.25rem}html.theme--documenter-dark .card-image:last-child img{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}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 #ededed;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 #ededed}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:#171717;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:inherit;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:#ededed;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 .media{align-items:flex-start;display:flex;text-align:inherit}html.theme--documenter-dark .media .content:not(:last-child){margin-bottom:.75rem}html.theme--documenter-dark .media .media{border-top:1px solid rgba(94,109,111,0.5);display:flex;padding-top:.75rem}html.theme--documenter-dark .media .media .content:not(:last-child),html.theme--documenter-dark .media .media .control:not(:last-child){margin-bottom:.5rem}html.theme--documenter-dark .media .media .media{padding-top:.5rem}html.theme--documenter-dark .media .media .media+.media{margin-top:.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:inherit}@media screen and (max-width: 768px){html.theme--documenter-dark .media-content{overflow-x:auto}}html.theme--documenter-dark .menu{font-size:1rem}html.theme--documenter-dark .menu.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.menu{font-size:.75rem}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:1rem}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:.75rem}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}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}html.theme--documenter-dark .message.is-light{background-color:#f9fafb}html.theme--documenter-dark .message.is-light .message-header{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .message.is-light .message-body{border-color:#ecf0f1}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:#fff}html.theme--documenter-dark .message.is-dark .message-body,html.theme--documenter-dark .content kbd.message .message-body{border-color:#282f2f}html.theme--documenter-dark .message.is-primary,html.theme--documenter-dark .docstring>section>a.message.docs-sourcelink{background-color:#f1f5f9}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:#4d7eb2}html.theme--documenter-dark .message.is-link{background-color:#edfdf9}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:#15987e}html.theme--documenter-dark .message.is-info{background-color:#ebf7ff}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:#0e9dfb}html.theme--documenter-dark .message.is-success{background-color:#ebfff3}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:#00eb64}html.theme--documenter-dark .message.is-warning{background-color:#fffaeb}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:#d19c00}html.theme--documenter-dark .message.is-danger{background-color:#fdeeec}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:#ec311d}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:.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){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:.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:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link{color:rgba(0,0,0,0.7)}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:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-burger{color:rgba(0,0,0,0.7)}@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:rgba(0,0,0,0.7)}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:rgba(0,0,0,0.7)}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:rgba(0,0,0,0.7)}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:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-dropdown a.navbar-item.is-active{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}}html.theme--documenter-dark .navbar.is-dark,html.theme--documenter-dark .content kbd.navbar{background-color:#282f2f;color:#fff}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:#fff}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:#fff}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:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-burger,html.theme--documenter-dark .content kbd.navbar .navbar-burger{color:#fff}@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:#fff}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:#fff}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:#fff}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:#fff}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:#fff}}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;-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;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{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.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:1rem;margin:-.25rem}html.theme--documenter-dark .pagination.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination{font-size:.75rem}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:9999px}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:9999px}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.5em}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-previous.is-disabled,html.theme--documenter-dark .pagination-next[disabled],html.theme--documenter-dark .pagination-next.is-disabled,html.theme--documenter-dark .pagination-link[disabled],html.theme--documenter-dark .pagination-link.is-disabled{background-color:#5e6d6f;border-color:#5e6d6f;box-shadow:none;color:#fff;opacity:0.5}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next{padding-left:.75em;padding-right:.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}html.theme--documenter-dark .pagination-list li{list-style:none}@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,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis{margin-bottom:0;margin-top:0}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;margin-bottom:0;margin-top:0}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{border-radius:8px;box-shadow:#171717;font-size:1rem}html.theme--documenter-dark .panel:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .panel.is-white .panel-heading{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .panel.is-white .panel-tabs a.is-active{border-bottom-color:#fff}html.theme--documenter-dark .panel.is-white .panel-block.is-active .panel-icon{color:#fff}html.theme--documenter-dark .panel.is-black .panel-heading{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .panel.is-black .panel-tabs a.is-active{border-bottom-color:#0a0a0a}html.theme--documenter-dark .panel.is-black .panel-block.is-active .panel-icon{color:#0a0a0a}html.theme--documenter-dark .panel.is-light .panel-heading{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .panel.is-light .panel-tabs a.is-active{border-bottom-color:#ecf0f1}html.theme--documenter-dark .panel.is-light .panel-block.is-active .panel-icon{color:#ecf0f1}html.theme--documenter-dark .panel.is-dark .panel-heading,html.theme--documenter-dark .content kbd.panel .panel-heading{background-color:#282f2f;color:#fff}html.theme--documenter-dark .panel.is-dark .panel-tabs a.is-active,html.theme--documenter-dark .content kbd.panel .panel-tabs a.is-active{border-bottom-color:#282f2f}html.theme--documenter-dark .panel.is-dark .panel-block.is-active .panel-icon,html.theme--documenter-dark .content kbd.panel .panel-block.is-active .panel-icon{color:#282f2f}html.theme--documenter-dark .panel.is-primary .panel-heading,html.theme--documenter-dark .docstring>section>a.panel.docs-sourcelink .panel-heading{background-color:#375a7f;color:#fff}html.theme--documenter-dark .panel.is-primary .panel-tabs a.is-active,html.theme--documenter-dark .docstring>section>a.panel.docs-sourcelink .panel-tabs a.is-active{border-bottom-color:#375a7f}html.theme--documenter-dark .panel.is-primary .panel-block.is-active .panel-icon,html.theme--documenter-dark .docstring>section>a.panel.docs-sourcelink .panel-block.is-active .panel-icon{color:#375a7f}html.theme--documenter-dark .panel.is-link .panel-heading{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .panel.is-link .panel-tabs a.is-active{border-bottom-color:#1abc9c}html.theme--documenter-dark .panel.is-link .panel-block.is-active .panel-icon{color:#1abc9c}html.theme--documenter-dark .panel.is-info .panel-heading{background-color:#024c7d;color:#fff}html.theme--documenter-dark .panel.is-info .panel-tabs a.is-active{border-bottom-color:#024c7d}html.theme--documenter-dark .panel.is-info .panel-block.is-active .panel-icon{color:#024c7d}html.theme--documenter-dark .panel.is-success .panel-heading{background-color:#008438;color:#fff}html.theme--documenter-dark .panel.is-success .panel-tabs a.is-active{border-bottom-color:#008438}html.theme--documenter-dark .panel.is-success .panel-block.is-active .panel-icon{color:#008438}html.theme--documenter-dark .panel.is-warning .panel-heading{background-color:#ad8100;color:#fff}html.theme--documenter-dark .panel.is-warning .panel-tabs a.is-active{border-bottom-color:#ad8100}html.theme--documenter-dark .panel.is-warning .panel-block.is-active .panel-icon{color:#ad8100}html.theme--documenter-dark .panel.is-danger .panel-heading{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .panel.is-danger .panel-tabs a.is-active{border-bottom-color:#9e1b0d}html.theme--documenter-dark .panel.is-danger .panel-block.is-active .panel-icon{color:#9e1b0d}html.theme--documenter-dark .panel-tabs:not(:last-child),html.theme--documenter-dark .panel-block:not(:last-child){border-bottom:1px solid #ededed}html.theme--documenter-dark .panel-heading{background-color:#343c3d;border-radius:8px 8px 0 0;color:#f2f2f2;font-size:1.25em;font-weight:700;line-height:1.25;padding:0.75em 1em}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:.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 .panel-block:last-child{border-bottom-left-radius:8px;border-bottom-right-radius:8px}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:.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:1rem;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:.5em}html.theme--documenter-dark .tabs .icon:last-child{margin-left:.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-top-left-radius:.4em;border-bottom-left-radius:.4em}html.theme--documenter-dark .tabs.is-toggle li:last-child a{border-top-right-radius:.4em;border-bottom-right-radius:.4em}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:9999px;border-top-left-radius:9999px;padding-left:1.25em}html.theme--documenter-dark .tabs.is-toggle.is-toggle-rounded li:last-child a{border-bottom-right-radius:9999px;border-top-right-radius:9999px;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:.75rem}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;width:unset}.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.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-1{margin-left:8.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-2{flex:none;width:16.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-2{margin-left:16.66666674%}.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.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-4{margin-left:33.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-5{flex:none;width:41.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-5{margin-left:41.66666674%}.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.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-7{margin-left:58.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-8{flex:none;width:66.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-8{margin-left:66.66666674%}.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.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-10{margin-left:83.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-11{flex:none;width:91.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-11{margin-left:91.66666674%}.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;width:unset}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.33333337%}html.theme--documenter-dark .column.is-offset-1-mobile{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-mobile{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-mobile{margin-left:16.66666674%}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.33333337%}html.theme--documenter-dark .column.is-offset-4-mobile{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-mobile{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-mobile{margin-left:41.66666674%}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.33333337%}html.theme--documenter-dark .column.is-offset-7-mobile{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-mobile{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-mobile{margin-left:66.66666674%}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.33333337%}html.theme--documenter-dark .column.is-offset-10-mobile{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-mobile{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-mobile{margin-left:91.66666674%}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;width:unset}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.33333337%}html.theme--documenter-dark .column.is-offset-1,html.theme--documenter-dark .column.is-offset-1-tablet{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2,html.theme--documenter-dark .column.is-2-tablet{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2,html.theme--documenter-dark .column.is-offset-2-tablet{margin-left:16.66666674%}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.33333337%}html.theme--documenter-dark .column.is-offset-4,html.theme--documenter-dark .column.is-offset-4-tablet{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5,html.theme--documenter-dark .column.is-5-tablet{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5,html.theme--documenter-dark .column.is-offset-5-tablet{margin-left:41.66666674%}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.33333337%}html.theme--documenter-dark .column.is-offset-7,html.theme--documenter-dark .column.is-offset-7-tablet{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8,html.theme--documenter-dark .column.is-8-tablet{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8,html.theme--documenter-dark .column.is-offset-8-tablet{margin-left:66.66666674%}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.33333337%}html.theme--documenter-dark .column.is-offset-10,html.theme--documenter-dark .column.is-offset-10-tablet{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11,html.theme--documenter-dark .column.is-11-tablet{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11,html.theme--documenter-dark .column.is-offset-11-tablet{margin-left:91.66666674%}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;width:unset}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.33333337%}html.theme--documenter-dark .column.is-offset-1-touch{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-touch{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-touch{margin-left:16.66666674%}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.33333337%}html.theme--documenter-dark .column.is-offset-4-touch{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-touch{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-touch{margin-left:41.66666674%}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.33333337%}html.theme--documenter-dark .column.is-offset-7-touch{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-touch{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-touch{margin-left:66.66666674%}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.33333337%}html.theme--documenter-dark .column.is-offset-10-touch{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-touch{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-touch{margin-left:91.66666674%}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;width:unset}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.33333337%}html.theme--documenter-dark .column.is-offset-1-desktop{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-desktop{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-desktop{margin-left:16.66666674%}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.33333337%}html.theme--documenter-dark .column.is-offset-4-desktop{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-desktop{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-desktop{margin-left:41.66666674%}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.33333337%}html.theme--documenter-dark .column.is-offset-7-desktop{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-desktop{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-desktop{margin-left:66.66666674%}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.33333337%}html.theme--documenter-dark .column.is-offset-10-desktop{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-desktop{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-desktop{margin-left:91.66666674%}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;width:unset}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.33333337%}html.theme--documenter-dark .column.is-offset-1-widescreen{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-widescreen{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-widescreen{margin-left:16.66666674%}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.33333337%}html.theme--documenter-dark .column.is-offset-4-widescreen{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-widescreen{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-widescreen{margin-left:41.66666674%}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.33333337%}html.theme--documenter-dark .column.is-offset-7-widescreen{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-widescreen{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-widescreen{margin-left:66.66666674%}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.33333337%}html.theme--documenter-dark .column.is-offset-10-widescreen{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-widescreen{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-widescreen{margin-left:91.66666674%}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;width:unset}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.33333337%}html.theme--documenter-dark .column.is-offset-1-fullhd{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-fullhd{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-fullhd{margin-left:16.66666674%}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.33333337%}html.theme--documenter-dark .column.is-offset-4-fullhd{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-fullhd{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-fullhd{margin-left:41.66666674%}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.33333337%}html.theme--documenter-dark .column.is-offset-7-fullhd{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-fullhd{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-fullhd{margin-left:66.66666674%}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.33333337%}html.theme--documenter-dark .column.is-offset-10-fullhd{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-fullhd{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-fullhd{margin-left:91.66666674%}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.33333337%}html.theme--documenter-dark .tile.is-2{flex:none;width:16.66666674%}html.theme--documenter-dark .tile.is-3{flex:none;width:25%}html.theme--documenter-dark .tile.is-4{flex:none;width:33.33333337%}html.theme--documenter-dark .tile.is-5{flex:none;width:41.66666674%}html.theme--documenter-dark .tile.is-6{flex:none;width:50%}html.theme--documenter-dark .tile.is-7{flex:none;width:58.33333337%}html.theme--documenter-dark .tile.is-8{flex:none;width:66.66666674%}html.theme--documenter-dark .tile.is-9{flex:none;width:75%}html.theme--documenter-dark .tile.is-10{flex:none;width:83.33333337%}html.theme--documenter-dark .tile.is-11{flex:none;width:91.66666674%}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{color:#fff !important;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{color:#0a0a0a !important;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:rgba(0,0,0,0.7)}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:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light .subtitle{color:rgba(0,0,0,0.9)}html.theme--documenter-dark .hero.is-light .subtitle a:not(.button),html.theme--documenter-dark .hero.is-light .subtitle strong{color:rgba(0,0,0,0.7)}@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(0,0,0,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:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light .tabs a{color:rgba(0,0,0,0.7);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{color:#ecf0f1 !important;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:rgba(0,0,0,0.7)}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:rgba(0,0,0,0.7);border-color:rgba(0,0,0,0.7);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:#fff}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:#fff}html.theme--documenter-dark .hero.is-dark .subtitle,html.theme--documenter-dark .content kbd.hero .subtitle{color:rgba(255,255,255,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:#fff}@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(255,255,255,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:#fff}html.theme--documenter-dark .hero.is-dark .tabs a,html.theme--documenter-dark .content kbd.hero .tabs a{color:#fff;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{color:#282f2f !important;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:#fff}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:#fff;border-color:#fff;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{color:#375a7f !important;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{color:#1abc9c !important;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{color:#024c7d !important;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{color:#008438 !important;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{color:#ad8100 !important;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{color:#9e1b0d !important;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:1.5rem}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero.is-medium .hero-body{padding:9rem 4.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero.is-large .hero-body{padding:18rem 6rem}}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}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero-body{padding:3rem 3rem}}html.theme--documenter-dark .section{padding:3rem 1.5rem}@media screen and (min-width: 1056px){html.theme--documenter-dark .section{padding:3rem 3rem}html.theme--documenter-dark .section.is-medium{padding:9rem 4.5rem}html.theme--documenter-dark .section.is-large{padding:18rem 6rem}}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:rgba(0,0,0,0.7);text-decoration:underline}html.theme--documenter-dark .notification.is-dark a:not(.button),html.theme--documenter-dark .content kbd.notification a:not(.button){color:#fff;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 6 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 6 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:1rem}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:.75rem}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 6 Free";font-weight:900;margin-right:.75rem;content:"\f06a"}html.theme--documenter-dark details.admonition.is-details>.admonition-header{list-style:none}html.theme--documenter-dark details.admonition.is-details>.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f055"}html.theme--documenter-dark details.admonition.is-details[open]>.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f056"}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{cursor:pointer;display:flex;flex-grow:1;align-items:stretch;padding:0.5rem .75rem;background-color:#282f2f;box-shadow:0 0.125em 0.25em rgba(10,10,10,0.1);box-shadow:none;border-bottom:1px solid #5e6d6f;overflow:auto}html.theme--documenter-dark .docstring>header code{background-color:transparent}html.theme--documenter-dark .docstring>header .docstring-article-toggle-button{min-width:1.1rem;padding:0.2rem 0.2rem 0.2rem 0}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;overflow-x:hidden}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-sidebar-button{display:block;font-size:1.5rem;padding-bottom:0.1rem;margin-right:1rem}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right{display:flex;white-space:nowrap;gap:1rem;align-items:center}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{display:inline-block}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-label{padding:0;margin-left:0.3em}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-navbar-link{margin-left:0.4rem;margin-right:0.4rem}}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:1rem;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:.95rem;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:.75rem;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 6 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:.85rem;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}html.theme--documenter-dark #documenter .docs-sidebar #documenter-search-query{color:#868c98;width:14.4rem;box-shadow:inset 0 1px 2px rgba(10,10,10,0.1)}@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 kbd.search-modal-key-hints{border-radius:0.25rem;border:1px solid rgba(245,245,245,0.6);box-shadow:0 2px 0 1px rgba(245,245,245,0.6);cursor:default;font-size:0.9rem;line-height:1.5;min-width:0.75rem;text-align:center;padding:0.1rem 0.3rem;position:relative;top:-1px}html.theme--documenter-dark .search-min-width-50{min-width:50%}html.theme--documenter-dark .search-min-height-100{min-height:100%}html.theme--documenter-dark .search-modal-card-body{max-height:calc(100vh - 15rem)}html.theme--documenter-dark .search-result-link{border-radius:0.7em;transition:all 300ms}html.theme--documenter-dark .search-result-link:hover,html.theme--documenter-dark .search-result-link:focus{background-color:rgba(0,128,128,0.1)}html.theme--documenter-dark .search-result-link .property-search-result-badge,html.theme--documenter-dark .search-result-link .search-filter{transition:all 300ms}html.theme--documenter-dark .property-search-result-badge,html.theme--documenter-dark .search-filter{padding:0.15em 0.5em;font-size:0.8em;font-style:italic;text-transform:none !important;line-height:1.5;color:#f5f5f5;background-color:rgba(51,65,85,0.501961);border-radius:0.6rem}html.theme--documenter-dark .search-result-link:hover .property-search-result-badge,html.theme--documenter-dark .search-result-link:hover .search-filter,html.theme--documenter-dark .search-result-link:focus .property-search-result-badge,html.theme--documenter-dark .search-result-link:focus .search-filter{color:#333;background-color:#f1f5f9}html.theme--documenter-dark .search-filter{color:#333;background-color:#f5f5f5;transition:all 300ms}html.theme--documenter-dark .search-filter:hover,html.theme--documenter-dark .search-filter:focus{color:#333}html.theme--documenter-dark .search-filter-selected{color:#f5f5f5;background-color:rgba(139,0,139,0.5)}html.theme--documenter-dark .search-filter-selected:hover,html.theme--documenter-dark .search-filter-selected:focus{color:#f5f5f5}html.theme--documenter-dark .search-result-highlight{background-color:#ffdd57;color:black}html.theme--documenter-dark .search-divider{border-bottom:1px solid #5e6d6f}html.theme--documenter-dark .search-result-title{width:85%;color:#f5f5f5}html.theme--documenter-dark .search-result-code-title{font-size:0.875rem;font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace}html.theme--documenter-dark #search-modal .modal-card-body::-webkit-scrollbar,html.theme--documenter-dark #search-modal .filter-tabs::-webkit-scrollbar{height:10px;width:10px;background-color:transparent}html.theme--documenter-dark #search-modal .modal-card-body::-webkit-scrollbar-thumb,html.theme--documenter-dark #search-modal .filter-tabs::-webkit-scrollbar-thumb{background-color:gray;border-radius:1rem}html.theme--documenter-dark #search-modal .modal-card-body::-webkit-scrollbar-track,html.theme--documenter-dark #search-modal .filter-tabs::-webkit-scrollbar-track{-webkit-box-shadow:inset 0 0 6px rgba(0,0,0,0.6);background-color:transparent}html.theme--documenter-dark .w-100{width:100%}html.theme--documenter-dark .gap-2{gap:0.5rem}html.theme--documenter-dark .gap-4{gap:1rem}html.theme--documenter-dark .gap-8{gap:2rem}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 .search-result-link{border-radius:0.7em;transition:all 300ms}html.theme--documenter-dark .search-result-link:hover,html.theme--documenter-dark .search-result-link:focus{background-color:rgba(0,128,128,0.1)}html.theme--documenter-dark .search-result-link .property-search-result-badge,html.theme--documenter-dark .search-result-link .search-filter{transition:all 300ms}html.theme--documenter-dark .search-result-link:hover .property-search-result-badge,html.theme--documenter-dark .search-result-link:hover .search-filter,html.theme--documenter-dark .search-result-link:focus .property-search-result-badge,html.theme--documenter-dark .search-result-link:focus .search-filter{color:#333 !important;background-color:#f1f5f9 !important}html.theme--documenter-dark .property-search-result-badge,html.theme--documenter-dark .search-filter{padding:0.15em 0.5em;font-size:0.8em;font-style:italic;text-transform:none !important;line-height:1.5;color:whitesmoke;background-color:#33415580;border-radius:0.6rem}html.theme--documenter-dark .search-result-title{color:whitesmoke}html.theme--documenter-dark .search-result-highlight{background-color:greenyellow;color:black}html.theme--documenter-dark .search-divider{border-bottom:1px solid #5e6d6f50}html.theme--documenter-dark .w-100{width:100%}html.theme--documenter-dark .gap-2{gap:0.5rem}html.theme--documenter-dark .gap-4{gap:1rem} diff --git a/v1.0.3/assets/themes/documenter-light.css b/v1.0.3/assets/themes/documenter-light.css new file mode 100644 index 00000000..2f168c77 --- /dev/null +++ b/v1.0.3/assets/themes/documenter-light.css @@ -0,0 +1,9 @@ +.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.5em;justify-content:flex-start;line-height:1.5;padding-bottom:calc(0.5em - 1px);padding-left:calc(0.75em - 1px);padding-right:calc(0.75em - 1px);padding-top:calc(0.5em - 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}.tabs,.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis,.breadcrumb,.file,.button,.is-unselectable{-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),.pagination:not(:last-child),.message:not(:last-child),.level:not(:last-child),.breadcrumb: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{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-moz-appearance:none;-webkit-appearance:none;background-color:rgba(10,10,10,0.2);border:none;border-radius:9999px;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:9999px;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}.navbar-burger{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0}.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-primary-light{color:#eef8fc !important}a.has-text-primary-light:hover,a.has-text-primary-light:focus{color:#c3e6f4 !important}.has-background-primary-light{background-color:#eef8fc !important}.has-text-primary-dark{color:#1a6d8e !important}a.has-text-primary-dark:hover,a.has-text-primary-dark:focus{color:#228eb9 !important}.has-background-primary-dark{background-color:#1a6d8e !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-link-light{color:#eff3fb !important}a.has-text-link-light:hover,a.has-text-link-light:focus{color:#c6d6f1 !important}.has-background-link-light{background-color:#eff3fb !important}.has-text-link-dark{color:#3169c4 !important}a.has-text-link-dark:hover,a.has-text-link-dark:focus{color:#5485d4 !important}.has-background-link-dark{background-color:#3169c4 !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-info-light{color:#ecf7fe !important}a.has-text-info-light:hover,a.has-text-info-light:focus{color:#bde2fa !important}.has-background-info-light{background-color:#ecf7fe !important}.has-text-info-dark{color:#0e72b4 !important}a.has-text-info-dark:hover,a.has-text-info-dark:focus{color:#1190e3 !important}.has-background-info-dark{background-color:#0e72b4 !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-success-light{color:#eefcf3 !important}a.has-text-success-light:hover,a.has-text-success-light:focus{color:#c2f4d4 !important}.has-background-success-light{background-color:#eefcf3 !important}.has-text-success-dark{color:#198f43 !important}a.has-text-success-dark:hover,a.has-text-success-dark:focus{color:#21bb57 !important}.has-background-success-dark{background-color:#198f43 !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-warning-light{color:#fffbeb !important}a.has-text-warning-light:hover,a.has-text-warning-light:focus{color:#fff1b8 !important}.has-background-warning-light{background-color:#fffbeb !important}.has-text-warning-dark{color:#947600 !important}a.has-text-warning-dark:hover,a.has-text-warning-dark:focus{color:#c79f00 !important}.has-background-warning-dark{background-color:#947600 !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-danger-light{color:#ffeceb !important}a.has-text-danger-light:hover,a.has-text-danger-light:focus{color:#ffbbb8 !important}.has-background-danger-light{background-color:#ffeceb !important}.has-text-danger-dark{color:#f50c00 !important}a.has-text-danger-dark:hover,a.has-text-danger-dark:focus{color:#ff3429 !important}.has-background-danger-dark{background-color:#f50c00 !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}.is-flex-direction-row{flex-direction:row !important}.is-flex-direction-row-reverse{flex-direction:row-reverse !important}.is-flex-direction-column{flex-direction:column !important}.is-flex-direction-column-reverse{flex-direction:column-reverse !important}.is-flex-wrap-nowrap{flex-wrap:nowrap !important}.is-flex-wrap-wrap{flex-wrap:wrap !important}.is-flex-wrap-wrap-reverse{flex-wrap:wrap-reverse !important}.is-justify-content-flex-start{justify-content:flex-start !important}.is-justify-content-flex-end{justify-content:flex-end !important}.is-justify-content-center{justify-content:center !important}.is-justify-content-space-between{justify-content:space-between !important}.is-justify-content-space-around{justify-content:space-around !important}.is-justify-content-space-evenly{justify-content:space-evenly !important}.is-justify-content-start{justify-content:start !important}.is-justify-content-end{justify-content:end !important}.is-justify-content-left{justify-content:left !important}.is-justify-content-right{justify-content:right !important}.is-align-content-flex-start{align-content:flex-start !important}.is-align-content-flex-end{align-content:flex-end !important}.is-align-content-center{align-content:center !important}.is-align-content-space-between{align-content:space-between !important}.is-align-content-space-around{align-content:space-around !important}.is-align-content-space-evenly{align-content:space-evenly !important}.is-align-content-stretch{align-content:stretch !important}.is-align-content-start{align-content:start !important}.is-align-content-end{align-content:end !important}.is-align-content-baseline{align-content:baseline !important}.is-align-items-stretch{align-items:stretch !important}.is-align-items-flex-start{align-items:flex-start !important}.is-align-items-flex-end{align-items:flex-end !important}.is-align-items-center{align-items:center !important}.is-align-items-baseline{align-items:baseline !important}.is-align-items-start{align-items:start !important}.is-align-items-end{align-items:end !important}.is-align-items-self-start{align-items:self-start !important}.is-align-items-self-end{align-items:self-end !important}.is-align-self-auto{align-self:auto !important}.is-align-self-flex-start{align-self:flex-start !important}.is-align-self-flex-end{align-self:flex-end !important}.is-align-self-center{align-self:center !important}.is-align-self-baseline{align-self:baseline !important}.is-align-self-stretch{align-self:stretch !important}.is-flex-grow-0{flex-grow:0 !important}.is-flex-grow-1{flex-grow:1 !important}.is-flex-grow-2{flex-grow:2 !important}.is-flex-grow-3{flex-grow:3 !important}.is-flex-grow-4{flex-grow:4 !important}.is-flex-grow-5{flex-grow:5 !important}.is-flex-shrink-0{flex-shrink:0 !important}.is-flex-shrink-1{flex-shrink:1 !important}.is-flex-shrink-2{flex-shrink:2 !important}.is-flex-shrink-3{flex-shrink:3 !important}.is-flex-shrink-4{flex-shrink:4 !important}.is-flex-shrink-5{flex-shrink:5 !important}.is-clearfix::after{clear:both;content:" ";display:table}.is-pulled-left{float:left !important}.is-pulled-right{float:right !important}.is-radiusless{border-radius:0 !important}.is-shadowless{box-shadow:none !important}.is-clickable{cursor:pointer !important;pointer-events:all !important}.is-clipped{overflow:hidden !important}.is-relative{position:relative !important}.is-marginless{margin:0 !important}.is-paddingless{padding:0 !important}.m-0{margin:0 !important}.mt-0{margin-top:0 !important}.mr-0{margin-right:0 !important}.mb-0{margin-bottom:0 !important}.ml-0{margin-left:0 !important}.mx-0{margin-left:0 !important;margin-right:0 !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.m-1{margin:.25rem !important}.mt-1{margin-top:.25rem !important}.mr-1{margin-right:.25rem !important}.mb-1{margin-bottom:.25rem !important}.ml-1{margin-left:.25rem !important}.mx-1{margin-left:.25rem !important;margin-right:.25rem !important}.my-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.m-2{margin:.5rem !important}.mt-2{margin-top:.5rem !important}.mr-2{margin-right:.5rem !important}.mb-2{margin-bottom:.5rem !important}.ml-2{margin-left:.5rem !important}.mx-2{margin-left:.5rem !important;margin-right:.5rem !important}.my-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.m-3{margin:.75rem !important}.mt-3{margin-top:.75rem !important}.mr-3{margin-right:.75rem !important}.mb-3{margin-bottom:.75rem !important}.ml-3{margin-left:.75rem !important}.mx-3{margin-left:.75rem !important;margin-right:.75rem !important}.my-3{margin-top:.75rem !important;margin-bottom:.75rem !important}.m-4{margin:1rem !important}.mt-4{margin-top:1rem !important}.mr-4{margin-right:1rem !important}.mb-4{margin-bottom:1rem !important}.ml-4{margin-left:1rem !important}.mx-4{margin-left:1rem !important;margin-right:1rem !important}.my-4{margin-top:1rem !important;margin-bottom:1rem !important}.m-5{margin:1.5rem !important}.mt-5{margin-top:1.5rem !important}.mr-5{margin-right:1.5rem !important}.mb-5{margin-bottom:1.5rem !important}.ml-5{margin-left:1.5rem !important}.mx-5{margin-left:1.5rem !important;margin-right:1.5rem !important}.my-5{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.m-6{margin:3rem !important}.mt-6{margin-top:3rem !important}.mr-6{margin-right:3rem !important}.mb-6{margin-bottom:3rem !important}.ml-6{margin-left:3rem !important}.mx-6{margin-left:3rem !important;margin-right:3rem !important}.my-6{margin-top:3rem !important;margin-bottom:3rem !important}.m-auto{margin:auto !important}.mt-auto{margin-top:auto !important}.mr-auto{margin-right:auto !important}.mb-auto{margin-bottom:auto !important}.ml-auto{margin-left:auto !important}.mx-auto{margin-left:auto !important;margin-right:auto !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}.p-0{padding:0 !important}.pt-0{padding-top:0 !important}.pr-0{padding-right:0 !important}.pb-0{padding-bottom:0 !important}.pl-0{padding-left:0 !important}.px-0{padding-left:0 !important;padding-right:0 !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.p-1{padding:.25rem !important}.pt-1{padding-top:.25rem !important}.pr-1{padding-right:.25rem !important}.pb-1{padding-bottom:.25rem !important}.pl-1{padding-left:.25rem !important}.px-1{padding-left:.25rem !important;padding-right:.25rem !important}.py-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.p-2{padding:.5rem !important}.pt-2{padding-top:.5rem !important}.pr-2{padding-right:.5rem !important}.pb-2{padding-bottom:.5rem !important}.pl-2{padding-left:.5rem !important}.px-2{padding-left:.5rem !important;padding-right:.5rem !important}.py-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.p-3{padding:.75rem !important}.pt-3{padding-top:.75rem !important}.pr-3{padding-right:.75rem !important}.pb-3{padding-bottom:.75rem !important}.pl-3{padding-left:.75rem !important}.px-3{padding-left:.75rem !important;padding-right:.75rem !important}.py-3{padding-top:.75rem !important;padding-bottom:.75rem !important}.p-4{padding:1rem !important}.pt-4{padding-top:1rem !important}.pr-4{padding-right:1rem !important}.pb-4{padding-bottom:1rem !important}.pl-4{padding-left:1rem !important}.px-4{padding-left:1rem !important;padding-right:1rem !important}.py-4{padding-top:1rem !important;padding-bottom:1rem !important}.p-5{padding:1.5rem !important}.pt-5{padding-top:1.5rem !important}.pr-5{padding-right:1.5rem !important}.pb-5{padding-bottom:1.5rem !important}.pl-5{padding-left:1.5rem !important}.px-5{padding-left:1.5rem !important;padding-right:1.5rem !important}.py-5{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.p-6{padding:3rem !important}.pt-6{padding-top:3rem !important}.pr-6{padding-right:3rem !important}.pb-6{padding-bottom:3rem !important}.pl-6{padding-left:3rem !important}.px-6{padding-left:3rem !important;padding-right:3rem !important}.py-6{padding-top:3rem !important;padding-bottom:3rem !important}.p-auto{padding:auto !important}.pt-auto{padding-top:auto !important}.pr-auto{padding-right:auto !important}.pb-auto{padding-bottom:auto !important}.pl-auto{padding-left:auto !important}.px-auto{padding-left:auto !important;padding-right:auto !important}.py-auto{padding-top:auto !important;padding-bottom:auto !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}.is-underlined{text-decoration:underline !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}}/*! minireset.css v0.0.6 | 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,video{height:auto;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:inherit}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,optgroup,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:inherit}table th{color:#222}@keyframes spinAround{from{transform:rotate(0deg)}to{transform:rotate(359deg)}}.box{background-color:#fff;border-radius:6px;box-shadow:#bbb;color:#222;display:block;padding:1.25rem}a.box:hover,a.box:focus{box-shadow:0 0.5em 1em -0.125em 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:#222;cursor:pointer;justify-content:center;padding-bottom:calc(0.5em - 1px);padding-left:1em;padding-right:1em;padding-top:calc(0.5em - 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.5em - 1px);margin-right:.25em}.button .icon:last-child:not(:first-child){margin-left:.25em;margin-right:calc(-0.5em - 1px)}.button .icon:first-child:last-child{margin-left:calc(-0.5em - 1px);margin-right:calc(-0.5em - 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-ghost{background:none;border-color:rgba(0,0,0,0);color:#2e63b8;text-decoration:none}.button.is-ghost:hover,.button.is-ghost.is-hovered{color:#2e63b8;text-decoration:underline}.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:#fff;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:#0a0a0a;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:rgba(0,0,0,0.7)}.button.is-light:hover,.button.is-light.is-hovered{background-color:#eee;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-light:focus,.button.is-light.is-focused{border-color:transparent;color:rgba(0,0,0,0.7)}.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:rgba(0,0,0,0.7)}.button.is-light[disabled],fieldset[disabled] .button.is-light{background-color:#f5f5f5;border-color:#f5f5f5;box-shadow:none}.button.is-light.is-inverted{background-color:rgba(0,0,0,0.7);color:#f5f5f5}.button.is-light.is-inverted:hover,.button.is-light.is-inverted.is-hovered{background-color:rgba(0,0,0,0.7)}.button.is-light.is-inverted[disabled],fieldset[disabled] .button.is-light.is-inverted{background-color:rgba(0,0,0,0.7);border-color:transparent;box-shadow:none;color:#f5f5f5}.button.is-light.is-loading::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !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:rgba(0,0,0,0.7)}.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 rgba(0,0,0,0.7) rgba(0,0,0,0.7) !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:rgba(0,0,0,0.7);color:rgba(0,0,0,0.7)}.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:rgba(0,0,0,0.7);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:rgba(0,0,0,0.7);box-shadow:none;color:rgba(0,0,0,0.7)}.button.is-dark,.content kbd.button{background-color:#363636;border-color:transparent;color:#fff}.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:#fff}.button.is-dark:focus,.content kbd.button:focus,.button.is-dark.is-focused,.content kbd.button.is-focused{border-color:transparent;color:#fff}.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:#fff}.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:#363636;box-shadow:none}.button.is-dark.is-inverted,.content kbd.button.is-inverted{background-color:#fff;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:#f2f2f2}.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:#fff;border-color:transparent;box-shadow:none;color:#363636}.button.is-dark.is-loading::after,.content kbd.button.is-loading::after{border-color:transparent transparent #fff #fff !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:#fff}.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 #fff #fff !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:#fff;color:#fff}.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:#fff;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:#fff;box-shadow:none;color:#fff}.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:#4eb5de;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-primary.is-light,.docstring>section>a.button.is-light.docs-sourcelink{background-color:#eef8fc;color:#1a6d8e}.button.is-primary.is-light:hover,.docstring>section>a.button.is-light.docs-sourcelink:hover,.button.is-primary.is-light.is-hovered,.docstring>section>a.button.is-light.is-hovered.docs-sourcelink{background-color:#e3f3fa;border-color:transparent;color:#1a6d8e}.button.is-primary.is-light:active,.docstring>section>a.button.is-light.docs-sourcelink:active,.button.is-primary.is-light.is-active,.docstring>section>a.button.is-light.is-active.docs-sourcelink{background-color:#d8eff8;border-color:transparent;color:#1a6d8e}.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:#2e63b8;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-link.is-light{background-color:#eff3fb;color:#3169c4}.button.is-link.is-light:hover,.button.is-link.is-light.is-hovered{background-color:#e4ecf8;border-color:transparent;color:#3169c4}.button.is-link.is-light:active,.button.is-link.is-light.is-active{background-color:#dae5f6;border-color:transparent;color:#3169c4}.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:#209cee;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-info.is-light{background-color:#ecf7fe;color:#0e72b4}.button.is-info.is-light:hover,.button.is-info.is-light.is-hovered{background-color:#e0f1fd;border-color:transparent;color:#0e72b4}.button.is-info.is-light:active,.button.is-info.is-light.is-active{background-color:#d4ecfc;border-color:transparent;color:#0e72b4}.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:#22c35b;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-success.is-light{background-color:#eefcf3;color:#198f43}.button.is-success.is-light:hover,.button.is-success.is-light.is-hovered{background-color:#e3faeb;border-color:transparent;color:#198f43}.button.is-success.is-light:active,.button.is-success.is-light.is-active{background-color:#d8f8e3;border-color:transparent;color:#198f43}.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:#ffdd57;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-warning.is-light{background-color:#fffbeb;color:#947600}.button.is-warning.is-light:hover,.button.is-warning.is-light.is-hovered{background-color:#fff8de;border-color:transparent;color:#947600}.button.is-warning.is-light:active,.button.is-warning.is-light.is-active{background-color:#fff6d1;border-color:transparent;color:#947600}.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:#da0b00;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-danger.is-light{background-color:#ffeceb;color:#f50c00}.button.is-danger.is-light:hover,.button.is-danger.is-light.is-hovered{background-color:#ffe0de;border-color:transparent;color:#f50c00}.button.is-danger.is-light:active,.button.is-danger.is-light.is-active{background-color:#ffd3d1;border-color:transparent;color:#f50c00}.button.is-small,#documenter .docs-sidebar form.docs-search>input.button{font-size:.75rem}.button.is-small:not(.is-rounded),#documenter .docs-sidebar form.docs-search>input.button:not(.is-rounded){border-radius:2px}.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 * 0.5));top:calc(50% - (1em * 0.5));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:9999px;padding-left:calc(1em + 0.25em);padding-right:calc(1em + 0.25em)}.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:.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){font-size:.75rem}.buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large):not(.is-rounded){border-radius:2px}.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}@media screen and (max-width: 768px){.button.is-responsive.is-small,#documenter .docs-sidebar form.docs-search>input.is-responsive{font-size:.5625rem}.button.is-responsive,.button.is-responsive.is-normal{font-size:.65625rem}.button.is-responsive.is-medium{font-size:.75rem}.button.is-responsive.is-large{font-size:1rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.button.is-responsive.is-small,#documenter .docs-sidebar form.docs-search>input.is-responsive{font-size:.65625rem}.button.is-responsive,.button.is-responsive.is-normal{font-size:.75rem}.button.is-responsive.is-medium{font-size:1rem}.button.is-responsive.is-large{font-size:1.25rem}}.container{flex-grow:1;margin:0 auto;position:relative;width:auto}.container.is-fluid{max-width:none !important;padding-left:32px;padding-right:32px;width:100%}@media screen and (min-width: 1056px){.container{max-width:992px}}@media screen and (max-width: 1215px){.container.is-widescreen:not(.is-max-desktop){max-width:1152px}}@media screen and (max-width: 1407px){.container.is-fullhd:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}@media screen and (min-width: 1216px){.container:not(.is-max-desktop){max-width:1152px}}@media screen and (min-width: 1408px){.container:not(.is-max-desktop):not(.is-max-widescreen){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:inherit}.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-normal{font-size:1rem}.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}.icon-text{align-items:flex-start;color:inherit;display:inline-flex;flex-wrap:wrap;line-height:1.5rem;vertical-align:top}.icon-text .icon{flex-grow:0;flex-shrink:0}.icon-text .icon:not(:last-child){margin-right:.25em}.icon-text .icon:not(:first-child){margin-left:.25em}div.icon-text{display:flex}.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:9999px}.image.is-fullwidth,#documenter .docs-sidebar .docs-logo>img.is-fullwidth{width:100%}.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;position:relative;padding:1.25rem 2.5rem 1.25rem 1.5rem}.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{right:.5rem;position:absolute;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:rgba(0,0,0,0.7)}.notification.is-dark,.content kbd.notification{background-color:#363636;color:#fff}.notification.is-primary,.docstring>section>a.notification.docs-sourcelink{background-color:#4eb5de;color:#fff}.notification.is-primary.is-light,.docstring>section>a.notification.is-light.docs-sourcelink{background-color:#eef8fc;color:#1a6d8e}.notification.is-link{background-color:#2e63b8;color:#fff}.notification.is-link.is-light{background-color:#eff3fb;color:#3169c4}.notification.is-info{background-color:#209cee;color:#fff}.notification.is-info.is-light{background-color:#ecf7fe;color:#0e72b4}.notification.is-success{background-color:#22c35b;color:#fff}.notification.is-success.is-light{background-color:#eefcf3;color:#198f43}.notification.is-warning{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.notification.is-warning.is-light{background-color:#fffbeb;color:#947600}.notification.is-danger{background-color:#da0b00;color:#fff}.notification.is-danger.is-light{background-color:#ffeceb;color:#f50c00}.progress{-moz-appearance:none;-webkit-appearance:none;border:none;border-radius:9999px;display:block;height:1rem;overflow:hidden;padding:0;width:100%}.progress::-webkit-progress-bar{background-color:#ededed}.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%, #ededed 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%, #ededed 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%, #ededed 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%, #ededed 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%, #ededed 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%, #ededed 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%, #ededed 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%, #ededed 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%, #ededed 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%, #ededed 30%)}.progress:indeterminate{animation-duration:1.5s;animation-iteration-count:infinite;animation-name:moveIndeterminate;animation-timing-function:linear;background-color:#ededed;background-image:linear-gradient(to right, #222 30%, #ededed 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:indeterminate::-ms-fill{animation-name:none}.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:#222}.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:rgba(0,0,0,0.7)}.table td.is-dark,.table th.is-dark{background-color:#363636;border-color:#363636;color:#fff}.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 td.is-vcentered,.table th.is-vcentered{vertical-align:middle}.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:.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-top-left-radius:0;border-bottom-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-top-right-radius:0;border-bottom-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:.25rem;margin-right:-.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:rgba(0,0,0,0.7)}.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:#fff}.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-primary.is-light:not(body),.content kbd.is-primary.is-light:not(body),.docstring>section>a.docs-sourcelink.is-light:not(body){background-color:#eef8fc;color:#1a6d8e}.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-link.is-light:not(body),.content kbd.is-link.is-light:not(body),.docstring>section>a.docs-sourcelink.is-link.is-light:not(body){background-color:#eff3fb;color:#3169c4}.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-info.is-light:not(body),.content kbd.is-info.is-light:not(body),.docstring>section>a.docs-sourcelink.is-info.is-light:not(body){background-color:#ecf7fe;color:#0e72b4}.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-success.is-light:not(body),.content kbd.is-success.is-light:not(body),.docstring>section>a.docs-sourcelink.is-success.is-light:not(body){background-color:#eefcf3;color:#198f43}.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-warning.is-light:not(body),.content kbd.is-warning.is-light:not(body),.docstring>section>a.docs-sourcelink.is-warning.is-light:not(body){background-color:#fffbeb;color:#947600}.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-danger.is-light:not(body),.content kbd.is-danger.is-light:not(body),.docstring>section>a.docs-sourcelink.is-danger.is-light:not(body){background-color:#ffeceb;color:#f50c00}.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:-.375em;margin-right:.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:.1875em;margin-right:-.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:-.375em;margin-right:-.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:9999px}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:#222;font-size:2rem;font-weight:600;line-height:1.125}.title strong{color:inherit;font-weight:inherit}.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:#222;font-size:1.25rem;font-weight:400;line-height:1.25}.subtitle strong{color:#222;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}.number{align-items:center;background-color:#f5f5f5;border-radius:9999px;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:#222}.select select::-moz-placeholder,.textarea::-moz-placeholder,.input::-moz-placeholder,#documenter .docs-sidebar form.docs-search>input::-moz-placeholder{color:#707070}.select select::-webkit-input-placeholder,.textarea::-webkit-input-placeholder,.input::-webkit-input-placeholder,#documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder{color:#707070}.select select:-moz-placeholder,.textarea:-moz-placeholder,.input:-moz-placeholder,#documenter .docs-sidebar form.docs-search>input:-moz-placeholder{color:#707070}.select select:-ms-input-placeholder,.textarea:-ms-input-placeholder,.input:-ms-input-placeholder,#documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder{color:#707070}.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 0.0625em 0.125em rgba(10,10,10,0.05);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:9999px;padding-left:calc(calc(0.75em - 1px) + 0.375em);padding-right:calc(calc(0.75em - 1px) + 0.375em)}.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:calc(0.75em - 1px);resize:vertical}.textarea:not([rows]){max-height:40em;min-height:8em}.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:#222}.radio[disabled],.checkbox[disabled],fieldset[disabled] .radio,fieldset[disabled] .checkbox,.radio input[disabled],.checkbox input[disabled]{color:#6b6b6b;cursor:not-allowed}.radio+.radio{margin-left:.5em}.select{display:inline-block;max-width:100%;position:relative;vertical-align:top}.select:not(.is-multiple){height:2.5em}.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:9999px;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:#222}.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 !important;opacity:0.5}.select.is-fullwidth{width:100%}.select.is-fullwidth select{width:100%}.select.is-loading::after{margin-top:0;position:absolute;right:.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:rgba(0,0,0,0.7)}.file.is-light:hover .file-cta,.file.is-light.is-hovered .file-cta{background-color:#eee;border-color:transparent;color:rgba(0,0,0,0.7)}.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:rgba(0,0,0,0.7)}.file.is-light:active .file-cta,.file.is-light.is-active .file-cta{background-color:#e8e8e8;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-dark .file-cta,.content kbd.file .file-cta{background-color:#363636;border-color:transparent;color:#fff}.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:#fff}.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:#fff}.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:#fff}.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-normal{font-size:1rem}.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:#222}.file-label:hover .file-name{border-color:#d5d5d5}.file-label:active .file-cta{background-color:#e8e8e8;color:#222}.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:#222}.file-name{border-color:#dbdbdb;border-style:solid;border-width:1px 1px 1px 0;display:block;max-width:16em;overflow:hidden;text-align:inherit;text-overflow:ellipsis}.file-icon{align-items:center;display:flex;height:1em;justify-content:center;margin-right:.5em;width:1em}.file-icon .fa{font-size:14px}.label{color:#222;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:.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:.75rem}}.control{box-sizing:border-box;clear:both;font-size:1rem;position:relative;text-align:inherit}.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:#222}.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.5em;pointer-events:none;position:absolute;top:0;width:2.5em;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.5em}.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.5em}.control.has-icons-right .icon.is-right{right:0}.control.is-loading::after{position:absolute !important;right:.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:.5em}.breadcrumb .icon:last-child{margin-left:.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;border-radius:.25rem;box-shadow:#bbb;color:#222;max-width:100%;position:relative}.card-footer:first-child,.card-content:first-child,.card-header:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-footer:last-child,.card-content:last-child,.card-header:last-child{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.card-header{background-color:rgba(0,0,0,0);align-items:stretch;box-shadow:0 0.125em 0.25em 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:0.75rem 1rem}.card-header-title.is-centered{justify-content:center}.card-header-icon{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0;align-items:center;cursor:pointer;display:flex;justify-content:center;padding:0.75rem 1rem}.card-image{display:block;position:relative}.card-image:first-child img{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-image:last-child img{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.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 #ededed;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 #ededed}.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:#bbb;padding-bottom:.5rem;padding-top:.5rem}.dropdown-item{color:#222;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:inherit;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:#ededed;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}}.media{align-items:flex-start;display:flex;text-align:inherit}.media .content:not(:last-child){margin-bottom:.75rem}.media .media{border-top:1px solid rgba(219,219,219,0.5);display:flex;padding-top:.75rem}.media .media .content:not(:last-child),.media .media .control:not(:last-child){margin-bottom:.5rem}.media .media .media{padding-top:.5rem}.media .media .media+.media{margin-top:.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:inherit}@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}.message.is-black{background-color:#fafafa}.message.is-black .message-header{background-color:#0a0a0a;color:#fff}.message.is-black .message-body{border-color:#0a0a0a}.message.is-light{background-color:#fafafa}.message.is-light .message-header{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.message.is-light .message-body{border-color:#f5f5f5}.message.is-dark,.content kbd.message{background-color:#fafafa}.message.is-dark .message-header,.content kbd.message .message-header{background-color:#363636;color:#fff}.message.is-dark .message-body,.content kbd.message .message-body{border-color:#363636}.message.is-primary,.docstring>section>a.message.docs-sourcelink{background-color:#eef8fc}.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:#1a6d8e}.message.is-link{background-color:#eff3fb}.message.is-link .message-header{background-color:#2e63b8;color:#fff}.message.is-link .message-body{border-color:#2e63b8;color:#3169c4}.message.is-info{background-color:#ecf7fe}.message.is-info .message-header{background-color:#209cee;color:#fff}.message.is-info .message-body{border-color:#209cee;color:#0e72b4}.message.is-success{background-color:#eefcf3}.message.is-success .message-header{background-color:#22c35b;color:#fff}.message.is-success .message-body{border-color:#22c35b;color:#198f43}.message.is-warning{background-color:#fffbeb}.message.is-warning .message-header{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.message.is-warning .message-body{border-color:#ffdd57;color:#947600}.message.is-danger{background-color:#ffeceb}.message.is-danger .message-header{background-color:#da0b00;color:#fff}.message.is-danger .message-body{border-color:#da0b00;color:#f50c00}.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:.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){.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:.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:rgba(0,0,0,0.7)}.navbar.is-light .navbar-brand>.navbar-item,.navbar.is-light .navbar-brand .navbar-link{color:rgba(0,0,0,0.7)}.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:rgba(0,0,0,0.7)}.navbar.is-light .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-burger{color:rgba(0,0,0,0.7)}@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:rgba(0,0,0,0.7)}.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:rgba(0,0,0,0.7)}.navbar.is-light .navbar-start .navbar-link::after,.navbar.is-light .navbar-end .navbar-link::after{border-color:rgba(0,0,0,0.7)}.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:rgba(0,0,0,0.7)}.navbar.is-light .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}}.navbar.is-dark,.content kbd.navbar{background-color:#363636;color:#fff}.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:#fff}.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:#fff}.navbar.is-dark .navbar-brand .navbar-link::after,.content kbd.navbar .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-dark .navbar-burger,.content kbd.navbar .navbar-burger{color:#fff}@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:#fff}.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:#fff}.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:#fff}.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:#fff}.navbar.is-dark .navbar-dropdown a.navbar-item.is-active,.content kbd.navbar .navbar-dropdown a.navbar-item.is-active{background-color:#363636;color:#fff}}.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:#222;-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;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:#222;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{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.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:9999px}.pagination.is-rounded .pagination-link,#documenter .docs-sidebar form.docs-search>input.pagination .pagination-link{border-radius:9999px}.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:#222;min-width:2.5em}.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-previous.is-disabled,.pagination-next[disabled],.pagination-next.is-disabled,.pagination-link[disabled],.pagination-link.is-disabled{background-color:#dbdbdb;border-color:#dbdbdb;box-shadow:none;color:#6b6b6b;opacity:0.5}.pagination-previous,.pagination-next{padding-left:.75em;padding-right:.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}.pagination-list li{list-style:none}@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,.pagination-next,.pagination-link,.pagination-ellipsis{margin-bottom:0;margin-top:0}.pagination-previous{order:2}.pagination-next{order:3}.pagination{justify-content:space-between;margin-bottom:0;margin-top:0}.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{border-radius:6px;box-shadow:#bbb;font-size:1rem}.panel:not(:last-child){margin-bottom:1.5rem}.panel.is-white .panel-heading{background-color:#fff;color:#0a0a0a}.panel.is-white .panel-tabs a.is-active{border-bottom-color:#fff}.panel.is-white .panel-block.is-active .panel-icon{color:#fff}.panel.is-black .panel-heading{background-color:#0a0a0a;color:#fff}.panel.is-black .panel-tabs a.is-active{border-bottom-color:#0a0a0a}.panel.is-black .panel-block.is-active .panel-icon{color:#0a0a0a}.panel.is-light .panel-heading{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.panel.is-light .panel-tabs a.is-active{border-bottom-color:#f5f5f5}.panel.is-light .panel-block.is-active .panel-icon{color:#f5f5f5}.panel.is-dark .panel-heading,.content kbd.panel .panel-heading{background-color:#363636;color:#fff}.panel.is-dark .panel-tabs a.is-active,.content kbd.panel .panel-tabs a.is-active{border-bottom-color:#363636}.panel.is-dark .panel-block.is-active .panel-icon,.content kbd.panel .panel-block.is-active .panel-icon{color:#363636}.panel.is-primary .panel-heading,.docstring>section>a.panel.docs-sourcelink .panel-heading{background-color:#4eb5de;color:#fff}.panel.is-primary .panel-tabs a.is-active,.docstring>section>a.panel.docs-sourcelink .panel-tabs a.is-active{border-bottom-color:#4eb5de}.panel.is-primary .panel-block.is-active .panel-icon,.docstring>section>a.panel.docs-sourcelink .panel-block.is-active .panel-icon{color:#4eb5de}.panel.is-link .panel-heading{background-color:#2e63b8;color:#fff}.panel.is-link .panel-tabs a.is-active{border-bottom-color:#2e63b8}.panel.is-link .panel-block.is-active .panel-icon{color:#2e63b8}.panel.is-info .panel-heading{background-color:#209cee;color:#fff}.panel.is-info .panel-tabs a.is-active{border-bottom-color:#209cee}.panel.is-info .panel-block.is-active .panel-icon{color:#209cee}.panel.is-success .panel-heading{background-color:#22c35b;color:#fff}.panel.is-success .panel-tabs a.is-active{border-bottom-color:#22c35b}.panel.is-success .panel-block.is-active .panel-icon{color:#22c35b}.panel.is-warning .panel-heading{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.panel.is-warning .panel-tabs a.is-active{border-bottom-color:#ffdd57}.panel.is-warning .panel-block.is-active .panel-icon{color:#ffdd57}.panel.is-danger .panel-heading{background-color:#da0b00;color:#fff}.panel.is-danger .panel-tabs a.is-active{border-bottom-color:#da0b00}.panel.is-danger .panel-block.is-active .panel-icon{color:#da0b00}.panel-tabs:not(:last-child),.panel-block:not(:last-child){border-bottom:1px solid #ededed}.panel-heading{background-color:#ededed;border-radius:6px 6px 0 0;color:#222;font-size:1.25em;font-weight:700;line-height:1.25;padding:0.75em 1em}.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:.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}.panel-block:last-child{border-bottom-left-radius:6px;border-bottom-right-radius:6px}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:.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:.5em}.tabs .icon:last-child{margin-left:.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-top-left-radius:4px;border-bottom-left-radius:4px}.tabs.is-toggle li:last-child a{border-top-right-radius:4px;border-bottom-right-radius:4px}.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:9999px;border-top-left-radius:9999px;padding-left:1.25em}.tabs.is-toggle.is-toggle-rounded li:last-child a{border-bottom-right-radius:9999px;border-top-right-radius:9999px;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;width:unset}.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.33333337%}.columns.is-mobile>.column.is-offset-1{margin-left:8.33333337%}.columns.is-mobile>.column.is-2{flex:none;width:16.66666674%}.columns.is-mobile>.column.is-offset-2{margin-left:16.66666674%}.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.33333337%}.columns.is-mobile>.column.is-offset-4{margin-left:33.33333337%}.columns.is-mobile>.column.is-5{flex:none;width:41.66666674%}.columns.is-mobile>.column.is-offset-5{margin-left:41.66666674%}.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.33333337%}.columns.is-mobile>.column.is-offset-7{margin-left:58.33333337%}.columns.is-mobile>.column.is-8{flex:none;width:66.66666674%}.columns.is-mobile>.column.is-offset-8{margin-left:66.66666674%}.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.33333337%}.columns.is-mobile>.column.is-offset-10{margin-left:83.33333337%}.columns.is-mobile>.column.is-11{flex:none;width:91.66666674%}.columns.is-mobile>.column.is-offset-11{margin-left:91.66666674%}.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;width:unset}.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.33333337%}.column.is-offset-1-mobile{margin-left:8.33333337%}.column.is-2-mobile{flex:none;width:16.66666674%}.column.is-offset-2-mobile{margin-left:16.66666674%}.column.is-3-mobile{flex:none;width:25%}.column.is-offset-3-mobile{margin-left:25%}.column.is-4-mobile{flex:none;width:33.33333337%}.column.is-offset-4-mobile{margin-left:33.33333337%}.column.is-5-mobile{flex:none;width:41.66666674%}.column.is-offset-5-mobile{margin-left:41.66666674%}.column.is-6-mobile{flex:none;width:50%}.column.is-offset-6-mobile{margin-left:50%}.column.is-7-mobile{flex:none;width:58.33333337%}.column.is-offset-7-mobile{margin-left:58.33333337%}.column.is-8-mobile{flex:none;width:66.66666674%}.column.is-offset-8-mobile{margin-left:66.66666674%}.column.is-9-mobile{flex:none;width:75%}.column.is-offset-9-mobile{margin-left:75%}.column.is-10-mobile{flex:none;width:83.33333337%}.column.is-offset-10-mobile{margin-left:83.33333337%}.column.is-11-mobile{flex:none;width:91.66666674%}.column.is-offset-11-mobile{margin-left:91.66666674%}.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;width:unset}.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.33333337%}.column.is-offset-1,.column.is-offset-1-tablet{margin-left:8.33333337%}.column.is-2,.column.is-2-tablet{flex:none;width:16.66666674%}.column.is-offset-2,.column.is-offset-2-tablet{margin-left:16.66666674%}.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.33333337%}.column.is-offset-4,.column.is-offset-4-tablet{margin-left:33.33333337%}.column.is-5,.column.is-5-tablet{flex:none;width:41.66666674%}.column.is-offset-5,.column.is-offset-5-tablet{margin-left:41.66666674%}.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.33333337%}.column.is-offset-7,.column.is-offset-7-tablet{margin-left:58.33333337%}.column.is-8,.column.is-8-tablet{flex:none;width:66.66666674%}.column.is-offset-8,.column.is-offset-8-tablet{margin-left:66.66666674%}.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.33333337%}.column.is-offset-10,.column.is-offset-10-tablet{margin-left:83.33333337%}.column.is-11,.column.is-11-tablet{flex:none;width:91.66666674%}.column.is-offset-11,.column.is-offset-11-tablet{margin-left:91.66666674%}.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;width:unset}.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.33333337%}.column.is-offset-1-touch{margin-left:8.33333337%}.column.is-2-touch{flex:none;width:16.66666674%}.column.is-offset-2-touch{margin-left:16.66666674%}.column.is-3-touch{flex:none;width:25%}.column.is-offset-3-touch{margin-left:25%}.column.is-4-touch{flex:none;width:33.33333337%}.column.is-offset-4-touch{margin-left:33.33333337%}.column.is-5-touch{flex:none;width:41.66666674%}.column.is-offset-5-touch{margin-left:41.66666674%}.column.is-6-touch{flex:none;width:50%}.column.is-offset-6-touch{margin-left:50%}.column.is-7-touch{flex:none;width:58.33333337%}.column.is-offset-7-touch{margin-left:58.33333337%}.column.is-8-touch{flex:none;width:66.66666674%}.column.is-offset-8-touch{margin-left:66.66666674%}.column.is-9-touch{flex:none;width:75%}.column.is-offset-9-touch{margin-left:75%}.column.is-10-touch{flex:none;width:83.33333337%}.column.is-offset-10-touch{margin-left:83.33333337%}.column.is-11-touch{flex:none;width:91.66666674%}.column.is-offset-11-touch{margin-left:91.66666674%}.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;width:unset}.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.33333337%}.column.is-offset-1-desktop{margin-left:8.33333337%}.column.is-2-desktop{flex:none;width:16.66666674%}.column.is-offset-2-desktop{margin-left:16.66666674%}.column.is-3-desktop{flex:none;width:25%}.column.is-offset-3-desktop{margin-left:25%}.column.is-4-desktop{flex:none;width:33.33333337%}.column.is-offset-4-desktop{margin-left:33.33333337%}.column.is-5-desktop{flex:none;width:41.66666674%}.column.is-offset-5-desktop{margin-left:41.66666674%}.column.is-6-desktop{flex:none;width:50%}.column.is-offset-6-desktop{margin-left:50%}.column.is-7-desktop{flex:none;width:58.33333337%}.column.is-offset-7-desktop{margin-left:58.33333337%}.column.is-8-desktop{flex:none;width:66.66666674%}.column.is-offset-8-desktop{margin-left:66.66666674%}.column.is-9-desktop{flex:none;width:75%}.column.is-offset-9-desktop{margin-left:75%}.column.is-10-desktop{flex:none;width:83.33333337%}.column.is-offset-10-desktop{margin-left:83.33333337%}.column.is-11-desktop{flex:none;width:91.66666674%}.column.is-offset-11-desktop{margin-left:91.66666674%}.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;width:unset}.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.33333337%}.column.is-offset-1-widescreen{margin-left:8.33333337%}.column.is-2-widescreen{flex:none;width:16.66666674%}.column.is-offset-2-widescreen{margin-left:16.66666674%}.column.is-3-widescreen{flex:none;width:25%}.column.is-offset-3-widescreen{margin-left:25%}.column.is-4-widescreen{flex:none;width:33.33333337%}.column.is-offset-4-widescreen{margin-left:33.33333337%}.column.is-5-widescreen{flex:none;width:41.66666674%}.column.is-offset-5-widescreen{margin-left:41.66666674%}.column.is-6-widescreen{flex:none;width:50%}.column.is-offset-6-widescreen{margin-left:50%}.column.is-7-widescreen{flex:none;width:58.33333337%}.column.is-offset-7-widescreen{margin-left:58.33333337%}.column.is-8-widescreen{flex:none;width:66.66666674%}.column.is-offset-8-widescreen{margin-left:66.66666674%}.column.is-9-widescreen{flex:none;width:75%}.column.is-offset-9-widescreen{margin-left:75%}.column.is-10-widescreen{flex:none;width:83.33333337%}.column.is-offset-10-widescreen{margin-left:83.33333337%}.column.is-11-widescreen{flex:none;width:91.66666674%}.column.is-offset-11-widescreen{margin-left:91.66666674%}.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;width:unset}.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.33333337%}.column.is-offset-1-fullhd{margin-left:8.33333337%}.column.is-2-fullhd{flex:none;width:16.66666674%}.column.is-offset-2-fullhd{margin-left:16.66666674%}.column.is-3-fullhd{flex:none;width:25%}.column.is-offset-3-fullhd{margin-left:25%}.column.is-4-fullhd{flex:none;width:33.33333337%}.column.is-offset-4-fullhd{margin-left:33.33333337%}.column.is-5-fullhd{flex:none;width:41.66666674%}.column.is-offset-5-fullhd{margin-left:41.66666674%}.column.is-6-fullhd{flex:none;width:50%}.column.is-offset-6-fullhd{margin-left:50%}.column.is-7-fullhd{flex:none;width:58.33333337%}.column.is-offset-7-fullhd{margin-left:58.33333337%}.column.is-8-fullhd{flex:none;width:66.66666674%}.column.is-offset-8-fullhd{margin-left:66.66666674%}.column.is-9-fullhd{flex:none;width:75%}.column.is-offset-9-fullhd{margin-left:75%}.column.is-10-fullhd{flex:none;width:83.33333337%}.column.is-offset-10-fullhd{margin-left:83.33333337%}.column.is-11-fullhd{flex:none;width:91.66666674%}.column.is-offset-11-fullhd{margin-left:91.66666674%}.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.33333337%}.tile.is-2{flex:none;width:16.66666674%}.tile.is-3{flex:none;width:25%}.tile.is-4{flex:none;width:33.33333337%}.tile.is-5{flex:none;width:41.66666674%}.tile.is-6{flex:none;width:50%}.tile.is-7{flex:none;width:58.33333337%}.tile.is-8{flex:none;width:66.66666674%}.tile.is-9{flex:none;width:75%}.tile.is-10{flex:none;width:83.33333337%}.tile.is-11{flex:none;width:91.66666674%}.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{color:#fff !important;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{color:#0a0a0a !important;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:rgba(0,0,0,0.7)}.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:rgba(0,0,0,0.7)}.hero.is-light .subtitle{color:rgba(0,0,0,0.9)}.hero.is-light .subtitle a:not(.button),.hero.is-light .subtitle strong{color:rgba(0,0,0,0.7)}@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(0,0,0,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:rgba(0,0,0,0.7)}.hero.is-light .tabs a{color:rgba(0,0,0,0.7);opacity:0.9}.hero.is-light .tabs a:hover{opacity:1}.hero.is-light .tabs li.is-active a{color:#f5f5f5 !important;opacity:1}.hero.is-light .tabs.is-boxed a,.hero.is-light .tabs.is-toggle a{color:rgba(0,0,0,0.7)}.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:rgba(0,0,0,0.7);border-color:rgba(0,0,0,0.7);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:#fff}.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:#fff}.hero.is-dark .subtitle,.content kbd.hero .subtitle{color:rgba(255,255,255,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:#fff}@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(255,255,255,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:#fff}.hero.is-dark .tabs a,.content kbd.hero .tabs a{color:#fff;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{color:#363636 !important;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:#fff}.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:#fff;border-color:#fff;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{color:#4eb5de !important;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{color:#2e63b8 !important;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{color:#209cee !important;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{color:#22c35b !important;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{color:#ffdd57 !important;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{color:#da0b00 !important;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:1.5rem}@media screen and (min-width: 769px),print{.hero.is-medium .hero-body{padding:9rem 4.5rem}}@media screen and (min-width: 769px),print{.hero.is-large .hero-body{padding:18rem 6rem}}.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}@media screen and (min-width: 769px),print{.hero-body{padding:3rem 3rem}}.section{padding:3rem 1.5rem}@media screen and (min-width: 1056px){.section{padding:3rem 3rem}.section.is-medium{padding:9rem 4.5rem}.section.is-large{padding:18rem 6rem}}.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 6 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 6 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 6 Free";font-weight:900;margin-right:.75rem;content:"\f06a"}details.admonition.is-details>.admonition-header{list-style:none}details.admonition.is-details>.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f055"}details.admonition.is-details[open]>.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f056"}.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{cursor:pointer;display:flex;flex-grow:1;align-items:stretch;padding:0.5rem .75rem;background-color:#f5f5f5;box-shadow:0 0.125em 0.25em rgba(10,10,10,0.1);box-shadow:none;border-bottom:1px solid #dbdbdb;overflow:auto}.docstring>header code{background-color:transparent}.docstring>header .docstring-article-toggle-button{min-width:1.1rem;padding:0.2rem 0.2rem 0.2rem 0}.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;overflow-x:hidden}#documenter .docs-main header.docs-navbar .docs-sidebar-button{display:block;font-size:1.5rem;padding-bottom:0.1rem;margin-right:1rem}#documenter .docs-main header.docs-navbar .docs-right{display:flex;white-space:nowrap;gap:1rem;align-items:center}#documenter .docs-main header.docs-navbar .docs-right .docs-icon,#documenter .docs-main header.docs-navbar .docs-right .docs-label{display:inline-block}#documenter .docs-main header.docs-navbar .docs-right .docs-label{padding:0;margin-left:0.3em}@media screen and (max-width: 1055px){#documenter .docs-main header.docs-navbar .docs-right .docs-navbar-link{margin-left:0.4rem;margin-right:0.4rem}}#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 6 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}#documenter .docs-sidebar #documenter-search-query{color:#707070;width:14.4rem;box-shadow:inset 0 1px 2px rgba(10,10,10,0.1)}@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}}kbd.search-modal-key-hints{border-radius:0.25rem;border:1px solid rgba(0,0,0,0.6);box-shadow:0 2px 0 1px rgba(0,0,0,0.6);cursor:default;font-size:0.9rem;line-height:1.5;min-width:0.75rem;text-align:center;padding:0.1rem 0.3rem;position:relative;top:-1px}.search-min-width-50{min-width:50%}.search-min-height-100{min-height:100%}.search-modal-card-body{max-height:calc(100vh - 15rem)}.search-result-link{border-radius:0.7em;transition:all 300ms}.search-result-link:hover,.search-result-link:focus{background-color:rgba(0,128,128,0.1)}.search-result-link .property-search-result-badge,.search-result-link .search-filter{transition:all 300ms}.property-search-result-badge,.search-filter{padding:0.15em 0.5em;font-size:0.8em;font-style:italic;text-transform:none !important;line-height:1.5;color:#f5f5f5;background-color:rgba(51,65,85,0.501961);border-radius:0.6rem}.search-result-link:hover .property-search-result-badge,.search-result-link:hover .search-filter,.search-result-link:focus .property-search-result-badge,.search-result-link:focus .search-filter{color:#f1f5f9;background-color:#333}.search-filter{color:#333;background-color:#f5f5f5;transition:all 300ms}.search-filter:hover,.search-filter:focus{color:#333}.search-filter-selected{color:#f5f5f5;background-color:rgba(139,0,139,0.5)}.search-filter-selected:hover,.search-filter-selected:focus{color:#f5f5f5}.search-result-highlight{background-color:#ffdd57;color:black}.search-divider{border-bottom:1px solid #dbdbdb}.search-result-title{width:85%;color:#333}.search-result-code-title{font-size:0.875rem;font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace}#search-modal .modal-card-body::-webkit-scrollbar,#search-modal .filter-tabs::-webkit-scrollbar{height:10px;width:10px;background-color:transparent}#search-modal .modal-card-body::-webkit-scrollbar-thumb,#search-modal .filter-tabs::-webkit-scrollbar-thumb{background-color:gray;border-radius:1rem}#search-modal .modal-card-body::-webkit-scrollbar-track,#search-modal .filter-tabs::-webkit-scrollbar-track{-webkit-box-shadow:inset 0 0 6px rgba(0,0,0,0.6);background-color:transparent}.w-100{width:100%}.gap-2{gap:0.5rem}.gap-4{gap:1rem}.gap-8{gap:2rem}.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 + Maintainer: @highlightjs/core-team + Website: https://highlightjs.org/ + License: see project LICENSE + Touched: 2021 +*/pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{background:#F3F3F3;color:#444}.hljs-comment{color:#697070}.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:#ab5656}.hljs-literal{color:#695}.hljs-built_in,.hljs-bullet,.hljs-code,.hljs-addition{color:#397300}.hljs-meta{color:#1f7199}.hljs-meta .hljs-string{color:#38a}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:bold}.gap-4{gap:1rem} diff --git a/v1.0.3/assets/themeswap.js b/v1.0.3/assets/themeswap.js new file mode 100644 index 00000000..9f5eebe6 --- /dev/null +++ b/v1.0.3/assets/themeswap.js @@ -0,0 +1,84 @@ +// Small function to quickly swap out themes. Gets put into the tag.. +function set_theme_from_local_storage() { + // Initialize the theme to null, which means default + var theme = null; + // If the browser supports the localstorage and is not disabled then try to get the + // documenter theme + if (window.localStorage != null) { + // Get the user-picked theme from localStorage. May be `null`, which means the default + // theme. + theme = window.localStorage.getItem("documenter-theme"); + } + // Check if the users preference is for dark color scheme + var darkPreference = + window.matchMedia("(prefers-color-scheme: dark)").matches === true; + // Initialize a few variables for the loop: + // + // - active: will contain the index of the theme that should be active. Note that there + // is no guarantee that localStorage contains sane values. If `active` stays `null` + // we either could not find the theme or it is the default (primary) theme anyway. + // Either way, we then need to stick to the primary theme. + // + // - disabled: style sheets that should be disabled (i.e. all the theme style sheets + // that are not the currently active theme) + var active = null; + var disabled = []; + var primaryLightTheme = null; + var primaryDarkTheme = null; + for (var i = 0; i < document.styleSheets.length; i++) { + var ss = document.styleSheets[i]; + // The tag of each style sheet is expected to have a data-theme-name attribute + // which must contain the name of the theme. The names in localStorage much match this. + var themename = ss.ownerNode.getAttribute("data-theme-name"); + // attribute not set => non-theme stylesheet => ignore + if (themename === null) continue; + // To distinguish the default (primary) theme, it needs to have the data-theme-primary + // attribute set. + if (ss.ownerNode.getAttribute("data-theme-primary") !== null) { + primaryLightTheme = themename; + } + // Check if the theme is primary dark theme so that we could store its name in darkTheme + if (ss.ownerNode.getAttribute("data-theme-primary-dark") !== null) { + primaryDarkTheme = themename; + } + // If we find a matching theme (and it's not the default), we'll set active to non-null + if (themename === theme) active = i; + // Store the style sheets of inactive themes so that we could disable them + if (themename !== theme) disabled.push(ss); + } + var activeTheme = null; + if (active !== null) { + // If we did find an active theme, we'll (1) add the theme--$(theme) class to + document.getElementsByTagName("html")[0].className = "theme--" + theme; + activeTheme = theme; + } else { + // If we did _not_ find an active theme, then we need to fall back to the primary theme + // which can either be dark or light, depending on the user's OS preference. + var activeTheme = darkPreference ? primaryDarkTheme : primaryLightTheme; + // In case it somehow happens that the relevant primary theme was not found in the + // preceding loop, we abort without doing anything. + if (activeTheme === null) { + console.error("Unable to determine primary theme."); + return; + } + // When switching to the primary light theme, then we must not have a class name + // for the tag. That's only for non-primary or the primary dark theme. + if (darkPreference) { + document.getElementsByTagName("html")[0].className = + "theme--" + activeTheme; + } else { + document.getElementsByTagName("html")[0].className = ""; + } + } + for (var i = 0; i < document.styleSheets.length; i++) { + var ss = document.styleSheets[i]; + // The tag of each style sheet is expected to have a data-theme-name attribute + // which must contain the name of the theme. The names in localStorage much match this. + var themename = ss.ownerNode.getAttribute("data-theme-name"); + // attribute not set => non-theme stylesheet => ignore + if (themename === null) continue; + // we'll disable all the stylesheets, except for the active one + ss.disabled = !(themename == activeTheme); + } +} +set_theme_from_local_storage(); diff --git a/v1.0.3/assets/warner.js b/v1.0.3/assets/warner.js new file mode 100644 index 00000000..3f6f5d00 --- /dev/null +++ b/v1.0.3/assets/warner.js @@ -0,0 +1,52 @@ +function maybeAddWarning() { + // DOCUMENTER_NEWEST is defined in versions.js, DOCUMENTER_CURRENT_VERSION and DOCUMENTER_STABLE + // in siteinfo.js. + // If either of these are undefined something went horribly wrong, so we abort. + if ( + window.DOCUMENTER_NEWEST === undefined || + window.DOCUMENTER_CURRENT_VERSION === undefined || + window.DOCUMENTER_STABLE === undefined + ) { + return; + } + + // Current version is not a version number, so we can't tell if it's the newest version. Abort. + if (!/v(\d+\.)*\d+/.test(window.DOCUMENTER_CURRENT_VERSION)) { + return; + } + + // Current version is newest version, so no need to add a warning. + if (window.DOCUMENTER_NEWEST === window.DOCUMENTER_CURRENT_VERSION) { + return; + } + + // Add a noindex meta tag (unless one exists) so that search engines don't index this version of the docs. + if (document.body.querySelector('meta[name="robots"]') === null) { + const meta = document.createElement("meta"); + meta.name = "robots"; + meta.content = "noindex"; + + document.getElementsByTagName("head")[0].appendChild(meta); + } + + const div = document.createElement("div"); + div.classList.add("outdated-warning-overlay"); + const closer = document.createElement("button"); + closer.classList.add("outdated-warning-closer", "delete"); + closer.addEventListener("click", function () { + document.body.removeChild(div); + }); + const href = window.documenterBaseURL + "/../" + window.DOCUMENTER_STABLE; + div.innerHTML = + 'This documentation is not for the latest stable release, but for either the development version or an older release.
Click here to go to the documentation for the latest stable release.'; + div.appendChild(closer); + document.body.appendChild(div); +} + +if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", maybeAddWarning); +} else { + maybeAddWarning(); +} diff --git a/v1.0.3/custom/index.html b/v1.0.3/custom/index.html new file mode 100644 index 00000000..220814c9 --- /dev/null +++ b/v1.0.3/custom/index.html @@ -0,0 +1,110 @@ + +Customizing codegen · Automa.jl

Customizing Automa's code generation

Automa offers a few ways of customising the created code. Note that the precise code generated by Automa is considered an implementation detail, and as such is subject to change without warning. Only the overall behavior, i.e. the "DFA simulation" can be considered stable.

Nonetheless, it is instructive to look at the code generated for the machine in the "parsing from a buffer" section. I present it here cleaned up and with comments for human inspection.

# Initialize variables used in the code below
+byte::UInt8 = 0x00
+p::Int = 1
+p_end::Int = sizeof(data)
+p_eof::Int = p_end
+cs::Int = 1
+
+# Turn the input buffer into SizedMemory, to load data from pointer
+GC.@preserve data begin
+mem::Automa.SizedMemory = (Automa.SizedMemory)(data)
+
+# For every input byte:
+while p ≤ p_end && cs > 0
+    # Load byte
+    byte = mem[p]
+
+    # Load the action, to execute, if any, by looking up in a table
+    # using the current state (cs) and byte
+    @inbounds var"##292" = Int((Int8[0 0 … 0 0; 0 0 … 0 0; … ; 0 0 … 0 0; 0 0 … 0 0])[(cs - 1) << 8 + byte + 1])
+
+    # Look up next state. If invalid input, next state is negative current state
+    @inbounds cs = Int((Int8[-1 -2 … -5 -6; -1 -2 … -5 -6; … ; -1 -2 … -5 -6; -1 -2 … -5 -6])[(cs - 1) << 8 + byte + 1])
+
+    # Check each possible action looked up above, and execute it
+    # if it is not zero
+    if var"##292" == 1
+        pos = p
+    elseif var"##292" == 2
+        header = String(data[pos:p - 1])
+    elseif if var"##292" == 3
+        append!(buffer, data[pos:p - 1])
+    elseif var"##292" == 4
+        seq = Seq(header, String(buffer))
+        push!(seqs, seq)
+    end
+
+    # Increment position by 1
+    p += 1
+
+    # If we're at end of input, and the current state in in an accept state:
+    if p > p_eof ≥ 0 && cs > 0 && (cs < 65) & isodd(0x0000000000000021 >>> ((cs - 1) & 63))
+        # What follows is a list of all possible EOF actions.
+
+        # If state is state 6, execute the appropriate action
+        # tied to reaching end of input at this state
+        if cs == 6
+            seq = Seq(header, String(buffer))
+            push!(seqs, seq)
+            cs = 0
+
+    # Else, if the state is < 0, we have taken a bad input (see where cs was updated)
+    # move position back by one to leave it stuck where it found bad input
+    elseif cs < 0
+        p -= 1
+    end
+
+    # If cs is not 0, the machine is in an error state.
+    # Gather some information about machine state, then throw an error
+    if cs != 0
+        cs = -(abs(cs))
+        var"##291" = if p_eof > -1 && p > p_eof
+            nothing
+        else
+            byte
+        end
+        Automa.throw_input_error($machine, -cs, var"##291", mem, p)
+    end
+end
+end # GC.@preserve

Using CodeGenContext

The CodeGenContext (or ctx, for short) struct is a collection of settings used to customize code creation. If not passed to the code generator functions, a default CodeGenContext is used.

Variable names

One obvious place to customize is variable names. In the code above, for example, the input bytes are named byte. What if you have another variable with that name?

The ctx contains a .vars field with a Variables object, which is just a collection of names used in generated code. For example, to rename byte to u8 in the generated code, you first create the appropriate ctx, then use the ctx to make the code.

ctx = CodeGenContext(vars=Automa.Variables(byte=:u8))
+code = generate_code(ctx, machine, actions)

Other options

  • The clean option strips most linenumber information from the generated code, if set to true.
  • getbyte is a function that is called like this getbyte(data, p) to obtain byte in the main loop. This is usually just Base.getindex, but can be customised to be an arbitrary function.

Code generator

The code showed at the top of this page is code made with the table code generator. Automa also supports creating code using the goto code generator instead of the default table generator. The goto generator creates code with the following properties:

  • It is much harder to read than table code
  • The code is much larger
  • It does not use boundschecking
  • It does not allow customizing getbyte
  • It is much faster than the table generator

Normally, the table generator is good enough, but for performance sensitive applications, the goto generator can be used.

Optimising the previous example

Let's try optimising the previous FASTA parsing example. My original code did 300 MB/s.

To recap, the Machine was:

machine = let
+    header = onexit!(onenter!(re"[a-z]+", :mark_pos), :header)
+    seqline = onexit!(onenter!(re"[ACGT]+", :mark_pos), :seqline)
+    record = onexit!(re">" * header * '\n' * rep1(seqline * '\n'), :record)
+    compile(rep(record))
+end
+@assert machine isa Automa.Machine

The first improvement is to the algorithm itself: Instead of parsing to a vector of Seq, I'm simply going to index the input data, filling up an existing vector of:

struct SeqPos
+    offset::Int
+    hlen::Int32
+    slen::Int32
+end

The idea here is to remove as many allocations as possible. This will more accurately show the speed of the DFA simulation, which is now the bottleneck. The actions will therefore be

actions = Dict(
+    :mark_pos => :(pos = p),
+    :header => :(hlen = p - pos),
+    :seqline => :(slen += p - pos),
+    :record => quote
+        seqpos = SeqPos(offset, hlen, slen)
+        nseqs += 1
+        seqs[nseqs] = seqpos
+        offset += hlen + slen
+        slen = 0
+    end
+);
+
+@assert actions isa Dict

With the new variables such as slen, we need to update the function code as well:

@eval function parse_fasta(data)
+    pos = slen = hlen = offset = nseqs = 0
+    seqs = Vector{SeqPos}(undef, 400000)
+    $(generate_code(machine, actions))
+    return seqs
+end

This parses a 45 MB file in about 100 ms in my laptop, that's 450 MB/s. Now let's try the exact same, except with the code being generated by:

$(generate_code(CodeGenContext(generator=:goto), machine, actions))

Now the code parses the same 45 MB FASTA file in 11.14 miliseconds, parsing at about 4 GB/s.

Reference

Automa.CodeGenContextType
CodeGenContext(;
+    vars=Variables(:p, :p_end, :is_eof, :cs, :data, :mem, :byte, :buffer),
+    generator=:table,
+    getbyte=Base.getindex,
+    clean=false
+)

Create a CodeGenContext (ctx), a struct that stores options for Automa code generation. Ctxs are used for Automa's various code generator functions. They currently take the following options (more may be added in future versions)

  • vars::Variables: variable names used in generated code. See the Variables struct.
  • generator::Symbol: code generator mechanism (:table or :goto). The table generator creates smaller, simpler code that uses a vector of integers to determine state transitions. The goto-generator uses a maze of @goto-statements, and create larger, more complex code, that is faster.
  • getbyte::Function (table generator only): function f(data, p) to access byte from data. Default: Base.getindex.
  • clean: Whether to remove some QuoteNodes (line information) from the generated code

Example

julia> ctx = CodeGenContext(generator=:goto, vars=Variables(buffer=:tbuffer));
+
+julia> generate_code(ctx, compile(re"a+")) isa Expr
+true
source
Automa.VariablesType

Struct used to store variable names used in generated code. Contained in a CodeGenContext. Create a custom Variables for your CodeGenContext if you want to customize the variables used in Automa codegen, typically if you have conflicting variables with the same name.

Automa generates code with the following variables, shown below with their default names:

  • p::Int: current position of data
  • p_end::Int: end position of data
  • is_eof::Bool: Whether p_end marks end file stream
  • cs::Int: current state
  • data::Any: input data
  • mem::SizedMemory: Memory wrapping data
  • byte::UInt8: current byte being read from data
  • buffer::TranscodingStreams.Buffer: (generate_reader only)

Example

julia> ctx = CodeGenContext(vars=Variables(byte=:u8));
+
+julia> ctx.vars.byte
+:u8
source
diff --git a/v1.0.3/debugging/index.html b/v1.0.3/debugging/index.html new file mode 100644 index 00000000..c5a09d0e --- /dev/null +++ b/v1.0.3/debugging/index.html @@ -0,0 +1,68 @@ + +Debugging Automa · Automa.jl

Debugging Automa

Danger

All Automa's debugging tools are NOT part of the API and are subject to change without warning. You can use them during development, but do NOT rely on their behaviour in your final code.

Automa is a complicated package, and the process of indirectly designing parsers by first designing a machine can be error prone. Therefore, it's crucial to have good debugging tooling.

Revise

Revise is not able to update Automa-generated functions. To make your feedback loop faster, you can manually re-run the code that defines the Automa functions - usually this is much faster than modifying the package and reloading it.

Ambiguity check

It is easy to accidentally create a machine where it is undecidable what actions should be taken. For example:

machine = let
+    alphabet = re"BC"
+    band = onenter!(re"BBA", :cool_band)
+    compile(re"XYZ A" * (alphabet | band))
+end
+
+# output
+ERROR: Ambiguous NFA.
+[...]

Consider what the machine should do once it observes the two first bytes AB of the input: Is the B part of alphabet (in which case it should do nothing), or is it part of band (in which case it should do the action :cool_band)? It's impossible to tell.

Automa will not compile this, and will raise the error:

ERROR: Ambiguous NFA.

Note the error shows an example input which will trigger the ambiguity: XYZ A, then B. By simply running the input through in your head, you may discover yourself how the error happens.

In the example above, the error was obvious, but consider this example:

fasta_machine = let
+    header = re"[a-z]+"
+    seq_line = re"[ACGT]+"
+    sequence = seq_line * rep('\n' * seq_line)
+    record = onexit!('>' * header * '\n' * sequence, :emit_record)
+    compile(rep(record * '\n') * opt(record))
+end
+
+# output
+ERROR: Ambiguous NFA.
+[...]

It's the same problem: After a sequence line you observe \n: Is this the end of the sequence, or just a newline before another sequence line?

To work around it, consider when you know for sure you are out of the sequence: It's not before you see a new >, or end-of-file. In a sense, the trailing \n really IS part of the sequence. So, really, your machine should regex similar to this

fasta_machine = let
+    header = re"[a-z]+"
+    seq_line = re"[ACGT]+"
+    sequence = rep1(seq_line * '\n')
+    record = onexit!('>' * header * '\n' * sequence, :emit_record)
+
+    # A special record that can avoid a trailing newline, but ONLY if it's the last record
+    record_eof = '>' * header * '\n' * seq_line * rep('\n' * seq_line) * opt('\n')
+    compile(rep(record * '\n') * opt(record_eof))
+end
+@assert fasta_machine isa Automa.Machine
+
+# output

When all else fails, you can also pass unambiguous=false to the compile function - but beware! Ambiguous machines has undefined behaviour if you get into an ambiguous situation.

Create Machine flowchart

The function machine2dot(::Machine) will return a string with a Graphviz .dot formatted flowchart of the machine. Graphviz can then convert the dot file to an SVG function.

On my computer (with Graphviz and Firefox installed), I can use the following Julia code to display a flowchart of a machine. Note that dot is the command-line name of Graphviz.

function display_machine(m::Machine)
+    open("/tmp/machine.dot", "w") do io
+        println(io, Automa.machine2dot(m))
+    end
+    run(pipeline(`dot -Tsvg /tmp/machine.dot`, stdout="/tmp/machine.svg"))
+    run(`firefox /tmp/machine.svg`)
+end

The following function are Automa internals, but they might help with more advanced debugging:

  • re2nfa - create an NFA from an Automa regex
  • nfa2dot - create a dot-formatted string from an nfa
  • nfa2dfa - create a DFA from an NFA
  • dfa2dot - create a dot-formatted string from a DFA

Running machines in debug mode

The function generate_code takes an argument actions. If this is :debug, then all actions in the given Machine will be replaced by :(push!(logger, action_name)). Hence, given a FASTA machine, you could create a debugger function:

 @eval function debug(data)
+    logger = []
+    $(generate_code(fasta_machine, :debug))
+    logger
+end

Then see all the actions executed in order, by doing:

julia> debug(">abc\nTAG")
+4-element Vector{Any}:
+ :mark
+ :header
+ :mark
+ :seqline
+ :record

Note that if your machine relies on its actions to work correctly, for example by actions modifying p, this kind of debugger will not work, as it replaces all actions.

More advanced debuggning

The file test/debug.jl contains extra debugging functionality and may be included. In particular it defines the functions debug_execute and create_debug_function.

The function of create_debug_function(::Machine; ascii=false) is best demonstrated:

machine = let
+    letters = onenter!(re"[a-z]+", :enter_letters)
+    compile(onexit!(letters * re",[0-9]," * letters, :exiting_regex))
+end
+eval(create_debug_function(machine; ascii=true))
+(end_state, transitions) = debug_compile("abc,5,d!")
+@show end_state
+transitions

Will create the following output:

end state = -6
+7-element Vector{Tuple{Char, Int64, Vector{Symbol}}}:
+ ('a', 2, [:enter_letters])
+ ('b', 2, [])
+ ('c', 2, [])
+ (',', 3, [])
+ ('5', 4, [])
+ (',', 5, [])
+ ('d', 6, [:enter_letters])

Where each 3-tuple in the input corresponds to the input byte (displayed as a Char if ascii is set to true), the Automa state reached on reading the letter, and the actions executed.

The debug_execute function works the same as the debug_compile, but does not need to be generated first, and can be run directly on an Automa regex:

julia> debug_execute(re"[A-z]+", "abc1def"; ascii=true)
+(-3, Tuple{Union{Nothing, Char}, Int64, Vector{Symbol}}[('a', 2, []), ('b', 3, []), ('c', 3, [])])
Automa.machine2dotFunction
machine2dot(machine::Machine)::String

Return a String with a flowchart of the machine in Graphviz (dot) format. Using Graphviz, a command-line tool, the dot file can be converted to various picture formats.

Example

open("/tmp/machine.dot", "w") do io
+    println(io, machine2dot(machine))
+end
+# Requires graphviz to be installed
+run(pipeline(`dot -Tsvg /tmp/machine.dot`), stdout="/tmp/machine.svg")
source
diff --git a/v1.0.3/figure/Automa.png b/v1.0.3/figure/Automa.png new file mode 100644 index 0000000000000000000000000000000000000000..15cc241af63a7f656c5e95d551653d904d35571e GIT binary patch literal 88675 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¶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 HtGE9TuORwG literal 0 HcmV?d00001 diff --git a/v1.0.3/figure/actions.png b/v1.0.3/figure/actions.png new file mode 100644 index 0000000000000000000000000000000000000000..9f078ee4fa27e6544155ca3b1997e158d79ea77b GIT binary patch literal 17030 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

hH=E^Kg7BkR*v{!Ja-n43lA)|J&Qzr-!&F?W|e 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 k_Ma{O?@EFP4Cil~j_b5H}9|KMFD3=>Px# literal 0 HcmV?d00001 diff --git a/v1.0.3/figure/alt.png b/v1.0.3/figure/alt.png new file mode 100644 index 0000000000000000000000000000000000000000..36f936091e212fbb07f0f97a37e92ca6d87eb667 GIT binary patch literal 12743 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 literal 0 HcmV?d00001 diff --git a/v1.0.3/figure/large_dfa.png b/v1.0.3/figure/large_dfa.png new file mode 100644 index 0000000000000000000000000000000000000000..59dc492c6480eded454128658cefb7c140ba3531 GIT binary patch literal 19790 zcmch9c{r6_`0h4js2$soD8nXmrX=%Bh6qs^6B5dh%$aAQG9{^GERo2NA}S=LGF3v6 zC=|(9B+k9R-#OQH{ycx3_q(nyX%FjNYdz0%-}iH`H_^;Qf9vKQn+XKMRzm|_a{_@X z8b5zxpvM1|6uubX4>~6!eOyP9?GL6s;0SqE0HWFHfqv@}TTPNK=)#xcH>av(3x#4AEhk1(A{DUKR#HD)U^8 zZ!6yvb|#Uisp@7mmLK?jd($X#b!Gg$uS1k3fr>zgTzqCQgg<4vsbpyhgd$=pKfeBC zBoV(8qj6>+5Dd7;Is}5|O9B^0Y);osA`nt#HRJKt%m4r0LUddE_wV=Yh_sW(sZ#^B zoC#QbvrZNJHdAhIjZaESii?Y@Q19aR*LqEPM9Qy(g@qeOL@^Z( znrwW0BkvM<_wY_}VjiAFx{SA{HU2Vai>&*9nyCAl&PiZqUG-TORT2f+dWwmHm_`m1b_y1mj8)7sB zLP7V`;@a9;Z?E~bZJA9m^cJF*c|DmHu`JIv(r(`TIWeJs%Y0^fTG;gF^!T`LVNYmS zm`3QI?*IKwBwDRd^@x`EttKWW@7}%3k~$_XD(ZInw78g9;-yRFrKMHX)kF3E?xqhU zu|H{e)pPkcISm9^3kwT}8bbd3a+KhB?A(!l(~aj9rk3C~@g`?(ZZ2?k*gr7vOxX7L z(bnYcckkY%r=`7m{kpVGjX~ADm@rJArihx_r-1<_Sy`WsbRnLsk5wl--`}$xc^V-- z@aY2XHj?V%)2ADEEh{cuyvU~!e!+^Cx(T1f#>V#J$B);qUU5iRk=c28Qxu$@pFcD5 zAaydnHweMN<|)7-CLK}+9{ zXlX^2mWn&2rKKG@azs*0EbTILo&qg_XgAz&uEnLAe(R1{yZM#1u)oWv+}%xYs#;rp z`#lnI#=}E3eC<)Uwm{mGu)o5G%YP!G$osrTo~Q*cP7V&*)Xa5eN#8ws@0yHb^wXyi zetvQ(ZGT615h}3=FUIC}?AX!%b?D)l-QwchJUot^99PZ;1jLgkF=N`v7cN}5apU94 z!i3OQx>Wwix1!S0rY0sX)dSi_K0fo^`8pb5t2LMaQ`4>o?)|~R!L>Cte!mzrJ!q-5 zw6&Y32dd*TUT0@#lW4g(IrEZBN=sjMbewc`-6DyV>?<~X8oE+dq)PQSo)ET)E{26f zayWfDc;VYYA{~uZYFu30-Mc?tT-+Hr{ej#UReMJ~<+O$bePw&%jTI|@cxT{yMzI^#|B>eBz z9x_9;ot<4g6HoA;U!%8g3s0>sTVP4ljvf2t*b>hu$<0I`O_t!;ZO)p|qD6}R8LOZs4}?piW2F}dxUZ>zX-M{{SLo!7BrIpyW$2GSkF!|T|ptY?uUHBY;_xn1B@yQWDd zXCc5a=X!c{$Ks8Jbx4OTEc(7-jXOF!5hB$OAL{R%nVH$cdBJRv1!1=m8vdhUX?b~h z|Ni~W5!ZeaoEf?;KYJ_YWM>i#V#~@TBsf%@+etNt4jz2n+4%$Cc;v_t?Oj!I%7TKr zMRdNtz6{ZVRUr)Rq`Zo}yu9w-UV*B6eA$_r-y{gEf+8aNrlzJvvy58ZH`PKIXq(f8 zj8dn*mz9+vVVd4hWa-!utEaD@U?BKyVj^$^xj*trbW{{oZkPW13vq{!9@V}le1Y&u zL|VG*)vK}xpL%=ehZ{pS*8f)Ayg7WHWmh~i-_Nlz->KeP?}cznQBhjBe&_tpHbN{$ zZ2VK$z1#iO)jis~WKDa5ov6DH&Mzz=Qw=tJou0mNopRY8KaS8TD=6r-7kcsH1tRTF z3B%^i(d!CqQO}%Zkrz~*o-;V_peAb_Ffw}Z;K9)2EiL!!>gr-*bm(``YNaAhb%S+~ zPQo^Yg#7*d`SYDScTg0xNzW%1T3TB070ld+@87?FDofDLMuGCmf3u-sEl(>ZmR^OxN^4C|dck};@Ww1&)Dp(vRQtNWe>=~_v!S7oFV7QgYdruX zCbbS6IDpT^7s~G4TU}L!A{l#Qw0UgK#>S?;z8>idHJN?${<(+^)H#fJo&i>V(sYym^aC3Ke|8Ll*-QBlr+`V<{-Kr{kUIw|jM|roYlT!im z^1XZa&W9~d_6!aVA|bP|u(+vYb;gkyQrZIh_%JRc<+(p|W8>rF7#AwGEZEsVo)0Ni$d1iTn3uTwPr;z*8ap^2p9EE-s$D z4dV+dC=a(#6TW^u{xp35s>Qy2`&L#~@K+>F2@WGGE2Iz1uWk{>lzI8GfnYj9C_0)t zPWzOv-->UHpU+CD`k>XJLur|r4=@Yzd}n=pl2TH(4+zj=yGn60P4pD%KlJ)kj}n0t za5*!xv7w=$u(0hC&(KJ5EOOLs%H8h~{Kp8H7e}CLP(l36%1&DOuz~=dldm&Wq zy}Z0B`d@Ac{0Jk_9uj3AznGboB|>5lWHq#>T)f#leLX!ry}iBf-ygNG_;K9!Mryc| zukYUamOrB{^bFD6yQ&%*8sg*Qv5Pp8_ZRn}KqYP4edn-va;x@*y{>O!pXCuF<2%2q zpPLtylKQ#2^aCS!|NebcR1}-A@%@Jn`4pcn&(F`}BXIFt&hMMLxKWs&PgUn!J%Hq4 z;982mbfg@$v`kQqw!(U68w)45mfpRqv&dAJ+%|@6i5=;&uFscir+?);{xw+eW@hHC z{QM~O&ei_o5v{GQ{2RvU}gTRdw)5$%h15UCR*A*fB*iNnlc=EkbC3Gl`EJFT){girTW17bNaN~f0<*B}6X}d>ehYmTOJh_dRSKV{4=8_6Efl*tK)%JG- zay8|f5ytpT`c0egN%ZsyjF?eWyqqNcdU7NGqADr}_8#(wTQVvHO4p%7hpy*ri_(mI zkufbRD=RZI2cI(5ma-E1q~;&>8mD@0?v*R@5$mCw8Q6B{aiDbiX#e~7%d<~6kfbtd zEeK~FDy_Cl+5MWIZ+4JDO6a^Ixm!Zwa*_yeCn{*Ok#pxH(3DLUkw|1eR3QKGAR9w0 za`fB{d}wjU>(`)UBZh*k*~Z8tbC}s%Gc202s0bb-PmYQI=228{D zalpM_Rd?<%MCTz6Yo!K)`vu;fPUB5!ONfh0oFS&>tG@)+6*0Yep~-=`bt@{gW^o_o zBj>#pZzOM*7RaBRTUK!et&y?9mRKfZf+`k zjaGBR2{0L{HUuR*q2;Wf-wkLmik$myA9Q-?3}J=d0(5 zY;!>kNEW@O6LUck>np_{yw)O~-#kL?my2qeuaoeyy}iu#VR?SO*5FUVDhJZnW)-jn9z^ozy;hY z0UoQ1Q{TRQlk>F^`)M-h=?q;W*G#`+%}TU%Qlox(;1>Uc*rwMJCd*$LNAWCxux)fMlZ+n;9lt~4jKv-_KovPORWwvayuj?B&KmU z+)Tv_DVCO&8w*_;_y+77=x#u;EMuzMlUr>XgZBZH{r;_Aut7y|x{p#PpH=fKs39fA zRAl$4w_;^wB?kuwiPqZImQT@}tfBGL$SZVp@f5b1f#_Lx_a6`*@bdDAYa3&(SMq@r zP@*(Ra-n~IK@kZs470JYw_it%784gw?-=J%3GiDF@&mC=OiU~&aPsi*2;?RZy}`vl zofYMC-g@^$`LV~?73W(GryH=V5lwAM5H8)4?nOGHSZ? z)Gzd(+L~iBQgezzSK{JY0sd8_UVZgZ@c0nfe7#X-@1?Toj`==f`eHTpPy*EWH?<-MJMj3tR^h{qN|J9@Iex7l$V;EFOb7t z+9RQ%s&U$tH8r8j)7ICQ6!z^C5)uMH5F?YHy?l89*cMwNnk<`LmY?tF?!J?g^AUs` zz+n07pIo+LAMcTsE$DHB{5bo)`0v2&JBT1)P$*Oge@wcB4=C+!Vc~CIT9big**CYo zdGiJtuDd(c7}?BO{`$q|O8Vc5Az1QLl!?tuOv}H27n_L+JjhW!Co3W0@%%iCWx1Ue zJ!=Aa61Rt}I<~Na6qugfLPLNgLUwlCy=TuHf;TfWQ&)h6CvjW+C;*TYAdlPVToCd# zR`*xI{^Vt7q&{{ronMDh@G+$2nIXg+${%12A{=A_18|njHYwh9Y79RPKaJR!8B$

4gYbXB|0x*WirfO5fdQMv5T-6gH2zb)LTPQ#mM-zC zB@q|(F7EK3AMd#ITS|aZ&(uRX88tn;yu!b|%6^|y2==AQs{s)Crt8JJs%%ZfMmT5u zE&&1EY3Nq%-ydDSJ`_XG{QUei8*Jf_-(E=Ytcl=I_GwQ;tgQ#2ojs_jNi8zLIw1Xn zdVR7}ArO>J9UYN($L|~}O#P>O>Cz=t-jr6Si(Gs44jtMfB(%RM6vPcU{lbM;ScuJ= zH$Qg+iX7pz0rd>@17hOa zRq1y}tR&t;U_*X_I76YsPk^u$LjQQv(8NH%ba!)G^ZverFv$-Jxv?^l8yOjiKsb0) zHT%G=B#DHcDd3u79g^IM7Z)y>ruxT&G@UtfhBJPmE4Rz3visppjR+}eX+Bh@Y`*ne zt$5U{n3mD^6~|NLWjTov5fPAhA-S0x@NsQN;68jPl4h`7+Fo}E(y1}_l(F&izn)xI z8^Zp|3kVccRvvo(#zBUOTam=Z*0-Wh5I|f*kCc*>-0F!E*$6<1vd&rE&g1>{C6=n{vF`TOP*47#{JCSw1 zq~+vbjUNUtovxX~4uGVwzP^6X@{HjA6DJC@vbJX%hcA8KHpshU$AMes$;rtoLA4Q` z6gdv!iAMOEXpKy^G18&n8!yv`;cI`+a>l3dX8p=M z#5&R0Ks8A9W=u>=d)ls^yNAyVHykoEySnGZ3ueoN$A(}bkIs%ESN5!^fNVmO5;nft z-4yfBD*j3MzXJkkx~scTZh_teEZWuD052gV1RHTCx5~=N0r*ez(68>BIkh>JzfviD zO_3=*sg`lWx&Ilq_@GD>}2hbh1Wdoq^ku#3CcO;Wo6vFyizs4R@PAZ zCa0zz1oGyI{8^s4URrwE%#1Y1$<19>T-<+?ec6&yPf&qDCOB*`{C4MgFzMid4Cv|r zxM|s^poLVPXj`rl(b$SF$fF6E{-7nC(Uathkb{I=W&eH)gbMoTJisVMNz?>d>e06) z7M@pTD`eSs>^SY=ae?>8o2z?To;@R|S$=Z2dmOMeesp}?IsYrzB#Ach)jKL>##H`2 zXq@zRcWYK$ir83(PU4T&hWVT;pcg3mYKK}K;)zIgFsyF9g~2$ifL-JU&rXsPq7s?6Q2AA03Lh@m}^5ReEhOG&A& zz1<*RNLrdX-qCNnp#eS@vET9XWx>W1Dk>^~O181Q_#(~pq5R*c`IP+(AWgh-I!}eM zdItvnURYqW@1647zrWRUsMfIO*2&H*Xj>Gzo&hVMrlz*Zn$D61evGwG5|@;0b*dB? zy7pKXauF&)o9)iyE{+-GB+{wvQ1qKjMSbKv#!nZM zmYPbzK_J2}+S)9S97&vc2Zixh&|2JKUj@0od7h0WqSk54YUy-yGHZR){N`aoltL%42 z=9LvHC0H|MOnR8ebpTA%8qXJ1Kg6N%fOSFpV6pl5=~E}D)hun^Ue%yq4r4DaCNS|t zlkWg-;pd$SUS;?0W!4@K%K>kI1kNZ8dE8ha4UoIurmOds5%!mK!}C#Z6fY9(u{xjq zs%-$4WQO3?#gcAWmsgyNLeYyS-7sjNK?z`S=N0IdJ9q9JJ?Y~kOKbtsc9NU<_Dwk3 z`OL-%2=`c<=1x=wKry_KQGO38&%6W!r;$%{HZi%BlG25>g_!30k|GvezI?uc9e9YR zXw*IBmQmIYG@B$*{<}BQ#gd{R3O#tR&n6J}fXvta)u*SmDEGlWNy!;Ba7RZ+@kV}r z{_ybdc9AnFU|tYtM^EbM#iI|`ma@15DHnhU+tA>JsI|2<4^Iw7i23{O3^Wbxa1DA{ zJE`AjmO=g#V1>f}1iOhsis*R)#<#?;YrSr7*K~Rtn2RYwq4XS-t8~Br;KBYcV!N(p zXIBnPfBE9HYuB#)%8SEhj*g?aD_*tWSd)(Tz6`X~4AFl=*Fh>#PAf`Fl^vU7K``iI zdg{G>eHXCBk@;e;U^E@eZuK-@7;OSUL7?rCdBJ@8%a7?4WT6KpBrKfdCqPnOW=^*|R+mQF4%SD@NA$nDz~M@H9=`Iz3} zc)+65r%&%-X9prXb>c){cQ-j;;aFVT*j$jRRMy|mO)-cMXws%R%KP^0NoyHp=p>hH z?wOl-8us@#5~{mN0EAHCD9t~sOLw~q%F2khy(zTv|fk@`H!Gk72&qub@z{&H7gn zry-47)%%I1v;pCgXv4sM{w~irDM-tor}2aHqmWbX{#SXT=szZms?lcVwwQsz&^ z9-h>2#JwWGf1U4ypTB=hbTpYE9mV^Kqii;CbMO59eS)lv|F#1aA>gL9Z?hBfbW*c0 za~@dU#{n}{m6cp_Zlu+VP}#a8Mp*V(H3lz1#zLKsf8`TEuPeYsq{}?8%|`dO-TE#a zgI}*V9w)Sb8tUum1@xs{Vq{|S!ZjB8s1v|QV-TpXq z32U?#!yt;B`}J8%te$rAILP|iTpJ$``?Ik*XejONqJo0XFD`IxtSxjwo{9@h>+o1q z={<6ZTZt7#GCe)o4eDkK6q)WVE61qMJ>GA>c~MAEKnExpR*5fY4W3iwWlD%~48nI) zs!PR+3G0p>gM(m}z#hnMxw)W>eaJ@%5?l}qG&g2GKR9}Hs`tYOQCSx-A{Zyrtvx(7)n40IStTUlB8JXC4NAMfuub(;Oq zDri@sPHZO;TP!Q=(LQ(c@u{k>Uq$Gi z4Jum$w{ga!tDs3nBG|HdGZX~R*>|_hL=THE;U(J1B_(3PZ4Oxu)dTI^p;$RuE#S{^ zGQNi|qK0FCFmz$gWp*Kc&_iiI_#^cBN>d>XZ73ONomiH8)^a3w- ze=otu$LFX~pq4t`gR0YfQ34ESk|!o-g5rDdz5PIK(=-t&`FsKc{#k~Ida_X*Ug@62 zj$a~PbEMBWI!5uTs;H>!&3;9})bIw}r3lO@X#qnd-d8ifKiR$#XIzNKX#zE-;p6Q$rg{jhXBXDn=fwe zo<-@O?Hv{5jMu-!y@Fm>{z>Fv0F%ka&R!7Y?OV5Qoy_`zJ=fgf&)=JsU;gFWw--*8 zSOlROQt z2>OUdSyG1myBVUT>>J!LOWdC$$>(3Y6yLg)e}plAql41k2IZa^dKh;Fy=~K6_53(P z@#imI*x1@KbIHK9=oBE@w`$;6c>zL72(lfnk)_q4#v$r3Hi-b_uQ!x zB?aakol80f$&mS=#`zV+VvHQg?^bV3M#$1?QDFR=Tn*`uztrHlLESg}t^WkwZS)+T zuCLzh_Q5oR*@1oz`xOFyf!Zn9(k^cD@brXVr~B?S$^r^O{n@d2_Qs^d#8Vy~x}Dv~ zs(P2W#q3&GdZkZ_ii+OBdh$GX#`-}BNpmu|2*hY!@)kvlK@#KJx$pF4Z)VQV#m-Q7 z1&l~`Qh_KN5Hvup=;-K>BiNJ#yH{BZ&-sitZyHsi6k#a!XhiUYG1MwRdqYOPrWR7` zJ^v6b800B1&eO*p9eQ>6Y_n^ z#fvjjw})sGPd;*ay(9lCUMWMwn;I|neu=x9soegt`?|uJSPntrSmtia-~l%E+}Wuq zC65m>e!P#M6hj?@H4L?TTaH=7-y-x&zkRC>3`CCsK+y?{Dh^~Lw|6g_y+C#IY!N7eQlEBQn!!Q}I|FYMU2Io@&6J%xJ=LF+M_CUxl8v44=Vu**Hsra>D8 z-aBMk?d6h#x$6HQnOI54%gZ0N0${U;Wu&dGSi#~CSSi}b!1EAm7%yV+Gcq$JrKQg- zq+y)V8~zcjtgNvdbTNC}y2&8Vixaby&Nd7#$X4Ai;OT*|fAzJ?t}JFg^%{6?o-^D# z%F3^*8p^&IY!Pzk_ose)H+JOFbYH_*&|(Ak)qP3U*xwvlnsYfH)1VUglUvD05O0C< zglyLwDKA5W=)Xv{1-Wqi@AA-@r>MgGJya}k8=O`A2s9zI5T(+@7qP}KB9fJzEmm_m zD+^A&tvlswej8|9;g8ZJadNt$ec~V!du4js1F?f$o7Xq=n}jrpn*Z{$*reAl> zxH7U0Mp4?q>@`UgdKT-Q!GO(Ws*T?eK`M(jnw@2Z-f`#Az(xe6@$6ZaN>B){@4>5L z9LcwC-;Qr`V4&5epDRT}4IL;M9cxcd$%}e_vCn&s@Tdlnz$T?jCeB~D5bOA7ZDqmj z1hiWN^$?cTheY7)k~??K7bTe*8lu;pv*$$oeT`l=XJ==y-}*<7@-`l!a|||zq~IQ6 zdaI}?C?sT;Q|!++!_6|H83J9o8VO_y%Me%wandFUzR(E7o7;LU(IkqAp;>jcB9rVM zd22aeCX*PBR@i^qq7<9LtrXql5HLG@QU0cqFJ1g7=u+S>hYiZidH-GZqtIk}o}89BMj2W}P6kHIL}nzW6R=z`69%)f9i6neD6 znq)3`u#nO-Gr__sy}C<$v%h5p{~P&1LDpQ=bJ6lo&MoKxR<*Y?G+uij2Adf=znJ-_ zPc?$+lDa0KZUM?d1UEUl^z)Mn6gSRzbaCLT5ng-J(5)T~3v0w)s;g5{?g|N6BU0w<+V$(7K7A@VT-rVo-8ROf#&fZI(+zLdPG)?nmVFkpHlc?uxQ*Pw!;zGA+lVjxvw95kZFQAFJ z9o3aHzDI1xR{BF=Jo4H3^9)e-LDA05J3CHt>c)VW4B4*eW#r_*2r>Qrdy>5(8v`v! zB$V2C#~>gvr|~*{@ELSf(3^YaR0-71F=dbD;D^CMxQ&1T{cqRi>c-PjQzf^~&&{P} zWVov_P?$}Xb0Wa-wQGZj`MJ@S1e5mzZ{M=>@oAju6_ns`2SeMrb9XP}X)iA(A`y2E z#d3OGzx~Y{rp=q1N4=pJ;m$RtU)J7+b#F<4C$C?#RvK!7fg5N|MBawi@o7%oNEjfJ zl3pUcWE;B}8KG`-^oro!6j&Ada1*tbi_7gRSKb3pg4_xF{D7{|&SIgW@)+1J@OD?U z87x&0yN!&DIOD@YLv`cHX!*g=*WTX#{CN?+IKv;RIYy_*ZQ|x8N*7}dQ2v7nifb!m z{?y3~ECg6NV0sADN$3j5B4~|PT44@hTmnA-RCO{rAt3?s07o*qRMP;*ww70ObI-WD z8wqEi5g^)RiiV~l>`9H&Q@AVA8Mt*LxtoJ)A_Q1aRHS20DIdy6{W`>&v?md;9v*ln!FTU0q?&NOQg~t~bu-DfWQh3#D3=KKno;})gOl6)znm4R<^2N-kG|d@%roGdjGp=X)IBi-S6HVt9Cg^|Mw(` zL}d=E^3kIlEaX@$EATls+uRcmpiBTY=L_G%Nl_gFtYK~}`;$lUz7lP4*p1*;MC^<`#k zY%GL!#8beUK1HubO6Ew$1X-H~9!W}02CGjZicosGEz)v%5j`J1Ji=mtPm5>nU}5QL zqCN`2X=1zM&^Q!S>`qu4K!bneab|VC?&?C#s6(H{&h8@x)>&9=*|Mc4#BV=h48sNr zL4#FY-JUoSZo9JZyVa60NKP}}3QE4d7WwlLE02k`u9k51oalzym&tMi35+T?LV2hnN_T>vE9M%Hpq>h}ZEr^cbc0{LeEI!Sh(;ZeAGUy*k*9o&2P^XP_h2ho6q__gY&?nCV}h8& zNaUeSoqj7SkOl>3CyC?@L$q$|RpZ-fX+4T2spgZ;fh^gXj~AYGoaOt#Ag}` znpZHIoja#gbuw3zEGI9&c?Pfoxa(Gro56(JK-EbQuW5&0t)t$MphB?=KxmkE$f4l~ z-{O(GM-835*f|Wu6t5p{fAtDg@2I(XFM`Qh0zj(=P1_?!Ky005>u%kOYjS`QwxB>j za8Frz`A@VTpj#rjh_Y|4FU7_R3JQAO)@CGBYmJHsRX$*5u=T6Yc1fF>)9=K^GY9{A z5tJE`;sK+P*SLs!Zf=wH{y&rzZ}DqM9jmYL9@XYZ#yeoS44inwlSchN#y-#-5Jeb( zz)^Jtuq&@>=Yvh8c8tSd2h+sy;=*|wgFV2qX!S(+dg=&yxji2LlYXiu<$d`T1hO! zUo=T>y$AE2(tj7EKtwo^4o1Ex?R>Iy9KIWw6qmv3xsL9COz$FZm6w}XSolK4>Gg+; z3@vGMe7(JWI2F&NuCSwsLC}~~eF04ao4ucVQd~2> zz7-HYL^9o|O%CnY{rdrsAYq_RK&~|yDva79pxGReEdTK45()GM1Ww0~{+#f+{8wC?um5hYvtTJ%AT|>}Wj1Z{^^?UffW6YH+M=Ks+F)hoi&VGL@ zMx^U=NqXMgtUbYqho$e<2rNu$iRmWoKsXw>)w9=Ns%si8pe*Pjg0&y zaHSJrQbN-NpOsm=s{m*bq#6kiZrPccPphgmhaF@%k@k3bdC_)II$Y;5PzBB-A|&*6 zVxk|1g!b)&u?SEP+BhU75RY=(hj04&*ci8HIJc*&g)AF{$?~oYUAubq^V}a)>o_U)$?g;nKu7%9r6`0vWf11{C4 z*KKcvP?2?5u@ldB=V{?YM3}rBeQuYjfdQv_sN&n?lD=4(>{n<73W$u=o*5Z_%^ePp z3B+>!f??z9^7s1Vwa*h66Y9e}SqL48NiCzXJBnbP_ACy^2{gm>j0~N8Gs;;XPyKMs zl-nlm84&TOe*6G=!p=34ab(HudJ0CLn8=u@J6P>%n&J|tP1}wxBuk!pm3$J#_n^q_ zHTR_zYjd8Jg&~$NzHoL6R!2s`>tm!N#o^Z*Fy7`T>pzG=(a_MehEt9O0FMz{enDs* z8fvz*wmt`I>#twGfHbg0a3Vw??R={fY!AQy$RZdYY1_7U!`DYXenjnX0R@9*{rh<= zOK);bRh2faC{9~^Ip~)Q-)ovd5e$n_nr7(X1Bg0DE(08#dc1rBkoD$1_xGg4=k~nw z=U+2h6eAgEk=VJpCG_mh<1iDHGuiA=4CH+v@FNqSI_2yGXZ%^k8~5(blv!7!Hu%9{ z{^7%iE!(AZ_wR><;tu2iPK{hfqQ#`aFQ~4d@X+6r;=tIux3I^J)lO8CwtaB0Ub;el zGcCnWjr4D!%P8 zO_--*qme1>bi4)p`q2{YOJIvE32V5<^aau&gdihETvd*PdUgADxy^&kjIUHr^%h~8 z&tHZRbVJ!+Jk6j1M%9Ub9x1>l0%?Be(hU)V2K7p#cI zN0?esnu)v9++UfYSsfke|iNCdS5ca&oZq-Lu$x@7QCMx8X-;3-9`?!{Y&0 z=XpXSTu2FD_sgM+!=n*yhX#r@)#NEI94+Eh@+rD>iAh<@J%YB~j5!@trl?2`6U%GU zbPl{&SC>}#$`Q*gewv^HB_*eRgoy$>LTTX<#j&A_$UZn-(60Cc=Ld8J&O*>+wX<`r zv;rDTa16rB(4(5P-NGS}nwhz+!?vFanhEzFC)%pu4=ct`1+L9QSyEP11X#SOdakPY z$;ikj8CDBU*Rb#^}?F8TZUg+I~~6B0TJAby_U z?|-8B{B4x3U3~Y8Po6g^hE8A(tStUmLFkfmbTQRn%e!~` zBx5I;tEs6ZEtQFfSj)BxTtIr@tZB581_iE_{H%#;b5#4WOVN*#6c?xTSaE>JRH1*T zfh|2fEyx`wQ5ZY2>fN&4nL7X@jiE=h9XOGJg;q<@Efh$5b|n zE!3a2ta`$EGDTxuvnC$WJwvR#sW|_Ent&ObQ416uK3Qi5WgW_VJ97RE{XXsmyPZ2W zXy}Sh%~>Q*$T`jV*3eDTJ~_Pcw6K|Nz?{_q%98u=DF zNqXu1iQ9LOsZjJoa54z!9V~;=kih`)dD>K9s!(mutMap$q~33v6dOgGRXh`ZQM){1`qb}^+mGdgtCXmG%M>DU^f``PqZlGittS#daOfIyqk4tDkO;^pN0a9ur5>FgI;-jt2`ugTq2 zVSfVvn%(zU2@2`JGGcMtxM|dzGXC=?!r1ORNN>7roIQ`|26BNo2uf)%l=IUZ)|8F) zFh8a;kVotoa77avsn<8v&^!vkmeMvdFkr|rfoM=$W5*hUss)o2uqB|Cq;-|<;LktP$|(mMDKI~Dk55X+lKBw-B`E9 z;f}DuK3x6%meZRb>nemmVUB>T2Cnq_^}RDM7A{L@#upjluqVb2=Np!0m*?^46h{SY zEzO;v($8c<5xM2>eX$!5@?aCl-Ow6v4`XwGC|m6pgY9+Lv0<9PLB_%#Xwafp=H%|a zd)}x52d!@Hz@Zq>h=jH=wCRVXoBjN7oXR}DZR{V`R)&}m8+$(Rk5N4wh?_RW!Ah8a z5=sX);^Zft96>VK0cOqSLPrc7GBAl2qG#g75Lg(F6~$(unP4`;L=%7G0@NZon0|O( zjEm5y+;`(=>aU>me`Lbx}#_!0=jAC%_;AUS+__r7oZ+qe34^(NMXxud__MAx9|L= zg|mo4-$6kd8~=eZD{)_{QTr|dDuE^d@>jdi_17k*rh&e`Y=xyI7R5L}n=jc;wFdxT zE);%QlmW~#yA2!}IPKDU_ud51Fe5Yb!~ZOCFqbI>{UWoT_W4Y3zEhER>(&xh>JxOu zf$Fw5Z+=3y>0Q2KfuR+QMU78PR9lsK@sjpKB32HVz6#L_?ex~WTA*dt)=GQ#TDa}m zyB7|gsV8UBqdS~&O6y&F`y_G+HkGlF5iH49YjV=5HRD%Fs9)f#2x_y#hf#~3M{nAK zH7S~T%Zvu0zU%EbuV2Hd-TWpk2rea9#si^@z~GHi3(pSQV{v3_=K}^oDT>k(Sc8EQl^(z|``R@?2zdnsqoI<3l6&`# z96H2ek1lt&o1Eao(hq3xtq=9h!5||m#9zbsCHDe)+4vV|re)xb-?|!We54Jbt zNdzVs(I$F&9QCxEE=3;{s$x&p`HWACW<>l5E-*Pd>geR;18xXxiD;Z2ddMvKg@%Ky z6Sf_@8kG)Y17^JVxHy>ZXFgOGR&4Eqpn!_>E4|gpzk0VIZTu(_1hO9*vhzWzbK?AI z21GiYAoSn|d;3r`bCmsG!jTUH2z;3K_Uion`FHNPp(h3Tr}3K}AAP&oaeWJm1&C=F zF5(x5RB$*Bz$gsI$eH))7xz70e1isx{B_9&sEw1IUZ|u<`jj(i4)27Z3L^z{XOU?0 zCDpXBejxhL24L4l3y7jewTyxyA*j5D8>VJv)Ep)v2Wi^PHZ(0Q1Ch;;;81R{{%{9B z!eK5eD=VB5b>3MI@P|$oA{Gxbz+uR6tDCw4`E7~=Kmmzd?-xlYhpInCn^Rpq9GD!$2X^mw@0M_rFj>PXgRy~OFfcM|(R)zm zH5m?3X>P~C;HLjB^ycePTSG(F;I)8n0Z#`Af~5%_jGxTsu}qVGs}x7q$455q%K@@Y=WQN}U{^O6lM{^_A6Ya3hO3KQE&CSuq!bln&?d@bXIYn-!Py6B8 zh10&t0p$)V6v7^nhC78!;Mg8U9p!*V6JP}L1;tV0rH)n#)sxRc@|yACtSAQX@2tVn zh&QjTg+^)S0WhC9aRM)Na-y86z)AGN!an=Mr}!a4=)@CGEpQN9tR${@(g?n;h?rwiY+eEqlq+{Coin!p%@$OjM~|*TA9Is~)&wPB&vz{q-PUWpBsD+wkS# zg7DZ9)fDSYkX>Yhdj+)=)o}=)F7`g-MydWGgC$TQdouyeL2 z(`%W*gNS^qGLVX<1#+tVnPEE%i(NPV;4tRZgoHMHUhrg}|4sCP;EsUXi*b7^+9t>o z=*meRYoj-TKJvmV)G}&iV-uf{ z&~x?Z!eV?%Gu-qG47{@tT>Kgu|KT15XtELP|bge*d0>=MPu52qtOLzik5~4~M?BC*mImFNt#`gY9JAw1}*w z+OkYIr2EYpeFKPt=H{E3nISdT`%YX+NT9Ee#Q#{wiFMpC8=y@92`{*7tQMO^3x@)b zpkuF~1&kI@lG@PLNv)!LF_G#C-f3H=I55CmjROHCh3fG1!m4^-1Es^f_Y>5f1{&azx;-=XMB5nI3m8mC@Bt%H*aC^(J-)`icX zBQITKo^+=?PJ>Q3bKfkJS^ZEj8Dh|pr4 zPtT>NVE?Bxo4TQHQ7+64K1$>@;^}+Fj^5S9u=70bGVOF|- z{NP!Dfde%IA`Q%YWi}5=m(H%h081T3VrPH5qD*B@Uv`-)I2HT)&9!}nJ}t>FLmjCP2Kv{*Y>+Q+N*6N5gUy@Uta>u{F8Yjm^Vv#Qc5*gAwQX%haLo`9me5%TiCa69|1r` z`of|igPvO0f)x7q?fK`qg* zEjBVr2M7iyR`Hp5#t{k~x>?BOy1KED`7#f{K|Veg^r?c4yiM~ALw5+IH{3pMW0!(L ze@n{=@C4k?o=AVof%a;CaAuC5C?5LxCf4Gqgm9#!@r7NfXJTt z_$cl2WoOUqc+JR`Eqkv}Mo6*>g^-nu*B;rM5JIwN*)t=1m%i&c z-}n1{o%1`V(EHraeP7pqU3a+p0|i2S8hjKAMX02R)hWxH$0NaDJUa_#ck> zeFZe?AM($~#++Cb>LyAFeNWpfWi!=A@14R}=f5M$wX%1YA}$eAyc-`t%gJGp#Gzi0 zT*9^x=sN2#ac{pZqcTiQNMjMnD?iNYjkXB5gB4BvaETPRup)+t4VWv2lW0yd-Mx*g6wYU%|-~dauY!9Wh43ta$}zp)w?# z9KKs*#@POd$HW2MyNL>FQKv7^EovReRG?@kq7lI5&@EK&c0c-U>^ND0r=+CRKQ`8x ztC6|ga+zM5m3&n1cO1vVPaeNCJ%0bZCiQ1Ks9QYE|CFuRw7K|rYG#I>KH!hrt(h=* z&OnCZg9q{+9s*A`#XP=`*@?Ta1_1N zRVODW%pZMy{p0!9+{7d#fi`^~TH4z&9d$XX$svFKJiE=zY(843Pc7p5(O^0pdBz3r zqp7C@MTWvmhGu3A%qs6uhK7dM#l46xwCvfwNlm4@PDe*VO4_>ad9XD@Z(?F1;<-kC zdbnxmka~D{h(bjxHkP%TYhID(Fzbw>`}+0k=YQv0|JbqdQ6X39UYRud%;lu{%P1*@ z5Auf+(RWN%Ixs{lCQTY&Qpuu@&}}WX=tQA{E)y+d2(R&B%gM=!xGzVLuUc%G#Qjdm4GawW2L|RaN*GPl=W?6A zq{$*tTIa)q{Mp;=|se5iKd4B%+`SZuTseH2k z{m$eh&EwkZYH5;77%NLl*4+l@|6Rh>t5;Flmpcobf^Z1!HPcKk{rBSxJUqlG*VTRo zCSMH=lJnDb?l=Nz)5}P~6urc{h;x&b71yxJ@t%>ehq&Qe<=U3G_hR#8vUufTr1Jq z+&n|+A;o_$!qCytLCy0>I`u^K>FN0rGb!U#Jg=ca zyfVJ0l%t3`B3}0KW4;?w{)NZJ%(3ZEQmUFqP{VK2(n^k}1_wz~MLq2uOA`{|wXYD9 zXliLiCnkpf{Ar}Eqth}xOrD*c{i&ityLP4|yyjboFT698m>6xqpPkExTQhG6sJMnj zRE9=JJ3a?qoSUD&ASET`@oNyH^w)A7sSx=mPlT5H(%wAToHRTCbHXDi*#3%w!*#Cp zlDN-4E))za8(T|TC=m%g{ToyNlS`wcqvK^(1a+S4IPgjBrQE6)pnY}QVDpriW20+p z@BZB%QhS${_OH87S66p%y3se!Wv1yi|J9F-j7->qND`lw za^sg@R*R4C78z8&`eM#oTVJmQB~8<~=oWtI`?UyNX+=fcrjun_Xn7^hF%>LnIP#8& zYe6kRmv1pLUNA4!<6LUOPM)&hF%WJ3cP_@Pn)I^Bu-bfWIM1H*tTmW`n%5lrnV;WI z4|j8J<;K5Iq%~t|J=ZBWHaB^lCIup$Zc08o=4ohX*oJ~>9U9V_YUf9~gYU+T8(!P9 zSX?FzxSX7vkt2I^q4e{|I}0`5d(2k|2}ktzt*WpCTWr$-C+EIK-@=8jsskH5KpE-$s$6w}^3F|DF3?mwcw@R?A8fxFE7I-DntHQdUNK5$B5Swi3Q$P3NNu zo?@fg3}PHrGGb!X?8)X=3JQwc!a}r_6=wcu%`i6T#S0pv%VcagnZa%cYdYyMDP;rTsPKV~URvi|E=%a0%R9e%zt>BPmw#ZZP$u5<{5QFcJ_ z4W!G4G8gpq^%22i*oVS$HDo28BTJwE+SO%Oww{gp+}lg2nWt@)6d$jfnQ-sFW~6R! zZ(lRoF=jC@rEY3!YG6pyyAx7fEqt3)DYM(=zsGm?^ay%ZX+<8No$ZA@gAac%V5gbc zWBuPZJv=?*DD{LcwS^D{B_<}u^nU${3u}wyO8#%x`iF*OH8eD0N7;yRiHV6n>REA7 zz9xa+#NVJZbSt)I=iqPyma??6O8@kUxVE;oe{>W3^a5zB_(Bcbv5^QP%Cv2H37kEgOU^| zOBrCjjEoFoDyqsLkOMc||}yacTemKD zb#(!ycLWnq@whLmkW*1*0-ECD`cqtoRNu{nG~h0qM|*v{>k^qB>3GsavFZ?D_9?&PJ4$kGBVOIsR-^I?^v9! z6_fz+hh=H973r0}fa4oBAE}$vV;z}4g|9jTe(GjwLaDYI%w!VH|R7RrW z2-@DB{a}6U4II5~Z<3(rVM?)az5M!ENsir6c64UuEqy(`x22`Lc-R*PM@EdU`>O-Pl@1U2czGE>pONARTRJ+b0QW2|E~3+(?czC2lm%;QYOd{@ z0q4kHwX&(Uu}F)^|6 z@$rwU$wB}yL5jC!?%l(B?C$P%cIb4Qg=JxPsfYE>9W*SC*KY7OHV#hf=%}uh1RfsV z_Q8SNg9lg7j~9rp&YDKezs#qU7V_b30nmc6YJM<9OSwyRR=`$p^OT*H-ht zY`NEz8fS-_;ZT$N`&oM{eFfi4)zzipTatDT4ns|TXEgiHUqXDlUxtK`!eL*(UdZaMOlzgAb@VlYgg52El12xyI6baW`_#J%3)T)nP{ zvYr1D&K~+iM@L7%qT>n_(>~C(P!>D0=7{4=Q>sW*rl7-UuFA|Ovx~ph)&_sLG^+vx z(Cnnw)Vv2dqo|+|3Lq*g?EG_f3E(Il>E*(rA~p#L<6Hhb(^s5lnp9mH4=8JEYI3hc znKnI3baZl3f>$7t`tx!3wHh4|?|V_tHMC~lJJ4hpzP|bP*GjD9gJ}Wh`ZM#1iX4Xt*tUNQvTw2!7>JAmf;7_U*bJFnGh|Hfm*MWf{rBE<&-PXot~4hNuNwz>kIs zi_WNM>6;&+#Dp6y_D!Rcc+6Tkr1mCk(xRK1{ENJi6Gp8b%>+WXc;NXB42pI8lUZ>2{DbS5BF6J_B_BZY_(bh(T zo3gaCQvxQnW!^gPS?*1SmYZzw=I3^rYYn~~r<}|riD8RoWL%qW6jMzRDK$CY-Y=q3I-j% z=5e^8&*bao#_PE@9RBC;-{hYxs;`Ej;=B6$x8p3HLkD3$2ch3~zuYC%(mY^?g*PX^crR)FEYzGmGv=VT)w;jLrx0{J7hwN=lqa2$4{{FD} zZH5E~(9KZV9vkDO*1IZ#k84vpqUi3^iF$m@QA=aT=n%P^EYYi^+G=J2F5-UXaFLq? z4#4^dhp{~f1|_`RoKH}&Xy-)uUe?v?BGT78cP{jexQ##+3)QN5mO6}aLFr$;A)ag5 z*V~H`a+>T1HL=c~;rU7%_z~I^AN*z+2!0R>m`end0ta;rfd`PSS++IPOyBv2UO`)1J9e5_iyput@|Hr>Y(Ys=D|k!t!#9$rNYeB9jnsMA zR?}H=$BN<9wUxVf?;Zo}m)Z_6ViwdF78Xi@kbo_ks_2DKUcSCE^sH!YAYs0Cj ztIG)ZcaEQI#MMb<`V31-s<~q$a!7=knOU#O@tTm!bOh8r+lHv9==;0w%vH`)250Rg zG@C1pA>dEL!8Ujs_u-K-t8Yy=j+FJv4Snh8AVp1gA9=2i0z^o<_`S;RUvz!5dJ^Rm zj?So1wOi_rdv%};nD|QC?S7OJL?dtY?ksb59gj7i%UuY34nk_wvPt0G?(XBVs;X=? zslVD?=c@y^pv}lhNHm5ri@2Euy|y1stLPojE03)G?f|bR3!mo!POdWkK3d?}u`5W@ z!Wd3|{#Y>Bn_%fS5AtM&80FB53k$MPV|o0h2OA&i>&3V?;f!7OH>P3h6@i7Q+#h>* z+y*$V9NvLvPC^vMY1))BT4JgOcwFQbl=Qr?Wf2;)AaN*w5$Rs-E$G4KWXtC%faNOPBN-eFTBYc)WKlRqOIe5PSIh z=UovoF^&mPQ3USp?hycR8cVS31>n~4Dks_~IhbA`N26|tu?v|q07$(?{W=K zZ3|ml+^0{U!WuayQd3gY_4LACQ*q}%D;^2ghIPKX8rk#xyZp0f;_`4x@uG0*aIT@V zvyURbGyYm%w^;2@7r*z|&F!9#kEruh9j3G{nKV%)gh4iB7Esl5`Cxzl3y6~E@HZmp zrEa{YIxp-JsFt`sM#^o067R~AZ{v&KFZ@x;4(%;D>%=0 z8?dP%1qB@Fj1JZQ`xwnIG zb&HL{zkK;ZqxQD2qqFleG!3L_g$XX6yiYdt3QZbmK)E~i?}1b2;o(sirK@UaxDNa* zK4*`snMZy<{*H$CPEK?*2`YDqa^Bv^$VlDDD59oDgvl2?tJ~(J;0RHkAYZl_NNQXZ zcpqq{EP(Zqb^99x1O(F`asZ0TDl2uW3((rlj~r!@cnBATq@xo>g@v||#?j>M$cB85xnm=l?{W z)EY&(uY8|dcq0`8@(zjHK7HaLr=%P`cC@o&yCL}umzI{6$rp5a?7_2P)yf%QYjIz# zt4A?0G30I8kY-dS%+$Ku6dF|GLpHN%)yxiW@apL^??8Je?P`6-R-hqXzf+I*$;oXK z6W7el%pmK^EuT*C4TO(^V-)<*SaKC!CIqTt4x+ooDea$npqIU!z>idQ2o*e*u6J9I z|CS_3fX0U9LLAP(%$%)H+tt&+ngR_Ac7|npK!Luct?eRshYpw%ysOIt7P-kd&4dFd ziw2BN{^sI2SZpk2YiGA(-DJskt*pFU(4<+LUC!0@Q^z{ibA+aqBuZpJ#0Gu1#VA(~ zy82E=W+oCG0$I#MnD88MirYCpHMN)aMK%W00`aT`fmV5W`P};YYakqYQ@?|_$)4(} zs^v<3$PmcM$vg$VIl!C$BE}QHCZ1#Sk9Up1GK*`>VZo_LIUTv zeRwFZu1*Z~Mc#Pl;>C*?8v=ZM6ONrCqU)Xa7^AnFA~Bk5eEj_XEnKIz5yLbHhPJZF z!819oX9*c9AoB|e2?>NH$Hu5K72fFn9A}JHeD{Hqm36k#!ZSKH_M(lA&Hk^U%Wx9J zxWn{SLOeX5VRc?YvnTZ+`B^bL;$d&ztPpNN@c+qu<$>$JwG46uC8u-XD6_vq(svQq8mb#X`W8rY4Xeb;sAhA z6;)MU|3AmpyRS5Q3-!zGRmkvzZ!*G%$=w<0?Nw#t!q|(HgbRteOpA+q?_#q&NKwz1 zVqn06bWXECG0(mnj0fs?j#@fc(d~L@SQxJ3&l(b7IIs1hY9uA|*qSzWdXWFxzLE+T z8;Qx8AEbo2Ep+VEb)v}Ka-fiz>T7GggT{;ng&`<{aX=uTLEm|H$Ap3Ch*SK6NCY+S z1rXTq4s-3P`Md%Gi$z5I!omvH*31Z;@ZBaLBy0y!$K!kGSZGuWDV9%kfvETHA|4!c zj%80zPY?vNU|_hLyC)DQy&x=ydZ*$eSw$+$OMV*V4O92qGkuo2PgKk z(f47Ovx7sAA@Kw?WDKRCa8c?8?axm4?e^D32qYyX?F%@Vm@c8b?z4g`BZTowY z_()?mGB^PKfgj-!5-Q%S1*Xk6GS}4A4S~_n$I_mQF|o0wk6Pf#FwV>5dy|}On7O8| zv(iJLvGuby2>J1E|K#a>SSVlbd>7k7CQ(Sld;@KqYmjDUV-pJbOicN+kYtD{B9|FNX9vhutq*?JJn5?$)QzGaX_x(WQf zS^vj-k)9+ly;Bw9q^F>`1OYCFD*#*wbce&A&(~CY0Doymtm{43LqKlb;@}|QOT6-V zPvag0hs1PrQ>!=JVKqq}*SaRkZ73wVscN5W8bl^zW^x;SBTqhIeQs&N0xDz|7S^R- z*~ykhhebpzdM0OPW~S%lgh~RP#M(qq**PZD3D^=ty!HKqM1kegCr>)SWYFk5aaX51 z^zx1kfGAY0Cf_>~onH#UGXyErR9r^tWxn3tW)Ls*F6y+20N#Q%|8mA0`Rdh+%*+K^ z?L&j_zI5{~O)26c!ft86YTb!{&PmR_91VSF=vIHsow( zPEL`4eC!i2pKx91ApGFf_#IqLI!vfmC(3hLbxlm70PtF2rh84oA~%`jmi#Q3+E;$h zQ9O?0JYXA1fJYtW`_?*PkVtV^rs*q`WPgcia}o>ba9!gG;Ukz94>$Sw<`))fmw~P` zT&O=8kpqbZsZ&1~j<^lTQCRS>UyRL6QhYZB|2c`Asb9$kXae z7zyN;S(Y4ZYzz=>8&@Yz@QRy|rr|DW{-R0ES;QG zAwO|s?pw14IEVLOWnj41Ywze_pKzI~lY`!yF!1T>}J7Pc^h9S|AyMi0o8Kk_UCk+HbBc)j*xwy21r1iG5p934JYMp)v!MQ@{ z6Ib`jt`V_lTU%n#rHzF_mJ8*lyP$L#0Sk8z53^yLh$kjcf|Ue{f)UGDp~SnFFR|^%is=aHMBlx7{W@;&_e`@IUt)yh z>1rnO!0R9{VqrQX;diRt^&ufa0i0zz9HfT5y*tKcV=FsYJ$NuZg(_Vz|X{GI%>IyaYrt;X;74jhYmAr#4EQ1LVgmw|tgtZ2vkm^i(a~%eOqon#?kD5|(GP=gop$_~otvMZ0h}ET3VLUu zbI;rY3hTv-7f4A|I*cWKVd+?J2YUv{Y=GpRCIK z$;n{>5w)|MBHv=P)@1;l!Bzkm~lbJXaO zErr6`dodoF{_*2;-68`y7*km~J3natdzjqKJ%Xg5kWzy@Ze}3UP{}gMf)HI?TwGC2 z?afts$wIz9z+&6wZ;4q21^1mME7F0lguN!Kv$9^EACv?{!)rmH2IdI^#w3p31JoRh z)?(x1M;+W_xfc!|!O-J2Ildi`1iReFva%S6Zjiwcav9;z@eZ_ZI*uAHK+3?kM1JJ< z0?;j|K}8tof1PDQ0)ksG$b<2wqpcsTEgR%I5>t@kV(%{{n2zTDQTrgC&U8N>8Khv{ z1TU8)?#&0Q3`Z`i)VZ%*wX(6%g3$s66_pl9A(-}QqS4rXd%eN}=3j7;5g3eRoSmJ? zZ`?4kFa~FY1oAP;7>~7KHq|D{1wtz@kpGRVLI{DgZsdK_f*uxovhmTZEd&zio8f2~ zsP}XV4&8o;;8#x%*7x^+X|c1hrN4TG-wgwu;bCo%S+|i384%%qtPw);a%4;xCo7h* zVww*j3Ja>jbxtPEw4nr-EH4SU*?~+oKAE+#GBIH~oX`RQfj9ur_gj$~icI$8N10jq4 zmU5SD#_x!(qOx*i#~^}I1;84a%|U>V#6#<&MM05~s;PZ2b4JoluhV@t@G=_U9P+gB zp%EZ7<%r@cjszu)efhG*LPsRr@Im>XZ3=s)yzz$_+uFzc{8v?u6F`3NK&`Whh`a|+ zETC%&E5C$;69ZFYUteE9%OO4Ei1_;|Dp!#38fMLr^im&?dugS0a0fshk_TjP2`MAe z$J3`p@}EO|OO&B>{LW8SAhm}~{B5>svOJ_LoX{s&`E|5XIUshe61LEG( zzdu4(QBLj>jL4%w5klZVbNBIW_|r~Rpx{fGdx*NtVMgTgbl8`sQ=! z!)%qr7tyyAUM$ow``nVhufUbCuszo{-sC5S*v@Fhmms*?y1MXWL#_m-rltF-yipm%GY+?$EU~mP9KD-c! z0vE=^&mWYY&VbBfyStJ23&OUa^-tB@UYEgmFC{e{)_+4Q z8$)D03-J+h{|BbZ5WGjibAiC`!BsKRaBMJ{05Nb4Lay3*ipFn>Bxpbn5c_RPN(9{1 zfX_v07S1C#H&-3|yA|KHIuQIY^o6#^W7LQ>8S8@UVvia|jhuBJ8o<>mVIsJQ_Ww5{ bPo!%66#ifllCi=~PLz_|19Y*>qZj`Jc*E%i literal 0 HcmV?d00001 diff --git a/v1.0.3/figure/larger.png b/v1.0.3/figure/larger.png new file mode 100644 index 0000000000000000000000000000000000000000..476f9969a86830551696d836573799eb79e64394 GIT binary patch literal 40695 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 PpNV6qn#LF}-v0jpHFL#R literal 0 HcmV?d00001 diff --git a/v1.0.3/figure/preconditions.png b/v1.0.3/figure/preconditions.png new file mode 100644 index 0000000000000000000000000000000000000000..f0acde4b0627f525cfab76dd19b09d4fc9e4ba1e GIT binary patch literal 10979 zcmZvCWmubC(`_I?k>D2G32w!;xD-tHsKlrM003QHPD&jBfQy8EwnavQy?(;(4~D(LxvI-b04gU) z{{R3?+4552njUZ`*(gt%S~p!)2BAbnR%}HDw2W!cAD>XRdgxJ`@gnvrp($}zdW?bk z`b?Gul#vn4n~}-yGxE|UngeP-1h#5tq}WDzzV3U!tp6F$DEa5om3lR>l_{751V&mt3CGc$Ci$ zSacyvZ#z4Pd{GB|K3iY2Z@UL^=C#Lgdcyt`Ap*+s$sl(}Lst_3cJlM>%2dyOMz}0t35E z?F#*5?*X0#-QJ3yzigT}~Fe_5wdoprg)4IW^zu9H?U%ok1d>)@pQ zZr$PO{^E2m)A7q2Qm1$8&$oq%W&ye?NHDW`cLI)!`Sp6J(>cP!?Q`$MP8z%clP|K- zxNJqTRr(-_DZ;G-@rs2yUq1pdh2vVuJBIeo?v_7Nbb4HvzvjL^4N~}=cl$lxEZ#Be zRL(I)5wKoL2tUD&yYu?E*!g%hDYj8nHzDY^P_E}?#Oue7Aig5D6DQe*MI+|0%HO#e zM&gB?`q24&;+W6eY2J_8Ijbz>N#*cs@ms3#q1b&lrWX}`v*2cw6P{l<*%xH7le$Fn zF1MNe+CeT5HyIEs9Mk7Fu;qd)?QY$BGL}?8ozGU_fiU{)mu=O&Ep^98D}7eLhTq?l z=V+q0F1xY9m(ZWA3XZQ;{?DV1?Kca4Js~K~M?Qhzsn?lr?;D_=+p|g-dyue2^m! z5p?}$cF^}wBX=gBvV}gHixVRy%_(rOZSWX&Uoha`tp3^PWjH0aN{*loj8uB+HZ!i z8s>ma5qVsPYYy{8NS3B|(Xn}+?PBHEaV;qU#9+LOc!wpJR<+l8 zu=NB+RHY!@UPl!r{mw^)<9r*d6%7me4r^|UN-eB4$2W^6i!M!({Iu9ni^kqcW%gq`=&clX<|tq)iGtpcul{55he;S_#N z89xeam+b1s>+NfDTny|Rk{<~4U1!zJ12qzl}mCO-*AB}5rAnUBS>fc8(k_{{L`^SZwGSy z9{&hL6&9K0xGm_tRQF;qH_-|L#H^<%*|#X3N%)=eN>~5{N{}3n0>a(q&dU+z=iOA3 zO8RCA{`yEP6m~QIxgPnXU2^6ULSv8av(DES{e?zH6ZV>K^`|f!{?dC}H3I7Z4$Y+^mjPPJ;G6!0QN=e@) z8qPmjkS`x(TcD0I_;CD|J8bq8yBd3|ob`7#iBZFl zbAle7RF`DA8@Bg&EHtK%BQ88p?Db)?1^bPE#DR2qI?Tnm*2=dh9I#NRJ0gu~RT#*Zp`?uRRRiBi4a;ig$oU3fqtc2 zQKK6&sUjW@kY*IzRpEC6*DtwddEMaqGym74j_YsiKiCma9r?eS2bcgoS?~J>C8!rm z*=1@TwH?3=q5pEZ*ol9}59msI-OyENC@B_pS9#N>6G8+2eK9InW+#DBt|o%Jx2F2gnE>Gi#ymR^K-DuVLH(Axu?Y znsmkDPcZtM0?qPpK;ZoE2nO1V98(A&(*@!L-1!-iEy&o1X&o>aiK#n4U{x!KwagZ5 z&4Gl>tUOi{=UJI>`f)66b0CJK#CY{yG6Dt@(F)7#BT46*!jJyf#9^ME4b&;Z!4M4EL;sq}ML?1lw`OaTt? z-|11N%|N4L%!1Vrxvcp)`K>H{ujvjki(GXm~Gr2JF%u%O_%dt3Md z_Bd<5TZMs+qknkk*|6R^zA(CZ-DQ+@t>vilh!W$Vn37mU^r6VFQomuO{c1vp7(4Aa zlwTEtTzCncn0v@9NmYeILQUmZeS>+tmY(hn^W5?@#O^o z(*zUuv##seJMIgtAeMDv&)2hSu#~;;b$y_g;N7Qpx%@HLEmrKMDO1e911CNAX$L~Q z9(vFqr?MGKk?=IyqJNGK zghkt)e>lfjqS}KB=_UH@#CZ?hXCDh9o*ci&PwbuwK2^r;Z9C)_)K=G9!zKgS$y%Hr zz8DQv@z{Xn-T+DLsskf)Y+@#*P_;he0L)R9^CVbih>98#pn^ZrD7N?YWmuJj{1djEcs$;p2J-^Y_IH-I|^?SUx@M?}TZs?3D5Tx8{82HHpQz)rD){z&4R%s;>9e?_V$rL;J8)?lbQamNx$2-ck@+# zTE4myVy`}YUf0(1tVxH6&Xfgoed=TT29E8!3&!5|^E$sjY{XkL)%&j4H-0)u`G-fR z-I-GClQ}6*j11@}qHdt6h`*(azf;4dXORj~ys{BMjE!By{GL46H?!M^GFC_eZ?Ew! z-YI`;={Rk>QhtSDt@}~-&ehT4LTZo{(FG6TGiwT`U#!UOxl7OurpR@i*m)PQp@X5i z-A(~Nw%_3Z3~bxB7>HIAjwKUXK!fOB(^Flyu*-QFtU;F83$6%Xzap!f`~7+86}^U` zVgh@TngUBnP3KgnSYwv5$OYE@AZI)-60+`|P_(uBPqV8qG+RV(n{~c}sF{M}%G1Ma z`VGK5IUF+!fB?tV__575DP0tJoM|XmP#{^VYU|ry2R<$eu_OJ~=Zpyv`XFL<`uH&E zZ`>TX-tH~5K#>K^LZGHw7Iq=vg3{==UhR#;N|w8P|i9UtZCR(og<>gpfT8O)-4dq70s_VRsLjUYAY(k zx_j=+9|+d~%EA{?>_2B3c&y#snLtCI)E3`pE67s#))Ur^%;jKCBa=isb(2re^%I&L zhuX?lJb$r69;KO<_d*HXN`$hX@om{$7+oaj^u2BocFN%^QP-$q(`c(Cuq~o})R+>b z=D6jW*6>s-Cp0|!4nw&h$)1IW7`}B~lOhs_CaNzyYq@n+T0;~~Y3t$u zEvjH9PlU7UeRM4m+g6tA#HX~{2N)1*Cv-FwAx&qfuWf+DyFc%X-U-klu(w~UcaIm8 zsH)|Lc&iBS60XKcz-0kN-+~1xe?#Qq{IY~G1{R8$^yGd)-`^Fk|dq5d{gGp{@Xkro(3-{4OZ(Z zskkf}x+-CF^Azi{P$#s@vRJH~P24#*wXtaAo~^*t@i6X4a2=I{AfbMmvv?aKVg8Mw zr?Ta+6yB1z@HZ@;*d2OQH>;=*;rB|{JXY`OEj#gFTwE#`Tl<3Srs@Dr2?@G#_|dQw zVE-7`XEy1-iDsfYVfApit3;$ybCbjk_K`$(p0N&SDs+!CjY2f4yQqbGg~4F9riEzu za}7ITh9x?a7Q(?cjPQkpkf0b)`Z=cGc`yd{{17U%n}1pUyh`RvS&hGGYX5pmxu2(5 z!XeEFprk?YA&Ccy!DLp-537yI_VINL^BdCdEWQd1NRDNoK#80SMo`5O2@e#ihsrd= zvXRK6DoV`lUDem!7LB5eDh-+uF0QtojZJ?={$V_`PiQJ}2xctYgoOZ|yXK|`mPZiY z20!u_1pD_4?{EmYQQ8zpxoDp9Qth$}^?g{qCRCzAy>`@RWWUGy; z+AbBS%`=P`a_WuS?4R#C?%KmJ5DlDIXhuRkd{IRAdxzUsc@K?ZQvnj#se|T0sNL4w z)$v%7aJFgXK|58d@%@f|SD9fLod1r&#u<}jz@h~?v1O>{%niSa>?x8@y!Mq=%aV@s zFtsU&YGOpapK_w?e=WePr_2A{H};9mmPFsDpxUr2ilAyzrrRu>EM*aYD*&biBS|8Q zVYor8P-|Zw@oIQRdY2x&#E%j?K^l6b9FsdCF-wt4GS14esc}av4of~g%)NB90?}q7 zeWPeAF%Iw&RGxs#mOd4v*!iNrS4_oE!5>YHXFnIc_k{i;4FPG4$ZSDca(dq48}PLa z9^?=s4qXbg^|R9CdL1(EauExp*yIrP3;iWGepKtqMZ@-C+=%>1i+3-NRnFdlEghd4 zdX^>ZeS5sDiv3P=nwisTZW|9G)o1oG+btzkm($Y|RB&?vT!M8DaMi*M-M9K8yx7r_ zL*=Xc00=U{B=P(L#D@Xss46pE7tUUNpCZuxN0Jzscu_a8wgijMeD;M(gS&o!s`Sbu zn=qN<7_fc?TsFJz%S0VLW+yVZm|d&ty}|nhr8_+FAnup^ETU#?vsNt{94JvANBC#FHyJPFp08-Zja)1?*QWF6e=mG}LC)SbO22h%1Q@$@Kb&``M(9ZE>LjkLrUFVX)TesP6K9J+;uJ9 z@H;wxw?X<`??5a|&X2 zLn~wide}{R{{oo*)~7PQyJ}!d=7dLp2Qf-tp!4!R6^dD z0p#xyDQ@}x$TuM7_t?0wlnuf|$t8J3-ri_=IN z7=knu3_ZUesD%JirD*1t9;P{KBP4Zcoi*zD@3KRgwV@ zN8{V*Pz&m{eWH+iBW|>>6LM^%igrCj6YAok=}>VxO%hL#%Sc(-9!0JZ-_We@N*{%y z31i;$nNs4--y}XHKGBmE_mx{>Z7F^qcJX_h%@tI8vVqT}cs`I#=AJe);#8fIGNj%4 zgcs7x(%?YML-2^*N!SQ0+V|ateR|?+{bu1&HVQu}dQ$YYC?tYwI*U-uG0NVg-23%h zIUhh>4)QlrXz|R$itTVTQ^$)8u_mP;Dcrl->}BNX$3v?4lOGKi#y@CpecR;jy(dB0 zImUlO13@*1EXZagN4-b~mgvoGS%_Np%p~M;-Zze+_Uiy-{pU>M8p%Qsy*F$ zN^DJ5GL+yx;OToGkhXSM(nmL=^1{h>`7XSlRS>8BwxP;bY4lV0Q$OIIrt>pE+181Q zMkX3r`hzc0hB8wV9yO6QO zdriDD_0-F+3ralMJt95RobJ%~qi{`{>sL*3i8p=T@>bp40l}KF929OzvrNDnGOB5Z>GVr$t{2@+i~s zdPItR0z+*yVjgKptHL|v*xSL!UTP3xM^WcoO%m!#^d!PIOEF8iB`BY5!X%AVHc)u{ z`YkLgSUZnzG{QRIQj(z=B&T_SFonEnBs4_gn{FoIwM)xTO3i3BJt2(s?{CG@K_&dG zD-K7H?i>fy3KXzyQ|9SZ>v=yi-)1213Gh4Z_93tdOgOraCqAO-&Fb zz-~zXodN&Nc{)P<_-K!nei=TB6!7dzzzr$ITVHW0%CKY!UDr)q^X@&MIQ~PG6-VJD z16D=iV}BNQq1)(lPSSAnam2NTLtCZG-=4wHfWYwp*ngw5Ky@V$-FAhva2v5t^TPV| z1pS|U(6Ljf?XVi;rX^V3G=^f`|Vqi9PbKv6?n1oKOS zR*vCoKLe)UY=w83k4P~^p?I@p21l0H{>AH;4U>kqqq1|Nfg6QTsW!8HaNcFSb|GAU zrM?K%Y{OmTb4vdyM>_ctXNq@tclvJ5Mmneo0~_R_#r9eo_3 zzO)Ini*_{a@H4G&G_EWQgnY{jeGT11Dk+Wts^=uGAwfFN{|^2yzG2z7fE&U^vH2Ne zy1Os+4oshzjrl~~ad3xG?*8;;3GulfpoIvH8%TmHR56SX;h@qr%I3b*>k1^`Ml2xy zn#{`SLWO~H9|^0;+sELuw%=-K_?As=pWAeM76!`rcJC5ZMD=P-20)a!duJiI%1#Lp z3ZpYVY7N~;&uH5N<>*HREI@XWH|ThcTYZVm`R2Z~KhJDF&>0W@_{v@`a?Qw)Ch#4~ zue`f5^l*fJU=epRI?OR&sq23bJTstE8eCpe!{LqvKylCa0zqq}P*i7^tgq(adc29+ zwU68tHR=oN(ZP7K!iY56REPY`6yi|aproC#J@dsjZ}u|rAB zs(kZTV{0ee0qTckRE%U}W1^LM4f)@6AjuzGEcVCLscf-bpw#qe@x)YD%%T^Cx&DBo>%k zk>+mt&BCJY$3*u_a!bV7txf#&zYC0AiJg{P-5qb9d-8ddkhd`=v44fB_Kh~(zP8$Y zzj=W~W{C$Q{aE9sBIS>F6`W*pf)CK>ikBK2p8IB8khOB2LKCq(1GH2Dzi{9t{`uawcf#0_n5zHr7%(phBDuvYb8amF( z`bv%+%pi;X>kO28(VQ6If7k|w{5+_eGLakOBy<9qZK{rY>#1NRYTf7&3wt<~u5mcz z;6CdC7C1ZTgdIt7P!N-8DKlUC9fx`xmo_LRdTON;9QfnM1;0CTzC)0fgL;K_BY)Mo zLEh|s%jv)p1j>klTQCMJ%;k8W{#ao2*o9>GNvv_Wk6Gx41i8PH*b|Dk5W2`jHu^K_ z_xgNSHg8^8J-{B_O1{9ygHd+4k}gF0E~0gQdNov)3p`Ev1Gy`!xH(s@OT2-_Lb)GP zt~DLjx9K$yil(|YI)ZEuOd$v(V9mO@sVg0pG2|ojeY{AF!%_WQb5c3vOMd&h8BU>m z6K|^0e=)jAhekQMqlqG$LeFtpuS7meYSLOC%CDVO&V3v%mFky z%?DXCaUd!l*Gl>9<+qV2Ze zJLOMwLx?L8U$SK9ebl2Ujj2LFa?K^x3Cp%AOxK2Vd`DwdAybzv*JEA|d3vHvC2H{H99_ zhqV!?`UMNcOngoOFc>szzwqpS7@@J=?tvvT@|&agZ@SDYH0ZZzFqImy{lE&cE!LVV zo`+}-BZ{^P({cHS>a374-XkuicG~RNEK0V!-plP_9(eiT$q6q=nx?(suR#b z0j;ci4&*HySdFW3%TMAu*jm%702PZWbzkv6fCp%!W3MbyX%0U`F~^xIN7cQ{`Q$USKe107i!k>BEOs6esMYrtHVaxRVH zNb_vDMe}$BEtb?5ESvDn-*t!QNNL&MPtHwP#4CO}#5PcgU9Ufn%F3e5Oh|)N&>OUn z!HX(DFWWx8+h9yd&3X5&0`M`{_a`ClM%&YMbmqYnH8JZWvi-L)3|;>1=(pU*^=b8C z1&V$NO=P=&VY4tU0Z|f7H!#)_4?Cps(81xi5m*IUF6=s8NCFLNtK6BZkTNb0z8o2* zoAhQfls5KU@H54e1QW$jo~O>6G1#eLzpsvJ}~ie2gHe^)uNR z;$)qi1_~VOsVI4;z~mIEm4#;xau;F27g!-n2{?@Sl*!;!a6dG5=j25t+9AH*8*u;2 z10^(9FHu7(2g<-P&wWpUB-L5e>?F5^9~$RKd-B_NTGZx2c^&^&C?Ya*5mem1#c(KZ zsfqe4MKu7=d382b3;razN3FN2yGP<-SrH@%K^meDJ4IP`S_tSxp)OG`fR@KJt8I6` z5f8ed>&Psi)Sgxr{-j?xpj}P@g2Y^bl{+Jii}6& zlCyN~Fx+mD{h`xV86K{Ss)&KR*jJNPkns43n8IdM`on?FN?$uHso5E8f^3?Kx{m?s zmX_+_YOHvERVyKL#Qi7~qEsODy(jyb4K<38{T64FnzPWTo_u2^Lp1;(KUd_L8qdCk zzpQAgez6*w31uG35MVoM^#iBz+GjWjIarW(@~e3zb{o!n{RR1lEiQ3McH3XJ@H{j%jZ>g1sC<4l03rL zuBg2zz&?YBsRWzFEKSozhNK=7X+ro)5&uSx|FT%*`f_(vOPK1ypR0`T6R``9po}b) znzk>_KAm&Y_4%-Thn_mz*cZB-skS>{J<} z-9|QUv^!O)SSU80SS3$C+|1EG5CiwK-E(lFF182xo@kkx2{n~j{{*42m~+L{(_^w7 zxTrb}297!7ME0J+=HbThOattTH++9ni_}#u5c)EmDWez#8RX|lIyJ8wu_KXfGmX|AD;NVY8=87%9 z)75YAJrB>KVD9JV2zRpPzn@5d3-N1a>!j0cJ~hFSSbaYfA0%4s*RwC_f`MomH-5e9B0 zD_J~V|6zsxI0iio(Zp&BD-2x(iRT{?y|s$&*w-bSKLP}N!}rp@#f6GuGi(K15<4#s z#nXt0QYFJC+tf>2Ayai9RoI;mo-YO|a(^MP8~jw<&B&6VoleN*b2N^})^%<*2T0Qt zFvxqCl}O4PYGAqK6R+mg@AO4@B%_C-18Yje?ZKuUw7&~+qRjp9bmeaT%*r;$_F{^y zrk0T$SX+|v4}K*p`-`XS-~WhN;D++3lbj!f9f|XnD*o+FeW*J(SNqHJ-=j0FGVSE1 zvU3~)#e`0S3Xq35r*Hp7D54dNe-;KO!Tg&iDiAn8kOdw_SBu!dw2f|3hsx2y#o{1G zcpNVCgJyaGkk7(D1pwy5DF|bT9gI#c$H27dT6RsF&7l_{A#(Relb)(z(dDWHK)hAO zfMD5lHRx9!0@6_G`;eis%9at7{)H@p%NYS|Y-=y|nVON&1$sj*1LvZD{g+B7_`a2YUmQdZL}iW6jQ1-)rSVpFpcY%=TMAv&RHLMat)=ai@Rtt}6=* z^a074@Xb|5xZ{xDJUX!8b^7yA zg7k#Z=V@u>&+*cK%_sUujT3*c>eWi!;i{v(Ta~XJ*i3x3ER5kDIe`?((6QDcTr&S+ z8(yYO$tG7vv1KoQl|D*w?M9Xs(5)5xk7}3)50Z;!5gDJ%5m|{~8}huniV+Te`u5lVk>FQYhTkR`b*WAZJ_^SHoijz2LQ3w0$O3L1x*n2dz{8I zY|N%%-Cm6%rH=Dw5yoSCPe%@|$4V>_r#%=)mZqAh==+cTSQG?zS(GS|tQdGefJJ0q zH_kg^M%hw{*f*zrg8?Ocz=eoGMqKbsy8DYz=)DwhGZ#|+<4rOI!d+uC)L_fY$BE91 zrLWk_Tw9ce_`VcAVl+EQtQfmZPM-}E$i z_>`li|KnbInE_7WK5(xFBcQn9r1O5fLD;9naKm_CY6Wv=E7P^d|A}S|fzz;RoU&Y2 z{hyxR{v#w1={Ab~Z;56G8%CiirJ&FMrwnc&@byh#^>XScmUbhIwF;1zR+g%iFb(=Y D&<^cY literal 0 HcmV?d00001 diff --git a/v1.0.3/figure/simple.png b/v1.0.3/figure/simple.png new file mode 100644 index 0000000000000000000000000000000000000000..f3be227b37d0d8a507bb007406f3d32677218171 GIT binary patch literal 6574 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 KBBDgx(Eook_1@S3 literal 0 HcmV?d00001 diff --git a/v1.0.3/index.html b/v1.0.3/index.html new file mode 100644 index 00000000..3ecbfebb --- /dev/null +++ b/v1.0.3/index.html @@ -0,0 +1,48 @@ + +Home · Automa.jl

Automa.jl

Automa is a regex-to-Julia compiler. By compiling regex to Julia code in the form of Expr objects, Automa provides facilities to create efficient and robust regex-based lexers, tokenizers and parsers using Julia's metaprogramming capabilities. You can view Automa as a regex engine that can insert arbitrary Julia code into its input matching process, which will be executed when certain parts of the regex matches an input.

Schema of Automa.jl

Automa.jl is designed to generate very efficient code to scan large text data, which is often much faster than handcrafted code. Automa.jl is a regex engine that can insert arbitrary Julia code into its input matching process, that will be executed in when certain parts of the regex matches an input.

Where to start

If you're not familiar with regex engines, start by reading the theory section, then you might want to read every section from the top. They're structured like a tutorial, beginning from the simplest use of Automa and moving to more advanced uses.

If you like to dive straight in, you might want to start by reading the examples below, then go through the examples in the examples/ directory in the Automa repository.

Examples

Validate some text is composed only of ASCII alphanumeric characters

generate_buffer_validator(:validate_alphanumeric, re"[a-zA-Z0-9]*") |> eval
+
+for s in ["abc", "aU81m", "!,>"]
+    println("$s is alphanumeric? $(isnothing(validate_alphanumeric(s)))")
+end

Making a lexer

tokens = [
+    :identifier => re"[A-Za-z_][0-9A-Za-z_!]*",
+    :lparens => re"\(",
+    :rparens => re"\)",
+    :comma => re",",
+    :quot => re"\"",
+    :space => re"[\t\f ]+",
+];
+@eval @enum Token errortoken $(first.(tokens)...)
+make_tokenizer((errortoken, 
+    [Token(i) => j for (i,j) in enumerate(last.(tokens))]
+)) |> eval
+
+collect(tokenize(Token, """(alpha, "beta15")"""))

Make a simple TSV file parser

machine = let
+    name = onexit!(onenter!(re"[^\t\r\n]+", :mark), :name)
+    field = onexit!(onenter!(re"[^\t\r\n]+", :mark), :field)
+    nameline = name * rep('\t' * name)
+    record = onexit!(field * rep('\t' * field), :record)
+    compile(nameline * re"\r?\n" * record * rep(re"\r?\n" * record) * rep(re"\r?\n"))
+end
+
+actions = Dict(
+    :mark => :(pos = p),
+    :name => :(push!(headers, String(data[pos:p-1]))),
+    :field => quote
+        n_fields += 1
+        push!(fields, String(data[pos:p-1]))
+    end,
+    :record => quote
+        n_fields == length(headers) || error("Malformed TSV")
+        n_fields = 0
+    end
+)
+
+@eval function parse_tsv(data)
+    headers = String[]
+    fields = String[]
+    pos = n_fields = 0
+    $(generate_code(machine, actions))
+    (headers, reshape(fields, length(headers), :))
+end
+
+header, data = parse_tsv("a\tabc\n12\t13\r\nxyc\tz\n\n")
diff --git a/v1.0.3/io/index.html b/v1.0.3/io/index.html new file mode 100644 index 00000000..0a5e3cc1 --- /dev/null +++ b/v1.0.3/io/index.html @@ -0,0 +1,120 @@ + +Parsing IOs · Automa.jl

Parsing from an IO

Some file types are gigabytes or tens of gigabytes in size. For these files, parsing from a buffer may be impractical, as they require you to read in the entire file in memory at once. Automa enables this by hooking into TranscodingStreams.jl, a package that provides a wrapper IO of the type TranscodingStream. Importantly, these streams buffer their input data. Automa is thus able to operate directly on the input buffers of TranscodingStream objects.

Unfortunately, this significantly complicates things compared to parsing from a simple buffer. The main problem is that, when reading from a buffered stream, the byte array visible from Automa is only a small slice of the total input data. Worse, when the end of the stream is reached, data from the buffer is flushed, i.e. removed from the stream. To handle this, Automa must reach deep into the implementation details of TranscodingStreams, and also break some of its own abstractions. It's not pretty, but it's what we have.

Practically speaking, parsing from IO is done with the function Automa.generate_reader. Despite its name, this function is NOT directly used to generate objects like FASTA.Reader. Instead, this function produces Julia code (an Expr object) that, when evaluated, defines a function that can execute an Automa machine on an IO. Let me first show the code generated by generate_reader in pseudocode format:

function { function name }(stream::TranscodingStream, { args... })
+    { init code }
+
+    @label __exec__
+
+    p = current buffer position
+    p_end = final buffer position
+
+    # the eof call below will first flush any used data from buffer,
+    # then load in new data, before checking if it's really eof.
+    is_eof = eof(stream)
+    execute normal automa parsing of the buffer
+    update buffer position to match p
+
+    { loop code }
+
+    if cs < 0 # meaning: erroneous input or erroneous EOF
+        { error code }
+    end
+
+    if machine errored or reached EOF
+        @label __return__
+        { return code }
+    end
+    @goto __exec__
+end

The content marked { function name }, { args... }, { init code }, { loop code }, { error code } and { return code } are arguments provided to Automa.generate_reader. By providing these, the user can customize the generated function further.

The main difference from the code generated to parse a buffer is the label/GOTO pair __exec__, which causes Automa to repeatedly load data into the buffer, execute the machine, then flush used data from the buffer, then execute the machine, and so on, until interrupted.

Importantly, when parsing from a buffer, p and p_end refer to the position in the current buffer. This may not be the position in the stream, and when the data in the buffer is flushed, it may move the data in the buffer so that p now become invalid. This means you can't simply store a variable marked_pos that points to the current value of p and expect that the same data is at that position later. Furthermore, is_eof is set to whether the stream has reached EOF.

Example use

Let's show the simplest possible example of such a function. We have a Machine (which, recall, is a compiled regex) called machine, and we want to make a function that returns true if a given IO contain data that conforms to the regex format specified by the Machine.

We will still use the machine from before, just without any actions:

machine = let
+    header = re"[a-z]+"
+    seqline = re"[ACGT]+"
+    record = re">" * header * '\n' * rep1(seqline * '\n')
+    compile(rep(record))
+end
+@assert machine isa Automa.Machine

To create our simple IO reader, we simply need to call generate_reader, where the { return code } is a check if iszero(cs), meaning if the machine exited at a proper exit state. We also need to set error_code to an empty expression in order to prevent throwing an error on invalid code. Instead, we want it to go immediately to return - we call this section __return__, so we need to @goto __return__. Then, we need to evaluate the code created by generate_reader in order to define the function validate_fasta

julia> return_code = :(iszero(cs));
+
+julia> error_code = :(@goto __return__);
+
+julia> eval(generate_reader(:validate_fasta,  machine; returncode=return_code, errorcode=error_code));

The generated function validate_fasta has the function signature: validate_fasta(stream::TranscodingStream). If our input IO is not a TranscodingStream, we can wrap it in the relatively lightweight NoopStream, which, as the name suggests, does nothing to the data:

julia> io = NoopStream(IOBuffer(">a\nTAG\nTA\n>bac\nG\n"));
+
+julia> validate_fasta(io)
+true
+
+julia> validate_fasta(NoopStream(IOBuffer("random data")))
+false

Reading a single record

Danger

The following code is only for demonstration purposes. It has one important flaw, which will be addressed in a later section, so do not copy-paste it for serious work.

There are a few more subtleties related to the generate_reader function. Suppose we instead want to create a function that reads a single FASTA record from an IO. In this case, it's no good that the function created from generate_reader will loop until the IO reaches EOF - we need to find a way to stop it after reading a single record. We can do this with the pseudomacro @escape, as shown below.

We will reuse our Seq struct and our Machine from the "parsing from a buffer" section of this tutorial:

struct Seq
+    name::String
+    seq::String
+end
+
+machine = let
+    header = onexit!(onenter!(re"[a-z]+", :mark_pos), :header)
+    seqline = onexit!(onenter!(re"[ACGT]+", :mark_pos), :seqline)
+    record = onexit!(re">" * header * '\n' * rep1(seqline * '\n'), :record)
+    compile(rep(record))
+end
+@assert machine isa Automa.Machine
+
+# output

The code below contains @escape in the :record action - meaning: Break out of machine execution.

actions = Dict{Symbol, Expr}(
+    :mark_pos => :(pos = p),
+    :header => :(header = String(data[pos:p-1])),
+    :seqline => :(append!(seqbuffer, data[pos:p-1])),
+
+    # Only this action is different from before!
+    :record => quote
+        seq = Seq(header, String(seqbuffer))
+        found_sequence = true
+        # Reset p one byte if we're not at the end
+        p -= !(is_eof && p > p_end)
+        @escape
+    end
+)
+@assert actions isa Dict
+
+# output

@escape is not actually a real macro, but what Automa calls a "pseudomacro". It is expanded during Automa's own compiler pass before Julia's lowering. The @escape pseudomacro is replaced with code that breaks it out of the executing machine, without reaching EOF or an invalid byte.

Let's see how I use generate_reader, then I will explain each part:

generate_reader(
+    :read_record,
+    machine;
+    actions=actions,
+    initcode=quote
+        seqbuffer = UInt8[]
+        pos = 0
+        found_sequence = false
+        header = ""
+    end,
+    loopcode=quote
+        if (is_eof && p > p_end) || found_sequence
+            @goto __return__
+        end
+    end,
+    returncode=:(found_sequence ? seq : nothing)
+) |> eval

In the :record, action, a few new things happen.

  • First, I set the flag found_sequence = false. In the loop code, I look for this flag to signal that the function should return. Remember, the loop code happens after machine execution, which can mean either that the execution was broken out of by @escape, or than the buffer ran out and need to be refilled. I could just return the sequence directly in the action, but then I would skip a bunch of the code generated by generate_reader which sets the buffer state correctly, so this is never adviced. Instead, in the loop code, which executes after the buffer has been flushed, I check for this flag, and goes to __return__ if necessary. I could also just return directly in the loopcode, but I prefer only having one place to retun from the function.
  • I use @escape to break out of the machine, i.e. stop machine execution
  • Finally, I decrement p, if and only if the machine has not reached EOF (which happens when is_eof is true, meaning the last part of the IO has been buffered, and p > p_end, meaning the end of the buffer has been reached). This is because, the first record ends when the IO reads the second > symbol. If I then were to read another record from the same IO, I would have already read the > symbol. I need to reset p by 1, so the > is also read on the next call to read_record.

I can use the function like this:

julia> io = NoopStream(IOBuffer(">a\nT\n>tag\nGAGA\nTATA\n"));
+
+julia> read_record(io)
+Seq("a", "T")
+
+julia> read_record(io)
+Seq("tag", "GAGATATA")
+
+julia> read_record(io)

Preserving data by marking the buffer

There are several problems with the implementation above: The following code in my actions dict:

header = String(data[pos:p-1])

Creates header by accessing the data buffer. However, when reading an IO, how can I know that the data hasn't shifted around in the buffer between when I defined pos? For example, suppose we have a short buffer of only 8 bytes, and the following FASTA file: >abcdefghijkl\nA. Then, the buffer is first filled with >abcdefg. When entering the header, I execute the action :mark_position at p = 2, so pos = 2. But now, when I reach the end of the header, the used data in the buffer has been flushed, and the data is now: hijkl\nA, and p = 14. I then try to access data[2:13], which is out of bounds!

Luckily, the buffers of TranscodingStreams allow us to "mark" a position to save it. The buffer will not flush the marked position, or any position after the marked position. If necessary, it will resize the buffer to be able to load more data while keeping the marked position.

Inside the function generated by generate_reader, we can use the zero-argument pseudomacro @mark(), which marks the position p. The macro @markpos() can then be used to get the marked position, which will point to the same data in the buffer, even after the data in the buffer has been shifted after it's been flushed. This works because the mark is stored inside the TranscodingStream buffer, and the buffer makes sure to update the mark if the content moves. Hence, we can re-write the actions:

actions = Dict{Symbol, Expr}(
+    :mark_position => :(@mark),
+    :header => :(header = String(data[@markpos():p-1])),
+    :seqline => :(append!(buffer, data[@markpos():p-1])),
+
+    [:record action omitted...]
+)

In our example above with the small 8-byte buffer, this is what would happen: First, the buffer contains the first 8 bytes. When p = 2, the mark is set, and the second byte is marked::

content: >abcdefg
+mark:     ^
+p = 2     ^

Then, when p = 9 the buffer is exhausted, the used data is removed, BUT, the mark stays, so byte 2 is preserved, and only the first byte is removed. The code in generate_reader loops around to @label __exec__, which sets p to the current buffer position. The buffer now looks like this:

content: abcdefgh
+mark:    ^
+p = 8           ^

Only 1 byte was cleared, so when p = 9, the buffer will be exhausted again. This time, no data can be cleared, so instead, the buffer is resized to fit more data:

content: abcdefghijkl\nA
+mark:    ^
+p = 9            ^

Finally, when we reach the newline p = 13, the whole header is in the buffer, and so data[@markpos():p-1] will correctly refer to the header (now, 1:12).

content: abcdefghijkl\nA
+mark:    ^
+p = 13               ^

Remember to update the mark, or to clear it with @unmark() in order to be able to flush data from the buffer afterwards.

Reference

Automa.generate_readerFunction
generate_reader(funcname::Symbol, machine::Automa.Machine; kwargs...)

Generate a streaming reader function of the name funcname from machine.

The generated function consumes data from a stream passed as the first argument and executes the machine with filling the data buffer.

This function returns an expression object of the generated function. The user need to evaluate it in a module in which the generated function is needed.

Keyword Arguments

  • arguments: Additional arguments funcname will take (default: ()). The default signature of the generated function is (stream::TranscodingStream,), but it is possible to supply more arguments to the signature with this keyword argument.
  • context: Automa's codegenerator (default: Automa.CodeGenContext()).
  • actions: A dictionary of action code (default: Dict{Symbol,Expr}()).
  • initcode: Initialization code (default: :()).
  • loopcode: Loop code (default: :()).
  • returncode: Return code (default: :(return cs)).
  • errorcode: Executed if cs < 0 after loopcode (default error message)

See the source code of this function to see how the generated code looks like

source
Automa.@escapeMacro
@escape()

Pseudomacro. When encountered during Machine execution, the machine will stop executing. This is useful to interrupt the parsing process, for example to emit a record during parsing of a larger file. p will be advanced as normally, so if @escape is hit on B during parsing of "ABC", the next byte will be C.

source
Automa.@markMacro
@mark()

Pseudomacro, to be used with IO-parsing Automa functions. This macro will "mark" the position of p in the current buffer. The marked position will not be flushed from the buffer after being consumed. For example, Automa code can call @mark() at the beginning of a large string, then when the string is exited at position p, it is guaranteed that the whole string resides in the buffer at positions markpos():p-1.

source
Automa.@unmarkMacro
unmark()

Pseudomacro. Removes the mark from the buffer. This allows all previous data to be cleared from the buffer.

See also: @mark, @markpos

source
Automa.@bufferposMacro
bufferpos()

Pseudomacro. Returns the integer position of the current TranscodingStreams buffer (only used with the generate_reader function).

Example

# Inside some Automa action code
+@setbuffer()
+description = sub_parser(stream)
+p = @bufferpos()

See also: @setbuffer

source
Automa.@relposMacro
relpos(p)

Automa pseudomacro. Return the position of p relative to @markpos(). Equivalent to p - @markpos() + 1. This can be used to mark additional points in the stream when the mark is set, after which their action position can be retrieved using abspos(x).

Behaviour is undefined if mark has not yet been set.

Example usage:

# In one action
+identifier_pos = @relpos(p)
+
+# Later, in a different action
+identifier = data[@abspos(identifier_pos):p]

See also: @abspos

source
Automa.@absposMacro
abspos(p)

Automa pseudomacro. Used to obtain the actual position of a relative position obtained from @relpos. See @relpos for more details.

Behaviour is undefined if mark has not yet been set.

source
Automa.@setbufferMacro
setbuffer()

Updates the buffer position to match p. The buffer position is syncronized with p before and after calls to functions generated by generate_reader. @setbuffer() can be used to the buffer before calling another parser.

Example

# Inside some Automa action code
+@setbuffer()
+description = sub_parser(stream)
+p = @bufferpos()

See also: @bufferpos

source
diff --git a/v1.0.3/parser/index.html b/v1.0.3/parser/index.html new file mode 100644 index 00000000..ebd469cd --- /dev/null +++ b/v1.0.3/parser/index.html @@ -0,0 +1,122 @@ + +Parsing buffers · Automa.jl

Parsing from a buffer

Automa can leverage metaprogramming to combine regex and Julia code to create parsers. This is significantly more difficult than simply using validators or tokenizers, but still simpler than parsing from an IO. Currently, Automa loads data through pointers, and therefore needs data backed by Array{UInt8} or String or similar - it does not work with types such as UnitRange{UInt8}. Furthermore, be careful about passing strided views to Automa - while Automa can extract a pointer from a strided view, it will always advance the pointer one byte at a time, disregarding the view's stride.

As an example, let's use the simplified FASTA format introduced in the regex section, with the following format: re"(>[a-z]+\n([ACGT]+\n)+)*". We want to parse it into a Vector{Seq}, where Seq is defined as:

julia> struct Seq
+           name::String
+           seq::String
+       end

Adding actions to regex

To do this, we need to inject Julia code into the regex validator while it is running. The first step is to add actions to our regex: These are simply names of Julia expressions to splice in, where the expressions will be executed when the regex is matched. We can choose the names arbitrarily.

Currently, actions can be added in the following places in a regex:

  • With onenter!, meaning it will be executed when reading the first byte of the regex
  • With onfinal!, where it will be executed when reading the last byte of the regex. Note that it's not possible to determine the final byte for some regex like re"X+", since the machine reads only 1 byte at a time and cannot look ahead. In such cases, an error is raised.
  • With onexit!, meaning it will be executed on reading the first byte AFTER the regex, or when exiting the regex by encountering the end of inputs (only for a regex match, not an unexpected end of input)
  • With onall!, where it will be executed when reading every byte that is part of the regex.

You can set the actions to be a single action name (represented by a Symbol), or a list of action names:

julia> my_regex = re"ABC";
+
+julia> onenter!(my_regex, [:action_a, :action_b]);
+
+julia> onexit!(my_regex, :action_c);

In which case the code named action_a, then that named action_b will executed in order when entering the regex, and the code named action_c will be executed when exiting the regex.

The onenter! etc functions return the regex they modify, so the above can be written:

julia> my_regex = onexit!(onenter!(re"ABC", [:action_a, :action_b]), :action_c);
+
+julia> my_regex isa RE
+true

When the the following regex's actions are visualized in its corresponding DFA:

regex = let
+    ab = re"ab*"
+    onenter!(ab, :enter_ab)
+    onexit!(ab, :exit_ab)
+    onfinal!(ab, :final_ab)
+    onall!(ab, :all_ab)
+    c = re"c"
+    onenter!(c, :enter_c)
+    onexit!(c, :exit_c)
+    onfinal!(c, :final_c)
+
+    ab * c
+end

The result DFA looks below. Here, the edge labeled 'a'/enter_ab,all_ab,final_ab means that the edge consumes input byte 'a', and executes the three actions enter_ab, all_ab and final_ab, in that order.

Visualization of regex with actions

Compiling regex to Machines

In order to create code, the regex must first be compiled to a Machine, which is a struct that represents an optimised DFA. We can do that with compile(regex). Under the hood, this compiles the regex to an NFA, then compiles the NFA to a DFA, and then optimises the DFA to a Machine (see the section on Automa theory).

Normally, we don't care about the regex directly, but only want the Machine. So, it is idiomatic to compile the regex in the same let statement it is being built in:

machine = let
+    header = re"[a-z]+"
+    seqline = re"[ACGT]+"
+    record = re">" * header * '\n' * rep1(seqline * '\n')
+    compile(rep(record))
+end
+@assert machine isa Automa.Machine

Note that, if this code is placed at top level in a package, the regex will be constructed and compiled to a Machine during package precompilation, which greatly helps load times.

Creating our parser

However, in this case, we don't just need a Machine with the regex, we need a Machine with the regex containing the relevant actions. To parse a simplified FASTA file into a Vector{Seq}, I'm using these four actions:

  • When the machine enters into the header, or a sequence line, I want it to mark the position with where it entered into the regex. The marked position will be used as the leftmost position where the header or sequence is extracted later.
  • When exiting the header, I want to extract the bytes from the marked position in the action above, to the last header byte (i.e. the byte before the current byte), and use these bytes as the sequence header
  • When exiting a sequence line, I want to do the same: Extract from the marked position to one before the current position, but this time I want to append the current line to a buffer containing all the lines of the sequence
  • When exiting a record, I want to construct a Seq object from the header bytes and the buffer with all the sequence lines, then push the Seq to the result,
julia> machine = let
+           header = onexit!(onenter!(re"[a-z]+", :mark_pos), :header)
+           seqline = onexit!(onenter!(re"[ACGT]+", :mark_pos), :seqline)
+           record = onexit!(re">" * header * '\n' * rep1(seqline * '\n'), :record)
+           compile(rep(record))
+       end;

We can now write the code we want executed. When writing this code, we want access to a few variables used by the machine simulation. For example, we might want to know at which byte position the machine is when an action is executed. Currently, the following variables are accessible in the code:

  • byte: The current input byte as a UInt8
  • p: The 1-indexed position of byte in the buffer
  • p_end: The length of the input buffer
  • is_eof: Whether the machine has reached the end of the input.
  • cs: The current state of the machine, as an integer
  • data: The input buffer
  • mem: The memory being read from, an Automa.SizedMemory object containing a pointer and a length

The actions we want executed, we place in a Dict{Symbol, Expr}:

julia> actions = Dict(
+           :mark_pos => :(pos = p),
+           :header => :(header = String(data[pos:p-1])),
+           :seqline => :(append!(buffer, data[pos:p-1])),
+           :record => :(push!(seqs, Seq(header, String(buffer))))
+       );

For multi-line Expr, you can construct them with quote ... end blocks.

We can now construct a function that parses our data. In the code written in the action dict above, besides the variables defined for us by Automa, we also refer to the variables buffer, header, pos and seqs. Some of these variables are defined in the code above (for example, in the :(pos = p) expression), but we can't necessarily control the order in which Automa will insert these expressions into out final function. Hence, let's initialize these variables at the top of the function we generate, such that we know for sure they are defined when used - whenever they are used.

The code itself is generated using generate_code:

julia> @eval function parse_fasta(data)
+           pos = 0
+           buffer = UInt8[]
+           seqs = Seq[]
+           header = ""
+           $(generate_code(machine, actions))
+           return seqs
+       end
+parse_fasta (generic function with 1 method)

We can now use it:

julia> parse_fasta(">abc\nTAGA\nAAGA\n>header\nAAAG\nGGCG\n")
+2-element Vector{Seq}:
+ Seq("abc", "TAGAAAGA")
+ Seq("header", "AAAGGGCG")

If we give out function a bad input - for example, if we forget the trailing newline, it throws an error:

julia> parse_fasta(">abc\nTAGA\nAAGA\n>header\nAAAG\nGGCG")
+ERROR: Error during FSM execution at buffer position 33.
+Last 32 byte(s) were:
+
+">abc\nTAGA\nAAGA\n>header\nAAAG\nGGCG"
+
+Observed input: EOF at state 5. Outgoing edges:
+ * '\n'/seqline
+ * [ACGT]
+
+Input is not in any outgoing edge, and machine therefore errored.

The code above parses with about 300 MB/s on my laptop. Not bad, but Automa can do better - read on to learn how to customize codegen.

Preconditions

You might have noticed a peculiar detail about our FASTA format: It demands a trailing newline after each record. In other words, >a\nA is not a valid FASTA record.

We can easily rewrite the regex such that the last record does not need a trailing \n. But look what happens when we try that:

julia> machine = let
+           header = onexit!(onenter!(re"[a-z]+", :mark_pos), :header)
+           seqline = onexit!(onenter!(re"[ACGT]+", :mark_pos), :seqline)
+           record = onexit!(re">" * header * '\n' * seqline * rep('\n' * seqline), :record)
+           compile(opt(record) * rep('\n' * record) * rep(re"\n"))
+       end;
+ERROR: Ambiguous NFA.

Why does this error? Well, remember that Automa processes one byte at a time, and at each byte, makes a decision on what actions to execute. Hence, if it sees the input >a\nA\n, it does not know what to do when encountering the second \n. If the next byte is, e,g. A, then it would need to execute the :seqline action. If the byte is >, it would need to execute first :seqline, then :record. Automa can't read ahead, so, the regex is ambiguous and the true behaviour when reading the inputs >a\nA\n is undefined. Therefore, Automa refuses to compile it.

There are several ways to solve this:

  • First, you can rewrite the regex to not be ambiguous. This is usually the preferred option: After all, if the regex is ambiguous, you probably made a mistake with the regex
  • You can manually diasable the ambiguity check by passing the keyword unambiguous=false to compile. This will cause the machine to undefined behaviour if an input like >a\nA\n is seen, so this is usually a poor idea.
  • You can rewrite the actions, such that the action itself uses an if-statement to check what to do. In the example above, you could remove the :record action and have the :seqline action conditionally emit a record if the next byte was >.

Finally, you can use preconditions. A precondition is a symbol, attached to a regex, just like an action. Just like an action, the symbol is attached to an Expr object, but for preconditions this must evaluate to a Bool. If false, the regex is not entered.

Let's have an example. The following machine is obviously ambiguous:

julia> machine = let
+           a = onenter!(re"XY", :a)
+           b = onenter!(re"XZ", :b)
+           compile('A' * (a | b))
+       end;
+ERROR: Ambiguous NFA.

We can add a precondition with precond!. Below, precond!(regex, label) is equivalent to precond!(regex, label; when=:enter, bool=true). This means "only enter regex when the boolean expression label evaluates to bool (true)":

julia> machine = let
+           a = precond!(onenter!(re"XY", :a), :test)
+           b = precond!(onenter!(re"XZ", :b), :test; bool=false)
+           compile('A' * (a | b))
+       end;
+
+julia> machine isa Automa.Machine
+true

Here, re"XY" can only be entered when :test is true, and re"XZ" only when :test is false. So, there can be no ambiguous behaviour and the regex compiles fine.

Reference

Automa.RegExp.onenter!Function
onenter!(re::RE, a::Union{Symbol, Vector{Symbol}}) -> re

Set action(s) a to occur when reading the first byte of regex re. If multiple actions are set by passing a vector, execute the actions in order.

See also: onexit!, onall!, onfinal!

Example

julia> regex = re"ab?c*";
+
+julia> regex2 = onenter!(regex, :entering_regex);
+
+julia> regex === regex2
+true
source
Automa.RegExp.onexit!Function
onexit!(re::RE, a::Union{Symbol, Vector{Symbol}}) -> re

Set action(s) a to occur when reading the first byte no longer part of regex re, or if experiencing an expected end-of-file. If multiple actions are set by passing a vector, execute the actions in order.

See also: onenter!, onall!, onfinal!

Example

julia> regex = re"ab?c*";
+
+julia> regex2 = onexit!(regex, :exiting_regex);
+
+julia> regex === regex2
+true
source
Automa.RegExp.onall!Function
onall!(re::RE, a::Union{Symbol, Vector{Symbol}}) -> re

Set action(s) a to occur when reading any byte part of the regex re. If multiple actions are set by passing a vector, execute the actions in order.

See also: onenter!, onexit!, onfinal!

Example

julia> regex = re"ab?c*";
+
+julia> regex2 = onall!(regex, :reading_re_byte);
+
+julia> regex === regex2
+true
source
Automa.RegExp.onfinal!Function
onfinal!(re::RE, a::Union{Symbol, Vector{Symbol}}) -> re

Set action(s) a to occur when the last byte of regex re. If re does not have a definite final byte, e.g. re"a(bc)*", where more "bc" can always be added, compiling the regex will error after setting a final action. If multiple actions are set by passing a vector, execute the actions in order.

See also: onenter!, onall!, onexit!

Example

julia> regex = re"ab?c";
+
+julia> regex2 = onfinal!(regex, :entering_last_byte);
+
+julia> regex === regex2
+true
+
+julia> compile(onfinal!(re"ab?c*", :does_not_work))
+ERROR: [...]
source
Automa.RegExp.precond!Function
precond!(re::RE, s::Symbol; [when=:enter], [bool=true]) -> re

Set re's precondition to s. Before any state transitions to re, or inside re, the precondition code s is checked to be bool before the transition is taken.

when controls if the condition is checked when the regex is entered (if :enter), or at every state transition inside the regex (if :all)

Example

julia> regex = re"ab?c*";
+
+julia> regex2 = precond!(regex, :some_condition);
+
+julia> regex === regex2
+true
source
Automa.generate_codeFunction
generate_code([::CodeGenContext], machine::Machine, actions=nothing)::Expr

Generate init and exec code for machine. The default code generator function for creating functions, preferentially use this over generating init and exec code directly, due to its convenience. Shorthand for producing the concatenated code of:

  • generate_init_code(ctx, machine)
  • generate_action_code(ctx, machine, actions)
  • generate_input_error_code(ctx, machine) [elided if actions == :debug]

Examples

@eval function foo(data)
+    # Initialize variables used in actions
+    data_buffer = UInt8[]
+    $(generate_code(machine, actions))
+    return data_buffer
+end

See also: generate_init_code, generate_exec_code

source
Automa.generate_init_codeFunction
generate_init_code([::CodeGenContext], machine::Machine)::Expr

Generate variable initialization code, initializing variables such as p, and p_end. The names of these variables are set by the CodeGenContext. If not passed, the context defaults to DefaultCodeGenContext

Prefer using the more generic generate_code over this function where possible. This function should be used if the initialized data should be modified before the execution code.

Example

@eval function foo(data)
+    $(generate_init_code(machine))
+    p = 2 # maybe I want to start from position 2, not 1
+    $(generate_exec_code(machine, actions))
+    return cs
+end

See also: generate_code, generate_exec_code

source
Automa.generate_exec_codeFunction
generate_exec_code([::CodeGenContext], machine::Machine, actions=nothing)::Expr

Generate machine execution code with actions. This code should be run after the machine has been initialized with generate_init_code. If not passed, the context defaults to DefaultCodeGenContext

Prefer using the more generic generate_code over this function where possible. This function should be used if the initialized data should be modified before the execution code.

Examples

@eval function foo(data)
+    $(generate_init_code(machine))
+    p = 2 # maybe I want to start from position 2, not 1
+    $(generate_exec_code(machine, actions))
+    return cs
+end

See also: generate_init_code, generate_exec_code

source
diff --git a/v1.0.3/reader/index.html b/v1.0.3/reader/index.html new file mode 100644 index 00000000..2d35390c --- /dev/null +++ b/v1.0.3/reader/index.html @@ -0,0 +1,60 @@ + +Creating readers · Automa.jl

Creating a Reader type

The use of generate_reader as we learned in the previous section "Parsing from an io" has an issue we need to address: While we were able to read multiple records from the reader by calling read_record multiple times, no state was preserved between these calls, and so, no state can be preserved between reading individual records. This is also what made it necessary to clumsily reset p after emitting each record.

Imagine you have a format with two kinds of records, A and B types. A records must come before B records in the file. Hence, while a B record can appear at any time, once you've seen a B record, there can't be any more A records. When reading records from the file, you must be able to store whether you've seen a B record.

We address this by creating a Reader type which wraps the IO being parsed, and which store any state we want to preserve between records. Let's stick to our simplified FASTA format parsing sequences into Seq objects:

struct Seq
+    name::String
+    seq::String
+end
+
+machine = let
+    header = onexit!(onenter!(re"[a-z]+", :mark_pos), :header)
+    seqline = onexit!(onenter!(re"[ACGT]+", :mark_pos), :seqline)
+    record = onexit!(re">" * header * '\n' * rep1(seqline * '\n'), :record)
+    compile(rep(record))
+end
+@assert machine isa Automa.Machine

This time, we use the following Reader type:

mutable struct Reader{S <: TranscodingStream}
+    io::S
+    automa_state::Int
+end
+
+Reader(io::TranscodingStream) = Reader{typeof(io)}(io, 1)
+Reader(io::IO) = Reader(NoopStream(io))

The Reader contains an instance of TranscodingStream to read from, and stores the Automa state between records. The beginning state of Automa is always 1. We can now create our reader function like below. There are only three differences from the definitions in the previous section:

  • I no longer have the code to decrement p in the :record action - because we can store the Automa state between records such that the machine can handle beginning in the middle of a record if necessary, there is no need to reset the value of p in order to restore the IO to the state right before each record.
  • I return (cs, state) instead of just state, because I want to update the Automa state of the Reader, so when it reads the next record, it begins in the same state where the machine left off from the previous state
  • In the arguments, I add start_state, and in the initcode I set cs to the start state, so the machine begins from the correct state
actions = Dict{Symbol, Expr}(
+    :mark_pos => :(@mark),
+    :header => :(header = String(data[@markpos():p-1])),
+    :seqline => :(append!(seqbuffer, data[@markpos():p-1])),
+    :record => quote
+        seq = Seq(header, String(seqbuffer))
+        found_sequence = true
+        @escape
+    end
+)
+
+generate_reader(
+    :read_record,
+    machine;
+    actions=actions,
+    arguments=(:(start_state::Int),),
+    initcode=quote
+        seqbuffer = UInt8[]
+        found_sequence = false
+        header = ""
+        cs = start_state
+    end,
+    loopcode=quote
+        if (is_eof && p > p_end) || found_sequence
+            @goto __return__
+        end
+    end,
+    returncode=:(found_sequence ? (cs, seq) : throw(EOFError()))
+) |> eval

We then create a function that reads from the Reader, making sure to update the automa_state of the reader:

function read_record(reader::Reader)
+    (cs, seq) = read_record(reader.io, reader.automa_state)
+    reader.automa_state = cs
+    return seq
+end

Let's test it out:

julia> reader = Reader(IOBuffer(">a\nT\n>tag\nGAG\nATATA\n"));
+
+julia> read_record(reader)
+Seq("a", "T")
+
+julia> read_record(reader)
+Seq("tag", "GAGATATA")
+
+julia> read_record(reader)
+ERROR: EOFError: read end of file
diff --git a/v1.0.3/regex/index.html b/v1.0.3/regex/index.html new file mode 100644 index 00000000..4d868a2c --- /dev/null +++ b/v1.0.3/regex/index.html @@ -0,0 +1,17 @@ + +Regex · Automa.jl

Regex

Automa regex (of the type Automa.RE) are conceptually similar to the Julia built-in regex. They are made using the @re_str macro, like this: re"ABC[DEF]".

Automa regex matches individual bytes, not characters. Hence, re"Æ" (with the UTF-8 encoding [0xc3, 0x86]) is equivalent to re"\xc3\x86", and is considered the concatenation of two independent input bytes.

The @re_str macro supports the following content:

  • Literal symbols, such as re"ABC", re"\xfe\xa2" or re"Ø".
  • | for alternation, as in re"A|B", meaning "A or B".
  • Byte sets with [], like re"[ABC]". This means any of the bytes in the brackets, e.g. re"[ABC]" is equivalent to re"A|B|C".
  • Inverted byte sets, e.g. re"[^ABC]", meaning any byte, except those in re[ABC].
  • Repetition, with X* meaning zero or more repetitions of X.
  • +, where X+ means XX*, i.e. 1 or more repetitions of X.
  • ?, where X? means X | "", i.e. 0 or 1 occurrences of X. It applies to the last element of the regex.
  • Parentheses to group expressions, like in re"A(B|C)?".

You can combine regex with the following operations:

  • * for concatenation, with re"A" * re"B" being the same as re"AB". Regex can also be concatenated with Chars and Strings, which will cause the chars/strings to be converted to regex first.
  • | for alternation, with re"A" | re"B" being the same as re"A|B"
  • & for intersection of regex, i.e. for regex A and B, the set of inputs matching A & B is exactly the intersection of the inputs match A and those matching B. As an example, re"A[AB]C+D?" & re"[ABC]+" is re"ABC".
  • \ for difference, such that for regex A and B, A \ B creates a new regex matching all those inputs that match A but not B.
  • ! for inversion, such that !re"[A-Z]" matches all other strings than those which match re"[A-Z]". Note that !re"a" also matches e.g. "aa", since this does not match re"a".

Finally, the functions opt, rep and rep1 are equivalent to the operators ?, * and +, so for eg. opt(re"a" * rep(re"b") * re"c") is equivalent to re"(ab*c)?".

Example

Suppose we want to create a regex that matches a simplified version of the FASTA format. This "simple FASTA" format is defined like so:

  • The format is a series of zero or more records, concatenated
  • A record consists of the concatenation of:
    • A leading '>'
    • A header, composed of one or more letters in 'a-z',
    • A newline symbol '\n'
    • A series of one or more sequence lines
  • A sequence line is the concatenation of:
    • One or more symbols from the alphabet [ACGT]
    • A newline

We can represent this concisely as a regex: re"(>[a-z]+\n([ACGT]+\n)+)*" To make it easier to read, we typically construct regex incrementally, like such:

fasta_regex = let
+    header = re"[a-z]+"
+    seqline = re"[ACGT]+"
+    record = '>' * header * '\n' * rep1(seqline * '\n')
+    rep(record)
+end
+@assert fasta_regex isa RE

Reference

Automa.RegExp.REType
RE(s::AbstractString)

Automa regular expression (regex) that is used to match a sequence of input bytes. Regex should preferentially be constructed using the @re_str macro: re"ab+c?". Regex can be combined with other regex, strings or chars with *, |, & and \:

  • a * b matches inputs that matches first a, then b
  • a | b matches inputs that matches a or b
  • a & b matches inputs that matches a and b
  • a \ b matches input that mathes a but not b
  • !a matches all inputs that does not match a.

Set actions to regex with onenter!, onexit!, onall! and onfinal!, and preconditions with precond!.

Example

julia> regex = (re"a*b?" | opt('c')) * re"[a-z]+";
+
+julia> regex = rep1((regex \ "aba") & !re"ca");
+
+julia> regex isa RE
+true
+
+julia> compile(regex) isa Automa.Machine
+true

See also: @re_str, compile

source
Automa.RegExp.@re_strMacro
@re_str -> RE

Construct an Automa regex of type RE from a string. Note that due to Julia's raw string escaping rules, re"\\" means a single backslash, and so does re"\\\\", while re"\\\\\"" means a backslash, then a quote character.

Examples:

julia> re"ab?c*[def][^ghi]+" isa RE
+true 

See also: RE

source
diff --git a/v1.0.3/search_index.js b/v1.0.3/search_index.js new file mode 100644 index 00000000..8db36e79 --- /dev/null +++ b/v1.0.3/search_index.js @@ -0,0 +1,3 @@ +var documenterSearchIndex = {"docs": +[{"location":"debugging/","page":"Debugging Automa","title":"Debugging Automa","text":"CurrentModule = Automa\nDocTestSetup = quote\n using TranscodingStreams\n using Automa\nend","category":"page"},{"location":"debugging/#Debugging-Automa","page":"Debugging Automa","title":"Debugging Automa","text":"","category":"section"},{"location":"debugging/","page":"Debugging Automa","title":"Debugging Automa","text":"danger: Danger\nAll Automa's debugging tools are NOT part of the API and are subject to change without warning. You can use them during development, but do NOT rely on their behaviour in your final code.","category":"page"},{"location":"debugging/","page":"Debugging Automa","title":"Debugging Automa","text":"Automa is a complicated package, and the process of indirectly designing parsers by first designing a machine can be error prone. Therefore, it's crucial to have good debugging tooling.","category":"page"},{"location":"debugging/#Revise","page":"Debugging Automa","title":"Revise","text":"","category":"section"},{"location":"debugging/","page":"Debugging Automa","title":"Debugging Automa","text":"Revise is not able to update Automa-generated functions. To make your feedback loop faster, you can manually re-run the code that defines the Automa functions - usually this is much faster than modifying the package and reloading it.","category":"page"},{"location":"debugging/#Ambiguity-check","page":"Debugging Automa","title":"Ambiguity check","text":"","category":"section"},{"location":"debugging/","page":"Debugging Automa","title":"Debugging Automa","text":"It is easy to accidentally create a machine where it is undecidable what actions should be taken. For example:","category":"page"},{"location":"debugging/","page":"Debugging Automa","title":"Debugging Automa","text":"machine = let\n alphabet = re\"BC\"\n band = onenter!(re\"BBA\", :cool_band)\n compile(re\"XYZ A\" * (alphabet | band))\nend\n\n# output\nERROR: Ambiguous NFA.\n[...]","category":"page"},{"location":"debugging/","page":"Debugging Automa","title":"Debugging Automa","text":"Consider what the machine should do once it observes the two first bytes AB of the input: Is the B part of alphabet (in which case it should do nothing), or is it part of band (in which case it should do the action :cool_band)? It's impossible to tell.","category":"page"},{"location":"debugging/","page":"Debugging Automa","title":"Debugging Automa","text":"Automa will not compile this, and will raise the error:","category":"page"},{"location":"debugging/","page":"Debugging Automa","title":"Debugging Automa","text":"ERROR: Ambiguous NFA.","category":"page"},{"location":"debugging/","page":"Debugging Automa","title":"Debugging Automa","text":"Note the error shows an example input which will trigger the ambiguity: XYZ A, then B. By simply running the input through in your head, you may discover yourself how the error happens.","category":"page"},{"location":"debugging/","page":"Debugging Automa","title":"Debugging Automa","text":"In the example above, the error was obvious, but consider this example:","category":"page"},{"location":"debugging/","page":"Debugging Automa","title":"Debugging Automa","text":"fasta_machine = let\n header = re\"[a-z]+\"\n seq_line = re\"[ACGT]+\"\n sequence = seq_line * rep('\\n' * seq_line)\n record = onexit!('>' * header * '\\n' * sequence, :emit_record)\n compile(rep(record * '\\n') * opt(record))\nend\n\n# output\nERROR: Ambiguous NFA.\n[...]","category":"page"},{"location":"debugging/","page":"Debugging Automa","title":"Debugging Automa","text":"It's the same problem: After a sequence line you observe \\n: Is this the end of the sequence, or just a newline before another sequence line?","category":"page"},{"location":"debugging/","page":"Debugging Automa","title":"Debugging Automa","text":"To work around it, consider when you know for sure you are out of the sequence: It's not before you see a new >, or end-of-file. In a sense, the trailing \\n really IS part of the sequence. So, really, your machine should regex similar to this","category":"page"},{"location":"debugging/","page":"Debugging Automa","title":"Debugging Automa","text":"fasta_machine = let\n header = re\"[a-z]+\"\n seq_line = re\"[ACGT]+\"\n sequence = rep1(seq_line * '\\n')\n record = onexit!('>' * header * '\\n' * sequence, :emit_record)\n\n # A special record that can avoid a trailing newline, but ONLY if it's the last record\n record_eof = '>' * header * '\\n' * seq_line * rep('\\n' * seq_line) * opt('\\n')\n compile(rep(record * '\\n') * opt(record_eof))\nend\n@assert fasta_machine isa Automa.Machine\n\n# output","category":"page"},{"location":"debugging/","page":"Debugging Automa","title":"Debugging Automa","text":"When all else fails, you can also pass unambiguous=false to the compile function - but beware! Ambiguous machines has undefined behaviour if you get into an ambiguous situation.","category":"page"},{"location":"debugging/#Create-Machine-flowchart","page":"Debugging Automa","title":"Create Machine flowchart","text":"","category":"section"},{"location":"debugging/","page":"Debugging Automa","title":"Debugging Automa","text":"The function machine2dot(::Machine) will return a string with a Graphviz .dot formatted flowchart of the machine. Graphviz can then convert the dot file to an SVG function.","category":"page"},{"location":"debugging/","page":"Debugging Automa","title":"Debugging Automa","text":"On my computer (with Graphviz and Firefox installed), I can use the following Julia code to display a flowchart of a machine. Note that dot is the command-line name of Graphviz.","category":"page"},{"location":"debugging/","page":"Debugging Automa","title":"Debugging Automa","text":"function display_machine(m::Machine)\n open(\"/tmp/machine.dot\", \"w\") do io\n println(io, Automa.machine2dot(m))\n end\n run(pipeline(`dot -Tsvg /tmp/machine.dot`, stdout=\"/tmp/machine.svg\"))\n run(`firefox /tmp/machine.svg`)\nend","category":"page"},{"location":"debugging/","page":"Debugging Automa","title":"Debugging Automa","text":"The following function are Automa internals, but they might help with more advanced debugging:","category":"page"},{"location":"debugging/","page":"Debugging Automa","title":"Debugging Automa","text":"re2nfa - create an NFA from an Automa regex\nnfa2dot - create a dot-formatted string from an nfa\nnfa2dfa - create a DFA from an NFA\ndfa2dot - create a dot-formatted string from a DFA","category":"page"},{"location":"debugging/#Running-machines-in-debug-mode","page":"Debugging Automa","title":"Running machines in debug mode","text":"","category":"section"},{"location":"debugging/","page":"Debugging Automa","title":"Debugging Automa","text":"The function generate_code takes an argument actions. If this is :debug, then all actions in the given Machine will be replaced by :(push!(logger, action_name)). Hence, given a FASTA machine, you could create a debugger function:","category":"page"},{"location":"debugging/","page":"Debugging Automa","title":"Debugging Automa","text":" @eval function debug(data)\n logger = []\n $(generate_code(fasta_machine, :debug))\n logger\nend","category":"page"},{"location":"debugging/","page":"Debugging Automa","title":"Debugging Automa","text":"Then see all the actions executed in order, by doing:","category":"page"},{"location":"debugging/","page":"Debugging Automa","title":"Debugging Automa","text":"julia> debug(\">abc\\nTAG\")\n4-element Vector{Any}:\n :mark\n :header\n :mark\n :seqline\n :record","category":"page"},{"location":"debugging/","page":"Debugging Automa","title":"Debugging Automa","text":"Note that if your machine relies on its actions to work correctly, for example by actions modifying p, this kind of debugger will not work, as it replaces all actions.","category":"page"},{"location":"debugging/#More-advanced-debuggning","page":"Debugging Automa","title":"More advanced debuggning","text":"","category":"section"},{"location":"debugging/","page":"Debugging Automa","title":"Debugging Automa","text":"The file test/debug.jl contains extra debugging functionality and may be included. In particular it defines the functions debug_execute and create_debug_function.","category":"page"},{"location":"debugging/","page":"Debugging Automa","title":"Debugging Automa","text":"The function of create_debug_function(::Machine; ascii=false) is best demonstrated:","category":"page"},{"location":"debugging/","page":"Debugging Automa","title":"Debugging Automa","text":"machine = let\n letters = onenter!(re\"[a-z]+\", :enter_letters)\n compile(onexit!(letters * re\",[0-9],\" * letters, :exiting_regex))\nend\neval(create_debug_function(machine; ascii=true))\n(end_state, transitions) = debug_compile(\"abc,5,d!\")\n@show end_state\ntransitions","category":"page"},{"location":"debugging/","page":"Debugging Automa","title":"Debugging Automa","text":"Will create the following output:","category":"page"},{"location":"debugging/","page":"Debugging Automa","title":"Debugging Automa","text":"end state = -6\n7-element Vector{Tuple{Char, Int64, Vector{Symbol}}}:\n ('a', 2, [:enter_letters])\n ('b', 2, [])\n ('c', 2, [])\n (',', 3, [])\n ('5', 4, [])\n (',', 5, [])\n ('d', 6, [:enter_letters])","category":"page"},{"location":"debugging/","page":"Debugging Automa","title":"Debugging Automa","text":"Where each 3-tuple in the input corresponds to the input byte (displayed as a Char if ascii is set to true), the Automa state reached on reading the letter, and the actions executed.","category":"page"},{"location":"debugging/","page":"Debugging Automa","title":"Debugging Automa","text":"The debug_execute function works the same as the debug_compile, but does not need to be generated first, and can be run directly on an Automa regex:","category":"page"},{"location":"debugging/","page":"Debugging Automa","title":"Debugging Automa","text":"julia> debug_execute(re\"[A-z]+\", \"abc1def\"; ascii=true)\n(-3, Tuple{Union{Nothing, Char}, Int64, Vector{Symbol}}[('a', 2, []), ('b', 3, []), ('c', 3, [])])","category":"page"},{"location":"debugging/","page":"Debugging Automa","title":"Debugging Automa","text":"machine2dot","category":"page"},{"location":"debugging/#Automa.machine2dot","page":"Debugging Automa","title":"Automa.machine2dot","text":"machine2dot(machine::Machine)::String\n\nReturn a String with a flowchart of the machine in Graphviz (dot) format. Using Graphviz, a command-line tool, the dot file can be converted to various picture formats.\n\nExample\n\nopen(\"/tmp/machine.dot\", \"w\") do io\n println(io, machine2dot(machine))\nend\n# Requires graphviz to be installed\nrun(pipeline(`dot -Tsvg /tmp/machine.dot`), stdout=\"/tmp/machine.svg\")\n\n\n\n\n\n","category":"function"},{"location":"tokenizer/","page":"Tokenizers","title":"Tokenizers","text":"CurrentModule = Automa\nDocTestSetup = quote\n using TranscodingStreams\n using Automa\nend","category":"page"},{"location":"tokenizer/#Tokenizers-(lexers)","page":"Tokenizers","title":"Tokenizers (lexers)","text":"","category":"section"},{"location":"tokenizer/","page":"Tokenizers","title":"Tokenizers","text":"A tokenizer or a lexer is a program that breaks down an input text into smaller chunks, and classifies them as one of several tokens. For example, consider an imagininary format that only consists of nested tuples of strings containing letters, like this:","category":"page"},{"location":"tokenizer/","page":"Tokenizers","title":"Tokenizers","text":"((\"ABC\", \"v\"),((\"x\", (\"pj\",((\"a\", \"k\")), (\"L\")))))","category":"page"},{"location":"tokenizer/","page":"Tokenizers","title":"Tokenizers","text":"Any text of this format can be broken down into a sequence of the following tokens:","category":"page"},{"location":"tokenizer/","page":"Tokenizers","title":"Tokenizers","text":"Left parenthesis: re\"\\(\"\nRight parenthesis: re\"\\)\"\nComma: re\",\"\nQuote: re\"\\\"\"\nSpaces: re\" +\"\nLetters: re\"[A-Za-z]+\"","category":"page"},{"location":"tokenizer/","page":"Tokenizers","title":"Tokenizers","text":"Such that e.g. (\"XY\", \"A\") can be represented as the token sequence lparens, quote, XY, quote, comma, space, quote A quote rparens.","category":"page"},{"location":"tokenizer/","page":"Tokenizers","title":"Tokenizers","text":"Breaking the text down to its tokens is called tokenization or lexing. Note that lexing in itself is not sufficient to parse the format: Lexing is context unaware and doesn't understand syntax, so e.g. the test \"((A can be perfectly well tokenized to quote lparens lparens A, even if it's invalid syntax.","category":"page"},{"location":"tokenizer/","page":"Tokenizers","title":"Tokenizers","text":"The purpose of tokenization is to make subsequent parsing easier, because each part of the text has been classified. That makes it easier to, for example, search for letters in the input. Instead of having to muck around with regex to find the letters, you use regex once to classify all text.","category":"page"},{"location":"tokenizer/#Making-and-using-a-tokenizer","page":"Tokenizers","title":"Making and using a tokenizer","text":"","category":"section"},{"location":"tokenizer/","page":"Tokenizers","title":"Tokenizers","text":"Let's use the example above to create a tokenizer. The most basic tokenizer defaults to using UInt32 as tokens: You pass in a list of regex matching each token, then evaluate the resulting code:","category":"page"},{"location":"tokenizer/","page":"Tokenizers","title":"Tokenizers","text":"julia> make_tokenizer(\n [re\"\\(\", re\"\\)\", re\",\", re\"\\\"\", re\" +\", re\"[a-zA-Z]+\"]\n ) |> eval","category":"page"},{"location":"tokenizer/","page":"Tokenizers","title":"Tokenizers","text":"The make_tokenizer function creates Julia code (an Expr object) that, when evaluated, defines Base.iterate for the Tokenizer type. The code above defined Base.iterate(::Tokenizer{UInt32, D, 1}) where D - we'll get back to the different type parameters of Tokenizer later.","category":"page"},{"location":"tokenizer/","page":"Tokenizers","title":"Tokenizers","text":"Tokenizers are most easily created with the tokenize function. To create a Tokenizer{UInt32}, we can do call tokenize(UInt32, data):","category":"page"},{"location":"tokenizer/","page":"Tokenizers","title":"Tokenizers","text":"julia> iterator = tokenize(UInt32, \"\"\"(\"XY\", \"A\")\"\"\"); typeof(iterator)\nTokenizer{UInt32, String, 1}","category":"page"},{"location":"tokenizer/","page":"Tokenizers","title":"Tokenizers","text":"Meaning: A Tokenizer emitting UInt32 over String data, of version 1. Since we used make_tokenizer above to define iteration for this kind of tokenizer (one with UInt32 tokens), we can iterate this tokenizer.","category":"page"},{"location":"tokenizer/","page":"Tokenizers","title":"Tokenizers","text":"When we iterate, we get Tuple{Int64, Int32, UInt32} elements, with each element being:","category":"page"},{"location":"tokenizer/","page":"Tokenizers","title":"Tokenizers","text":"The start index of the token\nThe length of the token\nThe token itself, in this example UInt32(1) for '(', UInt32(2) for ')' etc: ","category":"page"},{"location":"tokenizer/","page":"Tokenizers","title":"Tokenizers","text":"julia> collect(iterator)\n10-element Vector{Tuple{Int64, Int32, UInt32}}:\n (1, 1, 0x00000001)\n (2, 1, 0x00000004)\n (3, 2, 0x00000006)\n (5, 1, 0x00000004)\n (6, 1, 0x00000003)\n (7, 1, 0x00000005)\n (8, 1, 0x00000004)\n (9, 1, 0x00000006)\n (10, 1, 0x00000004)\n (11, 1, 0x00000002)","category":"page"},{"location":"tokenizer/","page":"Tokenizers","title":"Tokenizers","text":"The type of the last element in each tuple comes from the Tokenizer type parameter: We specified UInt32, so we get UInt32 tokens.","category":"page"},{"location":"tokenizer/","page":"Tokenizers","title":"Tokenizers","text":"Any data which could not be tokenized is given the error token UInt32(0):","category":"page"},{"location":"tokenizer/","page":"Tokenizers","title":"Tokenizers","text":"julia> collect(tokenize(UInt32, \"XY!!)\"))\n3-element Vector{Tuple{Int64, Int32, UInt32}}:\n (1, 2, 0x00000006)\n (3, 2, 0x00000000)\n (5, 1, 0x00000002)","category":"page"},{"location":"tokenizer/","page":"Tokenizers","title":"Tokenizers","text":"Both tokenize and make_tokenizer take an optional argument version, which is 1 by default. This sets the last parameter of the Tokenizer struct - for example, make_tokenizer(tokens::Vector{RE}; version=5) defines Base.iterate for Tokenizer{UInt32, D, 5}.","category":"page"},{"location":"tokenizer/","page":"Tokenizers","title":"Tokenizers","text":"By letting the user freely choose the value of the last type parameter, this allows you to create multiple different tokenizers with the same element type.","category":"page"},{"location":"tokenizer/#Using-enums-as-tokens","page":"Tokenizers","title":"Using enums as tokens","text":"","category":"section"},{"location":"tokenizer/","page":"Tokenizers","title":"Tokenizers","text":"Using UInt32 as tokens is not very convenient - so it's possible to use enums to create the tokenizer:","category":"page"},{"location":"tokenizer/","page":"Tokenizers","title":"Tokenizers","text":"julia> @enum Token error lparens rparens comma quot space letters\n\njulia> make_tokenizer((error, [\n lparens => re\"\\(\",\n rparens => re\"\\)\",\n comma => re\",\",\n quot => re\"\\\"\",\n space => re\" +\",\n letters => re\"[a-zA-Z]+\"\n ])) |> eval\n\njulia> collect(tokenize(Token, \"XY!!)\"))\n3-element Vector{Tuple{Int64, Int32, Token}}:\n (1, 2, letters)\n (3, 2, error)\n (5, 1, rparens)","category":"page"},{"location":"tokenizer/","page":"Tokenizers","title":"Tokenizers","text":"To make it even easier, you can define the enum and the tokenizer in one go:","category":"page"},{"location":"tokenizer/","page":"Tokenizers","title":"Tokenizers","text":"tokens = [\n :lparens => re\"\\(\",\n :rparens => re\"\\)\",\n :comma => re\",\",\n :quot => re\"\\\"\",\n :space => re\" +\",\n :letters => re\"[a-zA-Z]+\"\n]\n@eval @enum Token error $(first.(tokens)...)\nmake_tokenizer((error, \n [Token(i) => j for (i,j) in enumerate(last.(tokens))]\n)) |> eval","category":"page"},{"location":"tokenizer/#Token-disambiguation","page":"Tokenizers","title":"Token disambiguation","text":"","category":"section"},{"location":"tokenizer/","page":"Tokenizers","title":"Tokenizers","text":"It's possible to create a tokenizer where the different token regexes overlap:","category":"page"},{"location":"tokenizer/","page":"Tokenizers","title":"Tokenizers","text":"julia> make_tokenizer([re\"[ab]+\", re\"ab*\", re\"ab\"]) |> eval","category":"page"},{"location":"tokenizer/","page":"Tokenizers","title":"Tokenizers","text":"In this case, an input like ab will match all three regex. Which tokens are emitted is determined by two rules:","category":"page"},{"location":"tokenizer/","page":"Tokenizers","title":"Tokenizers","text":"First, the emitted tokens will be as long as possible. So, the input aa could be emitted as one token of the regex re\"[ab]+\", two tokens of the same regex, or of two tokens of the regex re\"ab*\". In this case, it will be emitted as a single token of re\"[ab]+\", since that will make the first token as long as possible (2 bytes), whereas the other options would only make it 1 byte long.","category":"page"},{"location":"tokenizer/","page":"Tokenizers","title":"Tokenizers","text":"Second, tokens with a higher index in the input array beats previous tokens. So, a will be emitted as re\"ab*\", as its index of 2 beats the previous regex re\"[ab]+\" with the index 1, and ab will match the third regex.","category":"page"},{"location":"tokenizer/","page":"Tokenizers","title":"Tokenizers","text":"If you don't want emitted tokens to depend on these priority rules, you can set the optional keyword unambiguous=true in the make_tokenizer function, in which case make_tokenizer will error if any input text could be broken down into different tokens. However, note that this may cause most tokenizers to error when being built, as most tokenization processes are ambiguous.","category":"page"},{"location":"tokenizer/#Reference","page":"Tokenizers","title":"Reference","text":"","category":"section"},{"location":"tokenizer/","page":"Tokenizers","title":"Tokenizers","text":"Automa.Tokenizer\nAutoma.tokenize\nAutoma.make_tokenizer","category":"page"},{"location":"tokenizer/#Automa.Tokenizer","page":"Tokenizers","title":"Automa.Tokenizer","text":"Tokenizer{E, D, C}\n\nLazy iterator of tokens of type E over data of type D. Tokenizers are usually created with the tokenize function, and their iterator behaviour are defined by make_tokenizer.\n\nTokenizer works on any buffer-like object that defines pointer and sizeof. When iterated, it will return a Tuple{Integer, Integer, E}:\n\nThe first value in the tuple is the 1-based starting index of the token in the buffer\nThe second is the length of the token in bytes\nThe third is the token.\n\nUn-tokenizable data will be emitted as the \"error token\" which must also be of type E.\n\nThe Int parameter C allows multiple tokenizers to be created with the otherwise same type parameters.\n\nSee also: make_tokenizer\n\n\n\n\n\n","category":"type"},{"location":"tokenizer/#Automa.tokenize","page":"Tokenizers","title":"Automa.tokenize","text":"tokenize(::Type{E}, data, version=1) -> Tokenizer\n\nCreate a Tokenizer{E, typeof(data), version}, iterating tokens of type E over data.\n\nSee also: Tokenizer, make_tokenizer, compile\n\nExamples\n\njulia> tokenize(UInt32, \"hello\")\nTokenizer{UInt32, String, 1}(\"hello\")\n\njulia> tokenize(Int8, [1, 2, 3], 3)\nTokenizer{Int8, Vector{Int64}, 3}([1, 2, 3])\n\n\n\n\n\n","category":"function"},{"location":"tokenizer/#Automa.make_tokenizer","page":"Tokenizers","title":"Automa.make_tokenizer","text":"make_tokenizer(\n machine::TokenizerMachine;\n tokens::Tuple{E, AbstractVector{E}}= [ integers ],\n goto=true, version=1\n) where E\n\nCreate code which when evaluated, defines Base.iterate(::Tokenizer{E, D, $version}). tokens is a tuple of:\n\nthe error token, which will be emitted for data that cannot be tokenized, and\na vector of non-error tokens of length machine.n_tokens.\n\nMost users should instead use the more convenient method make_tokenizer(tokens).\n\nExample usage\n\njulia> machine = compile([re\"a\", re\"b\"]);\n\njulia> make_tokenizer(machine; tokens=(0x00, [0x01, 0x02])) |> eval\n\njulia> iter = tokenize(UInt8, \"abxxxba\"); typeof(iter)\nTokenizer{UInt8, String, 1}\n\njulia> collect(iter)\n5-element Vector{Tuple{Int64, Int32, UInt8}}:\n (1, 1, 0x01)\n (2, 1, 0x02)\n (3, 3, 0x00)\n (6, 1, 0x02)\n (7, 1, 0x01)\n\nAny actions inside the input regexes will be ignored.\n\nIf goto (default), use the faster, but more complex goto code generator.\nThe version number will set the last parameter of the Tokenizer, which allows you to create different tokenizers for the same element type.\n\nSee also: Tokenizer, tokenize, compile\n\n\n\n\n\nmake_tokenizer(\n tokens::Union{\n AbstractVector{RE},\n Tuple{E, AbstractVector{Pair{E, RE}}}\n };\n goto::Bool=true,\n version::Int=1,\n unambiguous=false\n) where E\n\nConvenience function for both compiling a TokenizerMachine, then running make_tokenizer on it. In other words, this function returns code that when run, defines iterate for Tokenizer{$E, D, $version} where D.\n\nIf tokens are a tuple, the first element is the error token, and the next is a vector of token => regex pairs. If tokens is an AbstractVector{RE} v, the tokens defaults to UInt32, and it behaves as if it was (UInt32(0), [UInt32(i)=>r for (i,r) in pairs(v)]), i.e. UInt32(0) is the error token.\n\nExample\n\njulia> make_tokenizer([re\"abc\", re\"def\"]) |> eval\n\njulia> collect(tokenize(UInt32, \"abcxyzdef123\"))\n4-element Vector{Tuple{Int64, Int32, UInt32}}:\n (1, 3, 0x00000001)\n (4, 3, 0x00000000)\n (7, 3, 0x00000002)\n (10, 3, 0x00000000)\n\njulia> make_tokenizer((0, collect(pairs([re\"x\", re\"y\"]))); version=5) |> eval\n\njulia> iter = tokenize(Int, \"xyaby\", 5)\nTokenizer{Int64, String, 5}(\"xyaby\")\n\njulia> collect(iter)\n4-element Vector{Tuple{Int64, Int32, Int64}}:\n (1, 1, 1)\n (2, 1, 2)\n (3, 2, 0)\n (5, 1, 2)\n\n\n\n\n\n","category":"function"},{"location":"validators/","page":"Validators","title":"Validators","text":"CurrentModule = Automa\nDocTestSetup = quote\n using TranscodingStreams\n using Automa\nend","category":"page"},{"location":"validators/#Text-validators","page":"Validators","title":"Text validators","text":"","category":"section"},{"location":"validators/","page":"Validators","title":"Validators","text":"The simplest use of Automa is to simply match a regex. It's unlikely you are going to want to use Automa for this instead of Julia's built-in regex engine PCRE, unless you need the extra performance that Automa brings over PCRE. Nonetheless, it serves as a good starting point to introduce Automa.","category":"page"},{"location":"validators/","page":"Validators","title":"Validators","text":"Suppose we have the FASTA regex from the regex page:","category":"page"},{"location":"validators/","page":"Validators","title":"Validators","text":"julia> fasta_regex = let\n header = re\"[a-z]+\"\n seqline = re\"[ACGT]+\"\n record = '>' * header * '\\n' * rep1(seqline * '\\n')\n rep(record)\n end;","category":"page"},{"location":"validators/#Buffer-validator","page":"Validators","title":"Buffer validator","text":"","category":"section"},{"location":"validators/","page":"Validators","title":"Validators","text":"Automa comes with a convenience function generate_buffer_validator:","category":"page"},{"location":"validators/","page":"Validators","title":"Validators","text":"Given a regex (RE) like the one above, we can do:","category":"page"},{"location":"validators/","page":"Validators","title":"Validators","text":"julia> eval(generate_buffer_validator(:validate_fasta, fasta_regex));\n\njulia> validate_fasta\nvalidate_fasta (generic function with 1 method)","category":"page"},{"location":"validators/","page":"Validators","title":"Validators","text":"And we now have a function that checks if some data matches the regex:","category":"page"},{"location":"validators/","page":"Validators","title":"Validators","text":"julia> validate_fasta(\">hello\\nTAGAGA\\nTAGAG\") # missing trailing newline\n0\n\njulia> validate_fasta(\">helloXXX\") # Error at byte index 7\n7\n\njulia> validate_fasta(\">hello\\nTAGAGA\\nTAGAG\\n\") # nothing; it matches","category":"page"},{"location":"validators/#IO-validators","page":"Validators","title":"IO validators","text":"","category":"section"},{"location":"validators/","page":"Validators","title":"Validators","text":"For large files, having to read the data into a buffer to validate it may not be possible. Automa also supports creating IO validators with the generate_io_validator function:","category":"page"},{"location":"validators/","page":"Validators","title":"Validators","text":"This works very similar to generate_buffer_validator, but the generated function takes an IO, and has a different return value:","category":"page"},{"location":"validators/","page":"Validators","title":"Validators","text":"If the data matches, still return nothing\nElse, return (byte, (line, column)) where byte is the first errant byte, and (line, column) the position of the byte. If the errant byte is a newline, column is 0. If the input reaches unexpected EOF, byte is nothing, and (line, column) points to the last line/column in the IO:","category":"page"},{"location":"validators/","page":"Validators","title":"Validators","text":"julia> eval(generate_io_validator(:validate_io, fasta_regex));\n\njulia> validate_io(IOBuffer(\">hello\\nTAGAGA\\n\"))\n\njulia> validate_io(IOBuffer(\">helX\"))\n(0x58, (1, 5))\n\njulia> validate_io(IOBuffer(\">hello\\n\\n\"))\n(0x0a, (3, 0))\n\njulia> validate_io(IOBuffer(\">hello\\nAC\"))\n(nothing, (2, 2))","category":"page"},{"location":"validators/#Reference","page":"Validators","title":"Reference","text":"","category":"section"},{"location":"validators/","page":"Validators","title":"Validators","text":"Automa.generate_buffer_validator\nAutoma.generate_io_validator\nAutoma.compile","category":"page"},{"location":"validators/#Automa.generate_buffer_validator","page":"Validators","title":"Automa.generate_buffer_validator","text":"generate_buffer_validator(name::Symbol, regexp::RE; goto=true; docstring=true)\n\nGenerate code that, when evaluated, defines a function named name, which takes a single argument data, interpreted as a sequence of bytes. The function returns nothing if data matches Machine, else the index of the first invalid byte. If the machine reached unexpected EOF, returns 0.\n\nIf goto, the function uses the faster but more complicated :goto code.\nIf docstring, automatically create a docstring for the generated function.\n\nSee also: generate_io_validator\n\n\n\n\n\n","category":"function"},{"location":"validators/#Automa.generate_io_validator","page":"Validators","title":"Automa.generate_io_validator","text":"generate_io_validator(funcname::Symbol, regex::RE; goto::Bool=false)\n\nNOTE: This method requires TranscodingStreams to be loaded\n\nCreate code that, when evaluated, defines a function named funcname. This function takes an IO, and checks if the data in the input conforms to the regex, without executing any actions. If the input conforms, return nothing. Else, return (byte, (line, col)), where byte is the first invalid byte, and (line, col) the 1-indexed position of that byte. If the invalid byte is a \\n byte, col is 0 and the line number is incremented. If the input errors due to unexpected EOF, byte is nothing, and the line and column given is the last byte in the file.\n\nIf goto, the function uses the faster but more complicated :goto code.\n\nSee also: generate_buffer_validator\n\n\n\n\n\n","category":"function"},{"location":"validators/#Automa.compile","page":"Validators","title":"Automa.compile","text":"compile(re::RE; optimize::Bool=true, unambiguous::Bool=true)::Machine\n\nCompile a finite state machine (FSM) from re. If optimize, attempt to minimize the number of states in the FSM. If unambiguous, disallow creation of FSM where the actions are not deterministic.\n\nExamples\n\nmachine = let\n name = re\"[A-Z][a-z]+\"\n first_last = name * re\" \" * name\n last_first = name * re\", \" * name\n compile(first_last | last_first)\nend\n\n\n\n\n\ncompile(tokens::Vector{RE}; unambiguous=false)::TokenizerMachine\n\nCompile the regex tokens to a tokenizer machine. The machine can be passed to make_tokenizer.\n\nThe keyword unambiguous decides which of multiple matching tokens is emitted: If false (default), the longest token is emitted. If multiple tokens have the same length, the one with the highest index is returned. If true, make_tokenizer will error if any possible input text can be broken ambiguously down into tokens.\n\nSee also: Tokenizer, make_tokenizer, tokenize\n\n\n\n\n\n","category":"function"},{"location":"reader/","page":"Creating readers","title":"Creating readers","text":"CurrentModule = Automa\nDocTestSetup = quote\n using TranscodingStreams\n using Automa\nend","category":"page"},{"location":"reader/#Creating-a-Reader-type","page":"Creating readers","title":"Creating a Reader type","text":"","category":"section"},{"location":"reader/","page":"Creating readers","title":"Creating readers","text":"The use of generate_reader as we learned in the previous section \"Parsing from an io\" has an issue we need to address: While we were able to read multiple records from the reader by calling read_record multiple times, no state was preserved between these calls, and so, no state can be preserved between reading individual records. This is also what made it necessary to clumsily reset p after emitting each record.","category":"page"},{"location":"reader/","page":"Creating readers","title":"Creating readers","text":"Imagine you have a format with two kinds of records, A and B types. A records must come before B records in the file. Hence, while a B record can appear at any time, once you've seen a B record, there can't be any more A records. When reading records from the file, you must be able to store whether you've seen a B record.","category":"page"},{"location":"reader/","page":"Creating readers","title":"Creating readers","text":"We address this by creating a Reader type which wraps the IO being parsed, and which store any state we want to preserve between records. Let's stick to our simplified FASTA format parsing sequences into Seq objects:","category":"page"},{"location":"reader/","page":"Creating readers","title":"Creating readers","text":"struct Seq\n name::String\n seq::String\nend\n\nmachine = let\n header = onexit!(onenter!(re\"[a-z]+\", :mark_pos), :header)\n seqline = onexit!(onenter!(re\"[ACGT]+\", :mark_pos), :seqline)\n record = onexit!(re\">\" * header * '\\n' * rep1(seqline * '\\n'), :record)\n compile(rep(record))\nend\n@assert machine isa Automa.Machine","category":"page"},{"location":"reader/","page":"Creating readers","title":"Creating readers","text":"This time, we use the following Reader type:","category":"page"},{"location":"reader/","page":"Creating readers","title":"Creating readers","text":"mutable struct Reader{S <: TranscodingStream}\n io::S\n automa_state::Int\nend\n\nReader(io::TranscodingStream) = Reader{typeof(io)}(io, 1)\nReader(io::IO) = Reader(NoopStream(io))","category":"page"},{"location":"reader/","page":"Creating readers","title":"Creating readers","text":"The Reader contains an instance of TranscodingStream to read from, and stores the Automa state between records. The beginning state of Automa is always 1. We can now create our reader function like below. There are only three differences from the definitions in the previous section:","category":"page"},{"location":"reader/","page":"Creating readers","title":"Creating readers","text":"I no longer have the code to decrement p in the :record action - because we can store the Automa state between records such that the machine can handle beginning in the middle of a record if necessary, there is no need to reset the value of p in order to restore the IO to the state right before each record.\nI return (cs, state) instead of just state, because I want to update the Automa state of the Reader, so when it reads the next record, it begins in the same state where the machine left off from the previous state\nIn the arguments, I add start_state, and in the initcode I set cs to the start state, so the machine begins from the correct state","category":"page"},{"location":"reader/","page":"Creating readers","title":"Creating readers","text":"actions = Dict{Symbol, Expr}(\n :mark_pos => :(@mark),\n :header => :(header = String(data[@markpos():p-1])),\n :seqline => :(append!(seqbuffer, data[@markpos():p-1])),\n :record => quote\n seq = Seq(header, String(seqbuffer))\n found_sequence = true\n @escape\n end\n)\n\ngenerate_reader(\n :read_record,\n machine;\n actions=actions,\n arguments=(:(start_state::Int),),\n initcode=quote\n seqbuffer = UInt8[]\n found_sequence = false\n header = \"\"\n cs = start_state\n end,\n loopcode=quote\n if (is_eof && p > p_end) || found_sequence\n @goto __return__\n end\n end,\n returncode=:(found_sequence ? (cs, seq) : throw(EOFError()))\n) |> eval","category":"page"},{"location":"reader/","page":"Creating readers","title":"Creating readers","text":"We then create a function that reads from the Reader, making sure to update the automa_state of the reader:","category":"page"},{"location":"reader/","page":"Creating readers","title":"Creating readers","text":"function read_record(reader::Reader)\n (cs, seq) = read_record(reader.io, reader.automa_state)\n reader.automa_state = cs\n return seq\nend","category":"page"},{"location":"reader/","page":"Creating readers","title":"Creating readers","text":"Let's test it out:","category":"page"},{"location":"reader/","page":"Creating readers","title":"Creating readers","text":"julia> reader = Reader(IOBuffer(\">a\\nT\\n>tag\\nGAG\\nATATA\\n\"));\n\njulia> read_record(reader)\nSeq(\"a\", \"T\")\n\njulia> read_record(reader)\nSeq(\"tag\", \"GAGATATA\")\n\njulia> read_record(reader)\nERROR: EOFError: read end of file","category":"page"},{"location":"theory/#Theory-of-regular-expressions","page":"Theory","title":"Theory of regular expressions","text":"","category":"section"},{"location":"theory/","page":"Theory","title":"Theory","text":"Most programmers are familiar with regular expressions, or regex, for short. What many programmers don't know is that regex have a deep theoretical underpinning, which is leaned on by regex engines to produce highly efficient code.","category":"page"},{"location":"theory/","page":"Theory","title":"Theory","text":"Informally, a regular expression can be thought of as any pattern that can be constructed from the following atoms:","category":"page"},{"location":"theory/","page":"Theory","title":"Theory","text":"The empty string is a valid regular expression, i.e. re\"\"\nLiteral matching of a single symbol from a finite alphabet, such as a character, i.e. re\"p\"","category":"page"},{"location":"theory/","page":"Theory","title":"Theory","text":"Atoms can be combined with the following operations, if R and P are two regular expressions:","category":"page"},{"location":"theory/","page":"Theory","title":"Theory","text":"Alternation, i.e R | P, meaning either match R or P.\nConcatenation, i.e. R * P, meaning match first R, then P\nRepetition, i.e. R*, meaning match R zero or more times consecutively.","category":"page"},{"location":"theory/","page":"Theory","title":"Theory","text":"note: Note\nIn Automa, the alphabet is bytes, i.e. 0x00:0xff, and so each symbol is a single byte. Multi-byte characters such as Æ is interpreted as the two concatenated of two symbols, re\"\\xc3\" * re\"\\x86\". The fact that Automa considers one input to be one byte, not one character, can become relevant if you instruct Automa to complete an action \"on every input\".","category":"page"},{"location":"theory/","page":"Theory","title":"Theory","text":"Popular regex libraries include more operations like ? and +. These can trivially be constructed from the above mentioned primitives, i.e. R? is \"\" | R, and R+ is RR*.","category":"page"},{"location":"theory/","page":"Theory","title":"Theory","text":"Some implementations of regular expression engines, such as PCRE which is the default in Julia as of Julia 1.8, also support operations like backreferences and lookbehind. These operations can NOT be constructed from the above atoms and axioms, meaning that PCRE expressions are not regular expressions in the theoretical sense.","category":"page"},{"location":"theory/","page":"Theory","title":"Theory","text":"The practical importance of theoretically sound regular expressions is that there exists algorithms that can match regular expressions on O(N) time and O(1) space, whereas this is not true for PCRE expressions, which are therefore significantly slower.","category":"page"},{"location":"theory/","page":"Theory","title":"Theory","text":"note: Note\nAutoma.jl only supports real regex, and as such does not support e.g. backreferences, in order to gurantee fast runtime performance.","category":"page"},{"location":"theory/","page":"Theory","title":"Theory","text":"To match regex to strings, the regex are transformed to finite automata, which are then implemented in code.","category":"page"},{"location":"theory/#Nondeterministic-finite-automata","page":"Theory","title":"Nondeterministic finite automata","text":"","category":"section"},{"location":"theory/","page":"Theory","title":"Theory","text":"The programmer Ken Thompson, of Unix fame, deviced Thompson's construction, an algorithm to constuct a nondeterministic finite automaton (NFA) from a regex. An NFA can be thought of as a flowchart (or a directed graph), where one can move from node to node on directed edges. Edges are either labeled ϵ, in which the machine can freely move through the edge to its destination node, or labeled with one or more input symbols, in which the machine may traverse the edge upon consuming said input.","category":"page"},{"location":"theory/","page":"Theory","title":"Theory","text":"To illustrate, let's look at one of the simplest regex: re\"a\", matching the letter a:","category":"page"},{"location":"theory/","page":"Theory","title":"Theory","text":"(Image: State diagram showing state 1, edge transition consuming input 'a', leading to \"accept state\" 2)","category":"page"},{"location":"theory/","page":"Theory","title":"Theory","text":"You begin at the small dot on the right, then immediately go to state 1, the circle marked by a 1. By moving to the next state, state 2, you consume the next symbol from the input string, which must be the symbol marked on the edge from state 1 to state 2 (in this case, an a). Some states are \"accept states\", illustrated by a double circle. If you are at an accept state when you've consumed all symbols of the input string, the string matches the regex.","category":"page"},{"location":"theory/","page":"Theory","title":"Theory","text":"Each of the operations that combine regex can also combine NFAs. For example, given the two regex a and b, which correspond to the NFAs A and B, the regex a * b can be expressed with the following NFA:","category":"page"},{"location":"theory/","page":"Theory","title":"Theory","text":"(Image: State diagram showing ϵ transition from state A to accept state B)","category":"page"},{"location":"theory/","page":"Theory","title":"Theory","text":"Note the ϵ symbol on the edge - this signifies an \"epsilon transition\", meaning you move directly from A to B without consuming any symbols.","category":"page"},{"location":"theory/","page":"Theory","title":"Theory","text":"Similarly, a | b correspond to this NFA structure...","category":"page"},{"location":"theory/","page":"Theory","title":"Theory","text":"(Image: State diagram of the NFA for `a | b`)","category":"page"},{"location":"theory/","page":"Theory","title":"Theory","text":"...and a* to this:","category":"page"},{"location":"theory/","page":"Theory","title":"Theory","text":"(Image: State diagram of the NFA for `a*`)","category":"page"},{"location":"theory/","page":"Theory","title":"Theory","text":"For a larger example, re\"(\\+|-)?(0|1)*\" combines alternation, concatenation and repetition and so looks like this:","category":"page"},{"location":"theory/","page":"Theory","title":"Theory","text":"(Image: State diagram of the NFA for `re\"(\\+|-)?(0|1)*\"`)","category":"page"},{"location":"theory/","page":"Theory","title":"Theory","text":"ϵ-transitions means that there are states from which there are multiple possible next states, e.g. in the larger example above, state 1 can lead to state 2 or state 8. That's what makes NFAs nondeterministic.","category":"page"},{"location":"theory/","page":"Theory","title":"Theory","text":"In order to match a regex to a string then, the movement through the NFA must be emulated. You begin at state 1. When a non-ϵ edge is encountered, you consume a byte of the input data if it matches. If there are no edges that match your input, the string does not match. If an ϵ-edge is encountered from state A that leads to states B and C, the machine goes from state A to state {B, C}, i.e. in both states at once.","category":"page"},{"location":"theory/","page":"Theory","title":"Theory","text":"For example, if the regex re\"(\\+|-)?(0|1)* visualized above is matched to the string -11, this is what happens:","category":"page"},{"location":"theory/","page":"Theory","title":"Theory","text":"NFA starts in state 1\nNFA immediately moves to all states reachable via ϵ transition. It is now in state {2, 3, 5, 7, 8, 9, 10}.\nNFA sees input -. States {2, 3, 4, 5, 7, 8, 10} do not have an edge with - leading out, so these states die. Therefore, the machine is in state 9, consumes the input, and moves to state 2.\nNFA immediately moves to all states reachable from state 2 via ϵ transitions, so goes to {3, 4, 5, 7}\nNFA sees input 1, must be in state 5, moves to state 6, then through ϵ transitions to state {3, 4, 5, 7}\nThe above point repeats, NFA is still in state {3, 4, 5, 7}\nInput ends. Since state 3 is an accept state, the string matches.","category":"page"},{"location":"theory/","page":"Theory","title":"Theory","text":"Using only a regex-to-NFA converter, you could create a simple regex engine simply by emulating the NFA as above. The existence of ϵ transitions means the NFA can be in multiple states at once which adds unwelcome complexity to the emulation and makes it slower. Luckily, every NFA has an equivalent determinisitic finite automaton, which can be constructed from the NFA using the so-called powerset construction.","category":"page"},{"location":"theory/#Deterministic-finite-automata","page":"Theory","title":"Deterministic finite automata","text":"","category":"section"},{"location":"theory/","page":"Theory","title":"Theory","text":"Or DFAs, as they are called, are similar to NFAs, but do not contain ϵ-edges. This means that a given input string has either zero paths (if it does not match the regex), one, unambiguous path, through the DFA. In other words, every input symbol must trigger one unambiguous state transition from one state to one other state.","category":"page"},{"location":"theory/","page":"Theory","title":"Theory","text":"Let's visualize the DFA equivalent to the larger NFA above:","category":"page"},{"location":"theory/","page":"Theory","title":"Theory","text":"(Image: State diagram of the DFA for `re\"(\\+|-)?(0|1)*\"`)","category":"page"},{"location":"theory/","page":"Theory","title":"Theory","text":"It might not be obvious, but the DFA above accepts exactly the same inputs as the previous NFA. DFAs are way simpler to simulate in code than NFAs, precisely because at every state, for every input, there is exactly one action. DFAs can be simulated either using a lookup table of possible state transitions, or by hardcoding GOTO-statements from node to node when the correct input is matched. Code simulating DFAs can be ridicuously fast, with each state transition taking less than 1 nanosecond, if implemented well.","category":"page"},{"location":"theory/","page":"Theory","title":"Theory","text":"Furthermore, DFAs can be optimised. Two edges between the same nodes with labels A and B can be collapsed to a single edge with labels [AB], and redundant nodes can be collapsed. The optimised DFA equivalent to the one above is simply: ","category":"page"},{"location":"theory/","page":"Theory","title":"Theory","text":"(Image: State diagram of the simpler DFA for `re\"(\\+|-)?(0|1)*\"`)","category":"page"},{"location":"theory/","page":"Theory","title":"Theory","text":"Unfortunately, as the name \"powerset construction\" hints, convering an NFA with N nodes may result in a DFA with up to 2^N nodes. This inconvenient fact drives important design decisions in regex implementations. There are basically two approaches:","category":"page"},{"location":"theory/","page":"Theory","title":"Theory","text":"Automa.jl will just construct the DFA directly, and accept a worst-case complexity of O(2^N). This is acceptable (I think) for Automa, because this construction happens in Julia's package precompilation stage (not on package loading or usage), and because the DFAs are assumed to be constants within a package. So, if a developer accidentally writes an NFA which is unacceptably slow to convert to a DFA, it will be caught in development. Luckily, it's pretty rare to have NFAs that result in truly abysmally slow conversions to DFA's: While bad corner cases exist, they are rarely as catastrophic as the O(2^N) would suggest. Currently, Automa's regex/NFA/DFA compilation pipeline is very slow and unoptimized, but, since it happens during precompile time, it is insignificant compared to LLVM compile times.","category":"page"},{"location":"theory/","page":"Theory","title":"Theory","text":"Other implementations, like the popular ripgrep command line tool, uses an adaptive approach. It constructs the DFA on the fly, as each symbol is being matched, and then caches the DFA. If the DFA size grows too large, the cache is flushed. If the cache is flushed too often, it falls back to simulating the NFA directly. Such an approach is necessary for ripgrep, because the regex -> NFA -> DFA compilation happens at runtime and must be near-instantaneous, unlike Automa, where it happens during package precompilation and can afford to be slow.","category":"page"},{"location":"theory/#Automa-in-a-nutshell","page":"Theory","title":"Automa in a nutshell","text":"","category":"section"},{"location":"theory/","page":"Theory","title":"Theory","text":"Automa simulates the DFA by having the DFA create a Julia Expr, which is then used to generate a Julia function using metaprogramming. Like all other Julia code, this function is then optimized by Julia and then LLVM, making the DFA simulations very fast.","category":"page"},{"location":"theory/","page":"Theory","title":"Theory","text":"Because Automa just constructs Julia functions, we can do extra tricks that ordinary regex engines cannot: We can splice arbitrary Julia code into the DFA simulation. Currently, Automa supports two such kinds of code: actions, and preconditions.","category":"page"},{"location":"theory/","page":"Theory","title":"Theory","text":"Actions are Julia code that is executed during certain state transitions. Preconditions are Julia code, that evaluates to a Bool value, and which are checked before a state transition. If a precondition evaluates to false, the transition is not taken.","category":"page"},{"location":"custom/","page":"Customizing codegen","title":"Customizing codegen","text":"CurrentModule = Automa\nDocTestSetup = quote\n using TranscodingStreams\n using Automa\nend","category":"page"},{"location":"custom/#Customizing-Automa's-code-generation","page":"Customizing codegen","title":"Customizing Automa's code generation","text":"","category":"section"},{"location":"custom/","page":"Customizing codegen","title":"Customizing codegen","text":"Automa offers a few ways of customising the created code. Note that the precise code generated by Automa is considered an implementation detail, and as such is subject to change without warning. Only the overall behavior, i.e. the \"DFA simulation\" can be considered stable.","category":"page"},{"location":"custom/","page":"Customizing codegen","title":"Customizing codegen","text":"Nonetheless, it is instructive to look at the code generated for the machine in the \"parsing from a buffer\" section. I present it here cleaned up and with comments for human inspection.","category":"page"},{"location":"custom/","page":"Customizing codegen","title":"Customizing codegen","text":"# Initialize variables used in the code below\nbyte::UInt8 = 0x00\np::Int = 1\np_end::Int = sizeof(data)\np_eof::Int = p_end\ncs::Int = 1\n\n# Turn the input buffer into SizedMemory, to load data from pointer\nGC.@preserve data begin\nmem::Automa.SizedMemory = (Automa.SizedMemory)(data)\n\n# For every input byte:\nwhile p ≤ p_end && cs > 0\n # Load byte\n byte = mem[p]\n\n # Load the action, to execute, if any, by looking up in a table\n # using the current state (cs) and byte\n @inbounds var\"##292\" = Int((Int8[0 0 … 0 0; 0 0 … 0 0; … ; 0 0 … 0 0; 0 0 … 0 0])[(cs - 1) << 8 + byte + 1])\n\n # Look up next state. If invalid input, next state is negative current state\n @inbounds cs = Int((Int8[-1 -2 … -5 -6; -1 -2 … -5 -6; … ; -1 -2 … -5 -6; -1 -2 … -5 -6])[(cs - 1) << 8 + byte + 1])\n\n # Check each possible action looked up above, and execute it\n # if it is not zero\n if var\"##292\" == 1\n pos = p\n elseif var\"##292\" == 2\n header = String(data[pos:p - 1])\n elseif if var\"##292\" == 3\n append!(buffer, data[pos:p - 1])\n elseif var\"##292\" == 4\n seq = Seq(header, String(buffer))\n push!(seqs, seq)\n end\n\n # Increment position by 1\n p += 1\n\n # If we're at end of input, and the current state in in an accept state:\n if p > p_eof ≥ 0 && cs > 0 && (cs < 65) & isodd(0x0000000000000021 >>> ((cs - 1) & 63))\n # What follows is a list of all possible EOF actions.\n\n # If state is state 6, execute the appropriate action\n # tied to reaching end of input at this state\n if cs == 6\n seq = Seq(header, String(buffer))\n push!(seqs, seq)\n cs = 0\n\n # Else, if the state is < 0, we have taken a bad input (see where cs was updated)\n # move position back by one to leave it stuck where it found bad input\n elseif cs < 0\n p -= 1\n end\n\n # If cs is not 0, the machine is in an error state.\n # Gather some information about machine state, then throw an error\n if cs != 0\n cs = -(abs(cs))\n var\"##291\" = if p_eof > -1 && p > p_eof\n nothing\n else\n byte\n end\n Automa.throw_input_error($machine, -cs, var\"##291\", mem, p)\n end\nend\nend # GC.@preserve","category":"page"},{"location":"custom/#Using-CodeGenContext","page":"Customizing codegen","title":"Using CodeGenContext","text":"","category":"section"},{"location":"custom/","page":"Customizing codegen","title":"Customizing codegen","text":"The CodeGenContext (or ctx, for short) struct is a collection of settings used to customize code creation. If not passed to the code generator functions, a default CodeGenContext is used.","category":"page"},{"location":"custom/#Variable-names","page":"Customizing codegen","title":"Variable names","text":"","category":"section"},{"location":"custom/","page":"Customizing codegen","title":"Customizing codegen","text":"One obvious place to customize is variable names. In the code above, for example, the input bytes are named byte. What if you have another variable with that name?","category":"page"},{"location":"custom/","page":"Customizing codegen","title":"Customizing codegen","text":"The ctx contains a .vars field with a Variables object, which is just a collection of names used in generated code. For example, to rename byte to u8 in the generated code, you first create the appropriate ctx, then use the ctx to make the code.","category":"page"},{"location":"custom/","page":"Customizing codegen","title":"Customizing codegen","text":"ctx = CodeGenContext(vars=Automa.Variables(byte=:u8))\ncode = generate_code(ctx, machine, actions)","category":"page"},{"location":"custom/#Other-options","page":"Customizing codegen","title":"Other options","text":"","category":"section"},{"location":"custom/","page":"Customizing codegen","title":"Customizing codegen","text":"The clean option strips most linenumber information from the generated code, if set to true.\ngetbyte is a function that is called like this getbyte(data, p) to obtain byte in the main loop. This is usually just Base.getindex, but can be customised to be an arbitrary function.","category":"page"},{"location":"custom/#Code-generator","page":"Customizing codegen","title":"Code generator","text":"","category":"section"},{"location":"custom/","page":"Customizing codegen","title":"Customizing codegen","text":"The code showed at the top of this page is code made with the table code generator. Automa also supports creating code using the goto code generator instead of the default table generator. The goto generator creates code with the following properties:","category":"page"},{"location":"custom/","page":"Customizing codegen","title":"Customizing codegen","text":"It is much harder to read than table code\nThe code is much larger\nIt does not use boundschecking\nIt does not allow customizing getbyte\nIt is much faster than the table generator","category":"page"},{"location":"custom/","page":"Customizing codegen","title":"Customizing codegen","text":"Normally, the table generator is good enough, but for performance sensitive applications, the goto generator can be used.","category":"page"},{"location":"custom/#Optimising-the-previous-example","page":"Customizing codegen","title":"Optimising the previous example","text":"","category":"section"},{"location":"custom/","page":"Customizing codegen","title":"Customizing codegen","text":"Let's try optimising the previous FASTA parsing example. My original code did 300 MB/s.","category":"page"},{"location":"custom/","page":"Customizing codegen","title":"Customizing codegen","text":"To recap, the Machine was:","category":"page"},{"location":"custom/","page":"Customizing codegen","title":"Customizing codegen","text":"machine = let\n header = onexit!(onenter!(re\"[a-z]+\", :mark_pos), :header)\n seqline = onexit!(onenter!(re\"[ACGT]+\", :mark_pos), :seqline)\n record = onexit!(re\">\" * header * '\\n' * rep1(seqline * '\\n'), :record)\n compile(rep(record))\nend\n@assert machine isa Automa.Machine","category":"page"},{"location":"custom/","page":"Customizing codegen","title":"Customizing codegen","text":"The first improvement is to the algorithm itself: Instead of parsing to a vector of Seq, I'm simply going to index the input data, filling up an existing vector of:","category":"page"},{"location":"custom/","page":"Customizing codegen","title":"Customizing codegen","text":"struct SeqPos\n offset::Int\n hlen::Int32\n slen::Int32\nend","category":"page"},{"location":"custom/","page":"Customizing codegen","title":"Customizing codegen","text":"The idea here is to remove as many allocations as possible. This will more accurately show the speed of the DFA simulation, which is now the bottleneck. The actions will therefore be ","category":"page"},{"location":"custom/","page":"Customizing codegen","title":"Customizing codegen","text":"actions = Dict(\n :mark_pos => :(pos = p),\n :header => :(hlen = p - pos),\n :seqline => :(slen += p - pos),\n :record => quote\n seqpos = SeqPos(offset, hlen, slen)\n nseqs += 1\n seqs[nseqs] = seqpos\n offset += hlen + slen\n slen = 0\n end\n);\n\n@assert actions isa Dict","category":"page"},{"location":"custom/","page":"Customizing codegen","title":"Customizing codegen","text":"With the new variables such as slen, we need to update the function code as well:","category":"page"},{"location":"custom/","page":"Customizing codegen","title":"Customizing codegen","text":"@eval function parse_fasta(data)\n pos = slen = hlen = offset = nseqs = 0\n seqs = Vector{SeqPos}(undef, 400000)\n $(generate_code(machine, actions))\n return seqs\nend","category":"page"},{"location":"custom/","page":"Customizing codegen","title":"Customizing codegen","text":"This parses a 45 MB file in about 100 ms in my laptop, that's 450 MB/s. Now let's try the exact same, except with the code being generated by:","category":"page"},{"location":"custom/","page":"Customizing codegen","title":"Customizing codegen","text":"$(generate_code(CodeGenContext(generator=:goto), machine, actions))","category":"page"},{"location":"custom/","page":"Customizing codegen","title":"Customizing codegen","text":"Now the code parses the same 45 MB FASTA file in 11.14 miliseconds, parsing at about 4 GB/s.","category":"page"},{"location":"custom/#Reference","page":"Customizing codegen","title":"Reference","text":"","category":"section"},{"location":"custom/","page":"Customizing codegen","title":"Customizing codegen","text":"Automa.CodeGenContext\nAutoma.Variables","category":"page"},{"location":"custom/#Automa.CodeGenContext","page":"Customizing codegen","title":"Automa.CodeGenContext","text":"CodeGenContext(;\n vars=Variables(:p, :p_end, :is_eof, :cs, :data, :mem, :byte, :buffer),\n generator=:table,\n getbyte=Base.getindex,\n clean=false\n)\n\nCreate a CodeGenContext (ctx), a struct that stores options for Automa code generation. Ctxs are used for Automa's various code generator functions. They currently take the following options (more may be added in future versions)\n\nvars::Variables: variable names used in generated code. See the Variables struct.\ngenerator::Symbol: code generator mechanism (:table or :goto). The table generator creates smaller, simpler code that uses a vector of integers to determine state transitions. The goto-generator uses a maze of @goto-statements, and create larger, more complex code, that is faster.\ngetbyte::Function (table generator only): function f(data, p) to access byte from data. Default: Base.getindex.\nclean: Whether to remove some QuoteNodes (line information) from the generated code\n\nExample\n\njulia> ctx = CodeGenContext(generator=:goto, vars=Variables(buffer=:tbuffer));\n\njulia> generate_code(ctx, compile(re\"a+\")) isa Expr\ntrue\n\n\n\n\n\n","category":"type"},{"location":"custom/#Automa.Variables","page":"Customizing codegen","title":"Automa.Variables","text":"Struct used to store variable names used in generated code. Contained in a CodeGenContext. Create a custom Variables for your CodeGenContext if you want to customize the variables used in Automa codegen, typically if you have conflicting variables with the same name.\n\nAutoma generates code with the following variables, shown below with their default names:\n\np::Int: current position of data\np_end::Int: end position of data\nis_eof::Bool: Whether p_end marks end file stream\ncs::Int: current state\ndata::Any: input data\nmem::SizedMemory: Memory wrapping data\nbyte::UInt8: current byte being read from data\nbuffer::TranscodingStreams.Buffer: (generate_reader only)\n\nExample\n\njulia> ctx = CodeGenContext(vars=Variables(byte=:u8));\n\njulia> ctx.vars.byte\n:u8\n\n\n\n\n\n","category":"type"},{"location":"regex/","page":"Regex","title":"Regex","text":"CurrentModule = Automa\nDocTestSetup = quote\n using TranscodingStreams\n using Automa\nend","category":"page"},{"location":"regex/#Regex","page":"Regex","title":"Regex","text":"","category":"section"},{"location":"regex/","page":"Regex","title":"Regex","text":"Automa regex (of the type Automa.RE) are conceptually similar to the Julia built-in regex. They are made using the @re_str macro, like this: re\"ABC[DEF]\".","category":"page"},{"location":"regex/","page":"Regex","title":"Regex","text":"Automa regex matches individual bytes, not characters. Hence, re\"Æ\" (with the UTF-8 encoding [0xc3, 0x86]) is equivalent to re\"\\xc3\\x86\", and is considered the concatenation of two independent input bytes.","category":"page"},{"location":"regex/","page":"Regex","title":"Regex","text":"The @re_str macro supports the following content:","category":"page"},{"location":"regex/","page":"Regex","title":"Regex","text":"Literal symbols, such as re\"ABC\", re\"\\xfe\\xa2\" or re\"Ø\".\n| for alternation, as in re\"A|B\", meaning \"A or B\". \nByte sets with [], like re\"[ABC]\". This means any of the bytes in the brackets, e.g. re\"[ABC]\" is equivalent to re\"A|B|C\".\nInverted byte sets, e.g. re\"[^ABC]\", meaning any byte, except those in re[ABC].\nRepetition, with X* meaning zero or more repetitions of X.\n+, where X+ means XX*, i.e. 1 or more repetitions of X.\n?, where X? means X | \"\", i.e. 0 or 1 occurrences of X. It applies to the last element of the regex.\nParentheses to group expressions, like in re\"A(B|C)?\".","category":"page"},{"location":"regex/","page":"Regex","title":"Regex","text":"You can combine regex with the following operations:","category":"page"},{"location":"regex/","page":"Regex","title":"Regex","text":"* for concatenation, with re\"A\" * re\"B\" being the same as re\"AB\". Regex can also be concatenated with Chars and Strings, which will cause the chars/strings to be converted to regex first.\n| for alternation, with re\"A\" | re\"B\" being the same as re\"A|B\"\n& for intersection of regex, i.e. for regex A and B, the set of inputs matching A & B is exactly the intersection of the inputs match A and those matching B. As an example, re\"A[AB]C+D?\" & re\"[ABC]+\" is re\"ABC\".\n\\ for difference, such that for regex A and B, A \\ B creates a new regex matching all those inputs that match A but not B.\n! for inversion, such that !re\"[A-Z]\" matches all other strings than those which match re\"[A-Z]\". Note that !re\"a\" also matches e.g. \"aa\", since this does not match re\"a\".","category":"page"},{"location":"regex/","page":"Regex","title":"Regex","text":"Finally, the functions opt, rep and rep1 are equivalent to the operators ?, * and +, so for eg. opt(re\"a\" * rep(re\"b\") * re\"c\") is equivalent to re\"(ab*c)?\".","category":"page"},{"location":"regex/#fasta_example","page":"Regex","title":"Example","text":"","category":"section"},{"location":"regex/","page":"Regex","title":"Regex","text":"Suppose we want to create a regex that matches a simplified version of the FASTA format. This \"simple FASTA\" format is defined like so:","category":"page"},{"location":"regex/","page":"Regex","title":"Regex","text":"The format is a series of zero or more records, concatenated\nA record consists of the concatenation of:\nA leading '>'\nA header, composed of one or more letters in 'a-z',\nA newline symbol '\\n'\nA series of one or more sequence lines\nA sequence line is the concatenation of:\nOne or more symbols from the alphabet [ACGT]\nA newline","category":"page"},{"location":"regex/","page":"Regex","title":"Regex","text":"We can represent this concisely as a regex: re\"(>[a-z]+\\n([ACGT]+\\n)+)*\" To make it easier to read, we typically construct regex incrementally, like such:","category":"page"},{"location":"regex/","page":"Regex","title":"Regex","text":"fasta_regex = let\n header = re\"[a-z]+\"\n seqline = re\"[ACGT]+\"\n record = '>' * header * '\\n' * rep1(seqline * '\\n')\n rep(record)\nend\n@assert fasta_regex isa RE","category":"page"},{"location":"regex/#Reference","page":"Regex","title":"Reference","text":"","category":"section"},{"location":"regex/","page":"Regex","title":"Regex","text":"RE\n@re_str","category":"page"},{"location":"regex/#Automa.RegExp.RE","page":"Regex","title":"Automa.RegExp.RE","text":"RE(s::AbstractString)\n\nAutoma regular expression (regex) that is used to match a sequence of input bytes. Regex should preferentially be constructed using the @re_str macro: re\"ab+c?\". Regex can be combined with other regex, strings or chars with *, |, & and \\:\n\na * b matches inputs that matches first a, then b\na | b matches inputs that matches a or b\na & b matches inputs that matches a and b\na \\ b matches input that mathes a but not b\n!a matches all inputs that does not match a.\n\nSet actions to regex with onenter!, onexit!, onall! and onfinal!, and preconditions with precond!.\n\nExample\n\njulia> regex = (re\"a*b?\" | opt('c')) * re\"[a-z]+\";\n\njulia> regex = rep1((regex \\ \"aba\") & !re\"ca\");\n\njulia> regex isa RE\ntrue\n\njulia> compile(regex) isa Automa.Machine\ntrue\n\nSee also: @re_str, compile\n\n\n\n\n\n","category":"type"},{"location":"regex/#Automa.RegExp.@re_str","page":"Regex","title":"Automa.RegExp.@re_str","text":"@re_str -> RE\n\nConstruct an Automa regex of type RE from a string. Note that due to Julia's raw string escaping rules, re\"\\\\\" means a single backslash, and so does re\"\\\\\\\\\", while re\"\\\\\\\\\\\"\" means a backslash, then a quote character.\n\nExamples:\n\njulia> re\"ab?c*[def][^ghi]+\" isa RE\ntrue \n\nSee also: RE\n\n\n\n\n\n","category":"macro"},{"location":"","page":"Home","title":"Home","text":"CurrentModule = Automa\nDocTestSetup = quote\n using TranscodingStreams\n using Automa\nend","category":"page"},{"location":"#Automa.jl","page":"Home","title":"Automa.jl","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Automa is a regex-to-Julia compiler. By compiling regex to Julia code in the form of Expr objects, Automa provides facilities to create efficient and robust regex-based lexers, tokenizers and parsers using Julia's metaprogramming capabilities. You can view Automa as a regex engine that can insert arbitrary Julia code into its input matching process, which will be executed when certain parts of the regex matches an input.","category":"page"},{"location":"","page":"Home","title":"Home","text":"(Image: Schema of Automa.jl)","category":"page"},{"location":"","page":"Home","title":"Home","text":"Automa.jl is designed to generate very efficient code to scan large text data, which is often much faster than handcrafted code. Automa.jl is a regex engine that can insert arbitrary Julia code into its input matching process, that will be executed in when certain parts of the regex matches an input.","category":"page"},{"location":"#Where-to-start","page":"Home","title":"Where to start","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"If you're not familiar with regex engines, start by reading the theory section, then you might want to read every section from the top. They're structured like a tutorial, beginning from the simplest use of Automa and moving to more advanced uses.","category":"page"},{"location":"","page":"Home","title":"Home","text":"If you like to dive straight in, you might want to start by reading the examples below, then go through the examples in the examples/ directory in the Automa repository.","category":"page"},{"location":"#Examples","page":"Home","title":"Examples","text":"","category":"section"},{"location":"#Validate-some-text-is-composed-only-of-ASCII-alphanumeric-characters","page":"Home","title":"Validate some text is composed only of ASCII alphanumeric characters","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"generate_buffer_validator(:validate_alphanumeric, re\"[a-zA-Z0-9]*\") |> eval\n\nfor s in [\"abc\", \"aU81m\", \"!,>\"]\n println(\"$s is alphanumeric? $(isnothing(validate_alphanumeric(s)))\")\nend","category":"page"},{"location":"#Making-a-lexer","page":"Home","title":"Making a lexer","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"tokens = [\n :identifier => re\"[A-Za-z_][0-9A-Za-z_!]*\",\n :lparens => re\"\\(\",\n :rparens => re\"\\)\",\n :comma => re\",\",\n :quot => re\"\\\"\",\n :space => re\"[\\t\\f ]+\",\n];\n@eval @enum Token errortoken $(first.(tokens)...)\nmake_tokenizer((errortoken, \n [Token(i) => j for (i,j) in enumerate(last.(tokens))]\n)) |> eval\n\ncollect(tokenize(Token, \"\"\"(alpha, \"beta15\")\"\"\"))","category":"page"},{"location":"#Make-a-simple-TSV-file-parser","page":"Home","title":"Make a simple TSV file parser","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"machine = let\n name = onexit!(onenter!(re\"[^\\t\\r\\n]+\", :mark), :name)\n field = onexit!(onenter!(re\"[^\\t\\r\\n]+\", :mark), :field)\n nameline = name * rep('\\t' * name)\n record = onexit!(field * rep('\\t' * field), :record)\n compile(nameline * re\"\\r?\\n\" * record * rep(re\"\\r?\\n\" * record) * rep(re\"\\r?\\n\"))\nend\n\nactions = Dict(\n :mark => :(pos = p),\n :name => :(push!(headers, String(data[pos:p-1]))),\n :field => quote\n n_fields += 1\n push!(fields, String(data[pos:p-1]))\n end,\n :record => quote\n n_fields == length(headers) || error(\"Malformed TSV\")\n n_fields = 0\n end\n)\n\n@eval function parse_tsv(data)\n headers = String[]\n fields = String[]\n pos = n_fields = 0\n $(generate_code(machine, actions))\n (headers, reshape(fields, length(headers), :))\nend\n\nheader, data = parse_tsv(\"a\\tabc\\n12\\t13\\r\\nxyc\\tz\\n\\n\")","category":"page"},{"location":"io/","page":"Parsing IOs","title":"Parsing IOs","text":"CurrentModule = Automa\nDocTestSetup = quote\n using TranscodingStreams\n using Automa\nend","category":"page"},{"location":"io/#Parsing-from-an-IO","page":"Parsing IOs","title":"Parsing from an IO","text":"","category":"section"},{"location":"io/","page":"Parsing IOs","title":"Parsing IOs","text":"Some file types are gigabytes or tens of gigabytes in size. For these files, parsing from a buffer may be impractical, as they require you to read in the entire file in memory at once. Automa enables this by hooking into TranscodingStreams.jl, a package that provides a wrapper IO of the type TranscodingStream. Importantly, these streams buffer their input data. Automa is thus able to operate directly on the input buffers of TranscodingStream objects.","category":"page"},{"location":"io/","page":"Parsing IOs","title":"Parsing IOs","text":"Unfortunately, this significantly complicates things compared to parsing from a simple buffer. The main problem is that, when reading from a buffered stream, the byte array visible from Automa is only a small slice of the total input data. Worse, when the end of the stream is reached, data from the buffer is flushed, i.e. removed from the stream. To handle this, Automa must reach deep into the implementation details of TranscodingStreams, and also break some of its own abstractions. It's not pretty, but it's what we have.","category":"page"},{"location":"io/","page":"Parsing IOs","title":"Parsing IOs","text":"Practically speaking, parsing from IO is done with the function Automa.generate_reader. Despite its name, this function is NOT directly used to generate objects like FASTA.Reader. Instead, this function produces Julia code (an Expr object) that, when evaluated, defines a function that can execute an Automa machine on an IO. Let me first show the code generated by generate_reader in pseudocode format:","category":"page"},{"location":"io/","page":"Parsing IOs","title":"Parsing IOs","text":"function { function name }(stream::TranscodingStream, { args... })\n { init code }\n\n @label __exec__\n\n p = current buffer position\n p_end = final buffer position\n\n # the eof call below will first flush any used data from buffer,\n # then load in new data, before checking if it's really eof.\n is_eof = eof(stream)\n execute normal automa parsing of the buffer\n update buffer position to match p\n\n { loop code }\n\n if cs < 0 # meaning: erroneous input or erroneous EOF\n { error code }\n end\n\n if machine errored or reached EOF\n @label __return__\n { return code }\n end\n @goto __exec__\nend","category":"page"},{"location":"io/","page":"Parsing IOs","title":"Parsing IOs","text":"The content marked { function name }, { args... }, { init code }, { loop code }, { error code } and { return code } are arguments provided to Automa.generate_reader. By providing these, the user can customize the generated function further.","category":"page"},{"location":"io/","page":"Parsing IOs","title":"Parsing IOs","text":"The main difference from the code generated to parse a buffer is the label/GOTO pair __exec__, which causes Automa to repeatedly load data into the buffer, execute the machine, then flush used data from the buffer, then execute the machine, and so on, until interrupted.","category":"page"},{"location":"io/","page":"Parsing IOs","title":"Parsing IOs","text":"Importantly, when parsing from a buffer, p and p_end refer to the position in the current buffer. This may not be the position in the stream, and when the data in the buffer is flushed, it may move the data in the buffer so that p now become invalid. This means you can't simply store a variable marked_pos that points to the current value of p and expect that the same data is at that position later. Furthermore, is_eof is set to whether the stream has reached EOF.","category":"page"},{"location":"io/#Example-use","page":"Parsing IOs","title":"Example use","text":"","category":"section"},{"location":"io/","page":"Parsing IOs","title":"Parsing IOs","text":"Let's show the simplest possible example of such a function. We have a Machine (which, recall, is a compiled regex) called machine, and we want to make a function that returns true if a given IO contain data that conforms to the regex format specified by the Machine.","category":"page"},{"location":"io/","page":"Parsing IOs","title":"Parsing IOs","text":"We will still use the machine from before, just without any actions:","category":"page"},{"location":"io/","page":"Parsing IOs","title":"Parsing IOs","text":"machine = let\n header = re\"[a-z]+\"\n seqline = re\"[ACGT]+\"\n record = re\">\" * header * '\\n' * rep1(seqline * '\\n')\n compile(rep(record))\nend\n@assert machine isa Automa.Machine","category":"page"},{"location":"io/","page":"Parsing IOs","title":"Parsing IOs","text":"To create our simple IO reader, we simply need to call generate_reader, where the { return code } is a check if iszero(cs), meaning if the machine exited at a proper exit state. We also need to set error_code to an empty expression in order to prevent throwing an error on invalid code. Instead, we want it to go immediately to return - we call this section __return__, so we need to @goto __return__. Then, we need to evaluate the code created by generate_reader in order to define the function validate_fasta","category":"page"},{"location":"io/","page":"Parsing IOs","title":"Parsing IOs","text":"julia> return_code = :(iszero(cs));\n\njulia> error_code = :(@goto __return__);\n\njulia> eval(generate_reader(:validate_fasta, machine; returncode=return_code, errorcode=error_code));","category":"page"},{"location":"io/","page":"Parsing IOs","title":"Parsing IOs","text":"The generated function validate_fasta has the function signature: validate_fasta(stream::TranscodingStream). If our input IO is not a TranscodingStream, we can wrap it in the relatively lightweight NoopStream, which, as the name suggests, does nothing to the data:","category":"page"},{"location":"io/","page":"Parsing IOs","title":"Parsing IOs","text":"julia> io = NoopStream(IOBuffer(\">a\\nTAG\\nTA\\n>bac\\nG\\n\"));\n\njulia> validate_fasta(io)\ntrue\n\njulia> validate_fasta(NoopStream(IOBuffer(\"random data\")))\nfalse","category":"page"},{"location":"io/#Reading-a-single-record","page":"Parsing IOs","title":"Reading a single record","text":"","category":"section"},{"location":"io/","page":"Parsing IOs","title":"Parsing IOs","text":"danger: Danger\nThe following code is only for demonstration purposes. It has one important flaw, which will be addressed in a later section, so do not copy-paste it for serious work.","category":"page"},{"location":"io/","page":"Parsing IOs","title":"Parsing IOs","text":"There are a few more subtleties related to the generate_reader function. Suppose we instead want to create a function that reads a single FASTA record from an IO. In this case, it's no good that the function created from generate_reader will loop until the IO reaches EOF - we need to find a way to stop it after reading a single record. We can do this with the pseudomacro @escape, as shown below.","category":"page"},{"location":"io/","page":"Parsing IOs","title":"Parsing IOs","text":"We will reuse our Seq struct and our Machine from the \"parsing from a buffer\" section of this tutorial:","category":"page"},{"location":"io/","page":"Parsing IOs","title":"Parsing IOs","text":"struct Seq\n name::String\n seq::String\nend\n\nmachine = let\n header = onexit!(onenter!(re\"[a-z]+\", :mark_pos), :header)\n seqline = onexit!(onenter!(re\"[ACGT]+\", :mark_pos), :seqline)\n record = onexit!(re\">\" * header * '\\n' * rep1(seqline * '\\n'), :record)\n compile(rep(record))\nend\n@assert machine isa Automa.Machine\n\n# output","category":"page"},{"location":"io/","page":"Parsing IOs","title":"Parsing IOs","text":"The code below contains @escape in the :record action - meaning: Break out of machine execution.","category":"page"},{"location":"io/","page":"Parsing IOs","title":"Parsing IOs","text":"actions = Dict{Symbol, Expr}(\n :mark_pos => :(pos = p),\n :header => :(header = String(data[pos:p-1])),\n :seqline => :(append!(seqbuffer, data[pos:p-1])),\n\n # Only this action is different from before!\n :record => quote\n seq = Seq(header, String(seqbuffer))\n found_sequence = true\n # Reset p one byte if we're not at the end\n p -= !(is_eof && p > p_end)\n @escape\n end\n)\n@assert actions isa Dict\n\n# output","category":"page"},{"location":"io/","page":"Parsing IOs","title":"Parsing IOs","text":"@escape is not actually a real macro, but what Automa calls a \"pseudomacro\". It is expanded during Automa's own compiler pass before Julia's lowering. The @escape pseudomacro is replaced with code that breaks it out of the executing machine, without reaching EOF or an invalid byte.","category":"page"},{"location":"io/","page":"Parsing IOs","title":"Parsing IOs","text":"Let's see how I use generate_reader, then I will explain each part:","category":"page"},{"location":"io/","page":"Parsing IOs","title":"Parsing IOs","text":"generate_reader(\n :read_record,\n machine;\n actions=actions,\n initcode=quote\n seqbuffer = UInt8[]\n pos = 0\n found_sequence = false\n header = \"\"\n end,\n loopcode=quote\n if (is_eof && p > p_end) || found_sequence\n @goto __return__\n end\n end,\n returncode=:(found_sequence ? seq : nothing)\n) |> eval","category":"page"},{"location":"io/","page":"Parsing IOs","title":"Parsing IOs","text":"In the :record, action, a few new things happen.","category":"page"},{"location":"io/","page":"Parsing IOs","title":"Parsing IOs","text":"First, I set the flag found_sequence = false. In the loop code, I look for this flag to signal that the function should return. Remember, the loop code happens after machine execution, which can mean either that the execution was broken out of by @escape, or than the buffer ran out and need to be refilled. I could just return the sequence directly in the action, but then I would skip a bunch of the code generated by generate_reader which sets the buffer state correctly, so this is never adviced. Instead, in the loop code, which executes after the buffer has been flushed, I check for this flag, and goes to __return__ if necessary. I could also just return directly in the loopcode, but I prefer only having one place to retun from the function.\nI use @escape to break out of the machine, i.e. stop machine execution\nFinally, I decrement p, if and only if the machine has not reached EOF (which happens when is_eof is true, meaning the last part of the IO has been buffered, and p > p_end, meaning the end of the buffer has been reached). This is because, the first record ends when the IO reads the second > symbol. If I then were to read another record from the same IO, I would have already read the > symbol. I need to reset p by 1, so the > is also read on the next call to read_record.","category":"page"},{"location":"io/","page":"Parsing IOs","title":"Parsing IOs","text":"I can use the function like this:","category":"page"},{"location":"io/","page":"Parsing IOs","title":"Parsing IOs","text":"julia> io = NoopStream(IOBuffer(\">a\\nT\\n>tag\\nGAGA\\nTATA\\n\"));\n\njulia> read_record(io)\nSeq(\"a\", \"T\")\n\njulia> read_record(io)\nSeq(\"tag\", \"GAGATATA\")\n\njulia> read_record(io)","category":"page"},{"location":"io/#Preserving-data-by-marking-the-buffer","page":"Parsing IOs","title":"Preserving data by marking the buffer","text":"","category":"section"},{"location":"io/","page":"Parsing IOs","title":"Parsing IOs","text":"There are several problems with the implementation above: The following code in my actions dict:","category":"page"},{"location":"io/","page":"Parsing IOs","title":"Parsing IOs","text":"header = String(data[pos:p-1])","category":"page"},{"location":"io/","page":"Parsing IOs","title":"Parsing IOs","text":"Creates header by accessing the data buffer. However, when reading an IO, how can I know that the data hasn't shifted around in the buffer between when I defined pos? For example, suppose we have a short buffer of only 8 bytes, and the following FASTA file: >abcdefghijkl\\nA. Then, the buffer is first filled with >abcdefg. When entering the header, I execute the action :mark_position at p = 2, so pos = 2. But now, when I reach the end of the header, the used data in the buffer has been flushed, and the data is now: hijkl\\nA, and p = 14. I then try to access data[2:13], which is out of bounds!","category":"page"},{"location":"io/","page":"Parsing IOs","title":"Parsing IOs","text":"Luckily, the buffers of TranscodingStreams allow us to \"mark\" a position to save it. The buffer will not flush the marked position, or any position after the marked position. If necessary, it will resize the buffer to be able to load more data while keeping the marked position.","category":"page"},{"location":"io/","page":"Parsing IOs","title":"Parsing IOs","text":"Inside the function generated by generate_reader, we can use the zero-argument pseudomacro @mark(), which marks the position p. The macro @markpos() can then be used to get the marked position, which will point to the same data in the buffer, even after the data in the buffer has been shifted after it's been flushed. This works because the mark is stored inside the TranscodingStream buffer, and the buffer makes sure to update the mark if the content moves. Hence, we can re-write the actions:","category":"page"},{"location":"io/","page":"Parsing IOs","title":"Parsing IOs","text":"actions = Dict{Symbol, Expr}(\n :mark_position => :(@mark),\n :header => :(header = String(data[@markpos():p-1])),\n :seqline => :(append!(buffer, data[@markpos():p-1])),\n\n [:record action omitted...]\n)","category":"page"},{"location":"io/","page":"Parsing IOs","title":"Parsing IOs","text":"In our example above with the small 8-byte buffer, this is what would happen: First, the buffer contains the first 8 bytes. When p = 2, the mark is set, and the second byte is marked::","category":"page"},{"location":"io/","page":"Parsing IOs","title":"Parsing IOs","text":"content: >abcdefg\nmark: ^\np = 2 ^","category":"page"},{"location":"io/","page":"Parsing IOs","title":"Parsing IOs","text":"Then, when p = 9 the buffer is exhausted, the used data is removed, BUT, the mark stays, so byte 2 is preserved, and only the first byte is removed. The code in generate_reader loops around to @label __exec__, which sets p to the current buffer position. The buffer now looks like this:","category":"page"},{"location":"io/","page":"Parsing IOs","title":"Parsing IOs","text":"content: abcdefgh\nmark: ^\np = 8 ^","category":"page"},{"location":"io/","page":"Parsing IOs","title":"Parsing IOs","text":"Only 1 byte was cleared, so when p = 9, the buffer will be exhausted again. This time, no data can be cleared, so instead, the buffer is resized to fit more data:","category":"page"},{"location":"io/","page":"Parsing IOs","title":"Parsing IOs","text":"content: abcdefghijkl\\nA\nmark: ^\np = 9 ^","category":"page"},{"location":"io/","page":"Parsing IOs","title":"Parsing IOs","text":"Finally, when we reach the newline p = 13, the whole header is in the buffer, and so data[@markpos():p-1] will correctly refer to the header (now, 1:12).","category":"page"},{"location":"io/","page":"Parsing IOs","title":"Parsing IOs","text":"content: abcdefghijkl\\nA\nmark: ^\np = 13 ^","category":"page"},{"location":"io/","page":"Parsing IOs","title":"Parsing IOs","text":"Remember to update the mark, or to clear it with @unmark() in order to be able to flush data from the buffer afterwards.","category":"page"},{"location":"io/#Reference","page":"Parsing IOs","title":"Reference","text":"","category":"section"},{"location":"io/","page":"Parsing IOs","title":"Parsing IOs","text":"Automa.generate_reader\nAutoma.@escape\nAutoma.@mark\nAutoma.@unmark\nAutoma.@markpos\nAutoma.@bufferpos\nAutoma.@relpos\nAutoma.@abspos\nAutoma.@setbuffer","category":"page"},{"location":"io/#Automa.generate_reader","page":"Parsing IOs","title":"Automa.generate_reader","text":"generate_reader(funcname::Symbol, machine::Automa.Machine; kwargs...)\n\nGenerate a streaming reader function of the name funcname from machine.\n\nThe generated function consumes data from a stream passed as the first argument and executes the machine with filling the data buffer.\n\nThis function returns an expression object of the generated function. The user need to evaluate it in a module in which the generated function is needed.\n\nKeyword Arguments\n\narguments: Additional arguments funcname will take (default: ()). The default signature of the generated function is (stream::TranscodingStream,), but it is possible to supply more arguments to the signature with this keyword argument.\ncontext: Automa's codegenerator (default: Automa.CodeGenContext()).\nactions: A dictionary of action code (default: Dict{Symbol,Expr}()).\ninitcode: Initialization code (default: :()).\nloopcode: Loop code (default: :()).\nreturncode: Return code (default: :(return cs)).\nerrorcode: Executed if cs < 0 after loopcode (default error message)\n\nSee the source code of this function to see how the generated code looks like\n\n\n\n\n\n","category":"function"},{"location":"io/#Automa.@escape","page":"Parsing IOs","title":"Automa.@escape","text":"@escape()\n\nPseudomacro. When encountered during Machine execution, the machine will stop executing. This is useful to interrupt the parsing process, for example to emit a record during parsing of a larger file. p will be advanced as normally, so if @escape is hit on B during parsing of \"ABC\", the next byte will be C.\n\n\n\n\n\n","category":"macro"},{"location":"io/#Automa.@mark","page":"Parsing IOs","title":"Automa.@mark","text":"@mark()\n\nPseudomacro, to be used with IO-parsing Automa functions. This macro will \"mark\" the position of p in the current buffer. The marked position will not be flushed from the buffer after being consumed. For example, Automa code can call @mark() at the beginning of a large string, then when the string is exited at position p, it is guaranteed that the whole string resides in the buffer at positions markpos():p-1.\n\n\n\n\n\n","category":"macro"},{"location":"io/#Automa.@unmark","page":"Parsing IOs","title":"Automa.@unmark","text":"unmark()\n\nPseudomacro. Removes the mark from the buffer. This allows all previous data to be cleared from the buffer.\n\nSee also: @mark, @markpos\n\n\n\n\n\n","category":"macro"},{"location":"io/#Automa.@markpos","page":"Parsing IOs","title":"Automa.@markpos","text":"markpos()\n\nPseudomacro. Get the position of the mark in the buffer.\n\nSee also: @mark, @markpos\n\n\n\n\n\n","category":"macro"},{"location":"io/#Automa.@bufferpos","page":"Parsing IOs","title":"Automa.@bufferpos","text":"bufferpos()\n\nPseudomacro. Returns the integer position of the current TranscodingStreams buffer (only used with the generate_reader function).\n\nExample\n\n# Inside some Automa action code\n@setbuffer()\ndescription = sub_parser(stream)\np = @bufferpos()\n\nSee also: @setbuffer\n\n\n\n\n\n","category":"macro"},{"location":"io/#Automa.@relpos","page":"Parsing IOs","title":"Automa.@relpos","text":"relpos(p)\n\nAutoma pseudomacro. Return the position of p relative to @markpos(). Equivalent to p - @markpos() + 1. This can be used to mark additional points in the stream when the mark is set, after which their action position can be retrieved using abspos(x).\n\nBehaviour is undefined if mark has not yet been set.\n\nExample usage:\n\n# In one action\nidentifier_pos = @relpos(p)\n\n# Later, in a different action\nidentifier = data[@abspos(identifier_pos):p]\n\nSee also: @abspos\n\n\n\n\n\n","category":"macro"},{"location":"io/#Automa.@abspos","page":"Parsing IOs","title":"Automa.@abspos","text":"abspos(p)\n\nAutoma pseudomacro. Used to obtain the actual position of a relative position obtained from @relpos. See @relpos for more details.\n\nBehaviour is undefined if mark has not yet been set.\n\n\n\n\n\n","category":"macro"},{"location":"io/#Automa.@setbuffer","page":"Parsing IOs","title":"Automa.@setbuffer","text":"setbuffer()\n\nUpdates the buffer position to match p. The buffer position is syncronized with p before and after calls to functions generated by generate_reader. @setbuffer() can be used to the buffer before calling another parser.\n\nExample\n\n# Inside some Automa action code\n@setbuffer()\ndescription = sub_parser(stream)\np = @bufferpos()\n\nSee also: @bufferpos\n\n\n\n\n\n","category":"macro"},{"location":"parser/","page":"Parsing buffers","title":"Parsing buffers","text":"CurrentModule = Automa\nDocTestSetup = quote\n using TranscodingStreams\n using Automa\nend","category":"page"},{"location":"parser/#Parsing-from-a-buffer","page":"Parsing buffers","title":"Parsing from a buffer","text":"","category":"section"},{"location":"parser/","page":"Parsing buffers","title":"Parsing buffers","text":"Automa can leverage metaprogramming to combine regex and Julia code to create parsers. This is significantly more difficult than simply using validators or tokenizers, but still simpler than parsing from an IO. Currently, Automa loads data through pointers, and therefore needs data backed by Array{UInt8} or String or similar - it does not work with types such as UnitRange{UInt8}. Furthermore, be careful about passing strided views to Automa - while Automa can extract a pointer from a strided view, it will always advance the pointer one byte at a time, disregarding the view's stride.","category":"page"},{"location":"parser/","page":"Parsing buffers","title":"Parsing buffers","text":"As an example, let's use the simplified FASTA format introduced in the regex section, with the following format: re\"(>[a-z]+\\n([ACGT]+\\n)+)*\". We want to parse it into a Vector{Seq}, where Seq is defined as:","category":"page"},{"location":"parser/","page":"Parsing buffers","title":"Parsing buffers","text":"julia> struct Seq\n name::String\n seq::String\n end","category":"page"},{"location":"parser/#Adding-actions-to-regex","page":"Parsing buffers","title":"Adding actions to regex","text":"","category":"section"},{"location":"parser/","page":"Parsing buffers","title":"Parsing buffers","text":"To do this, we need to inject Julia code into the regex validator while it is running. The first step is to add actions to our regex: These are simply names of Julia expressions to splice in, where the expressions will be executed when the regex is matched. We can choose the names arbitrarily.","category":"page"},{"location":"parser/","page":"Parsing buffers","title":"Parsing buffers","text":"Currently, actions can be added in the following places in a regex:","category":"page"},{"location":"parser/","page":"Parsing buffers","title":"Parsing buffers","text":"With onenter!, meaning it will be executed when reading the first byte of the regex\nWith onfinal!, where it will be executed when reading the last byte of the regex. Note that it's not possible to determine the final byte for some regex like re\"X+\", since the machine reads only 1 byte at a time and cannot look ahead. In such cases, an error is raised.\nWith onexit!, meaning it will be executed on reading the first byte AFTER the regex, or when exiting the regex by encountering the end of inputs (only for a regex match, not an unexpected end of input)\nWith onall!, where it will be executed when reading every byte that is part of the regex.","category":"page"},{"location":"parser/","page":"Parsing buffers","title":"Parsing buffers","text":"You can set the actions to be a single action name (represented by a Symbol), or a list of action names:","category":"page"},{"location":"parser/","page":"Parsing buffers","title":"Parsing buffers","text":"julia> my_regex = re\"ABC\";\n\njulia> onenter!(my_regex, [:action_a, :action_b]);\n\njulia> onexit!(my_regex, :action_c);","category":"page"},{"location":"parser/","page":"Parsing buffers","title":"Parsing buffers","text":"In which case the code named action_a, then that named action_b will executed in order when entering the regex, and the code named action_c will be executed when exiting the regex.","category":"page"},{"location":"parser/","page":"Parsing buffers","title":"Parsing buffers","text":"The onenter! etc functions return the regex they modify, so the above can be written:","category":"page"},{"location":"parser/","page":"Parsing buffers","title":"Parsing buffers","text":"julia> my_regex = onexit!(onenter!(re\"ABC\", [:action_a, :action_b]), :action_c);\n\njulia> my_regex isa RE\ntrue","category":"page"},{"location":"parser/","page":"Parsing buffers","title":"Parsing buffers","text":"When the the following regex's actions are visualized in its corresponding DFA:","category":"page"},{"location":"parser/","page":"Parsing buffers","title":"Parsing buffers","text":"regex = let\n ab = re\"ab*\"\n onenter!(ab, :enter_ab)\n onexit!(ab, :exit_ab)\n onfinal!(ab, :final_ab)\n onall!(ab, :all_ab)\n c = re\"c\"\n onenter!(c, :enter_c)\n onexit!(c, :exit_c)\n onfinal!(c, :final_c)\n\n ab * c\nend","category":"page"},{"location":"parser/","page":"Parsing buffers","title":"Parsing buffers","text":"The result DFA looks below. Here, the edge labeled 'a'/enter_ab,all_ab,final_ab means that the edge consumes input byte 'a', and executes the three actions enter_ab, all_ab and final_ab, in that order. ","category":"page"},{"location":"parser/","page":"Parsing buffers","title":"Parsing buffers","text":"(Image: Visualization of regex with actions)","category":"page"},{"location":"parser/#Compiling-regex-to-Machines","page":"Parsing buffers","title":"Compiling regex to Machines","text":"","category":"section"},{"location":"parser/","page":"Parsing buffers","title":"Parsing buffers","text":"In order to create code, the regex must first be compiled to a Machine, which is a struct that represents an optimised DFA. We can do that with compile(regex). Under the hood, this compiles the regex to an NFA, then compiles the NFA to a DFA, and then optimises the DFA to a Machine (see the section on Automa theory).","category":"page"},{"location":"parser/","page":"Parsing buffers","title":"Parsing buffers","text":"Normally, we don't care about the regex directly, but only want the Machine. So, it is idiomatic to compile the regex in the same let statement it is being built in:","category":"page"},{"location":"parser/","page":"Parsing buffers","title":"Parsing buffers","text":"machine = let\n header = re\"[a-z]+\"\n seqline = re\"[ACGT]+\"\n record = re\">\" * header * '\\n' * rep1(seqline * '\\n')\n compile(rep(record))\nend\n@assert machine isa Automa.Machine","category":"page"},{"location":"parser/","page":"Parsing buffers","title":"Parsing buffers","text":"Note that, if this code is placed at top level in a package, the regex will be constructed and compiled to a Machine during package precompilation, which greatly helps load times.","category":"page"},{"location":"parser/#Creating-our-parser","page":"Parsing buffers","title":"Creating our parser","text":"","category":"section"},{"location":"parser/","page":"Parsing buffers","title":"Parsing buffers","text":"However, in this case, we don't just need a Machine with the regex, we need a Machine with the regex containing the relevant actions. To parse a simplified FASTA file into a Vector{Seq}, I'm using these four actions:","category":"page"},{"location":"parser/","page":"Parsing buffers","title":"Parsing buffers","text":"When the machine enters into the header, or a sequence line, I want it to mark the position with where it entered into the regex. The marked position will be used as the leftmost position where the header or sequence is extracted later.\nWhen exiting the header, I want to extract the bytes from the marked position in the action above, to the last header byte (i.e. the byte before the current byte), and use these bytes as the sequence header\nWhen exiting a sequence line, I want to do the same: Extract from the marked position to one before the current position, but this time I want to append the current line to a buffer containing all the lines of the sequence\nWhen exiting a record, I want to construct a Seq object from the header bytes and the buffer with all the sequence lines, then push the Seq to the result,","category":"page"},{"location":"parser/","page":"Parsing buffers","title":"Parsing buffers","text":"julia> machine = let\n header = onexit!(onenter!(re\"[a-z]+\", :mark_pos), :header)\n seqline = onexit!(onenter!(re\"[ACGT]+\", :mark_pos), :seqline)\n record = onexit!(re\">\" * header * '\\n' * rep1(seqline * '\\n'), :record)\n compile(rep(record))\n end;","category":"page"},{"location":"parser/","page":"Parsing buffers","title":"Parsing buffers","text":"We can now write the code we want executed. When writing this code, we want access to a few variables used by the machine simulation. For example, we might want to know at which byte position the machine is when an action is executed. Currently, the following variables are accessible in the code:","category":"page"},{"location":"parser/","page":"Parsing buffers","title":"Parsing buffers","text":"byte: The current input byte as a UInt8\np: The 1-indexed position of byte in the buffer\np_end: The length of the input buffer\nis_eof: Whether the machine has reached the end of the input.\ncs: The current state of the machine, as an integer\ndata: The input buffer\nmem: The memory being read from, an Automa.SizedMemory object containing a pointer and a length","category":"page"},{"location":"parser/","page":"Parsing buffers","title":"Parsing buffers","text":"The actions we want executed, we place in a Dict{Symbol, Expr}:","category":"page"},{"location":"parser/","page":"Parsing buffers","title":"Parsing buffers","text":"julia> actions = Dict(\n :mark_pos => :(pos = p),\n :header => :(header = String(data[pos:p-1])),\n :seqline => :(append!(buffer, data[pos:p-1])),\n :record => :(push!(seqs, Seq(header, String(buffer))))\n );","category":"page"},{"location":"parser/","page":"Parsing buffers","title":"Parsing buffers","text":"For multi-line Expr, you can construct them with quote ... end blocks.","category":"page"},{"location":"parser/","page":"Parsing buffers","title":"Parsing buffers","text":"We can now construct a function that parses our data. In the code written in the action dict above, besides the variables defined for us by Automa, we also refer to the variables buffer, header, pos and seqs. Some of these variables are defined in the code above (for example, in the :(pos = p) expression), but we can't necessarily control the order in which Automa will insert these expressions into out final function. Hence, let's initialize these variables at the top of the function we generate, such that we know for sure they are defined when used - whenever they are used.","category":"page"},{"location":"parser/","page":"Parsing buffers","title":"Parsing buffers","text":"The code itself is generated using generate_code:","category":"page"},{"location":"parser/","page":"Parsing buffers","title":"Parsing buffers","text":"julia> @eval function parse_fasta(data)\n pos = 0\n buffer = UInt8[]\n seqs = Seq[]\n header = \"\"\n $(generate_code(machine, actions))\n return seqs\n end\nparse_fasta (generic function with 1 method)","category":"page"},{"location":"parser/","page":"Parsing buffers","title":"Parsing buffers","text":"We can now use it:","category":"page"},{"location":"parser/","page":"Parsing buffers","title":"Parsing buffers","text":"julia> parse_fasta(\">abc\\nTAGA\\nAAGA\\n>header\\nAAAG\\nGGCG\\n\")\n2-element Vector{Seq}:\n Seq(\"abc\", \"TAGAAAGA\")\n Seq(\"header\", \"AAAGGGCG\")","category":"page"},{"location":"parser/","page":"Parsing buffers","title":"Parsing buffers","text":"If we give out function a bad input - for example, if we forget the trailing newline, it throws an error:","category":"page"},{"location":"parser/","page":"Parsing buffers","title":"Parsing buffers","text":"julia> parse_fasta(\">abc\\nTAGA\\nAAGA\\n>header\\nAAAG\\nGGCG\")\nERROR: Error during FSM execution at buffer position 33.\nLast 32 byte(s) were:\n\n\">abc\\nTAGA\\nAAGA\\n>header\\nAAAG\\nGGCG\"\n\nObserved input: EOF at state 5. Outgoing edges:\n * '\\n'/seqline\n * [ACGT]\n\nInput is not in any outgoing edge, and machine therefore errored.","category":"page"},{"location":"parser/","page":"Parsing buffers","title":"Parsing buffers","text":"The code above parses with about 300 MB/s on my laptop. Not bad, but Automa can do better - read on to learn how to customize codegen.","category":"page"},{"location":"parser/#Preconditions","page":"Parsing buffers","title":"Preconditions","text":"","category":"section"},{"location":"parser/","page":"Parsing buffers","title":"Parsing buffers","text":"You might have noticed a peculiar detail about our FASTA format: It demands a trailing newline after each record. In other words, >a\\nA is not a valid FASTA record.","category":"page"},{"location":"parser/","page":"Parsing buffers","title":"Parsing buffers","text":"We can easily rewrite the regex such that the last record does not need a trailing \\n. But look what happens when we try that:","category":"page"},{"location":"parser/","page":"Parsing buffers","title":"Parsing buffers","text":"julia> machine = let\n header = onexit!(onenter!(re\"[a-z]+\", :mark_pos), :header)\n seqline = onexit!(onenter!(re\"[ACGT]+\", :mark_pos), :seqline)\n record = onexit!(re\">\" * header * '\\n' * seqline * rep('\\n' * seqline), :record)\n compile(opt(record) * rep('\\n' * record) * rep(re\"\\n\"))\n end;\nERROR: Ambiguous NFA.","category":"page"},{"location":"parser/","page":"Parsing buffers","title":"Parsing buffers","text":"Why does this error? Well, remember that Automa processes one byte at a time, and at each byte, makes a decision on what actions to execute. Hence, if it sees the input >a\\nA\\n, it does not know what to do when encountering the second \\n. If the next byte is, e,g. A, then it would need to execute the :seqline action. If the byte is >, it would need to execute first :seqline, then :record. Automa can't read ahead, so, the regex is ambiguous and the true behaviour when reading the inputs >a\\nA\\n is undefined. Therefore, Automa refuses to compile it.","category":"page"},{"location":"parser/","page":"Parsing buffers","title":"Parsing buffers","text":"There are several ways to solve this:","category":"page"},{"location":"parser/","page":"Parsing buffers","title":"Parsing buffers","text":"First, you can rewrite the regex to not be ambiguous. This is usually the preferred option: After all, if the regex is ambiguous, you probably made a mistake with the regex\nYou can manually diasable the ambiguity check by passing the keyword unambiguous=false to compile. This will cause the machine to undefined behaviour if an input like >a\\nA\\n is seen, so this is usually a poor idea.\nYou can rewrite the actions, such that the action itself uses an if-statement to check what to do. In the example above, you could remove the :record action and have the :seqline action conditionally emit a record if the next byte was >.","category":"page"},{"location":"parser/","page":"Parsing buffers","title":"Parsing buffers","text":"Finally, you can use preconditions. A precondition is a symbol, attached to a regex, just like an action. Just like an action, the symbol is attached to an Expr object, but for preconditions this must evaluate to a Bool. If false, the regex is not entered.","category":"page"},{"location":"parser/","page":"Parsing buffers","title":"Parsing buffers","text":"Let's have an example. The following machine is obviously ambiguous:","category":"page"},{"location":"parser/","page":"Parsing buffers","title":"Parsing buffers","text":"julia> machine = let\n a = onenter!(re\"XY\", :a)\n b = onenter!(re\"XZ\", :b)\n compile('A' * (a | b))\n end;\nERROR: Ambiguous NFA.","category":"page"},{"location":"parser/","page":"Parsing buffers","title":"Parsing buffers","text":"We can add a precondition with precond!. Below, precond!(regex, label) is equivalent to precond!(regex, label; when=:enter, bool=true). This means \"only enter regex when the boolean expression label evaluates to bool (true)\":","category":"page"},{"location":"parser/","page":"Parsing buffers","title":"Parsing buffers","text":"julia> machine = let\n a = precond!(onenter!(re\"XY\", :a), :test)\n b = precond!(onenter!(re\"XZ\", :b), :test; bool=false)\n compile('A' * (a | b))\n end;\n\njulia> machine isa Automa.Machine\ntrue","category":"page"},{"location":"parser/","page":"Parsing buffers","title":"Parsing buffers","text":"Here, re\"XY\" can only be entered when :test is true, and re\"XZ\" only when :test is false. So, there can be no ambiguous behaviour and the regex compiles fine.","category":"page"},{"location":"parser/#Reference","page":"Parsing buffers","title":"Reference","text":"","category":"section"},{"location":"parser/","page":"Parsing buffers","title":"Parsing buffers","text":"Automa.onenter!\nAutoma.onexit!\nAutoma.onall!\nAutoma.onfinal!\nAutoma.precond!\nAutoma.generate_code\nAutoma.generate_init_code\nAutoma.generate_exec_code","category":"page"},{"location":"parser/#Automa.RegExp.onenter!","page":"Parsing buffers","title":"Automa.RegExp.onenter!","text":"onenter!(re::RE, a::Union{Symbol, Vector{Symbol}}) -> re\n\nSet action(s) a to occur when reading the first byte of regex re. If multiple actions are set by passing a vector, execute the actions in order.\n\nSee also: onexit!, onall!, onfinal!\n\nExample\n\njulia> regex = re\"ab?c*\";\n\njulia> regex2 = onenter!(regex, :entering_regex);\n\njulia> regex === regex2\ntrue\n\n\n\n\n\n","category":"function"},{"location":"parser/#Automa.RegExp.onexit!","page":"Parsing buffers","title":"Automa.RegExp.onexit!","text":"onexit!(re::RE, a::Union{Symbol, Vector{Symbol}}) -> re\n\nSet action(s) a to occur when reading the first byte no longer part of regex re, or if experiencing an expected end-of-file. If multiple actions are set by passing a vector, execute the actions in order.\n\nSee also: onenter!, onall!, onfinal!\n\nExample\n\njulia> regex = re\"ab?c*\";\n\njulia> regex2 = onexit!(regex, :exiting_regex);\n\njulia> regex === regex2\ntrue\n\n\n\n\n\n","category":"function"},{"location":"parser/#Automa.RegExp.onall!","page":"Parsing buffers","title":"Automa.RegExp.onall!","text":"onall!(re::RE, a::Union{Symbol, Vector{Symbol}}) -> re\n\nSet action(s) a to occur when reading any byte part of the regex re. If multiple actions are set by passing a vector, execute the actions in order.\n\nSee also: onenter!, onexit!, onfinal!\n\nExample\n\njulia> regex = re\"ab?c*\";\n\njulia> regex2 = onall!(regex, :reading_re_byte);\n\njulia> regex === regex2\ntrue\n\n\n\n\n\n","category":"function"},{"location":"parser/#Automa.RegExp.onfinal!","page":"Parsing buffers","title":"Automa.RegExp.onfinal!","text":"onfinal!(re::RE, a::Union{Symbol, Vector{Symbol}}) -> re\n\nSet action(s) a to occur when the last byte of regex re. If re does not have a definite final byte, e.g. re\"a(bc)*\", where more \"bc\" can always be added, compiling the regex will error after setting a final action. If multiple actions are set by passing a vector, execute the actions in order.\n\nSee also: onenter!, onall!, onexit!\n\nExample\n\njulia> regex = re\"ab?c\";\n\njulia> regex2 = onfinal!(regex, :entering_last_byte);\n\njulia> regex === regex2\ntrue\n\njulia> compile(onfinal!(re\"ab?c*\", :does_not_work))\nERROR: [...]\n\n\n\n\n\n","category":"function"},{"location":"parser/#Automa.RegExp.precond!","page":"Parsing buffers","title":"Automa.RegExp.precond!","text":"precond!(re::RE, s::Symbol; [when=:enter], [bool=true]) -> re\n\nSet re's precondition to s. Before any state transitions to re, or inside re, the precondition code s is checked to be bool before the transition is taken.\n\nwhen controls if the condition is checked when the regex is entered (if :enter), or at every state transition inside the regex (if :all)\n\nExample\n\njulia> regex = re\"ab?c*\";\n\njulia> regex2 = precond!(regex, :some_condition);\n\njulia> regex === regex2\ntrue\n\n\n\n\n\n","category":"function"},{"location":"parser/#Automa.generate_code","page":"Parsing buffers","title":"Automa.generate_code","text":"generate_code([::CodeGenContext], machine::Machine, actions=nothing)::Expr\n\nGenerate init and exec code for machine. The default code generator function for creating functions, preferentially use this over generating init and exec code directly, due to its convenience. Shorthand for producing the concatenated code of:\n\ngenerate_init_code(ctx, machine)\ngenerate_action_code(ctx, machine, actions)\ngenerate_input_error_code(ctx, machine) [elided if actions == :debug]\n\nExamples\n\n@eval function foo(data)\n # Initialize variables used in actions\n data_buffer = UInt8[]\n $(generate_code(machine, actions))\n return data_buffer\nend\n\nSee also: generate_init_code, generate_exec_code\n\n\n\n\n\n","category":"function"},{"location":"parser/#Automa.generate_init_code","page":"Parsing buffers","title":"Automa.generate_init_code","text":"generate_init_code([::CodeGenContext], machine::Machine)::Expr\n\nGenerate variable initialization code, initializing variables such as p, and p_end. The names of these variables are set by the CodeGenContext. If not passed, the context defaults to DefaultCodeGenContext\n\nPrefer using the more generic generate_code over this function where possible. This function should be used if the initialized data should be modified before the execution code.\n\nExample\n\n@eval function foo(data)\n $(generate_init_code(machine))\n p = 2 # maybe I want to start from position 2, not 1\n $(generate_exec_code(machine, actions))\n return cs\nend\n\nSee also: generate_code, generate_exec_code\n\n\n\n\n\n","category":"function"},{"location":"parser/#Automa.generate_exec_code","page":"Parsing buffers","title":"Automa.generate_exec_code","text":"generate_exec_code([::CodeGenContext], machine::Machine, actions=nothing)::Expr\n\nGenerate machine execution code with actions. This code should be run after the machine has been initialized with generate_init_code. If not passed, the context defaults to DefaultCodeGenContext\n\nPrefer using the more generic generate_code over this function where possible. This function should be used if the initialized data should be modified before the execution code.\n\nExamples\n\n@eval function foo(data)\n $(generate_init_code(machine))\n p = 2 # maybe I want to start from position 2, not 1\n $(generate_exec_code(machine, actions))\n return cs\nend\n\nSee also: generate_init_code, generate_exec_code\n\n\n\n\n\n","category":"function"}] +} diff --git a/v1.0.3/siteinfo.js b/v1.0.3/siteinfo.js new file mode 100644 index 00000000..ac26d7e3 --- /dev/null +++ b/v1.0.3/siteinfo.js @@ -0,0 +1 @@ +var DOCUMENTER_CURRENT_VERSION = "v1.0.3"; diff --git a/v1.0.3/theory/index.html b/v1.0.3/theory/index.html new file mode 100644 index 00000000..f00c68e2 --- /dev/null +++ b/v1.0.3/theory/index.html @@ -0,0 +1,2 @@ + +Theory · Automa.jl

Theory of regular expressions

Most programmers are familiar with regular expressions, or regex, for short. What many programmers don't know is that regex have a deep theoretical underpinning, which is leaned on by regex engines to produce highly efficient code.

Informally, a regular expression can be thought of as any pattern that can be constructed from the following atoms:

  • The empty string is a valid regular expression, i.e. re""
  • Literal matching of a single symbol from a finite alphabet, such as a character, i.e. re"p"

Atoms can be combined with the following operations, if R and P are two regular expressions:

  • Alternation, i.e R | P, meaning either match R or P.
  • Concatenation, i.e. R * P, meaning match first R, then P
  • Repetition, i.e. R*, meaning match R zero or more times consecutively.
Note

In Automa, the alphabet is bytes, i.e. 0x00:0xff, and so each symbol is a single byte. Multi-byte characters such as Æ is interpreted as the two concatenated of two symbols, re"\xc3" * re"\x86". The fact that Automa considers one input to be one byte, not one character, can become relevant if you instruct Automa to complete an action "on every input".

Popular regex libraries include more operations like ? and +. These can trivially be constructed from the above mentioned primitives, i.e. R? is "" | R, and R+ is RR*.

Some implementations of regular expression engines, such as PCRE which is the default in Julia as of Julia 1.8, also support operations like backreferences and lookbehind. These operations can NOT be constructed from the above atoms and axioms, meaning that PCRE expressions are not regular expressions in the theoretical sense.

The practical importance of theoretically sound regular expressions is that there exists algorithms that can match regular expressions on O(N) time and O(1) space, whereas this is not true for PCRE expressions, which are therefore significantly slower.

Note

Automa.jl only supports real regex, and as such does not support e.g. backreferences, in order to gurantee fast runtime performance.

To match regex to strings, the regex are transformed to finite automata, which are then implemented in code.

Nondeterministic finite automata

The programmer Ken Thompson, of Unix fame, deviced Thompson's construction, an algorithm to constuct a nondeterministic finite automaton (NFA) from a regex. An NFA can be thought of as a flowchart (or a directed graph), where one can move from node to node on directed edges. Edges are either labeled ϵ, in which the machine can freely move through the edge to its destination node, or labeled with one or more input symbols, in which the machine may traverse the edge upon consuming said input.

To illustrate, let's look at one of the simplest regex: re"a", matching the letter a:

State diagram showing state 1, edge transition consuming input 'a', leading to "accept state" 2

You begin at the small dot on the right, then immediately go to state 1, the circle marked by a 1. By moving to the next state, state 2, you consume the next symbol from the input string, which must be the symbol marked on the edge from state 1 to state 2 (in this case, an a). Some states are "accept states", illustrated by a double circle. If you are at an accept state when you've consumed all symbols of the input string, the string matches the regex.

Each of the operations that combine regex can also combine NFAs. For example, given the two regex a and b, which correspond to the NFAs A and B, the regex a * b can be expressed with the following NFA:

State diagram showing ϵ transition from state A to accept state B

Note the ϵ symbol on the edge - this signifies an "epsilon transition", meaning you move directly from A to B without consuming any symbols.

Similarly, a | b correspond to this NFA structure...

State diagram of the NFA for `a | b`

...and a* to this:

State diagram of the NFA for `a*`

For a larger example, re"(\+|-)?(0|1)*" combines alternation, concatenation and repetition and so looks like this:

State diagram of the NFA for `re"(\\+|-)?(0|1)*"`

ϵ-transitions means that there are states from which there are multiple possible next states, e.g. in the larger example above, state 1 can lead to state 2 or state 8. That's what makes NFAs nondeterministic.

In order to match a regex to a string then, the movement through the NFA must be emulated. You begin at state 1. When a non-ϵ edge is encountered, you consume a byte of the input data if it matches. If there are no edges that match your input, the string does not match. If an ϵ-edge is encountered from state A that leads to states B and C, the machine goes from state A to state {B, C}, i.e. in both states at once.

For example, if the regex re"(\+|-)?(0|1)* visualized above is matched to the string -11, this is what happens:

  • NFA starts in state 1
  • NFA immediately moves to all states reachable via ϵ transition. It is now in state {2, 3, 5, 7, 8, 9, 10}.
  • NFA sees input -. States {2, 3, 4, 5, 7, 8, 10} do not have an edge with - leading out, so these states die. Therefore, the machine is in state 9, consumes the input, and moves to state 2.
  • NFA immediately moves to all states reachable from state 2 via ϵ transitions, so goes to {3, 4, 5, 7}
  • NFA sees input 1, must be in state 5, moves to state 6, then through ϵ transitions to state {3, 4, 5, 7}
  • The above point repeats, NFA is still in state {3, 4, 5, 7}
  • Input ends. Since state 3 is an accept state, the string matches.

Using only a regex-to-NFA converter, you could create a simple regex engine simply by emulating the NFA as above. The existence of ϵ transitions means the NFA can be in multiple states at once which adds unwelcome complexity to the emulation and makes it slower. Luckily, every NFA has an equivalent determinisitic finite automaton, which can be constructed from the NFA using the so-called powerset construction.

Deterministic finite automata

Or DFAs, as they are called, are similar to NFAs, but do not contain ϵ-edges. This means that a given input string has either zero paths (if it does not match the regex), one, unambiguous path, through the DFA. In other words, every input symbol must trigger one unambiguous state transition from one state to one other state.

Let's visualize the DFA equivalent to the larger NFA above:

State diagram of the DFA for `re"(\\+|-)?(0|1)*"`

It might not be obvious, but the DFA above accepts exactly the same inputs as the previous NFA. DFAs are way simpler to simulate in code than NFAs, precisely because at every state, for every input, there is exactly one action. DFAs can be simulated either using a lookup table of possible state transitions, or by hardcoding GOTO-statements from node to node when the correct input is matched. Code simulating DFAs can be ridicuously fast, with each state transition taking less than 1 nanosecond, if implemented well.

Furthermore, DFAs can be optimised. Two edges between the same nodes with labels A and B can be collapsed to a single edge with labels [AB], and redundant nodes can be collapsed. The optimised DFA equivalent to the one above is simply:

State diagram of the simpler DFA for `re"(\\+|-)?(0|1)*"`

Unfortunately, as the name "powerset construction" hints, convering an NFA with N nodes may result in a DFA with up to 2^N nodes. This inconvenient fact drives important design decisions in regex implementations. There are basically two approaches:

Automa.jl will just construct the DFA directly, and accept a worst-case complexity of O(2^N). This is acceptable (I think) for Automa, because this construction happens in Julia's package precompilation stage (not on package loading or usage), and because the DFAs are assumed to be constants within a package. So, if a developer accidentally writes an NFA which is unacceptably slow to convert to a DFA, it will be caught in development. Luckily, it's pretty rare to have NFAs that result in truly abysmally slow conversions to DFA's: While bad corner cases exist, they are rarely as catastrophic as the O(2^N) would suggest. Currently, Automa's regex/NFA/DFA compilation pipeline is very slow and unoptimized, but, since it happens during precompile time, it is insignificant compared to LLVM compile times.

Other implementations, like the popular ripgrep command line tool, uses an adaptive approach. It constructs the DFA on the fly, as each symbol is being matched, and then caches the DFA. If the DFA size grows too large, the cache is flushed. If the cache is flushed too often, it falls back to simulating the NFA directly. Such an approach is necessary for ripgrep, because the regex -> NFA -> DFA compilation happens at runtime and must be near-instantaneous, unlike Automa, where it happens during package precompilation and can afford to be slow.

Automa in a nutshell

Automa simulates the DFA by having the DFA create a Julia Expr, which is then used to generate a Julia function using metaprogramming. Like all other Julia code, this function is then optimized by Julia and then LLVM, making the DFA simulations very fast.

Because Automa just constructs Julia functions, we can do extra tricks that ordinary regex engines cannot: We can splice arbitrary Julia code into the DFA simulation. Currently, Automa supports two such kinds of code: actions, and preconditions.

Actions are Julia code that is executed during certain state transitions. Preconditions are Julia code, that evaluates to a Bool value, and which are checked before a state transition. If a precondition evaluates to false, the transition is not taken.

diff --git a/v1.0.3/tokenizer/index.html b/v1.0.3/tokenizer/index.html new file mode 100644 index 00000000..5f4c2a72 --- /dev/null +++ b/v1.0.3/tokenizer/index.html @@ -0,0 +1,94 @@ + +Tokenizers · Automa.jl

Tokenizers (lexers)

A tokenizer or a lexer is a program that breaks down an input text into smaller chunks, and classifies them as one of several tokens. For example, consider an imagininary format that only consists of nested tuples of strings containing letters, like this:

(("ABC", "v"),(("x", ("pj",(("a", "k")), ("L")))))

Any text of this format can be broken down into a sequence of the following tokens:

  • Left parenthesis: re"\("
  • Right parenthesis: re"\)"
  • Comma: re","
  • Quote: re"\""
  • Spaces: re" +"
  • Letters: re"[A-Za-z]+"

Such that e.g. ("XY", "A") can be represented as the token sequence lparens, quote, XY, quote, comma, space, quote A quote rparens.

Breaking the text down to its tokens is called tokenization or lexing. Note that lexing in itself is not sufficient to parse the format: Lexing is context unaware and doesn't understand syntax, so e.g. the test "((A can be perfectly well tokenized to quote lparens lparens A, even if it's invalid syntax.

The purpose of tokenization is to make subsequent parsing easier, because each part of the text has been classified. That makes it easier to, for example, search for letters in the input. Instead of having to muck around with regex to find the letters, you use regex once to classify all text.

Making and using a tokenizer

Let's use the example above to create a tokenizer. The most basic tokenizer defaults to using UInt32 as tokens: You pass in a list of regex matching each token, then evaluate the resulting code:

julia> make_tokenizer(
+           [re"\(", re"\)", re",", re"\"", re" +", re"[a-zA-Z]+"]
+       ) |> eval

The make_tokenizer function creates Julia code (an Expr object) that, when evaluated, defines Base.iterate for the Tokenizer type. The code above defined Base.iterate(::Tokenizer{UInt32, D, 1}) where D - we'll get back to the different type parameters of Tokenizer later.

Tokenizers are most easily created with the tokenize function. To create a Tokenizer{UInt32}, we can do call tokenize(UInt32, data):

julia> iterator = tokenize(UInt32, """("XY", "A")"""); typeof(iterator)
+Tokenizer{UInt32, String, 1}

Meaning: A Tokenizer emitting UInt32 over String data, of version 1. Since we used make_tokenizer above to define iteration for this kind of tokenizer (one with UInt32 tokens), we can iterate this tokenizer.

When we iterate, we get Tuple{Int64, Int32, UInt32} elements, with each element being:

  • The start index of the token
  • The length of the token
  • The token itself, in this example UInt32(1) for '(', UInt32(2) for ')' etc:
julia> collect(iterator)
+10-element Vector{Tuple{Int64, Int32, UInt32}}:
+ (1, 1, 0x00000001)
+ (2, 1, 0x00000004)
+ (3, 2, 0x00000006)
+ (5, 1, 0x00000004)
+ (6, 1, 0x00000003)
+ (7, 1, 0x00000005)
+ (8, 1, 0x00000004)
+ (9, 1, 0x00000006)
+ (10, 1, 0x00000004)
+ (11, 1, 0x00000002)

The type of the last element in each tuple comes from the Tokenizer type parameter: We specified UInt32, so we get UInt32 tokens.

Any data which could not be tokenized is given the error token UInt32(0):

julia> collect(tokenize(UInt32, "XY!!)"))
+3-element Vector{Tuple{Int64, Int32, UInt32}}:
+ (1, 2, 0x00000006)
+ (3, 2, 0x00000000)
+ (5, 1, 0x00000002)

Both tokenize and make_tokenizer take an optional argument version, which is 1 by default. This sets the last parameter of the Tokenizer struct - for example, make_tokenizer(tokens::Vector{RE}; version=5) defines Base.iterate for Tokenizer{UInt32, D, 5}.

By letting the user freely choose the value of the last type parameter, this allows you to create multiple different tokenizers with the same element type.

Using enums as tokens

Using UInt32 as tokens is not very convenient - so it's possible to use enums to create the tokenizer:

julia> @enum Token error lparens rparens comma quot space letters
+
+julia> make_tokenizer((error, [
+           lparens => re"\(",
+           rparens => re"\)",
+           comma => re",",
+           quot => re"\"",
+           space => re" +",
+           letters => re"[a-zA-Z]+"
+        ])) |> eval
+
+julia> collect(tokenize(Token, "XY!!)"))
+3-element Vector{Tuple{Int64, Int32, Token}}:
+ (1, 2, letters)
+ (3, 2, error)
+ (5, 1, rparens)

To make it even easier, you can define the enum and the tokenizer in one go:

tokens = [
+    :lparens => re"\(",
+    :rparens => re"\)",
+    :comma => re",",
+    :quot => re"\"",
+    :space => re" +",
+    :letters => re"[a-zA-Z]+"
+]
+@eval @enum Token error $(first.(tokens)...)
+make_tokenizer((error, 
+    [Token(i) => j for (i,j) in enumerate(last.(tokens))]
+)) |> eval

Token disambiguation

It's possible to create a tokenizer where the different token regexes overlap:

julia> make_tokenizer([re"[ab]+", re"ab*", re"ab"]) |> eval

In this case, an input like ab will match all three regex. Which tokens are emitted is determined by two rules:

First, the emitted tokens will be as long as possible. So, the input aa could be emitted as one token of the regex re"[ab]+", two tokens of the same regex, or of two tokens of the regex re"ab*". In this case, it will be emitted as a single token of re"[ab]+", since that will make the first token as long as possible (2 bytes), whereas the other options would only make it 1 byte long.

Second, tokens with a higher index in the input array beats previous tokens. So, a will be emitted as re"ab*", as its index of 2 beats the previous regex re"[ab]+" with the index 1, and ab will match the third regex.

If you don't want emitted tokens to depend on these priority rules, you can set the optional keyword unambiguous=true in the make_tokenizer function, in which case make_tokenizer will error if any input text could be broken down into different tokens. However, note that this may cause most tokenizers to error when being built, as most tokenization processes are ambiguous.

Reference

Automa.TokenizerType
Tokenizer{E, D, C}

Lazy iterator of tokens of type E over data of type D. Tokenizers are usually created with the tokenize function, and their iterator behaviour are defined by make_tokenizer.

Tokenizer works on any buffer-like object that defines pointer and sizeof. When iterated, it will return a Tuple{Integer, Integer, E}:

  • The first value in the tuple is the 1-based starting index of the token in the buffer
  • The second is the length of the token in bytes
  • The third is the token.

Un-tokenizable data will be emitted as the "error token" which must also be of type E.

The Int parameter C allows multiple tokenizers to be created with the otherwise same type parameters.

See also: make_tokenizer

source
Automa.tokenizeFunction
tokenize(::Type{E}, data, version=1) -> Tokenizer

Create a Tokenizer{E, typeof(data), version}, iterating tokens of type E over data.

See also: Tokenizer, make_tokenizer, compile

Examples

julia> tokenize(UInt32, "hello")
+Tokenizer{UInt32, String, 1}("hello")
+
+julia> tokenize(Int8, [1, 2, 3], 3)
+Tokenizer{Int8, Vector{Int64}, 3}([1, 2, 3])
source
Automa.make_tokenizerFunction
make_tokenizer(
+    machine::TokenizerMachine;
+    tokens::Tuple{E, AbstractVector{E}}= [ integers ],
+    goto=true, version=1
+) where E

Create code which when evaluated, defines Base.iterate(::Tokenizer{E, D, $version}). tokens is a tuple of:

  • the error token, which will be emitted for data that cannot be tokenized, and
  • a vector of non-error tokens of length machine.n_tokens.

Most users should instead use the more convenient method make_tokenizer(tokens).

Example usage

julia> machine = compile([re"a", re"b"]);
+
+julia> make_tokenizer(machine; tokens=(0x00, [0x01, 0x02])) |> eval
+
+julia> iter = tokenize(UInt8, "abxxxba"); typeof(iter)
+Tokenizer{UInt8, String, 1}
+
+julia> collect(iter)
+5-element Vector{Tuple{Int64, Int32, UInt8}}:
+ (1, 1, 0x01)
+ (2, 1, 0x02)
+ (3, 3, 0x00)
+ (6, 1, 0x02)
+ (7, 1, 0x01)

Any actions inside the input regexes will be ignored.

If goto (default), use the faster, but more complex goto code generator.
The version number will set the last parameter of the Tokenizer, which allows you to create different tokenizers for the same element type.

See also: Tokenizer, tokenize, compile

source
make_tokenizer(
+    tokens::Union{
+        AbstractVector{RE},
+        Tuple{E, AbstractVector{Pair{E, RE}}}
+    };
+    goto::Bool=true,
+    version::Int=1,
+    unambiguous=false
+) where E

Convenience function for both compiling a TokenizerMachine, then running make_tokenizer on it. In other words, this function returns code that when run, defines iterate for Tokenizer{$E, D, $version} where D.

If tokens are a tuple, the first element is the error token, and the next is a vector of token => regex pairs. If tokens is an AbstractVector{RE} v, the tokens defaults to UInt32, and it behaves as if it was (UInt32(0), [UInt32(i)=>r for (i,r) in pairs(v)]), i.e. UInt32(0) is the error token.

Example

julia> make_tokenizer([re"abc", re"def"]) |> eval
+
+julia> collect(tokenize(UInt32, "abcxyzdef123"))
+4-element Vector{Tuple{Int64, Int32, UInt32}}:
+ (1, 3, 0x00000001)
+ (4, 3, 0x00000000)
+ (7, 3, 0x00000002)
+ (10, 3, 0x00000000)
+
+julia> make_tokenizer((0, collect(pairs([re"x", re"y"]))); version=5) |> eval
+
+julia> iter = tokenize(Int, "xyaby", 5)
+Tokenizer{Int64, String, 5}("xyaby")
+
+julia> collect(iter)
+4-element Vector{Tuple{Int64, Int32, Int64}}:
+ (1, 1, 1)
+ (2, 1, 2)
+ (3, 2, 0)
+ (5, 1, 2)
source
diff --git a/v1.0.3/validators/index.html b/v1.0.3/validators/index.html new file mode 100644 index 00000000..6d5a07dc --- /dev/null +++ b/v1.0.3/validators/index.html @@ -0,0 +1,32 @@ + +Validators · Automa.jl

Text validators

The simplest use of Automa is to simply match a regex. It's unlikely you are going to want to use Automa for this instead of Julia's built-in regex engine PCRE, unless you need the extra performance that Automa brings over PCRE. Nonetheless, it serves as a good starting point to introduce Automa.

Suppose we have the FASTA regex from the regex page:

julia> fasta_regex = let
+           header = re"[a-z]+"
+           seqline = re"[ACGT]+"
+           record = '>' * header * '\n' * rep1(seqline * '\n')
+           rep(record)
+       end;

Buffer validator

Automa comes with a convenience function generate_buffer_validator:

Given a regex (RE) like the one above, we can do:

julia> eval(generate_buffer_validator(:validate_fasta, fasta_regex));
+
+julia> validate_fasta
+validate_fasta (generic function with 1 method)

And we now have a function that checks if some data matches the regex:

julia> validate_fasta(">hello\nTAGAGA\nTAGAG") # missing trailing newline
+0
+
+julia> validate_fasta(">helloXXX") # Error at byte index 7
+7
+
+julia> validate_fasta(">hello\nTAGAGA\nTAGAG\n") # nothing; it matches

IO validators

For large files, having to read the data into a buffer to validate it may not be possible. Automa also supports creating IO validators with the generate_io_validator function:

This works very similar to generate_buffer_validator, but the generated function takes an IO, and has a different return value:

  • If the data matches, still return nothing
  • Else, return (byte, (line, column)) where byte is the first errant byte, and (line, column) the position of the byte. If the errant byte is a newline, column is 0. If the input reaches unexpected EOF, byte is nothing, and (line, column) points to the last line/column in the IO:
julia> eval(generate_io_validator(:validate_io, fasta_regex));
+
+julia> validate_io(IOBuffer(">hello\nTAGAGA\n"))
+
+julia> validate_io(IOBuffer(">helX"))
+(0x58, (1, 5))
+
+julia> validate_io(IOBuffer(">hello\n\n"))
+(0x0a, (3, 0))
+
+julia> validate_io(IOBuffer(">hello\nAC"))
+(nothing, (2, 2))

Reference

Automa.generate_buffer_validatorFunction
generate_buffer_validator(name::Symbol, regexp::RE; goto=true; docstring=true)

Generate code that, when evaluated, defines a function named name, which takes a single argument data, interpreted as a sequence of bytes. The function returns nothing if data matches Machine, else the index of the first invalid byte. If the machine reached unexpected EOF, returns 0.

If goto, the function uses the faster but more complicated :goto code.
If docstring, automatically create a docstring for the generated function.

See also: generate_io_validator

source
Automa.generate_io_validatorFunction
generate_io_validator(funcname::Symbol, regex::RE; goto::Bool=false)

NOTE: This method requires TranscodingStreams to be loaded

Create code that, when evaluated, defines a function named funcname. This function takes an IO, and checks if the data in the input conforms to the regex, without executing any actions. If the input conforms, return nothing. Else, return (byte, (line, col)), where byte is the first invalid byte, and (line, col) the 1-indexed position of that byte. If the invalid byte is a \n byte, col is 0 and the line number is incremented. If the input errors due to unexpected EOF, byte is nothing, and the line and column given is the last byte in the file.

If goto, the function uses the faster but more complicated :goto code.

See also: generate_buffer_validator

source
Automa.compileFunction
compile(re::RE; optimize::Bool=true, unambiguous::Bool=true)::Machine

Compile a finite state machine (FSM) from re. If optimize, attempt to minimize the number of states in the FSM. If unambiguous, disallow creation of FSM where the actions are not deterministic.

Examples

machine = let
+    name = re"[A-Z][a-z]+"
+    first_last = name * re" " * name
+    last_first = name * re", " * name
+    compile(first_last | last_first)
+end
source
compile(tokens::Vector{RE}; unambiguous=false)::TokenizerMachine

Compile the regex tokens to a tokenizer machine. The machine can be passed to make_tokenizer.

The keyword unambiguous decides which of multiple matching tokens is emitted: If false (default), the longest token is emitted. If multiple tokens have the same length, the one with the highest index is returned. If true, make_tokenizer will error if any possible input text can be broken ambiguously down into tokens.

See also: Tokenizer, make_tokenizer, tokenize

source
diff --git a/versions.js b/versions.js index 38078eb9..fb396c47 100644 --- a/versions.js +++ b/versions.js @@ -10,5 +10,5 @@ var DOC_VERSIONS = [ "v0.1", "dev", ]; -var DOCUMENTER_NEWEST = "v1.0.2"; +var DOCUMENTER_NEWEST = "v1.0.3"; var DOCUMENTER_STABLE = "stable";