diff --git a/asio/.buildinfo b/asio/.buildinfo deleted file mode 100644 index 2d494240b..000000000 --- a/asio/.buildinfo +++ /dev/null @@ -1,4 +0,0 @@ -# Sphinx build info version 1 -# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: be268656851d7dba858382a5bd9a954d -tags: 549b3d6d0415232fb7e35403b330ff49 diff --git a/asio/_sources/index.rst.txt b/asio/_sources/index.rst.txt deleted file mode 100644 index 56ff694f2..000000000 --- a/asio/_sources/index.rst.txt +++ /dev/null @@ -1,42 +0,0 @@ -ASIO port -========= - -Overview --------- -Asio is a cross-platform C++ library, see https://think-async.com/Asio/. It provides a consistent asynchronous model using a modern C++ approach. - - -ASIO documentation -^^^^^^^^^^^^^^^^^^ -Please refer to the original asio documentation at https://think-async.com/Asio/Documentation. -Asio also comes with a number of examples which could be find under Documentation/Examples on that web site. - -Supported features -^^^^^^^^^^^^^^^^^^ -ESP platform port currently supports only network asynchronous socket operations; does not support serial port. -SSL/TLS support is disabled by default and could be enabled in component configuration menu by choosing TLS library from - -- mbedTLS with OpenSSL translation layer (default option) -- wolfSSL - -SSL support is very basic at this stage and it does include following features: - -- Verification callbacks -- DH property files -- Certificates/private keys file APIs - -Internal asio settings for ESP include - -- EXCEPTIONS are enabled in ASIO if enabled in menuconfig -- TYPEID is enabled in ASIO if enabled in menuconfig - -Application Example -------------------- -ESP examples are based on standard asio :example:`examples <../examples>`: - -- :example:`udp_echo_server <../examples/udp_echo_server>` -- :example:`tcp_echo_server <../examples/tcp_echo_server>` -- :example:`asio_chat <../examples/asio_chat>` -- :example:`ssl_client_server <../examples/ssl_client_server>` - -Please refer to the specific example README.md for details diff --git a/asio/_static/DejaVuSans.ttf b/asio/_static/DejaVuSans.ttf deleted file mode 100644 index 19ed0b468..000000000 Binary files a/asio/_static/DejaVuSans.ttf and /dev/null differ diff --git a/asio/_static/NotoSansSC-Regular.otf b/asio/_static/NotoSansSC-Regular.otf deleted file mode 100644 index 7cd0b77ae..000000000 Binary files a/asio/_static/NotoSansSC-Regular.otf and /dev/null differ diff --git a/asio/_static/basic.css b/asio/_static/basic.css deleted file mode 100644 index bf18350b6..000000000 --- a/asio/_static/basic.css +++ /dev/null @@ -1,906 +0,0 @@ -/* - * basic.css - * ~~~~~~~~~ - * - * Sphinx stylesheet -- basic theme. - * - * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -/* -- main layout ----------------------------------------------------------- */ - -div.clearer { - clear: both; -} - -div.section::after { - display: block; - content: ''; - clear: left; -} - -/* -- relbar ---------------------------------------------------------------- */ - -div.related { - width: 100%; - font-size: 90%; -} - -div.related h3 { - display: none; -} - -div.related ul { - margin: 0; - padding: 0 0 0 10px; - list-style: none; -} - -div.related li { - display: inline; -} - -div.related li.right { - float: right; - margin-right: 5px; -} - -/* -- sidebar --------------------------------------------------------------- */ - -div.sphinxsidebarwrapper { - padding: 10px 5px 0 10px; -} - -div.sphinxsidebar { - float: left; - width: 230px; - margin-left: -100%; - font-size: 90%; - word-wrap: break-word; - overflow-wrap : break-word; -} - -div.sphinxsidebar ul { - list-style: none; -} - -div.sphinxsidebar ul ul, -div.sphinxsidebar ul.want-points { - margin-left: 20px; - list-style: square; -} - -div.sphinxsidebar ul ul { - margin-top: 0; - margin-bottom: 0; -} - -div.sphinxsidebar form { - margin-top: 10px; -} - -div.sphinxsidebar input { - border: 1px solid #98dbcc; - font-family: sans-serif; - font-size: 1em; -} - -div.sphinxsidebar #searchbox form.search { - overflow: hidden; -} - -div.sphinxsidebar #searchbox input[type="text"] { - float: left; - width: 80%; - padding: 0.25em; - box-sizing: border-box; -} - -div.sphinxsidebar #searchbox input[type="submit"] { - float: left; - width: 20%; - border-left: none; - padding: 0.25em; - box-sizing: border-box; -} - - -img { - border: 0; - max-width: 100%; -} - -/* -- search page ----------------------------------------------------------- */ - -ul.search { - margin: 10px 0 0 20px; - padding: 0; -} - -ul.search li { - padding: 5px 0 5px 20px; - background-image: url(file.png); - background-repeat: no-repeat; - background-position: 0 7px; -} - -ul.search li a { - font-weight: bold; -} - -ul.search li p.context { - color: #888; - margin: 2px 0 0 30px; - text-align: left; -} - -ul.keywordmatches li.goodmatch a { - font-weight: bold; -} - -/* -- index page ------------------------------------------------------------ */ - -table.contentstable { - width: 90%; - margin-left: auto; - margin-right: auto; -} - -table.contentstable p.biglink { - line-height: 150%; -} - -a.biglink { - font-size: 1.3em; -} - -span.linkdescr { - font-style: italic; - padding-top: 5px; - font-size: 90%; -} - -/* -- general index --------------------------------------------------------- */ - -table.indextable { - width: 100%; -} - -table.indextable td { - text-align: left; - vertical-align: top; -} - -table.indextable ul { - margin-top: 0; - margin-bottom: 0; - list-style-type: none; -} - -table.indextable > tbody > tr > td > ul { - padding-left: 0em; -} - -table.indextable tr.pcap { - height: 10px; -} - -table.indextable tr.cap { - margin-top: 10px; - background-color: #f2f2f2; -} - -img.toggler { - margin-right: 3px; - margin-top: 3px; - cursor: pointer; -} - -div.modindex-jumpbox { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - margin: 1em 0 1em 0; - padding: 0.4em; -} - -div.genindex-jumpbox { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - margin: 1em 0 1em 0; - padding: 0.4em; -} - -/* -- domain module index --------------------------------------------------- */ - -table.modindextable td { - padding: 2px; - border-collapse: collapse; -} - -/* -- general body styles --------------------------------------------------- */ - -div.body { - min-width: 450px; - max-width: 800px; -} - -div.body p, div.body dd, div.body li, div.body blockquote { - -moz-hyphens: auto; - -ms-hyphens: auto; - -webkit-hyphens: auto; - hyphens: auto; -} - -a.headerlink { - visibility: hidden; -} - -a.brackets:before, -span.brackets > a:before{ - content: "["; -} - -a.brackets:after, -span.brackets > a:after { - content: "]"; -} - -h1:hover > a.headerlink, -h2:hover > a.headerlink, -h3:hover > a.headerlink, -h4:hover > a.headerlink, -h5:hover > a.headerlink, -h6:hover > a.headerlink, -dt:hover > a.headerlink, -caption:hover > a.headerlink, -p.caption:hover > a.headerlink, -div.code-block-caption:hover > a.headerlink { - visibility: visible; -} - -div.body p.caption { - text-align: inherit; -} - -div.body td { - text-align: left; -} - -.first { - margin-top: 0 !important; -} - -p.rubric { - margin-top: 30px; - font-weight: bold; -} - -img.align-left, figure.align-left, .figure.align-left, object.align-left { - clear: left; - float: left; - margin-right: 1em; -} - -img.align-right, figure.align-right, .figure.align-right, object.align-right { - clear: right; - float: right; - margin-left: 1em; -} - -img.align-center, figure.align-center, .figure.align-center, object.align-center { - display: block; - margin-left: auto; - margin-right: auto; -} - -img.align-default, figure.align-default, .figure.align-default { - display: block; - margin-left: auto; - margin-right: auto; -} - -.align-left { - text-align: left; -} - -.align-center { - text-align: center; -} - -.align-default { - text-align: center; -} - -.align-right { - text-align: right; -} - -/* -- sidebars -------------------------------------------------------------- */ - -div.sidebar, -aside.sidebar { - margin: 0 0 0.5em 1em; - border: 1px solid #ddb; - padding: 7px; - background-color: #ffe; - width: 40%; - float: right; - clear: right; - overflow-x: auto; -} - -p.sidebar-title { - font-weight: bold; -} - -div.admonition, div.topic, blockquote { - clear: left; -} - -/* -- topics ---------------------------------------------------------------- */ - -div.topic { - border: 1px solid #ccc; - padding: 7px; - margin: 10px 0 10px 0; -} - -p.topic-title { - font-size: 1.1em; - font-weight: bold; - margin-top: 10px; -} - -/* -- admonitions ----------------------------------------------------------- */ - -div.admonition { - margin-top: 10px; - margin-bottom: 10px; - padding: 7px; -} - -div.admonition dt { - font-weight: bold; -} - -p.admonition-title { - margin: 0px 10px 5px 0px; - font-weight: bold; -} - -div.body p.centered { - text-align: center; - margin-top: 25px; -} - -/* -- content of sidebars/topics/admonitions -------------------------------- */ - -div.sidebar > :last-child, -aside.sidebar > :last-child, -div.topic > :last-child, -div.admonition > :last-child { - margin-bottom: 0; -} - -div.sidebar::after, -aside.sidebar::after, -div.topic::after, -div.admonition::after, -blockquote::after { - display: block; - content: ''; - clear: both; -} - -/* -- tables ---------------------------------------------------------------- */ - -table.docutils { - margin-top: 10px; - margin-bottom: 10px; - border: 0; - border-collapse: collapse; -} - -table.align-center { - margin-left: auto; - margin-right: auto; -} - -table.align-default { - margin-left: auto; - margin-right: auto; -} - -table caption span.caption-number { - font-style: italic; -} - -table caption span.caption-text { -} - -table.docutils td, table.docutils th { - padding: 1px 8px 1px 5px; - border-top: 0; - border-left: 0; - border-right: 0; - border-bottom: 1px solid #aaa; -} - -table.footnote td, table.footnote th { - border: 0 !important; -} - -th { - text-align: left; - padding-right: 5px; -} - -table.citation { - border-left: solid 1px gray; - margin-left: 1px; -} - -table.citation td { - border-bottom: none; -} - -th > :first-child, -td > :first-child { - margin-top: 0px; -} - -th > :last-child, -td > :last-child { - margin-bottom: 0px; -} - -/* -- figures --------------------------------------------------------------- */ - -div.figure, figure { - margin: 0.5em; - padding: 0.5em; -} - -div.figure p.caption, figcaption { - padding: 0.3em; -} - -div.figure p.caption span.caption-number, -figcaption span.caption-number { - font-style: italic; -} - -div.figure p.caption span.caption-text, -figcaption span.caption-text { -} - -/* -- field list styles ----------------------------------------------------- */ - -table.field-list td, table.field-list th { - border: 0 !important; -} - -.field-list ul { - margin: 0; - padding-left: 1em; -} - -.field-list p { - margin: 0; -} - -.field-name { - -moz-hyphens: manual; - -ms-hyphens: manual; - -webkit-hyphens: manual; - hyphens: manual; -} - -/* -- hlist styles ---------------------------------------------------------- */ - -table.hlist { - margin: 1em 0; -} - -table.hlist td { - vertical-align: top; -} - -/* -- object description styles --------------------------------------------- */ - -.sig { - font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; -} - -.sig-name, code.descname { - background-color: transparent; - font-weight: bold; -} - -.sig-name { - font-size: 1.1em; -} - -code.descname { - font-size: 1.2em; -} - -.sig-prename, code.descclassname { - background-color: transparent; -} - -.optional { - font-size: 1.3em; -} - -.sig-paren { - font-size: larger; -} - -.sig-param.n { - font-style: italic; -} - -/* C++ specific styling */ - -.sig-inline.c-texpr, -.sig-inline.cpp-texpr { - font-family: unset; -} - -.sig.c .k, .sig.c .kt, -.sig.cpp .k, .sig.cpp .kt { - color: #0033B3; -} - -.sig.c .m, -.sig.cpp .m { - color: #1750EB; -} - -.sig.c .s, .sig.c .sc, -.sig.cpp .s, .sig.cpp .sc { - color: #067D17; -} - - -/* -- other body styles ----------------------------------------------------- */ - -ol.arabic { - list-style: decimal; -} - -ol.loweralpha { - list-style: lower-alpha; -} - -ol.upperalpha { - list-style: upper-alpha; -} - -ol.lowerroman { - list-style: lower-roman; -} - -ol.upperroman { - list-style: upper-roman; -} - -:not(li) > ol > li:first-child > :first-child, -:not(li) > ul > li:first-child > :first-child { - margin-top: 0px; -} - -:not(li) > ol > li:last-child > :last-child, -:not(li) > ul > li:last-child > :last-child { - margin-bottom: 0px; -} - -ol.simple ol p, -ol.simple ul p, -ul.simple ol p, -ul.simple ul p { - margin-top: 0; -} - -ol.simple > li:not(:first-child) > p, -ul.simple > li:not(:first-child) > p { - margin-top: 0; -} - -ol.simple p, -ul.simple p { - margin-bottom: 0; -} - -dl.footnote > dt, -dl.citation > dt { - float: left; - margin-right: 0.5em; -} - -dl.footnote > dd, -dl.citation > dd { - margin-bottom: 0em; -} - -dl.footnote > dd:after, -dl.citation > dd:after { - content: ""; - clear: both; -} - -dl.field-list { - display: grid; - grid-template-columns: fit-content(30%) auto; -} - -dl.field-list > dt { - font-weight: bold; - word-break: break-word; - padding-left: 0.5em; - padding-right: 5px; -} - -dl.field-list > dt:after { - content: ":"; -} - -dl.field-list > dd { - padding-left: 0.5em; - margin-top: 0em; - margin-left: 0em; - margin-bottom: 0em; -} - -dl { - margin-bottom: 15px; -} - -dd > :first-child { - margin-top: 0px; -} - -dd ul, dd table { - margin-bottom: 10px; -} - -dd { - margin-top: 3px; - margin-bottom: 10px; - margin-left: 30px; -} - -dl > dd:last-child, -dl > dd:last-child > :last-child { - margin-bottom: 0; -} - -dt:target, span.highlighted { - background-color: #fbe54e; -} - -rect.highlighted { - fill: #fbe54e; -} - -dl.glossary dt { - font-weight: bold; - font-size: 1.1em; -} - -.versionmodified { - font-style: italic; -} - -.system-message { - background-color: #fda; - padding: 5px; - border: 3px solid red; -} - -.footnote:target { - background-color: #ffa; -} - -.line-block { - display: block; - margin-top: 1em; - margin-bottom: 1em; -} - -.line-block .line-block { - margin-top: 0; - margin-bottom: 0; - margin-left: 1.5em; -} - -.guilabel, .menuselection { - font-family: sans-serif; -} - -.accelerator { - text-decoration: underline; -} - -.classifier { - font-style: oblique; -} - -.classifier:before { - font-style: normal; - margin: 0 0.5em; - content: ":"; - display: inline-block; -} - -abbr, acronym { - border-bottom: dotted 1px; - cursor: help; -} - -/* -- code displays --------------------------------------------------------- */ - -pre { - overflow: auto; - overflow-y: hidden; /* fixes display issues on Chrome browsers */ -} - -pre, div[class*="highlight-"] { - clear: both; -} - -span.pre { - -moz-hyphens: none; - -ms-hyphens: none; - -webkit-hyphens: none; - hyphens: none; - white-space: nowrap; -} - -div[class*="highlight-"] { - margin: 1em 0; -} - -td.linenos pre { - border: 0; - background-color: transparent; - color: #aaa; -} - -table.highlighttable { - display: block; -} - -table.highlighttable tbody { - display: block; -} - -table.highlighttable tr { - display: flex; -} - -table.highlighttable td { - margin: 0; - padding: 0; -} - -table.highlighttable td.linenos { - padding-right: 0.5em; -} - -table.highlighttable td.code { - flex: 1; - overflow: hidden; -} - -.highlight .hll { - display: block; -} - -div.highlight pre, -table.highlighttable pre { - margin: 0; -} - -div.code-block-caption + div { - margin-top: 0; -} - -div.code-block-caption { - margin-top: 1em; - padding: 2px 5px; - font-size: small; -} - -div.code-block-caption code { - background-color: transparent; -} - -table.highlighttable td.linenos, -span.linenos, -div.highlight span.gp { /* gp: Generic.Prompt */ - user-select: none; - -webkit-user-select: text; /* Safari fallback only */ - -webkit-user-select: none; /* Chrome/Safari */ - -moz-user-select: none; /* Firefox */ - -ms-user-select: none; /* IE10+ */ -} - -div.code-block-caption span.caption-number { - padding: 0.1em 0.3em; - font-style: italic; -} - -div.code-block-caption span.caption-text { -} - -div.literal-block-wrapper { - margin: 1em 0; -} - -code.xref, a code { - background-color: transparent; - font-weight: bold; -} - -h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { - background-color: transparent; -} - -.viewcode-link { - float: right; -} - -.viewcode-back { - float: right; - font-family: sans-serif; -} - -div.viewcode-block:target { - margin: -1px -10px; - padding: 0 10px; -} - -/* -- math display ---------------------------------------------------------- */ - -img.math { - vertical-align: middle; -} - -div.body div.math p { - text-align: center; -} - -span.eqno { - float: right; -} - -span.eqno a.headerlink { - position: absolute; - z-index: 1; -} - -div.math:hover a.headerlink { - visibility: visible; -} - -/* -- printout stylesheet --------------------------------------------------- */ - -@media print { - div.document, - div.documentwrapper, - div.bodywrapper { - margin: 0 !important; - width: 100%; - } - - div.sphinxsidebar, - div.related, - div.footer, - #top-link { - display: none; - } -} \ No newline at end of file diff --git a/asio/_static/check-solid.svg b/asio/_static/check-solid.svg deleted file mode 100644 index 92fad4b5c..000000000 --- a/asio/_static/check-solid.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/asio/_static/clipboard.min.js b/asio/_static/clipboard.min.js deleted file mode 100644 index 54b3c4638..000000000 --- a/asio/_static/clipboard.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * clipboard.js v2.0.8 - * https://clipboardjs.com/ - * - * Licensed MIT © Zeno Rocha - */ -!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 - - - - diff --git a/asio/_static/copybutton.css b/asio/_static/copybutton.css deleted file mode 100644 index 40eafe5fc..000000000 --- a/asio/_static/copybutton.css +++ /dev/null @@ -1,93 +0,0 @@ -/* Copy buttons */ -button.copybtn { - position: absolute; - display: flex; - top: .3em; - right: .3em; - width: 1.7em; - height: 1.7em; - opacity: 0; - transition: opacity 0.3s, border .3s, background-color .3s; - user-select: none; - padding: 0; - border: none; - outline: none; - border-radius: 0.4em; - /* The colors that GitHub uses */ - border: #1b1f2426 1px solid; - background-color: #f6f8fa; - color: #57606a; -} - -button.copybtn.success { - border-color: #22863a; - color: #22863a; -} - -button.copybtn svg { - stroke: currentColor; - width: 1.5em; - height: 1.5em; - padding: 0.1em; -} - -div.highlight { - position: relative; -} - -.highlight:hover button.copybtn { - opacity: 1; -} - -.highlight button.copybtn:hover { - background-color: rgb(235, 235, 235); -} - -.highlight button.copybtn:active { - background-color: rgb(187, 187, 187); -} - -/** - * A minimal CSS-only tooltip copied from: - * https://codepen.io/mildrenben/pen/rVBrpK - * - * To use, write HTML like the following: - * - *

Short

- */ - .o-tooltip--left { - position: relative; - } - - .o-tooltip--left:after { - opacity: 0; - visibility: hidden; - position: absolute; - content: attr(data-tooltip); - padding: .2em; - font-size: .8em; - left: -.2em; - background: grey; - color: white; - white-space: nowrap; - z-index: 2; - border-radius: 2px; - transform: translateX(-102%) translateY(0); - transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); -} - -.o-tooltip--left:hover:after { - display: block; - opacity: 1; - visibility: visible; - transform: translateX(-100%) translateY(0); - transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); - transition-delay: .5s; -} - -/* By default the copy button shouldn't show up when printing a page */ -@media print { - button.copybtn { - display: none; - } -} diff --git a/asio/_static/copybutton.js b/asio/_static/copybutton.js deleted file mode 100644 index 40ac33108..000000000 --- a/asio/_static/copybutton.js +++ /dev/null @@ -1,220 +0,0 @@ -// Localization support -const messages = { - 'en': { - 'copy': 'Copy', - 'copy_to_clipboard': 'Copy to clipboard', - 'copy_success': 'Copied!', - 'copy_failure': 'Failed to copy', - }, - 'es' : { - 'copy': 'Copiar', - 'copy_to_clipboard': 'Copiar al portapapeles', - 'copy_success': '¡Copiado!', - 'copy_failure': 'Error al copiar', - }, - 'de' : { - 'copy': 'Kopieren', - 'copy_to_clipboard': 'In die Zwischenablage kopieren', - 'copy_success': 'Kopiert!', - 'copy_failure': 'Fehler beim Kopieren', - }, - 'fr' : { - 'copy': 'Copier', - 'copy_to_clipboard': 'Copié dans le presse-papier', - 'copy_success': 'Copié !', - 'copy_failure': 'Échec de la copie', - }, - 'ru': { - 'copy': 'Скопировать', - 'copy_to_clipboard': 'Скопировать в буфер', - 'copy_success': 'Скопировано!', - 'copy_failure': 'Не удалось скопировать', - }, - 'zh-CN': { - 'copy': '复制', - 'copy_to_clipboard': '复制到剪贴板', - 'copy_success': '复制成功!', - 'copy_failure': '复制失败', - }, - 'it' : { - 'copy': 'Copiare', - 'copy_to_clipboard': 'Copiato negli appunti', - 'copy_success': 'Copiato!', - 'copy_failure': 'Errore durante la copia', - } -} - -let locale = 'en' -if( document.documentElement.lang !== undefined - && messages[document.documentElement.lang] !== undefined ) { - locale = document.documentElement.lang -} - -let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; -if (doc_url_root == '#') { - doc_url_root = ''; -} - -/** - * SVG files for our copy buttons - */ -let iconCheck = ` - ${messages[locale]['copy_success']} - - -` - -// If the user specified their own SVG use that, otherwise use the default -let iconCopy = ``; -if (!iconCopy) { - iconCopy = ` - ${messages[locale]['copy_to_clipboard']} - - - -` -} - -/** - * Set up copy/paste for code blocks - */ - -const runWhenDOMLoaded = cb => { - if (document.readyState != 'loading') { - cb() - } else if (document.addEventListener) { - document.addEventListener('DOMContentLoaded', cb) - } else { - document.attachEvent('onreadystatechange', function() { - if (document.readyState == 'complete') cb() - }) - } -} - -const codeCellId = index => `codecell${index}` - -// Clears selected text since ClipboardJS will select the text when copying -const clearSelection = () => { - if (window.getSelection) { - window.getSelection().removeAllRanges() - } else if (document.selection) { - document.selection.empty() - } -} - -// Changes tooltip text for two seconds, then changes it back -const temporarilyChangeTooltip = (el, oldText, newText) => { - el.setAttribute('data-tooltip', newText) - el.classList.add('success') - setTimeout(() => el.setAttribute('data-tooltip', oldText), 2000) - setTimeout(() => el.classList.remove('success'), 2000) -} - -// Changes the copy button icon for two seconds, then changes it back -const temporarilyChangeIcon = (el) => { - el.innerHTML = iconCheck; - setTimeout(() => {el.innerHTML = iconCopy}, 2000) -} - -const addCopyButtonToCodeCells = () => { - // If ClipboardJS hasn't loaded, wait a bit and try again. This - // happens because we load ClipboardJS asynchronously. - if (window.ClipboardJS === undefined) { - setTimeout(addCopyButtonToCodeCells, 250) - return - } - - // Add copybuttons to all of our code cells - const codeCells = document.querySelectorAll('div.highlight pre') - codeCells.forEach((codeCell, index) => { - const id = codeCellId(index) - codeCell.setAttribute('id', id) - - const clipboardButton = id => - `` - codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) - }) - -function escapeRegExp(string) { - return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string -} - -// Callback when a copy button is clicked. Will be passed the node that was clicked -// should then grab the text and replace pieces of text that shouldn't be used in output -function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { - - var regexp; - var match; - - // Do we check for line continuation characters and "HERE-documents"? - var useLineCont = !!lineContinuationChar - var useHereDoc = !!hereDocDelim - - // create regexp to capture prompt and remaining line - if (isRegexp) { - regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') - } else { - regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') - } - - const outputLines = []; - var promptFound = false; - var gotLineCont = false; - var gotHereDoc = false; - const lineGotPrompt = []; - for (const line of textContent.split('\n')) { - match = line.match(regexp) - if (match || gotLineCont || gotHereDoc) { - promptFound = regexp.test(line) - lineGotPrompt.push(promptFound) - if (removePrompts && promptFound) { - outputLines.push(match[2]) - } else { - outputLines.push(line) - } - gotLineCont = line.endsWith(lineContinuationChar) & useLineCont - if (line.includes(hereDocDelim) & useHereDoc) - gotHereDoc = !gotHereDoc - } else if (!onlyCopyPromptLines) { - outputLines.push(line) - } else if (copyEmptyLines && line.trim() === '') { - outputLines.push(line) - } - } - - // If no lines with the prompt were found then just use original lines - if (lineGotPrompt.some(v => v === true)) { - textContent = outputLines.join('\n'); - } - - // Remove a trailing newline to avoid auto-running when pasting - if (textContent.endsWith("\n")) { - textContent = textContent.slice(0, -1) - } - return textContent -} - - -var copyTargetText = (trigger) => { - var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); - return formatCopyText(target.innerText, '', false, true, true, true, '', '') -} - - // Initialize with a callback so we can modify the text before copy - const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) - - // Update UI with error/success messages - clipboard.on('success', event => { - clearSelection() - temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) - temporarilyChangeIcon(event.trigger) - }) - - clipboard.on('error', event => { - temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) - }) -} - -runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/asio/_static/copybutton_funcs.js b/asio/_static/copybutton_funcs.js deleted file mode 100644 index b9168c556..000000000 --- a/asio/_static/copybutton_funcs.js +++ /dev/null @@ -1,58 +0,0 @@ -function escapeRegExp(string) { - return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string -} - -// Callback when a copy button is clicked. Will be passed the node that was clicked -// should then grab the text and replace pieces of text that shouldn't be used in output -export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { - - var regexp; - var match; - - // Do we check for line continuation characters and "HERE-documents"? - var useLineCont = !!lineContinuationChar - var useHereDoc = !!hereDocDelim - - // create regexp to capture prompt and remaining line - if (isRegexp) { - regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') - } else { - regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') - } - - const outputLines = []; - var promptFound = false; - var gotLineCont = false; - var gotHereDoc = false; - const lineGotPrompt = []; - for (const line of textContent.split('\n')) { - match = line.match(regexp) - if (match || gotLineCont || gotHereDoc) { - promptFound = regexp.test(line) - lineGotPrompt.push(promptFound) - if (removePrompts && promptFound) { - outputLines.push(match[2]) - } else { - outputLines.push(line) - } - gotLineCont = line.endsWith(lineContinuationChar) & useLineCont - if (line.includes(hereDocDelim) & useHereDoc) - gotHereDoc = !gotHereDoc - } else if (!onlyCopyPromptLines) { - outputLines.push(line) - } else if (copyEmptyLines && line.trim() === '') { - outputLines.push(line) - } - } - - // If no lines with the prompt were found then just use original lines - if (lineGotPrompt.some(v => v === true)) { - textContent = outputLines.join('\n'); - } - - // Remove a trailing newline to avoid auto-running when pasting - if (textContent.endsWith("\n")) { - textContent = textContent.slice(0, -1) - } - return textContent -} diff --git a/asio/_static/css/badge_only.css b/asio/_static/css/badge_only.css deleted file mode 100644 index e380325bc..000000000 --- a/asio/_static/css/badge_only.css +++ /dev/null @@ -1 +0,0 @@ -.fa:before{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} \ No newline at end of file diff --git a/asio/_static/css/fonts/Roboto-Slab-Bold.woff b/asio/_static/css/fonts/Roboto-Slab-Bold.woff deleted file mode 100644 index 6cb600001..000000000 Binary files a/asio/_static/css/fonts/Roboto-Slab-Bold.woff and /dev/null differ diff --git a/asio/_static/css/fonts/Roboto-Slab-Bold.woff2 b/asio/_static/css/fonts/Roboto-Slab-Bold.woff2 deleted file mode 100644 index 7059e2314..000000000 Binary files a/asio/_static/css/fonts/Roboto-Slab-Bold.woff2 and /dev/null differ diff --git a/asio/_static/css/fonts/Roboto-Slab-Regular.woff b/asio/_static/css/fonts/Roboto-Slab-Regular.woff deleted file mode 100644 index f815f63f9..000000000 Binary files a/asio/_static/css/fonts/Roboto-Slab-Regular.woff and /dev/null differ diff --git a/asio/_static/css/fonts/Roboto-Slab-Regular.woff2 b/asio/_static/css/fonts/Roboto-Slab-Regular.woff2 deleted file mode 100644 index f2c76e5bd..000000000 Binary files a/asio/_static/css/fonts/Roboto-Slab-Regular.woff2 and /dev/null differ diff --git a/asio/_static/css/fonts/fontawesome-webfont.eot b/asio/_static/css/fonts/fontawesome-webfont.eot deleted file mode 100644 index e9f60ca95..000000000 Binary files a/asio/_static/css/fonts/fontawesome-webfont.eot and /dev/null differ diff --git a/asio/_static/css/fonts/fontawesome-webfont.svg b/asio/_static/css/fonts/fontawesome-webfont.svg deleted file mode 100644 index 855c845e5..000000000 --- a/asio/_static/css/fonts/fontawesome-webfont.svg +++ /dev/null @@ -1,2671 +0,0 @@ - - - - -Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 - By ,,, -Copyright Dave Gandy 2016. All rights reserved. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/asio/_static/css/fonts/fontawesome-webfont.ttf b/asio/_static/css/fonts/fontawesome-webfont.ttf deleted file mode 100644 index 35acda2fa..000000000 Binary files a/asio/_static/css/fonts/fontawesome-webfont.ttf and /dev/null differ diff --git a/asio/_static/css/fonts/fontawesome-webfont.woff b/asio/_static/css/fonts/fontawesome-webfont.woff deleted file mode 100644 index 400014a4b..000000000 Binary files a/asio/_static/css/fonts/fontawesome-webfont.woff and /dev/null differ diff --git a/asio/_static/css/fonts/fontawesome-webfont.woff2 b/asio/_static/css/fonts/fontawesome-webfont.woff2 deleted file mode 100644 index 4d13fc604..000000000 Binary files a/asio/_static/css/fonts/fontawesome-webfont.woff2 and /dev/null differ diff --git a/asio/_static/css/fonts/lato-bold-italic.woff b/asio/_static/css/fonts/lato-bold-italic.woff deleted file mode 100644 index 88ad05b9f..000000000 Binary files a/asio/_static/css/fonts/lato-bold-italic.woff and /dev/null differ diff --git a/asio/_static/css/fonts/lato-bold-italic.woff2 b/asio/_static/css/fonts/lato-bold-italic.woff2 deleted file mode 100644 index c4e3d804b..000000000 Binary files a/asio/_static/css/fonts/lato-bold-italic.woff2 and /dev/null differ diff --git a/asio/_static/css/fonts/lato-bold.woff b/asio/_static/css/fonts/lato-bold.woff deleted file mode 100644 index c6dff51f0..000000000 Binary files a/asio/_static/css/fonts/lato-bold.woff and /dev/null differ diff --git a/asio/_static/css/fonts/lato-bold.woff2 b/asio/_static/css/fonts/lato-bold.woff2 deleted file mode 100644 index bb195043c..000000000 Binary files a/asio/_static/css/fonts/lato-bold.woff2 and /dev/null differ diff --git a/asio/_static/css/fonts/lato-normal-italic.woff b/asio/_static/css/fonts/lato-normal-italic.woff deleted file mode 100644 index 76114bc03..000000000 Binary files a/asio/_static/css/fonts/lato-normal-italic.woff and /dev/null differ diff --git a/asio/_static/css/fonts/lato-normal-italic.woff2 b/asio/_static/css/fonts/lato-normal-italic.woff2 deleted file mode 100644 index 3404f37e2..000000000 Binary files a/asio/_static/css/fonts/lato-normal-italic.woff2 and /dev/null differ diff --git a/asio/_static/css/fonts/lato-normal.woff b/asio/_static/css/fonts/lato-normal.woff deleted file mode 100644 index ae1307ff5..000000000 Binary files a/asio/_static/css/fonts/lato-normal.woff and /dev/null differ diff --git a/asio/_static/css/fonts/lato-normal.woff2 b/asio/_static/css/fonts/lato-normal.woff2 deleted file mode 100644 index 3bf984332..000000000 Binary files a/asio/_static/css/fonts/lato-normal.woff2 and /dev/null differ diff --git a/asio/_static/css/theme.css b/asio/_static/css/theme.css deleted file mode 100644 index ba75bdc2e..000000000 --- a/asio/_static/css/theme.css +++ /dev/null @@ -1,4 +0,0 @@ -html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,.wy-nav-top a,.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! - * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome - * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs li{display:inline-block}.wy-breadcrumbs li.wy-breadcrumbs-aside{float:right}.wy-breadcrumbs li a{display:inline-block;padding:5px}.wy-breadcrumbs li a:first-child{padding-left:0}.rst-content .wy-breadcrumbs li tt,.wy-breadcrumbs li .rst-content tt,.wy-breadcrumbs li code{padding:5px;border:none;background:none}.rst-content .wy-breadcrumbs li tt.literal,.wy-breadcrumbs li .rst-content tt.literal,.wy-breadcrumbs li code.literal{color:#404040}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.selectors{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;font-size:110%;line-height:1.6em;color:hsla(0,0%,100%,.3)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}footer .footer li{display:inline-block}footer .footer li.footer-aside{float:right;display:inline-block}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.field-list>dt:after,html.writer-html5 .rst-content dl.footnote>dt:after{content:":"}html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.footnote>dt>span.brackets{margin-right:.5rem}html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{font-style:italic}html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.footnote>dd p,html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{font-size:inherit;line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.field-list)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dl:not(.field-list)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.field-list)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dl:not(.field-list)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel{border:1px solid #7fbbe3;background:#e7f2fa;font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/asio/_static/doctools.js b/asio/_static/doctools.js deleted file mode 100644 index e1bfd708b..000000000 --- a/asio/_static/doctools.js +++ /dev/null @@ -1,358 +0,0 @@ -/* - * doctools.js - * ~~~~~~~~~~~ - * - * Sphinx JavaScript utilities for all documentation. - * - * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -/** - * select a different prefix for underscore - */ -$u = _.noConflict(); - -/** - * make the code below compatible with browsers without - * an installed firebug like debugger -if (!window.console || !console.firebug) { - var names = ["log", "debug", "info", "warn", "error", "assert", "dir", - "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", - "profile", "profileEnd"]; - window.console = {}; - for (var i = 0; i < names.length; ++i) - window.console[names[i]] = function() {}; -} - */ - -/** - * small helper function to urldecode strings - * - * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL - */ -jQuery.urldecode = function(x) { - if (!x) { - return x - } - return decodeURIComponent(x.replace(/\+/g, ' ')); -}; - -/** - * small helper function to urlencode strings - */ -jQuery.urlencode = encodeURIComponent; - -/** - * This function returns the parsed url parameters of the - * current request. Multiple values per key are supported, - * it will always return arrays of strings for the value parts. - */ -jQuery.getQueryParameters = function(s) { - if (typeof s === 'undefined') - s = document.location.search; - var parts = s.substr(s.indexOf('?') + 1).split('&'); - var result = {}; - for (var i = 0; i < parts.length; i++) { - var tmp = parts[i].split('=', 2); - var key = jQuery.urldecode(tmp[0]); - var value = jQuery.urldecode(tmp[1]); - if (key in result) - result[key].push(value); - else - result[key] = [value]; - } - return result; -}; - -/** - * highlight a given string on a jquery object by wrapping it in - * span elements with the given class name. - */ -jQuery.fn.highlightText = function(text, className) { - function highlight(node, addItems) { - if (node.nodeType === 3) { - var val = node.nodeValue; - var pos = val.toLowerCase().indexOf(text); - if (pos >= 0 && - !jQuery(node.parentNode).hasClass(className) && - !jQuery(node.parentNode).hasClass("nohighlight")) { - var span; - var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); - if (isInSVG) { - span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); - } else { - span = document.createElement("span"); - span.className = className; - } - span.appendChild(document.createTextNode(val.substr(pos, text.length))); - node.parentNode.insertBefore(span, node.parentNode.insertBefore( - document.createTextNode(val.substr(pos + text.length)), - node.nextSibling)); - node.nodeValue = val.substr(0, pos); - if (isInSVG) { - var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); - var bbox = node.parentElement.getBBox(); - rect.x.baseVal.value = bbox.x; - rect.y.baseVal.value = bbox.y; - rect.width.baseVal.value = bbox.width; - rect.height.baseVal.value = bbox.height; - rect.setAttribute('class', className); - addItems.push({ - "parent": node.parentNode, - "target": rect}); - } - } - } - else if (!jQuery(node).is("button, select, textarea")) { - jQuery.each(node.childNodes, function() { - highlight(this, addItems); - }); - } - } - var addItems = []; - var result = this.each(function() { - highlight(this, addItems); - }); - for (var i = 0; i < addItems.length; ++i) { - jQuery(addItems[i].parent).before(addItems[i].target); - } - return result; -}; - -/* - * backward compatibility for jQuery.browser - * This will be supported until firefox bug is fixed. - */ -if (!jQuery.browser) { - jQuery.uaMatch = function(ua) { - ua = ua.toLowerCase(); - - var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || - /(webkit)[ \/]([\w.]+)/.exec(ua) || - /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || - /(msie) ([\w.]+)/.exec(ua) || - ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || - []; - - return { - browser: match[ 1 ] || "", - version: match[ 2 ] || "0" - }; - }; - jQuery.browser = {}; - jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; -} - -/** - * Small JavaScript module for the documentation. - */ -var Documentation = { - - init : function() { - this.fixFirefoxAnchorBug(); - this.highlightSearchWords(); - this.initIndexTable(); - this.initOnKeyListeners(); - }, - - /** - * i18n support - */ - TRANSLATIONS : {}, - PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; }, - LOCALE : 'unknown', - - // gettext and ngettext don't access this so that the functions - // can safely bound to a different name (_ = Documentation.gettext) - gettext : function(string) { - var translated = Documentation.TRANSLATIONS[string]; - if (typeof translated === 'undefined') - return string; - return (typeof translated === 'string') ? translated : translated[0]; - }, - - ngettext : function(singular, plural, n) { - var translated = Documentation.TRANSLATIONS[singular]; - if (typeof translated === 'undefined') - return (n == 1) ? singular : plural; - return translated[Documentation.PLURALEXPR(n)]; - }, - - addTranslations : function(catalog) { - for (var key in catalog.messages) - this.TRANSLATIONS[key] = catalog.messages[key]; - this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); - this.LOCALE = catalog.locale; - }, - - /** - * add context elements like header anchor links - */ - addContextElements : function() { - $('div[id] > :header:first').each(function() { - $('\u00B6'). - attr('href', '#' + this.id). - attr('title', _('Permalink to this headline')). - appendTo(this); - }); - $('dt[id]').each(function() { - $('\u00B6'). - attr('href', '#' + this.id). - attr('title', _('Permalink to this definition')). - appendTo(this); - }); - }, - - /** - * workaround a firefox stupidity - * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075 - */ - fixFirefoxAnchorBug : function() { - if (document.location.hash && $.browser.mozilla) - window.setTimeout(function() { - document.location.href += ''; - }, 10); - }, - - /** - * highlight the search words provided in the url in the text - */ - highlightSearchWords : function() { - var params = $.getQueryParameters(); - var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; - if (terms.length) { - var body = $('div.body'); - if (!body.length) { - body = $('body'); - } - window.setTimeout(function() { - $.each(terms, function() { - body.highlightText(this.toLowerCase(), 'highlighted'); - }); - }, 10); - $('') - .appendTo($('#searchbox')); - } - }, - - /** - * init the domain index toggle buttons - */ - initIndexTable : function() { - var togglers = $('img.toggler').click(function() { - var src = $(this).attr('src'); - var idnum = $(this).attr('id').substr(7); - $('tr.cg-' + idnum).toggle(); - if (src.substr(-9) === 'minus.png') - $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); - else - $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); - }).css('display', ''); - if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { - togglers.click(); - } - }, - - /** - * helper function to hide the search marks again - */ - hideSearchWords : function() { - $('#searchbox .highlight-link').fadeOut(300); - $('span.highlighted').removeClass('highlighted'); - var url = new URL(window.location); - url.searchParams.delete('highlight'); - window.history.replaceState({}, '', url); - }, - - /** - * helper function to focus on search bar - */ - focusSearchBar : function() { - $('input[name=q]').first().focus(); - }, - - /** - * make the url absolute - */ - makeURL : function(relativeURL) { - return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; - }, - - /** - * get the current relative url - */ - getCurrentURL : function() { - var path = document.location.pathname; - var parts = path.split(/\//); - $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { - if (this === '..') - parts.pop(); - }); - var url = parts.join('/'); - return path.substring(url.lastIndexOf('/') + 1, path.length - 1); - }, - - initOnKeyListeners: function() { - // only install a listener if it is really needed - if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && - !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) - return; - - $(document).keydown(function(event) { - var activeElementType = document.activeElement.tagName; - // don't navigate when in search box, textarea, dropdown or button - if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT' - && activeElementType !== 'BUTTON') { - if (event.altKey || event.ctrlKey || event.metaKey) - return; - - if (!event.shiftKey) { - switch (event.key) { - case 'ArrowLeft': - if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) - break; - var prevHref = $('link[rel="prev"]').prop('href'); - if (prevHref) { - window.location.href = prevHref; - return false; - } - break; - case 'ArrowRight': - if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) - break; - var nextHref = $('link[rel="next"]').prop('href'); - if (nextHref) { - window.location.href = nextHref; - return false; - } - break; - case 'Escape': - if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) - break; - Documentation.hideSearchWords(); - return false; - } - } - - // some keyboard layouts may need Shift to get / - switch (event.key) { - case '/': - if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) - break; - Documentation.focusSearchBar(); - return false; - } - } - }); - } -}; - -// quick alias for translations -_ = Documentation.gettext; - -$(document).ready(function() { - Documentation.init(); -}); diff --git a/asio/_static/documentation_options.js b/asio/_static/documentation_options.js deleted file mode 100644 index f8d32270a..000000000 --- a/asio/_static/documentation_options.js +++ /dev/null @@ -1,14 +0,0 @@ -var DOCUMENTATION_OPTIONS = { - URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), - VERSION: 'latest', - LANGUAGE: 'en', - COLLAPSE_INDEX: false, - BUILDER: 'html', - FILE_SUFFIX: '.html', - LINK_SUFFIX: '.html', - HAS_SOURCE: true, - SOURCELINK_SUFFIX: '.txt', - NAVIGATION_WITH_KEYS: false, - SHOW_SEARCH_SUMMARY: true, - ENABLE_SEARCH_SHORTCUTS: true, -}; \ No newline at end of file diff --git a/asio/_static/espressif-logo.svg b/asio/_static/espressif-logo.svg deleted file mode 100644 index 1725310bf..000000000 --- a/asio/_static/espressif-logo.svg +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/asio/_static/espressif2.pdf b/asio/_static/espressif2.pdf deleted file mode 100644 index 05d20ec86..000000000 --- a/asio/_static/espressif2.pdf +++ /dev/null @@ -1,785 +0,0 @@ -%PDF-1.5 % -1 0 obj <>/OCGs[5 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream - - - - - Adobe Illustrator CC 2015 (Macintosh) - 2018-07-17T18:09:55+08:00 - 2018-07-17T18:09:55+08:00 - 2018-07-17T18:09:55+08:00 - - - - 256 - 256 - JPEG - /9j/4AAQSkZJRgABAgEAkACQAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAAkAAAAAEA AQCQAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq8Q/Pz8+Na8h6zp+i+X4bOe8lgNzftdq8nBWbjCqiOSOhP BieVdqYCWUY28r/6G5/M/wD5ZNJ/6R5/+q+DiZcARFl/zl/+Yccym70vSriDfmiR3ETnbaj+s4G/ +SceJeBk+lf85lW7ShdW8sPHFTeW0uhI1a/77kjjHT/Lx4kcDP8Ay5/zkz+VGstHHNfy6RcSEgRa hEY1BHjLGZYVG37TjDbHhL0vTNW0vVbRLzTLyG+tHFUnt5FljPyZCRhQisVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVSfzR5w8s+VdOOo+YNQi0+1rRWkJLO1CeMca1d2oOign FWI6b/zkP+T9/snmGOB6043MM8Peg+J4wm/XrgtNFmek+Z/LWsAHSNWs9RqK/wCi3EU2w6/YZsKE zxV2KvMPzL/5x+8neetQl1e4mudP1uVFRryF/Ujb0wFXnDJVaBR+wV8cBCRKnz151/5xl/Mby6sl xYQpr9gm/qWIPrgVI+K3b46/6nLBTMSeSyxSwyNFKjRyoeLo4KsCOxB6ZFktxV2KphonmHXdCvFv dG1C40+6Ug+rbSNGTQ1o3EjkPY7YVp7d5F/5y18y6eY7XzdZrrFoKA3tuFgu1G9SyikUnbb4PmcP EwMX0f5L/MPyh5zsjdeXtRjuuABntj8FxFUkD1Imo61INDSh7HJMSGR4odirsVdirsVdirsVdirs VdirsVdirsVdiqC1rWdM0XSrrVdUuFtdPs0MtxO/RVHy3JJ2AG5O2Kvn3y7/AM5ZW9z5+uLfVrYW vk+6ZYbC44/v7fiaCaahPJZK/EB9nalaGotlwvoyGaGeGOeCRZYZVDxSoQysrCqsrDYgjocLFfir w/8ANz/nJfRvLLTaP5WEWra4pKTXJPK0tmHWpX+9cHbiDQdz2wEshG3yl5i8z+YPMmpPqWu38uoX snWWZq0H8qKKKi/5KgDIswEswJXRySRuHjYo6mqspIIPsRirM/Ln50fmf5e4Lp/mG6aBBRba6YXU QHgEnEnH/Y0w2jhD1ryp/wA5hahFwh81aIlwgADXmnMY326kwyllYn2dRh4mJg9r8m/nN+XPm4pF pWrxpev00+6/0e4rXoqvQOf9QtkrYkM2xQwvz/8AlB5E88pz1qx4agF4x6pakQ3SgEbF6MsgoKAS KwG9KYKSDT5g/Mn/AJxs86+Ullv9Mrr+ixjk9xbIVuIlABJltwXNBv8AEhYUFW44CGYk8iyLJ2Ku xVF6Tq+qaPqEOo6XdS2V9btyhuIWKOp+Y7HuO+FX05+Un/OUlrfmHRvPbJaXdFSHXFASCVun+kKA BE3+WPg8QuSBazF9EI6uodCGVgCrA1BB6EHCxbxV2KuxV2KuxV2KuxV2KuxV2KuxVpmVVLMQqqKs x2AA7nFXxj/zkF+c0nnTVzoujzH/AAvp0n7tl2F1MuxmbxQb+mPp+USWyIY9+Tv5Sap+YevGEM1r olnRtTvwK0B6RR12Mj9vAbnsCAFJp9yaPo+m6NpdrpWmQLbWFnGIreBOiovz3J8SeuTa3hf/ADlZ +YXmTQbPTPL2kT/VLfWIp3v7iOomZEKqIlb9lW5HlTc9NhWoJZRD5PyDY7FXYq7FXYq7FXAkGo64 q9K8if8AOQP5i+UjFAt7+ldLjoPqF+WlAUVFI5a+olK7UNPbDbExfS35d/8AOQ3kPziY7SSb9C6y 9ALC8ZQrse0M+yP8jxb/ACckCwIp6hhQ8o/NP/nHjyl50E+o2Cro3mN+Tm8hX9zPITX/AEmIbEk1 q60bep5dMBCRKnyP528heaPJertpmv2bW8pqbedfignQH7cMg2Ybj3HcA7ZEhsBtj2BLsVdir2j8 kf8AnIO/8nyQ6H5ieS88sMQkUm7y2dSByTqWiHdO37PgZAsTF9hWN9Z39nBe2U6XNpcostvcRMGR 0YVVlYbEEZJrVsVdirsVdirsVdirsVdirsVdirwL/nKP81n0bS18maRNw1LU4+eqTIfiitTsIxTo 03f/ACf9bASyiHzR5J8n6t5w8y2WgaWtbm7ejSt9iKMbySvT9lF3/Ab5EMyaffHknydo3k/y3aaD pMfG2tl+OQgc5ZT9uWQjqzH+nQZNqTzFXzF/zmbbxrc+UrgV9SRL+NvCkZtyP+ThyMmcHzZkWbsV dirsVdirsVdirsVdir138sP+cj/N/lForDVmfXNBWi/V5n/0iFdh+5mapooGyNt4cckCxMX1l5K8 ++VvOmlDUtAvVuYxQTwH4ZoWIrwljO6n8D2JyTWQjPM/lXy/5o0iXSNeskvrCUhvTeoKuKgPG60Z HFTRlNcVfHP5xfkJr3kOaXU7HnqXlVnAjvQKy24c0VLoKABueIkA4safZJC5AhsEreVYGTsVdir2 j/nHz87ZPJ9+nl7XJi3li9k/dyuSfqczn7YqdomP2x2+141kCxkH2Ojq6h0IZWAKsDUEHoQck1t4 q7FXYq7FXYq7FXYq7FUn84eaNP8AK3lnUfMGoH/RtPhMpQGhd+kcanxdyFHzxV+fPmTzBqXmLXb7 W9Tk9W+v5WmmbsK9FXwVVoqjsBkG0B9e/wDONv5Xr5T8prreoQ8de1xFlk5D4obU/FFFuKgt9t/e g/ZyQDCRt7DhYuxV5x+cP5M235lfoj19VfTP0T9Y48IRN6n1n0utXSnH0fxwEJBp5nP/AM4ZWxA9 DzY6HevqWIcHw6XCUwcLLjSK8/5w683oD9S13T5z2Eyzwj/hVmx4V42Iax/zjV+b2mq0i6Sl/EnV rOeKQ/QjFJD9C40niDz/AFny35h0Sb0dZ0y606WtAl1DJCT8uYWv0YE2l2BLsVdirsVdirsVTXyz 5p1/yxq0WraHeyWV7CdnQ/Cy1qUkU/C6HurCmFBD7D/Jz8/dE89RppepCPTPM6rva8qQ3PEbtblj WvcxncDxFTkgWsinqlxb29zby21zEk1vMjRzQyKHR0cUZWU1BBBoQcKHyT+ev/OPNx5ba48yeVIX n8vUaW9sgeUlmK7sv7Tw7+5Uddt8iQzjJ4TkWbsVdir6n/5xb/Ns31qvkTWZh9btELaHM7fFLCgq 1vv+1EBVP8io/ZyYLXIPonCxdirsVdirsVdirsVdir5g/wCcu/PbSXWneSrST93CBf6oAertVYIz /qrycj/KXwyJZxDzj8gPy+HnLz/bLdRepo+lUvdRqKqwQ/uoj/xkfqP5QcACZF9zZNrdirsVQN9r 2h2BIvtRtbQjqJ5o4zv0+0RiqBh89+SJpDFD5h0ySRTxZEvLdmB8CA/XFU5gngniWWCRZYmrxkQh lNDQ0I264qvxVSurS1u7d7e6hS4t5BSSGVQ6MAa7qwIOKvNPNn/OOH5W+YfUlj046PePU/WNOb0V 5HpWEhoaV8FHzwUkSLwzzv8A84qeeNFEt1oEsfmCxSrCKMejdhev90xKvT/Ick/y4KZiTxi8sryy uZLW9gktrmI8ZYJkaORT4MrAEZFko4q7FXYq7FV8M00EyTQSNFNGweORCVZWBqCrDcEYq+sPyH/5 yGTXzb+V/Nsyx62fgsNTaipdeEcnQLN4Ho/+t9qYLXKL31lVlKsAVIoQdwQcLF8jf85D/kUfLc83 mzy1AB5fncG+sYlP+hyP+0oHSFm/4EmnSlIkM4yeEZFm7FUZo+r6jo+qWuqabM1vfWUqzW8y9VdD UfMeI7jCr9Afy886WXnPyhp3mG1AT61HS5gBJ9K4T4ZY6kAni4NDTcUOTaiGR4odirsVdirsVdiq ld3dvZ2k13cuIra3jaWaQ1oqICzMaeAGKvzt85+ZLnzN5q1TX7n+81G4eYL/ACoTSNN67IgCj5ZA toD67/5xk8lDy9+XEOozJx1DzAwvZiRQiAVW3X5cKuP9bJBhI7vXMLF47+an/OSPlnyhNNpWjout 6/ESkqI1La3cbESyCvJlPVE+RKnASyEbfNPm386vzK80yudQ1qaC1atLGyY20AB/ZKxkFx/rljkb ZiIYOSSancnqcCXYqr2l/fWUnqWdzLbSfzwu0Z291I8cKsx0P87fzV0Z0Np5kvJUTYRXbi7Tj4Uu BJt8sbRwh6Z5Z/5zB8x23CLzHo1vqEY2a4tGa2l+ZVvVRj8uOHiYmD2byd/zkB+WXmgxww6mNNvn oBZ6iBbsSR0VyTExrtQPX2w2xIL0YEEVG4PQ4UMY87/lr5N862f1fX9PSeRRSG9T93cxdfsSr8VN 68TVfEYpBfLH5o/841+avKay6lopbXNCSrM8a/6VAoFayxL9pR/On0hciQzEnjuRZOxV2KuxVtWZ WDKSGBqCNiCMVfWX/OPH58HX0h8peaLiuuRrx0y/f/j6RRX05D/v5QNj+2P8r7UwWuUXvNzbW91b y21zEk9vOjRzQyKHR0ccWVlaoZWBoQcLF8Ufn3+Ts3kPXvr2mRO3lXUnJspN3FvKasbV2NTsATGW 3Ze5KscgQ2RNvKsDJ2Kvfv8AnErz0dP8y3nlG6kpaawpuLIE7LdwLVlAp/uyIb7/ALA8clFhIPrL JMHYq7FXYq7FXYq8w/5yQ8yNof5T6oI2KT6q0emxEGm09TKNvGFHGApjzfGnlLQJvMPmjStDh2fU bqK3LD9lXcBm/wBitTkQ2Ev0VtbW3tLWG1t0EdvbosUMY6KiAKqivgBk2p8/f85IfnjcaQZfJflm 4MepOlNY1CM/FAjiogiYHaRlNWb9kHb4vsgllEPlUkk1O5PU5BsdirsVdirsVdirsVdirPfIP52+ f/JTpFp98bvS1I5aXeVlgp4R1IeL/YEe4OEFBi+oPyz/AOchvJfnRorC4b9C69JRVsLlgY5XPaCa iq5/yWCt4A5IFrMaep4UPFfzg/5xv0TzUk+seWlj0rzFu7xAcba6buHUbRuf51G/7Q7gEMhKnyPr eh6toeqXGlatayWd/atwmt5RxYHsfcEbgjYjcZFstA4FdirsVXwTTQTRzwu0c0TB4pEJDKymqsCO hBxV9q/kF+ccfnrRDpuqOq+Z9MjX60Nl+sxCii4UeNdpANgfYgZMFqIp6H5q8saR5o8v3uhavEZb C+ThIFNHUg8kdCQaOjAMpp1wofAvn3yTq/kvzReaBqa1ktzyguACEngbeOZPZh18DUdRkCG0G2PY Eph5e1u80LXdP1myYrdafcR3MVCRUxsG4mnZqUPthUv0W0nU7TVdLs9Ts3D2l9DHcQOO8cqh1P3H JtKKxV2KuxV2KuxV8y/85ka3WTy3oaHoJ72YfMrFF+p8jJnBhv8AzipoA1L80Vv3UGLR7Oa5BO49 SSkCD50lYj5YhMn1R+ZHm+Pyh5I1fzCy85LKH/R0IqGnlYRQg/5PqOvL2yTAB+fN9e3d9eT3t5K0 93cyNNcTOas8jkszE+JJyttUcVdirsVdirsVdirsVdirsVcCQajrir3L8of+cltZ8uGDRvNbSapo QokV4avdWyjYbn+9jH8p+Idj2yQLAxfWWj6zpetaZb6ppV1HeafdIHguIjyVgf1EHYg7g7HfJMGH fmx+UOgfmFpPp3AFrrVsjfo7U1HxITvwkA+3GT1HbqMBCQafEXmryrrnlbXLnRdatjbX1saEHdXU /Zkjb9pG7HItgKU4EuxV2Kpt5V8z6t5X8wWWu6TL6V7ZSB068XXo8bgdUdaqw8MKCH315C866V50 8rWWv6aaR3K0ngJBaGZdpInp3U/eKHvk2ohhH/OQ/wCVg86eUWvtOg5+YtGVprIIpLzxdZbfbckg ckFPtCg+0cBCYmnxNkG12Kvtv/nGbzG2s/lRYQySGS40iWXT5SRQhUIkiHQbLFKi19vHJhqlzeq4 UOxV2KuxV2KvjH/nKzUZLr815LdmqthY20CL4BuUx/GXIybI8md/84a6WgtfM2qstXd7a1jbfYKJ JHHhvyXGKJsg/wCcvNUltvy906wjcqL/AFFPWUU+KOGKR+J/2fA/RhKI83yFkGx2KuxVOvK3kvzV 5rvHs/L2mzajPEoaYRABUB6F3Yqi1ptU74aQSyuf/nHr844Fq/luUilf3c9rIfHokrY0jiDFdX8j +c9GSSTVtCv7GKIkPNPbTRxihpX1GXgRXuDjSbSTAl2KuxV2KuxV2Ks+/Kf84PMH5e6rztybzRLh q3+lM1FftzjJB4SDx79DhBQRb7a8p+bNC816Fb63olwLixuB8njcfajkX9l17j+FDk2pjX5vflPp H5haAbeQLba1agtpeo8alG6+m9NzG/cduowEJBp8Na5omqaFq11pGq27WuoWchiuIX6hh3B6FT1B GxG4yLaEDgV2KuxV67/zjh+Z58o+bl0q/l46DrjpDOWPww3H2YZtyAoqeLnw3/ZyQLGQfaeSa3xZ /wA5KflsvlPzqdUsIhHouvl7m3VaBYrhSDcRAA7Crh12Ao3EfZyJDZEvIsiyfTn/ADhrq0rW/mbS GI9KN7a7iHflIJI5K/RGmSiwm+lMkwdirsVdirsVfCP/ADkDdNc/nF5lkahKzRRfD0pFbxxj6aLv kC2R5Pfv+cRLRIvy2v7ig9S41WYlh14pBCoB+RqfpyQYy5sV/wCczZW9XylFU8Qt+5HapNuP4YJJ g+acizdirsVfZ3/OKqaSPyqiaz4fXGvLj9Jlac/VDfAH/wCePCmTDXLm9iwsXEAih6YqxLzR+U/5 d+Zw51jQrWWd6Vu4l9C426fvoeDn5E40kF4f53/5xCnjWW68m6p6wAqumahQOTUkhLhAF9gGQe7Z HhZCb5/8xeWPMHlvUX03XbCbT71N/SmWnJa05I26uv8AlKSMDIFLMCXYq7FXYqz78nvzY1T8vfMI uE5T6JeFU1WwH7aCoEkdekiV28ehwgoIt9zaNrGm6zpdrqumXC3VheRiW3nQ7MrfiCOhB3B2OTan kP8Azkh+UEfmnQ38y6RAP8RaVGTKiD4rq1TdkPi8YqyeO6+FAQyiafHOQbHYq7FXYq+4P+cefzEP nHyHFHeS+prOjFbO/LGrOoX9zMf9dBQ+LKcmC1EUnv5v+QI/PXkW+0VeI1BKXWlyNWi3UIPCu4FH VmjJNaBq02xKg0+BJYpIZXilUpLGxR0OxDKaEH5HINr3P/nEC9mj/MPVLQN+4uNKkd0oN3iuIeBr 12Dt9+Sixm+u8k1uxV2KuxV2Kvgb87v/ACbPmj/mOf8AUMgWyPJ9Jf8AOJnH/lVklAQf0lccqmtT 6cXTbwyQYy5sa/5zJ0ieTSfLWsKP3FrPc2kpp+1cIkke/wD0btgkmD5byLN2KuxVkXk38wvOPk26 kuPLmpSWRnoLiKiyQycenOKQMhI7GlR2OG0EW9Fg/wCcsvzUjcs6abMK14PbuB8vglQ/jh4kcAZf oP8AzmRLyij1/wAuKVp++ubCYg8qdVhlB2J7GXHiRwPWvJv57/ln5rMcNnqq2V/JxAsL8C3l5vWi KWPpyNt0R2w2xIegYUJP5p8oeW/NWmNpuv2EV/atUoJB8cbEEc4nFGRqH7SkHFXyV+cP/OO2t+TB NrOiM+qeWV+KRiK3NqO/rKoAZB/vxf8AZAdTEhsEnjmRZOxV2KuxV7l/zjT+bx8uayvlTWZ6aFqk gFnK5ottdMaDc9El6N4Gh8ckCwkH19kmD4x/5yU/K9fKfmoa1psXDQ9cZpERQAsN0N5YgB0Vq81+ kfs5EhsiXjuRZOxV2KvSv+cffPR8pfmNZGeThpmrUsL+pooErD0pD/qSU38K4QxkH3Nk2t8V/wDO TfkkeXfzGm1C3j4WGvqb2KnQT143C9OvP4/9lkS2RKY/84jf+TPu/wDtk3H/ACfgxis+T7DyTW7F XYq7FXYq+FP+chrR7X84vMaPvzlglU0oCJbaJx93KmQLZHk95/5xCvVl/LnUbUn95barKaUP2JII Spr/AKwbJBjLm9G/NTyWvnPyJquggD61NF6lg5IAW5iPOLc9AzDi3sThKAX5/wBzbXFrcy21zG0N xA7RzROKMjoeLKwPQgimVtqnirsVdirsVdirsVekflx+fXnnyS0dsk51XREoDpd27MqIABSCTdoq AbAVX/JwgsTF9bflx+a3lPz9pxuNInMd7EAbzTJqLcQnxp0dPB12+R2ydsCKZkyqylWAKkUIO4IO KHyt/wA5A/8AOPyaSlx5u8o24XS1Bk1XSoxQW4G7TQqP91fzL+x1Hw/ZiQzjJ88ZFm7FXYq4Eg1H XFX27/zjz+ZjedfJawX8vPXtG421+WNWljI/czn3dVIb/KUnvkwWqQpln5leSLPzr5N1DQLiiyTp zspj/uq5j+KJ++3LZv8AJJGFQX5+Xtnc2V5PZXUZiubaR4Z4m6rJGxVlPyIyttUcVdirgSDUdcVf ff5NecT5u/LnSNVlfnerH9Vvz3+sW/wMx93AD/7LLA1EJN/zkD+Wt/568mw2+kRLLrdhcpNZq7rG GR/3cycmIUDiwf8A2O2AhQaY9+Q/5B6z5D1qbzBrWoQS3k9m1othbBmVPUeOQs0zcKkenSgWm/XE BMpW9vwsXYq7FXYq7FXxr/zlhpj2n5pC6IHDUNPt5wRXqheEg+/7oZGTZBmf/OGuqLTzPpTfa/0W 6i6dP3kb/wDGmMUTfS+SYPm//nJP8jp7yWfzv5ZtzJcFeWt2EQJZ+I/3pjUdTQfvB3+115ZEhlGT 5fyLY7FXYq7FXYq7FXYqjtF1vVtD1S31XSLqSy1C1YPBcRGjAjsezKehU7EbHbCr7Q/JL87dN8/6 aLK9KWnmi0St3aDZZ1GxngB7fzL+z8qHJAtRFPUmVWUqwBUihB3BBwofGP8AzkT+Tw8ma2ut6NDx 8s6o54Rr0tbk1ZofZGHxR/SOwrEhsiXjuRZOxV2Ks+/JHz8/krz/AGN/LIV0u8P1PVFrt6EpA5n/ AIxvR/kCO+EFEg+8gQRUbg9Dk2p8ef8AOVfkhdF88w6/axcLLzBGZJSo+EXcNFl6fzqUf3JbIlsi XiWRZOxV2Kvo/wD5w881enf635VmcBLhF1G0UmnxxkRTADuWVkPyXJRYTD6hyTB2KuxV2KuxV2Ku xV82f85kaGTbeXNdQGkbz2M57fGFli/4hJkZM4PPv+cXdfGl/mtbWrvwh1e2msmr0L0E0f0loaD5 4hMuT7UyTW7FXh/5q/8AOMeheZZptX8sSR6NrMhLzW7Aiznc7klVBaJj3Kgj/JrvgIZCT5o82/ld 598pyONb0a4ggQn/AE1F9W2IHcTR8k360JB9sjTMEMWwJdirsVdirsVdiqN0TWtU0PVrXVtLuGtd QspBLbzoaEMPHxUjZgdiNjthV94/lR+Y+n+fvKUGsQARX0Z9DU7QdYrhRvT/ACHHxIfD3ByYaiKT rzf5W0zzV5bv9A1Na2l/EYy4ALRv1SRKgjkjAMPfFD8+/M/l3UfLfmC/0LUl43unzNDLSvFqfZda 0PF1IZfY5BtBSvAl2KuxV91fkB5xPmj8stMmmk9S+04fo68JILc7cAIx92iKE175MNRG6G/5yO8p DzD+VuoyRpzvNHK6lbkCp4w1Ewr1p6LMfoGJWJ3fD2QbXYq7FWbfkt5i/wAP/mh5e1Bn4QvdLa3B PQRXQMDE/wCr6nL6MIRLk++sm1OxV2KuxV2KuxV2KvOv+cgvLDeYPyq1mGJDJdWCrqFsF3PK2PKT bv8AuS42wFI5viTy7rVzoev6drNsSLjTrmK5jp3MThqb+NKZFsL9F9N1C11LTrXUbR/UtL2GO4t3 /mjlUOh+lTk2pE4q7FXYqkd/5E8j6jL6uoeXtMvJdz6lxZ28rb9d3QntitsZ1j8gPyj1SJkk8vQ2 rtustmz27KfECNgn0FSMFJsvG/P3/OI+o2cUt75LvjqCL8X6LvCiT08I5hxjc+zBfmcBDISfPl/Y X2n3s1jf28lreW7mOe3mUpIjjqrK1CDgZqGBXYq7FXpP5CfmQ3kjzzA91Jw0TVSlpqgY0RFZv3c5 qQP3TGpP8pbCCxkH3Pk2t8x/85feSFjm0vznaxgCb/cfqbDqXAL27kAfyh1JJ7KMjJnAvmvIs3Yq 7FX0J/zh95mNv5j1ny5K9I7+3W8t1P8Av22biwHuyS1/2OSiwmH1PdWsF3azWtwnqW9wjRTRmoDI 4KsNt9wckwfnL5k0abQ/MOp6NNUy6bdTWrE9zDIUr9NK5BtCXYEuxVdHI8ciyRsVdCGRh1BBqDir 9HPLGrDWPLelauCCNRs4Lrbb++iV/wDjbLGlMsVdirsVdirsVdiq2WKKaJ4pVDxSKUkRhUMrChBH uMVfnn+YnlObyn511fQJAQlncMLZmBHOB/jhfev2o2GQLaC+pf8AnFfzsuteQm0K4k5X+gSekFNK m1lJeFv9ieSfQMkGEhu9pwsXYq7FXYq7FXYq80/Ob8mNH8/aRJcW8aW3me3T/Qb/AOz6nHpDMQPi Q9j1U+1QQQkGnxFqGn3unX1xYX0LW95ayNDcQSCjJIh4spHiCMi2ofArsVdir7w/Ijzi3mv8s9Kv JpPUv7NTYX5Lc29W2ooZyf2pI+Dn/WyYaiE0/Nfyuvmf8u9d0cJznltXltFrT/SIP30O/vIgB9sJ UF+feVtrsVdirOPyR1xtF/NXy3dh+CS3a2kpPThdgwHl7fvK4QiXJ98ZNqfEH/OS2jrpv5vasyLx jv44LxR7vEFc/TIjHIlsjyeXZFk7FXYq+6v+cedS/SH5P+XpDXnBHLbMCD/uieSNdz1+ADpkw1Hm 9GwodirsVdirsVdirsVfN3/OXfkQy22n+dbOKrW9LHVWUD7DGtvI1PBiUJPioyJZxLxz8lPzAPkj z7ZalM5XSrr/AETVVHT0JSPjp/xW4D/QR3wAspC33mjo6K6MGRgGVlNQQdwQRk2pvFXz5+cX/OTi 6Hf3Hl/yakV1f27GO81WUc4YpFNGSFOkjL0LH4QexwEshF4FqP5xfmnqE5nn81akjmppbXElsm/+ RAY0/DI2zoMn8nf85LfmZoF1H9fvP09p4P721vaeoR34XAHqKf8AW5D2w2gxD60/L/8AMDy/558v x6zo0h4V9O6tZKCWCUCpjkAr41BGxGSYEMlxQ+Wf+cuPIMVnqNj50souKagRZ6px6euiVhkPu8al T/qjxyJZxL51yLN2KuxV9Lf84b683qeY/L8ko4lYL+2gqK1BMU7gde8QOSiwm+mskwfnV550ePRv OmvaTFGYobHULm3gRgQfSjmZY+vYoARkC2hJMCXYqr2F29lfW15HvJbSpMg6bxsGH6sKv0mgning jniblFKoeNqEVVhUGh36ZNpfKX/OYtkqeb9BvafFPp7Qk+0MzMP+T2Rkzg+f8izdiqZ+WPLupeZP MFhoWmp6l7qEqwxDsK7s7f5KKCzewwoJfoL5O8r6d5V8s6d5f08f6Lp8QjDkAM7n4pJGpQcnclj8 8m1JxirsVdirsVdirsVdiqX+YNC07X9EvdG1GP1bK/haCde9GHUeDKdwfHFX59edfKWp+UvM9/5f 1Ff9IspCqyAELJGd45Ur+y6kHIFtBt9Rf84v/mkuveXv8JanNXV9GjH1JnPxTWQ2UCvUw14f6vH3 yQLCQZl+fPnG58qflnqd9ZSGHULrhY2UoNCr3BozKezLEHZfcYlAG74QyDa7FXYq9X/5xp843Ogf mZZWJkI0/Xv9Buo6/CZCCbdqfzCT4R7MckGMhs+2ck1vPfz/ANHi1T8o/MMbrye1hW8iYdVa3dZC R/sAwPscBSOb4RyDa7FXYq9n/wCcTbkw/mo8Y6XOm3ER+QeKT/mXkosZ8n2Tkmt8Kf8AOQ0KQ/nJ 5kRBQGWBzQU3ktYnP4tkC2R5POsDJ2KuxV+jHk2b1/KGhzUp6un2r0O5+KBTljS8E/5zNgBtvKc9 d0e+jpTqHFuevtwyMmcHzFkWbsVfX/8AzjR+UbeWtGPmnWISmuatEBawuKNb2jUYAg7h5di3gKDx yYDXI29xwsXYq7FXYq7FXYq7FXYq7FXi3/OSv5Tt5q8vjzFpMPPXtGjPONftXFoKs6Ad3jJLL47j ckYCGUTT5K8ueYdV8ua5Z63pMxg1CxkEsEnUeBVh3VlJVh3GRbCH0X+dXnPT/wAxvyFsvMGlUR7D U7aTVrMmr28hilgKt/kl51Kt3B+dCeTAbF8xZFm7FXYqy/8AJ/T7i/8AzS8qwQCrpqdtcEf5FtIJ 5D9CRnCEHk/QHJtTEvzcvI7T8rvNcsgqraVdwj/WmhaJfxfEpHN+fmVtrsVdir2H/nFQE/mzCQKg WNyT7CijJRYz5Ps/JNb4Z/5yONfzo8xmlN7Qbe1lAMgWyPJ5rgZOxV2Kv0U8iAjyP5eB6/oyz/6h 0yxpYp+c35Pf8rKttKg/S/6J/RjzPy+r/WfU9YIKf3sPGnD3wEJBp5Tcf84ZXKx1t/NqSSV+zJYG MU+YuJP1YOFlxp7+Xv8AzinZ6D5kg1fzDqcWsW9p+8t7BICiNMD8LSlmbkq9eNNz12FCQEGT6Aws XYq7FXYq7FXYq7FXYq7FXYq7FXyT/wA5I/kq2g30vnDy/b00O8flqVrGNrWdz9tQOkUhPyVtuhAy JDOJeQ+VvNVzocl5Aym40jVYTa6tp5bis0R+yw6hZIm+ON6fC3tUEAsiEu1DT2tWSSN/Xsp6m1ug OIcLSoIqeLrUclrt7gglUFCYEuxV9V/84x/k7f6Jy85+YIDb31zEYtJs5BSSKKT7czg7qzj4VHXj XxyYDXIvoXCxeLf85W+a49K/LpdFSSl3r1wkXAdfq9uRNK3/AAQjX6cBZRG744yDY7FXYq95/wCc P9Kmn89atqdB9XstOMLHeokuJkKU2p9mF++Siwm+t8kwfAn51aoup/mt5ouVBAS/kthXv9Vpb16n r6VcgW2PJhWBLsVdir9I9DtJLPRdPs5BSS2toYXGx+KOMKem3bLGlG4q7FUHq+saXo2mz6nqt1HZ 2FsvKe5mbiiitOvudgO+KomGaGeGOeCRZYZVDxSoQysrCqsrDYgjocVX4q7FXYq7FXYq7FXYq7FX Yq7FVK8tLW9tJrS7iWe1uEaKeGQBkdHHFlYHqCDir4z/AD0/Iu88kXjazoyvc+Vbl9juz2jsdo5D 3Q/sP9B36xIbIyeeeVvND6HdMLizh1XSLgr9f0m6FYplXurfailUE8ZE+JfkSCAUkPoDyZ+Sn5Df mLp/6V8v32p2DKALvSI7mIyWzn9lhNFM5H8rciD864aDGyHqPk38g/yy8qXEd5Z6ab3UIiDHe37f WHVhuGVSFiVh/MqA4aYkl6HhQoX19Z2FnPe3syW9pbI0txPIeKIiCrMxPYDFXwh+c35kS+ffOlxq cfJNJth9W0mF9isCmvNh2aRqsfoHbIEtsRTBcCXYq7FX15/ziP5ZOn+RL3XZUAl1u7IicGvK3tKx r8v3rS5MNcub2nVtSttL0q81O6YJbWMElzO56BIkLsfuGFi/OG/vrm/vrm+um53N3K8870pWSRiz Gg8Scg3KGBXYqnnkbSX1fznoWloKm8v7aE+AVpVDE+wWpwhB5P0UybU7FUj84+dfLfk/R5NW167W 2tl2jTrLK9NkiTqzH/b2xV8V/m3+cWu/mHqgaYGz0S1Y/UNMViQO3qSn9uQjv0HQdyYEtgFPYP8A nE3zF5+ube50me3a68n2ob0L+Zipt59j6MJNfUVq1K/s9aitDIMZPpDCxdirsVdirsVdirsVdirs VdirsVUruztL21ltLuFLi1nUxzQSqHR0YUKsrVBBxV8nfnV/zjdfaC1x5g8nxPeaHvJdaatXntR1 LJ1aSIf8Eo61FTkSGYk8X8veY9c8uarDq2iXkljqEB/dzxHseqsDVWU91YUOBmQ+q/yt/wCcoPL2 vLDpnm309G1c0Rb2tLKZum7H+5J/yvh/yu2SBazF7kjo6K6MGRgGVlNQQdwQRhYrbi3guIJLe4jW aCVSksUihkZWFCrKaggjtir5P/PL/nHO40L6x5l8oQtPogrLe6YtWktAN2eOu7xDuOq+46RIZiTw LIs3Yqj9A0PUNe1ux0bTo/UvtQmS3gXenJzTk1AaKvVj2G+FS/RDy5oVnoGgafollX6rp1vHbRFv tMI1C8mp+03U++TaWM/nPovmrXPy71TRvLESzalfhIWVpViPocg0oVn+El1XhQkbHriUh8N+YPKv mTy7d/VNc02406f9lbiNkDe6MfhYe6nIU2ApVgSybyp+WvnvzWy/oHRbm7hatLvj6dvs3E/v5OEV Qe3KuGkEvoz8nv8AnGa48ra9Y+ZvMWoxz6hZFnt9OtVJhWRlZFZ5n4luIatAo+LuR1kAwMre/YWL x780P+ckvKflNZtP0Rk1zXlqvpxNW1hbcfvZV+0Qf2E38SuAlkI2+TPOHnbzL5w1ZtU1+9e7uT8M SnaOJOvCKMfCi/L5nfI2zAp6L+TP/OPur+dJIdY1oSad5XryWT7M10B+zCD0Q95KfL2ICDJ9haNo ulaLplvpelWqWen2q8ILeIUVR1+ZJO5J3J65JrRuKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KvFvzY /wCcavL/AJqabVvLpj0bXn+KRKUtLhu5dEBMbn+ZRv3BJrgIZCVPlPzb5L8z+UtTbTvMFhJZXG5j LCscig05RSCquvyORpmDbIfy+/Ovz55IZIdOvfrWlKatpV3WWCnfhuGj/wBgR7g4gqY2+ivJP/OV PkLWljt9dWTQL9qBmlrLak07TIKrv/OoHvkrYGJew6fqem6lapd6ddw3tpJ9i4t5Fljb5OhZThYs b8yflL+W/mMyvq3l+0luJyDLdRJ6FwxFKEzQmOQ9O7e3TGk2891b/nEf8uLqUyWN5qOnAinopLHL GPcerGz/APD4KTxFM/yq/wCceNG8g+ZLnXTqTatOYzFpyyQCI24evqMWDvzdlotQFoK+OICmVvXM LF2KobUNN07UrV7TUbWG9tJPt29xGssbfNHBU4qxjSPyf/LDSLtruw8t2SXLP6okkj9Yo4AAMfrF /T6fsUxpNsquLmzsbVpriWO1tYQOcsjLHGg6CrGijFDynzr/AM5N/lx5eV4dOmbzBqC1AhsjSAEf zXDDhT/UDYLZCJfOv5g/n/5/85erbPc/orR5Kr+jrIsgZT2lk+3J7jZfbIkshFg/l/y3r3mLUo9M 0Sxlv76X7MMK1oP5mP2VUd2YgDFJL6g/Kj/nFzS9GeHV/ObR6lqS0eLS0+K1ibr+8J/vmHh9n/Wy QDAye+qqqoVQFVRRVGwAHYYWLeKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kpfrvl7RNf06TTt asob+yk+1BOoYV8V7qw7Eb4q+fvPn/OItrKZbzyVqH1djVhpd8SydK8Y5wCw8AHB92yNMxJ4F5s/ Lzzr5TmMev6RcWSVKrclecD0NPgmTlG3X+bBTIFLdG8w69odyLrR9RudOuAa+pbSvETtTfiRXY98 Vp6ZoH/OUX5raWES6urbV4U243sA5Ef8ZITCxPuScNo4QzzS/wDnMr4OOq+WKv8A79tbqg6f77kj /wCN8eJHAyay/wCcvfy5lUC607VbaTetIoJE9txMG/4XDaOEor/obP8AKziT6ep1BA4/V46mtd/7 3tja8JQ93/zl3+W0SH6vYarcSUqoEMCLXwJaao+gHG14SxzVP+cyrYIy6V5YdnP2Jbq6Cgb9Skcb V2/y8HEngYLr/wDzlX+aOpBksGs9HiIoDaw+pJQ+L3BlFfcKMbTwvMtf82+Z/MM3ra5qt1qL/s/W JXdVp/KpPFfoGC0gL/LfkzzX5mufq2gaVcajJWjGFCUXp9uQ0RBv+0RjSkvePIn/ADiJdyNHd+dd REMezHS7A8nPtJOw4r8kVv8AWGHhYmT6H8r+T/LPlbTxYeX9Oh0+225iIfG5HRpJDV3PuxOSYJxi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdiq2aGKaJ4pkWSKQFXjcBlZTsQQdiMVee eZ/+cffyq8ws8s2jLYXUhqbnTmNs1T1Ppr+5PjumCk2XmOuf84b2xJfQvMboK/DBfQBzT3liZP8A k3g4WXGwjU/+cT/zTtHpanT9RSlQ0FwUPXoROkW+PCnjY9d/848/nHauEfy5K9a0aKe2lBA90lan 04KXiCB/5Ul+bH/Ur33/AAA/rjS8QRdr/wA4/fnFcsFj8tTqSOX72W3iFPnJIgr7Y0vEGQad/wA4 p/mvdSKtxHY2Cnq89yGAp7QLMcPCvEGaaJ/zhvKaPrnmRV6Vhsrcn5/vZWH/ACbx4Ucb0zy1/wA4 3/lPobJIdLbVbhKES6lJ64NPGIBID9MeGmPEXpNpZ2lnbpbWcEdtbRCkcEKqiKCa/CqgAb4UKuKu xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV//2Q== - - - - 1 - False - False - - 56.333333 - 57.333333 - Pixels - - - - Black - - - - - - 默认色板组 - 0 - - - - application/pdf - - - 黑鱼白底 - - - proof:pdf - xmp.did:279a03ea-f3e7-40a3-ae53-771dd64b883e - uuid:c3a85fc4-4db4-b943-8504-bfeab2b33386 - uuid:f45c532c-a658-3748-b74d-0cf5e658e16a - - uuid:28112cc2-f74a-0b45-b4e8-5de3f55b3424 - uuid:f45c532c-a658-3748-b74d-0cf5e658e16a - uuid:f45c532c-a658-3748-b74d-0cf5e658e16a - proof:pdf - - - - - saved - xmp.iid:279a03ea-f3e7-40a3-ae53-771dd64b883e - 2018-07-17T18:09:54+08:00 - Adobe Illustrator CC 2015 (Macintosh) - / - - - - Adobe PDF library 15.00 - - - - - - - - - - - - - - - - - - - - - - - - - endstream endobj 3 0 obj <> endobj 7 0 obj <>/Resources<>/Properties<>>>/Thumb 11 0 R/TrimBox[0.0 0.0 56.3333 57.3333]/Type/Page>> endobj 8 0 obj <>stream -HDWˮ\W|olׁ 'q$RS>70Ul滿}x_?(_?}oo|r0櫵~oI10nGaո4U;Q@?[`nɅqN&`TяPۋpFSS'F(5k s*GO݂1ã_*8Cu5b  -!u6G:.N5Gf'l! ES@]C`we,ÍWSpn=v*mua7jSh kO Ɓy{(Axflt-8utɈQ7& އ`fΆfDQ5x%YK7]b~ۿX@w_GƆ&a!z:>鏻hXzli*jϫF#\{<؋Bz^Bp6jÃlʫAlTf};E;Uj~vצt8$nrpGg ثHJ?3q񘻙hqDD&:U.#m0I5LY#v Ql؆5Pf1_r}3za%GFĊ$H58>>D-ZA"ч EWϘС$!Gĩ93zab_MA <GkIuNID"R2Iti_4d9G3y餲M,'&8imsԥ${KD0|%G=DԜ{J0pM% T@,I3zG86ANq0ݧ6lBc561OK%D%E B9%g83ᄖF9fe_&*U碌)x v<|%@n-;mA-7PWirWkԢg!(#oƷ-םJt8jvoX'Whλj7}o=|{.0wf+A:˓!S0ad[Y|0PM8]eS+U0?ո {TUQ* ϣ);C|;6K8tMp{$̗sF6| d^˅GZ3^S{2; W("ym!*LV~HIX9dǵYjN 9!sՏ:*>SYn 0gu>5 1L7|Qtw\MW\+>{oW@z'2Ǖȁߧ c|H~hˌuʋF9ޒ-$nߔAa3ە#ߡ3xIRzzyUtO:P0cP& -uifu^0$)>'+^%F{[갡f)S|K]lkqG9a~vwG*Caֳ?J 꽤=R+Z %&| kf xencB }{C1V^_O!Z}]4)Y:5TP)ҭ}͎l:vhAf^A b|\"QWdy|ʌLClН84LẓoEVcτeq|DK!xNh_y|O#'7s%ᓌxYytG'CI̾=Ѵwf1!էK,Cg8v{xyO|zߘ2 h۵Lgh3 gT92n/Ȧ,1foZ|- -#EL0D]gH`qy38!Яm _unO-B&2oJ:° =r+|QPf;Z&]vFX$K`&d|%(J:e+ݢ/p_Skm~]#EoE\,17]CasXocSMp2 U $Oso˒& E"_jeɍs#y0*[ʯ\t'#_](3Eu G71C2Ssv9[6; ̾<g¢M\fx_FL`i%iS!v)DOAMr5o(A'aQTg/OR0|p{@\DM{[E*>tp*=˫wyS/. `wמojr؏nU'Z~*!dIGxPPQ6ߑ F -|_~:s4T]%^L?Fp ξNNBсŠxޥ@Tix2't1~CG[9S=Hxy2d8b0QV}^n$/SDwfi28GzqoT'n9yп)R  }5}T4KVB q5<] -Ď!O5ĵ踯4(,*TF,jXqj=uOnXz' - 4S ΆL̬*p;-) -djUQ3)5W酜LMFhF!]zD4!@-jb)=ߖaBrǨ0SJ4sTY))HIuAVxc2kSP?y  Ty#Sx~ҝgvȏ r=?uu6"H -CEcӐAһFHkְxa -l?Wx_LW]t K,Zp1*ZM: -1x^#jQd`'1j]!Yô1~eD 2#07ܻFQg80i&yӁ3h"Gt% -8N5 -^i͜ P -mSU<ÀכO(ÁaYvqAES%GѪWBDWH=*R+%$^4tU)$].%2J4tFTl?]#N}kĹ^UB:hxDWP1Ѻ},M *P1p=3OW|u>&i3j %p:_{VNywl6r*E)L)5 ݁>f - )`vr`]H L nvK"Nb.02sNWr[LQ{FtggƼ -ص0Á4!@Y5b-Jܡ9e=*<(;k&lBf#݇T & -tBTkk1!F%0X][VkӜLO]t ;&c`]Id3`~(]v&LV~Y\t0]KD!OJӺ/s.-{u7*ֵ6㗮)]bg3V {F]k]Tsˠr{b1Y.I2xzՌy-! k@ڮphQcm{lPb$)Z᎝cWbh<,!sAVFԢ|%e={ikHJ{^t 4T"롣/Wr9Kn^p'vPK} );\|e44>h6rDZW -m7Mp:5xY )\het[#7z7`3-6p -/Mܚ>Sv=4>F5֖ZEIU"t$Yp?yػ -ek|ex?pȒ~/UsS*]bD|w޳ddub#gj2V°-M'O [ӍaU8T' ]' Ku=]&'ю*Fw -8\ַE)}U9 h*\Q/*<+j<4|Q$4ܗ==7>!Yg#ql%bJVF%hP>%*ov L6z!LE"eo}8M΍Uuܶ[ʂT>hN -~\`@jّP _}b| __|~ݼ~t?/|AW5/m??φhbi߃_B {.vx,!RFBE0'aR&a*Ec?/M(~(8Hu6>\Zic uA:2<4_ 〉QڅuҰn4tJ5:KȰvຕ;T7PA?x]^FNVYS65~?ݰgbHdb٢0\^cןX,#r/jJ^RR4?u,T)8VZh U oAvMcwHEaOВ< Op8}~Ij|KNd)a/5QC1EAYɏ>99uIeuD ;:ͩH7vƱHJ.!b7>OɚNƤ8ᤘdlq”l*}x@<6{(ك}>&D'osQ_`FW1!Fi+@Q%pթ5g$ˎ)"rhD+5yz2X>OFf؍&P !X$aHb0t05<t7#T XCh<3H{f@&A׌km%RjCDzQ#i+/bneڦz\?{' \20PvJV7ӳ6o,:vE:^ɓ^AKE}H]b3o!B' -Ig{(Ecң"R5e2MS$>Բ[)Fӳ 9vt`}`OHCVL E ձt%{rttJrG\k* -`QVe^IlS#g5S)T]a;N}aTUv]²Z)񀪲-E|. :g1: N6yDgwGE0:5ˈN& 0:?k.?Q=l38viV'kV țANQs˲&uc6 7^e"΍ոBv5$$D`ՃZ NPJ\ڀ7l3|xh\}lXvx#$󈖽#͵r76RX mL9JFQް3:@!oUvN9M}_q[- |Xa¤Vx%-mCZ<;_Š)bu8ʟ%] RRMH٪:zZ̤0(ov{ǑG@MH:#plύ х es|I^1܅*, ,O8.Yx$D|Ҵ2H|ھr$nݔ7rO:vR w4])7~sm( 6!"sCZHOX"}zLF80F#5Zwpn1)αlS3[]W6r@uid uI{d7:Ih_ߑ ;G#\!9{v -eաCGB}f8aSP *enl|#3e4Q  ʆ'Z9nOCl<aWGBW zAHFBh8KV3Vj)حXkFbG n̛VjLCNHpIRyI2^|$mu<- ,eؙ]$Sm=cCVUndO {)Tpm- =Q]ʃn-hbN%5O{&kLafS8-ie?} -Y=nGSy+^2bFt6D\p< {ēÁ+"64b1p$%;qxjp+ap n|IGfEՔ -Bw]Uh '1Qjč0xpTt ^:Fl4;3#|KjC]G.qŢc&©i-x8nFDk*{C 8*;6&p*/,(ٳ^Jl6Id*lcrFMJָ(!׉)A푥 Gvp0nIVwa,1$Ds:IYrxձÑwC-FAS)3t+T\yN!<ŖcX3o ;IptMpDLDUk\F3XO˰qޢ'oK5 rEI)cfG cֈ~byʹ׍=[Ȍ ->i.c7]+4ł]װhk [Ƕ,HCrmzP 5W3I/1MM' Acx"Lr8WJ<bBFlzPuחaPF$6xUxdήMNbn{U/eeUw+S!%P4_P$;囹Ј"m&]吝WSJ'>BgՈ\OI7Hj=6nTӑdQ@FtKZ\B2]IKW3rNjwz?[ cT;[7%M2+Y7N*m~ԯ,M:hǕ:l(SVj X*+AӺ:W8,)JQk4"5&rǖ> }%@> -,}51UpχgYk -S1=%ev2n(&6rw=T:" -3Vp$p}p!b`|y^yI4zԯ?. SE01[٠h)'yᢚcu:)"PkRWXh`NV%x0sA7k _M=qw`2k[5m;b<gh)eyOLZ{|wePnz>$}TT&ȷY5ct ƗpL#,,M=kj.B=hpk"@ k#UϼO4Z/$bq[] dֈmxno3"aLOB[uf=>72cZ[~Ī&Z -=2xOuopZK?_c9pX#hb8j`G>!ֶ#& {Yu -sr* jEl9t]%;[v)٥4+{J)xX0_LRAw;4*w)j~)"LB<9u{A:RApߦcVF#cJ˖|DgHe3d 9 ۭQB~w?ؕ]>mi ;6g?}{Xp=eўYF(NK]{;BO@ 7sݝUl$g`#f)Hmj6c7=r@pڀ=B]. tKPq;I~DyDq&wJ;,o)NjҚ unv}\x_#?HiؑZH0s%xZ|^#^zIqG ݲ;t7;̾25՝.m*FtI=ovyM5w֧]"^$S<P_,``OdM֙2)Z_)~dc_z8MҏP!kg\߭@&s9*vw=K𻚒 ij T>Q5x" hm#FJ= f9 -`G+ ļ -@G#\ʺi 2ZL-ıG `}# ֔>C `Gy70M1zJsUuQbVi˂]V"S5e]ix; p^ב"cIp HA}gk1 -opyj%: '0׶dД -R!`>V,4 XGjѨ#jaNbz-GZ -%e9:ؖFN } uUMAU<&p4k" wlf4#0HC"kx;X-|\!MӗU|4嵀 -&XOk<%@8rrDt"+iA2S! 8lK}udkWoTBO!Zőzʓ C6=nȚ5eo$DUk<(2kks.qeAS|d֧ ,DsՈ~Xoz:(tB8MJyGߚ2ȑ]{e⼣m,Hrm`ݭ+l_mЌXMv6MRDe:Hl(ؓ -u۫h]#&^|j_n.,A DVBJ@q/N?iI<wMS/5GQEb*eMO[N YN|9$Ϊ)Noz26mp$#%Ⱥp"$mU#ԅd5Nfl6zvpҥ-*ǨvoK &dhWbnT(5)ͩ_oY7Vu$+unQUW uu`yfIWB|&p,-Y2Sƕߣh(E^k6M8-}$@$7e*<`J/#,!A& AH:/ҩ^ #Tҧx4 -G$9od1F̜27KҎvl7nИi#wTKLU(UXV6ڙ9"ѣ1/XCb|$ -=3+O涋E3CJ[dvt"Ff,_M rR"O; "NѫM3٪)ME%$ߙ83 oPڪ\бKiTO '˪}AF0b=S+ֶc -cH5ԚhDJ35`zA55 ͻa˿]#\ *F$TS^-fӍ^@OcDQ,؟L`nѰ+!?t LtS6AY5##HљFX/7a.|i{{9(p rH>. -{=x7>Z6NkuH:$F4l@<wӼ[۴}ЈylODGz}d)mm-O*Uђhg`{ze #?:=NֱsI ϱ?h,@lBO>EpHGI(zhCu -=x* ' -v'JvB4उ6=Ed_LR4};4BSuZSA=IH3)Ha҆(@IH(ٚM[7 "i"$M$PUSiBB?C}g=ͩǟOXl?6OO0 i!i_~Ǔ2rן_@ -C~~$ʮGtu桷!ߚ\oHD'}Qj֧[߫斿g;n^y˚OVxVi: C$#B!ɻ~i\s!\ NA%@TU#iS"4 c5HYlMȟ\nmj!O VyLSE$aUḢjW&ZCXvzr:|Svv~k2'3^l;wؓߞ/~v~`Ylx8<ʱH$9z 6+*K]yx C!O634%Azǚay>_~DI@HIa-Y3 -qkzD /ɳf^{JjE '3kRb'y7Rb9_r#x~8y7[ө$P=⵩`s{I ;P}dfl1x #Dϱm K鐝;9 L֠?_ZsI"9 1|)M3IЈrhgVl @n`(/cD-^ w;t$\~"68MqeM{&Q>謏Zt,j4wMРrus_ JH v1 şPaO - KfIIC;^I \$Y[)8ZOnxd j$M"u}t g9p^SТg:m[S-HAw#A[8p$B<Ǟعţ# ]d gU67(b >T[pL't08V - 8Ͼ[gl)<8d]e g8e4P)G GP= 8"@6qy&VSHYra+kG,- -vu'|M{>HT)8qlp߬جtџ͹5=R/qB#FVGд@:7|\F ɑB@c-2ԭo^kl3NcLte4:(Yv}XvMN Mfvt0NtxMh˱8֔ŪFhf셼d xy# 0iFA0)Ү78Z^AɦĘ5jR488I1h!ǎrx\{b2sM7Ǹp?!7vx[3FX{9p`(c;mEl٣iZQ, < -XL!.bhD=8qR\leVt#rj<嘫fԈnD)>A㗃4h$QH]490I4w1y8B*l}#CV@۾,ftSg?9R/^[FԒ}׌ѥAӀ޲NM3)S "rL eeR1uF7p7v^ZEvSBDCJn}#ZJ7SBSʹ6 GiԍkUǕL8`˖9tX+Gwx$lz+]LoLWM$ )3-#g ,rMH7xCS]DOoT(.7 gK8<ݶ~g@p&x2jfki&>byGژbk\n:b&>STwpo<r't"$2mynMR۱/W=ouGIM^+ĭ* 6E4.G bpy$̈́4dr`;J2Vr4UgH9UDjz8ES,2dթHLIL'*cJ!MΓlo.Z-x1o TV%]zqRᨾfc#M$ ':~ELVx{Qܶߟ'*>ESR߹2J?}߿(eU'=?_B ߨZK>gY?왕7*mP2WI?,U98>P9Ѯh[mC }=kwczOw|T B+&E?E*KQl1|O1 0lϯׯ}fGL>m[X=2ݏ&E,-^8P+Gȇp8~y "kOcEuq zkcCGe-ZϮ[: Jetxp)vsLͮ2;8pdh(sg)H{_)Ng/@ɝU s -ZGyx@Wx|+yf}^&3S~Q&݌q>˼F>}}Q.$Zao~2Ӟl״kspq5/3Z)ffaڨc8QeC໖SUb2X8Ç8NBui) S4%t+GrW2$X:j -׶I)9mv\Q*+B'l44#zQtԷscx=&On|h[~x)M!PN 'm餟)v!`4OyCVt$i=h3eKߴa!;U]fn?$4iBGaOƶZ -]#&k/BFW`M!;su>q* wKtcG:FeOꜘ71x`IÎv$WZY[`㓟+ pnn6L6̮L.MJ&K9AruٺPWu^ɩ`o1b;l  $㴥$W 2minˁq4IӳnxyԼ$b+='ENfrSUztM#I'E}mrӂe ޏk(M -*pcc= C` -\y<RCVg]=Sֆ8 -_ Rm!0=`Tvl _|%1pu5kϘ6P)l2MVmfq8Zq`cz \Ք#L+k$G,-6 ut 4E1SC59U -މScfzXӉ#GN@Z!pFDV`iŘ@VY7<\PD–ZZ^%V Z67sL};VM4̲S7£02oa o͉\ZPN30Μ#so$mF|4h)">}Z6:ޘp2yF4t. xNќ+p[L}Xuch}T/%K;R3*0ިV/kyw%^ L=XJ=)pH65ޮW6QUw5ÁrAy@+ӘM|$MBmS.n~Ct( -v$%iI8DU`Y_kOJfi|SzcgP^ -U߼#m6sO3"=XkTc{\cE,4`Q* >oaKk>Q>)MZZ2+ZQ`9<+&j`vW\5=ԃ_ rOM(Ѳt#vɀsnCI֐ o_1Cd+W ZtՍ/luJ@%BaNMw]9 h?ia-vzYM*fѡtf&\Wst7F% ,j۩2bg }ɭ[xRifw•6?4bMJ8|dR`|XvqK2$bUQMӻ.'ިP]n$ϖ.PIeZ=rc_4p{A;2V>[%U6l4Vi\6-6lI i -`-JcWwPdhw϶r2 ,pNYfSeLǫSn=O4T0I$C^' \ 77ZbP`7J 5>7?Q}'FH Ou: -m1@M?OT}jW!~seV!7v>}5uQVc ʪ?Ւ+˭潊lg[B dOII8I %;pUozJ gV\gT el=L "?X=Bh ڒyrc߁zY^T'H]fa]) -ҽh)Lx8PBƼtAh)A+""=2C>|{C,tݸP$A 2 Mek(k%D^ ?'FXu]AgOp]/v~WGf3H$YlvIA1n>= %a u *`ӠF'f )_؀\1o/F1ٟ\Cpi0z4K﹄`,{.>?gXbK:Xs>``g=V7F:4? rD{ӯ·UC-B͍GrmvEs#R^L'ufJaP," 3gYVeD Q.`˃B-r>5-يP<r%i6];~`+zޕ qB^C?{q`K>!ͧ_t̎^ = #XrCvgpC+#YsgDX*ۘG>LOfLi'NҬ+_ޕ|-ΔtO(O 0ق]tog&7JC|Lw{XA7\{(-,=dM&7XR!Mk65X٣܅^Pn\6tT9m Ya)GK.R;uTp퐵,dHpr~.(\{UߍkV4ĖΓ'%e;7Xг]"~.-j9ž{ -g ||~'Gģ : 뇺f>cTU'LVaYQeIo8u|z c9|{ߔf q[6˘QS˯y8h ߦ1Ƨö4Nmg/}l¸Xt,0w|"1m g.x<_\),#.]-E_)Vx%s+34$ -w#, xI, 4$%qb(i{kH[a$Yӏynm%r®Xw񅅻\^8ZB.g@c0")ϸS3NSg2ԁG˙"Y 8amXrqR@1K8?7ÛoKLUL]f8COHu*mȪ'!XvW*9Q_}HQc}7C!}^lA^);=e -N B 98(\e@fq^jE㡪"lIa;SyXVocThl)ξ&81R&=KM FV!e"1,`C:HY -\o085X]wH rX +hL5eEXfY5 QB܇<0+mL -ёI=V\ c2h2r1*zJ8&'+V̳XsC"*ɕ,:E^f182_F2"YwR J.ws@$zoCƘL.R翸=>}L2m']%IGo6Xqw/QN:DKL <&pDN1/ !}@rw9N LؕXkx(NYT|ݤ5O=u ^otJs?|ԝ6-8kX9P-}}'+vG WWM_|#%ssS -~K]ZIJ4Nd/}m59e8ib3T,L -6?wKxX -L>._ͶέBҠ4<`W "KM!Jߐb+}0GUa=0xT% iw -Dt~փg Jf7zh(%kCkl[vtSVxTûnpއ 6Pep/rҨؾӪe*(z O7lXh <f =lX5Gt㚢"P`:< NcCe]15{yC,"k{XVmɆQoH†zd4vGּհrnޫ0Yjօl5GmzhjT j+ c{@╹|Q4S؍ݗ+89_L{*>wY$Q0sb0`=k&&)iHJoM_r.yȣ=ioӆqduyDNVk;Yvv Vź[/,ryv|S΀t+x6")xR3nSfe3EӍͩ1 rrR%cGn7rx3R,bmz%Gϡ6ܩ:.@X_6 |x;?G%MđCFjr!`=s؂3*0%,Fka|XLU[Ce9ʋYaanAΗ1n9r]6"WfQs7S0d fo#-9]4LKxVn.GտvEwVXqUjqs71qa۬isƌn6X7uy .;xUtÒ*tY>,:! }NH<S#1W83'C#a.o_a>rK.*GaMg{?J9xLB;0JF=|+jX}* e -7C!\zezx)%S, -]m@*'6+TQ?T(b$[4+ZD-.`^yC2'SB*&~d'ع[zlX~|(AD`\Y#J߯I3K5qpVb%7ṫO+!TM]kSˡڷ -j_oϯ}BPПȰ_1n5]U3?HKTⴴٙB+t -' -I@Y]X&R)Ho )qOK!Ҁ{c{!&ץ-b)p%vC JY"_mdmvNJAe xnGѽR@8-xT@ӒxfCpn^ -7 tT`4&[pu<"6TL=̅aMe[$ -|wMf.M@cQCokP+6>Uۢ+po -+t8@\모Fif-$TxVd=8 - #Z]7O>kd*VBN - y+{nŘQ zĩs=e(Ƕ#A1V sݴ'^~v,k‡g s(xrQr̃p_²ĦOͥ^Ň'(VL] pc +LK, 0mf~o;R`IuB?CSһ2(.)SS?[®E%z)|6R[_bxbw^ؾfJ|iyZd^΄]jsޖ!qIu~C%:~P/ oTK |;Ù4iWsMeΰ%.qx>ڛrN73_4¤Km%B~Fƛ i&+!S;j!H0+&1s;tZt^1osVirR0m7WBa}U`9Vd+kJN"k]׬=WQe^᱊*#5(Q(L=s,L;- -x 7t%w@GG+0GMO= y( :@. z>-݅;&C ͸z^R?V=&jx=h@B-54,@a@ -\iRVihϳ: n-<mkCu1'Y|mkW4 - sXj&Jt2Ws,.6qEF8_n~Vz --4A;Z (MuT"a0-*EtCuH\-eܑΝ=J$fZyhw=,P4yG7yq0XGOg۬cL Ӄ wyeSyt=lᅸ,b]aER ϷK;x -~{WuL䎦>kGz -ڡ{jz:w^r/g7QGl.5gVkiuO'&ݟXU1ƗI*1_~G*&j%?)XiN.8>.v4!ڕj/Denix- &E P)5Na'bG ly#5ɏm9`zMӔB;09YjK7_8ÚZTQcBPt`Ш5ʝctaqt5b0XNSb394ZI 3kI;,KȘXIf%[IlbJnNϯ߿ڷ~?9x?5Kq*e^^!&g1zzGP(c7W|NRƇXP'|z5(xNꗟ\l_2HI?8}XOMD;PД PQ!ߔE j 8s:@)75_:a ̄RG,6a ;\aD^aXdU]V%;b^`ˡE&C>AG`[L.̑}tB߆ iЄ0!y$)Lٽb,4Ű弻HWe6.<I>):yևjW+|9&|K%{ú]د{1IyTǼ;z)\584 ;̷ ܳw 6_ վy92 -~QkY}T^Te}Ґ]v|p-j?z/n9Qp<8\DMbC򀃗y$NOo1?\Ti%XUx?At7nH'"2) -oCCfx,1dIu# =X̮UE=1N I[ĮI+EZv~HĮ3)6vzC3=ysS.v9 !qUIu6LwyRJqTwygヵw/{p;>xֿ]~D;i ɾ*"'J7KM {&3;ss-vIo -wU69Ѕi;+M؇ݑ EzyY10iX{WU筛<]~x|V&+0޾*0qf3W k 6ܮy) ?_Yuj -ǪV9>Ze3 _ w༢kH]eAOQc It0Q}\s~K~y-%9zw?U(R~L?ʛ(֜z=NIv -wK'Kq56wrbYV!RG z+(؇t0wAhB%_sB$ڝ(j#KV5Q0VGdhK/ |`lY^ry{JYjFH5%*Wlncڐ] jti.i8<5ELh3L器VeɻGa`_^ cueZ3]PtoSoǶ5hG3u4tw!g8hC-E,>צb"tccwQ,+`%ѳ̉~@G-ϳ$C^PUܼŏY:zeftoY8qOL-Ҿ3Vb#tv֟}lqKlF>PJx>/ -vFiskh~{A:aO䊦 -_aQYov(M5]^CF/og5R+TM\`F8&ee-KL "OtMLx@e $_|F1Am_稽 -D'S=Å?lO]uv RKtK©HQ$Gq@վ lbܪ-RV䠸9y8WQQM)-(rsr˚YͱaiS^ skIR'QoG2]6-cKշS:?r.Bt&\?qɷՐQ1YS%ݡgZylVu HȘb9[ `hO?㿟!VNo"GGT3>ME4 w9-^ Hv;{G ;#oaaK G~Ox #]c?Rw3Mpŭ._^6.6Bz۝,sD%Hu&2C|A"jj;!=EJ n?9<5B=ټS+yo|;>;ҧ9m= ':J5="H9EoZd/wPQv{q^ -ohSauqo$":ph+Ƿp#,܈$ȕ[>'$t^ bwaϩ^{2ɚL?7iZj9t;CFRo+!cG1{=mI| XW-B?*+mH𴏸8w.ot[𤚕mYnxCh͡'BjjҼU!D8@k:ZC JLHfȚ"ɫO"ݲ9JGQb^&)Y2 D[hrslh E.h['{t홬3"_T/6 ,:&4`h CKWJИM<,atMh׋e܊{ =rU^t_Pm|0G4\Rr:ܲpF:w@g0+ںӝ1P*0Pe@F Mkrࣜ`DߓInC]:P1>T]e/G0) XQCo@zm>)\4R>g9IlA2nD5K!ST2HnU@1$œ+M.poz}l?/Jہ5G"ྋ38!)98ThЄ(Os>Uch3iĶFCM "V[2i]ߛ{1fh.WCK/|o1LĔFS-X>&$=”ⲇi3ir 6c2r^J*gC=[ܣ0 f^t_Lo]*ÇJYm`xNmF cՃ@A0HC}pn]`cԃ;ék)Þ6h7Ž. `YSz pEhM#\rum<8ߏed dOO>W˶DT3:T={6:]ra)pQ`o]\8:㊞:r0oAj/̷ =@X8JbQܞ^wv{wEjbFmK] i:-"~o.`">D?{g F]+=/cU2ԁUz0^',Մ , Nho7LT\5BD PWx;M}g9S)i܆`K"w߂tA,,;aAZ)>kKA[HC~Sj!ߦEJsl:Dս4y:z箒I-iN7PU3uތǰZVZh40RW4Y%W3lOi׆K:6M4Y:<5~.Խ"Se#׋닯Ohx*X^ma$S="NSdVng ԇ{QUV gH+Xum"3D2zT -kIw㕑P 6O81VSBQSs(gC*DAB4 KVnθ.2Lg~5;*x#~Q!>OJJ0(SJ4ӂ֎ Cbbw+ISF34_5a _ueb[E(¨3ª {@,s]mKX*g*\&M,_)V%쨰pI -RtyRB;_΄1;{ѭ-P ne -uɉcJP`N3 ~O@PԙගIPϿ~OՃASb5?\2/]Gܠnr7y)\yҥF/ȵ>k;7_fږHj%:οE%=,68Q.kM>T?oB"^e(4V<ӨGOwn8m v'} ݩaZ~} ~ȶEv;ǯJ¤ƣD=vMR_8%W"TDy(94 abAI^719d`hAgsf,nb|ČXG5B<b=ƖOS8 s3 4Litف4eڇ-{hNUl g(R%pz$p*fg_#MЖ lAUn'q6t#Yamډw%"|ZᖈTfRH5#FaA ݇hN8ڱ_(]V|{>G腵{#j[Y>Da9}d -++?i{!b ?^-'XxD -L޴;i)&ܖ:MYmf維 B$]#ٲ19A`$=x\D}i;~jV. {>^ƪPY$|p- iaVIѽO`Y AX"}>n3K2aM9u7zʊx;dYrS DmuڴY[.@ȥ޼d$İLGPNy9Z9!I$2OL^O<}9h9L (Tx>ۚ`w-ЇZ=goܻhTn';&XC*)0AB6z"7`jcS>P1yko .̤CPLMD3,8>%\Q!xH ꋷw5(USrMc{Bk#Y*1bm55$`#%6/jq,OQ^TEvF7s;b'ɞAB+ŤђL/+%,S1myI+D95uݺ)CٕЋb-\ S.CD.fSF!jDfndwIswL'ScUX#ɂS J)Pi_Iفr .7nC -H5P4=ٱ SAO[T׶_Kr(H1TC ˡ,ľˑyNWʩRuVPxJ4 1J&M9 >h,4ԯ(#=[/i;&fH6(["&$v$x0@ݗl8U^qP-> ("crC㮊A21[h[w%&^kE`8Pި3,y@ZSphmFLU94E -,#~(:xOaPN5+L X[6B^v# i=14 l-j_lq!bY {iz76fGW-ya/T<(! -1*Uzu:%)HaNC AFAJc>h{*{Kp+Iǁql2/j&VD$&m5M`R֨7h lJh'Gӟg 4 e@ʤֿ?RM7-dUS)Vh`Lg5Аli)^ J8[hߩÏXϣvh\ïMt_wcS**1A&-X;XI -w@Y6bHGk-XX6,ƙSQ!zaL[h6gxO4(ev \ FX;uE LD$LǵZ!$|~_0]Dnى%HT{U]D bc,+n9LXQM`'nzet2@rbHN~T=H!JEL?Ty .'=H"SJ񄋅Ī&X pM -R;b]¯k'Kalnc99(b_QŦ;X{ɩn2nOS F1$}Rܲվ)JĤok9p jx. %P6@a E-#*%`E+,Q!_/`°ozjmxsH]̧ |]h4r -EY ։ HQ{o3"Yא4i%㹩Lɏ Eډ;D4R?JLxzX<4k 0ƅct"xSN \TcfaysA:7|Ȕe҉gabSN4D&HDk҉Zeb։DJ̘F$ -0 -1DupLHDbǬ ڬ>D(u@:8^2>&P&Z'DЎ_^?` aֹ0}vAL;[ έyӼs+n޹wb޹f޹j޹7s[üs'xvyyOm`m ;&;$&;E&;f"̡N玺b炅碉⑉ià:\5\<6\6\D7\7\F0\0\N1\ 1^3-R,) *?GNED6jӇh oDZ@HT3N޺1O n$G1XrCK"Qbp&syi..މCht̮5[A)8ҐMy!Qt!b؁Ou⹅9U'.n g4$-2Q鼲A yኑH H \!؟#ts"q Sֈ۷in)ge+O& /w3Z* $ZF['<{T$rO1@S 2ނfOJNOHskFyH x񙳴@hh5/]HA~ -4H|1 @\;"9} IQ},)F)p 93tNH1k1`>a!J :36߀y?+X=S5VO|ss{lB%+WvT%ϡ$^I\4G5l$uIu+o=+~7 sZc6ƻj+WT~֐;<c5L(g %-C8ESiB؆1c}.)%[ &V](m~iҬ#|us6L!22 9ȂB# >Gn J}K[?9V)15r>-igǶw` }h/1ƸZπP{}(8:[+ -M ;vAHЗS-'~ Z9CBx x/ki\aJ2+]IPߛO1+A t0_8W .9۷jhpYdXp2YgW> ۅ_WINb+6|z ϗLͷ43i>eĊ_n\S+i1i TQkcԔ&|PC&*fFed U%n@h:TqW_l@pR 5884_ICAGl@HJ=&WM k 2\ըPB ׷'3j+xQo1j;P&bb͚&6̬-5kΞ5q(FMQj5FM$QeD5'AE_&2ܬ0kH (u&D5QbMX.ք5bMxXf#ք5aWbMX'؄# -6aMxhs:˕m.&m 6CE Dٴy߿~ן I endstream endobj 11 0 obj <>stream -8;S=C0`_7S%"\noO8`:`1K?(.gkjkgO>Z(g[7.,"GQA!K)E&9'~> endstream endobj 12 0 obj [/Indexed/DeviceRGB 255 13 0 R] endobj 13 0 obj <>stream -8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 -b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` -E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn -6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( -l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 5 0 obj <> endobj 14 0 obj [/View/Design] endobj 15 0 obj <>>> endobj 10 0 obj <> endobj 9 0 obj <> endobj 16 0 obj <> endobj 17 0 obj <>stream -%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 17.0 %%AI8_CreatorVersion: 19.0.0 %%For: (Graphics) () %%Title: (黑鱼白底.ai) %%CreationDate: 2018/7/17 下午6:09 %%Canvassize: 16383 %%BoundingBox: 512 14 580 82 %%HiResBoundingBox: 512.519474100296 14.5993985160931 579.268412090863 81.3483365066604 %%DocumentProcessColors: Black %AI5_FileFormat 13.0 %AI12_BuildNumber: 44 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%CMYKProcessColor: 1 1 1 1 ([套版色]) %AI3_Cropmarks: 516.333333333334 18 572.666666666666 75.3333333333339 %AI3_TemplateBox: 297.5 420.5 297.5 420.5 %AI3_TileBox: 265 -333.333333333332 824 449.666666666667 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 6 %AI9_ColorModel: 2 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI17_Begin_Content_if_version_gt:17 1 %AI9_OpenToView: 504 120 6 1448 814 26 0 0 67 38 0 0 0 1 1 0 1 1 0 1 %AI17_Alternate_Content %AI9_OpenToView: 504 120 6 1448 814 26 0 0 67 38 0 0 0 1 1 0 1 1 0 1 %AI17_End_Versioned_Content %AI5_OpenViewLayers: 7 %%PageOrigin:0 0 %AI7_GridSettings: 72 8 72 8 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 18 0 obj <>stream -%%BoundingBox: 512 14 580 82 %%HiResBoundingBox: 512.519474100296 14.5993985160931 579.268412090863 81.3483365066604 %AI7_Thumbnail: 128 128 8 %%BeginData: 17418 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDD6FF7D7D527D527D %527D7DA8A8FD74FFA827F8272027F8272027F8272052527DA8FD6FFF7DF8 %26F827F826F827F826F827F826F827F8527DFD6CFF272720272027202720 %272027202720272027202720527DFD6AFF7D52F827F826F827F826F827F8 %26F827F826F827F826207DA8FD69FFA852272027F8272027F8272027F827 %2027F8272027F82752FD52FF7D27F82727527DA8A8FD0FFFA87D2726F827 %F826F827F826F827F826F827F826F827F87DA8FD4EFF5227202720272027 %2027277D7DFD0FFF7D4B2027202720272027202720272027202720272027 %7DFD3DFF52A8FD0CFF7DF826F827F826F827F826F827F826F82752A8A8FD %0CFFA82726F827F826F827F826F827F826F827F827F82727A8FD3AFF7D20 %27A8FD09FFA852F8272027F8272027F8272027F8272027F827202752A8FD %0CFF7D27F8272027F8272027F8272027F8272027F827207DFD38FF52F827 %F827A8FD07FF7D27F826F827F826F827F826F827F826F827F826F827F826 %F8277DA8FD0AFFA852F827F826F827F826F827F826F827F826F827F852A8 %FD35FF7D20272027207DFD06FF5227202720272027202720272027202720 %2720272027202720272027207DA8FD0BFF27272027202720272027202720 %27202720272052A8FD33FFA8F826F827F852FD06FF5226F827F826F827F8 %26F827F826F827F826F827F826F827F826F827F826F82727A8FD0AFF7D26 %F827F826F827F826F827F826F827F827F827A8FD32FFF8272027F852FD06 %FFA8272027F8272027F8272027F8272027F8272027F8272027F8272027F8 %272027F82720527DFD09FFA852F8272027F8272027F8272027F8272027F8 %27A8FD30FF2726F827F827A8FD06FFA8F827F826F827F826F827F826F827 %F826F827F826F827F826F827F826F827F826F827F82627A8FD09FF7DF827 %F826F827F826F827F826F827F826F8277DFD2EFF522720272027A8FD07FF %A82720272027202720272027202720272027202720272027202720272027 %2027202720272027207DA8FD09FF27272027202720272027202720272027 %20277DFD2CFF7D27F826F8277DFD09FFF827F826F827F826F827F826F827 %F826F827F826F827F826F827F826F827F826F827F826F827F8267DFD09FF %5226F827F826F827F826F827F826F827F826A8FD2BFF27F827202752FD0A %FF27F8272027F8272027F8272027F8272027F8272027F8272027F8272027 %F8272027F8272027F827202727FD09FF7D27F8272027F8272027F8272027 %F8272027A8FD29FF7DF826F82727FD0BFF2026F827F826F827F826F827F8 %26F827F826F827F826F827F826F827F826F827F826F827F826F827F826F8 %7DFD08FF7D26F827F826F827F826F827F826F827F827A8FD27FFA9202720 %2720A8FD0BFF272027202720272027202720272027202720272027202720 %272027202720272027202720272027202720272052A8FD07FFA827202720 %27202720272027202720272052FD27FF2727F826F87DFD0CFF2727275227 %27F827F826F827F826F827F826F827F826F827F826F827F826F827F826F8 %27F826F827F826F827F8277DFD07FFA827F826F827F826F827F826F827F8 %26F87DFD25FF7D27F8272027FD13FFA8A8A87D7D27272027F8272027F827 %2027F8272027F8272027F8272027F8272027F8272027F82720277DFD07FF %A8522027F8272027F8272027F8272027F8FD24FFA827F826F8277DFD19FF %A8A87D522627F826F827F826F827F826F827F826F827F826F827F826F827 %F826F827F82652FD07FFA852F826F827F826F827F826F827F82627FD23FF %A82027202752FD1FFFA87D27272027202720272027202720272027202720 %272027202720272027202727FD08FF522027202720272027202720272027 %7DFD22FF2727F826F8A8FD22FFA87D2726F827F826F827F826F827F826F8 %27F826F827F826F827F826F82720A8FD07FF27F827F826F827F826F827F8 %26F827A8FD20FFA827F8272052FD26FFA852F8272027F8272027F8272027 %F8272027F8272027F8272027F82720A8FD07FF27F8272027F8272027F827 %2027F87DFD20FF52F826F827A8FD0DFFA8A87EA87D7D7DA8A8FD12FFA852 %27F826F827F826F827F826F827F826F827F826F827F826F827F8A8FD06FF %A827F827F826F827F826F827F826F8A8FD1FFF2027202727FD0BFFA87D52 %2720272027202720272752527D7DA8FD0EFFA87D20272027202720272027 %202720272027202720272027202720A9FD06FFA827202720272027202720 %27202752FD1EFF5227F826F8A8FD09FFA85227F826F827F826F827F826F8 %27F826F827F82752A8A8FD0CFFA82727F827F827F826F827F826F827F826 %F827F826F827F826F8A8FD06FF7D27F826F827F826F827F826F827A8FD1D %FF27F8272027AFFD07FFA87D2027F8272027F8272027F8272027F8272027 %F8272027F827277DA8FD0BFF7D272027F8272027F8272027F8272027F827 %2027F8272027F8FD07FF7D272027F8272027F8272027F87DFD1CFFA8F826 %F82752FD07FFA827F827F826F827F826F827F826F827F826F827F826F827 %F826F827F82627A8FD0AFFA852F826F827F826F827F826F827F826F827F8 %26F827F826F8FD07FF5227F826F827F826F827F826F8FD1CFF7D27202720 %A8FD06FF7D27202720272027202720272027202720272027202720272027 %202720272027204B7DFD0AFFA82727202720272027202720272027202720 %272027202727FD07FF2727202720272027202720277DFD1BFF27F826F827 %FD06FF7D27F827F827F826F827F826F827F826F827F826F827F826F827F8 %26F827F826F827F826277DFD0AFF4B27F827F827F826F827F826F827F826 %F827F826F82752FD06FFA8F826F827F826F827F826F852FD1AFFA8F82720 %2752FD05FFA827F8272027F8272027F8272027F8272027F8272027F82720 %27F8272027F8272027F8272027F8277DFD09FF7D272027F8272027F82720 %27F8272027F8272027F8277DFD06FF7D2027F8272027F8272027F8FD1AFF %7D26F827F8A8FD04FFA827F826F827F826F827F826F827F826F827F826F8 %27F826F827F826F827F826F827F826F827F826F82727A8FD08FF7D27F826 %F827F826F827F826F827F826F827F826F8277DFD06FF52F826F827F826F8 %27F8267DFD19FF5220272027A8FD04FF7D20272027202720272027202720 %272027202720272027202720272027202720272027202720272027202720 %7DFD08FFA8272027202720272027202720272027202720272027A8FD05FF %A8272027202720272027207DFD19FF2726F82727FD04FFA8F827F826F827 %F826F827F826F827F826F827F826F827F826F827F826F827F826F827F826 %F827F826F827F826F852A8FD07FFA827F827F826F827F826F827F826F827 %F826F827F852FD06FF7D26F827F826F827F826F8FD18FFA8272027F87DFD %04FF5227F8272027F8272027F8272027F8272027F8272027F8272027F827 %2027F8272027F8272027F8272027F8272027F8277DFD08FF4BF8272027F8 %272027F8272027F8272027F827207DFD06FF2727F8272027F8272027A8FD %17FFA8F827F8267DFFFFFFA827F826F827F826F827F826F827F826F827F8 %26F827F826F827F826F827F826F827F826F827F826F827F826F827F826F8 %2752FD07FFA827F827F826F827F826F827F826F827F826F827F8A8FD05FF %A8F826F827F826F827F87DFD17FF7D27202720FD04FFA820272027202720 %272027202720272027202720272027202720272027202720272027202720 %2720272027202720272027202752FD07FFA8522027202720272027202720 %2720272027202727FD06FF7D202720272027202752FD17FF52F827F827A8 %FFFFFF7D27F826F827F826F827F826F827F826F827F826F827F826F827F8 %26F827F826F827F826F827F826F827F826F827F826F827F82627FD07FFA8 %27F827F827F826F827F826F827F826F827F8267DFD05FFA827F827F826F8 %27F827FD17FF5227F82727FD04FF7DF8272027F8272027F8272027F82720 %27F8272727F8272027F8272027F8272027F8272027F8272027F8272027F8 %272027F827202726FD07FFA8272027F8272027F8272027F8272027F82720 %27A8FD05FF7D27F8272027F82720FD16FFA84BF826F852FD04FF5226F827 %F826F827F826F827F826F8277DFFA8FFA8A87D7D5227F827F826F827F826 %F827F826F827F826F827F826F827F826F827F826F8FD07FF7D27F826F827 %F826F827F826F827F826F827F852FD06FF2726F827F826F827A8FD16FF27 %27202752FD04FF2720272027202720272027202720277DFD0BFF7D522027 %20272027202720272027202720272027202720272027202727FD07FF7D27 %2027202720272027202720272027202720A8FD05FFA820272027202720A8 %FD15FFA827F826F87DFD04FF2026F827F826F827F826F827F826F8FD0FFF %7D52F826F827F826F827F826F827F826F827F826F827F826F82727FD07FF %5226F827F826F827F826F827F826F827F82627FD06FF27F827F826F8277D %FD15FFA8F82720277DFFFFFFA8272027F8272027F8272027F8272027A8FD %10FFA85227F8272027F8272027F8272027F8272027F8272027F82752FD07 %FF2727F8272027F8272027F8272027F82720277DFD05FF7D27F8272027F8 %7DFD15FFA826F827F8A8FD04FFF827F826F827F826F827F826F827F87DFD %12FFA852F827F826F827F826F827F826F827F826F827F826F82752FD06FF %A8F826F827F826F827F826F827F826F827F852FD06FF2726F827F82652FD %15FFA8202720277DFFFFFFA827202720272027202720272027202720A8FD %13FFA8272720272027202720272027202720272027202720277DFD06FF7D %2027202720272027202720272027202720A8FD05FFA820272027207DFD15 %FFA826F827F8A8FD04FFF827F826F827F826F827F826F827F826F8275252 %527D7DA8A8FD0DFF5226F827F826F827F826F827F826F827F826F827F826 %A8FD05FFA827F827F826F827F826F827F826F827F82627FD05FFA827F827 %F82652FD15FFA82027F8277DFD04FF52F8272027F8272027F8272027F827 %2027F8272027F827202752A8FD0CFFA827F8272027F8272027F8272027F8 %272027F8272052FD06FF7D27F8272027F8272027F8272027F8272027A8FD %05FF7D27F827207DFD15FF7D27F826F8A8FD04FF7D26F827F826F827F826 %F827F826F827F826F827F826F827F826F82752A8FD0AFFA827F827F826F8 %27F826F827F826F827F826F827F87DFD06FF2726F827F826F827F826F827 %F826F827F852FD05FFA8F826F82752FD16FF202720277DFD05FF20272027 %2027202720272027202720272027202720272027202720272052A8FD0AFF %5220272027202720272027202720272027202720FD06FFA8202720272027 %2027202720272027202720FD06FF522027207DFD15FFA827F826F8A8FD05 %FF52F827F826F827F826F827F826F827F826F827F826F827F826F827F826 %F82727A8FD09FF52F826F827F826F827F826F827F826F827F82627FD06FF %52F827F826F827F826F827F826F827F82659FD05FF7D26F8277DFD16FF20 %2720277DFD05FFA827F8272027F8272027F8272027F8272027F8272027F8 %272027F8272027F827207DFD09FF7D2027F8272027F8272027F8272027F8 %2720277DFD05FFA827F8272027F8272027F8272027F827204BFD06FF277D %A8FD17FF27F827F852FD06FF2726F827F826F827F826F827F826F827F826 %F827F826F827F826F827F826F827F827A8FD08FF52F826F827F826F827F8 %26F827F826F827F827A8FD05FF5226F827F826F827F826F827F826F827F8 %A8FD1FFF2727202752FD07FF202720272027202720272027202720272027 %20272027202720272027202720272027A8FD08FF52202720272027202720 %2720272027202720A8FD05FFA82027202720272027202720272027202752 %FD1FFF52F827F827FD07FF84F827F826F827F826F827F826F827F826F827 %F826F827F826F827F826F827F827F8277DFD07FFA827F827F826F827F826 %F827F826F827F82627FD06FF52F827F826F827F826F827F826F827F827A8 %FD1EFF7D27F82727FD08FF7DF8272027F8272027F8272027F8272027F827 %2027F8272027F8272027F8272027F8277DFD07FFA827F8272027F8272027 %F8272027F82720277DFD05FFA827F8272027F8272027F8272027F82720A8 %FD1EFFA8F826F827A8FD08FF7DF827F826F827F826F827F826F827F826F8 %27F826F827F826F827F826F827F826F8277DFD07FF5226F827F826F827F8 %26F827F826F827F827A8FD05FF2726F827F826F827F826F827F826F82752 %FD1EFFA827202720A8FD09FFA82027202720272027202720272027202720 %2720272027202720272027202720272027A8FD07FF272720272027202720 %2720272027202720A8FD05FF7D20272027202720272027202720272052FD %1FFFF826F82752FD0AFFA82726F827F826F827F826F827F826F827F826F8 %27F826F827F826F827F826F827F826A8FD06FFA8F827F826F827F826F827 %F826F827F82652FD05FFA826F827F826F827F826F827F826F827F8A8FD1E %FF522027F852FD0CFF7D4BF8272027F8272027F8272027F8272027F82720 %27F8272027F8272027F8272052FD07FF52F8272027F8272027F8272027F8 %272027A8FD05FF2727F8272027F8272027F8272027F8277DFD1EFF5227F8 %26F8A8FD0DFFA85227F826F827F826F827F826F827F826F827F826F827F8 %26F827F826F827F87DFD06FFA826F827F826F827F826F827F826F827F87D %FD05FF7DF826F827F826F827F826F827F826F852FD1EFFA8202720277DFD %11FF7DA87D7D525220272027202720272027202720272027202720272027 %20FD07FF5227202720272027202720272027202727FD05FFA82720272027 %2027202720272027202727FD1EFFA827F826F852FD17FFA87D27F827F826 %F827F826F827F826F827F826F827F82627FD06FFA8F827F826F827F826F8 %27F826F827F826A8FD05FF2726F827F826F827F826F827F826F827A8FD1E %FF2727202720FD1AFFA827272027F8272027F8272027F8272027F8272027 %7DFD06FF52F8272027F8272027F8272027F82720A8FD05FF7D2027F82720 %27F8272027F8272027F8A8FD1EFF7DF827F8267DFD1BFF5227F826F827F8 %26F827F826F827F826F827F84BFD06FF7D26F827F826F827F826F827F826 %F82752FD05FF7D27F826F827F826F827F826F827F8267DFD1EFFA8272027 %2052FD1CFF7D272027202720272027202720272027202720A8FD06FF2027 %202720272027202720272027204BFD05FFA9202720272027202720272027 %2027207DFD1FFF2727F826F8A9FD1CFFA826F827F826F827F826F827F826 %F827F82652FD06FF52F827F826F827F826F827F826F827F8A8FD04FFA827 %F826F827F826F827F826F827F82627FD1FFFA8F827202752FD1DFF7D27F8 %272027F8272027F8272027F8272027A8FD05FF7D27F8272027F8272027F8 %272027F8277DFD05FF27272027F8272027F8272027F8272027FD1FFFA827 %F827F827A8FD1DFF5226F827F826F827F826F827F826F827F87DFD06FFF8 %26F827F826F827F826F827F826F87DFD05FF52F827F826F827F826F827F8 %26F827F8A8FD1FFF5227202720A8FD0EFF7DA87DA8A8FD0BFF2727202720 %272027202720272027202752FD06FF272027202720272027202720272027 %52FD05FF7D27202720272027202720272027204BFD20FFA8F827F82627FD %0BFFA852F826F827F82627A8FD09FFA8F827F826F827F826F827F826F827 %F827A8FD05FF5226F827F826F827F826F827F826F852FD05FFA8F827F826 %F827F826F827F826F8277DFD21FF52F82720277DFD09FF7D27F8272027F8 %272027F87DFD09FF4BF8272027F8272027F8272027F82720FD06FF7D2027 %F8272027F8272027F827202727FD05FFA827F8272027F8272027F8272027 %4BFD22FFA826F827F827A8FD07FF7D27F826F827F826F827F826F87DFD08 %FF7D26F827F826F827F826F827F826F8277DFD05FF7D27F826F827F826F8 %27F826F827F826A8FD04FFA8F826F827F826F827F826F827F8A8FD23FF52 %272027207DFD06FFA82720272027202720272027202720A8FD08FF202720 %2720272027202720272027207DFD06FF2027202720272027202720272027 %20A8FD05FF2720272027202720272027207DFD24FFA8F827F826F8A8FD05 %FF52F827F826F827F826F827F826F82752FD08FF27F827F826F827F826F8 %27F826F82752FD05FFA827F826F827F826F827F826F827F8267DFD05FF27 %26F827F826F827F827F852FD26FF7DF827202727FD05FF2027F8272027F8 %272027F8272027F827A8FD07FF5227F8272027F8272027F8272027F876FD %06FF20272027F8272027F8272027F82720A8FD05FF522027F8272027F827 %2027A8FD26FFA827F827F8267DFFFFFF7D27F826F827F826F827F826F827 %F826F8A8FD07FF7DF826F827F826F827F826F827F82627FD05FFA827F827 %F826F827F826F827F826F8277DFD05FF2727F826F827F826F8277DFD28FF %7D2720272027A8FFFFA8202720272027202720272027202720277DFD07FF %7D272027202720272027202720272052FD06FF2727202720272027202720 %27202720A8FD05FF5220272027202720277DFD2AFF5227F827F827FFFF7D %27F826F827F826F827F826F827F826F87DFD07FF7DF826F827F826F827F8 %26F827F82652FD06FF27F827F826F827F826F827F826F8277DFD05FF2727 %2627F827F82652FD2CFF20272027F87DFFA8F8272027F8272027F8272027 %F82720277DFD07FF52272027F8272027F8272027F8272052FD06FF2727F8 %272027F8272027F8272027F8A8FD0AFFA8FFA8FD2DFFA8F827F826F87DA8 %26F827F826F827F826F827F826F827F8A8FD07FF52F827F826F827F826F8 %27F826F82752FD05FFA827F826F827F826F827F826F827F8267DFD3BFF7D %2027202720A852272027202720272027202720272052FD08FF2727202720 %272027202720272027207DFD06FF262720272027202720272027202720A8 %FD3CFF52F827F827207DF827F826F827F826F827F827F827A8FD07FFA826 %F827F826F827F826F827F826F8277DFD05FFA827F826F827F826F827F826 %F827F8267DFD3CFFA8272027F8272752F8272027F8272027F82720277DFD %08FF7D2027F8272027F8272027F8272027F8A8FD05FFA8F8272027F82720 %27F8272027F82720A8FD3DFFA827F826F8272052F827F826F827F826F827 %7DFD09FF2727F826F827F826F827F826F827F826A8FD05FF7D26F827F826 %F827F826F827F826F827A8FD0DFFA87DA8FD2EFFA82720272027277D5227 %202720272052A8FD09FF7D27202720272027202720272027202727FD06FF %7D202720272027202720272027202727FD0EFF522027A8FD2EFF7D26F827 %F82620A8A8A87D7D7DA8FD0BFF27F827F826F827F826F827F826F827F852 %FD06FF2726F827F826F827F826F827F826F852FD0CFFA852F827F827A8FD %2EFF8427F8272027F8A8FD0FFF7D2027F8272027F8272027F8272027F827 %7DFD05FFA8272027F8272027F8272027F82720277DFD0BFFA8272027F827 %2052FD2FFF7D26F827F826F852A8FD0CFF7DF827F826F827F826F827F826 %F827F826F8FD06FF7DF827F826F827F826F827F826F827F8A8FD0AFF7D26 %F827F826F852FD31FFA82720272027204BA8FD0BFFA82720272027202720 %27202720272027207DFD06FF52272027202720272027202720272027A8FD %09FF762720272027207DFD33FFA827F826F827F8267DFD0BFFA84BF826F8 %27F826F827F826F827F826A8FD05FFA826F827F826F827F826F827F826F8 %2752FD08FFA82727F827F827F87DFD35FFA8522027F827202727FD0CFF52 %2027F8272027F8272027F82727FD06FFA82727F8272027F8272027F82727 %7DA8FD08FF7D2027F8272027F8A8FD38FF7DF826F827F826F87DA8FD0AFF %7DF826F827F826F827F826F8A8FD08FF8452F827F826F827F8527DFD09FF %7D27F827F826F82727A8FD3AFFA820272027202720277DFD0BFF7D7D2727 %202720272052FD0CFF7D52277DA8FD0AFFA8522720272027202752FD3EFF %5227F826F827F826277DA8FD0BFFA87D527D2727A8FD19FFA852F827F826 %F827F8277DFD40FF7D272027F8272027F8277DFD28FFA827272027F82720 %27F87DFD43FFA87DF826F827F826F827F8527DFD22FFA85227F826F827F8 %26F82727A8FD47FF5227202720272027202727527DFD1BFFA8A8524B2027 %20272027202720527DFD4AFFA852F826F827F826F827F826F84B527D7DFD %12FFA87D7D2727F827F826F827F826F827277DFD4FFF7D27F8272027F827 %2027F8272027205252767DA87DA87DA87DA87D84525227272027F8272027 %F8272027F82720527DFD52FFA87D2727F826F827F826F827F826F827F826 %F827F826F827F826F827F826F827F826F827F826F827F82752A8FD57FFA8 %845227202720272027202720272027202720272027202720272027202720 %27202720527DA8FD5DFFA8A85252F827F826F827F826F827F826F827F826 %F827F826F827F82627527DA8FD65FFA8A87D52FD0427F8272027F8272027 %275252527DA8A8FD6EFFA8FFA8A87DA87DA87EA8A8FFA8FDFCFFFDFCFFFD %FCFFFDFCFFFD46FFFF %%EndData endstream endobj 19 0 obj <>stream -HWn X)l`=y+Y'n|,H=C\SC3C`E/ -h{ѻ@{U4-2My4>H$aIC~G|`#b&O8D -}Eegw g?8l ƤgŠ= -o;i^Ω| PXq[Ĕz'|O? >#Ag:jpʯXK`$Cv<<+~8V!VqcwB}qUqM0e"gNy4 GvPrϨL~w)$9K@t'=C$Jʯ%郃m\C"+l; XmF -3P5\ndil@ Pz]Un(_B2q1*z"!(%JfgG>ad39\"F5'h_:1>vCˇׅw s֡m9 8ށo}TJ•l(/O_/Hvq20av`_R#U@$Яs6*.!onzz,8c{ :mî ߰R/kP'gg4Z:fm^s1sE'[(mQ.Gt@׌'0ðZ;puO{NKŞgN~;G e6YV#~,NڨWW;[CwiZHV9zZap{fhEZ]޵B5!q$2舶q+Dhusg8ȓ8˜f$vcyg1MZX/ơafcios#Q ;2tbm_܄Bǒ=u:biF8ĆqaV}L9AFT Ӏ*TEͲ^<v[달͚7P64Lc"p4JXgU5A9Ы1>؂><t|*zf:jr3e**f|"${%'Nњ~]LߣIXzȒIBXʎ~.=ŤTΚ><_&VmC$ڡzвQ`cDw -fRϴvΩ,Z$ kYLm46L,с5;Nf--t'UK܈-u$>Bz]ಶ\'IzZʜt"T&$gi6Q/#iFe]{ANEd.EG&1h~lc@@HR@&g En"$CIIL3)Niz5ץ$%= Ri^cEW7g6CF#Ƴj)w{{[=J?Uua5 SQ@H+`vRj Sn#ijw{v[۸ninn23$I8?胫g%]`㼟[5ǍxG+ XY/"".:2e0wVЇ2iH$R˔-V{Pr4p0*ߙAkUA< X#?/D#yJCYsW  y-%!g,"XdsХ܊(Ȟ؛MH2Cܨ!\S&tpzuAq w SV= .Z>'!zӛVq k04 "[&Ꙃ,i&;PI F3T"bqx[p3Tg`Q4uI"~8I\d |!w+? 9&(}FЧN" - WA,9A8tBu`)e4w =s.饁nUAq+[Q9,tع >5!{'/CF DH5 J[z֯e5 9#r;(VOO"-,+SIdC4kq`)Ʊ9wR%h jbz8PR 5pF iKH_ؚu0x~qqg~Nդ[zؘ0hP0p Uj$Vl(ʢ[ј.5#VTSc4Z@.85h0/T_:_- I6BPa=oHod$8<&bF%@,uMuJ>9|U FY|f/Qdߨ ,DO&#(:c \|zS(ygQ Db XI10ʡuE쾰ңȣl B$ȮFFl.+FF#h*yGaYs1#e35=F:LkU쪡8X7 -[ڐ8DL0#J z-*Pm9GԂlr- E:l "#p4 ,>N 6$]@@US茌[ь&4M*d`!;gGzOƜ%FHUb"08צ[P1ÒA:!T!*W֖J[,L.zk |_t& =,vF=h?Cz&nA<}M/E.],r\% ^ӗ\S -T"b1)F>@J>{eVmY8uQY V1w% ظ( -&CCZ+ l.l8ȓmIwI@kFۅP+5Dz%pH 7@+txW$6 !~K9ne:)[*VU7Lِ4Sa)Z^iigp~`n^䳜;% Gn`2 P `P -MuCgo9ӧ,˦E|U")4JHC58h ;w}.fVxyѦ{2V$ȘVk<] H*A'arKwB ;'ŒFbH -^I5<X"΀W L,,"@]0('Ȓ *2w8`Yg3靳'cVy~)\,HZL ەl}Y$"w-߆ыc+4l@%JنwYq j\^[TO'ܨdg&7'4HJR~;UK ->8~(`M$65&u5V{iޫ|2™9LL~B~Ż~ 9p#:-cs[) Pӳsw2俙9h?"tCg97^@! n5 `A S[(Z,؜z9$dqy|[Ace!ھۣb='Ov@a@6{+;`r`"&XP I -q+BPuVO85*Q{B4ȋ>->ecĀFǁ3 -BG -k =h4h u hzh,TJ @',4tҩwL.TQƈߐjXpÀmz[I@ | 3o"zyu&YhvΩ /G/ƔC^º@ݥSC{c~o Byn$ZH,00-cm>aKA -@^5vhR~Q$+|kkِ/g>J#۹X -P$}1|&K4h%!ؕXu 9 oH~S}HqłɖۊM}D᪗Y=<eЙihg{4]҃ڏl AcǷREqVJ 6x2Lwi-~:hZ vZ [,{{ FoXA(wEjⷰnDk \͉ۗqTZvoj50 gXy*k >Dkd;KD nϊ-q_T&IΞPA&Z'(dZW>Z[p:Ke#?g;kqVJ.5V-QE.I8뛕;k dKQNj+駘>]o8eO^İ*2kMk6L{]ifN,78͸BN[H/gdi7]9 #M<{mGO|ŋ+- Y-XPQ@ɻ.^g7ߘj{ˠ0vjwXu'Oy&6.cpl ;MϝpZgzGb[)i&AR{gljˊCD"D/k>h,)?< - -ҏ.z^.2hj6q3׆;)&/'gׅIXAe)HR|4d!ZG -X74(݊LPBk"R ϩH9>t0VY?fEϟMeORQ۾A Puc+ʙ(v}^?,F*~üw zռ<~P\b9Ƚٟ }e -R9O=밠/iF@O7ג] y?<$W'5N]7\:%]Ykt%E]No mIn?Y|}aXk_"c؏σ1!cȘ~=^-4q&W)!ZCo)(orAsjB^~}Sߺ29CJ -Hd6"I2QdKPf7RVc- ء+#fO<#W\3L9ӖN[N.CFW<~l$Xу&4|.IKUk>(A )ܓ]lpZ–k(a#~hbՇ'pUS`l!?ʜPQB:M#GPX[o*x%!zd nzW^oq=~7xQmp0-qg Gg-+W%fDcQMQ}w --ѨWZ2ڨM$zĵ:kLJ_˘!K -ȸS69% =/>N>u|N;ASSģ4lҠ&˽%QLhTw%JؗlhlEXGaɸ/ц7tWuKƽw? r-~d$d~H~ѡNY$;-{otL3sDL1?a^iP &LЬPHڐ!Bax+ɛ$$Y6QQ,3gT=<O;%%;l0`g~d "E@ɢ^EUyqE2kOޔkmFQq~sUo˝`P8Kk*ZBE#QE _,-}([aX47,Gl" -dG*dpxd͚6Q4. 1'*Zh*hPfWJAm|M}P5Irlhp6W4P4X8kaMƢ9v ~iߐGծ|u;mgϙdžn*3̧ƃY |)Y0$e bY.$( =Πj`eEc'g 7Q9zaN%'4,Y4_|_Yo|ßbϚp{E,(xקxM1X5Y/bgsP0C8BBqOᄟ܂! -4,YӰ6C#(BP䊪Kq| ;d'܎`/ԓ$:BIE4!WJ &:|^IaV`/3 -A'){Vח+~]q}炕ߺgᛘ,c|Tr :}V(-GIv;Yţ/7fZ,Lo,v9iF,twʍkӦxfL_Ք^:+'';q@|jo> YU7nܬV2pZ,ipˁw_5 ֝xcz̿K./r/Y{i^kg$v5vs:/URVb:mBJgՋ4;^ -{h,~p.K$^{ΥKA,ˍK3}AL/RY{ŸN~oNzo+WoK|7@-ec& _/ֈj"?|biJxr=LI=w> @Ov[F,u߻:9:eoyC+?U?[0MyX ?_Ň4y-p}w$~"9GܤK< 9%Q5.bHRZ}J5lb};il<Җb˕ֵ2CLYxHi2w_Vd7HY-wAjUUI{ӜIGϘgD? e&hl㭪V?mkY:EV\?ɂO>I +bΣ ޣNI{~Dgn[A~MO~/ -.&3meڍ2F*Zm4:a ` 6~^ISr 2z5 `gفx0xjC--qb>X/ìNJg^*B&6uc!֒;C٩4y:\'A5OSC`'Qp7eKxdM1Av?0Q5.bqFG(0vrBvHgk7=ց#E:4j|'/C dEO8r:WBt=Rh84x'iܺx *mGsɠY*^",ti(/%˟pz'1%&Q.QpNcMd,o,wiyPft%B5Ka>E %j *84%Qhe؟J -<%UءD܀uQ@0"qݍ*FnӲJ tDbAM2;OV(rWF}z1Hί\%׹yԙZWh5/jFNF[(|۹}ڹ=1ஙx)TgPqO^xXT v#fMJšxJ'$,pV[nA(Se%vqS9H `Z] Ś2ߧ{;Ŷ$ {U{Kx8`\R[lS[Ҧ6:ێ\_TM5VN PsŘ2D^t= Y4k!,> )[pAEBLCh1. GiaX5~⩤D"zDʐb8fYI=+r9%|-lVC_:*39XCjQ^eJK1nlCÕ怌lhs:Sb' {E~}Bٗ;;5n -Cb"G)GX0NE_z㯇9`( O^\ -R,_I>=e-VTZpCF`}Oxo[k`dA˧ 32n` -u\ 8cMo{%=>p*သm4I[R5dÚ_35`@kHv$2D0pB -!N%c5=`-Zk/A"mØQ<<51o]ʂqdF%.o/0n:p ƃ߂k'|7xϫFǏuj_X'խꋿ;ؾ;J+s:;"ncSN'KpIn /x3RUwgF`"Pʃ׹xwEGyJ[, 'fӆ˩SҐJz IT8b;O}wlj;vKOpngSh -45g'&?/ʠ?.C%JGUIA)uȔ rz{s;oo |wє *B3:qbst -6#&۩e|1ՌvL + .9 BBAJ}]$ay1ng%^G jn+xXmוEF:J\U`\Xwy qo Ɯ".sAۏ_V8M0@SHLfȪ ҂_\za -,]U}ȧ94(AC m U_-Dn^-2aDÍh q!ِ2=AhB$`@=DNB`P<3=\u)ͰAW7HStȌqW%"bE=I~FD,hpT{5q)m,vdhɪ_7'g`slb'"Cf[M}ZF4ۄ),;*^zTLϏJS{?"|_\R#*p@ˈ g\PB OI$0,l s -bTҹ_cĭ=VagvET;sws \Vԕ -oF,XTx[yO1کժ _jIF'C -# deuz!yj(}Bќߖ[CnoKLC9y; =K/hbl:s Zňy|B_gm~y -sO60`F?w 7Oŵ "$5rytvj'ijDےϼ*OTs#[kЄR%d% -oe{V0_OB 9d`~yB)˥¡S0wJNFMURbS_D0?r"MxVd ɑ'DKXΊFJ»%91C.K6ߜZˇtf~4>Cd,"ˌ1By# +$%$"%5>stream -HW^L}<@H $Vh HE,?dyofa&Lk6A-uYXZvbֹ`a{|h)T.Fe9jUrѾ&eI6MZe59YzeP +rŊiPsƽ*]fWqS֡,O&jNgQJku޵ןVdl E$f|e)>9Н{T= -XyN\|k< n'] d ov"m}|UƱ"dIJ1>%*%"Eg7\;Pg^^ZyOI2/e\WAott̎&ӆ%5$m5a5!JV^\Z{3\ckE%ơȉ٣|2]xIGO&ʒ ԂH* -J+aB'J:'R ȥɏҜfw!;rɳB^l8T}\l&<+dKwQ٩e-nbQ Bn'&{ࣀI%dLx0Syyhdپy"0Ur{ ۚ$3eKs>r^2z!X?a론8¶~Ycu<ϬZhU]]Gڑ$wcN9;9+{۟SSVG:YFpNzG!F[Sr0KSL㤿Y. ~6et,Q4kFQ*j>GǽR'σ IvЖ R's3͖ ɐ_xI:(aAGHy cp޹_ 艟]k2qH2J+Z=UZ4kN^xv'iǤ V$\/ZǹIt$Z ƙ?4" G< |y›c<%kh!.:"T\b4-?S!Kܽ -.)ןL^+ora,bw.Y-ڹrI%QxBҊNAzxR6 '?6v{z؂~sCd*8^hjph3f}>U҉] Tzy:Y$ֆ\ANRU1{abVC,aB]IR+kmZv;U-g1,#.cii+tdRr x OhmRt W(lqrc Pآm(}1KӁ5N(MD̑@)͋J*N'`q K-7dەVW1FVvY~A}'RcmVE1x<[ح1 -JWNxRс,GqI>łyA`  -(]%+O=MvNm͂rR$rYm.zeiNߦi!*eK+^KPífZXϔ4ox@+;o(+ #X#(O)`~}Q^> TkE._p}e3BPwGqBG1W\;{j sx+|6t(4jB -mH"jB4-`&DVm>ֆעqW\D8CX#7L5pLnr=ʢ&L4^R.6o^?Li|h 2*Xbslo9DcXm$"s$C9WRސQ ɜE͞fwå"X>ޠi qJ=^Vesq{=Y5urX}7/maa!WFiÒjrې#v72e@@9aΊgF!T^^ZEms>X X*j̀cu3Jˬ|(g>oY!Y^Y!1hiXf .dgO >GP9WH2o.TWQoHL@䪃XϘ5dBIWzJ}bQc&K{TM100{v[k> ёPĮnȁ5{zhD#?5 Xb,H/p+z|ƶx-l@i*Fp=]Ɉ|tjg)LSwA`p4|g$Z:_@*Ex:ecT- R:p ;`@_>4ˢ];Ja;n QqZH[t"!&8gF=0:*RmK֢1-s:#[+(kUy;87Z?Q V9C}uyqai'a\Qo/U $҃ĩq;j>9}_ã}hԩplAWÓb}-&Ppm_Ĝ_>E]qu贾3?OqܢP,|, pI`Omg.CzZ7ۍ4YGjBLlBN{ѻ [i턨6GN'ł2Vɞ 6q5Ft("_f!7 -g!/BHz[܋Vߣ4sܨv |ycNӔĆtwBxkd7ڂ 1ŏN7UmsGRGՙ^zѷQ>K.=ϺX.;X[% l춾{rNօypr^Uk8?SX0ۥ?j{4V'c271 R~ kg(lUsqɰRI;:BtC._%0+#$D 8Ԥ3w(? !JL_hxWNM~}۫MmSmСBN{\7=p?UȾ Y?ǾN^B`x99Mˇ,b{j=Н- JbǶXU6{͝,u׷i낼$RqOK;l"ЕN)ޘ Zk8'p j5\ DрڃKˉ{eiDOSU͗쉺TU)5&k!n:Q22}WmE E[ $u G1% K-Dg)a;yO:uw9aT:%6Q at!cPP{ʞK !nv6փxo4hfBCi7+AGy&N+!rgOu2 Bg+SVPy:rτtևN{RZm %ilTv'0>$.X߈e64eH ʅ䖃]9d s{?-g^epEqN&7=vr;ؘE"Z6]r6_󄏥kz@u'2!u/%4t3};0CRD-QjJWC Rh@hҵpy'$3*s&z"pߙhMu`Y9E{svq, 9Hʳ꾆gOhPYSm; -Ǐ+7Z3d8>ꮍv7TEPr<ө -`=@モY"T9`6Pc7-#LBLmggKA:!=_c駾[phyhɖ"TR4 ŚWo*ʛ_DV뷽*ًA hv@]I3Q?F\;#I \6KDa:˱Cw9H?Q7mO^mWD0Z$<,tuiݒE}mкv Lt(ٯ*iNC* ??.nno#̿1Ώ -9=ZxA{2kI> `$Kn5 YnY'*H!_qRh6$bvk̢+;<9A K@K +-,zw eUxBѻr[=\xPf]B{jJaQ`) |]Ci5F&^Ki&OgPUwEDUӀ8za^bӘEDՊpH3J{rqdXH!0^2Iк(kJLبOľ G%e lBݪa" FX8ހ_nۙPOhcxoؗ5y3Pɿn|u|-?T,FxJ=~>@ǬrPJj<)-Uzx8&GGJ)f<\I! r_JX[O;$HQHgN! ?YI&=of*ȧrvհz Jهta՝ˡ'O%=`S3|֊_l0L\''vԹC{Mɻ5 W|l)PFqS8/E~);מ(L|@q1\Tj1>vvbHɎuct+8}9gT>s!q:QQGP vy)x8o'yx〱9v -%E徍9RI kJb'b2ս)jj \dU;hoU{:P;Ѥ-q;&#OӰuQh=䶩1tYoVݕ2ZWK ;;a9+݅-oco^{<˥hoo:'O,f%\iG `)pW)`hyGgßP斊*,̱ygܕ^r2u-wSLɻ"-\-[e%r3"'Bsx-c jf34b|hfޗ-u_䳟~@ 0f䳌rA"ȰV'Y[+񾈌&ގYJ46Xpi3/<[@G+Q(ȚƷ\ˈ!f@3l4-LQϮL?c4dz5 B3If~3dhA { @5?BFf}g8H=kB2 !-?o lA"|e;MyG cNnjcXZU ->ZmT!6dH*LUVIx FUnFΕv/oqx`AZm+>(0 kQ{GȿAɆWYkّYaHj8:.7u *{^GDcFrjR ^c/@ LAƞ"X]K"`5AvE&~DŎ놪t0'PtY3 @;^0܈LRgR7W}S< *TMUKe:-#VSDa̰S2"޺0v̵+e@Qmxw --> R*,BV* (Ŝ Sg= -_+FSjL/z3uhd5Cݼ\V/$n) aM6'd"gN˸_HE@WѺO"pyrkX[MYۑއ%3ۻKN(h5կrzȿzSݗ *˄=7K1\Au_ʘMp}o(k~li;n}3L-q=%Cg7U>x2\Y"^I$e䫐AkZ+/H-/u2JjdV{ͼxb/-YLG?QJr& -ѫ[ \I U^!NSytg6< MA$Etܩ Apwhq= -czakbHZFKet,oA: CH[%3T9z_F㡿f +3{ 1O<[^g`(,t? %D(/Yi>:aڨ7f~/u]|G_'!UQ..B9u̢B@s%#t,u'[K/A/b#nIe&VIuJo9I0]^@UY%KJٗ2+kYW-xb<_F'5QY؀ =IY_ZKF/1l *MN\I'f f1&l`m fs9\`n1bn BQYY_f~ 4 &2/(P:˸aW A_RY -$whax2GSN -3?C3&fBSXjoiMZzx>|ɕ.A^ Az0X>I PZ)2?fq])pWȘb=^+k -.g-MA]Ll-wiC8Y8`I|>F"%vXޛFWbqfxz(uKi -^ÚGEÛppg胍(;G#/W"QJ9jf5c'iLo.F{%S7kx+ɪ#0QotQ3gא[}*)Aŕdֱ{Z+PQ:[bݧ2g=ZIN#y`^N> ytk.ƪ|~GlvGxtPpO!@Y"`Rm *&'S2X]Q3|n;ߩ C-3]D&+g煇nMdrvDgmylխoU3:^\Ѷ0rd3?*;aR -x0ϒr1Y= -Tpk])3a{AFwL[j])hɛ,b.IHf}ZA,=:v̴ 5O_셴H8ZKƽ6>_+It)7)pL8׎+ b 7:T}ɴ#FA>OWxJݡ­*PBTWYwkJ#FLvF솽SVA$gyL7HpImH)|s5;᩾}eNאּA8Sɍu}BQF&iCcj2$Il0ۇlCA4^_:AC=iqN_neL+wh=Ga`~iAsB)!u#EA@k68D>Nɦk=@] 2:n?TCg,*eBG.ƎB&)DUyQ_d9Vs3©@pG6P>} N_ҙ5 - .hՑ}T1ȉ`'6TgW{W Q8o -ZRmp "›R"An{JTp wѭ;-e)b{OYdeVcί IJ QBRjoo^O3ƎQ:ӪlW7OlةE[iɀLgZ 'Aud9bGH?"i⚞~u"COR$S4X%qObvV-<^B{}JW=ka(ùQq> L)45s;ˈ<¢0FȌjӘٖ'jg/ASX5 -)ʁ͖Xk>a ku ud BDbL,Q4S|Cd\ȖU N-A)_C%LkS&2>B#"s1!@b2&ăSf1VM@W_'u0-#KoBv9tq7E)g͕ݪ1#QSO{0NSuUNgkCMjs11ha{օP -D{h&x?/f7̓nG*Zo-ސٗvwX)zN2 !'-A7x? &L:4^Ke&/dd5W3]@G#.HO@R{eDC e]S2Ehl>`7Ƹ/,/]JZnwx) } J j,lGZV5.iOLoCzoG<$ 5E}\Ը+;p5'U&K˒YrI;='Oo$ J -sy -g4W$/🶈<@#P 60" - -7%bĆ&9BAz!Uoj2*'ur{%H2!cFkD -;d/W])sRU@CMa IֳzuzX׺a`v6Al/K:1~"OHrD%Չ+}"'5bN/>MxI -:jeUOpޡ6.yWZ B5:3?*+322u~CPp;]ǟ_?G;/Σޮ?]{?~xivGm15f{2ͣóƯW*W{}|Iȏ$ۏgnwkY[2`ެoֽ2 i*=={Z~Yx[`{aP;[![zŲ=|Mo@zkz6Z :@okxi¸wѬj1oDI[3Zu*n}U kbXv̘Z]Vw>+CrFta=f!x\vE:9TC@%>FH-g{хsH]Tt3ACuNC - -$)DLgњa@#ސ`QH B 3u$9է0$Ci;VD6 -<$uCQr09G, 9v=`XwTgY&{v L ;1y&m #iE|4 2 &|$e/&IF4}-uy`rOcuXIc`qE 9g`fVu0 ̄|K`3 ybC4XH:8xAɴ_߅yR<ЗQ2EaBm`4=MB45sX(2z0HcBc1LT)K -:,#:@"Qa0Q(? HJ)aT]&1 ABR=6d7A6rn qҸT&b>0v*σAa;Rv4)/(|0fF3.;ͻ*B"_DݧN(f' *e\A)sqj()廾GoLC-t, &e6FZLjF1) ,%S{1QJrL-^1  jqS3 -huAFkŢ%j:G)` 4bCä2d09EmR#+\qp^yC<ڜ0p쥋Chbh9yjapg.OAh !bAI(^!&e:rEi*+<$~JǑ4 T^|!#hmLMCx|M:TAVSR Rln[Ţd~3 0HzYo e ,+kȏ0`UXGÍI&|Pu:F -EH{Jͧ{&(9t؍M(^"͐XgH3b!A5 KY8UQמR=Ӝ|YFkrV4Jy*xI+dAe93A# -l5"֙=uV7bTMj@hV`fvSZo䕕{?}G $ك~0w,SrXAaAL 0oi:+6Bx10U`.>aYp*r!xTWt*#r#AY˃A(g28ힰ'0Zn|#~>{-yav0C;7U#`0᥉Tyca!FIWd KQKMօ_8od0>|4(TALNSE?0[w[bDi -;#1l'ƍ;1qeWuA-1FcN1 }\KZPeZ;h-Y\Vjx7Cb458`UH:ϥ~u<]Ƀۼ@ G]΅MLsQA!M ߉beVrհCy -]>=6ԾPt -kR!<" x3\!dhq$൴հ k8;jڪj&%84uwq -f4]5 a.X^?hJ5GÆ2)Ewԩ0;9KS|j?70 }<Eϑt[&vpc} N֥]LwLչQs CF]@C!soio[H~`na}~_`!8e8Gu2SҷMοqC!`# -I .b7N` Ӣzmaȱܶb054^H-h -QB˭k$ -f,XclSUW$?4)8֎Ruw,]TϤJk|r.{_uXbX:-1ֆtù;{X;èH{^(wS"SjȈ3!8Mi7)7ͬI8JF?M:38eW.M>]'zd80]v W``:O[M16wi -@L_ -Yуc(E9iL,*,ʖb)hSt$yuyWU~!J3,FŮZ^!Oy8blbEFxųt&[f*55+[ "ƿE9}/DQ]}b&@QIͻ n?S`ac*؞pVa, -Iև`>'`%{m134?dF cN ^3-[}.&Meyb? c[ˑ[~W- ,W ނ -!-]h11}Gq#j6Cvszj6ca~z^ƋZ& bPȄ 2¿G3Pf}P=ƿaL̀e99"&\C,#r\p|:{4qLޚ:a -d0* V(X2BnFu -!J؉lPwʦ쑚/oa"Q? -_i ^1:fCpF_$gW0s,1ƗqZL-J<4M<RMC qgi<0(#Ϩpzf)) a; -ybbL&USc_K-3KMo$j_r11G.:^r#tW%1'72a= -{~m`W$1EK̕<=ʿ!/DcG>0틢ßP5dGD yԪ 6R [Wi=3P /b̀'hf(>T縫j@\=_  -(&@fbToXT0EC=9]YXR9OB^GT-DQdZ8 ND0Vy%r@Q_85-\'`Z ( ';ƕ)/% &L'C!۪U0Es; -8l'N(o濳igӺ5d?!EĦꋙe!(a%'0 aobU׭[\U A: KP3[*f*̜jh D|@2 MŽP5Ab\hgcIJ>+¡&] >u c`h@ab%ȄbR+|*=` `zNb`փa?N GIǠ-bܾٚzQYx3\b !2א{bx:]!!HN ;`u㈁옃ֵRKN9*! JvͿc -ܽ Q땆x" )a@<2j2^ul)e!b*-~lckb=}>›xzQzi/NbA"Ђ -MC[J5ũu.3bs}lPxK-01(y X ͆'ِ7:F!bnf,O(u_ 7 zJ(] &KmAdO!pM+-ϴ3vK=WxL95!WΘ&@Y_+TU~\d#Oxq2Bg|t -zE2|d`Hd_Bf CR ^dzĬ5 sq-O0Ou6!5 Ђj ÝAy1=>—qDoal_\t{YDIU}ߊɺ8 @dg3ro0hB0G*)f!pxHU^ $ATȬ,c]bPL rl1s>UW>гqaVI 3x'AHU3) O J|Ijݵ[aeFk)4+#} -YKWr --T6BWuߧ} Q[`d( _ /myЄ&}L .c1,@wFD t C@xI}4b'%/`5}}9)1ɏʍ񦕄%Y1 'yesŷH11䉷q6IctznS"py_瘵Þ0}zɬ,95JkwVQ.Fݘ'Z30M[Er Ѫa0 eWs',zs[a,+׎g`4^^f)S">WԳkbPBcy;P}&*=ɛU? -e0L5IU"KDFU'/afIp9Ycbn<XJA 6b3 *FcxfFCOZ*v -^LxT^׍*։è*:0t*PfxPP -9{~3Pc,l},pXӺ1o^x5x,4#)Faұ{ƜnDQ=H oEFOJjHi ?X:M-Oa?EHk6FlNLX1 >´DؓXQdXV U3>Ql91WZ;:݁8et8EXX04дn Gʫ80)]1v Ưt~ʥkbm|o-5B={//@l8e"eJ<7 -Q|T(ו9+k7 " ݩ #ְSVriqЗ=0?~w~?ߎ_Guri{*+e[D)c0bq^B`9@W"K#qbh(Kpao l.;ロ-1s%ID(,*@#g%a-D -7gYʨX02d^YYsè5y<~+J+ Q;X73 '"{9S uwG,2g ,m>ܘƫ& .WaÙ -_!l<(ئK:pYd1Lm;96~_u0q|HJ20P:qɅb]$Υ4%#VϚɮNz: ZrmR1Eq :oވx׏I<:ogJcۂ$pN'*h/Xm8c%Fҭi~t cArD\[f a,!68[cOʾ.ɦ\gQWFM9ya"@M'diw~5k0x(ߔJ:S,yUJa0ù)f616nM["3;,mC543v9݊%o1)0IVN2!sÒޙdRrI;'=*leDG2D`3q׾2 +E7)^qQVl$V׏8xsu8:jϓ~{O8Ò[ Ay"}VQ|jO*5@usdqcʎ9*s| eqɥ FzrǮ3BcOF&11 8~%3 - -0H]O7*0 -?.%'[J`IQ>'fnRnlB&0y:+gKтSG9)*sǹH<!ϲ07fLR\>zCQ[ֿ.H(Ie2&ŵ0"ODI.w&=0Z"uaZ4Bd -[0TEW6PS kT]x`;}aF! 9UslN55(@V;'uNVaSNӏ^z1ag1LM%w.{$$C7>QXatԹxCFGنv%8x Ty{@d -+ {uԻ9#1X2q7s0/5D+E Ϣ]V=%LOw@dCʰJˀj:b$ v՘bNBMMKxv}vj8dȋ(b@s)}s4VT瀏ygMlrt[~:[?ztU*\H)V~rj53:56հVS3il7_1{EdoyLjrR\zLHM˶X$~o;zTYXW Z>X52v: (.{Y& $W5L|%0 mn(J$|RnmBNO[i@4J5"\53~`̆?DqRoF9σ_kM-߭2Cy=L1PIisX_(&YHړJO(`5{/;"LP_{3-]LK~`z"!\^i(9w.ru9]pB| }%EF7&5~\ pqIhG]Xb&2vj<@;/ZN>HΛ%⊃sB2?5ϡ|NZuc2e1s/Yr}WOVj{zfb7 JFc"RN% qSUj@CzA*_e9 endstream endobj 21 0 obj <>stream -HDݑe)-Xʂ~|ZKLLtW!R߶5}E<ǜsjbGHwf0?ձE06l07l\6;WZ.}7_W̱jq%LU͝O bHADVnkV]L$'$_$wrU^UmE|5|X Cfq?O߳g㕼W?kinjLcA0_LԊ 3+axhB^bfMF07EBnoyyj.q!ZkZׂMj> y!foqܼ)SU_47" %H0vbt+J*A'Rs*%Ȩ SQD 6ـoFﱮ.ŏ~mNs!Ra3?QZ_vFhb&TZn/ūIX~_XJNT[UavY %&5u! t/ߝCRHCu( I Bpu3AӔ@u] rMFC\߳JVH&n[ |S z)m3*$Դ(r1dg%G1bP!t oeՐ{s`) m70ǧ]Hë}T(&hf\}i8Dգ @ #nS`6mDc]KF).V04^/HI|RWJ 1=! nTDDe-^Bd<(97ƐފߣLMD -?Dk A#99xGQK `؅ ycYQw -IɽtfX0^& @絜؇]49n⼫[s7_ba`DI'd)s+.,0L ,a {8gdKOOZK0+8K` d@gS Y:0xU}!-31J0{R}9Ys4I$T%C!k $΄~!tPA-aA̦,fje'm0EsETY2[^Cn8*A,8E]~j -Cv]%>s0Wrgd+ESj2)WY]-+;吒cxt,gG+V jl0HYo>B./?ɘn||xBqr-!艺Ta0iI0-|trahC.Sұz;.tZW(.JsLa0  /im^ -DP'L of Gգ. U1=e!seh'VS]zΛE(UPaeG4ynK`ZE7I!7ADsƖ(*M[Ő>FD}>C}f #MZMQ @[Ԕt#DZ.PL|S{א8m pJEÊH8-Kbю:!{B6yzLV:8IU :"48 w\+ʥ`\},Qdz3ed "mM yi`%PD7l.|g -lr.ftK5/w&K;C>v\V@j6IX|o ;iF$ a>U`2B~YO{K.&j_DCclp0%ef|1kC8gH<Bq1ķ,aߠ#AӴVaaj]CA }L{"]/Tp/`x2 ZKYC4TeP1/t:Ydv;>kNZJe7p=#C\( Y8SVE~5ߢ|U!O`(V㞝%!1ؖS1=Ҍk CşOs|99 %RRJ)-`UæG|&鱁u9#dzb Px DOZO¢˕^v=|JWۘB33aFO8]zT!%vbaMwɊ&gz߰ LgFz^:wDiS&,-#,1~":0x4;t l9O#~yI;)Y򌒌دYҤd[2 c.4:NL56fF=7&fx-W07.̝SV0Nuw13`HCi>~M+Pq\ D]^'On6.WXoaƓUhju%/*`* m!o )IG`Fi^zZɐ~,\3 ϻ3E=sx,;\Œl}F| OA$͎1.u.#]6rOq-OؼҕY}a]{L\P -,lsH`FҊ(ތ c(7[ƾT -sJZˀqT®$/AE$rl0n1dy\u6q ';آTb)K%˖0*W<˦@0Bi -bl D4 '%`}la0+$ Ӣ"7oSP h @TwD彐 0'kwaQ`b0UpLt / s$(R[īOup{!DP/;; - - nSkaP ) q܅A:$ gWFqD|12X=vlxӝUd'T ~%Z.+B9#6d?,SjP` #b# 눳JĬ\j*f )x< Fw^L̍Fn~Hb9bM -+'ӓa:.MZ}ٌ;:jBtWG$!ô]j3θ= o)vy0-3xfg18nǼC^ԬBQJ0 @ydLX,!R#! eDˤ+W@;A fQK2-$6v'_]YE3AmJ11Y{Zzy]܎ʷ8ӟ2 -&)NS_Kk~0?|cO4:X2w$=1v#h[0Nz J5?tyŔ+j"Xgd4^=-$&ω25G0z_`Qg5{'9(II~LsG%&FN--wlL nȥZqs%7M4Q;QU<c0YKLWRq,0AFkYcE2l=(f\oړ( r?ʜ!9# ZXɯtFnwsyxzcu8b 13'bIaf0ka$4"q4zU%OXuzCPہ@\`٩ƥeG3K5*ƥ,k`L>}Ӑ&;6!ͧԭT-"g2wcHƘ%6֓& UZa=J{?JA[&ܾ~|L>ĎԽȰ9!#X][@$176o6$e,_1B+FU%uy(sAo JfbŒyZ;̦@<o[0ФC$o.6 IjM -*Rq*>W /<DBK sDlǽD f :d!R-&ȅq'J4(ՅQ$*EP&2DU Fdr[jdr, 1s?,HIŻ -UֵQ$~ϣ L -~[@24R%Bs8Uy,ٖxO&`NmKcmyWuaȊ:E1Q$iǷENr@0u4a3Zr1({fE y" -Y"hxZɁ=LMpM̘ 59>bAL:Q܎u.`FDDiD3r }CPS/Z[m`{&E- !)$ \s rhl; WYVF- y&F-0u4פ3Dezr/B9V\4@^Ȕ!1W3Տ]^R&KÜM A\6@(S,waLgks, N)O\&ZL o> "YxE4%Ls0‰qdB3Lh]åA+}(j +a|YmEka9kI$: r9$wF\+&Һ:rObӫ5ȴ)zc ~̨ѥ')XhX잡5J4 -|U_ -}xsAwLx]s6F?01jR=MQOa `O#~8.tv2mqS x7TCd -zýƯP#W:bAeGf*~/>陮:q,Kp

%{!pî_U{2\>͓Qź]PJP)u\7A -y-cw;wByX>DK( : CfhT?2ű[EYg+Vg~:&9J0HьmJVsF gWЈkB% F b9n۶YR|ĆRHc[ `zmD;}Jh*4xJ@se9y+LSFG'AIT}-LcZmUmw5"8!VyOǽI@0;}̸oGv|ԓu,syPumhC:v&޾ 3*&56D1? nn{=1OR-T;'<ǽnB3I<؊ROXg;T$m7|:-nk`,QΜC)Tk]+W g&슛h>=L?80U{aUa>o0D9>}/kdzev0eC APPŢP>~.++0Te'>=mHUBٲ -b({a蘊*c,b8:"=KôHĸX40>B!& -kQ7$޽0FZ0(!֫m̠TNhJv0JYHzbt`ZhƁ`fAB_}hC/9XȘ {GAB$|P:1ݷ 'ӚcE 6i6@ DN@-sI$)i2{ 9% FREy_\ `b[f@m/l$U|Pv]vƭbĘ[q'x6v-1> 7T# õ2ee,hZգkrQ+*iz0 V^'A01 Fļt8MyT!uk-l5B7{/Kž( ]ѷ~F\c(|[G6\wJHH -Nggش'[LzZǥ`f&)pu8=0#p~=R`zjfrj"0J1>[pYO~<G xI7ALv=,݂qdgcI%L&t2]VP ѷo%q4YkHf#–q'~WќsaZ=}cՖO-YRGtt3щ #ow![ M_|ЉUtUIs{Cx9+[펛Jzq!+3y{c)pRX8Fj}G_R(mDt{W0.q[Rm0{I'{|-vb𐨩Mt` &xXJi5c0O3XKr6}9Io>'P={yq >"F/ y!I3+B!17&E$+sλ1j?b{D̼k ފ(0)Ĭi0ULǻ@gRMWѢ<тpyc^V=;(?Aⴭ}֑ B&@Aߪ]uơiHS껬K -K(\{mgu\wn,TT7Ɣƛ=QZ0:;w$G CKxQۊ#0T.~ö~vґw Yh1z!RF>X 31>mc249$gaj &:*sG>:#ʒy*7Bs:\mXc>6L杂pR;151gѕh-Xkg62J BU9|ӧ-dqOҐs,DuL'&Қ4]|w,Vԝ1{g”DM>^ rR<=GXp- [ӓqޥOlD쯷٩qT4yæ0$x焗G4hzw0-.Kt1_I3`i & ?ckaFb}0LL Y ucDu91q' *#9 :F*3=?L&'\Fx+X$}pU׺J" zTL)+ҔT: -P-Iט^Q7. $w.0;B~C9EQ4ze+rH|1@+׼龈@9s4oă gq|6>wq-LE0rXӢG>[b "_nj0Lq^+bt * v -kcI؀q]hm, Hz12bƙCh^Ս7O83 > >,3oz*t3*Eʞ!!jkaN SΤ(6-d~Ӓ( )JQ`(p;:ERKGİ^k+qsoP7&Q2Ns0{-*tZ`T3뜻'Y*~׸=5ĎPS3Wl3_;F< !jn\Nv<)C Y3rm|O2G$ʚs A5&<k!\϶sE!,O|49cA w2f*J="wU* zJ@ɔň3L3&`2ukP1)jK=Kq0D qY'5vr`h4ƶDMt Ƌ8 'h0yF>p[u~pEH`MHYs/e4L-K} mBʌ7F_jbNNV¢hHM @h+ -qyZXbb0ΎlL=AϹ1#E'\Icݘ$!#gc &iѕ -ka؀ 2ZΜ-uƖݣia$iOXOg!D;lmA 8HᙕJ#V=>Gg$QFչ$D`@$31mc7 o 1*k˯X$Ɠ+SaEȐƌzϕo f 9a\>x5Shf錹p! 3+#kx_wqH&76YFĭU5$g2wcӈύ1KdM53úl߬~N;;+UTu5f≊}yuj í2K- -:0;+!7Z eR׷BI{ß&-'gù5q/4l ps]-cjPݘMNZδb`DUT>9Q9gI&zc+7sZ)Ujͦc GڀM&n'ȕI5,E% ?U[Yӓ`WxaQKw?qzvBHu>+SK2?u7.Ko\SG Ew I=GUc)S 2\P qÁܜ>!LGgYT Dvϱbi'؛sM -13lk^ю4WO0:k X{!V={aC'JB)$g~Ƽ1̱` =QB;V4R#*ǀQ8s,S\WdF}k2]Ex`"E\s{0jBe[Egxxabya60oHۿTvIr0!!;]af[WGsjS?|~H蟩2YLVxIxҢ,N]&;\1r0KN;]lӨV6$apD?4˝<8p=<\Y_C6wxOz$ m}5줍ZCaϽ~^awa>c<Ԥ{">ddx9|#>Fq\8e8'poD=1RBo\-$, *sr!j00FgıRJ_/8.B*h |/LS@ՙ)f W(_ ov^Nfp]4wFoWC)AqŖxr=\T8i-cyW-4t. USWkSnnٓМ %/$p Yt^Fۿtj7NRr,=a`41=܂i)91^ I[g҄Zl=CNH[5Lhb;U:'3f#;Kc`Mx]]uf2ousaB Өc8Ѧ͝de)k0g`^|y&TrLH`.6͓ŔY{/\EM{X繓\K:Qu)BUkN9Čۍ`8br=^z ,5w\b*UZ&g>զG(9:Yuns{@ΘUSb޺[Xfbj"9H84434w%uD1za`,ٷ -8R#695p X׷}@*wҧB4^=}#LoamiqDrɤ:6V_1vW#Ut0D 8 -njnY'ȎzgF>G^=6^6:T$4l̡f `fOG^w̓T # qm@g~1]-Y< d 5׷NZa`0(gNڊd1<"*8ĕ`pe}2}vM4\~7` G^@$_27颜m',qe~0eC}eϡ!xs"Ǣ> SP~.++0Te'>}HUBٲ -b(ka蘊*c,b8:"=KHqǸX40>m -kQ7$$,{/da`ɣX[ߘAeP7Zsa0{#ҁ9Z[hƁ`fAB_}h|C/9XȘ {GAB$|P:1ݷ 'ӚcE <6i6@ DN@-sI$)7թd&X!>9% FREy_\ `b[f@m/l$U5;W[OcboŝnB <3 P$ ˔ᗱ0i]=^QOCplu`Dw3ƹ0lʭ wKka{AX* DqfEsY7Onap9k+ !)S;=<;Ʀ%d<7X.{ɤu\ fFmr ^ 3 3A./ $]V8@LN-òRFI7rm G[ǃ0ψ/f0Ty;}-K`8YřXRɞ^~ -&c:c.+4T04E&BC[d yM5rW^T aK޸~UќsaZ=}c՞O(Ҭ!UF!9UO F#Ō(sEx%U'R"b!20@a*z}G?޹o-)O+15qL+^|bf.*8vbbN#apC-W B a1ef=fJ\!Q0%^C)ۛp"y/DpDJc!LAbf# 6<3>2.Í ggO*pּ;~bs FRm_C ȸL.FJs1]V1kD ^9o^Lw{JLgOJ ixi!xx;0*/<M]{_7?>COS?cNi8F'i,q`SVу7c)#NaAcuI?^sŐ0@MI[<֋'1g1J.;4C;1j`欄n6#k~F scM̊"s},Qa$5ybZlAt ģ/&OC\dDȱO*U!:gGTwhp>|Hʜ^ZCu}.7HI($S󕻚_Ieb];tUkl ǎ 4HU|W W` -I=: L+pfRσYͲAc>s<7iv1}:)SX).B]"aЮO/(OS"tESqZs$f4`JspX -t#H-@HK[1:m]e5Sqծ\=H3ɠIBrx֎<+_q]C{$|oc2abW*J^Qq@W1I4ˀ9yk0)K#V>%+(ٴeh& Gkjr4ͷM:鈁8"dž3c4 - -E `q; ,}bh oU8De{!CnԝВ~guLv(W>_d V)0;sa1ABGt` sLQ#V/CW3aGΎs @Ũ#0zzF68D#f,5*'Zi~#@("2gAW[Y4RTGxU1:,$LTSՈadF8:÷dbJYm`4Zby6Ũn9>'ť~,מ]9Evfc{+H~bx? \;-fQĐNlZYH 4 ]@%CL v%f ũ1MGp#f=8G*~gyEhFW10auYB1c;WG8+1}G0kRr;m$A*qe?El -⊙L6`xbE= &͎`Ob8 1CoE;B󎠌H3}Մ!b40r#1;VѸS?(@Q1h6:AȲ•OHNLRo)Kƃuyd423P"U>,FW:2Aߏ`=:,2;YntM @? Ƣ) md= |.<56[ ǰ ;}H̲J|-cp>̊%~OaB31.FM-J/wx׺ĆofbMUȶ!*=11X= Q1`ޡ祈'pagk vao.%0=cʀY^b -Sb|x3P:䆴.m;;#{!zsi' ȗz0uq\6捁bQaj8 ck}@ HZR/Zq FøeoTXƑ*Ɔ_˔HYLJ5qbmYH׍Yf2\jy:'P̖<3%B{PL;nƬIEPKe`)]V3F (r {&f:tWYX:jWW|O^pcύu82 ->)/-cAhRx (᭎ቑKtrm}? HҦ@GG kKϣC06<HJbl =tI=mĨv~ୢ,T ^7=@sdii;Vq+1\8$q06#40TX&j[b3:"CMa{L+l *g5j^Sӎacyg'/ CY+> K 20ʉY؉ 0D] ۨ((`v3{ttE`'@ig -q;X5~iMB; otbx;hIs&{6^)MZKK G3daU !u3&;`LX*J@tzS TUutL<1`\]$w?+ &RhrW&CADC#+yk` ;!d+ 2 (|0Kb "cww`*Y`]sV(Ksyg;XwߓWQu"-8P<8;cEݧ৑f|aB|T6W|r RM IET#--Mzz*DxFF=*1M s2w7ođ1v><!sc11@shG:8a|3^wgYLlߝMd79/^K}tДa.b}Ś54PeraN0f0ocE)iA+x:> |f H:_9=UT -fg';)pfPr-N2$ -5H~c&W\:3M~v a0VF*``0׬;XDݡ ǁ4ew%"V?0qS#_҃kܹ($séxh?KzsF~λ8.iֈw } [A2i;a1^lfI5 R=?ep_ꀐv0s%s`;;aXt /-j GwW k/1ܥ2HgJT"Hח^2<seyX.BJ 5PU#TM녂&5Ix.rZ?Ԁpr+ -Pk| -Pa(>LS??1¬LaxfY 4 %0MO^nf$XLdA_ cf"'w:[0Q'/.-3bap|^0;$fޯ&f 1sT@z݅90v6EuaSda0LEg'>I =:$ - b -(>G Y`VaG4-k _/pqm(\utZsAJ)^0ǘXuCby;+k.6 NLԗAu( !:Lnq.L<opS|) MIIcXQt0W4'ZMmu_qOEx@z.TLg)7HkbX3^>$Ԥ㢙B8φ1cV-O^Z!Q/3/~בJ)Xz1szlaSc#C|\a0=Y>_Ә5'w(F7hcbhLˆng A(ފA +=\҃1l1f0}4tga$(|B+ KdI= SCUQE0Eٰ0a$S cDY c*`#@;>ұ'fT -VªVE3FHña:`X6s-LIu0T ^W."[SLa͆ )BFN5?Ydu \̭AH6ň]nMɖ"]?' бo1H1 ّQ%3܄Vp4(HT,=")Eha xc3j[(@ BI|DʉR+8f[NXI W>$1heD~)gÕSuY5~1N7g05:c7ƒfKBV)+KHgYt*Į?#n &&d%Vx3]t~M%pR027_u2Gʇ!q <2m,zIVvg1:K^GøcrX0zL3mm|Q]IE,N2M0gޘ'J]\YT~!EjW_.gb$'6JS3NEEjM2 -cNJ„@ ~:{B+i%yZ˼6gc2.#MVKl;^Œ^tD탱d&h%ڭ/ -sԚ2I_ 6Ng*1]1!|>8oMVտ+b]7s8_0l,<ƪey21F'sי0x}6Li NOe2s0Z鱿*QĶ0l/Sأ`zDpЪOs:T30gtUQԹf?#8m yFPC*+gLl 42#LH ^>=g1=QeD`8~&nLr0%౾#'c T ]gzěn-;Bgi$+0|NQ9=ox,*`08L'c'fa, Sgc=lcI"X*P awFdv7#5ɒa(۵&n^5uPodXGeE[_$ߞ^W:T'&Ci~>4 -3 KgL{ A:p_@숾'U P߷I{z04osssdzQz|x4&Lq~şϯ7?s~,.j9+?ԜMsbzHZ00u-/4]5#t d\>dN`2 QKU8wQ|~ƆK#h6=~ - gajzmͮ}cg&X(_O*Q#6瞋Jgc)6]|vЕ=PQ†/L;`]'u;](剧IFm34#e üqDSW34)sO|9Ҙgܜ+) -ݟ瞺qsWymOQG&cC]pC8NxcQ+97w}8;B0Ӿ)R9Fڞ702%Jܿe`69H>͸xי'9%I7&y6њl̝pP\}z.F@{º>@Y+}|#8F3<=MGXw]$4d+6CP@ܼE1s p]ɳ&q"-NY[jE5I)fkp#B1X?<))`dcGMٳ :ǜ{[IE\mYDZ,kL3=s?C!=cA$.,+^<1WU>M{[mKٟJB㴑xJr,R }x^AV0\b BO_f.Jab]fmۀQv"1F*@QLی=,cz~Z$tigA:V'ぅ\N8C #;qBFCvoHI&u|F9M]T:RrC0>ar!'e.|S{;0 @\}¯mcu[""Ư<&t0GWUȐ[OǿcAW ͡/tEGwX=ijhR -Q;kW3)Sz+35_4#JԾ%%C?o\pXMS) -?zi;xCNǺsvK@AԲ#(H->aݢy>!TşhiDk ?cb{Jƒ"_̘u&gT7m}_mٚJW| kj?@Ig{ st1%>&QwRk)Z>P盭b}㯳dQ; 0:{|Y( d&Rׄ&وVL)L -ճFc"o> Z|rO\_2}&Ynyr FMg>oѕ>߹CpO0W\?0Y7лu֥?"%h] e|CM^s˩Tz6!|ĜPy¤$oאַ+nP˝gw"B\)f$ax>R%UB> %ێ`qV(̑R%ٙ!2&v90涮 -&PY;-fiUaU3(da{)db(îhc<Ǩ8ͦ"afu9gV2rK&&a]>B*1K{PM>$gy6Q8B~ƾɾ TvG 0Ǒ2XٚUt;1)S=[G8C4~CG rN(IN>jW* ϖx51[! ;kĘC|1x~kd-q¨ :tNLєzv /wy6zVafeR_UEk00N K1Q&qd( GN_%YV90Fv}colnwE/15=AufobSa]?uC7TjU\&1vcޙE$UN KðǺ4.7f R0pA kРkb({̗qȅ/oӠǸvoQ]*a*c9#Snۖn`Τ*5_$o8t5W:a3 4, e_ w8TqVRٛvEyH= 3ۈXe܇2XJ~߱+p-S4aQt{N2W,&w޵c[X7(r؎VPKu: yI׀׋T^[ oT-&9+=Ajּ)oYe_G0v$<>0bҕYbK|x&.cTw$j'e#0VV,8J9mYe 5R åP61gs7:"aINVZ-Tp暚/맦;f\wWHĠ%F@LrRA H{> !]$pVyt5>?#] zzv&T(aٮ4+07yx+'6W+ 3e΂+M:<-6z&TcUaH]fg@@`;*Rm~LZZSwa'f{X%^]5!jE,ja 術 ,<w -DU{Bd74,2:LLAh.Xe;_׸1qP\cωE{# ">)ÕOR߉^eoWq'ޟoi2n쓡 -#13!yo̻Qoh|!5cS)1g -;Nt8 \qf_s^rLo:ot+=ya߯[lk{TT s1'+^0AzQF}) 4ɠ9kaqy0 ~.(jS%VJ0+znTN{D s_+#QԴ ka=4e7/wѵjygkXݦW`{Dxc4?%4Bs<{M7"UQEaz&AbHN%K5Q -L;11D" kBdF14l%IE!&ޑXHXH 1 0҈g5ƔU͌85FdW;IojQ/Sy%j^γTY9;5nfsPSAK_ңKZY&IA6wy*Z $d]$ ,-Ŕ@8x /A9Μq[:J7ʺ;9*i]^tc֌n -j!LM*o3:y`q 'S(ҰÇo-7T=sٙ!âs<yh UM\/p?ŜP(bm].鋤|,R$>ٮ9!ӘwseqiZ~!1pxDRLLEgN`xnV(0 Qj 9jgspE\~&NXhV ,*f&4CX|X.B85Pi"|v<"l -ⓩ=$)גSx!zPj@xs -J1 Pa(.oʟfaV&Sz]6C~a18~``I bStdOnfF0`m,+OUZL`&&Y#DB5ZQ6@ߌV*{y d{u敆0``n I-;N*y{X5pa췕3 -l)GwGnhSJ0rY*J`TW斤}wI j5Ii1QiH[9ԡgob D7]bV@JWCw(kat Csh3:ɰu= ڙ!2b0LEMI.bl˦]nAXtj6Tfߐ<e( U U`M|԰Ch5M=@p6(Xuzr }̡bdA4{N;h6h@I1 D-r0z ̛xSiDIð(tt0CMb %F~hӅ>zf!8b8*T0Dn`Tg`Uh5b*QH& Lv!ԎK$f2F <`GkdXxJ*D7םXOc"vLh@72if1pJ~$L?N'8PtfMc% sIa3~1U) -t3'\itMW2躍LJC3;9 SC9c9Fz+$Hr R.tBMm !t1 -;D`kJ6i^CO%j KL=S*BLjc) ^F3TB8fL}Q(TZ p,(-dQ DJ+b6iH'!  -s`ExjCwdKLGAx _A`(2$H#"b5쑘!tXTcuBQ垇-~+S{R#4N< /DPCTF_qA7Lu0(ZˋuSSb wT@X_b*#H{^sdX rჀ:Gx[|Y{$q_OSY7|4Rbb'0$LSY sasxG@A%`<3D:RSKJt`fw@ܝbݷI] Hp[SwLmXϞcC50} /=4FD,`C`pK:pwS\8ϾŠ|$rE}w= 14*jLRkߏ?O?;|O~~~rzˮH%qbSqX]!(%3US `I73 '_3KkaJGwu 3,je"6쫩j<ZaYS~d~=%7S$IT$_ݧ(Kؒ/Rl\N_q0 -҃JDQz2S5}4]DכKY-z\E\G@Cli_=_:Gl\9 #A%89]]#ȯ0Ry ‚/NxI϶W,JOgaMwr3g>0s*^֒sbQ!!b,4)+Jram^h4P8 B)I UQ -"Mؕ }NL7[ ʻc6 ^H -FM8ckA9dyw˰BEP)MNۣ=6Ku ^v%)p`BMڒ2:8EDiiw6S0JpDhʡ)׻ (F 02AE]~Z>̚Kָ8./`D)&ѻu ]NFJR&p.6n d(혰DR}?3=*tlŶ]sd\Wj endstream endobj 22 0 obj <>stream -HLc7 #p@E$oǧڵ[i{gϜs,o\3V_L(U{1b"X$2Wxm֎5Ŭme¤uW|1wF)k[񕕵bd0sG{9j,Lj_ճj^. Uq{E^Lw[- m6A^̴ms݂tof׸G 2nd;6t̜/f{6 zo>N2` rfOb*wE}0aكܓ)Pk0.ATT*F8.#L׏&Ni?rjP_P)8;P; ^ޓN~m2FZתE&'hL:TynS0179{74FYS_Sgd]XS3_> ˧v/L _ǩ6Tk/f6?n26`=p{ ?:Ks0L&5O*8p043AzWŀ3 `)6CÜ*96ý[ck2%R:(tM]KH\߁ЉbP_Jε㐊R͕r)F)Q<1֔)j閯BHIHiJ"6ue(+,F ƫ?gu Y0lpT=B(LAHm H_Y9®iF>qq Fr78 Lpa~ !2>؈-a0AT#b ZV 1EN!W0g3sDHγRpK_3Ec/Hy>s8abtN08t*n i -o0XgI7q1vd20R,݋; bL2Uc| '$jK؇biKFԆU×$_H;Q>czbO%~lǽAɤҶ`3zZ_u@q*Vc1)L S&3)͠ -p.8{KR &TE}9H 1ot^+mѕOma7*ZWBI԰5\%&Ä-N\z֝?Zxb& ˹9@oK,7&I5\?kn T|7x.LNZ_Q'Iڗ%85(Ԙ 6sW gr}GɜY.~^N;_c-롨a܆\g<ڣC68{$R l!%5-;dLYaal}-^` )1?LBQRB曱]~Dl ܨoCg]9 0n3uueOfC$:*j/}Si(:(:}J܍¨Qo0#jR7a.J S"k|`% N0N1 #nFکWVo%We%+-繂Y2Ӈi .<ϲΊ5YܸNgۄ1=ܣW{M0FC{R5yםЖ{ExW´8厶޸(ajY}׷0z):6q֞QzHE`32?-(y_DUuX0/3u)sKnci\Ϊq9eIºޕAZ"CgMY,i% _+J1mό?R] | "0, 3})C.-oX;U[ھF@P( cB܇MI8_RRf ,>g>`MaBP;*17ajڠ`?uWcK뢣`LUvVFoKBztDŽ#WHTۂZcJ>$J8#@ ҅$aN\Q3|[+X, fZ =Y -0(ݹB lcTrʁXEJfXR /!MIaa;E0H\m YB+Gj[ūp%EW$.#ۧkC -S; -Ȇ{curI(0#oP0fYV,.mcTfHZ2HS݅wdoL:~2\[U`UL_/>D}aujx9eY7m%6\y?zCfV𒑐Dd ԛ8 IP"FAG|Iw#k^*}wo0$ MK>v_<0vE:[IrGSZhJEz!l[`<\x2# -2%J'/nd,l Zgg嚼ɥӤv7*018]`f -*Yf;^2+`2Ky\Vè_}$_;f_Ĉvo>Djzc2: #1h!^6u{6.^7r wH8X@\",j.o0XAMcb.X3+f,Ag{s>`( Ǝ##;qK3WԸ2- \xŷ|K sN0O.(9PUrEL7FLLF`J:=GK95'`YrXi}EvYIE۝ú/im޲tmCPg$Oף+Tc#lk -iruZ}6&c`z? a21 -\T:2}ZBI0f3==(_<)pv9&mCT񇡃I(q*JS;EIO0'=6DIw-W_߉7a8`FT6svCh y0='{z g\)Ru a5Gyfl0y2,O!G3EB\}CM(t!)A Iz״zY%ĩf.:Ap  -M~UYxVXaZj i(͔oYΖmo<08cU0.;wۏpxM#ifSU$YsHY`&Բ\o/OQ0Eo}vIY)Ӆ_uL^lTA[vKZ 4mo۵>1TB |YgT\ȇ7%ǿ4I 3a\#xјhм՗b# 9àϙ{Xiu1wJKbtu~K)&L֢+9=Oͥ. -W{$ųC*[H4jXDy#ͪ-Iif0q˔WSUsbQlguݓ|L<0D:LYrdddY*٫* ؊8sR- zK:ߜ^I @&5}5o:zNx\PܟwbJbS1* -Nq/j d`$=lJ(GlL!vDtiM{x,@X*lXorkFm׉j輭Oɉ[\"6KNjua`dQń#ƾ%rsa1dD,$2ᑭumz|#.b<#]e}Pi]ؼ#!-J=Si2;n凟?ӏҏ~O퓘[OVKD UJ4~|×<(cXN+K -Q-V5U?}#&rLl$w,gď -?Ldz'G^4Zo%ّ:]&}'l 昢R2/w`PaHi3ջƷ[ 3VZ''a&&"ev\#c]c+12f l0W_\`Qt,03OK$W ɉvjcD -[i-OI`eOE#9d&EII0F#IǐiJEɭ5LM2]+// f'D?pWm3-S.ycZ̖nrXv s$TlXxNG/ y8;aF֡2T}}V$5c؍j!+gP)@g [/= `rf/5HL!%ȳ |f g0 .KF( zr*Dy `I!1Yd yur6vmk{lW,*$lgMЛX0_gzM-!^ɤ/Փ=AƠ~X빼Z9z0OL || Q:9$)|ɼ?㍁F˅e7n^Q aXu>qM%]T}C.yNf~|:e2#K~j A4N߉ᑾN/֧階O hoD fR=Y:'<H1`d[/7?1#Q+QmO`!|>$jƇ |{t bC]H`lZV垅h0٢HCxՑu,ZߊXO(R&1l&HncU:NLm3dH׌9%q Ts%$F]f1&# @'=^.[ <`8{cD`Jzi-=dP)CdYqhk'kbcCκ*ZַVfېZBЄȂРL6\3Z'erQ<޼fzrFۆA!:&!Uc!a[lZB]1WvuR~`0t%ٍ#A݊V\LPIN iDy7eJ)1g%= 1h0-c_{J=%b-V7!fQ6G|hPΕL ﲮ eEWTլdg=ٵA$b<bWpM^AH;yM1qF?It-!ff2^~Z=7`%c0:߬/^A5,A+AGe Gt%:FLRQ=;Lmھsd_ a --Qsd>_-"| -)*"DxdCzu)Eo -ue"d1q3x9rTvpL X&9,ML!}0o:k:Cv211Q[Jψ7:erCZSo+_d$o/)O9=% Ču9˜Ww1i)?.래u"9ƉgG-݃ӅuYYl^bo|8Z$ͽ<c}:19yލp+:\Ͷ&HI2@Iq'80R?GS1*~e*ҹCTzVA'FbKӬgz7^B#a%=NW!a'c@xKwxWݪu. doϛ _wՇ8L1p>1{Ϲ^Aboya`̫ȉ珷:GG~Pa蚁lĘ !Z4p$>ʱ FeWb_݂q[ooTم4Nmv>t}tAXs8[3sa4r=bŔe&7T=TDNK<cp<_lZ>ٟ 2ot+M*)%׾QuyK()h50c]B'Y;\͸֯W<jpB 7ي%)ƅkͺf[28~]9>r=&'KaMŶ7Kth \3z\'ƃ[r[ɜ _ ΆwS٦mfux(jbؼӰc/Kc:/*>lS J̲VCjS< -a=֚EZ^`Xgb_LPen7c; {?513[kӗQ 8rc ͨ&4eOfB`כϳd 2^"} -˶~lFa#jSxY'f\*̒{]|̠V= CxsJkBq7 -ުZ7҈oJ㯴8s2哛{{e)G}w8Nsmh퓛縶ф!7h='[jgpV1Ww=0[No)m8.JakjcﱖVPakQE?{ר0Z_+h~MGǙs7'İA )S{52fP9\Ƚٸie,RrDkE 0`sbVÐ/.Z,Һo9ޙ21…m(O /Zだc w6rnJ s|IɚM P{x|ƃx9ݷa -qM:laey<B:k CGCˆ0 "oƽ'ly/SA92{_kI2aO/.;3ꄩ8TJ_ 2J(Lێ0(_d5 2Kpigƈ":P4B]Ee q$'cs#UiƮE^68 -SNczS6Sa׷He\ -naLFv_$6iQa.Kag ٺ)l1?6"L. -XTuQ@+;pP <w #m1-~!Q^]d&N~3۠aJX,^+3s[~!=ܹ+ -y19a61ZJ91!XR /!˛¬ fz*Fb@>u8Raxǽz^B+"k~Sūp%EgW۫kS фob1 :?;ƾXVb27ξߤ}0Ey`zۨfu=K6;T{z#h=+xHHwb,Œx^C=őg?1_N$\hc6:j;H>c=)̡Bѿ2]}P1i g31+ʵc=P4e6QVZI]g0-%q(՟DQz F{K玌 -yF~Y^ uTXgR:Ph =H$`zj;?xFJ -%霌, MwnZ@-W[:RzT-u6}[veFjM (܃}kř|vqk Kܰә0jtxQ=uϑ.4oi1 YhkgJr]): a #{tcsF@;zb)I,CelBB}'N=;@aΗ\.J(vddħX qL2OTtqm9(2X]&7[E82=TN'L](2g2m{mUJNJ;{:y=IoJI @ϾL7I-fY'}{%m9n%wJW#d[lUVfkj\p.=GlrZ}kcB ǢsKkb!i^TDZl[L?Ǫi}mDކc8,wJ'@N񃐅IG\3Lca2 n Y#Nry3DumۺC&Gk[;!, -{bD"W>'#YR~?Ͽo|[?>7?l> Œ4c}r3i;{P)ӣXaʯ-a[z F*e\Nnޓ8ѐL׹NȢSwbfOp(I0HC2n ʮALx޽Ԇj>s|q=$ʹYe(FDTo=W"!qWǍу,QaZzPniVt4XuxE> CΠܐns'< GtߘK$IE*$ tq_<&(^Lj đZ+Ǹ#_֦ة4K>+^ACVZhP. ˳Sm>r .˾06Q[XF!OzxUFX Im8!%a\NcO~s!%r( q)-o=n5:wAI*yf( 81(M1IhU:>+ȗǦr_2>U={<{rfc"k?F\{ $BU1_#WY>-P -Vgד4^t6VӧyNB.imnDM'W['LyC*rc 93 FT9Oiܵt[iea$jnM u\1NJL"iw< ks8fu:apLgߵ/{=EZ &ĉZ#jɓ"ub"ijZ'F$҄k~3uKQ/LZQ P# uވX0gy]bÝ0jo<px0̩٦o(gX,&:gյRq#(=1*@=b _9jl -"OA(h -T($/ic+\qٟu)[BD.*6_imvkQ(>{{Q -|IȣϟChRz*~m:ON`bTklA{pU->Xgi-&_ykޢp8"c̎p)oٯLVS:<ԙQ -B=(YHvaoAuM<60i흈RAoNֵ[ Jƭ=3ܾc[f|&]q>; >>0|ʛzx?K:aO_}*Fe2$.|'Kj:?=&QSZ$Xo!)VƐJ 鞈)Y$zz, c5T0ƥTnZ"dRXcyZ\2%@X71΄(( k/$f:MVH: :6;}`z? -x'g`gJh^i%t7b}0{Yi8丷`<)_CsY|I.}9L$c=O/W CKΈ;,:}ڦ)"eFȽ#]gٕ@@%cWA1wT~gz7y\O`B~ٳf.Nv(\5-#bּ8KFA1\v94wG%D ސ1zǾamOW0ʉ~q { kk. u EV?[T όbGc#wz)oPxS o$FK)N &K&E+Z}D{2S[_2GB0WQtcwab4i0"EL5覡|~NCV9F鯑j~g7!wv$+\` 6s.(k<ƅ_c􂚱;ns;,;:BE̵0w3cq41l˕^DYU5;%V^;tF]  oNM,!u#K=_{a#xO9y`">=Tc1~%f`U_1Kɕ6*k׳ZQ$h\ =oυ&7Xvsas)eEe+Džї|{_[\!YȌ?ŝ>`.CŽ8JKCS->h[p_C"A5/ 3Kp01 E;Y iéas -'M]4hxLbgFT\ -hS?´"22wAuT%!76-7\LiBr`|9r\}`ݾeLT{BĸY2~FQX+j^ XVH7"Y'~w_/l_T_laZ,L|OG< oczl^k(!93u:!q:9gQ+h}}y ̸|wY8ogcyd5;YuXδ~FaBUFW0W M.  \߳XLjj%ҘQW=~υ%e\NZS -cl#Pqm R&jd -M呚a懹Bg0ϑOe+̋;0d%s,qVKQҞY1 -_Sl'ama~J?1\q:QC7>L}`T;XeN8sЕNé Qj ǘOy¤" <佶F!h a, y.l֌1,x$r*^a8HS>uW)5濿8%Ų;g$h({υ$;ث_>k;fgD;GzXCG}TUf<##'`#j;8;FḴd␬vY|iZeokfO]qJI B*8n-BG7Rs:t1DiǻN%,@ݱn0M}(0eϗN`8WhYXf ėrD#חI>O?ً -TDezVnoQt5\gd)oeFhK^!;]eGLab`rmH™H%qJfUҝ%f[? 5z){{A%Duo3.߸GۇтY0_n?m>096scD9\ E9 ;-E-2M}ěr' -rbo3?[}SOV"r2 -{& u8퉫PeTqut;ZXOg<7ߘڬsLH5R}ejp*Yȼ^lDuglom'Ru{f^}1Xu7(XL}{z[ -5Y=U3{|!X~?XvPQcRK c8"t᜞յdcNndTVK[ y!% ;>όgu$|1<[GfFHXc E+ >6:whԃh`Ha_ ",wΤM_ݳFG7r(kg.9~М)Wrp7/ƃff yJ> ct1S {`azI$/F=_ꙶH<p++]Wwl/۩@:Z-DgޡCPaB")&B\8cD}֚Hg5 @E>@ Q↉/y+*& ;_{K{YAJ8ڮg#=՜؋F_t9{AX;9 'θuąJcEh5=)~ -X!C&: -v+KE ԕqJ]-*['d^Ӯ0ڴMxxgPLxS$50u3M CQ,zai&-9רqHLp.Fozh}ۏq)ka~<|=*K ύq~}Dzqa6/9xc x>艼U(^1"}ܐ ` *n(@k@4ba]8k28z=*OĢ;g-Mڼލ8XsCd`A'*M!F.uPLuv -T'1EBdupQb2Qq$JobsQm/@ -3CL0t`ˎ ;| -!gi0(IS,:LK)G`;Y$1^+~yt)sH~¼4-?Љ ) k鑊I ۜFŠv/05ֱf668 iC鐳r#Oi6m*:yl-U("CBc;WbO35z}!=9 OjMv3h4`_ҥ~Zf38O`[U -U̮\DQ<~U! MƲ&^Td?@4~OXBTxU`פjZr/IaB፧$iEFƃacJl阅wσW$n=֔/``oYit}#LLӢg}i}ECYx_4/q"Qnj=4p2XkjC|34Js,% :ρ/x g/ʆb:w1Nq)F3"o2ΌӃRP -xlddQʬ/YK*ϵ@-&6&PZ KJ4/Fꃢg -~N t6MP*@~]96$fu6\}Bsq0l2nX mX~NÕa RF0L MZNl1<; V'pP{2= -FFM4mo7KELbuƲ*}3Dɵ1yi\uiGO .gL)ď%$I4scS6d`f؂Їrirdy,3Bň_wT>3jV%V^;tFnLWi 7&zH"Ϻ%ՖW6tnUjS7 &csKu`#ïDBW+f)ZZWvzvK+{"4ƕ1DJS`˟Ю6f>gRf\l1ҿ8^6pzH 2#ϡtq'cQ l1(v5 (/ M -ԯ>:n]Hl̽3P\PgMOw0̷ch9nzŒFS1-Ɋ)hDť6nLM!"351 -M!JBd3o0l+Zn{c2 =-Gp}Qwn-ezM?.'͒qF3jl26M?`ظ9pbY-#gc[YMOz Qu[a'0y6&>[gG< `z½QC's0gṍu:!q:9gQ+}}y qVp_:'jɞ+jvw:7fi 47x`l#-N0t[:7j욅}wŘ{a\~bϷWodL>U -kC'.bZY0!TA#\qjPT0oȁ㢬 -V ^\1452[p}b25J1+$ K4ʸ4ZS -cl#P_`X52iĠBge]=v`$n JX8VKQҞ٣1 -_S%$]O{~bbt67>>0 ,2 -R69@'ԍfcLkcR S]LkqLޫ{Pimaȳwaga1#SJ9Jƌ70C=zM1؋I6[hc|f}}\e1))]9#DCyo &i^kۘ=Nbr?EuZe6uCȒ<^w11.1^CG_m%̗VU&6SW\GRGκe_XjN?CSH=xTB? ԌMvaoC$Œ>_:?B#ĒVh # -9mLcXLZ~żA+{T_ua/daZ/78vƲspU[{q?DK -jc,;sCg}+If8RB:WiofvӂZ!דgqbw>TzWφ#xdLQA[r^^6c8Y)ta̰08/pU|WJwΗno]r~jSoxkn"&K { %N3.߸%hA?l0_n?ҭ>`axv&rsyf^<~H+7|s[iRL?$6?b9G3>H*FA"}2rfGlY<5(Hxka8Y) 30!Ä}|S#eUA$Y$U>çcǫ] yawQ/]-zM5==(VI{S>N`4YC2aN~+ΐ>Ͻޅdl>?],x9_ďg1ֶ9sc Djp;s -z8|ƳxqӴ+o޸&xL沞hȀ F'5>(>`xim2_#N\$VNuDŞ+ >4G#52Uz;&d㊂J8vec#zkKY/:-Wg<7_keutgO5Rudjfy9oڔrQ'jMf߄:0Y#Pg0ޖЭ&s싆 ĈM DAMv MQK#R͠ lU<޹e`c}v*;JǤ|y  qD*9-yPg<&&Ŋ%Œ^GR=h}u["3sIGݰCjJ Ki"Z%ŒT/[T03@SQoϤ[28z5#1=w.u|2jM:#_Rߘ$}b |W̿Va !Y s-=r"maGPK AM gi\:aƸv: 6A[3/ ˮ{bTw'Fhwy{B%=PaKmF>CA? ; 0g:3 5%XEx L`y($A=Fҗsa&`bR{@0fGeL:N{bC̱{Dy'^u ൐7cL 7E:nLLCU_L`ұ:֑lszL%Q·®0$P! /iŦ~@*J0#0VZC a83̰ -\/3I# -9(A ?2SԒ+тE-V!&cANa+/ؐFU?GU]ūQvY[qeKoa'1F0#Ŵc`?Chus X RVWFra~zf鄳1*ԠmuBìGʩqPIFf]iNj y0Tޫ˩z%LzxN n? Br- gyӴ׶DӐ̙Cb̑d`Nj)n]ԓ6-sF3l,SHƴ['UuVΐuLw#!-uǷk0UfA\\G=$^^vٌ Q#u<>i_DH㭠aϏZ w-v8FNp ;CsI!T_$\gGxiO(jxRm9!:װW9:=9I2奞V"A0/h_I{!zꘖat6D^`fVs9)k$ -W$u\p*Wvg-\E'co|1\^ӿ(֮61<8:T333T{/ -qB}1fDz"7Fm|lj -$22~Gj0)8̑P^E,ݱ̩Ҥ={#k柉 gJ# -سR0=޹h0 ߅;!S05EZg6\8Rg}ə獎7HR4fr.նx -CZ n7qcxk)\k~<<ݶuNފya+&[ĉTck#C `+A D;#z  e yL"}aj&+u>:+5׻60*-_2=A:̈́[8'"3niSR`%bf|0nhd=#:?>yn[ Qҋ -+A-:̟2sսb<j\>Kj Hb˄m $ah%6O|,`6ambF;ɘϡ)<RX{MڵIf i&/R-sx LoWclΑ޺1~-KORJDŽ`@cO1KcYǧ~gʾ_У+>h~' c(!+]gM MI7h {E'DD؈yu' {.%y4,0=IxŃ=E cK+3#/A&'Co6bZ{̒˞5\FDzXyJHtV4švW {'f1P)_aSхټLoz"R Cxo1 4r;7GX_m:t2p TIGmE$ U`]E y=J9ЪOy0Xf7ЂVOaǴ`xHV] ѽ:O8!wQklѹcרG>wLnv={ -oB~G]*c[ܝIhyE G7sTJar#,jvx%D){RhxFn$Ĥ-5'UV8RNB}5M>!j1]0)A 9V{aZ-ugez`0/ &R@2yM a{ X:~,W%hbd &ybUO;3rP [ȚzbrTNQOdUM`=bD -:2걹% l@I -hKx?tQM=; Q3vcΧkmVf>2sv5ny%6ų/q»;E4Plik1h?ύ1~{֧2u>BTFm}3Zsu:O 5?Lv;YV0Ϊ[ғI$(L =nmM?Mk`|ܛ -Ĩ)sV짏Z̝{= -j|KS|@Ju&GD-om-;A-wQZ|[4;3 *chLh=C&ڷ $$:>ِ5lġ_6ٵ+k`ʱ3Y=ʕ(x{0b׻ǔ$ we܅cQ7 ->ރ0Y;fć!ԙ`̹, @. NZ4X%BǞc3JdƲ1bA7!J~<+'܇zJ@5` }J;aTˆϊFIQ@6`ƕlHq< R| w͍#̕1YOdF/m31^7&D7RE ;clSrm20-buknI ){O -X{`Mo*f~(j&.H K;[Duwhb䖍16/<Y`%F8mN< D5y~= )ď;x?SUgM;G[1 Dj¼1BL2zGR1ad(2L2x{V>+:ƴ+$0(qqı-T»E 3$Px[0L[?r0}R|V|Bi+o D&ce)ƠMڬ"o26bMdtDŽ-I |MR-, VMf}$-#o cRތU- WzSiq qٸQx[/#0,8Y; 1lSffcѸw]]X"cctm6̻l|l -lL[a辯Fc}p~F% ]Zύ dQ<0X%}a -*$RbA a|{&OqOۘd{>x+ &j+37(zWE<6*_W -E쏜RFXkAJ${ 0v3C$#= --նզFHT{,ZQ fk: ' ~}淞4muº8(UFɠyh-R0}Ey.C*$jWv0l9<7i 1y7L$)%ٮoL^S'j0)ƷƄ|_IJ0FV>`//̝'1᧐$;E>e.&ouELz: ?sąښyIK"9%Z^k-f kˣِju,&kŸsdYՇ^B#wU\UBDy\3D$[7&#žːs'\OGc.2h19&-6/ğWA߲b2=lx./)['@^ʻU=d: ^GV1kQ#n`ؐ4S$ -gKdzrz>gp^Qao -:eU?繎 A^Ukg}Qo !WE?DfĖҥI_'ƲX1k ߺp`_~nwZLNtw\Q=#Ѯ?XP,smXzTWwզo=+ƔnX=zR:)@Lm'LGo[O`9 endstream endobj 23 0 obj <>stream -HD۵e'#89zӟ~ݫkJlQ>/20su19m:=n0Z2sV8bVV7l9*ﬖŜ5Yw/3w;3„6^/DHdp*qqP\HwnAf5cwLG) Ԫ bVE(),&i9-rƼV.bUcbaxu1` j1OU0R\Rv-O\vM0F$%#ofoAja:r{ ;zub,.@HQe{DY afwQE(,TR 銹=>ؤ60 Q\̞Q<'&0zPXJOQNB -dS)' TfBZ0t19܉SpRb*WaI*f]vxyb6]9~ؿA<$MG &\~tHbҐ<*gHb5)x>1S@d@ "\>/H sa3,dS}圃' -11ҼC XN/ǾeDc\BC׊p TrΉ{`ѩ%L1wHBGl17C -aHOŬsΠlʛ=Lcޘo ރ'a3a.q##q\~)|-Q b&c>V6ޛƫ EaăR/PT-Jɧ=h$$. ~Q%ل&L&NlEѿE8Tօ9ME(a#Da(6 -2q0#æIl~>sUQ;c[rTFE[X= C0~ h0N \>bwhCZ"(&1 %E?rG|o4$ iÔSJQ18xok.=ĥ1Dq̍ &s qa|9yq|W&Y5q9T$opOh<,2>NQIڇas a1wܖV6]?LB %^UJ=U!h3cIӯw9Q5ص(Y"q،4b3L] -9S<3mKm_'3\F6bLV=kt)Gu9HdAb9F{xks`nt:iD8֙ڲ!3>J-~],(GYzs8V8aIwJ)ra}h`Ȗ܅.3?`DlSc+VːWIaLEr6&1d%T^j`UǽӞvW0N4z 1Ug bd&7TL9UW15h‰|k8HM F)I`Y`!T|?F ;fv@% -w1j@0 x=zx40_Y-"°`a#Ab_}aR<$!DZ]9b1 ȵȎJ'e |?lC5 -M&A=5sd\xj0=#h"4{? ͇A!]8}T\O>zAj0gtK sC?K`ĿF9̻η`Jƪ&5~Uy3ń`B3EY{DEn;R~D0:'9[~kƨa,[H1N>"IaZ)ՄG[ofhFD9n-Rk[SL`kbE\)vmX:iU7KvJ]gDqt79Cey€P޼Ynywzn/ơ(dQ(b -%qU6m^^׬1p ǘˀar]@HIfǘPaR-* V|A@IywN0I<:l,f&n̝,=# qK+c,W7&q:Ǚw1lOr퉶8xIэ].0 &qOw5 E\nIDz^u1/C[>9;CtufdFH4SO@°-F9i^=Ls00-ĨCkRs ۏXQdbf@ s$iU]X5bX'$Z -3ŷW;B:;)uM >2gF5+ԞG-׋Ajgou.Ln *Of9"%!`8l}s33]F&Ӧp.,JN uZϚ{'"`0-]8Sfu MCeI㮮jR:ILњ2j`ݐB [q<1<$R){uKq"B5&T:g&"Ø5*EĶ$S aZf{ -oB~G]*ѱPKF 6G푾ar4ـۘ ZFj[q(ecbG:ǫ\xҏG -I`:D-F3!:-~0yU-ذLk %D -Hz0Ē^64\9_ H|'Z:^"J@L*Ū;+LAnE"k>Q9E>ߑU56suĈI[S[͍ .3yFp9w\t'|Ĝw&W?bی:ͼe$ e,Jl(gr kmwy@ Ι4O}=7X[%iDZB!*#F:rtim_]a w]BMN$e E3tg ']CϺ[zj:{]1ӥ0OJcs+MA{)*_{r3v:L&,a23+>q<g "Jo&yt׃Ce!X g}C&&ZT|y/TS`PxJo#cic&ƋcGgQʕ(sLa45V'M!iw!*$ -6oA }͈cCӽsYwt1f[jbZsJ{ QJ 33 b TOs\O>Sx6D?`.o9[] }6HxLHyZybhc 8W0Os$I[C/ Ax$='xy&nag1ӑ쥦„q04V6m\CBXZt>OL/u17$]Ez̹Z0m.|SǕ@3j }8vA]FTᎧ"=.X̙ܲ0ŘG p" 죤Elu%cZ9rB>K+y~i`ǝ$z'#|adՉ1£IE}aeׅ9}k``~m<`=י[&ID#'}|g1"nfY(E5Efk>)L6UQ2ua&m"߃˳ #3&3{x/K<¸bS}+[72_YrUl}KTY Kw1;NĨDB4T¼iX4n{'H0^m֪ + sW:#q1 ->JNژ .œy Q+& * L .<;Ih-u1f\{'2Lgp^a樰7`X2=h{ir\7uԉ0g -\q+smgpP_~LtbDh i*%IILE;25mCAk̚eOEMocᷭ=DS`(:crʹU=s) IKDR8?y#?qWqV#>xc'˳MBiԴq3D3Q {d/3q sDUY^B/{^×}HXKC~oEN1X^/签_1h;KBx5u}?{'i{ h=IJm<8Y}_VhrG^Tih{^~yzs4\ SehK!>UJuyٙu}%? Gӣ4Ll,&gcғxP&@;a~o3PAQ1H\WS0yYb24vL"ATia -֑{U~؉@˼2\@l;ic#u i&H?1:Wk L\pEw gwZw\v<c?l,}1bUrq_) m<ܷ <*:$ {i싩Mߘ>U\d4G&w'x)Mƶ+cRɑ{ D\ޅAW2#]CD6XzywZL f$Taߘw0$'$E'~SǸqҟLgW01e,Ŏ037LWX*jy9QypQw9lC%h|kaXW1r0і CPGR~۬.`*xF}fh  -H\GmՉLW]+2jX4o<((wjQ%*[}p QsoY@zk{Js~9ż91f - g$N{F{rMLX'{cHL.TBozm?Chr𔇠'wa~` 2co/ُ=n+-K?Vˆ&JeCٚVqmוmV1 -9KkOΡ(:Jc7hۯħXHuO(oSV^Ox:~vrڠe@dӗ]!R#syN?L/Yu'?uYRYM8?pxSZ'?dŗwȍkN+ +w"lhķw"2KE Mw2" X@Ї>V?mnxiqut)qu^ϧn.kJ &WylyH$g0g Q=/{a`ν[ϳ?DQ[`NIkz !Q'jNѤ% >TGQt8RdY+'ȯA߃a:T>e1jsT ~Hx0c4Ěfف`֣Ԟ9mpa& CcMD>|$(.j|;lw~=kZ?[sGh1pAGN( -2acL1 6\Lk6q0S@{-K@M1(:x>~QPc(s!τdxyqJI ˝NY'0$`JT?==p]3[n;qtq\]ܞ(_p=1'ɜ3 _vRaHpbD$i'0QxA~S -_Ĭ0Zu/,~, }f4"7;CiX - &S˗jyBh| 05W,[=sۂ˨CAO@;QQc c8:ׄ`+T?Z1ײ.S"7&9͒i Zu~0+3dޔ+nAV 06DWYboB1Dds++fڍQ -'ˍYa] 3YFXܿ'-;O{:vd6 `+5~[N"Ǯɱz~տ??/~?¯~//fY.e[~ ok9/Q6*AO!:Lx%ƄE)>{瘌jRTHs#aoXtL+#M/L%|uOeBD&/sXFG'Yƞ`>d}rH -OCm'w͙Ǽ`\&SBz\n?FZzy/7W}jr61%.a_kks^9C?ʇ1"g|ך||ۗ?~b4>"bOi&rr^e`ɆV/RP"ʳ 5꿍WsXg$c9b<&Ffc=OSB5qWĜi'qz[;7d٢kX.q1Li*(a3T?u? z0{ wq>'D>je6V;n; AyRnA7Yq`VEp5v%J UU&1`92 eޘ4)et<( -[7e'٥cW(\g+-TlEO($&"e4dV{֕x}u M%,Y@T>c=b U7]S {FEj R`غ$in<V˟3e%rӯߚHs17CG\XQ[2ꃱWB}렃 X0(fYR n2]ej#a5k,j'}BFgo Ѡzj>v?Z]o#"u6[^FcpGYPE4or~Wn־`ҹn4Tc6h<\Nje/ra>ca_l&]5ܲݫ\X'O/So U65rKD 4l΀\_iuPXM3ǎg,}Qga6SQόl$a{=o` wa>TlmL9ڍ@q 8Ѵ$LfHal1Tod,cr@G -J3( OZs˂8o `!=lJxkh":Xp!jfTYƘ'8 d4&k`n(?QM4gd7ߘ45 -6d{ӆ  IѮtC$*Id%ŏdqT΀]q=Iki똌vl'#k Wn>1ۺaeh0"vTĠj!"@ӧ&ao(t UFv=R~cөa4s0h(h<[8sVu93sV&=rG#:$i'-T*`07uNE9YfF.l s9&|ꨢ{5k#acL~Uy%1F%ޘLJw;n#f@8gᐾܤWӡ& -:H؟?{43\{e.vֿ #~T#<Ħ0Mh@oF -'JQNX 1E91CNq+ׅPs4ى#\j|?NN)ig! EoT[(~摖{l(9 kOd d_7R#LMmGN&ԉwĪ ._VQb_/NogFݩSzs. @vƂafUr >i$l#KRшChM*D&3ҵd_ 픑Oߣ<gtq.Vk%6\#f*{^E.R8mi˞KEkOii99k#%V:C(!٘5]׵.+gL_=j"e&KqMȜoVd$)t1,'Nn^vZfaVQaqA -%q| P\iy?(BhO!U*W|rV6Zt,c.]Ņjl/@"kG[q7&Ԧ?[uF;??-(#(pŪqM=׻H)mޞ}=X@Ae5לpY -=ڜ*f^2rw&YaFM{#^H_.jLޚW;K[Ns>kVވ)Dua8cM{Tb>#⌢pWL*mw m0Y}K&+5 䨁oZISCsiT`7B+e=+Ucwf4ܑH&5X<ڌ|npChFM6 -z49lYҽIyYjhb|a)2Tl\--:*WR%㛷8߬lAڒmD3KbOx*\E'^7޸(65:ofbWt'qi!.Ba5H2լJB̘(Ǭ\/nndwr}pݻqjZcnBV$rZ"?..w j^Y*y?Gf#2*Ov8kB].,&>b2T䂛Xg{R `Aݬ\WS,Q쳎<]bĄYZbp)]?ҕnyW}Y% -7:fKJ/I`&{:v<#9T&ܯ[R-ˎ=k.X-:u -ndN΍y6kӬIS'Pm_g C-,t$G&Gרop,BǬ\Q -o0jbs0Y^wi㔍;ҶUaI{~Wr% &꾶?G_ܹ.l~SWEYS+%g@k72 qf_b|$pQ 9tt`BW3z a0g8:+X¶;J~OA{vSz9)L@X}0%O-gi͎6}VcR~3mm6淽oRZF:ϬiKB9bj30W -"S =@kc]˱hcş2P.qqX~m2( t#bf61A,-r*:\\1 ڑ+rNykZ͚ *~&K8 sn9J^۾ç i|eDMos?T&jub Ù'Yp<\Q钟 J3B,79W\!IW[\phpBwrlRUle=x~4fI?\b0s3[^kgƥoO0êL"2rk .s)).f)PAmGgFl޸'HlUУQf{*5HBX1gK\ ;ʠ{0Vy6tV@J/7׬y\+ti_hRDMk PzOxϼf5~I gsvDr,a\MwEBiJ̚Oh8F b qh@Lt.@<(aGB.:|Y PgƩ@>j; CҊj> #հt45f -Xtpg=5R:/<h= a[GǗ%4W|.Q #lQbKBue"H%oͯI+5PZiF m5Vj\_/IxrTQ鵻KGA"A! }~85d{_}=&9LCiiYϡHY#8Y,C"zeY'ɂftQi Nu[4F5:l%9k -eo⨨p{pT @q]f% -nv"@Ԅ=*_vo&r[x5SM"ծpK moߓ1lVL:\5=p?y?4CFbLZin R3!YCp=_O5#6nNw%u;xƈ/[5;LOnщZ]#➅"^,R\,Jkac$sՅ;sC)0V/x^0>glu z=k܇spڑf&,D<Lh@2J($"{i*byu -!hs+G]-S8=[h2aq;k֒x5#4@uEN?]5Z!L3c7&`W8 L75Ĉ+g=(&4 %=cH|)kNTٍRkaO=qL37gru织W{R㈡3v SEfR̐RfW Z|LL% -\+4s]:ʵR Sa8h ѧ&K6N9o Vɦ{ -'Ơ{IdA&YEbhf}!G蓜P=Խh.n4;Zb]◁g?DqFt$]n9 ?^0L68wMgvEA1!Kh׾kķ?OR9Ԥa^䎒֙$k9D ){LwVێ;kozXއe-a;U3ԛ=DT]@` 11MGI"AiXlCk}kDT Uj\'9|O1vCPjs #o+ꤑn|@Y+9j?"ubvk5a+$i -ml#Jl"}U H D8=*)# @,xUԤ0 H6cSW5-f1nLDr/rw٠̖#X~L3!/0>E@[݋TH]ѵK(eSVSFm$-$` $skfr:|v&*P]`2?o #8,USuK<4rcl~dCYzr3yrF@0d艽&< dI6QܪzWf?ĥ+~Q85}%7y|^5jlN"$(s\(1}ᅭV-'% "}aHL oϧ#fެŞ?RpdgK;ٔ} -8twpVƵdw2S&=GmVW =S05iWueXsI4ߘ͔h(0jGaXy,/}J쯝t -5f&C{7\K|cOM>(F̠I\#!Z(wjxL/xc1L2dan+RNvM]!c`m]a߉ h?bQXiv)dgS -xq/4tOOSs/zi;I35A[GV ٌҔh@5ҧ_I1[""hƵkrq=#~J hghs#Z5.ayA'v-UjS#B|`Nf (!ΐUPLEXKU"_C;!09U?w<>IԸΠC-1{0]=K %6 CCJٙ3c%ڮДMيo y)Qc0 Sbt$C׮ n{$e:VlǴ8 - xB0@6^9k7?ˏ?o?;?|;?V>??^&+B1 1%yV`WA4Dkq2k./:dlH+ϵ0BcWjhTޝu֌nhlgy'yQ"SCɺ}5 ϮI|DyhKHHq0•+=ٌ& n M9lC y)[tE)9-LIXw߻X|'15$^ڻ XZR3aIlf芩 -|lmYX>ܬ5RS%TP275uңםIdog-KChQw|olJڂ(B/q &?:tXN K6K7of8X`fz\tx-zYia~`e:&XXkf`6t<"ް&a7sgEVvJSgTqw6ϭ%%*PZ5oKT"e~Nq2j6]&%Jt Yn@J`Bcs.E=1w5J ڌ]#p'FJcX%+;@p%{{5vG5"3NVu1GM;fjhI:y_r$۔d V,{--[Gjy$\7`˴2?[ɇx-1Otƞjm< -e -[5my P=!*.u \R2Xl7ON26&@dthU @qw!}IC-M|5^uԑX0Ls]Y60*:/3` Ma Hf4cyIWH*L$*{T,1M;•ta{A+T<3mu-ƪf)( -讉rcީ.Q_NWtuRO1M > q^(y"l(ο\H=6'Hwiw1/}EHQb05:P'%&ݫk~[F|4;kϢ>S$3s#D]:+lq(4/+[}L+)5<IZ_FnЖ㳚M7*D&3ҵd__ 픑O?溬gtq.Vk%6#3=p&s7)gδeOץߢ5~h'4\eVﺎC(!٘5]׵x ʝ<3i/52ݥ8&V]fdN7e$)t1,o'DBo-~ɰr+QaqA -%q| P\iy?(BhO!U*W|rV6Zt,c.]Ņjl/@"kG[q7&Ԧ?[uE;?v–w^~bոUTҞ] +mޞ}3X@Ae5לpY -=ڜ>*f^2rw&Y~aFM{#^H_.jLޚW;K[Ns>kVވ)Duc8cM{Tb>#⌢$1ls} T\ X`A2Faf1"&+Y 7w$I/-6#v1QMg[lR^F5mX - /+5wpK DʕTfb-7)$[Pd)̒S5 -W/t׍7. -4 ƞ6YM۬Y[P$9-`vw1q8dMh4=9޷PF ұzL5k﷼3918˨[3;ꮜs5\)c\V)Xۇe\경}!!p~~h~|?+yj6+i7j3,b1]S\+l/Z!,Ȼk5~jb%&O<|X)1a\iJ׏t%[U_|ox~fw $0[jh;~#9T&<[R-ˎ3k=kb8ܪ .^ -+YYƭī6EY d)Vɇy! W:#}v#kԷH8YZcg+ڸ<\2LVWSy8ecGŶmgX^2\C H5?>m+'w8"ȖZ7uE[4l5R Vr-.'Lj1M,W uȾN@ &zy:3GsV%lO~V2(`OβrJ/'?3DYf?~^I)_P6[snx+s%oPΠ&r -؃'L/va  還=Odݯt~2#x _SADr3cl40qq,*ePsVz^wX;T!vF`ztD.Li._(gjFb{8-qnAjݘJ=%߇+sVC?$.#NM¡Amނ0v- C1*HVp'_bGqGٱ+FBD6m.JWRc졆h\ ;A{Vjyڹ P6h җn߱j^e^A͑uOO׈wUT -$Kd#@ɣՈ{1 Oj`8%|x1"cѥt+)MK^s0AUBe-@!) Zr;ŰKC=zV160(AjW TGjKFgVwpB(,M^, ZF6F㩡4KnLw a jS+^#& \s\ ārͪyKiDG1VԜQ>&I'BzW161&9̅v2C=2q,!}>4Լ'ɂZ^bTQ\ YN= - is[[r4~CW* - ']34zh5. o]}ՔH&p^IFLP&1:-T{c@yHaVP%\s7NNW%y:x'Oùlּ?A˜DtbgȟxdHW+[[j @ixFxĝ!GӒf.='}]V1 z]5>8NMX0y. 0Ѐd-ΕPHD351<8RC9ÙΎWc;S8=7uwdW||Q)j=Кgj:|:kYZ!t3b7$]תy'Fp/F65b6kkUhdПU"x,IM+U?',A0}sdO;z~򐠛b(7ܫ -J"PTH-_LΙto)1B(u:*'\+頎vNTC> bXm!ԤyWwzajDy߯dRB#cP5R$S Wj"14ڳ 3p#IN4a7@A 1a*e {O5Q7Ul9 ?^i0L68VMm+CZBBA`Q ܹ\BN=~=jEA!KLkjķ?OR{qPBy3JqZG>wrlR 7\{6tzzLDՑ}kbj‚F7?ߒcD1Dt~d/(E&ՏFD=_T p4ϏQ3 -X@~33|| tce|MԑwՄ5쒜 RhF 7vU$^oHG[FxC6Ζ -ĄS)JM:d36uUsW3¬~ fDSN7Oj"1l{ JoقWK7SK iljбs -6R0#:W %lho=6t D`ntΠ*1֫e:&|0>Ȣ\%9إ>/Iyp˳}Rn̐f wgS#{ƑiV# ]Xj܉&< dK6Qܪzת/q錁rv$঑ Mᅁ_{FMéVdyc%'^Jcu'ĺ 2*fl- gL]V6ͮ'Yyce[6lNʸ -YKĺ盳+ua"tD>p]$R2obJ 4Q h 5G0WJr mAX5k&BҼ =kꃢj\)qvT'čp -+5B<ӱ&LsӟUlwQ5XpkcG8V"B`1ڭ,2m4. 4yjB>^$ 75\^#t+D )}##lFbiJ\@+}WRו.\59p iھb0W%gfƖ'dk9ң~Ss'WbdY5wBѰ7~lƔ3bT7ij4y uNQu@朗'%1ܔnv;@c=,a: aդ)J_rjDJA DO>p7 ^WdNQy8X%Z dWX5y,N8ΠCo.a:*=CZ(lԻ CCJ#c%UC)2_i 8w2RF Q&3 0\O!r-b?WMpM-&)P[}"8PhܦƋ+5\ٰGGӯ~~ok/~۾};nǾi@ti'\"RuRbӽU{s3^oIvZ@tJ*|\u*k6I2`yOIפ 眚ui]l'-W,zm3'j:tPףla$m\oӆ06ӌ9L-⊈۹ ,L,,1[K]ua{yJ GӺ}D2)@ jql?WFu>Zkbj\]zqXIkL=ML+ba>M%38Fɰ:s8pywt)dZDr |@RQSfp =c;$;%2fb0EBO -@+ -\RdO JSt*!R10n UB>?YwU9b#hYL_ vXvZM QX -&c-sH߉q`~0^CD -FP3e42s^ ?<0w`̥t6[cf'FJ)0'B0s e17 Wz"T֋J栾kǃ0ɵ1ʇζ?aᜆu{-a>>oh+֪*~o$$l#&p;W650v38N0F2i2lRTs0-Erl,w; -vQvØ-ƀjOR?W*vlP?.>-05NQ[JYJ^#fO{{,k,/w|tgnFo`o˚ԭnbwW2@OOuUZ!cu=?x0heČX{kWjVrmm c\It{jѤ-47a _^u5s0FŻ'\ٷv~?qƽ[;^&RSַ`Ҽsk/o%ݍ%UmH*|$ @Xdƾ% Ez\ƛ"[ݷ)i&&"l&l%hIvi6MpAp(?#W{!.m2cudduSzO3_t3}7?-mcEב́{/9тhƕ.xSLUjyEcEl&mv* C N.i0XlD0?.uA“+)DdNh}ylYzK4fD+͂c($k`Bv 0 ;wq:U h>̑rd5Q;O*oh10`ἡ0'ռ0t0k aRrs:#S 骆 G=-qD/ A5BZb Yg (۽ Vv:iA0:"K)qw?y~hf"Jt(y <%OQ"ߨ3gCwԙcdc;ϙ`$gpf~>J -\@ (} 3.Ys[g<ÆiZcaP\$ҬzW־ H" h0H2V 畟Wi3[3l0V3XR SS݊틉Z pX%6pVw[dc8l]sϢ.kBo1V3/,LY/i)+z݇9p -3c7Shh1!ŝ~#S %sI_yHv8rVmd*za6qR>3t?g-0-BMa!X4Dd7[n?+Vbs5 +گsw+g)^쀉Bt6Y 񌲫3Lo֗|^w_\s$<ܕMբvSx-粕iO1|Qi5b]ʼnO݀SȱnaO2όx씂=ώzȔJ#; -nwg?/*+jCnjzk9?/b?G7Pa|/c'ט-'[ˎ7-[V [I/b+:߸D`ʾc<`I٤#gX/{@N|~.}<{/kh%\{TX[2Y',SmXg4y/~nyWBH9noP=seO.PΠ qcqV07Kb廻zk+}1Ym.Xe+sUDa\~HJ\|vb35Bju5"jdz_js<3ݷѯ/~amsj TOXTRETB0d&–A1àyaKxFI{ Ӱ+Je\GT_ +u]upfOF¦zFCrsؙ\'aGա_E/2F h0&9OO"yޔ(anq-aٲobYht ҝg sHVd%Xވ#Kq$xM_Z+ʂv3dSlcY.F<~M_䤭AkE&>:Kvb(^A(N7e`bf7e,;eA1.^*QWweBz=9>^wBJ w9CH5nyqqS|*+? yP1b4|=R2 k lI_,>_gMS:ln_hD]{%=v<ȧ=\ z%c"/{vC!9v;bJso:;FޝgtO>ews >KI "Au-uw%4;GY sIO9s_s=>y켞h 9rHřWwd…8V4Y3G9M&*gf 휫l}-Nn-Y Z@иHs'iPS(rWNƊОc_F=_- Io!qLփΗ<ݫ ld}ʗ ҴkeY_3mY<ؕYVܶ-'bP/soY7e0 -NP'e†BD|VEŒ4zWWC]bglL5l{X%qf(}wF)^"jU2ȟ|A4neI)$RTa{{/j1oo/mXk'ULekY m?DYx`KiF}oiɼe/NnKpoXK|e.jiZn?|m5U96WƲڎhDg4ƻڲhDעvΩ<ַ'aq8:chpH{}fx=72R5>v%qc}J(Yc"g^,)#h3|M  7 < "%J$ZEӥ*E0@h۽m4HU;щ(Ys dQ(޼bnP -7EvÛec5z4=Ҍa18G,A4wX! $"dPgהVS7hz"_+M08öIă-Mۥ1Y -[֑zBMy-%fQMu̘oIÄ^*Rk~ +H$z2J'q#^:B4;jpT"wVErfϣ0ܫw%.l$ h̔`1 %}QrW\å{5˥bra$\"O}g+jrPaD#Lک ^n1P]=Zr{ߚa8У1ΣA5' 룉O;a:tOh6eݮH/gy We`K)Ҟ#W{' \){i"I]+[K4]}4-)3?^s_3Hܷꭎ8H^ 0׷}M%M=U}-ؗU2ި׏eh#`Tmž :L3ޕǹ/wk"+lx:)T.=w,b/)# u` q=^iq1*^4.0"8pK3 g)k@je4]:AZ;6VwFPt4A82եgMv+C;ȢYU`}]3UXFh c_F1 Lft2;HCh+. Y,cKє as.1el<&s,q&NV4"Ύ%}3y׻˒PjTIwUJiٔX7lư^;L4w/7 Sw`f&~ endstream endobj 24 0 obj <>stream -Hʥ9axMU% 7 "#:0 s>+ow{vϪU+ezx++ӺGX+`ódKV2k^󕖫blxG[mYo\|WσIY=F/+aՖ}ԁT8nܘ|{F1˹>`;궦0@**19g`Rk^m~/?~ן^竽['s_ҍ_˛ןB rhO8Ǡgi;x:݅ K1j|3) -"$]fZH䵄Ib|灘 u i[,? S3D kM*1""Tr\Ud@TO}pcU9jCh3x91 B]I9V $`xH^aNkv ()>H3#MdLtn$[nncPXp`1I'fҌ8Ϩ?l~6neXhxaRjFvw5Q9ccarqZ-3占HGdY~q!7C- g{.! ]KQFLz7JHvZ]D2mW΃A֙}ڗ߹;0WBya$f/#c(R}ڻf'IbWZYV``\`ȒtI}scH^~Bf608]dszF}0)Tk,SCc'Ck!T 76CfA2RUEH -j;ZcTJ3S˜̄|Q:aYAAgIZ@P1SAYqaI|0P2ɆL5bG9aL  f8B[)z'Ub 1  sOeKr95v+dQK?6~Maah߈aMmNR;ug=3䆴B8t%6b&xV[)ɸ1~Gvcu{Zl(ڪwa5Vܫ:juqVYcP\ *);CPaI>~e!T/fW6wCYAIE:`XHpuɚN5o3 -D˚D|u-ˮDHSL:_ L Uu(TU -` -y^%5&[MAp"U[E u`moP2<eފֱepB3!R־p>C;kZ[Xz,OȢ^lddFy+z}*WcV=2hsRv7a@pju5s`,$WONje[ְyT?|!.r`JS)Hjyq9oC\A -Ыw>(,"Cl"y{A_h]yWSJCՙWbhXc o&NG CE^`vQ[U&M^W`Щ9D_kU07s]=!,.LEZZ`&u^h8 )LJ*YD՟xiB UN2鴓`y#@@FWlHf.bQLN"^z%!RzHVX] x4+Ì$0ĕB0wNZRj9|0Ms4+d4FcΆԶۺ4NiA/ineؑŞgMLWt:gk9 :( "j~ W -nF Ol FT!Pl@#idTh!fe,&oV|f̒9֒C9 -_:^ LLaDDܘe:X>E xw=OL`l^T!g (}G^ -(8asf[ՃY4cG=R+Fӊ\Ex>t+#Qf#51 bh}]ElWo f@BJhSFߚv^dc:|(no)#Z°,8dc4b5I2‰2 -a~ Xrذ;?X+ 5AQ/RpyY &~sI7p\M̌6j -YC;x.[f 1wcegJٹX N|zYhN!U='RF\R9W.GT\QX,6Ce/*? -b5j9^17j2_~_8PJ&yRKl}Mˎ;V'͖R%0-rEWeg'SKa%eV#>gǃ؃oM'Z.}@pڴv1Slc,z#._䤭]7r O4r:eA3.pUloEBnwuctŸLvH䵃H:.m*<>J7q즒[}BHE -uyRm❉p{u_>WrE,tC:C!=+e ߈~'0ywD\x0n*;n9rb.bOv#bXc3{ -xU ;\˼3^s04Lw?k -$ lz;=_q6!`M; A}A\Q&ob &U(P{9-oLv.`s/*g׻ᮀG԰<iF=hn9Te?—` 8+ Fdc]i;NGŦFC uJq/L4)ߺ5"Jj 2#DWL͠:gV\gcgb-z C*ZV8rU{zխ&Z/Ceh_1X3hw[@2 3y,18-n^Ֆғ+< g6~:&.l-Vy {QbؗKs5y}Kl3*ZsI-o#"eNX%74XѕHq.]Soi渝dD7{U._]vQؐhӽl.ٖHj8A.}ir"y5:y-:c7`SG@B2:% tu[@JxyqC,B̘hH fJPdFXLE8+M=UBC\R*9GVOٜ4(@2q*Uw34dS$v*SC\'^VQX/UTFC}bRpo UA&L(Sh;ndK#yG!4#^4T45{gAD}K.\cR{լ7oH|>sܥt, -iQ<_wïf?4-OsåуK]Uzp `Ѿ>YB#~O!NQ2]S yv[~K'ߡkLbva( O۽Lc-xϷ˶,?e]we^uQݗ*S<:bU -q|{;`- endstream endobj 6 0 obj [5 0 R] endobj 25 0 obj <> endobj xref 0 26 0000000000 65535 f -0000000016 00000 n -0000000144 00000 n -0000025173 00000 n -0000000000 00000 f -0000065496 00000 n -0000216446 00000 n -0000025224 00000 n -0000025562 00000 n -0000065799 00000 n -0000065686 00000 n -0000064745 00000 n -0000064935 00000 n -0000064983 00000 n -0000065570 00000 n -0000065601 00000 n -0000065872 00000 n -0000066155 00000 n -0000067473 00000 n -0000085125 00000 n -0000098214 00000 n -0000119906 00000 n -0000150354 00000 n -0000180599 00000 n -0000210222 00000 n -0000216469 00000 n -trailer <<636425E0298441309A895498F62E903C>]>> startxref 216662 %%EOF \ No newline at end of file diff --git a/asio/_static/file.png b/asio/_static/file.png deleted file mode 100644 index a858a410e..000000000 Binary files a/asio/_static/file.png and /dev/null differ diff --git a/asio/_static/jquery-3.5.1.js b/asio/_static/jquery-3.5.1.js deleted file mode 100644 index 50937333b..000000000 --- a/asio/_static/jquery-3.5.1.js +++ /dev/null @@ -1,10872 +0,0 @@ -/*! - * jQuery JavaScript Library v3.5.1 - * https://jquery.com/ - * - * Includes Sizzle.js - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors - * Released under the MIT license - * https://jquery.org/license - * - * Date: 2020-05-04T22:49Z - */ -( function( global, factory ) { - - "use strict"; - - if ( typeof module === "object" && typeof module.exports === "object" ) { - - // For CommonJS and CommonJS-like environments where a proper `window` - // is present, execute the factory and get jQuery. - // For environments that do not have a `window` with a `document` - // (such as Node.js), expose a factory as module.exports. - // This accentuates the need for the creation of a real `window`. - // e.g. var jQuery = require("jquery")(window); - // See ticket #14549 for more info. - module.exports = global.document ? - factory( global, true ) : - function( w ) { - if ( !w.document ) { - throw new Error( "jQuery requires a window with a document" ); - } - return factory( w ); - }; - } else { - factory( global ); - } - -// Pass this if window is not defined yet -} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { - -// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 -// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode -// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common -// enough that all such attempts are guarded in a try block. -"use strict"; - -var arr = []; - -var getProto = Object.getPrototypeOf; - -var slice = arr.slice; - -var flat = arr.flat ? function( array ) { - return arr.flat.call( array ); -} : function( array ) { - return arr.concat.apply( [], array ); -}; - - -var push = arr.push; - -var indexOf = arr.indexOf; - -var class2type = {}; - -var toString = class2type.toString; - -var hasOwn = class2type.hasOwnProperty; - -var fnToString = hasOwn.toString; - -var ObjectFunctionString = fnToString.call( Object ); - -var support = {}; - -var isFunction = function isFunction( obj ) { - - // Support: Chrome <=57, Firefox <=52 - // In some browsers, typeof returns "function" for HTML elements - // (i.e., `typeof document.createElement( "object" ) === "function"`). - // We don't want to classify *any* DOM node as a function. - return typeof obj === "function" && typeof obj.nodeType !== "number"; - }; - - -var isWindow = function isWindow( obj ) { - return obj != null && obj === obj.window; - }; - - -var document = window.document; - - - - var preservedScriptAttributes = { - type: true, - src: true, - nonce: true, - noModule: true - }; - - function DOMEval( code, node, doc ) { - doc = doc || document; - - var i, val, - script = doc.createElement( "script" ); - - script.text = code; - if ( node ) { - for ( i in preservedScriptAttributes ) { - - // Support: Firefox 64+, Edge 18+ - // Some browsers don't support the "nonce" property on scripts. - // On the other hand, just using `getAttribute` is not enough as - // the `nonce` attribute is reset to an empty string whenever it - // becomes browsing-context connected. - // See https://github.com/whatwg/html/issues/2369 - // See https://html.spec.whatwg.org/#nonce-attributes - // The `node.getAttribute` check was added for the sake of - // `jQuery.globalEval` so that it can fake a nonce-containing node - // via an object. - val = node[ i ] || node.getAttribute && node.getAttribute( i ); - if ( val ) { - script.setAttribute( i, val ); - } - } - } - doc.head.appendChild( script ).parentNode.removeChild( script ); - } - - -function toType( obj ) { - if ( obj == null ) { - return obj + ""; - } - - // Support: Android <=2.3 only (functionish RegExp) - return typeof obj === "object" || typeof obj === "function" ? - class2type[ toString.call( obj ) ] || "object" : - typeof obj; -} -/* global Symbol */ -// Defining this global in .eslintrc.json would create a danger of using the global -// unguarded in another place, it seems safer to define global only for this module - - - -var - version = "3.5.1", - - // Define a local copy of jQuery - jQuery = function( selector, context ) { - - // The jQuery object is actually just the init constructor 'enhanced' - // Need init if jQuery is called (just allow error to be thrown if not included) - return new jQuery.fn.init( selector, context ); - }; - -jQuery.fn = jQuery.prototype = { - - // The current version of jQuery being used - jquery: version, - - constructor: jQuery, - - // The default length of a jQuery object is 0 - length: 0, - - toArray: function() { - return slice.call( this ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - - // Return all the elements in a clean array - if ( num == null ) { - return slice.call( this ); - } - - // Return just the one element from the set - return num < 0 ? this[ num + this.length ] : this[ num ]; - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems ) { - - // Build a new jQuery matched element set - var ret = jQuery.merge( this.constructor(), elems ); - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - each: function( callback ) { - return jQuery.each( this, callback ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map( this, function( elem, i ) { - return callback.call( elem, i, elem ); - } ) ); - }, - - slice: function() { - return this.pushStack( slice.apply( this, arguments ) ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - even: function() { - return this.pushStack( jQuery.grep( this, function( _elem, i ) { - return ( i + 1 ) % 2; - } ) ); - }, - - odd: function() { - return this.pushStack( jQuery.grep( this, function( _elem, i ) { - return i % 2; - } ) ); - }, - - eq: function( i ) { - var len = this.length, - j = +i + ( i < 0 ? len : 0 ); - return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); - }, - - end: function() { - return this.prevObject || this.constructor(); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: arr.sort, - splice: arr.splice -}; - -jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, - target = arguments[ 0 ] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - - // Skip the boolean and the target - target = arguments[ i ] || {}; - i++; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !isFunction( target ) ) { - target = {}; - } - - // Extend jQuery itself if only one argument is passed - if ( i === length ) { - target = this; - i--; - } - - for ( ; i < length; i++ ) { - - // Only deal with non-null/undefined values - if ( ( options = arguments[ i ] ) != null ) { - - // Extend the base object - for ( name in options ) { - copy = options[ name ]; - - // Prevent Object.prototype pollution - // Prevent never-ending loop - if ( name === "__proto__" || target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject( copy ) || - ( copyIsArray = Array.isArray( copy ) ) ) ) { - src = target[ name ]; - - // Ensure proper type for the source value - if ( copyIsArray && !Array.isArray( src ) ) { - clone = []; - } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { - clone = {}; - } else { - clone = src; - } - copyIsArray = false; - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend( { - - // Unique for each copy of jQuery on the page - expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), - - // Assume jQuery is ready without the ready module - isReady: true, - - error: function( msg ) { - throw new Error( msg ); - }, - - noop: function() {}, - - isPlainObject: function( obj ) { - var proto, Ctor; - - // Detect obvious negatives - // Use toString instead of jQuery.type to catch host objects - if ( !obj || toString.call( obj ) !== "[object Object]" ) { - return false; - } - - proto = getProto( obj ); - - // Objects with no prototype (e.g., `Object.create( null )`) are plain - if ( !proto ) { - return true; - } - - // Objects with prototype are plain iff they were constructed by a global Object function - Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; - return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; - }, - - isEmptyObject: function( obj ) { - var name; - - for ( name in obj ) { - return false; - } - return true; - }, - - // Evaluates a script in a provided context; falls back to the global one - // if not specified. - globalEval: function( code, options, doc ) { - DOMEval( code, { nonce: options && options.nonce }, doc ); - }, - - each: function( obj, callback ) { - var length, i = 0; - - if ( isArrayLike( obj ) ) { - length = obj.length; - for ( ; i < length; i++ ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } else { - for ( i in obj ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } - - return obj; - }, - - // results is for internal usage only - makeArray: function( arr, results ) { - var ret = results || []; - - if ( arr != null ) { - if ( isArrayLike( Object( arr ) ) ) { - jQuery.merge( ret, - typeof arr === "string" ? - [ arr ] : arr - ); - } else { - push.call( ret, arr ); - } - } - - return ret; - }, - - inArray: function( elem, arr, i ) { - return arr == null ? -1 : indexOf.call( arr, elem, i ); - }, - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - merge: function( first, second ) { - var len = +second.length, - j = 0, - i = first.length; - - for ( ; j < len; j++ ) { - first[ i++ ] = second[ j ]; - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, invert ) { - var callbackInverse, - matches = [], - i = 0, - length = elems.length, - callbackExpect = !invert; - - // Go through the array, only saving the items - // that pass the validator function - for ( ; i < length; i++ ) { - callbackInverse = !callback( elems[ i ], i ); - if ( callbackInverse !== callbackExpect ) { - matches.push( elems[ i ] ); - } - } - - return matches; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var length, value, - i = 0, - ret = []; - - // Go through the array, translating each of the items to their new values - if ( isArrayLike( elems ) ) { - length = elems.length; - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - - // Go through every key on the object, - } else { - for ( i in elems ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - } - - // Flatten any nested arrays - return flat( ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // jQuery.support is not used in Core but other projects attach their - // properties to it so it needs to exist. - support: support -} ); - -if ( typeof Symbol === "function" ) { - jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; -} - -// Populate the class2type map -jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), -function( _i, name ) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -} ); - -function isArrayLike( obj ) { - - // Support: real iOS 8.2 only (not reproducible in simulator) - // `in` check used to prevent JIT error (gh-2145) - // hasOwn isn't used here due to false negatives - // regarding Nodelist length in IE - var length = !!obj && "length" in obj && obj.length, - type = toType( obj ); - - if ( isFunction( obj ) || isWindow( obj ) ) { - return false; - } - - return type === "array" || length === 0 || - typeof length === "number" && length > 0 && ( length - 1 ) in obj; -} -var Sizzle = -/*! - * Sizzle CSS Selector Engine v2.3.5 - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors - * Released under the MIT license - * https://js.foundation/ - * - * Date: 2020-03-14 - */ -( function( window ) { -var i, - support, - Expr, - getText, - isXML, - tokenize, - compile, - select, - outermostContext, - sortInput, - hasDuplicate, - - // Local document vars - setDocument, - document, - docElem, - documentIsHTML, - rbuggyQSA, - rbuggyMatches, - matches, - contains, - - // Instance-specific data - expando = "sizzle" + 1 * new Date(), - preferredDoc = window.document, - dirruns = 0, - done = 0, - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - nonnativeSelectorCache = createCache(), - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - } - return 0; - }, - - // Instance methods - hasOwn = ( {} ).hasOwnProperty, - arr = [], - pop = arr.pop, - pushNative = arr.push, - push = arr.push, - slice = arr.slice, - - // Use a stripped-down indexOf as it's faster than native - // https://jsperf.com/thor-indexof-vs-for/5 - indexOf = function( list, elem ) { - var i = 0, - len = list.length; - for ( ; i < len; i++ ) { - if ( list[ i ] === elem ) { - return i; - } - } - return -1; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" + - "ismap|loop|multiple|open|readonly|required|scoped", - - // Regular expressions - - // http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - - // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram - identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + - "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", - - // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + - - // Operator (capture 2) - "*([*^$|!~]?=)" + whitespace + - - // "Attribute values must be CSS identifiers [capture 5] - // or strings [capture 3 or capture 4]" - "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + - whitespace + "*\\]", - - pseudos = ":(" + identifier + ")(?:\\((" + - - // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: - // 1. quoted (capture 3; capture 4 or capture 5) - "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + - - // 2. simple (capture 6) - "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + - - // 3. anything else (capture 2) - ".*" + - ")\\)|)", - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rwhitespace = new RegExp( whitespace + "+", "g" ), - rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + - whitespace + "+$", "g" ), - - rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + - "*" ), - rdescend = new RegExp( whitespace + "|>" ), - - rpseudo = new RegExp( pseudos ), - ridentifier = new RegExp( "^" + identifier + "$" ), - - matchExpr = { - "ID": new RegExp( "^#(" + identifier + ")" ), - "CLASS": new RegExp( "^\\.(" + identifier + ")" ), - "TAG": new RegExp( "^(" + identifier + "|[*])" ), - "ATTR": new RegExp( "^" + attributes ), - "PSEUDO": new RegExp( "^" + pseudos ), - "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + - whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + - whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), - - // For use in libraries implementing .is() - // We use this for POS matching in `select` - "needsContext": new RegExp( "^" + whitespace + - "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + - "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) - }, - - rhtml = /HTML$/i, - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - - rnative = /^[^{]+\{\s*\[native \w/, - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - - rsibling = /[+~]/, - - // CSS escapes - // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ), - funescape = function( escape, nonHex ) { - var high = "0x" + escape.slice( 1 ) - 0x10000; - - return nonHex ? - - // Strip the backslash prefix from a non-hex escape sequence - nonHex : - - // Replace a hexadecimal escape sequence with the encoded Unicode code point - // Support: IE <=11+ - // For values outside the Basic Multilingual Plane (BMP), manually construct a - // surrogate pair - high < 0 ? - String.fromCharCode( high + 0x10000 ) : - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }, - - // CSS string/identifier serialization - // https://drafts.csswg.org/cssom/#common-serializing-idioms - rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, - fcssescape = function( ch, asCodePoint ) { - if ( asCodePoint ) { - - // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER - if ( ch === "\0" ) { - return "\uFFFD"; - } - - // Control characters and (dependent upon position) numbers get escaped as code points - return ch.slice( 0, -1 ) + "\\" + - ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; - } - - // Other potentially-special ASCII characters get backslash-escaped - return "\\" + ch; - }, - - // Used for iframes - // See setDocument() - // Removing the function wrapper causes a "Permission Denied" - // error in IE - unloadHandler = function() { - setDocument(); - }, - - inDisabledFieldset = addCombinator( - function( elem ) { - return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; - }, - { dir: "parentNode", next: "legend" } - ); - -// Optimize for push.apply( _, NodeList ) -try { - push.apply( - ( arr = slice.call( preferredDoc.childNodes ) ), - preferredDoc.childNodes - ); - - // Support: Android<4.0 - // Detect silently failing push.apply - // eslint-disable-next-line no-unused-expressions - arr[ preferredDoc.childNodes.length ].nodeType; -} catch ( e ) { - push = { apply: arr.length ? - - // Leverage slice if possible - function( target, els ) { - pushNative.apply( target, slice.call( els ) ); - } : - - // Support: IE<9 - // Otherwise append directly - function( target, els ) { - var j = target.length, - i = 0; - - // Can't trust NodeList.length - while ( ( target[ j++ ] = els[ i++ ] ) ) {} - target.length = j - 1; - } - }; -} - -function Sizzle( selector, context, results, seed ) { - var m, i, elem, nid, match, groups, newSelector, - newContext = context && context.ownerDocument, - - // nodeType defaults to 9, since context defaults to document - nodeType = context ? context.nodeType : 9; - - results = results || []; - - // Return early from calls with invalid selector or context - if ( typeof selector !== "string" || !selector || - nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { - - return results; - } - - // Try to shortcut find operations (as opposed to filters) in HTML documents - if ( !seed ) { - setDocument( context ); - context = context || document; - - if ( documentIsHTML ) { - - // If the selector is sufficiently simple, try using a "get*By*" DOM method - // (excepting DocumentFragment context, where the methods don't exist) - if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { - - // ID selector - if ( ( m = match[ 1 ] ) ) { - - // Document context - if ( nodeType === 9 ) { - if ( ( elem = context.getElementById( m ) ) ) { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( elem.id === m ) { - results.push( elem ); - return results; - } - } else { - return results; - } - - // Element context - } else { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( newContext && ( elem = newContext.getElementById( m ) ) && - contains( context, elem ) && - elem.id === m ) { - - results.push( elem ); - return results; - } - } - - // Type selector - } else if ( match[ 2 ] ) { - push.apply( results, context.getElementsByTagName( selector ) ); - return results; - - // Class selector - } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName && - context.getElementsByClassName ) { - - push.apply( results, context.getElementsByClassName( m ) ); - return results; - } - } - - // Take advantage of querySelectorAll - if ( support.qsa && - !nonnativeSelectorCache[ selector + " " ] && - ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) && - - // Support: IE 8 only - // Exclude object elements - ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) { - - newSelector = selector; - newContext = context; - - // qSA considers elements outside a scoping root when evaluating child or - // descendant combinators, which is not what we want. - // In such cases, we work around the behavior by prefixing every selector in the - // list with an ID selector referencing the scope context. - // The technique has to be used as well when a leading combinator is used - // as such selectors are not recognized by querySelectorAll. - // Thanks to Andrew Dupont for this technique. - if ( nodeType === 1 && - ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) { - - // Expand context for sibling selectors - newContext = rsibling.test( selector ) && testContext( context.parentNode ) || - context; - - // We can use :scope instead of the ID hack if the browser - // supports it & if we're not changing the context. - if ( newContext !== context || !support.scope ) { - - // Capture the context ID, setting it first if necessary - if ( ( nid = context.getAttribute( "id" ) ) ) { - nid = nid.replace( rcssescape, fcssescape ); - } else { - context.setAttribute( "id", ( nid = expando ) ); - } - } - - // Prefix every selector in the list - groups = tokenize( selector ); - i = groups.length; - while ( i-- ) { - groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + - toSelector( groups[ i ] ); - } - newSelector = groups.join( "," ); - } - - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch ( qsaError ) { - nonnativeSelectorCache( selector, true ); - } finally { - if ( nid === expando ) { - context.removeAttribute( "id" ); - } - } - } - } - } - - // All others - return select( selector.replace( rtrim, "$1" ), context, results, seed ); -} - -/** - * Create key-value caches of limited size - * @returns {function(string, object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ -function createCache() { - var keys = []; - - function cache( key, value ) { - - // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) - if ( keys.push( key + " " ) > Expr.cacheLength ) { - - // Only keep the most recent entries - delete cache[ keys.shift() ]; - } - return ( cache[ key + " " ] = value ); - } - return cache; -} - -/** - * Mark a function for special use by Sizzle - * @param {Function} fn The function to mark - */ -function markFunction( fn ) { - fn[ expando ] = true; - return fn; -} - -/** - * Support testing using an element - * @param {Function} fn Passed the created element and returns a boolean result - */ -function assert( fn ) { - var el = document.createElement( "fieldset" ); - - try { - return !!fn( el ); - } catch ( e ) { - return false; - } finally { - - // Remove from its parent by default - if ( el.parentNode ) { - el.parentNode.removeChild( el ); - } - - // release memory in IE - el = null; - } -} - -/** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ -function addHandle( attrs, handler ) { - var arr = attrs.split( "|" ), - i = arr.length; - - while ( i-- ) { - Expr.attrHandle[ arr[ i ] ] = handler; - } -} - -/** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ -function siblingCheck( a, b ) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && - a.sourceIndex - b.sourceIndex; - - // Use IE sourceIndex if available on both nodes - if ( diff ) { - return diff; - } - - // Check if b follows a - if ( cur ) { - while ( ( cur = cur.nextSibling ) ) { - if ( cur === b ) { - return -1; - } - } - } - - return a ? 1 : -1; -} - -/** - * Returns a function to use in pseudos for input types - * @param {String} type - */ -function createInputPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ -function createButtonPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return ( name === "input" || name === "button" ) && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for :enabled/:disabled - * @param {Boolean} disabled true for :disabled; false for :enabled - */ -function createDisabledPseudo( disabled ) { - - // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable - return function( elem ) { - - // Only certain elements can match :enabled or :disabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled - if ( "form" in elem ) { - - // Check for inherited disabledness on relevant non-disabled elements: - // * listed form-associated elements in a disabled fieldset - // https://html.spec.whatwg.org/multipage/forms.html#category-listed - // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled - // * option elements in a disabled optgroup - // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled - // All such elements have a "form" property. - if ( elem.parentNode && elem.disabled === false ) { - - // Option elements defer to a parent optgroup if present - if ( "label" in elem ) { - if ( "label" in elem.parentNode ) { - return elem.parentNode.disabled === disabled; - } else { - return elem.disabled === disabled; - } - } - - // Support: IE 6 - 11 - // Use the isDisabled shortcut property to check for disabled fieldset ancestors - return elem.isDisabled === disabled || - - // Where there is no isDisabled, check manually - /* jshint -W018 */ - elem.isDisabled !== !disabled && - inDisabledFieldset( elem ) === disabled; - } - - return elem.disabled === disabled; - - // Try to winnow out elements that can't be disabled before trusting the disabled property. - // Some victims get caught in our net (label, legend, menu, track), but it shouldn't - // even exist on them, let alone have a boolean value. - } else if ( "label" in elem ) { - return elem.disabled === disabled; - } - - // Remaining elements are neither :enabled nor :disabled - return false; - }; -} - -/** - * Returns a function to use in pseudos for positionals - * @param {Function} fn - */ -function createPositionalPseudo( fn ) { - return markFunction( function( argument ) { - argument = +argument; - return markFunction( function( seed, matches ) { - var j, - matchIndexes = fn( [], seed.length, argument ), - i = matchIndexes.length; - - // Match elements found at the specified indexes - while ( i-- ) { - if ( seed[ ( j = matchIndexes[ i ] ) ] ) { - seed[ j ] = !( matches[ j ] = seed[ j ] ); - } - } - } ); - } ); -} - -/** - * Checks a node for validity as a Sizzle context - * @param {Element|Object=} context - * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value - */ -function testContext( context ) { - return context && typeof context.getElementsByTagName !== "undefined" && context; -} - -// Expose support vars for convenience -support = Sizzle.support = {}; - -/** - * Detects XML nodes - * @param {Element|Object} elem An element or a document - * @returns {Boolean} True iff elem is a non-HTML XML node - */ -isXML = Sizzle.isXML = function( elem ) { - var namespace = elem.namespaceURI, - docElem = ( elem.ownerDocument || elem ).documentElement; - - // Support: IE <=8 - // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes - // https://bugs.jquery.com/ticket/4833 - return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); -}; - -/** - * Sets document-related variables once based on the current document - * @param {Element|Object} [doc] An element or document object to use to set the document - * @returns {Object} Returns the current document - */ -setDocument = Sizzle.setDocument = function( node ) { - var hasCompare, subWindow, - doc = node ? node.ownerDocument || node : preferredDoc; - - // Return early if doc is invalid or already selected - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { - return document; - } - - // Update global variables - document = doc; - docElem = document.documentElement; - documentIsHTML = !isXML( document ); - - // Support: IE 9 - 11+, Edge 12 - 18+ - // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( preferredDoc != document && - ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { - - // Support: IE 11, Edge - if ( subWindow.addEventListener ) { - subWindow.addEventListener( "unload", unloadHandler, false ); - - // Support: IE 9 - 10 only - } else if ( subWindow.attachEvent ) { - subWindow.attachEvent( "onunload", unloadHandler ); - } - } - - // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only, - // Safari 4 - 5 only, Opera <=11.6 - 12.x only - // IE/Edge & older browsers don't support the :scope pseudo-class. - // Support: Safari 6.0 only - // Safari 6.0 supports :scope but it's an alias of :root there. - support.scope = assert( function( el ) { - docElem.appendChild( el ).appendChild( document.createElement( "div" ) ); - return typeof el.querySelectorAll !== "undefined" && - !el.querySelectorAll( ":scope fieldset div" ).length; - } ); - - /* Attributes - ---------------------------------------------------------------------- */ - - // Support: IE<8 - // Verify that getAttribute really returns attributes and not properties - // (excepting IE8 booleans) - support.attributes = assert( function( el ) { - el.className = "i"; - return !el.getAttribute( "className" ); - } ); - - /* getElement(s)By* - ---------------------------------------------------------------------- */ - - // Check if getElementsByTagName("*") returns only elements - support.getElementsByTagName = assert( function( el ) { - el.appendChild( document.createComment( "" ) ); - return !el.getElementsByTagName( "*" ).length; - } ); - - // Support: IE<9 - support.getElementsByClassName = rnative.test( document.getElementsByClassName ); - - // Support: IE<10 - // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programmatically-set names, - // so use a roundabout getElementsByName test - support.getById = assert( function( el ) { - docElem.appendChild( el ).id = expando; - return !document.getElementsByName || !document.getElementsByName( expando ).length; - } ); - - // ID filter and find - if ( support.getById ) { - Expr.filter[ "ID" ] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - return elem.getAttribute( "id" ) === attrId; - }; - }; - Expr.find[ "ID" ] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var elem = context.getElementById( id ); - return elem ? [ elem ] : []; - } - }; - } else { - Expr.filter[ "ID" ] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - var node = typeof elem.getAttributeNode !== "undefined" && - elem.getAttributeNode( "id" ); - return node && node.value === attrId; - }; - }; - - // Support: IE 6 - 7 only - // getElementById is not reliable as a find shortcut - Expr.find[ "ID" ] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var node, i, elems, - elem = context.getElementById( id ); - - if ( elem ) { - - // Verify the id attribute - node = elem.getAttributeNode( "id" ); - if ( node && node.value === id ) { - return [ elem ]; - } - - // Fall back on getElementsByName - elems = context.getElementsByName( id ); - i = 0; - while ( ( elem = elems[ i++ ] ) ) { - node = elem.getAttributeNode( "id" ); - if ( node && node.value === id ) { - return [ elem ]; - } - } - } - - return []; - } - }; - } - - // Tag - Expr.find[ "TAG" ] = support.getElementsByTagName ? - function( tag, context ) { - if ( typeof context.getElementsByTagName !== "undefined" ) { - return context.getElementsByTagName( tag ); - - // DocumentFragment nodes don't have gEBTN - } else if ( support.qsa ) { - return context.querySelectorAll( tag ); - } - } : - - function( tag, context ) { - var elem, - tmp = [], - i = 0, - - // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too - results = context.getElementsByTagName( tag ); - - // Filter out possible comments - if ( tag === "*" ) { - while ( ( elem = results[ i++ ] ) ) { - if ( elem.nodeType === 1 ) { - tmp.push( elem ); - } - } - - return tmp; - } - return results; - }; - - // Class - Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) { - if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { - return context.getElementsByClassName( className ); - } - }; - - /* QSA/matchesSelector - ---------------------------------------------------------------------- */ - - // QSA and matchesSelector support - - // matchesSelector(:active) reports false when true (IE9/Opera 11.5) - rbuggyMatches = []; - - // qSa(:focus) reports false when true (Chrome 21) - // We allow this because of a bug in IE8/9 that throws an error - // whenever `document.activeElement` is accessed on an iframe - // So, we allow :focus to pass through QSA all the time to avoid the IE error - // See https://bugs.jquery.com/ticket/13378 - rbuggyQSA = []; - - if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) { - - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert( function( el ) { - - var input; - - // Select is set to empty string on purpose - // This is to test IE's treatment of not explicitly - // setting a boolean content attribute, - // since its presence should be enough - // https://bugs.jquery.com/ticket/12359 - docElem.appendChild( el ).innerHTML = "" + - ""; - - // Support: IE8, Opera 11-12.16 - // Nothing should be selected when empty strings follow ^= or $= or *= - // The test attribute must be unknown in Opera but "safe" for WinRT - // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section - if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) { - rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); - } - - // Support: IE8 - // Boolean attributes and "value" are not treated correctly - if ( !el.querySelectorAll( "[selected]" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); - } - - // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ - if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { - rbuggyQSA.push( "~=" ); - } - - // Support: IE 11+, Edge 15 - 18+ - // IE 11/Edge don't find elements on a `[name='']` query in some cases. - // Adding a temporary attribute to the document before the selection works - // around the issue. - // Interestingly, IE 10 & older don't seem to have the issue. - input = document.createElement( "input" ); - input.setAttribute( "name", "" ); - el.appendChild( input ); - if ( !el.querySelectorAll( "[name='']" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + - whitespace + "*(?:''|\"\")" ); - } - - // Webkit/Opera - :checked should return selected option elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - // IE8 throws error here and will not see later tests - if ( !el.querySelectorAll( ":checked" ).length ) { - rbuggyQSA.push( ":checked" ); - } - - // Support: Safari 8+, iOS 8+ - // https://bugs.webkit.org/show_bug.cgi?id=136851 - // In-page `selector#id sibling-combinator selector` fails - if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { - rbuggyQSA.push( ".#.+[+~]" ); - } - - // Support: Firefox <=3.6 - 5 only - // Old Firefox doesn't throw on a badly-escaped identifier. - el.querySelectorAll( "\\\f" ); - rbuggyQSA.push( "[\\r\\n\\f]" ); - } ); - - assert( function( el ) { - el.innerHTML = "" + - ""; - - // Support: Windows 8 Native Apps - // The type and name attributes are restricted during .innerHTML assignment - var input = document.createElement( "input" ); - input.setAttribute( "type", "hidden" ); - el.appendChild( input ).setAttribute( "name", "D" ); - - // Support: IE8 - // Enforce case-sensitivity of name attribute - if ( el.querySelectorAll( "[name=d]" ).length ) { - rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); - } - - // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) - // IE8 throws error here and will not see later tests - if ( el.querySelectorAll( ":enabled" ).length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: IE9-11+ - // IE's :disabled selector does not pick up the children of disabled fieldsets - docElem.appendChild( el ).disabled = true; - if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: Opera 10 - 11 only - // Opera 10-11 does not throw on post-comma invalid pseudos - el.querySelectorAll( "*,:x" ); - rbuggyQSA.push( ",.*:" ); - } ); - } - - if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches || - docElem.webkitMatchesSelector || - docElem.mozMatchesSelector || - docElem.oMatchesSelector || - docElem.msMatchesSelector ) ) ) ) { - - assert( function( el ) { - - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call( el, "*" ); - - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( el, "[s!='']:x" ); - rbuggyMatches.push( "!=", pseudos ); - } ); - } - - rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); - rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) ); - - /* Contains - ---------------------------------------------------------------------- */ - hasCompare = rnative.test( docElem.compareDocumentPosition ); - - // Element contains another - // Purposefully self-exclusive - // As in, an element does not contain itself - contains = hasCompare || rnative.test( docElem.contains ) ? - function( a, b ) { - var adown = a.nodeType === 9 ? a.documentElement : a, - bup = b && b.parentNode; - return a === bup || !!( bup && bup.nodeType === 1 && ( - adown.contains ? - adown.contains( bup ) : - a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 - ) ); - } : - function( a, b ) { - if ( b ) { - while ( ( b = b.parentNode ) ) { - if ( b === a ) { - return true; - } - } - } - return false; - }; - - /* Sorting - ---------------------------------------------------------------------- */ - - // Document order sorting - sortOrder = hasCompare ? - function( a, b ) { - - // Flag for duplicate removal - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - // Sort on method existence if only one input has compareDocumentPosition - var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; - if ( compare ) { - return compare; - } - - // Calculate position if both inputs belong to the same document - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? - a.compareDocumentPosition( b ) : - - // Otherwise we know they are disconnected - 1; - - // Disconnected nodes - if ( compare & 1 || - ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { - - // Choose the first element that is related to our preferred document - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( a == document || a.ownerDocument == preferredDoc && - contains( preferredDoc, a ) ) { - return -1; - } - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( b == document || b.ownerDocument == preferredDoc && - contains( preferredDoc, b ) ) { - return 1; - } - - // Maintain original order - return sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - } - - return compare & 4 ? -1 : 1; - } : - function( a, b ) { - - // Exit early if the nodes are identical - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - var cur, - i = 0, - aup = a.parentNode, - bup = b.parentNode, - ap = [ a ], - bp = [ b ]; - - // Parentless nodes are either documents or disconnected - if ( !aup || !bup ) { - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - /* eslint-disable eqeqeq */ - return a == document ? -1 : - b == document ? 1 : - /* eslint-enable eqeqeq */ - aup ? -1 : - bup ? 1 : - sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - - // If the nodes are siblings, we can do a quick check - } else if ( aup === bup ) { - return siblingCheck( a, b ); - } - - // Otherwise we need full lists of their ancestors for comparison - cur = a; - while ( ( cur = cur.parentNode ) ) { - ap.unshift( cur ); - } - cur = b; - while ( ( cur = cur.parentNode ) ) { - bp.unshift( cur ); - } - - // Walk down the tree looking for a discrepancy - while ( ap[ i ] === bp[ i ] ) { - i++; - } - - return i ? - - // Do a sibling check if the nodes have a common ancestor - siblingCheck( ap[ i ], bp[ i ] ) : - - // Otherwise nodes in our document sort first - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - /* eslint-disable eqeqeq */ - ap[ i ] == preferredDoc ? -1 : - bp[ i ] == preferredDoc ? 1 : - /* eslint-enable eqeqeq */ - 0; - }; - - return document; -}; - -Sizzle.matches = function( expr, elements ) { - return Sizzle( expr, null, null, elements ); -}; - -Sizzle.matchesSelector = function( elem, expr ) { - setDocument( elem ); - - if ( support.matchesSelector && documentIsHTML && - !nonnativeSelectorCache[ expr + " " ] && - ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && - ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { - - try { - var ret = matches.call( elem, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || support.disconnectedMatch || - - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11 ) { - return ret; - } - } catch ( e ) { - nonnativeSelectorCache( expr, true ); - } - } - - return Sizzle( expr, document, null, [ elem ] ).length > 0; -}; - -Sizzle.contains = function( context, elem ) { - - // Set document vars if needed - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( ( context.ownerDocument || context ) != document ) { - setDocument( context ); - } - return contains( context, elem ); -}; - -Sizzle.attr = function( elem, name ) { - - // Set document vars if needed - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( ( elem.ownerDocument || elem ) != document ) { - setDocument( elem ); - } - - var fn = Expr.attrHandle[ name.toLowerCase() ], - - // Don't get fooled by Object.prototype properties (jQuery #13807) - val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? - fn( elem, name, !documentIsHTML ) : - undefined; - - return val !== undefined ? - val : - support.attributes || !documentIsHTML ? - elem.getAttribute( name ) : - ( val = elem.getAttributeNode( name ) ) && val.specified ? - val.value : - null; -}; - -Sizzle.escape = function( sel ) { - return ( sel + "" ).replace( rcssescape, fcssescape ); -}; - -Sizzle.error = function( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); -}; - -/** - * Document sorting and removing duplicates - * @param {ArrayLike} results - */ -Sizzle.uniqueSort = function( results ) { - var elem, - duplicates = [], - j = 0, - i = 0; - - // Unless we *know* we can detect duplicates, assume their presence - hasDuplicate = !support.detectDuplicates; - sortInput = !support.sortStable && results.slice( 0 ); - results.sort( sortOrder ); - - if ( hasDuplicate ) { - while ( ( elem = results[ i++ ] ) ) { - if ( elem === results[ i ] ) { - j = duplicates.push( i ); - } - } - while ( j-- ) { - results.splice( duplicates[ j ], 1 ); - } - } - - // Clear input after sorting to release objects - // See https://github.com/jquery/sizzle/pull/225 - sortInput = null; - - return results; -}; - -/** - * Utility function for retrieving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ -getText = Sizzle.getText = function( elem ) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if ( !nodeType ) { - - // If no nodeType, this is expected to be an array - while ( ( node = elem[ i++ ] ) ) { - - // Do not traverse comment nodes - ret += getText( node ); - } - } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { - - // Use textContent for elements - // innerText usage removed for consistency of new lines (jQuery #11153) - if ( typeof elem.textContent === "string" ) { - return elem.textContent; - } else { - - // Traverse its children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - ret += getText( elem ); - } - } - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - - // Do not include comment or processing instruction nodes - - return ret; -}; - -Expr = Sizzle.selectors = { - - // Can be adjusted by the user - cacheLength: 50, - - createPseudo: markFunction, - - match: matchExpr, - - attrHandle: {}, - - find: {}, - - relative: { - ">": { dir: "parentNode", first: true }, - " ": { dir: "parentNode" }, - "+": { dir: "previousSibling", first: true }, - "~": { dir: "previousSibling" } - }, - - preFilter: { - "ATTR": function( match ) { - match[ 1 ] = match[ 1 ].replace( runescape, funescape ); - - // Move the given value to match[3] whether quoted or unquoted - match[ 3 ] = ( match[ 3 ] || match[ 4 ] || - match[ 5 ] || "" ).replace( runescape, funescape ); - - if ( match[ 2 ] === "~=" ) { - match[ 3 ] = " " + match[ 3 ] + " "; - } - - return match.slice( 0, 4 ); - }, - - "CHILD": function( match ) { - - /* matches from matchExpr["CHILD"] - 1 type (only|nth|...) - 2 what (child|of-type) - 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) - 4 xn-component of xn+y argument ([+-]?\d*n|) - 5 sign of xn-component - 6 x of xn-component - 7 sign of y-component - 8 y of y-component - */ - match[ 1 ] = match[ 1 ].toLowerCase(); - - if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { - - // nth-* requires argument - if ( !match[ 3 ] ) { - Sizzle.error( match[ 0 ] ); - } - - // numeric x and y parameters for Expr.filter.CHILD - // remember that false/true cast respectively to 0/1 - match[ 4 ] = +( match[ 4 ] ? - match[ 5 ] + ( match[ 6 ] || 1 ) : - 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) ); - match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); - - // other types prohibit arguments - } else if ( match[ 3 ] ) { - Sizzle.error( match[ 0 ] ); - } - - return match; - }, - - "PSEUDO": function( match ) { - var excess, - unquoted = !match[ 6 ] && match[ 2 ]; - - if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) { - return null; - } - - // Accept quoted arguments as-is - if ( match[ 3 ] ) { - match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; - - // Strip excess characters from unquoted arguments - } else if ( unquoted && rpseudo.test( unquoted ) && - - // Get excess from tokenize (recursively) - ( excess = tokenize( unquoted, true ) ) && - - // advance to the next closing parenthesis - ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { - - // excess is a negative index - match[ 0 ] = match[ 0 ].slice( 0, excess ); - match[ 2 ] = unquoted.slice( 0, excess ); - } - - // Return only captures needed by the pseudo filter method (type and argument) - return match.slice( 0, 3 ); - } - }, - - filter: { - - "TAG": function( nodeNameSelector ) { - var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); - return nodeNameSelector === "*" ? - function() { - return true; - } : - function( elem ) { - return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; - }; - }, - - "CLASS": function( className ) { - var pattern = classCache[ className + " " ]; - - return pattern || - ( pattern = new RegExp( "(^|" + whitespace + - ")" + className + "(" + whitespace + "|$)" ) ) && classCache( - className, function( elem ) { - return pattern.test( - typeof elem.className === "string" && elem.className || - typeof elem.getAttribute !== "undefined" && - elem.getAttribute( "class" ) || - "" - ); - } ); - }, - - "ATTR": function( name, operator, check ) { - return function( elem ) { - var result = Sizzle.attr( elem, name ); - - if ( result == null ) { - return operator === "!="; - } - if ( !operator ) { - return true; - } - - result += ""; - - /* eslint-disable max-len */ - - return operator === "=" ? result === check : - operator === "!=" ? result !== check : - operator === "^=" ? check && result.indexOf( check ) === 0 : - operator === "*=" ? check && result.indexOf( check ) > -1 : - operator === "$=" ? check && result.slice( -check.length ) === check : - operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : - operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : - false; - /* eslint-enable max-len */ - - }; - }, - - "CHILD": function( type, what, _argument, first, last ) { - var simple = type.slice( 0, 3 ) !== "nth", - forward = type.slice( -4 ) !== "last", - ofType = what === "of-type"; - - return first === 1 && last === 0 ? - - // Shortcut for :nth-*(n) - function( elem ) { - return !!elem.parentNode; - } : - - function( elem, _context, xml ) { - var cache, uniqueCache, outerCache, node, nodeIndex, start, - dir = simple !== forward ? "nextSibling" : "previousSibling", - parent = elem.parentNode, - name = ofType && elem.nodeName.toLowerCase(), - useCache = !xml && !ofType, - diff = false; - - if ( parent ) { - - // :(first|last|only)-(child|of-type) - if ( simple ) { - while ( dir ) { - node = elem; - while ( ( node = node[ dir ] ) ) { - if ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) { - - return false; - } - } - - // Reverse direction for :only-* (if we haven't yet done so) - start = dir = type === "only" && !start && "nextSibling"; - } - return true; - } - - start = [ forward ? parent.firstChild : parent.lastChild ]; - - // non-xml :nth-child(...) stores cache data on `parent` - if ( forward && useCache ) { - - // Seek `elem` from a previously-cached index - - // ...in a gzip-friendly way - node = parent; - outerCache = node[ expando ] || ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex && cache[ 2 ]; - node = nodeIndex && parent.childNodes[ nodeIndex ]; - - while ( ( node = ++nodeIndex && node && node[ dir ] || - - // Fallback to seeking `elem` from the start - ( diff = nodeIndex = 0 ) || start.pop() ) ) { - - // When found, cache indexes on `parent` and break - if ( node.nodeType === 1 && ++diff && node === elem ) { - uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; - break; - } - } - - } else { - - // Use previously-cached element index if available - if ( useCache ) { - - // ...in a gzip-friendly way - node = elem; - outerCache = node[ expando ] || ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex; - } - - // xml :nth-child(...) - // or :nth-last-child(...) or :nth(-last)?-of-type(...) - if ( diff === false ) { - - // Use the same loop as above to seek `elem` from the start - while ( ( node = ++nodeIndex && node && node[ dir ] || - ( diff = nodeIndex = 0 ) || start.pop() ) ) { - - if ( ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) && - ++diff ) { - - // Cache the index of each encountered element - if ( useCache ) { - outerCache = node[ expando ] || - ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - uniqueCache[ type ] = [ dirruns, diff ]; - } - - if ( node === elem ) { - break; - } - } - } - } - } - - // Incorporate the offset, then check against cycle size - diff -= last; - return diff === first || ( diff % first === 0 && diff / first >= 0 ); - } - }; - }, - - "PSEUDO": function( pseudo, argument ) { - - // pseudo-class names are case-insensitive - // http://www.w3.org/TR/selectors/#pseudo-classes - // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters - // Remember that setFilters inherits from pseudos - var args, - fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || - Sizzle.error( "unsupported pseudo: " + pseudo ); - - // The user may use createPseudo to indicate that - // arguments are needed to create the filter function - // just as Sizzle does - if ( fn[ expando ] ) { - return fn( argument ); - } - - // But maintain support for old signatures - if ( fn.length > 1 ) { - args = [ pseudo, pseudo, "", argument ]; - return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? - markFunction( function( seed, matches ) { - var idx, - matched = fn( seed, argument ), - i = matched.length; - while ( i-- ) { - idx = indexOf( seed, matched[ i ] ); - seed[ idx ] = !( matches[ idx ] = matched[ i ] ); - } - } ) : - function( elem ) { - return fn( elem, 0, args ); - }; - } - - return fn; - } - }, - - pseudos: { - - // Potentially complex pseudos - "not": markFunction( function( selector ) { - - // Trim the selector passed to compile - // to avoid treating leading and trailing - // spaces as combinators - var input = [], - results = [], - matcher = compile( selector.replace( rtrim, "$1" ) ); - - return matcher[ expando ] ? - markFunction( function( seed, matches, _context, xml ) { - var elem, - unmatched = matcher( seed, null, xml, [] ), - i = seed.length; - - // Match elements unmatched by `matcher` - while ( i-- ) { - if ( ( elem = unmatched[ i ] ) ) { - seed[ i ] = !( matches[ i ] = elem ); - } - } - } ) : - function( elem, _context, xml ) { - input[ 0 ] = elem; - matcher( input, null, xml, results ); - - // Don't keep the element (issue #299) - input[ 0 ] = null; - return !results.pop(); - }; - } ), - - "has": markFunction( function( selector ) { - return function( elem ) { - return Sizzle( selector, elem ).length > 0; - }; - } ), - - "contains": markFunction( function( text ) { - text = text.replace( runescape, funescape ); - return function( elem ) { - return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1; - }; - } ), - - // "Whether an element is represented by a :lang() selector - // is based solely on the element's language value - // being equal to the identifier C, - // or beginning with the identifier C immediately followed by "-". - // The matching of C against the element's language value is performed case-insensitively. - // The identifier C does not have to be a valid language name." - // http://www.w3.org/TR/selectors/#lang-pseudo - "lang": markFunction( function( lang ) { - - // lang value must be a valid identifier - if ( !ridentifier.test( lang || "" ) ) { - Sizzle.error( "unsupported lang: " + lang ); - } - lang = lang.replace( runescape, funescape ).toLowerCase(); - return function( elem ) { - var elemLang; - do { - if ( ( elemLang = documentIsHTML ? - elem.lang : - elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { - - elemLang = elemLang.toLowerCase(); - return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; - } - } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); - return false; - }; - } ), - - // Miscellaneous - "target": function( elem ) { - var hash = window.location && window.location.hash; - return hash && hash.slice( 1 ) === elem.id; - }, - - "root": function( elem ) { - return elem === docElem; - }, - - "focus": function( elem ) { - return elem === document.activeElement && - ( !document.hasFocus || document.hasFocus() ) && - !!( elem.type || elem.href || ~elem.tabIndex ); - }, - - // Boolean properties - "enabled": createDisabledPseudo( false ), - "disabled": createDisabledPseudo( true ), - - "checked": function( elem ) { - - // In CSS3, :checked should return both checked and selected elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - var nodeName = elem.nodeName.toLowerCase(); - return ( nodeName === "input" && !!elem.checked ) || - ( nodeName === "option" && !!elem.selected ); - }, - - "selected": function( elem ) { - - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - // eslint-disable-next-line no-unused-expressions - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - // Contents - "empty": function( elem ) { - - // http://www.w3.org/TR/selectors/#empty-pseudo - // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), - // but not by others (comment: 8; processing instruction: 7; etc.) - // nodeType < 6 works because attributes (2) do not appear as children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - if ( elem.nodeType < 6 ) { - return false; - } - } - return true; - }, - - "parent": function( elem ) { - return !Expr.pseudos[ "empty" ]( elem ); - }, - - // Element/input types - "header": function( elem ) { - return rheader.test( elem.nodeName ); - }, - - "input": function( elem ) { - return rinputs.test( elem.nodeName ); - }, - - "button": function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === "button" || name === "button"; - }, - - "text": function( elem ) { - var attr; - return elem.nodeName.toLowerCase() === "input" && - elem.type === "text" && - - // Support: IE<8 - // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" - ( ( attr = elem.getAttribute( "type" ) ) == null || - attr.toLowerCase() === "text" ); - }, - - // Position-in-collection - "first": createPositionalPseudo( function() { - return [ 0 ]; - } ), - - "last": createPositionalPseudo( function( _matchIndexes, length ) { - return [ length - 1 ]; - } ), - - "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) { - return [ argument < 0 ? argument + length : argument ]; - } ), - - "even": createPositionalPseudo( function( matchIndexes, length ) { - var i = 0; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "odd": createPositionalPseudo( function( matchIndexes, length ) { - var i = 1; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "lt": createPositionalPseudo( function( matchIndexes, length, argument ) { - var i = argument < 0 ? - argument + length : - argument > length ? - length : - argument; - for ( ; --i >= 0; ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "gt": createPositionalPseudo( function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; ++i < length; ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ) - } -}; - -Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ]; - -// Add button/input type pseudos -for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { - Expr.pseudos[ i ] = createInputPseudo( i ); -} -for ( i in { submit: true, reset: true } ) { - Expr.pseudos[ i ] = createButtonPseudo( i ); -} - -// Easy API for creating new setFilters -function setFilters() {} -setFilters.prototype = Expr.filters = Expr.pseudos; -Expr.setFilters = new setFilters(); - -tokenize = Sizzle.tokenize = function( selector, parseOnly ) { - var matched, match, tokens, type, - soFar, groups, preFilters, - cached = tokenCache[ selector + " " ]; - - if ( cached ) { - return parseOnly ? 0 : cached.slice( 0 ); - } - - soFar = selector; - groups = []; - preFilters = Expr.preFilter; - - while ( soFar ) { - - // Comma and first run - if ( !matched || ( match = rcomma.exec( soFar ) ) ) { - if ( match ) { - - // Don't consume trailing commas as valid - soFar = soFar.slice( match[ 0 ].length ) || soFar; - } - groups.push( ( tokens = [] ) ); - } - - matched = false; - - // Combinators - if ( ( match = rcombinators.exec( soFar ) ) ) { - matched = match.shift(); - tokens.push( { - value: matched, - - // Cast descendant combinators to space - type: match[ 0 ].replace( rtrim, " " ) - } ); - soFar = soFar.slice( matched.length ); - } - - // Filters - for ( type in Expr.filter ) { - if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || - ( match = preFilters[ type ]( match ) ) ) ) { - matched = match.shift(); - tokens.push( { - value: matched, - type: type, - matches: match - } ); - soFar = soFar.slice( matched.length ); - } - } - - if ( !matched ) { - break; - } - } - - // Return the length of the invalid excess - // if we're just parsing - // Otherwise, throw an error or return tokens - return parseOnly ? - soFar.length : - soFar ? - Sizzle.error( selector ) : - - // Cache the tokens - tokenCache( selector, groups ).slice( 0 ); -}; - -function toSelector( tokens ) { - var i = 0, - len = tokens.length, - selector = ""; - for ( ; i < len; i++ ) { - selector += tokens[ i ].value; - } - return selector; -} - -function addCombinator( matcher, combinator, base ) { - var dir = combinator.dir, - skip = combinator.next, - key = skip || dir, - checkNonElements = base && key === "parentNode", - doneName = done++; - - return combinator.first ? - - // Check against closest ancestor/preceding element - function( elem, context, xml ) { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - return matcher( elem, context, xml ); - } - } - return false; - } : - - // Check against all ancestor/preceding elements - function( elem, context, xml ) { - var oldCache, uniqueCache, outerCache, - newCache = [ dirruns, doneName ]; - - // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching - if ( xml ) { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - if ( matcher( elem, context, xml ) ) { - return true; - } - } - } - } else { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - outerCache = elem[ expando ] || ( elem[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ elem.uniqueID ] || - ( outerCache[ elem.uniqueID ] = {} ); - - if ( skip && skip === elem.nodeName.toLowerCase() ) { - elem = elem[ dir ] || elem; - } else if ( ( oldCache = uniqueCache[ key ] ) && - oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { - - // Assign to newCache so results back-propagate to previous elements - return ( newCache[ 2 ] = oldCache[ 2 ] ); - } else { - - // Reuse newcache so results back-propagate to previous elements - uniqueCache[ key ] = newCache; - - // A match means we're done; a fail means we have to keep checking - if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { - return true; - } - } - } - } - } - return false; - }; -} - -function elementMatcher( matchers ) { - return matchers.length > 1 ? - function( elem, context, xml ) { - var i = matchers.length; - while ( i-- ) { - if ( !matchers[ i ]( elem, context, xml ) ) { - return false; - } - } - return true; - } : - matchers[ 0 ]; -} - -function multipleContexts( selector, contexts, results ) { - var i = 0, - len = contexts.length; - for ( ; i < len; i++ ) { - Sizzle( selector, contexts[ i ], results ); - } - return results; -} - -function condense( unmatched, map, filter, context, xml ) { - var elem, - newUnmatched = [], - i = 0, - len = unmatched.length, - mapped = map != null; - - for ( ; i < len; i++ ) { - if ( ( elem = unmatched[ i ] ) ) { - if ( !filter || filter( elem, context, xml ) ) { - newUnmatched.push( elem ); - if ( mapped ) { - map.push( i ); - } - } - } - } - - return newUnmatched; -} - -function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { - if ( postFilter && !postFilter[ expando ] ) { - postFilter = setMatcher( postFilter ); - } - if ( postFinder && !postFinder[ expando ] ) { - postFinder = setMatcher( postFinder, postSelector ); - } - return markFunction( function( seed, results, context, xml ) { - var temp, i, elem, - preMap = [], - postMap = [], - preexisting = results.length, - - // Get initial elements from seed or context - elems = seed || multipleContexts( - selector || "*", - context.nodeType ? [ context ] : context, - [] - ), - - // Prefilter to get matcher input, preserving a map for seed-results synchronization - matcherIn = preFilter && ( seed || !selector ) ? - condense( elems, preMap, preFilter, context, xml ) : - elems, - - matcherOut = matcher ? - - // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, - postFinder || ( seed ? preFilter : preexisting || postFilter ) ? - - // ...intermediate processing is necessary - [] : - - // ...otherwise use results directly - results : - matcherIn; - - // Find primary matches - if ( matcher ) { - matcher( matcherIn, matcherOut, context, xml ); - } - - // Apply postFilter - if ( postFilter ) { - temp = condense( matcherOut, postMap ); - postFilter( temp, [], context, xml ); - - // Un-match failing elements by moving them back to matcherIn - i = temp.length; - while ( i-- ) { - if ( ( elem = temp[ i ] ) ) { - matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); - } - } - } - - if ( seed ) { - if ( postFinder || preFilter ) { - if ( postFinder ) { - - // Get the final matcherOut by condensing this intermediate into postFinder contexts - temp = []; - i = matcherOut.length; - while ( i-- ) { - if ( ( elem = matcherOut[ i ] ) ) { - - // Restore matcherIn since elem is not yet a final match - temp.push( ( matcherIn[ i ] = elem ) ); - } - } - postFinder( null, ( matcherOut = [] ), temp, xml ); - } - - // Move matched elements from seed to results to keep them synchronized - i = matcherOut.length; - while ( i-- ) { - if ( ( elem = matcherOut[ i ] ) && - ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) { - - seed[ temp ] = !( results[ temp ] = elem ); - } - } - } - - // Add elements to results, through postFinder if defined - } else { - matcherOut = condense( - matcherOut === results ? - matcherOut.splice( preexisting, matcherOut.length ) : - matcherOut - ); - if ( postFinder ) { - postFinder( null, results, matcherOut, xml ); - } else { - push.apply( results, matcherOut ); - } - } - } ); -} - -function matcherFromTokens( tokens ) { - var checkContext, matcher, j, - len = tokens.length, - leadingRelative = Expr.relative[ tokens[ 0 ].type ], - implicitRelative = leadingRelative || Expr.relative[ " " ], - i = leadingRelative ? 1 : 0, - - // The foundational matcher ensures that elements are reachable from top-level context(s) - matchContext = addCombinator( function( elem ) { - return elem === checkContext; - }, implicitRelative, true ), - matchAnyContext = addCombinator( function( elem ) { - return indexOf( checkContext, elem ) > -1; - }, implicitRelative, true ), - matchers = [ function( elem, context, xml ) { - var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( - ( checkContext = context ).nodeType ? - matchContext( elem, context, xml ) : - matchAnyContext( elem, context, xml ) ); - - // Avoid hanging onto element (issue #299) - checkContext = null; - return ret; - } ]; - - for ( ; i < len; i++ ) { - if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { - matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; - } else { - matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); - - // Return special upon seeing a positional matcher - if ( matcher[ expando ] ) { - - // Find the next relative operator (if any) for proper handling - j = ++i; - for ( ; j < len; j++ ) { - if ( Expr.relative[ tokens[ j ].type ] ) { - break; - } - } - return setMatcher( - i > 1 && elementMatcher( matchers ), - i > 1 && toSelector( - - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens - .slice( 0, i - 1 ) - .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) - ).replace( rtrim, "$1" ), - matcher, - i < j && matcherFromTokens( tokens.slice( i, j ) ), - j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), - j < len && toSelector( tokens ) - ); - } - matchers.push( matcher ); - } - } - - return elementMatcher( matchers ); -} - -function matcherFromGroupMatchers( elementMatchers, setMatchers ) { - var bySet = setMatchers.length > 0, - byElement = elementMatchers.length > 0, - superMatcher = function( seed, context, xml, results, outermost ) { - var elem, j, matcher, - matchedCount = 0, - i = "0", - unmatched = seed && [], - setMatched = [], - contextBackup = outermostContext, - - // We must always have either seed elements or outermost context - elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ), - - // Use integer dirruns iff this is the outermost matcher - dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), - len = elems.length; - - if ( outermost ) { - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - outermostContext = context == document || context || outermost; - } - - // Add elements passing elementMatchers directly to results - // Support: IE<9, Safari - // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id - for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { - if ( byElement && elem ) { - j = 0; - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( !context && elem.ownerDocument != document ) { - setDocument( elem ); - xml = !documentIsHTML; - } - while ( ( matcher = elementMatchers[ j++ ] ) ) { - if ( matcher( elem, context || document, xml ) ) { - results.push( elem ); - break; - } - } - if ( outermost ) { - dirruns = dirrunsUnique; - } - } - - // Track unmatched elements for set filters - if ( bySet ) { - - // They will have gone through all possible matchers - if ( ( elem = !matcher && elem ) ) { - matchedCount--; - } - - // Lengthen the array for every element, matched or not - if ( seed ) { - unmatched.push( elem ); - } - } - } - - // `i` is now the count of elements visited above, and adding it to `matchedCount` - // makes the latter nonnegative. - matchedCount += i; - - // Apply set filters to unmatched elements - // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` - // equals `i`), unless we didn't visit _any_ elements in the above loop because we have - // no element matchers and no seed. - // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that - // case, which will result in a "00" `matchedCount` that differs from `i` but is also - // numerically zero. - if ( bySet && i !== matchedCount ) { - j = 0; - while ( ( matcher = setMatchers[ j++ ] ) ) { - matcher( unmatched, setMatched, context, xml ); - } - - if ( seed ) { - - // Reintegrate element matches to eliminate the need for sorting - if ( matchedCount > 0 ) { - while ( i-- ) { - if ( !( unmatched[ i ] || setMatched[ i ] ) ) { - setMatched[ i ] = pop.call( results ); - } - } - } - - // Discard index placeholder values to get only actual matches - setMatched = condense( setMatched ); - } - - // Add matches to results - push.apply( results, setMatched ); - - // Seedless set matches succeeding multiple successful matchers stipulate sorting - if ( outermost && !seed && setMatched.length > 0 && - ( matchedCount + setMatchers.length ) > 1 ) { - - Sizzle.uniqueSort( results ); - } - } - - // Override manipulation of globals by nested matchers - if ( outermost ) { - dirruns = dirrunsUnique; - outermostContext = contextBackup; - } - - return unmatched; - }; - - return bySet ? - markFunction( superMatcher ) : - superMatcher; -} - -compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { - var i, - setMatchers = [], - elementMatchers = [], - cached = compilerCache[ selector + " " ]; - - if ( !cached ) { - - // Generate a function of recursive functions that can be used to check each element - if ( !match ) { - match = tokenize( selector ); - } - i = match.length; - while ( i-- ) { - cached = matcherFromTokens( match[ i ] ); - if ( cached[ expando ] ) { - setMatchers.push( cached ); - } else { - elementMatchers.push( cached ); - } - } - - // Cache the compiled function - cached = compilerCache( - selector, - matcherFromGroupMatchers( elementMatchers, setMatchers ) - ); - - // Save selector and tokenization - cached.selector = selector; - } - return cached; -}; - -/** - * A low-level selection function that works with Sizzle's compiled - * selector functions - * @param {String|Function} selector A selector or a pre-compiled - * selector function built with Sizzle.compile - * @param {Element} context - * @param {Array} [results] - * @param {Array} [seed] A set of elements to match against - */ -select = Sizzle.select = function( selector, context, results, seed ) { - var i, tokens, token, type, find, - compiled = typeof selector === "function" && selector, - match = !seed && tokenize( ( selector = compiled.selector || selector ) ); - - results = results || []; - - // Try to minimize operations if there is only one selector in the list and no seed - // (the latter of which guarantees us context) - if ( match.length === 1 ) { - - // Reduce context if the leading compound selector is an ID - tokens = match[ 0 ] = match[ 0 ].slice( 0 ); - if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && - context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { - - context = ( Expr.find[ "ID" ]( token.matches[ 0 ] - .replace( runescape, funescape ), context ) || [] )[ 0 ]; - if ( !context ) { - return results; - - // Precompiled matchers will still verify ancestry, so step up a level - } else if ( compiled ) { - context = context.parentNode; - } - - selector = selector.slice( tokens.shift().value.length ); - } - - // Fetch a seed set for right-to-left matching - i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length; - while ( i-- ) { - token = tokens[ i ]; - - // Abort if we hit a combinator - if ( Expr.relative[ ( type = token.type ) ] ) { - break; - } - if ( ( find = Expr.find[ type ] ) ) { - - // Search, expanding context for leading sibling combinators - if ( ( seed = find( - token.matches[ 0 ].replace( runescape, funescape ), - rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) || - context - ) ) ) { - - // If seed is empty or no tokens remain, we can return early - tokens.splice( i, 1 ); - selector = seed.length && toSelector( tokens ); - if ( !selector ) { - push.apply( results, seed ); - return results; - } - - break; - } - } - } - } - - // Compile and execute a filtering function if one is not provided - // Provide `match` to avoid retokenization if we modified the selector above - ( compiled || compile( selector, match ) )( - seed, - context, - !documentIsHTML, - results, - !context || rsibling.test( selector ) && testContext( context.parentNode ) || context - ); - return results; -}; - -// One-time assignments - -// Sort stability -support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; - -// Support: Chrome 14-35+ -// Always assume duplicates if they aren't passed to the comparison function -support.detectDuplicates = !!hasDuplicate; - -// Initialize against the default document -setDocument(); - -// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) -// Detached nodes confoundingly follow *each other* -support.sortDetached = assert( function( el ) { - - // Should return 1, but returns 4 (following) - return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; -} ); - -// Support: IE<8 -// Prevent attribute/property "interpolation" -// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx -if ( !assert( function( el ) { - el.innerHTML = ""; - return el.firstChild.getAttribute( "href" ) === "#"; -} ) ) { - addHandle( "type|href|height|width", function( elem, name, isXML ) { - if ( !isXML ) { - return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); - } - } ); -} - -// Support: IE<9 -// Use defaultValue in place of getAttribute("value") -if ( !support.attributes || !assert( function( el ) { - el.innerHTML = ""; - el.firstChild.setAttribute( "value", "" ); - return el.firstChild.getAttribute( "value" ) === ""; -} ) ) { - addHandle( "value", function( elem, _name, isXML ) { - if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { - return elem.defaultValue; - } - } ); -} - -// Support: IE<9 -// Use getAttributeNode to fetch booleans when getAttribute lies -if ( !assert( function( el ) { - return el.getAttribute( "disabled" ) == null; -} ) ) { - addHandle( booleans, function( elem, name, isXML ) { - var val; - if ( !isXML ) { - return elem[ name ] === true ? name.toLowerCase() : - ( val = elem.getAttributeNode( name ) ) && val.specified ? - val.value : - null; - } - } ); -} - -return Sizzle; - -} )( window ); - - - -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; - -// Deprecated -jQuery.expr[ ":" ] = jQuery.expr.pseudos; -jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; -jQuery.escapeSelector = Sizzle.escape; - - - - -var dir = function( elem, dir, until ) { - var matched = [], - truncate = until !== undefined; - - while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { - if ( elem.nodeType === 1 ) { - if ( truncate && jQuery( elem ).is( until ) ) { - break; - } - matched.push( elem ); - } - } - return matched; -}; - - -var siblings = function( n, elem ) { - var matched = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - matched.push( n ); - } - } - - return matched; -}; - - -var rneedsContext = jQuery.expr.match.needsContext; - - - -function nodeName( elem, name ) { - - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - -}; -var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); - - - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, not ) { - if ( isFunction( qualifier ) ) { - return jQuery.grep( elements, function( elem, i ) { - return !!qualifier.call( elem, i, elem ) !== not; - } ); - } - - // Single element - if ( qualifier.nodeType ) { - return jQuery.grep( elements, function( elem ) { - return ( elem === qualifier ) !== not; - } ); - } - - // Arraylike of elements (jQuery, arguments, Array) - if ( typeof qualifier !== "string" ) { - return jQuery.grep( elements, function( elem ) { - return ( indexOf.call( qualifier, elem ) > -1 ) !== not; - } ); - } - - // Filtered directly for both simple and complex selectors - return jQuery.filter( qualifier, elements, not ); -} - -jQuery.filter = function( expr, elems, not ) { - var elem = elems[ 0 ]; - - if ( not ) { - expr = ":not(" + expr + ")"; - } - - if ( elems.length === 1 && elem.nodeType === 1 ) { - return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; - } - - return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { - return elem.nodeType === 1; - } ) ); -}; - -jQuery.fn.extend( { - find: function( selector ) { - var i, ret, - len = this.length, - self = this; - - if ( typeof selector !== "string" ) { - return this.pushStack( jQuery( selector ).filter( function() { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - } ) ); - } - - ret = this.pushStack( [] ); - - for ( i = 0; i < len; i++ ) { - jQuery.find( selector, self[ i ], ret ); - } - - return len > 1 ? jQuery.uniqueSort( ret ) : ret; - }, - filter: function( selector ) { - return this.pushStack( winnow( this, selector || [], false ) ); - }, - not: function( selector ) { - return this.pushStack( winnow( this, selector || [], true ) ); - }, - is: function( selector ) { - return !!winnow( - this, - - // If this is a positional/relative selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - typeof selector === "string" && rneedsContext.test( selector ) ? - jQuery( selector ) : - selector || [], - false - ).length; - } -} ); - - -// Initialize a jQuery object - - -// A central reference to the root jQuery(document) -var rootjQuery, - - // A simple way to check for HTML strings - // Prioritize #id over to avoid XSS via location.hash (#9521) - // Strict HTML recognition (#11290: must start with <) - // Shortcut simple #id case for speed - rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, - - init = jQuery.fn.init = function( selector, context, root ) { - var match, elem; - - // HANDLE: $(""), $(null), $(undefined), $(false) - if ( !selector ) { - return this; - } - - // Method init() accepts an alternate rootjQuery - // so migrate can support jQuery.sub (gh-2101) - root = root || rootjQuery; - - // Handle HTML strings - if ( typeof selector === "string" ) { - if ( selector[ 0 ] === "<" && - selector[ selector.length - 1 ] === ">" && - selector.length >= 3 ) { - - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = rquickExpr.exec( selector ); - } - - // Match html or make sure no context is specified for #id - if ( match && ( match[ 1 ] || !context ) ) { - - // HANDLE: $(html) -> $(array) - if ( match[ 1 ] ) { - context = context instanceof jQuery ? context[ 0 ] : context; - - // Option to run scripts is true for back-compat - // Intentionally let the error be thrown if parseHTML is not present - jQuery.merge( this, jQuery.parseHTML( - match[ 1 ], - context && context.nodeType ? context.ownerDocument || context : document, - true - ) ); - - // HANDLE: $(html, props) - if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { - for ( match in context ) { - - // Properties of context are called as methods if possible - if ( isFunction( this[ match ] ) ) { - this[ match ]( context[ match ] ); - - // ...and otherwise set as attributes - } else { - this.attr( match, context[ match ] ); - } - } - } - - return this; - - // HANDLE: $(#id) - } else { - elem = document.getElementById( match[ 2 ] ); - - if ( elem ) { - - // Inject the element directly into the jQuery object - this[ 0 ] = elem; - this.length = 1; - } - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return ( context || root ).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(DOMElement) - } else if ( selector.nodeType ) { - this[ 0 ] = selector; - this.length = 1; - return this; - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( isFunction( selector ) ) { - return root.ready !== undefined ? - root.ready( selector ) : - - // Execute immediately if ready is not present - selector( jQuery ); - } - - return jQuery.makeArray( selector, this ); - }; - -// Give the init function the jQuery prototype for later instantiation -init.prototype = jQuery.fn; - -// Initialize central reference -rootjQuery = jQuery( document ); - - -var rparentsprev = /^(?:parents|prev(?:Until|All))/, - - // Methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - -jQuery.fn.extend( { - has: function( target ) { - var targets = jQuery( target, this ), - l = targets.length; - - return this.filter( function() { - var i = 0; - for ( ; i < l; i++ ) { - if ( jQuery.contains( this, targets[ i ] ) ) { - return true; - } - } - } ); - }, - - closest: function( selectors, context ) { - var cur, - i = 0, - l = this.length, - matched = [], - targets = typeof selectors !== "string" && jQuery( selectors ); - - // Positional selectors never match, since there's no _selection_ context - if ( !rneedsContext.test( selectors ) ) { - for ( ; i < l; i++ ) { - for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { - - // Always skip document fragments - if ( cur.nodeType < 11 && ( targets ? - targets.index( cur ) > -1 : - - // Don't pass non-elements to Sizzle - cur.nodeType === 1 && - jQuery.find.matchesSelector( cur, selectors ) ) ) { - - matched.push( cur ); - break; - } - } - } - } - - return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); - }, - - // Determine the position of an element within the set - index: function( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; - } - - // Index in selector - if ( typeof elem === "string" ) { - return indexOf.call( jQuery( elem ), this[ 0 ] ); - } - - // Locate the position of the desired element - return indexOf.call( this, - - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[ 0 ] : elem - ); - }, - - add: function( selector, context ) { - return this.pushStack( - jQuery.uniqueSort( - jQuery.merge( this.get(), jQuery( selector, context ) ) - ) - ); - }, - - addBack: function( selector ) { - return this.add( selector == null ? - this.prevObject : this.prevObject.filter( selector ) - ); - } -} ); - -function sibling( cur, dir ) { - while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} - return cur; -} - -jQuery.each( { - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, _i, until ) { - return dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return sibling( elem, "nextSibling" ); - }, - prev: function( elem ) { - return sibling( elem, "previousSibling" ); - }, - nextAll: function( elem ) { - return dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, _i, until ) { - return dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, _i, until ) { - return dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return siblings( ( elem.parentNode || {} ).firstChild, elem ); - }, - children: function( elem ) { - return siblings( elem.firstChild ); - }, - contents: function( elem ) { - if ( elem.contentDocument != null && - - // Support: IE 11+ - // elements with no `data` attribute has an object - // `contentDocument` with a `null` prototype. - getProto( elem.contentDocument ) ) { - - return elem.contentDocument; - } - - // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only - // Treat the template element as a regular one in browsers that - // don't support it. - if ( nodeName( elem, "template" ) ) { - elem = elem.content || elem; - } - - return jQuery.merge( [], elem.childNodes ); - } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var matched = jQuery.map( this, fn, until ); - - if ( name.slice( -5 ) !== "Until" ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - matched = jQuery.filter( selector, matched ); - } - - if ( this.length > 1 ) { - - // Remove duplicates - if ( !guaranteedUnique[ name ] ) { - jQuery.uniqueSort( matched ); - } - - // Reverse order for parents* and prev-derivatives - if ( rparentsprev.test( name ) ) { - matched.reverse(); - } - } - - return this.pushStack( matched ); - }; -} ); -var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); - - - -// Convert String-formatted options into Object-formatted ones -function createOptions( options ) { - var object = {}; - jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { - object[ flag ] = true; - } ); - return object; -} - -/* - * Create a callback list using the following parameters: - * - * options: an optional list of space-separated options that will change how - * the callback list behaves or a more traditional option object - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible options: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ -jQuery.Callbacks = function( options ) { - - // Convert options from String-formatted to Object-formatted if needed - // (we check in cache first) - options = typeof options === "string" ? - createOptions( options ) : - jQuery.extend( {}, options ); - - var // Flag to know if list is currently firing - firing, - - // Last fire value for non-forgettable lists - memory, - - // Flag to know if list was already fired - fired, - - // Flag to prevent firing - locked, - - // Actual callback list - list = [], - - // Queue of execution data for repeatable lists - queue = [], - - // Index of currently firing callback (modified by add/remove as needed) - firingIndex = -1, - - // Fire callbacks - fire = function() { - - // Enforce single-firing - locked = locked || options.once; - - // Execute callbacks for all pending executions, - // respecting firingIndex overrides and runtime changes - fired = firing = true; - for ( ; queue.length; firingIndex = -1 ) { - memory = queue.shift(); - while ( ++firingIndex < list.length ) { - - // Run callback and check for early termination - if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && - options.stopOnFalse ) { - - // Jump to end and forget the data so .add doesn't re-fire - firingIndex = list.length; - memory = false; - } - } - } - - // Forget the data if we're done with it - if ( !options.memory ) { - memory = false; - } - - firing = false; - - // Clean up if we're done firing for good - if ( locked ) { - - // Keep an empty list if we have data for future add calls - if ( memory ) { - list = []; - - // Otherwise, this object is spent - } else { - list = ""; - } - } - }, - - // Actual Callbacks object - self = { - - // Add a callback or a collection of callbacks to the list - add: function() { - if ( list ) { - - // If we have memory from a past run, we should fire after adding - if ( memory && !firing ) { - firingIndex = list.length - 1; - queue.push( memory ); - } - - ( function add( args ) { - jQuery.each( args, function( _, arg ) { - if ( isFunction( arg ) ) { - if ( !options.unique || !self.has( arg ) ) { - list.push( arg ); - } - } else if ( arg && arg.length && toType( arg ) !== "string" ) { - - // Inspect recursively - add( arg ); - } - } ); - } )( arguments ); - - if ( memory && !firing ) { - fire(); - } - } - return this; - }, - - // Remove a callback from the list - remove: function() { - jQuery.each( arguments, function( _, arg ) { - var index; - while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { - list.splice( index, 1 ); - - // Handle firing indexes - if ( index <= firingIndex ) { - firingIndex--; - } - } - } ); - return this; - }, - - // Check if a given callback is in the list. - // If no argument is given, return whether or not list has callbacks attached. - has: function( fn ) { - return fn ? - jQuery.inArray( fn, list ) > -1 : - list.length > 0; - }, - - // Remove all callbacks from the list - empty: function() { - if ( list ) { - list = []; - } - return this; - }, - - // Disable .fire and .add - // Abort any current/pending executions - // Clear all callbacks and values - disable: function() { - locked = queue = []; - list = memory = ""; - return this; - }, - disabled: function() { - return !list; - }, - - // Disable .fire - // Also disable .add unless we have memory (since it would have no effect) - // Abort any pending executions - lock: function() { - locked = queue = []; - if ( !memory && !firing ) { - list = memory = ""; - } - return this; - }, - locked: function() { - return !!locked; - }, - - // Call all callbacks with the given context and arguments - fireWith: function( context, args ) { - if ( !locked ) { - args = args || []; - args = [ context, args.slice ? args.slice() : args ]; - queue.push( args ); - if ( !firing ) { - fire(); - } - } - return this; - }, - - // Call all the callbacks with the given arguments - fire: function() { - self.fireWith( this, arguments ); - return this; - }, - - // To know if the callbacks have already been called at least once - fired: function() { - return !!fired; - } - }; - - return self; -}; - - -function Identity( v ) { - return v; -} -function Thrower( ex ) { - throw ex; -} - -function adoptValue( value, resolve, reject, noValue ) { - var method; - - try { - - // Check for promise aspect first to privilege synchronous behavior - if ( value && isFunction( ( method = value.promise ) ) ) { - method.call( value ).done( resolve ).fail( reject ); - - // Other thenables - } else if ( value && isFunction( ( method = value.then ) ) ) { - method.call( value, resolve, reject ); - - // Other non-thenables - } else { - - // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: - // * false: [ value ].slice( 0 ) => resolve( value ) - // * true: [ value ].slice( 1 ) => resolve() - resolve.apply( undefined, [ value ].slice( noValue ) ); - } - - // For Promises/A+, convert exceptions into rejections - // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in - // Deferred#then to conditionally suppress rejection. - } catch ( value ) { - - // Support: Android 4.0 only - // Strict mode functions invoked without .call/.apply get global-object context - reject.apply( undefined, [ value ] ); - } -} - -jQuery.extend( { - - Deferred: function( func ) { - var tuples = [ - - // action, add listener, callbacks, - // ... .then handlers, argument index, [final state] - [ "notify", "progress", jQuery.Callbacks( "memory" ), - jQuery.Callbacks( "memory" ), 2 ], - [ "resolve", "done", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 0, "resolved" ], - [ "reject", "fail", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 1, "rejected" ] - ], - state = "pending", - promise = { - state: function() { - return state; - }, - always: function() { - deferred.done( arguments ).fail( arguments ); - return this; - }, - "catch": function( fn ) { - return promise.then( null, fn ); - }, - - // Keep pipe for back-compat - pipe: function( /* fnDone, fnFail, fnProgress */ ) { - var fns = arguments; - - return jQuery.Deferred( function( newDefer ) { - jQuery.each( tuples, function( _i, tuple ) { - - // Map tuples (progress, done, fail) to arguments (done, fail, progress) - var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; - - // deferred.progress(function() { bind to newDefer or newDefer.notify }) - // deferred.done(function() { bind to newDefer or newDefer.resolve }) - // deferred.fail(function() { bind to newDefer or newDefer.reject }) - deferred[ tuple[ 1 ] ]( function() { - var returned = fn && fn.apply( this, arguments ); - if ( returned && isFunction( returned.promise ) ) { - returned.promise() - .progress( newDefer.notify ) - .done( newDefer.resolve ) - .fail( newDefer.reject ); - } else { - newDefer[ tuple[ 0 ] + "With" ]( - this, - fn ? [ returned ] : arguments - ); - } - } ); - } ); - fns = null; - } ).promise(); - }, - then: function( onFulfilled, onRejected, onProgress ) { - var maxDepth = 0; - function resolve( depth, deferred, handler, special ) { - return function() { - var that = this, - args = arguments, - mightThrow = function() { - var returned, then; - - // Support: Promises/A+ section 2.3.3.3.3 - // https://promisesaplus.com/#point-59 - // Ignore double-resolution attempts - if ( depth < maxDepth ) { - return; - } - - returned = handler.apply( that, args ); - - // Support: Promises/A+ section 2.3.1 - // https://promisesaplus.com/#point-48 - if ( returned === deferred.promise() ) { - throw new TypeError( "Thenable self-resolution" ); - } - - // Support: Promises/A+ sections 2.3.3.1, 3.5 - // https://promisesaplus.com/#point-54 - // https://promisesaplus.com/#point-75 - // Retrieve `then` only once - then = returned && - - // Support: Promises/A+ section 2.3.4 - // https://promisesaplus.com/#point-64 - // Only check objects and functions for thenability - ( typeof returned === "object" || - typeof returned === "function" ) && - returned.then; - - // Handle a returned thenable - if ( isFunction( then ) ) { - - // Special processors (notify) just wait for resolution - if ( special ) { - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ) - ); - - // Normal processors (resolve) also hook into progress - } else { - - // ...and disregard older resolution values - maxDepth++; - - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ), - resolve( maxDepth, deferred, Identity, - deferred.notifyWith ) - ); - } - - // Handle all other returned values - } else { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Identity ) { - that = undefined; - args = [ returned ]; - } - - // Process the value(s) - // Default process is resolve - ( special || deferred.resolveWith )( that, args ); - } - }, - - // Only normal processors (resolve) catch and reject exceptions - process = special ? - mightThrow : - function() { - try { - mightThrow(); - } catch ( e ) { - - if ( jQuery.Deferred.exceptionHook ) { - jQuery.Deferred.exceptionHook( e, - process.stackTrace ); - } - - // Support: Promises/A+ section 2.3.3.3.4.1 - // https://promisesaplus.com/#point-61 - // Ignore post-resolution exceptions - if ( depth + 1 >= maxDepth ) { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Thrower ) { - that = undefined; - args = [ e ]; - } - - deferred.rejectWith( that, args ); - } - } - }; - - // Support: Promises/A+ section 2.3.3.3.1 - // https://promisesaplus.com/#point-57 - // Re-resolve promises immediately to dodge false rejection from - // subsequent errors - if ( depth ) { - process(); - } else { - - // Call an optional hook to record the stack, in case of exception - // since it's otherwise lost when execution goes async - if ( jQuery.Deferred.getStackHook ) { - process.stackTrace = jQuery.Deferred.getStackHook(); - } - window.setTimeout( process ); - } - }; - } - - return jQuery.Deferred( function( newDefer ) { - - // progress_handlers.add( ... ) - tuples[ 0 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onProgress ) ? - onProgress : - Identity, - newDefer.notifyWith - ) - ); - - // fulfilled_handlers.add( ... ) - tuples[ 1 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onFulfilled ) ? - onFulfilled : - Identity - ) - ); - - // rejected_handlers.add( ... ) - tuples[ 2 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onRejected ) ? - onRejected : - Thrower - ) - ); - } ).promise(); - }, - - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - return obj != null ? jQuery.extend( obj, promise ) : promise; - } - }, - deferred = {}; - - // Add list-specific methods - jQuery.each( tuples, function( i, tuple ) { - var list = tuple[ 2 ], - stateString = tuple[ 5 ]; - - // promise.progress = list.add - // promise.done = list.add - // promise.fail = list.add - promise[ tuple[ 1 ] ] = list.add; - - // Handle state - if ( stateString ) { - list.add( - function() { - - // state = "resolved" (i.e., fulfilled) - // state = "rejected" - state = stateString; - }, - - // rejected_callbacks.disable - // fulfilled_callbacks.disable - tuples[ 3 - i ][ 2 ].disable, - - // rejected_handlers.disable - // fulfilled_handlers.disable - tuples[ 3 - i ][ 3 ].disable, - - // progress_callbacks.lock - tuples[ 0 ][ 2 ].lock, - - // progress_handlers.lock - tuples[ 0 ][ 3 ].lock - ); - } - - // progress_handlers.fire - // fulfilled_handlers.fire - // rejected_handlers.fire - list.add( tuple[ 3 ].fire ); - - // deferred.notify = function() { deferred.notifyWith(...) } - // deferred.resolve = function() { deferred.resolveWith(...) } - // deferred.reject = function() { deferred.rejectWith(...) } - deferred[ tuple[ 0 ] ] = function() { - deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); - return this; - }; - - // deferred.notifyWith = list.fireWith - // deferred.resolveWith = list.fireWith - // deferred.rejectWith = list.fireWith - deferred[ tuple[ 0 ] + "With" ] = list.fireWith; - } ); - - // Make the deferred a promise - promise.promise( deferred ); - - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function( singleValue ) { - var - - // count of uncompleted subordinates - remaining = arguments.length, - - // count of unprocessed arguments - i = remaining, - - // subordinate fulfillment data - resolveContexts = Array( i ), - resolveValues = slice.call( arguments ), - - // the master Deferred - master = jQuery.Deferred(), - - // subordinate callback factory - updateFunc = function( i ) { - return function( value ) { - resolveContexts[ i ] = this; - resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; - if ( !( --remaining ) ) { - master.resolveWith( resolveContexts, resolveValues ); - } - }; - }; - - // Single- and empty arguments are adopted like Promise.resolve - if ( remaining <= 1 ) { - adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, - !remaining ); - - // Use .then() to unwrap secondary thenables (cf. gh-3000) - if ( master.state() === "pending" || - isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { - - return master.then(); - } - } - - // Multiple arguments are aggregated like Promise.all array elements - while ( i-- ) { - adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); - } - - return master.promise(); - } -} ); - - -// These usually indicate a programmer mistake during development, -// warn about them ASAP rather than swallowing them by default. -var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; - -jQuery.Deferred.exceptionHook = function( error, stack ) { - - // Support: IE 8 - 9 only - // Console exists when dev tools are open, which can happen at any time - if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { - window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); - } -}; - - - - -jQuery.readyException = function( error ) { - window.setTimeout( function() { - throw error; - } ); -}; - - - - -// The deferred used on DOM ready -var readyList = jQuery.Deferred(); - -jQuery.fn.ready = function( fn ) { - - readyList - .then( fn ) - - // Wrap jQuery.readyException in a function so that the lookup - // happens at the time of error handling instead of callback - // registration. - .catch( function( error ) { - jQuery.readyException( error ); - } ); - - return this; -}; - -jQuery.extend( { - - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Handle when the DOM is ready - ready: function( wait ) { - - // Abort if there are pending holds or we're already ready - if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { - return; - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith( document, [ jQuery ] ); - } -} ); - -jQuery.ready.then = readyList.then; - -// The ready event handler and self cleanup method -function completed() { - document.removeEventListener( "DOMContentLoaded", completed ); - window.removeEventListener( "load", completed ); - jQuery.ready(); -} - -// Catch cases where $(document).ready() is called -// after the browser event has already occurred. -// Support: IE <=9 - 10 only -// Older IE sometimes signals "interactive" too soon -if ( document.readyState === "complete" || - ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { - - // Handle it asynchronously to allow scripts the opportunity to delay ready - window.setTimeout( jQuery.ready ); - -} else { - - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", completed ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", completed ); -} - - - - -// Multifunctional method to get and set values of a collection -// The value/s can optionally be executed if it's a function -var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { - var i = 0, - len = elems.length, - bulk = key == null; - - // Sets many values - if ( toType( key ) === "object" ) { - chainable = true; - for ( i in key ) { - access( elems, fn, i, key[ i ], true, emptyGet, raw ); - } - - // Sets one value - } else if ( value !== undefined ) { - chainable = true; - - if ( !isFunction( value ) ) { - raw = true; - } - - if ( bulk ) { - - // Bulk operations run against the entire set - if ( raw ) { - fn.call( elems, value ); - fn = null; - - // ...except when executing function values - } else { - bulk = fn; - fn = function( elem, _key, value ) { - return bulk.call( jQuery( elem ), value ); - }; - } - } - - if ( fn ) { - for ( ; i < len; i++ ) { - fn( - elems[ i ], key, raw ? - value : - value.call( elems[ i ], i, fn( elems[ i ], key ) ) - ); - } - } - } - - if ( chainable ) { - return elems; - } - - // Gets - if ( bulk ) { - return fn.call( elems ); - } - - return len ? fn( elems[ 0 ], key ) : emptyGet; -}; - - -// Matches dashed string for camelizing -var rmsPrefix = /^-ms-/, - rdashAlpha = /-([a-z])/g; - -// Used by camelCase as callback to replace() -function fcamelCase( _all, letter ) { - return letter.toUpperCase(); -} - -// Convert dashed to camelCase; used by the css and data modules -// Support: IE <=9 - 11, Edge 12 - 15 -// Microsoft forgot to hump their vendor prefix (#9572) -function camelCase( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); -} -var acceptData = function( owner ) { - - // Accepts only: - // - Node - // - Node.ELEMENT_NODE - // - Node.DOCUMENT_NODE - // - Object - // - Any - return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); -}; - - - - -function Data() { - this.expando = jQuery.expando + Data.uid++; -} - -Data.uid = 1; - -Data.prototype = { - - cache: function( owner ) { - - // Check if the owner object already has a cache - var value = owner[ this.expando ]; - - // If not, create one - if ( !value ) { - value = {}; - - // We can accept data for non-element nodes in modern browsers, - // but we should not, see #8335. - // Always return an empty object. - if ( acceptData( owner ) ) { - - // If it is a node unlikely to be stringify-ed or looped over - // use plain assignment - if ( owner.nodeType ) { - owner[ this.expando ] = value; - - // Otherwise secure it in a non-enumerable property - // configurable must be true to allow the property to be - // deleted when data is removed - } else { - Object.defineProperty( owner, this.expando, { - value: value, - configurable: true - } ); - } - } - } - - return value; - }, - set: function( owner, data, value ) { - var prop, - cache = this.cache( owner ); - - // Handle: [ owner, key, value ] args - // Always use camelCase key (gh-2257) - if ( typeof data === "string" ) { - cache[ camelCase( data ) ] = value; - - // Handle: [ owner, { properties } ] args - } else { - - // Copy the properties one-by-one to the cache object - for ( prop in data ) { - cache[ camelCase( prop ) ] = data[ prop ]; - } - } - return cache; - }, - get: function( owner, key ) { - return key === undefined ? - this.cache( owner ) : - - // Always use camelCase key (gh-2257) - owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; - }, - access: function( owner, key, value ) { - - // In cases where either: - // - // 1. No key was specified - // 2. A string key was specified, but no value provided - // - // Take the "read" path and allow the get method to determine - // which value to return, respectively either: - // - // 1. The entire cache object - // 2. The data stored at the key - // - if ( key === undefined || - ( ( key && typeof key === "string" ) && value === undefined ) ) { - - return this.get( owner, key ); - } - - // When the key is not a string, or both a key and value - // are specified, set or extend (existing objects) with either: - // - // 1. An object of properties - // 2. A key and value - // - this.set( owner, key, value ); - - // Since the "set" path can have two possible entry points - // return the expected data based on which path was taken[*] - return value !== undefined ? value : key; - }, - remove: function( owner, key ) { - var i, - cache = owner[ this.expando ]; - - if ( cache === undefined ) { - return; - } - - if ( key !== undefined ) { - - // Support array or space separated string of keys - if ( Array.isArray( key ) ) { - - // If key is an array of keys... - // We always set camelCase keys, so remove that. - key = key.map( camelCase ); - } else { - key = camelCase( key ); - - // If a key with the spaces exists, use it. - // Otherwise, create an array by matching non-whitespace - key = key in cache ? - [ key ] : - ( key.match( rnothtmlwhite ) || [] ); - } - - i = key.length; - - while ( i-- ) { - delete cache[ key[ i ] ]; - } - } - - // Remove the expando if there's no more data - if ( key === undefined || jQuery.isEmptyObject( cache ) ) { - - // Support: Chrome <=35 - 45 - // Webkit & Blink performance suffers when deleting properties - // from DOM nodes, so set to undefined instead - // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) - if ( owner.nodeType ) { - owner[ this.expando ] = undefined; - } else { - delete owner[ this.expando ]; - } - } - }, - hasData: function( owner ) { - var cache = owner[ this.expando ]; - return cache !== undefined && !jQuery.isEmptyObject( cache ); - } -}; -var dataPriv = new Data(); - -var dataUser = new Data(); - - - -// Implementation Summary -// -// 1. Enforce API surface and semantic compatibility with 1.9.x branch -// 2. Improve the module's maintainability by reducing the storage -// paths to a single mechanism. -// 3. Use the same single mechanism to support "private" and "user" data. -// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) -// 5. Avoid exposing implementation details on user objects (eg. expando properties) -// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 - -var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, - rmultiDash = /[A-Z]/g; - -function getData( data ) { - if ( data === "true" ) { - return true; - } - - if ( data === "false" ) { - return false; - } - - if ( data === "null" ) { - return null; - } - - // Only convert to a number if it doesn't change the string - if ( data === +data + "" ) { - return +data; - } - - if ( rbrace.test( data ) ) { - return JSON.parse( data ); - } - - return data; -} - -function dataAttr( elem, key, data ) { - var name; - - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = getData( data ); - } catch ( e ) {} - - // Make sure we set the data so it isn't changed later - dataUser.set( elem, key, data ); - } else { - data = undefined; - } - } - return data; -} - -jQuery.extend( { - hasData: function( elem ) { - return dataUser.hasData( elem ) || dataPriv.hasData( elem ); - }, - - data: function( elem, name, data ) { - return dataUser.access( elem, name, data ); - }, - - removeData: function( elem, name ) { - dataUser.remove( elem, name ); - }, - - // TODO: Now that all calls to _data and _removeData have been replaced - // with direct calls to dataPriv methods, these can be deprecated. - _data: function( elem, name, data ) { - return dataPriv.access( elem, name, data ); - }, - - _removeData: function( elem, name ) { - dataPriv.remove( elem, name ); - } -} ); - -jQuery.fn.extend( { - data: function( key, value ) { - var i, name, data, - elem = this[ 0 ], - attrs = elem && elem.attributes; - - // Gets all values - if ( key === undefined ) { - if ( this.length ) { - data = dataUser.get( elem ); - - if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { - i = attrs.length; - while ( i-- ) { - - // Support: IE 11 only - // The attrs elements can be null (#14894) - if ( attrs[ i ] ) { - name = attrs[ i ].name; - if ( name.indexOf( "data-" ) === 0 ) { - name = camelCase( name.slice( 5 ) ); - dataAttr( elem, name, data[ name ] ); - } - } - } - dataPriv.set( elem, "hasDataAttrs", true ); - } - } - - return data; - } - - // Sets multiple values - if ( typeof key === "object" ) { - return this.each( function() { - dataUser.set( this, key ); - } ); - } - - return access( this, function( value ) { - var data; - - // The calling jQuery object (element matches) is not empty - // (and therefore has an element appears at this[ 0 ]) and the - // `value` parameter was not undefined. An empty jQuery object - // will result in `undefined` for elem = this[ 0 ] which will - // throw an exception if an attempt to read a data cache is made. - if ( elem && value === undefined ) { - - // Attempt to get data from the cache - // The key will always be camelCased in Data - data = dataUser.get( elem, key ); - if ( data !== undefined ) { - return data; - } - - // Attempt to "discover" the data in - // HTML5 custom data-* attrs - data = dataAttr( elem, key ); - if ( data !== undefined ) { - return data; - } - - // We tried really hard, but the data doesn't exist. - return; - } - - // Set the data... - this.each( function() { - - // We always store the camelCased key - dataUser.set( this, key, value ); - } ); - }, null, value, arguments.length > 1, null, true ); - }, - - removeData: function( key ) { - return this.each( function() { - dataUser.remove( this, key ); - } ); - } -} ); - - -jQuery.extend( { - queue: function( elem, type, data ) { - var queue; - - if ( elem ) { - type = ( type || "fx" ) + "queue"; - queue = dataPriv.get( elem, type ); - - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !queue || Array.isArray( data ) ) { - queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); - } else { - queue.push( data ); - } - } - return queue || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - startLength = queue.length, - fn = queue.shift(), - hooks = jQuery._queueHooks( elem, type ), - next = function() { - jQuery.dequeue( elem, type ); - }; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - startLength--; - } - - if ( fn ) { - - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift( "inprogress" ); - } - - // Clear up the last queue stop function - delete hooks.stop; - fn.call( elem, next, hooks ); - } - - if ( !startLength && hooks ) { - hooks.empty.fire(); - } - }, - - // Not public - generate a queueHooks object, or return the current one - _queueHooks: function( elem, type ) { - var key = type + "queueHooks"; - return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { - empty: jQuery.Callbacks( "once memory" ).add( function() { - dataPriv.remove( elem, [ type + "queue", key ] ); - } ) - } ); - } -} ); - -jQuery.fn.extend( { - queue: function( type, data ) { - var setter = 2; - - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - setter--; - } - - if ( arguments.length < setter ) { - return jQuery.queue( this[ 0 ], type ); - } - - return data === undefined ? - this : - this.each( function() { - var queue = jQuery.queue( this, type, data ); - - // Ensure a hooks for this queue - jQuery._queueHooks( this, type ); - - if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - } ); - }, - dequeue: function( type ) { - return this.each( function() { - jQuery.dequeue( this, type ); - } ); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, obj ) { - var tmp, - count = 1, - defer = jQuery.Deferred(), - elements = this, - i = this.length, - resolve = function() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - }; - - if ( typeof type !== "string" ) { - obj = type; - type = undefined; - } - type = type || "fx"; - - while ( i-- ) { - tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); - if ( tmp && tmp.empty ) { - count++; - tmp.empty.add( resolve ); - } - } - resolve(); - return defer.promise( obj ); - } -} ); -var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; - -var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); - - -var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; - -var documentElement = document.documentElement; - - - - var isAttached = function( elem ) { - return jQuery.contains( elem.ownerDocument, elem ); - }, - composed = { composed: true }; - - // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only - // Check attachment across shadow DOM boundaries when possible (gh-3504) - // Support: iOS 10.0-10.2 only - // Early iOS 10 versions support `attachShadow` but not `getRootNode`, - // leading to errors. We need to check for `getRootNode`. - if ( documentElement.getRootNode ) { - isAttached = function( elem ) { - return jQuery.contains( elem.ownerDocument, elem ) || - elem.getRootNode( composed ) === elem.ownerDocument; - }; - } -var isHiddenWithinTree = function( elem, el ) { - - // isHiddenWithinTree might be called from jQuery#filter function; - // in that case, element will be second argument - elem = el || elem; - - // Inline style trumps all - return elem.style.display === "none" || - elem.style.display === "" && - - // Otherwise, check computed style - // Support: Firefox <=43 - 45 - // Disconnected elements can have computed display: none, so first confirm that elem is - // in the document. - isAttached( elem ) && - - jQuery.css( elem, "display" ) === "none"; - }; - - - -function adjustCSS( elem, prop, valueParts, tween ) { - var adjusted, scale, - maxIterations = 20, - currentValue = tween ? - function() { - return tween.cur(); - } : - function() { - return jQuery.css( elem, prop, "" ); - }, - initial = currentValue(), - unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), - - // Starting value computation is required for potential unit mismatches - initialInUnit = elem.nodeType && - ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && - rcssNum.exec( jQuery.css( elem, prop ) ); - - if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { - - // Support: Firefox <=54 - // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) - initial = initial / 2; - - // Trust units reported by jQuery.css - unit = unit || initialInUnit[ 3 ]; - - // Iteratively approximate from a nonzero starting point - initialInUnit = +initial || 1; - - while ( maxIterations-- ) { - - // Evaluate and update our best guess (doubling guesses that zero out). - // Finish if the scale equals or crosses 1 (making the old*new product non-positive). - jQuery.style( elem, prop, initialInUnit + unit ); - if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { - maxIterations = 0; - } - initialInUnit = initialInUnit / scale; - - } - - initialInUnit = initialInUnit * 2; - jQuery.style( elem, prop, initialInUnit + unit ); - - // Make sure we update the tween properties later on - valueParts = valueParts || []; - } - - if ( valueParts ) { - initialInUnit = +initialInUnit || +initial || 0; - - // Apply relative offset (+=/-=) if specified - adjusted = valueParts[ 1 ] ? - initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : - +valueParts[ 2 ]; - if ( tween ) { - tween.unit = unit; - tween.start = initialInUnit; - tween.end = adjusted; - } - } - return adjusted; -} - - -var defaultDisplayMap = {}; - -function getDefaultDisplay( elem ) { - var temp, - doc = elem.ownerDocument, - nodeName = elem.nodeName, - display = defaultDisplayMap[ nodeName ]; - - if ( display ) { - return display; - } - - temp = doc.body.appendChild( doc.createElement( nodeName ) ); - display = jQuery.css( temp, "display" ); - - temp.parentNode.removeChild( temp ); - - if ( display === "none" ) { - display = "block"; - } - defaultDisplayMap[ nodeName ] = display; - - return display; -} - -function showHide( elements, show ) { - var display, elem, - values = [], - index = 0, - length = elements.length; - - // Determine new display value for elements that need to change - for ( ; index < length; index++ ) { - elem = elements[ index ]; - if ( !elem.style ) { - continue; - } - - display = elem.style.display; - if ( show ) { - - // Since we force visibility upon cascade-hidden elements, an immediate (and slow) - // check is required in this first loop unless we have a nonempty display value (either - // inline or about-to-be-restored) - if ( display === "none" ) { - values[ index ] = dataPriv.get( elem, "display" ) || null; - if ( !values[ index ] ) { - elem.style.display = ""; - } - } - if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { - values[ index ] = getDefaultDisplay( elem ); - } - } else { - if ( display !== "none" ) { - values[ index ] = "none"; - - // Remember what we're overwriting - dataPriv.set( elem, "display", display ); - } - } - } - - // Set the display of the elements in a second loop to avoid constant reflow - for ( index = 0; index < length; index++ ) { - if ( values[ index ] != null ) { - elements[ index ].style.display = values[ index ]; - } - } - - return elements; -} - -jQuery.fn.extend( { - show: function() { - return showHide( this, true ); - }, - hide: function() { - return showHide( this ); - }, - toggle: function( state ) { - if ( typeof state === "boolean" ) { - return state ? this.show() : this.hide(); - } - - return this.each( function() { - if ( isHiddenWithinTree( this ) ) { - jQuery( this ).show(); - } else { - jQuery( this ).hide(); - } - } ); - } -} ); -var rcheckableType = ( /^(?:checkbox|radio)$/i ); - -var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); - -var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); - - - -( function() { - var fragment = document.createDocumentFragment(), - div = fragment.appendChild( document.createElement( "div" ) ), - input = document.createElement( "input" ); - - // Support: Android 4.0 - 4.3 only - // Check state lost if the name is set (#11217) - // Support: Windows Web Apps (WWA) - // `name` and `type` must use .setAttribute for WWA (#14901) - input.setAttribute( "type", "radio" ); - input.setAttribute( "checked", "checked" ); - input.setAttribute( "name", "t" ); - - div.appendChild( input ); - - // Support: Android <=4.1 only - // Older WebKit doesn't clone checked state correctly in fragments - support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Support: IE <=11 only - // Make sure textarea (and checkbox) defaultValue is properly cloned - div.innerHTML = ""; - support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; - - // Support: IE <=9 only - // IE <=9 replaces "; - support.option = !!div.lastChild; -} )(); - - -// We have to close these tags to support XHTML (#13200) -var wrapMap = { - - // XHTML parsers do not magically insert elements in the - // same way that tag soup parsers do. So we cannot shorten - // this by omitting or other required elements. - thead: [ 1, "", "
" ], - col: [ 2, "", "
" ], - tr: [ 2, "", "
" ], - td: [ 3, "", "
" ], - - _default: [ 0, "", "" ] -}; - -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - -// Support: IE <=9 only -if ( !support.option ) { - wrapMap.optgroup = wrapMap.option = [ 1, "" ]; -} - - -function getAll( context, tag ) { - - // Support: IE <=9 - 11 only - // Use typeof to avoid zero-argument method invocation on host objects (#15151) - var ret; - - if ( typeof context.getElementsByTagName !== "undefined" ) { - ret = context.getElementsByTagName( tag || "*" ); - - } else if ( typeof context.querySelectorAll !== "undefined" ) { - ret = context.querySelectorAll( tag || "*" ); - - } else { - ret = []; - } - - if ( tag === undefined || tag && nodeName( context, tag ) ) { - return jQuery.merge( [ context ], ret ); - } - - return ret; -} - - -// Mark scripts as having already been evaluated -function setGlobalEval( elems, refElements ) { - var i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - dataPriv.set( - elems[ i ], - "globalEval", - !refElements || dataPriv.get( refElements[ i ], "globalEval" ) - ); - } -} - - -var rhtml = /<|&#?\w+;/; - -function buildFragment( elems, context, scripts, selection, ignored ) { - var elem, tmp, tag, wrap, attached, j, - fragment = context.createDocumentFragment(), - nodes = [], - i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - elem = elems[ i ]; - - if ( elem || elem === 0 ) { - - // Add nodes directly - if ( toType( elem ) === "object" ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); - - // Convert non-html into a text node - } else if ( !rhtml.test( elem ) ) { - nodes.push( context.createTextNode( elem ) ); - - // Convert html into DOM nodes - } else { - tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); - - // Deserialize a standard representation - tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); - wrap = wrapMap[ tag ] || wrapMap._default; - tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; - - // Descend through wrappers to the right content - j = wrap[ 0 ]; - while ( j-- ) { - tmp = tmp.lastChild; - } - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, tmp.childNodes ); - - // Remember the top-level container - tmp = fragment.firstChild; - - // Ensure the created nodes are orphaned (#12392) - tmp.textContent = ""; - } - } - } - - // Remove wrapper from fragment - fragment.textContent = ""; - - i = 0; - while ( ( elem = nodes[ i++ ] ) ) { - - // Skip elements already in the context collection (trac-4087) - if ( selection && jQuery.inArray( elem, selection ) > -1 ) { - if ( ignored ) { - ignored.push( elem ); - } - continue; - } - - attached = isAttached( elem ); - - // Append to fragment - tmp = getAll( fragment.appendChild( elem ), "script" ); - - // Preserve script evaluation history - if ( attached ) { - setGlobalEval( tmp ); - } - - // Capture executables - if ( scripts ) { - j = 0; - while ( ( elem = tmp[ j++ ] ) ) { - if ( rscriptType.test( elem.type || "" ) ) { - scripts.push( elem ); - } - } - } - } - - return fragment; -} - - -var - rkeyEvent = /^key/, - rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, - rtypenamespace = /^([^.]*)(?:\.(.+)|)/; - -function returnTrue() { - return true; -} - -function returnFalse() { - return false; -} - -// Support: IE <=9 - 11+ -// focus() and blur() are asynchronous, except when they are no-op. -// So expect focus to be synchronous when the element is already active, -// and blur to be synchronous when the element is not already active. -// (focus and blur are always synchronous in other supported browsers, -// this just defines when we can count on it). -function expectSync( elem, type ) { - return ( elem === safeActiveElement() ) === ( type === "focus" ); -} - -// Support: IE <=9 only -// Accessing document.activeElement can throw unexpectedly -// https://bugs.jquery.com/ticket/13393 -function safeActiveElement() { - try { - return document.activeElement; - } catch ( err ) { } -} - -function on( elem, types, selector, data, fn, one ) { - var origFn, type; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { - - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for ( type in types ) { - on( elem, type, selector, data, types[ type ], one ); - } - return elem; - } - - if ( data == null && fn == null ) { - - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return elem; - } - - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return elem.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - } ); -} - -/* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ -jQuery.event = { - - global: {}, - - add: function( elem, types, handler, data, selector ) { - - var handleObjIn, eventHandle, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.get( elem ); - - // Only attach events to objects that accept data - if ( !acceptData( elem ) ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Ensure that invalid selectors throw exceptions at attach time - // Evaluate against documentElement in case elem is a non-element node (e.g., document) - if ( selector ) { - jQuery.find.matchesSelector( documentElement, selector ); - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - if ( !( events = elemData.events ) ) { - events = elemData.events = Object.create( null ); - } - if ( !( eventHandle = elemData.handle ) ) { - eventHandle = elemData.handle = function( e ) { - - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? - jQuery.event.dispatch.apply( elem, arguments ) : undefined; - }; - } - - // Handle multiple events separated by a space - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // There *must* be a type, no attaching namespace-only handlers - if ( !type ) { - continue; - } - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; - - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend( { - type: type, - origType: origType, - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - needsContext: selector && jQuery.expr.match.needsContext.test( selector ), - namespace: namespaces.join( "." ) - }, handleObjIn ); - - // Init the event handler queue if we're the first - if ( !( handlers = events[ type ] ) ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; - - // Only use addEventListener if the special events handler returns false - if ( !special.setup || - special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - }, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, selector, mappedTypes ) { - - var j, origCount, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); - - if ( !elemData || !( events = elemData.events ) ) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); - } - continue; - } - - special = jQuery.event.special[ type ] || {}; - type = ( selector ? special.delegateType : special.bindType ) || type; - handlers = events[ type ] || []; - tmp = tmp[ 2 ] && - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); - - // Remove matching events - origCount = j = handlers.length; - while ( j-- ) { - handleObj = handlers[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !tmp || tmp.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || - selector === "**" && handleObj.selector ) ) { - handlers.splice( j, 1 ); - - if ( handleObj.selector ) { - handlers.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( origCount && !handlers.length ) { - if ( !special.teardown || - special.teardown.call( elem, namespaces, elemData.handle ) === false ) { - - jQuery.removeEvent( elem, type, elemData.handle ); - } - - delete events[ type ]; - } - } - - // Remove data and the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - dataPriv.remove( elem, "handle events" ); - } - }, - - dispatch: function( nativeEvent ) { - - var i, j, ret, matched, handleObj, handlerQueue, - args = new Array( arguments.length ), - - // Make a writable jQuery.Event from the native event object - event = jQuery.event.fix( nativeEvent ), - - handlers = ( - dataPriv.get( this, "events" ) || Object.create( null ) - )[ event.type ] || [], - special = jQuery.event.special[ event.type ] || {}; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[ 0 ] = event; - - for ( i = 1; i < arguments.length; i++ ) { - args[ i ] = arguments[ i ]; - } - - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { - return; - } - - // Determine handlers - handlerQueue = jQuery.event.handlers.call( this, event, handlers ); - - // Run delegates first; they may want to stop propagation beneath us - i = 0; - while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { - event.currentTarget = matched.elem; - - j = 0; - while ( ( handleObj = matched.handlers[ j++ ] ) && - !event.isImmediatePropagationStopped() ) { - - // If the event is namespaced, then each handler is only invoked if it is - // specially universal or its namespaces are a superset of the event's. - if ( !event.rnamespace || handleObj.namespace === false || - event.rnamespace.test( handleObj.namespace ) ) { - - event.handleObj = handleObj; - event.data = handleObj.data; - - ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || - handleObj.handler ).apply( matched.elem, args ); - - if ( ret !== undefined ) { - if ( ( event.result = ret ) === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if ( special.postDispatch ) { - special.postDispatch.call( this, event ); - } - - return event.result; - }, - - handlers: function( event, handlers ) { - var i, handleObj, sel, matchedHandlers, matchedSelectors, - handlerQueue = [], - delegateCount = handlers.delegateCount, - cur = event.target; - - // Find delegate handlers - if ( delegateCount && - - // Support: IE <=9 - // Black-hole SVG instance trees (trac-13180) - cur.nodeType && - - // Support: Firefox <=42 - // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) - // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click - // Support: IE 11 only - // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) - !( event.type === "click" && event.button >= 1 ) ) { - - for ( ; cur !== this; cur = cur.parentNode || this ) { - - // Don't check non-elements (#13208) - // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) - if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { - matchedHandlers = []; - matchedSelectors = {}; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - - // Don't conflict with Object.prototype properties (#13203) - sel = handleObj.selector + " "; - - if ( matchedSelectors[ sel ] === undefined ) { - matchedSelectors[ sel ] = handleObj.needsContext ? - jQuery( sel, this ).index( cur ) > -1 : - jQuery.find( sel, this, null, [ cur ] ).length; - } - if ( matchedSelectors[ sel ] ) { - matchedHandlers.push( handleObj ); - } - } - if ( matchedHandlers.length ) { - handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); - } - } - } - } - - // Add the remaining (directly-bound) handlers - cur = this; - if ( delegateCount < handlers.length ) { - handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); - } - - return handlerQueue; - }, - - addProp: function( name, hook ) { - Object.defineProperty( jQuery.Event.prototype, name, { - enumerable: true, - configurable: true, - - get: isFunction( hook ) ? - function() { - if ( this.originalEvent ) { - return hook( this.originalEvent ); - } - } : - function() { - if ( this.originalEvent ) { - return this.originalEvent[ name ]; - } - }, - - set: function( value ) { - Object.defineProperty( this, name, { - enumerable: true, - configurable: true, - writable: true, - value: value - } ); - } - } ); - }, - - fix: function( originalEvent ) { - return originalEvent[ jQuery.expando ] ? - originalEvent : - new jQuery.Event( originalEvent ); - }, - - special: { - load: { - - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - click: { - - // Utilize native event to ensure correct state for checkable inputs - setup: function( data ) { - - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Claim the first handler - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, "input" ) ) { - - // dataPriv.set( el, "click", ... ) - leverageNative( el, "click", returnTrue ); - } - - // Return false to allow normal processing in the caller - return false; - }, - trigger: function( data ) { - - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Force setup before triggering a click - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, "input" ) ) { - - leverageNative( el, "click" ); - } - - // Return non-false to allow normal event-path propagation - return true; - }, - - // For cross-browser consistency, suppress native .click() on links - // Also prevent it if we're currently inside a leveraged native-event stack - _default: function( event ) { - var target = event.target; - return rcheckableType.test( target.type ) && - target.click && nodeName( target, "input" ) && - dataPriv.get( target, "click" ) || - nodeName( target, "a" ); - } - }, - - beforeunload: { - postDispatch: function( event ) { - - // Support: Firefox 20+ - // Firefox doesn't alert if the returnValue field is not set. - if ( event.result !== undefined && event.originalEvent ) { - event.originalEvent.returnValue = event.result; - } - } - } - } -}; - -// Ensure the presence of an event listener that handles manually-triggered -// synthetic events by interrupting progress until reinvoked in response to -// *native* events that it fires directly, ensuring that state changes have -// already occurred before other listeners are invoked. -function leverageNative( el, type, expectSync ) { - - // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add - if ( !expectSync ) { - if ( dataPriv.get( el, type ) === undefined ) { - jQuery.event.add( el, type, returnTrue ); - } - return; - } - - // Register the controller as a special universal handler for all event namespaces - dataPriv.set( el, type, false ); - jQuery.event.add( el, type, { - namespace: false, - handler: function( event ) { - var notAsync, result, - saved = dataPriv.get( this, type ); - - if ( ( event.isTrigger & 1 ) && this[ type ] ) { - - // Interrupt processing of the outer synthetic .trigger()ed event - // Saved data should be false in such cases, but might be a leftover capture object - // from an async native handler (gh-4350) - if ( !saved.length ) { - - // Store arguments for use when handling the inner native event - // There will always be at least one argument (an event object), so this array - // will not be confused with a leftover capture object. - saved = slice.call( arguments ); - dataPriv.set( this, type, saved ); - - // Trigger the native event and capture its result - // Support: IE <=9 - 11+ - // focus() and blur() are asynchronous - notAsync = expectSync( this, type ); - this[ type ](); - result = dataPriv.get( this, type ); - if ( saved !== result || notAsync ) { - dataPriv.set( this, type, false ); - } else { - result = {}; - } - if ( saved !== result ) { - - // Cancel the outer synthetic event - event.stopImmediatePropagation(); - event.preventDefault(); - return result.value; - } - - // If this is an inner synthetic event for an event with a bubbling surrogate - // (focus or blur), assume that the surrogate already propagated from triggering the - // native event and prevent that from happening again here. - // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the - // bubbling surrogate propagates *after* the non-bubbling base), but that seems - // less bad than duplication. - } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { - event.stopPropagation(); - } - - // If this is a native event triggered above, everything is now in order - // Fire an inner synthetic event with the original arguments - } else if ( saved.length ) { - - // ...and capture the result - dataPriv.set( this, type, { - value: jQuery.event.trigger( - - // Support: IE <=9 - 11+ - // Extend with the prototype to reset the above stopImmediatePropagation() - jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), - saved.slice( 1 ), - this - ) - } ); - - // Abort handling of the native event - event.stopImmediatePropagation(); - } - } - } ); -} - -jQuery.removeEvent = function( elem, type, handle ) { - - // This "if" is needed for plain objects - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle ); - } -}; - -jQuery.Event = function( src, props ) { - - // Allow instantiation without the 'new' keyword - if ( !( this instanceof jQuery.Event ) ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = src.defaultPrevented || - src.defaultPrevented === undefined && - - // Support: Android <=2.3 only - src.returnValue === false ? - returnTrue : - returnFalse; - - // Create target properties - // Support: Safari <=6 - 7 only - // Target should not be a text node (#504, #13143) - this.target = ( src.target && src.target.nodeType === 3 ) ? - src.target.parentNode : - src.target; - - this.currentTarget = src.currentTarget; - this.relatedTarget = src.relatedTarget; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || Date.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - constructor: jQuery.Event, - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse, - isSimulated: false, - - preventDefault: function() { - var e = this.originalEvent; - - this.isDefaultPrevented = returnTrue; - - if ( e && !this.isSimulated ) { - e.preventDefault(); - } - }, - stopPropagation: function() { - var e = this.originalEvent; - - this.isPropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopPropagation(); - } - }, - stopImmediatePropagation: function() { - var e = this.originalEvent; - - this.isImmediatePropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopImmediatePropagation(); - } - - this.stopPropagation(); - } -}; - -// Includes all common event props including KeyEvent and MouseEvent specific props -jQuery.each( { - altKey: true, - bubbles: true, - cancelable: true, - changedTouches: true, - ctrlKey: true, - detail: true, - eventPhase: true, - metaKey: true, - pageX: true, - pageY: true, - shiftKey: true, - view: true, - "char": true, - code: true, - charCode: true, - key: true, - keyCode: true, - button: true, - buttons: true, - clientX: true, - clientY: true, - offsetX: true, - offsetY: true, - pointerId: true, - pointerType: true, - screenX: true, - screenY: true, - targetTouches: true, - toElement: true, - touches: true, - - which: function( event ) { - var button = event.button; - - // Add which for key events - if ( event.which == null && rkeyEvent.test( event.type ) ) { - return event.charCode != null ? event.charCode : event.keyCode; - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { - if ( button & 1 ) { - return 1; - } - - if ( button & 2 ) { - return 3; - } - - if ( button & 4 ) { - return 2; - } - - return 0; - } - - return event.which; - } -}, jQuery.event.addProp ); - -jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { - jQuery.event.special[ type ] = { - - // Utilize native event if possible so blur/focus sequence is correct - setup: function() { - - // Claim the first handler - // dataPriv.set( this, "focus", ... ) - // dataPriv.set( this, "blur", ... ) - leverageNative( this, type, expectSync ); - - // Return false to allow normal processing in the caller - return false; - }, - trigger: function() { - - // Force setup before trigger - leverageNative( this, type ); - - // Return non-false to allow normal event-path propagation - return true; - }, - - delegateType: delegateType - }; -} ); - -// Create mouseenter/leave events using mouseover/out and event-time checks -// so that event delegation works in jQuery. -// Do the same for pointerenter/pointerleave and pointerover/pointerout -// -// Support: Safari 7 only -// Safari sends mouseenter too often; see: -// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 -// for the description of the bug (it existed in older Chrome versions as well). -jQuery.each( { - mouseenter: "mouseover", - mouseleave: "mouseout", - pointerenter: "pointerover", - pointerleave: "pointerout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function( event ) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - - // For mouseenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; -} ); - -jQuery.fn.extend( { - - on: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn ); - }, - one: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn, 1 ); - }, - off: function( types, selector, fn ) { - var handleObj, type; - if ( types && types.preventDefault && types.handleObj ) { - - // ( event ) dispatched jQuery.Event - handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace ? - handleObj.origType + "." + handleObj.namespace : - handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - - // ( types-object [, selector] ) - for ( type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { - - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each( function() { - jQuery.event.remove( this, types, fn, selector ); - } ); - } -} ); - - -var - - // Support: IE <=10 - 11, Edge 12 - 13 only - // In IE/Edge using regex groups here causes severe slowdowns. - // See https://connect.microsoft.com/IE/feedback/details/1736512/ - rnoInnerhtml = /\s*$/g; - -// Prefer a tbody over its parent table for containing new rows -function manipulationTarget( elem, content ) { - if ( nodeName( elem, "table" ) && - nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { - - return jQuery( elem ).children( "tbody" )[ 0 ] || elem; - } - - return elem; -} - -// Replace/restore the type attribute of script elements for safe DOM manipulation -function disableScript( elem ) { - elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; - return elem; -} -function restoreScript( elem ) { - if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { - elem.type = elem.type.slice( 5 ); - } else { - elem.removeAttribute( "type" ); - } - - return elem; -} - -function cloneCopyEvent( src, dest ) { - var i, l, type, pdataOld, udataOld, udataCur, events; - - if ( dest.nodeType !== 1 ) { - return; - } - - // 1. Copy private data: events, handlers, etc. - if ( dataPriv.hasData( src ) ) { - pdataOld = dataPriv.get( src ); - events = pdataOld.events; - - if ( events ) { - dataPriv.remove( dest, "handle events" ); - - for ( type in events ) { - for ( i = 0, l = events[ type ].length; i < l; i++ ) { - jQuery.event.add( dest, type, events[ type ][ i ] ); - } - } - } - } - - // 2. Copy user data - if ( dataUser.hasData( src ) ) { - udataOld = dataUser.access( src ); - udataCur = jQuery.extend( {}, udataOld ); - - dataUser.set( dest, udataCur ); - } -} - -// Fix IE bugs, see support tests -function fixInput( src, dest ) { - var nodeName = dest.nodeName.toLowerCase(); - - // Fails to persist the checked state of a cloned checkbox or radio button. - if ( nodeName === "input" && rcheckableType.test( src.type ) ) { - dest.checked = src.checked; - - // Fails to return the selected option to the default selected state when cloning options - } else if ( nodeName === "input" || nodeName === "textarea" ) { - dest.defaultValue = src.defaultValue; - } -} - -function domManip( collection, args, callback, ignored ) { - - // Flatten any nested arrays - args = flat( args ); - - var fragment, first, scripts, hasScripts, node, doc, - i = 0, - l = collection.length, - iNoClone = l - 1, - value = args[ 0 ], - valueIsFunction = isFunction( value ); - - // We can't cloneNode fragments that contain checked, in WebKit - if ( valueIsFunction || - ( l > 1 && typeof value === "string" && - !support.checkClone && rchecked.test( value ) ) ) { - return collection.each( function( index ) { - var self = collection.eq( index ); - if ( valueIsFunction ) { - args[ 0 ] = value.call( this, index, self.html() ); - } - domManip( self, args, callback, ignored ); - } ); - } - - if ( l ) { - fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); - first = fragment.firstChild; - - if ( fragment.childNodes.length === 1 ) { - fragment = first; - } - - // Require either new content or an interest in ignored elements to invoke the callback - if ( first || ignored ) { - scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); - hasScripts = scripts.length; - - // Use the original fragment for the last item - // instead of the first because it can end up - // being emptied incorrectly in certain situations (#8070). - for ( ; i < l; i++ ) { - node = fragment; - - if ( i !== iNoClone ) { - node = jQuery.clone( node, true, true ); - - // Keep references to cloned scripts for later restoration - if ( hasScripts ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( scripts, getAll( node, "script" ) ); - } - } - - callback.call( collection[ i ], node, i ); - } - - if ( hasScripts ) { - doc = scripts[ scripts.length - 1 ].ownerDocument; - - // Reenable scripts - jQuery.map( scripts, restoreScript ); - - // Evaluate executable scripts on first document insertion - for ( i = 0; i < hasScripts; i++ ) { - node = scripts[ i ]; - if ( rscriptType.test( node.type || "" ) && - !dataPriv.access( node, "globalEval" ) && - jQuery.contains( doc, node ) ) { - - if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { - - // Optional AJAX dependency, but won't run scripts if not present - if ( jQuery._evalUrl && !node.noModule ) { - jQuery._evalUrl( node.src, { - nonce: node.nonce || node.getAttribute( "nonce" ) - }, doc ); - } - } else { - DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); - } - } - } - } - } - } - - return collection; -} - -function remove( elem, selector, keepData ) { - var node, - nodes = selector ? jQuery.filter( selector, elem ) : elem, - i = 0; - - for ( ; ( node = nodes[ i ] ) != null; i++ ) { - if ( !keepData && node.nodeType === 1 ) { - jQuery.cleanData( getAll( node ) ); - } - - if ( node.parentNode ) { - if ( keepData && isAttached( node ) ) { - setGlobalEval( getAll( node, "script" ) ); - } - node.parentNode.removeChild( node ); - } - } - - return elem; -} - -jQuery.extend( { - htmlPrefilter: function( html ) { - return html; - }, - - clone: function( elem, dataAndEvents, deepDataAndEvents ) { - var i, l, srcElements, destElements, - clone = elem.cloneNode( true ), - inPage = isAttached( elem ); - - // Fix IE cloning issues - if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && - !jQuery.isXMLDoc( elem ) ) { - - // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 - destElements = getAll( clone ); - srcElements = getAll( elem ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - fixInput( srcElements[ i ], destElements[ i ] ); - } - } - - // Copy the events from the original to the clone - if ( dataAndEvents ) { - if ( deepDataAndEvents ) { - srcElements = srcElements || getAll( elem ); - destElements = destElements || getAll( clone ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - cloneCopyEvent( srcElements[ i ], destElements[ i ] ); - } - } else { - cloneCopyEvent( elem, clone ); - } - } - - // Preserve script evaluation history - destElements = getAll( clone, "script" ); - if ( destElements.length > 0 ) { - setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); - } - - // Return the cloned set - return clone; - }, - - cleanData: function( elems ) { - var data, elem, type, - special = jQuery.event.special, - i = 0; - - for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { - if ( acceptData( elem ) ) { - if ( ( data = elem[ dataPriv.expando ] ) ) { - if ( data.events ) { - for ( type in data.events ) { - if ( special[ type ] ) { - jQuery.event.remove( elem, type ); - - // This is a shortcut to avoid jQuery.event.remove's overhead - } else { - jQuery.removeEvent( elem, type, data.handle ); - } - } - } - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataPriv.expando ] = undefined; - } - if ( elem[ dataUser.expando ] ) { - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataUser.expando ] = undefined; - } - } - } - } -} ); - -jQuery.fn.extend( { - detach: function( selector ) { - return remove( this, selector, true ); - }, - - remove: function( selector ) { - return remove( this, selector ); - }, - - text: function( value ) { - return access( this, function( value ) { - return value === undefined ? - jQuery.text( this ) : - this.empty().each( function() { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - this.textContent = value; - } - } ); - }, null, value, arguments.length ); - }, - - append: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.appendChild( elem ); - } - } ); - }, - - prepend: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.insertBefore( elem, target.firstChild ); - } - } ); - }, - - before: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this ); - } - } ); - }, - - after: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this.nextSibling ); - } - } ); - }, - - empty: function() { - var elem, - i = 0; - - for ( ; ( elem = this[ i ] ) != null; i++ ) { - if ( elem.nodeType === 1 ) { - - // Prevent memory leaks - jQuery.cleanData( getAll( elem, false ) ); - - // Remove any remaining nodes - elem.textContent = ""; - } - } - - return this; - }, - - clone: function( dataAndEvents, deepDataAndEvents ) { - dataAndEvents = dataAndEvents == null ? false : dataAndEvents; - deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - - return this.map( function() { - return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); - } ); - }, - - html: function( value ) { - return access( this, function( value ) { - var elem = this[ 0 ] || {}, - i = 0, - l = this.length; - - if ( value === undefined && elem.nodeType === 1 ) { - return elem.innerHTML; - } - - // See if we can take a shortcut and just use innerHTML - if ( typeof value === "string" && !rnoInnerhtml.test( value ) && - !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { - - value = jQuery.htmlPrefilter( value ); - - try { - for ( ; i < l; i++ ) { - elem = this[ i ] || {}; - - // Remove element nodes and prevent memory leaks - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - elem.innerHTML = value; - } - } - - elem = 0; - - // If using innerHTML throws an exception, use the fallback method - } catch ( e ) {} - } - - if ( elem ) { - this.empty().append( value ); - } - }, null, value, arguments.length ); - }, - - replaceWith: function() { - var ignored = []; - - // Make the changes, replacing each non-ignored context element with the new content - return domManip( this, arguments, function( elem ) { - var parent = this.parentNode; - - if ( jQuery.inArray( this, ignored ) < 0 ) { - jQuery.cleanData( getAll( this ) ); - if ( parent ) { - parent.replaceChild( elem, this ); - } - } - - // Force callback invocation - }, ignored ); - } -} ); - -jQuery.each( { - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" -}, function( name, original ) { - jQuery.fn[ name ] = function( selector ) { - var elems, - ret = [], - insert = jQuery( selector ), - last = insert.length - 1, - i = 0; - - for ( ; i <= last; i++ ) { - elems = i === last ? this : this.clone( true ); - jQuery( insert[ i ] )[ original ]( elems ); - - // Support: Android <=4.0 only, PhantomJS 1 only - // .get() because push.apply(_, arraylike) throws on ancient WebKit - push.apply( ret, elems.get() ); - } - - return this.pushStack( ret ); - }; -} ); -var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); - -var getStyles = function( elem ) { - - // Support: IE <=11 only, Firefox <=30 (#15098, #14150) - // IE throws on elements created in popups - // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" - var view = elem.ownerDocument.defaultView; - - if ( !view || !view.opener ) { - view = window; - } - - return view.getComputedStyle( elem ); - }; - -var swap = function( elem, options, callback ) { - var ret, name, - old = {}; - - // Remember the old values, and insert the new ones - for ( name in options ) { - old[ name ] = elem.style[ name ]; - elem.style[ name ] = options[ name ]; - } - - ret = callback.call( elem ); - - // Revert the old values - for ( name in options ) { - elem.style[ name ] = old[ name ]; - } - - return ret; -}; - - -var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); - - - -( function() { - - // Executing both pixelPosition & boxSizingReliable tests require only one layout - // so they're executed at the same time to save the second computation. - function computeStyleTests() { - - // This is a singleton, we need to execute it only once - if ( !div ) { - return; - } - - container.style.cssText = "position:absolute;left:-11111px;width:60px;" + - "margin-top:1px;padding:0;border:0"; - div.style.cssText = - "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + - "margin:auto;border:1px;padding:1px;" + - "width:60%;top:1%"; - documentElement.appendChild( container ).appendChild( div ); - - var divStyle = window.getComputedStyle( div ); - pixelPositionVal = divStyle.top !== "1%"; - - // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 - reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; - - // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 - // Some styles come back with percentage values, even though they shouldn't - div.style.right = "60%"; - pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; - - // Support: IE 9 - 11 only - // Detect misreporting of content dimensions for box-sizing:border-box elements - boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; - - // Support: IE 9 only - // Detect overflow:scroll screwiness (gh-3699) - // Support: Chrome <=64 - // Don't get tricked when zoom affects offsetWidth (gh-4029) - div.style.position = "absolute"; - scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; - - documentElement.removeChild( container ); - - // Nullify the div so it wouldn't be stored in the memory and - // it will also be a sign that checks already performed - div = null; - } - - function roundPixelMeasures( measure ) { - return Math.round( parseFloat( measure ) ); - } - - var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, - reliableTrDimensionsVal, reliableMarginLeftVal, - container = document.createElement( "div" ), - div = document.createElement( "div" ); - - // Finish early in limited (non-browser) environments - if ( !div.style ) { - return; - } - - // Support: IE <=9 - 11 only - // Style of cloned element affects source element cloned (#8908) - div.style.backgroundClip = "content-box"; - div.cloneNode( true ).style.backgroundClip = ""; - support.clearCloneStyle = div.style.backgroundClip === "content-box"; - - jQuery.extend( support, { - boxSizingReliable: function() { - computeStyleTests(); - return boxSizingReliableVal; - }, - pixelBoxStyles: function() { - computeStyleTests(); - return pixelBoxStylesVal; - }, - pixelPosition: function() { - computeStyleTests(); - return pixelPositionVal; - }, - reliableMarginLeft: function() { - computeStyleTests(); - return reliableMarginLeftVal; - }, - scrollboxSize: function() { - computeStyleTests(); - return scrollboxSizeVal; - }, - - // Support: IE 9 - 11+, Edge 15 - 18+ - // IE/Edge misreport `getComputedStyle` of table rows with width/height - // set in CSS while `offset*` properties report correct values. - // Behavior in IE 9 is more subtle than in newer versions & it passes - // some versions of this test; make sure not to make it pass there! - reliableTrDimensions: function() { - var table, tr, trChild, trStyle; - if ( reliableTrDimensionsVal == null ) { - table = document.createElement( "table" ); - tr = document.createElement( "tr" ); - trChild = document.createElement( "div" ); - - table.style.cssText = "position:absolute;left:-11111px"; - tr.style.height = "1px"; - trChild.style.height = "9px"; - - documentElement - .appendChild( table ) - .appendChild( tr ) - .appendChild( trChild ); - - trStyle = window.getComputedStyle( tr ); - reliableTrDimensionsVal = parseInt( trStyle.height ) > 3; - - documentElement.removeChild( table ); - } - return reliableTrDimensionsVal; - } - } ); -} )(); - - -function curCSS( elem, name, computed ) { - var width, minWidth, maxWidth, ret, - - // Support: Firefox 51+ - // Retrieving style before computed somehow - // fixes an issue with getting wrong values - // on detached elements - style = elem.style; - - computed = computed || getStyles( elem ); - - // getPropertyValue is needed for: - // .css('filter') (IE 9 only, #12537) - // .css('--customProperty) (#3144) - if ( computed ) { - ret = computed.getPropertyValue( name ) || computed[ name ]; - - if ( ret === "" && !isAttached( elem ) ) { - ret = jQuery.style( elem, name ); - } - - // A tribute to the "awesome hack by Dean Edwards" - // Android Browser returns percentage for some values, - // but width seems to be reliably pixels. - // This is against the CSSOM draft spec: - // https://drafts.csswg.org/cssom/#resolved-values - if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { - - // Remember the original values - width = style.width; - minWidth = style.minWidth; - maxWidth = style.maxWidth; - - // Put in the new values to get a computed value out - style.minWidth = style.maxWidth = style.width = ret; - ret = computed.width; - - // Revert the changed values - style.width = width; - style.minWidth = minWidth; - style.maxWidth = maxWidth; - } - } - - return ret !== undefined ? - - // Support: IE <=9 - 11 only - // IE returns zIndex value as an integer. - ret + "" : - ret; -} - - -function addGetHookIf( conditionFn, hookFn ) { - - // Define the hook, we'll check on the first run if it's really needed. - return { - get: function() { - if ( conditionFn() ) { - - // Hook not needed (or it's not possible to use it due - // to missing dependency), remove it. - delete this.get; - return; - } - - // Hook needed; redefine it so that the support test is not executed again. - return ( this.get = hookFn ).apply( this, arguments ); - } - }; -} - - -var cssPrefixes = [ "Webkit", "Moz", "ms" ], - emptyStyle = document.createElement( "div" ).style, - vendorProps = {}; - -// Return a vendor-prefixed property or undefined -function vendorPropName( name ) { - - // Check for vendor prefixed names - var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), - i = cssPrefixes.length; - - while ( i-- ) { - name = cssPrefixes[ i ] + capName; - if ( name in emptyStyle ) { - return name; - } - } -} - -// Return a potentially-mapped jQuery.cssProps or vendor prefixed property -function finalPropName( name ) { - var final = jQuery.cssProps[ name ] || vendorProps[ name ]; - - if ( final ) { - return final; - } - if ( name in emptyStyle ) { - return name; - } - return vendorProps[ name ] = vendorPropName( name ) || name; -} - - -var - - // Swappable if display is none or starts with table - // except "table", "table-cell", or "table-caption" - // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display - rdisplayswap = /^(none|table(?!-c[ea]).+)/, - rcustomProp = /^--/, - cssShow = { position: "absolute", visibility: "hidden", display: "block" }, - cssNormalTransform = { - letterSpacing: "0", - fontWeight: "400" - }; - -function setPositiveNumber( _elem, value, subtract ) { - - // Any relative (+/-) values have already been - // normalized at this point - var matches = rcssNum.exec( value ); - return matches ? - - // Guard against undefined "subtract", e.g., when used as in cssHooks - Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : - value; -} - -function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { - var i = dimension === "width" ? 1 : 0, - extra = 0, - delta = 0; - - // Adjustment may not be necessary - if ( box === ( isBorderBox ? "border" : "content" ) ) { - return 0; - } - - for ( ; i < 4; i += 2 ) { - - // Both box models exclude margin - if ( box === "margin" ) { - delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); - } - - // If we get here with a content-box, we're seeking "padding" or "border" or "margin" - if ( !isBorderBox ) { - - // Add padding - delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - - // For "border" or "margin", add border - if ( box !== "padding" ) { - delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - - // But still keep track of it otherwise - } else { - extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - - // If we get here with a border-box (content + padding + border), we're seeking "content" or - // "padding" or "margin" - } else { - - // For "content", subtract padding - if ( box === "content" ) { - delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - } - - // For "content" or "padding", subtract border - if ( box !== "margin" ) { - delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } - } - - // Account for positive content-box scroll gutter when requested by providing computedVal - if ( !isBorderBox && computedVal >= 0 ) { - - // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border - // Assuming integer scroll gutter, subtract the rest and round down - delta += Math.max( 0, Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - computedVal - - delta - - extra - - 0.5 - - // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter - // Use an explicit zero to avoid NaN (gh-3964) - ) ) || 0; - } - - return delta; -} - -function getWidthOrHeight( elem, dimension, extra ) { - - // Start with computed style - var styles = getStyles( elem ), - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). - // Fake content-box until we know it's needed to know the true value. - boxSizingNeeded = !support.boxSizingReliable() || extra, - isBorderBox = boxSizingNeeded && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - valueIsBorderBox = isBorderBox, - - val = curCSS( elem, dimension, styles ), - offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); - - // Support: Firefox <=54 - // Return a confounding non-pixel value or feign ignorance, as appropriate. - if ( rnumnonpx.test( val ) ) { - if ( !extra ) { - return val; - } - val = "auto"; - } - - - // Support: IE 9 - 11 only - // Use offsetWidth/offsetHeight for when box sizing is unreliable. - // In those cases, the computed value can be trusted to be border-box. - if ( ( !support.boxSizingReliable() && isBorderBox || - - // Support: IE 10 - 11+, Edge 15 - 18+ - // IE/Edge misreport `getComputedStyle` of table rows with width/height - // set in CSS while `offset*` properties report correct values. - // Interestingly, in some cases IE 9 doesn't suffer from this issue. - !support.reliableTrDimensions() && nodeName( elem, "tr" ) || - - // Fall back to offsetWidth/offsetHeight when value is "auto" - // This happens for inline elements with no explicit setting (gh-3571) - val === "auto" || - - // Support: Android <=4.1 - 4.3 only - // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) - !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && - - // Make sure the element is visible & connected - elem.getClientRects().length ) { - - isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; - - // Where available, offsetWidth/offsetHeight approximate border box dimensions. - // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the - // retrieved value as a content box dimension. - valueIsBorderBox = offsetProp in elem; - if ( valueIsBorderBox ) { - val = elem[ offsetProp ]; - } - } - - // Normalize "" and auto - val = parseFloat( val ) || 0; - - // Adjust for the element's box model - return ( val + - boxModelAdjustment( - elem, - dimension, - extra || ( isBorderBox ? "border" : "content" ), - valueIsBorderBox, - styles, - - // Provide the current computed size to request scroll gutter calculation (gh-3589) - val - ) - ) + "px"; -} - -jQuery.extend( { - - // Add in style property hooks for overriding the default - // behavior of getting and setting a style property - cssHooks: { - opacity: { - get: function( elem, computed ) { - if ( computed ) { - - // We should always get a number back from opacity - var ret = curCSS( elem, "opacity" ); - return ret === "" ? "1" : ret; - } - } - } - }, - - // Don't automatically add "px" to these possibly-unitless properties - cssNumber: { - "animationIterationCount": true, - "columnCount": true, - "fillOpacity": true, - "flexGrow": true, - "flexShrink": true, - "fontWeight": true, - "gridArea": true, - "gridColumn": true, - "gridColumnEnd": true, - "gridColumnStart": true, - "gridRow": true, - "gridRowEnd": true, - "gridRowStart": true, - "lineHeight": true, - "opacity": true, - "order": true, - "orphans": true, - "widows": true, - "zIndex": true, - "zoom": true - }, - - // Add in properties whose names you wish to fix before - // setting or getting the value - cssProps: {}, - - // Get and set the style property on a DOM Node - style: function( elem, name, value, extra ) { - - // Don't set styles on text and comment nodes - if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { - return; - } - - // Make sure that we're working with the right name - var ret, type, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ), - style = elem.style; - - // Make sure that we're working with the right name. We don't - // want to query the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Gets hook for the prefixed version, then unprefixed version - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // Check if we're setting a value - if ( value !== undefined ) { - type = typeof value; - - // Convert "+=" or "-=" to relative numbers (#7345) - if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { - value = adjustCSS( elem, name, ret ); - - // Fixes bug #9237 - type = "number"; - } - - // Make sure that null and NaN values aren't set (#7116) - if ( value == null || value !== value ) { - return; - } - - // If a number was passed in, add the unit (except for certain CSS properties) - // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append - // "px" to a few hardcoded values. - if ( type === "number" && !isCustomProp ) { - value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); - } - - // background-* props affect original clone's values - if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { - style[ name ] = "inherit"; - } - - // If a hook was provided, use that value, otherwise just set the specified value - if ( !hooks || !( "set" in hooks ) || - ( value = hooks.set( elem, value, extra ) ) !== undefined ) { - - if ( isCustomProp ) { - style.setProperty( name, value ); - } else { - style[ name ] = value; - } - } - - } else { - - // If a hook was provided get the non-computed value from there - if ( hooks && "get" in hooks && - ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { - - return ret; - } - - // Otherwise just get the value from the style object - return style[ name ]; - } - }, - - css: function( elem, name, extra, styles ) { - var val, num, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ); - - // Make sure that we're working with the right name. We don't - // want to modify the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Try prefixed name followed by the unprefixed name - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // If a hook was provided get the computed value from there - if ( hooks && "get" in hooks ) { - val = hooks.get( elem, true, extra ); - } - - // Otherwise, if a way to get the computed value exists, use that - if ( val === undefined ) { - val = curCSS( elem, name, styles ); - } - - // Convert "normal" to computed value - if ( val === "normal" && name in cssNormalTransform ) { - val = cssNormalTransform[ name ]; - } - - // Make numeric if forced or a qualifier was provided and val looks numeric - if ( extra === "" || extra ) { - num = parseFloat( val ); - return extra === true || isFinite( num ) ? num || 0 : val; - } - - return val; - } -} ); - -jQuery.each( [ "height", "width" ], function( _i, dimension ) { - jQuery.cssHooks[ dimension ] = { - get: function( elem, computed, extra ) { - if ( computed ) { - - // Certain elements can have dimension info if we invisibly show them - // but it must have a current display style that would benefit - return rdisplayswap.test( jQuery.css( elem, "display" ) ) && - - // Support: Safari 8+ - // Table columns in Safari have non-zero offsetWidth & zero - // getBoundingClientRect().width unless display is changed. - // Support: IE <=11 only - // Running getBoundingClientRect on a disconnected node - // in IE throws an error. - ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? - swap( elem, cssShow, function() { - return getWidthOrHeight( elem, dimension, extra ); - } ) : - getWidthOrHeight( elem, dimension, extra ); - } - }, - - set: function( elem, value, extra ) { - var matches, - styles = getStyles( elem ), - - // Only read styles.position if the test has a chance to fail - // to avoid forcing a reflow. - scrollboxSizeBuggy = !support.scrollboxSize() && - styles.position === "absolute", - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) - boxSizingNeeded = scrollboxSizeBuggy || extra, - isBorderBox = boxSizingNeeded && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - subtract = extra ? - boxModelAdjustment( - elem, - dimension, - extra, - isBorderBox, - styles - ) : - 0; - - // Account for unreliable border-box dimensions by comparing offset* to computed and - // faking a content-box to get border and padding (gh-3699) - if ( isBorderBox && scrollboxSizeBuggy ) { - subtract -= Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - parseFloat( styles[ dimension ] ) - - boxModelAdjustment( elem, dimension, "border", false, styles ) - - 0.5 - ); - } - - // Convert to pixels if value adjustment is needed - if ( subtract && ( matches = rcssNum.exec( value ) ) && - ( matches[ 3 ] || "px" ) !== "px" ) { - - elem.style[ dimension ] = value; - value = jQuery.css( elem, dimension ); - } - - return setPositiveNumber( elem, value, subtract ); - } - }; -} ); - -jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, - function( elem, computed ) { - if ( computed ) { - return ( parseFloat( curCSS( elem, "marginLeft" ) ) || - elem.getBoundingClientRect().left - - swap( elem, { marginLeft: 0 }, function() { - return elem.getBoundingClientRect().left; - } ) - ) + "px"; - } - } -); - -// These hooks are used by animate to expand properties -jQuery.each( { - margin: "", - padding: "", - border: "Width" -}, function( prefix, suffix ) { - jQuery.cssHooks[ prefix + suffix ] = { - expand: function( value ) { - var i = 0, - expanded = {}, - - // Assumes a single number if not a string - parts = typeof value === "string" ? value.split( " " ) : [ value ]; - - for ( ; i < 4; i++ ) { - expanded[ prefix + cssExpand[ i ] + suffix ] = - parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; - } - - return expanded; - } - }; - - if ( prefix !== "margin" ) { - jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; - } -} ); - -jQuery.fn.extend( { - css: function( name, value ) { - return access( this, function( elem, name, value ) { - var styles, len, - map = {}, - i = 0; - - if ( Array.isArray( name ) ) { - styles = getStyles( elem ); - len = name.length; - - for ( ; i < len; i++ ) { - map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); - } - - return map; - } - - return value !== undefined ? - jQuery.style( elem, name, value ) : - jQuery.css( elem, name ); - }, name, value, arguments.length > 1 ); - } -} ); - - -function Tween( elem, options, prop, end, easing ) { - return new Tween.prototype.init( elem, options, prop, end, easing ); -} -jQuery.Tween = Tween; - -Tween.prototype = { - constructor: Tween, - init: function( elem, options, prop, end, easing, unit ) { - this.elem = elem; - this.prop = prop; - this.easing = easing || jQuery.easing._default; - this.options = options; - this.start = this.now = this.cur(); - this.end = end; - this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); - }, - cur: function() { - var hooks = Tween.propHooks[ this.prop ]; - - return hooks && hooks.get ? - hooks.get( this ) : - Tween.propHooks._default.get( this ); - }, - run: function( percent ) { - var eased, - hooks = Tween.propHooks[ this.prop ]; - - if ( this.options.duration ) { - this.pos = eased = jQuery.easing[ this.easing ]( - percent, this.options.duration * percent, 0, 1, this.options.duration - ); - } else { - this.pos = eased = percent; - } - this.now = ( this.end - this.start ) * eased + this.start; - - if ( this.options.step ) { - this.options.step.call( this.elem, this.now, this ); - } - - if ( hooks && hooks.set ) { - hooks.set( this ); - } else { - Tween.propHooks._default.set( this ); - } - return this; - } -}; - -Tween.prototype.init.prototype = Tween.prototype; - -Tween.propHooks = { - _default: { - get: function( tween ) { - var result; - - // Use a property on the element directly when it is not a DOM element, - // or when there is no matching style property that exists. - if ( tween.elem.nodeType !== 1 || - tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { - return tween.elem[ tween.prop ]; - } - - // Passing an empty string as a 3rd parameter to .css will automatically - // attempt a parseFloat and fallback to a string if the parse fails. - // Simple values such as "10px" are parsed to Float; - // complex values such as "rotate(1rad)" are returned as-is. - result = jQuery.css( tween.elem, tween.prop, "" ); - - // Empty strings, null, undefined and "auto" are converted to 0. - return !result || result === "auto" ? 0 : result; - }, - set: function( tween ) { - - // Use step hook for back compat. - // Use cssHook if its there. - // Use .style if available and use plain properties where available. - if ( jQuery.fx.step[ tween.prop ] ) { - jQuery.fx.step[ tween.prop ]( tween ); - } else if ( tween.elem.nodeType === 1 && ( - jQuery.cssHooks[ tween.prop ] || - tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { - jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); - } else { - tween.elem[ tween.prop ] = tween.now; - } - } - } -}; - -// Support: IE <=9 only -// Panic based approach to setting things on disconnected nodes -Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { - set: function( tween ) { - if ( tween.elem.nodeType && tween.elem.parentNode ) { - tween.elem[ tween.prop ] = tween.now; - } - } -}; - -jQuery.easing = { - linear: function( p ) { - return p; - }, - swing: function( p ) { - return 0.5 - Math.cos( p * Math.PI ) / 2; - }, - _default: "swing" -}; - -jQuery.fx = Tween.prototype.init; - -// Back compat <1.8 extension point -jQuery.fx.step = {}; - - - - -var - fxNow, inProgress, - rfxtypes = /^(?:toggle|show|hide)$/, - rrun = /queueHooks$/; - -function schedule() { - if ( inProgress ) { - if ( document.hidden === false && window.requestAnimationFrame ) { - window.requestAnimationFrame( schedule ); - } else { - window.setTimeout( schedule, jQuery.fx.interval ); - } - - jQuery.fx.tick(); - } -} - -// Animations created synchronously will run synchronously -function createFxNow() { - window.setTimeout( function() { - fxNow = undefined; - } ); - return ( fxNow = Date.now() ); -} - -// Generate parameters to create a standard animation -function genFx( type, includeWidth ) { - var which, - i = 0, - attrs = { height: type }; - - // If we include width, step value is 1 to do all cssExpand values, - // otherwise step value is 2 to skip over Left and Right - includeWidth = includeWidth ? 1 : 0; - for ( ; i < 4; i += 2 - includeWidth ) { - which = cssExpand[ i ]; - attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; - } - - if ( includeWidth ) { - attrs.opacity = attrs.width = type; - } - - return attrs; -} - -function createTween( value, prop, animation ) { - var tween, - collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), - index = 0, - length = collection.length; - for ( ; index < length; index++ ) { - if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { - - // We're done with this property - return tween; - } - } -} - -function defaultPrefilter( elem, props, opts ) { - var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, - isBox = "width" in props || "height" in props, - anim = this, - orig = {}, - style = elem.style, - hidden = elem.nodeType && isHiddenWithinTree( elem ), - dataShow = dataPriv.get( elem, "fxshow" ); - - // Queue-skipping animations hijack the fx hooks - if ( !opts.queue ) { - hooks = jQuery._queueHooks( elem, "fx" ); - if ( hooks.unqueued == null ) { - hooks.unqueued = 0; - oldfire = hooks.empty.fire; - hooks.empty.fire = function() { - if ( !hooks.unqueued ) { - oldfire(); - } - }; - } - hooks.unqueued++; - - anim.always( function() { - - // Ensure the complete handler is called before this completes - anim.always( function() { - hooks.unqueued--; - if ( !jQuery.queue( elem, "fx" ).length ) { - hooks.empty.fire(); - } - } ); - } ); - } - - // Detect show/hide animations - for ( prop in props ) { - value = props[ prop ]; - if ( rfxtypes.test( value ) ) { - delete props[ prop ]; - toggle = toggle || value === "toggle"; - if ( value === ( hidden ? "hide" : "show" ) ) { - - // Pretend to be hidden if this is a "show" and - // there is still data from a stopped show/hide - if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { - hidden = true; - - // Ignore all other no-op show/hide data - } else { - continue; - } - } - orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); - } - } - - // Bail out if this is a no-op like .hide().hide() - propTween = !jQuery.isEmptyObject( props ); - if ( !propTween && jQuery.isEmptyObject( orig ) ) { - return; - } - - // Restrict "overflow" and "display" styles during box animations - if ( isBox && elem.nodeType === 1 ) { - - // Support: IE <=9 - 11, Edge 12 - 15 - // Record all 3 overflow attributes because IE does not infer the shorthand - // from identically-valued overflowX and overflowY and Edge just mirrors - // the overflowX value there. - opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; - - // Identify a display type, preferring old show/hide data over the CSS cascade - restoreDisplay = dataShow && dataShow.display; - if ( restoreDisplay == null ) { - restoreDisplay = dataPriv.get( elem, "display" ); - } - display = jQuery.css( elem, "display" ); - if ( display === "none" ) { - if ( restoreDisplay ) { - display = restoreDisplay; - } else { - - // Get nonempty value(s) by temporarily forcing visibility - showHide( [ elem ], true ); - restoreDisplay = elem.style.display || restoreDisplay; - display = jQuery.css( elem, "display" ); - showHide( [ elem ] ); - } - } - - // Animate inline elements as inline-block - if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { - if ( jQuery.css( elem, "float" ) === "none" ) { - - // Restore the original display value at the end of pure show/hide animations - if ( !propTween ) { - anim.done( function() { - style.display = restoreDisplay; - } ); - if ( restoreDisplay == null ) { - display = style.display; - restoreDisplay = display === "none" ? "" : display; - } - } - style.display = "inline-block"; - } - } - } - - if ( opts.overflow ) { - style.overflow = "hidden"; - anim.always( function() { - style.overflow = opts.overflow[ 0 ]; - style.overflowX = opts.overflow[ 1 ]; - style.overflowY = opts.overflow[ 2 ]; - } ); - } - - // Implement show/hide animations - propTween = false; - for ( prop in orig ) { - - // General show/hide setup for this element animation - if ( !propTween ) { - if ( dataShow ) { - if ( "hidden" in dataShow ) { - hidden = dataShow.hidden; - } - } else { - dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); - } - - // Store hidden/visible for toggle so `.stop().toggle()` "reverses" - if ( toggle ) { - dataShow.hidden = !hidden; - } - - // Show elements before animating them - if ( hidden ) { - showHide( [ elem ], true ); - } - - /* eslint-disable no-loop-func */ - - anim.done( function() { - - /* eslint-enable no-loop-func */ - - // The final step of a "hide" animation is actually hiding the element - if ( !hidden ) { - showHide( [ elem ] ); - } - dataPriv.remove( elem, "fxshow" ); - for ( prop in orig ) { - jQuery.style( elem, prop, orig[ prop ] ); - } - } ); - } - - // Per-property setup - propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); - if ( !( prop in dataShow ) ) { - dataShow[ prop ] = propTween.start; - if ( hidden ) { - propTween.end = propTween.start; - propTween.start = 0; - } - } - } -} - -function propFilter( props, specialEasing ) { - var index, name, easing, value, hooks; - - // camelCase, specialEasing and expand cssHook pass - for ( index in props ) { - name = camelCase( index ); - easing = specialEasing[ name ]; - value = props[ index ]; - if ( Array.isArray( value ) ) { - easing = value[ 1 ]; - value = props[ index ] = value[ 0 ]; - } - - if ( index !== name ) { - props[ name ] = value; - delete props[ index ]; - } - - hooks = jQuery.cssHooks[ name ]; - if ( hooks && "expand" in hooks ) { - value = hooks.expand( value ); - delete props[ name ]; - - // Not quite $.extend, this won't overwrite existing keys. - // Reusing 'index' because we have the correct "name" - for ( index in value ) { - if ( !( index in props ) ) { - props[ index ] = value[ index ]; - specialEasing[ index ] = easing; - } - } - } else { - specialEasing[ name ] = easing; - } - } -} - -function Animation( elem, properties, options ) { - var result, - stopped, - index = 0, - length = Animation.prefilters.length, - deferred = jQuery.Deferred().always( function() { - - // Don't match elem in the :animated selector - delete tick.elem; - } ), - tick = function() { - if ( stopped ) { - return false; - } - var currentTime = fxNow || createFxNow(), - remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), - - // Support: Android 2.3 only - // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) - temp = remaining / animation.duration || 0, - percent = 1 - temp, - index = 0, - length = animation.tweens.length; - - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( percent ); - } - - deferred.notifyWith( elem, [ animation, percent, remaining ] ); - - // If there's more to do, yield - if ( percent < 1 && length ) { - return remaining; - } - - // If this was an empty animation, synthesize a final progress notification - if ( !length ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - } - - // Resolve the animation and report its conclusion - deferred.resolveWith( elem, [ animation ] ); - return false; - }, - animation = deferred.promise( { - elem: elem, - props: jQuery.extend( {}, properties ), - opts: jQuery.extend( true, { - specialEasing: {}, - easing: jQuery.easing._default - }, options ), - originalProperties: properties, - originalOptions: options, - startTime: fxNow || createFxNow(), - duration: options.duration, - tweens: [], - createTween: function( prop, end ) { - var tween = jQuery.Tween( elem, animation.opts, prop, end, - animation.opts.specialEasing[ prop ] || animation.opts.easing ); - animation.tweens.push( tween ); - return tween; - }, - stop: function( gotoEnd ) { - var index = 0, - - // If we are going to the end, we want to run all the tweens - // otherwise we skip this part - length = gotoEnd ? animation.tweens.length : 0; - if ( stopped ) { - return this; - } - stopped = true; - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( 1 ); - } - - // Resolve when we played the last frame; otherwise, reject - if ( gotoEnd ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - deferred.resolveWith( elem, [ animation, gotoEnd ] ); - } else { - deferred.rejectWith( elem, [ animation, gotoEnd ] ); - } - return this; - } - } ), - props = animation.props; - - propFilter( props, animation.opts.specialEasing ); - - for ( ; index < length; index++ ) { - result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); - if ( result ) { - if ( isFunction( result.stop ) ) { - jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = - result.stop.bind( result ); - } - return result; - } - } - - jQuery.map( props, createTween, animation ); - - if ( isFunction( animation.opts.start ) ) { - animation.opts.start.call( elem, animation ); - } - - // Attach callbacks from options - animation - .progress( animation.opts.progress ) - .done( animation.opts.done, animation.opts.complete ) - .fail( animation.opts.fail ) - .always( animation.opts.always ); - - jQuery.fx.timer( - jQuery.extend( tick, { - elem: elem, - anim: animation, - queue: animation.opts.queue - } ) - ); - - return animation; -} - -jQuery.Animation = jQuery.extend( Animation, { - - tweeners: { - "*": [ function( prop, value ) { - var tween = this.createTween( prop, value ); - adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); - return tween; - } ] - }, - - tweener: function( props, callback ) { - if ( isFunction( props ) ) { - callback = props; - props = [ "*" ]; - } else { - props = props.match( rnothtmlwhite ); - } - - var prop, - index = 0, - length = props.length; - - for ( ; index < length; index++ ) { - prop = props[ index ]; - Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; - Animation.tweeners[ prop ].unshift( callback ); - } - }, - - prefilters: [ defaultPrefilter ], - - prefilter: function( callback, prepend ) { - if ( prepend ) { - Animation.prefilters.unshift( callback ); - } else { - Animation.prefilters.push( callback ); - } - } -} ); - -jQuery.speed = function( speed, easing, fn ) { - var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { - complete: fn || !fn && easing || - isFunction( speed ) && speed, - duration: speed, - easing: fn && easing || easing && !isFunction( easing ) && easing - }; - - // Go to the end state if fx are off - if ( jQuery.fx.off ) { - opt.duration = 0; - - } else { - if ( typeof opt.duration !== "number" ) { - if ( opt.duration in jQuery.fx.speeds ) { - opt.duration = jQuery.fx.speeds[ opt.duration ]; - - } else { - opt.duration = jQuery.fx.speeds._default; - } - } - } - - // Normalize opt.queue - true/undefined/null -> "fx" - if ( opt.queue == null || opt.queue === true ) { - opt.queue = "fx"; - } - - // Queueing - opt.old = opt.complete; - - opt.complete = function() { - if ( isFunction( opt.old ) ) { - opt.old.call( this ); - } - - if ( opt.queue ) { - jQuery.dequeue( this, opt.queue ); - } - }; - - return opt; -}; - -jQuery.fn.extend( { - fadeTo: function( speed, to, easing, callback ) { - - // Show any hidden elements after setting opacity to 0 - return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() - - // Animate to the value specified - .end().animate( { opacity: to }, speed, easing, callback ); - }, - animate: function( prop, speed, easing, callback ) { - var empty = jQuery.isEmptyObject( prop ), - optall = jQuery.speed( speed, easing, callback ), - doAnimation = function() { - - // Operate on a copy of prop so per-property easing won't be lost - var anim = Animation( this, jQuery.extend( {}, prop ), optall ); - - // Empty animations, or finishing resolves immediately - if ( empty || dataPriv.get( this, "finish" ) ) { - anim.stop( true ); - } - }; - doAnimation.finish = doAnimation; - - return empty || optall.queue === false ? - this.each( doAnimation ) : - this.queue( optall.queue, doAnimation ); - }, - stop: function( type, clearQueue, gotoEnd ) { - var stopQueue = function( hooks ) { - var stop = hooks.stop; - delete hooks.stop; - stop( gotoEnd ); - }; - - if ( typeof type !== "string" ) { - gotoEnd = clearQueue; - clearQueue = type; - type = undefined; - } - if ( clearQueue ) { - this.queue( type || "fx", [] ); - } - - return this.each( function() { - var dequeue = true, - index = type != null && type + "queueHooks", - timers = jQuery.timers, - data = dataPriv.get( this ); - - if ( index ) { - if ( data[ index ] && data[ index ].stop ) { - stopQueue( data[ index ] ); - } - } else { - for ( index in data ) { - if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { - stopQueue( data[ index ] ); - } - } - } - - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && - ( type == null || timers[ index ].queue === type ) ) { - - timers[ index ].anim.stop( gotoEnd ); - dequeue = false; - timers.splice( index, 1 ); - } - } - - // Start the next in the queue if the last step wasn't forced. - // Timers currently will call their complete callbacks, which - // will dequeue but only if they were gotoEnd. - if ( dequeue || !gotoEnd ) { - jQuery.dequeue( this, type ); - } - } ); - }, - finish: function( type ) { - if ( type !== false ) { - type = type || "fx"; - } - return this.each( function() { - var index, - data = dataPriv.get( this ), - queue = data[ type + "queue" ], - hooks = data[ type + "queueHooks" ], - timers = jQuery.timers, - length = queue ? queue.length : 0; - - // Enable finishing flag on private data - data.finish = true; - - // Empty the queue first - jQuery.queue( this, type, [] ); - - if ( hooks && hooks.stop ) { - hooks.stop.call( this, true ); - } - - // Look for any active animations, and finish them - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && timers[ index ].queue === type ) { - timers[ index ].anim.stop( true ); - timers.splice( index, 1 ); - } - } - - // Look for any animations in the old queue and finish them - for ( index = 0; index < length; index++ ) { - if ( queue[ index ] && queue[ index ].finish ) { - queue[ index ].finish.call( this ); - } - } - - // Turn off finishing flag - delete data.finish; - } ); - } -} ); - -jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) { - var cssFn = jQuery.fn[ name ]; - jQuery.fn[ name ] = function( speed, easing, callback ) { - return speed == null || typeof speed === "boolean" ? - cssFn.apply( this, arguments ) : - this.animate( genFx( name, true ), speed, easing, callback ); - }; -} ); - -// Generate shortcuts for custom animations -jQuery.each( { - slideDown: genFx( "show" ), - slideUp: genFx( "hide" ), - slideToggle: genFx( "toggle" ), - fadeIn: { opacity: "show" }, - fadeOut: { opacity: "hide" }, - fadeToggle: { opacity: "toggle" } -}, function( name, props ) { - jQuery.fn[ name ] = function( speed, easing, callback ) { - return this.animate( props, speed, easing, callback ); - }; -} ); - -jQuery.timers = []; -jQuery.fx.tick = function() { - var timer, - i = 0, - timers = jQuery.timers; - - fxNow = Date.now(); - - for ( ; i < timers.length; i++ ) { - timer = timers[ i ]; - - // Run the timer and safely remove it when done (allowing for external removal) - if ( !timer() && timers[ i ] === timer ) { - timers.splice( i--, 1 ); - } - } - - if ( !timers.length ) { - jQuery.fx.stop(); - } - fxNow = undefined; -}; - -jQuery.fx.timer = function( timer ) { - jQuery.timers.push( timer ); - jQuery.fx.start(); -}; - -jQuery.fx.interval = 13; -jQuery.fx.start = function() { - if ( inProgress ) { - return; - } - - inProgress = true; - schedule(); -}; - -jQuery.fx.stop = function() { - inProgress = null; -}; - -jQuery.fx.speeds = { - slow: 600, - fast: 200, - - // Default speed - _default: 400 -}; - - -// Based off of the plugin by Clint Helfers, with permission. -// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ -jQuery.fn.delay = function( time, type ) { - time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; - type = type || "fx"; - - return this.queue( type, function( next, hooks ) { - var timeout = window.setTimeout( next, time ); - hooks.stop = function() { - window.clearTimeout( timeout ); - }; - } ); -}; - - -( function() { - var input = document.createElement( "input" ), - select = document.createElement( "select" ), - opt = select.appendChild( document.createElement( "option" ) ); - - input.type = "checkbox"; - - // Support: Android <=4.3 only - // Default value for a checkbox should be "on" - support.checkOn = input.value !== ""; - - // Support: IE <=11 only - // Must access selectedIndex to make default options select - support.optSelected = opt.selected; - - // Support: IE <=11 only - // An input loses its value after becoming a radio - input = document.createElement( "input" ); - input.value = "t"; - input.type = "radio"; - support.radioValue = input.value === "t"; -} )(); - - -var boolHook, - attrHandle = jQuery.expr.attrHandle; - -jQuery.fn.extend( { - attr: function( name, value ) { - return access( this, jQuery.attr, name, value, arguments.length > 1 ); - }, - - removeAttr: function( name ) { - return this.each( function() { - jQuery.removeAttr( this, name ); - } ); - } -} ); - -jQuery.extend( { - attr: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set attributes on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - // Fallback to prop when attributes are not supported - if ( typeof elem.getAttribute === "undefined" ) { - return jQuery.prop( elem, name, value ); - } - - // Attribute hooks are determined by the lowercase version - // Grab necessary hook if one is defined - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - hooks = jQuery.attrHooks[ name.toLowerCase() ] || - ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); - } - - if ( value !== undefined ) { - if ( value === null ) { - jQuery.removeAttr( elem, name ); - return; - } - - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - elem.setAttribute( name, value + "" ); - return value; - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - ret = jQuery.find.attr( elem, name ); - - // Non-existent attributes return null, we normalize to undefined - return ret == null ? undefined : ret; - }, - - attrHooks: { - type: { - set: function( elem, value ) { - if ( !support.radioValue && value === "radio" && - nodeName( elem, "input" ) ) { - var val = elem.value; - elem.setAttribute( "type", value ); - if ( val ) { - elem.value = val; - } - return value; - } - } - } - }, - - removeAttr: function( elem, value ) { - var name, - i = 0, - - // Attribute names can contain non-HTML whitespace characters - // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 - attrNames = value && value.match( rnothtmlwhite ); - - if ( attrNames && elem.nodeType === 1 ) { - while ( ( name = attrNames[ i++ ] ) ) { - elem.removeAttribute( name ); - } - } - } -} ); - -// Hooks for boolean attributes -boolHook = { - set: function( elem, value, name ) { - if ( value === false ) { - - // Remove boolean attributes when set to false - jQuery.removeAttr( elem, name ); - } else { - elem.setAttribute( name, name ); - } - return name; - } -}; - -jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) { - var getter = attrHandle[ name ] || jQuery.find.attr; - - attrHandle[ name ] = function( elem, name, isXML ) { - var ret, handle, - lowercaseName = name.toLowerCase(); - - if ( !isXML ) { - - // Avoid an infinite loop by temporarily removing this function from the getter - handle = attrHandle[ lowercaseName ]; - attrHandle[ lowercaseName ] = ret; - ret = getter( elem, name, isXML ) != null ? - lowercaseName : - null; - attrHandle[ lowercaseName ] = handle; - } - return ret; - }; -} ); - - - - -var rfocusable = /^(?:input|select|textarea|button)$/i, - rclickable = /^(?:a|area)$/i; - -jQuery.fn.extend( { - prop: function( name, value ) { - return access( this, jQuery.prop, name, value, arguments.length > 1 ); - }, - - removeProp: function( name ) { - return this.each( function() { - delete this[ jQuery.propFix[ name ] || name ]; - } ); - } -} ); - -jQuery.extend( { - prop: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set properties on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - - // Fix name and attach hooks - name = jQuery.propFix[ name ] || name; - hooks = jQuery.propHooks[ name ]; - } - - if ( value !== undefined ) { - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - return ( elem[ name ] = value ); - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - return elem[ name ]; - }, - - propHooks: { - tabIndex: { - get: function( elem ) { - - // Support: IE <=9 - 11 only - // elem.tabIndex doesn't always return the - // correct value when it hasn't been explicitly set - // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ - // Use proper attribute retrieval(#12072) - var tabindex = jQuery.find.attr( elem, "tabindex" ); - - if ( tabindex ) { - return parseInt( tabindex, 10 ); - } - - if ( - rfocusable.test( elem.nodeName ) || - rclickable.test( elem.nodeName ) && - elem.href - ) { - return 0; - } - - return -1; - } - } - }, - - propFix: { - "for": "htmlFor", - "class": "className" - } -} ); - -// Support: IE <=11 only -// Accessing the selectedIndex property -// forces the browser to respect setting selected -// on the option -// The getter ensures a default option is selected -// when in an optgroup -// eslint rule "no-unused-expressions" is disabled for this code -// since it considers such accessions noop -if ( !support.optSelected ) { - jQuery.propHooks.selected = { - get: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent && parent.parentNode ) { - parent.parentNode.selectedIndex; - } - return null; - }, - set: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent ) { - parent.selectedIndex; - - if ( parent.parentNode ) { - parent.parentNode.selectedIndex; - } - } - } - }; -} - -jQuery.each( [ - "tabIndex", - "readOnly", - "maxLength", - "cellSpacing", - "cellPadding", - "rowSpan", - "colSpan", - "useMap", - "frameBorder", - "contentEditable" -], function() { - jQuery.propFix[ this.toLowerCase() ] = this; -} ); - - - - - // Strip and collapse whitespace according to HTML spec - // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace - function stripAndCollapse( value ) { - var tokens = value.match( rnothtmlwhite ) || []; - return tokens.join( " " ); - } - - -function getClass( elem ) { - return elem.getAttribute && elem.getAttribute( "class" ) || ""; -} - -function classesToArray( value ) { - if ( Array.isArray( value ) ) { - return value; - } - if ( typeof value === "string" ) { - return value.match( rnothtmlwhite ) || []; - } - return []; -} - -jQuery.fn.extend( { - addClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - classes = classesToArray( value ); - - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - if ( cur.indexOf( " " + clazz + " " ) < 0 ) { - cur += clazz + " "; - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - removeClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - if ( !arguments.length ) { - return this.attr( "class", "" ); - } - - classes = classesToArray( value ); - - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - - // This expression is here for better compressibility (see addClass) - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - - // Remove *all* instances - while ( cur.indexOf( " " + clazz + " " ) > -1 ) { - cur = cur.replace( " " + clazz + " ", " " ); - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - toggleClass: function( value, stateVal ) { - var type = typeof value, - isValidValue = type === "string" || Array.isArray( value ); - - if ( typeof stateVal === "boolean" && isValidValue ) { - return stateVal ? this.addClass( value ) : this.removeClass( value ); - } - - if ( isFunction( value ) ) { - return this.each( function( i ) { - jQuery( this ).toggleClass( - value.call( this, i, getClass( this ), stateVal ), - stateVal - ); - } ); - } - - return this.each( function() { - var className, i, self, classNames; - - if ( isValidValue ) { - - // Toggle individual class names - i = 0; - self = jQuery( this ); - classNames = classesToArray( value ); - - while ( ( className = classNames[ i++ ] ) ) { - - // Check each className given, space separated list - if ( self.hasClass( className ) ) { - self.removeClass( className ); - } else { - self.addClass( className ); - } - } - - // Toggle whole class name - } else if ( value === undefined || type === "boolean" ) { - className = getClass( this ); - if ( className ) { - - // Store className if set - dataPriv.set( this, "__className__", className ); - } - - // If the element has a class name or if we're passed `false`, - // then remove the whole classname (if there was one, the above saved it). - // Otherwise bring back whatever was previously saved (if anything), - // falling back to the empty string if nothing was stored. - if ( this.setAttribute ) { - this.setAttribute( "class", - className || value === false ? - "" : - dataPriv.get( this, "__className__" ) || "" - ); - } - } - } ); - }, - - hasClass: function( selector ) { - var className, elem, - i = 0; - - className = " " + selector + " "; - while ( ( elem = this[ i++ ] ) ) { - if ( elem.nodeType === 1 && - ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { - return true; - } - } - - return false; - } -} ); - - - - -var rreturn = /\r/g; - -jQuery.fn.extend( { - val: function( value ) { - var hooks, ret, valueIsFunction, - elem = this[ 0 ]; - - if ( !arguments.length ) { - if ( elem ) { - hooks = jQuery.valHooks[ elem.type ] || - jQuery.valHooks[ elem.nodeName.toLowerCase() ]; - - if ( hooks && - "get" in hooks && - ( ret = hooks.get( elem, "value" ) ) !== undefined - ) { - return ret; - } - - ret = elem.value; - - // Handle most common string cases - if ( typeof ret === "string" ) { - return ret.replace( rreturn, "" ); - } - - // Handle cases where value is null/undef or number - return ret == null ? "" : ret; - } - - return; - } - - valueIsFunction = isFunction( value ); - - return this.each( function( i ) { - var val; - - if ( this.nodeType !== 1 ) { - return; - } - - if ( valueIsFunction ) { - val = value.call( this, i, jQuery( this ).val() ); - } else { - val = value; - } - - // Treat null/undefined as ""; convert numbers to string - if ( val == null ) { - val = ""; - - } else if ( typeof val === "number" ) { - val += ""; - - } else if ( Array.isArray( val ) ) { - val = jQuery.map( val, function( value ) { - return value == null ? "" : value + ""; - } ); - } - - hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; - - // If set returns undefined, fall back to normal setting - if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { - this.value = val; - } - } ); - } -} ); - -jQuery.extend( { - valHooks: { - option: { - get: function( elem ) { - - var val = jQuery.find.attr( elem, "value" ); - return val != null ? - val : - - // Support: IE <=10 - 11 only - // option.text throws exceptions (#14686, #14858) - // Strip and collapse whitespace - // https://html.spec.whatwg.org/#strip-and-collapse-whitespace - stripAndCollapse( jQuery.text( elem ) ); - } - }, - select: { - get: function( elem ) { - var value, option, i, - options = elem.options, - index = elem.selectedIndex, - one = elem.type === "select-one", - values = one ? null : [], - max = one ? index + 1 : options.length; - - if ( index < 0 ) { - i = max; - - } else { - i = one ? index : 0; - } - - // Loop through all the selected options - for ( ; i < max; i++ ) { - option = options[ i ]; - - // Support: IE <=9 only - // IE8-9 doesn't update selected after form reset (#2551) - if ( ( option.selected || i === index ) && - - // Don't return options that are disabled or in a disabled optgroup - !option.disabled && - ( !option.parentNode.disabled || - !nodeName( option.parentNode, "optgroup" ) ) ) { - - // Get the specific value for the option - value = jQuery( option ).val(); - - // We don't need an array for one selects - if ( one ) { - return value; - } - - // Multi-Selects return an array - values.push( value ); - } - } - - return values; - }, - - set: function( elem, value ) { - var optionSet, option, - options = elem.options, - values = jQuery.makeArray( value ), - i = options.length; - - while ( i-- ) { - option = options[ i ]; - - /* eslint-disable no-cond-assign */ - - if ( option.selected = - jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 - ) { - optionSet = true; - } - - /* eslint-enable no-cond-assign */ - } - - // Force browsers to behave consistently when non-matching value is set - if ( !optionSet ) { - elem.selectedIndex = -1; - } - return values; - } - } - } -} ); - -// Radios and checkboxes getter/setter -jQuery.each( [ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = { - set: function( elem, value ) { - if ( Array.isArray( value ) ) { - return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); - } - } - }; - if ( !support.checkOn ) { - jQuery.valHooks[ this ].get = function( elem ) { - return elem.getAttribute( "value" ) === null ? "on" : elem.value; - }; - } -} ); - - - - -// Return jQuery for attributes-only inclusion - - -support.focusin = "onfocusin" in window; - - -var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, - stopPropagationCallback = function( e ) { - e.stopPropagation(); - }; - -jQuery.extend( jQuery.event, { - - trigger: function( event, data, elem, onlyHandlers ) { - - var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, - eventPath = [ elem || document ], - type = hasOwn.call( event, "type" ) ? event.type : event, - namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; - - cur = lastElement = tmp = elem = elem || document; - - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } - - if ( type.indexOf( "." ) > -1 ) { - - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split( "." ); - type = namespaces.shift(); - namespaces.sort(); - } - ontype = type.indexOf( ":" ) < 0 && "on" + type; - - // Caller can pass in a jQuery.Event object, Object, or just an event type string - event = event[ jQuery.expando ] ? - event : - new jQuery.Event( type, typeof event === "object" && event ); - - // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) - event.isTrigger = onlyHandlers ? 2 : 3; - event.namespace = namespaces.join( "." ); - event.rnamespace = event.namespace ? - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : - null; - - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data == null ? - [ event ] : - jQuery.makeArray( data, [ event ] ); - - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { - - bubbleType = special.delegateType || type; - if ( !rfocusMorph.test( bubbleType + type ) ) { - cur = cur.parentNode; - } - for ( ; cur; cur = cur.parentNode ) { - eventPath.push( cur ); - tmp = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( tmp === ( elem.ownerDocument || document ) ) { - eventPath.push( tmp.defaultView || tmp.parentWindow || window ); - } - } - - // Fire handlers on the event path - i = 0; - while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { - lastElement = cur; - event.type = i > 1 ? - bubbleType : - special.bindType || type; - - // jQuery handler - handle = ( - dataPriv.get( cur, "events" ) || Object.create( null ) - )[ event.type ] && - dataPriv.get( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - - // Native handler - handle = ontype && cur[ ontype ]; - if ( handle && handle.apply && acceptData( cur ) ) { - event.result = handle.apply( cur, data ); - if ( event.result === false ) { - event.preventDefault(); - } - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( ( !special._default || - special._default.apply( eventPath.pop(), data ) === false ) && - acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name as the event. - // Don't do default actions on window, that's where global variables be (#6170) - if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - tmp = elem[ ontype ]; - - if ( tmp ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - - if ( event.isPropagationStopped() ) { - lastElement.addEventListener( type, stopPropagationCallback ); - } - - elem[ type ](); - - if ( event.isPropagationStopped() ) { - lastElement.removeEventListener( type, stopPropagationCallback ); - } - - jQuery.event.triggered = undefined; - - if ( tmp ) { - elem[ ontype ] = tmp; - } - } - } - } - - return event.result; - }, - - // Piggyback on a donor event to simulate a different one - // Used only for `focus(in | out)` events - simulate: function( type, elem, event ) { - var e = jQuery.extend( - new jQuery.Event(), - event, - { - type: type, - isSimulated: true - } - ); - - jQuery.event.trigger( e, null, elem ); - } - -} ); - -jQuery.fn.extend( { - - trigger: function( type, data ) { - return this.each( function() { - jQuery.event.trigger( type, data, this ); - } ); - }, - triggerHandler: function( type, data ) { - var elem = this[ 0 ]; - if ( elem ) { - return jQuery.event.trigger( type, data, elem, true ); - } - } -} ); - - -// Support: Firefox <=44 -// Firefox doesn't have focus(in | out) events -// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 -// -// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 -// focus(in | out) events fire after focus & blur events, -// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order -// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 -if ( !support.focusin ) { - jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler on the document while someone wants focusin/focusout - var handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); - }; - - jQuery.event.special[ fix ] = { - setup: function() { - - // Handle: regular nodes (via `this.ownerDocument`), window - // (via `this.document`) & document (via `this`). - var doc = this.ownerDocument || this.document || this, - attaches = dataPriv.access( doc, fix ); - - if ( !attaches ) { - doc.addEventListener( orig, handler, true ); - } - dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); - }, - teardown: function() { - var doc = this.ownerDocument || this.document || this, - attaches = dataPriv.access( doc, fix ) - 1; - - if ( !attaches ) { - doc.removeEventListener( orig, handler, true ); - dataPriv.remove( doc, fix ); - - } else { - dataPriv.access( doc, fix, attaches ); - } - } - }; - } ); -} -var location = window.location; - -var nonce = { guid: Date.now() }; - -var rquery = ( /\?/ ); - - - -// Cross-browser xml parsing -jQuery.parseXML = function( data ) { - var xml; - if ( !data || typeof data !== "string" ) { - return null; - } - - // Support: IE 9 - 11 only - // IE throws on parseFromString with invalid input. - try { - xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); - } catch ( e ) { - xml = undefined; - } - - if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { - jQuery.error( "Invalid XML: " + data ); - } - return xml; -}; - - -var - rbracket = /\[\]$/, - rCRLF = /\r?\n/g, - rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, - rsubmittable = /^(?:input|select|textarea|keygen)/i; - -function buildParams( prefix, obj, traditional, add ) { - var name; - - if ( Array.isArray( obj ) ) { - - // Serialize array item. - jQuery.each( obj, function( i, v ) { - if ( traditional || rbracket.test( prefix ) ) { - - // Treat each array item as a scalar. - add( prefix, v ); - - } else { - - // Item is non-scalar (array or object), encode its numeric index. - buildParams( - prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", - v, - traditional, - add - ); - } - } ); - - } else if ( !traditional && toType( obj ) === "object" ) { - - // Serialize object item. - for ( name in obj ) { - buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); - } - - } else { - - // Serialize scalar item. - add( prefix, obj ); - } -} - -// Serialize an array of form elements or a set of -// key/values into a query string -jQuery.param = function( a, traditional ) { - var prefix, - s = [], - add = function( key, valueOrFunction ) { - - // If value is a function, invoke it and use its return value - var value = isFunction( valueOrFunction ) ? - valueOrFunction() : - valueOrFunction; - - s[ s.length ] = encodeURIComponent( key ) + "=" + - encodeURIComponent( value == null ? "" : value ); - }; - - if ( a == null ) { - return ""; - } - - // If an array was passed in, assume that it is an array of form elements. - if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { - - // Serialize the form elements - jQuery.each( a, function() { - add( this.name, this.value ); - } ); - - } else { - - // If traditional, encode the "old" way (the way 1.3.2 or older - // did it), otherwise encode params recursively. - for ( prefix in a ) { - buildParams( prefix, a[ prefix ], traditional, add ); - } - } - - // Return the resulting serialization - return s.join( "&" ); -}; - -jQuery.fn.extend( { - serialize: function() { - return jQuery.param( this.serializeArray() ); - }, - serializeArray: function() { - return this.map( function() { - - // Can add propHook for "elements" to filter or add form elements - var elements = jQuery.prop( this, "elements" ); - return elements ? jQuery.makeArray( elements ) : this; - } ) - .filter( function() { - var type = this.type; - - // Use .is( ":disabled" ) so that fieldset[disabled] works - return this.name && !jQuery( this ).is( ":disabled" ) && - rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && - ( this.checked || !rcheckableType.test( type ) ); - } ) - .map( function( _i, elem ) { - var val = jQuery( this ).val(); - - if ( val == null ) { - return null; - } - - if ( Array.isArray( val ) ) { - return jQuery.map( val, function( val ) { - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ); - } - - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ).get(); - } -} ); - - -var - r20 = /%20/g, - rhash = /#.*$/, - rantiCache = /([?&])_=[^&]*/, - rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, - - // #7653, #8125, #8152: local protocol detection - rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, - rnoContent = /^(?:GET|HEAD)$/, - rprotocol = /^\/\//, - - /* Prefilters - * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) - * 2) These are called: - * - BEFORE asking for a transport - * - AFTER param serialization (s.data is a string if s.processData is true) - * 3) key is the dataType - * 4) the catchall symbol "*" can be used - * 5) execution will start with transport dataType and THEN continue down to "*" if needed - */ - prefilters = {}, - - /* Transports bindings - * 1) key is the dataType - * 2) the catchall symbol "*" can be used - * 3) selection will start with transport dataType and THEN go to "*" if needed - */ - transports = {}, - - // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression - allTypes = "*/".concat( "*" ), - - // Anchor tag for parsing the document origin - originAnchor = document.createElement( "a" ); - originAnchor.href = location.href; - -// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport -function addToPrefiltersOrTransports( structure ) { - - // dataTypeExpression is optional and defaults to "*" - return function( dataTypeExpression, func ) { - - if ( typeof dataTypeExpression !== "string" ) { - func = dataTypeExpression; - dataTypeExpression = "*"; - } - - var dataType, - i = 0, - dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; - - if ( isFunction( func ) ) { - - // For each dataType in the dataTypeExpression - while ( ( dataType = dataTypes[ i++ ] ) ) { - - // Prepend if requested - if ( dataType[ 0 ] === "+" ) { - dataType = dataType.slice( 1 ) || "*"; - ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); - - // Otherwise append - } else { - ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); - } - } - } - }; -} - -// Base inspection function for prefilters and transports -function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { - - var inspected = {}, - seekingTransport = ( structure === transports ); - - function inspect( dataType ) { - var selected; - inspected[ dataType ] = true; - jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { - var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); - if ( typeof dataTypeOrTransport === "string" && - !seekingTransport && !inspected[ dataTypeOrTransport ] ) { - - options.dataTypes.unshift( dataTypeOrTransport ); - inspect( dataTypeOrTransport ); - return false; - } else if ( seekingTransport ) { - return !( selected = dataTypeOrTransport ); - } - } ); - return selected; - } - - return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); -} - -// A special extend for ajax options -// that takes "flat" options (not to be deep extended) -// Fixes #9887 -function ajaxExtend( target, src ) { - var key, deep, - flatOptions = jQuery.ajaxSettings.flatOptions || {}; - - for ( key in src ) { - if ( src[ key ] !== undefined ) { - ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; - } - } - if ( deep ) { - jQuery.extend( true, target, deep ); - } - - return target; -} - -/* Handles responses to an ajax request: - * - finds the right dataType (mediates between content-type and expected dataType) - * - returns the corresponding response - */ -function ajaxHandleResponses( s, jqXHR, responses ) { - - var ct, type, finalDataType, firstDataType, - contents = s.contents, - dataTypes = s.dataTypes; - - // Remove auto dataType and get content-type in the process - while ( dataTypes[ 0 ] === "*" ) { - dataTypes.shift(); - if ( ct === undefined ) { - ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); - } - } - - // Check if we're dealing with a known content-type - if ( ct ) { - for ( type in contents ) { - if ( contents[ type ] && contents[ type ].test( ct ) ) { - dataTypes.unshift( type ); - break; - } - } - } - - // Check to see if we have a response for the expected dataType - if ( dataTypes[ 0 ] in responses ) { - finalDataType = dataTypes[ 0 ]; - } else { - - // Try convertible dataTypes - for ( type in responses ) { - if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { - finalDataType = type; - break; - } - if ( !firstDataType ) { - firstDataType = type; - } - } - - // Or just use first one - finalDataType = finalDataType || firstDataType; - } - - // If we found a dataType - // We add the dataType to the list if needed - // and return the corresponding response - if ( finalDataType ) { - if ( finalDataType !== dataTypes[ 0 ] ) { - dataTypes.unshift( finalDataType ); - } - return responses[ finalDataType ]; - } -} - -/* Chain conversions given the request and the original response - * Also sets the responseXXX fields on the jqXHR instance - */ -function ajaxConvert( s, response, jqXHR, isSuccess ) { - var conv2, current, conv, tmp, prev, - converters = {}, - - // Work with a copy of dataTypes in case we need to modify it for conversion - dataTypes = s.dataTypes.slice(); - - // Create converters map with lowercased keys - if ( dataTypes[ 1 ] ) { - for ( conv in s.converters ) { - converters[ conv.toLowerCase() ] = s.converters[ conv ]; - } - } - - current = dataTypes.shift(); - - // Convert to each sequential dataType - while ( current ) { - - if ( s.responseFields[ current ] ) { - jqXHR[ s.responseFields[ current ] ] = response; - } - - // Apply the dataFilter if provided - if ( !prev && isSuccess && s.dataFilter ) { - response = s.dataFilter( response, s.dataType ); - } - - prev = current; - current = dataTypes.shift(); - - if ( current ) { - - // There's only work to do if current dataType is non-auto - if ( current === "*" ) { - - current = prev; - - // Convert response if prev dataType is non-auto and differs from current - } else if ( prev !== "*" && prev !== current ) { - - // Seek a direct converter - conv = converters[ prev + " " + current ] || converters[ "* " + current ]; - - // If none found, seek a pair - if ( !conv ) { - for ( conv2 in converters ) { - - // If conv2 outputs current - tmp = conv2.split( " " ); - if ( tmp[ 1 ] === current ) { - - // If prev can be converted to accepted input - conv = converters[ prev + " " + tmp[ 0 ] ] || - converters[ "* " + tmp[ 0 ] ]; - if ( conv ) { - - // Condense equivalence converters - if ( conv === true ) { - conv = converters[ conv2 ]; - - // Otherwise, insert the intermediate dataType - } else if ( converters[ conv2 ] !== true ) { - current = tmp[ 0 ]; - dataTypes.unshift( tmp[ 1 ] ); - } - break; - } - } - } - } - - // Apply converter (if not an equivalence) - if ( conv !== true ) { - - // Unless errors are allowed to bubble, catch and return them - if ( conv && s.throws ) { - response = conv( response ); - } else { - try { - response = conv( response ); - } catch ( e ) { - return { - state: "parsererror", - error: conv ? e : "No conversion from " + prev + " to " + current - }; - } - } - } - } - } - } - - return { state: "success", data: response }; -} - -jQuery.extend( { - - // Counter for holding the number of active queries - active: 0, - - // Last-Modified header cache for next request - lastModified: {}, - etag: {}, - - ajaxSettings: { - url: location.href, - type: "GET", - isLocal: rlocalProtocol.test( location.protocol ), - global: true, - processData: true, - async: true, - contentType: "application/x-www-form-urlencoded; charset=UTF-8", - - /* - timeout: 0, - data: null, - dataType: null, - username: null, - password: null, - cache: null, - throws: false, - traditional: false, - headers: {}, - */ - - accepts: { - "*": allTypes, - text: "text/plain", - html: "text/html", - xml: "application/xml, text/xml", - json: "application/json, text/javascript" - }, - - contents: { - xml: /\bxml\b/, - html: /\bhtml/, - json: /\bjson\b/ - }, - - responseFields: { - xml: "responseXML", - text: "responseText", - json: "responseJSON" - }, - - // Data converters - // Keys separate source (or catchall "*") and destination types with a single space - converters: { - - // Convert anything to text - "* text": String, - - // Text to html (true = no transformation) - "text html": true, - - // Evaluate text as a json expression - "text json": JSON.parse, - - // Parse text as xml - "text xml": jQuery.parseXML - }, - - // For options that shouldn't be deep extended: - // you can add your own custom options here if - // and when you create one that shouldn't be - // deep extended (see ajaxExtend) - flatOptions: { - url: true, - context: true - } - }, - - // Creates a full fledged settings object into target - // with both ajaxSettings and settings fields. - // If target is omitted, writes into ajaxSettings. - ajaxSetup: function( target, settings ) { - return settings ? - - // Building a settings object - ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : - - // Extending ajaxSettings - ajaxExtend( jQuery.ajaxSettings, target ); - }, - - ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), - ajaxTransport: addToPrefiltersOrTransports( transports ), - - // Main method - ajax: function( url, options ) { - - // If url is an object, simulate pre-1.5 signature - if ( typeof url === "object" ) { - options = url; - url = undefined; - } - - // Force options to be an object - options = options || {}; - - var transport, - - // URL without anti-cache param - cacheURL, - - // Response headers - responseHeadersString, - responseHeaders, - - // timeout handle - timeoutTimer, - - // Url cleanup var - urlAnchor, - - // Request state (becomes false upon send and true upon completion) - completed, - - // To know if global events are to be dispatched - fireGlobals, - - // Loop variable - i, - - // uncached part of the url - uncached, - - // Create the final options object - s = jQuery.ajaxSetup( {}, options ), - - // Callbacks context - callbackContext = s.context || s, - - // Context for global events is callbackContext if it is a DOM node or jQuery collection - globalEventContext = s.context && - ( callbackContext.nodeType || callbackContext.jquery ) ? - jQuery( callbackContext ) : - jQuery.event, - - // Deferreds - deferred = jQuery.Deferred(), - completeDeferred = jQuery.Callbacks( "once memory" ), - - // Status-dependent callbacks - statusCode = s.statusCode || {}, - - // Headers (they are sent all at once) - requestHeaders = {}, - requestHeadersNames = {}, - - // Default abort message - strAbort = "canceled", - - // Fake xhr - jqXHR = { - readyState: 0, - - // Builds headers hashtable if needed - getResponseHeader: function( key ) { - var match; - if ( completed ) { - if ( !responseHeaders ) { - responseHeaders = {}; - while ( ( match = rheaders.exec( responseHeadersString ) ) ) { - responseHeaders[ match[ 1 ].toLowerCase() + " " ] = - ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) - .concat( match[ 2 ] ); - } - } - match = responseHeaders[ key.toLowerCase() + " " ]; - } - return match == null ? null : match.join( ", " ); - }, - - // Raw string - getAllResponseHeaders: function() { - return completed ? responseHeadersString : null; - }, - - // Caches the header - setRequestHeader: function( name, value ) { - if ( completed == null ) { - name = requestHeadersNames[ name.toLowerCase() ] = - requestHeadersNames[ name.toLowerCase() ] || name; - requestHeaders[ name ] = value; - } - return this; - }, - - // Overrides response content-type header - overrideMimeType: function( type ) { - if ( completed == null ) { - s.mimeType = type; - } - return this; - }, - - // Status-dependent callbacks - statusCode: function( map ) { - var code; - if ( map ) { - if ( completed ) { - - // Execute the appropriate callbacks - jqXHR.always( map[ jqXHR.status ] ); - } else { - - // Lazy-add the new callbacks in a way that preserves old ones - for ( code in map ) { - statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; - } - } - } - return this; - }, - - // Cancel the request - abort: function( statusText ) { - var finalText = statusText || strAbort; - if ( transport ) { - transport.abort( finalText ); - } - done( 0, finalText ); - return this; - } - }; - - // Attach deferreds - deferred.promise( jqXHR ); - - // Add protocol if not provided (prefilters might expect it) - // Handle falsy url in the settings object (#10093: consistency with old signature) - // We also use the url parameter if available - s.url = ( ( url || s.url || location.href ) + "" ) - .replace( rprotocol, location.protocol + "//" ); - - // Alias method option to type as per ticket #12004 - s.type = options.method || options.type || s.method || s.type; - - // Extract dataTypes list - s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; - - // A cross-domain request is in order when the origin doesn't match the current origin. - if ( s.crossDomain == null ) { - urlAnchor = document.createElement( "a" ); - - // Support: IE <=8 - 11, Edge 12 - 15 - // IE throws exception on accessing the href property if url is malformed, - // e.g. http://example.com:80x/ - try { - urlAnchor.href = s.url; - - // Support: IE <=8 - 11 only - // Anchor's host property isn't correctly set when s.url is relative - urlAnchor.href = urlAnchor.href; - s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== - urlAnchor.protocol + "//" + urlAnchor.host; - } catch ( e ) { - - // If there is an error parsing the URL, assume it is crossDomain, - // it can be rejected by the transport if it is invalid - s.crossDomain = true; - } - } - - // Convert data if not already a string - if ( s.data && s.processData && typeof s.data !== "string" ) { - s.data = jQuery.param( s.data, s.traditional ); - } - - // Apply prefilters - inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); - - // If request was aborted inside a prefilter, stop there - if ( completed ) { - return jqXHR; - } - - // We can fire global events as of now if asked to - // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) - fireGlobals = jQuery.event && s.global; - - // Watch for a new set of requests - if ( fireGlobals && jQuery.active++ === 0 ) { - jQuery.event.trigger( "ajaxStart" ); - } - - // Uppercase the type - s.type = s.type.toUpperCase(); - - // Determine if request has content - s.hasContent = !rnoContent.test( s.type ); - - // Save the URL in case we're toying with the If-Modified-Since - // and/or If-None-Match header later on - // Remove hash to simplify url manipulation - cacheURL = s.url.replace( rhash, "" ); - - // More options handling for requests with no content - if ( !s.hasContent ) { - - // Remember the hash so we can put it back - uncached = s.url.slice( cacheURL.length ); - - // If data is available and should be processed, append data to url - if ( s.data && ( s.processData || typeof s.data === "string" ) ) { - cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; - - // #9682: remove data so that it's not used in an eventual retry - delete s.data; - } - - // Add or update anti-cache param if needed - if ( s.cache === false ) { - cacheURL = cacheURL.replace( rantiCache, "$1" ); - uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) + - uncached; - } - - // Put hash and anti-cache on the URL that will be requested (gh-1732) - s.url = cacheURL + uncached; - - // Change '%20' to '+' if this is encoded form body content (gh-2658) - } else if ( s.data && s.processData && - ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { - s.data = s.data.replace( r20, "+" ); - } - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - if ( jQuery.lastModified[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); - } - if ( jQuery.etag[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); - } - } - - // Set the correct header, if data is being sent - if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { - jqXHR.setRequestHeader( "Content-Type", s.contentType ); - } - - // Set the Accepts header for the server, depending on the dataType - jqXHR.setRequestHeader( - "Accept", - s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? - s.accepts[ s.dataTypes[ 0 ] ] + - ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : - s.accepts[ "*" ] - ); - - // Check for headers option - for ( i in s.headers ) { - jqXHR.setRequestHeader( i, s.headers[ i ] ); - } - - // Allow custom headers/mimetypes and early abort - if ( s.beforeSend && - ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { - - // Abort if not done already and return - return jqXHR.abort(); - } - - // Aborting is no longer a cancellation - strAbort = "abort"; - - // Install callbacks on deferreds - completeDeferred.add( s.complete ); - jqXHR.done( s.success ); - jqXHR.fail( s.error ); - - // Get transport - transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); - - // If no transport, we auto-abort - if ( !transport ) { - done( -1, "No Transport" ); - } else { - jqXHR.readyState = 1; - - // Send global event - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); - } - - // If request was aborted inside ajaxSend, stop there - if ( completed ) { - return jqXHR; - } - - // Timeout - if ( s.async && s.timeout > 0 ) { - timeoutTimer = window.setTimeout( function() { - jqXHR.abort( "timeout" ); - }, s.timeout ); - } - - try { - completed = false; - transport.send( requestHeaders, done ); - } catch ( e ) { - - // Rethrow post-completion exceptions - if ( completed ) { - throw e; - } - - // Propagate others as results - done( -1, e ); - } - } - - // Callback for when everything is done - function done( status, nativeStatusText, responses, headers ) { - var isSuccess, success, error, response, modified, - statusText = nativeStatusText; - - // Ignore repeat invocations - if ( completed ) { - return; - } - - completed = true; - - // Clear timeout if it exists - if ( timeoutTimer ) { - window.clearTimeout( timeoutTimer ); - } - - // Dereference transport for early garbage collection - // (no matter how long the jqXHR object will be used) - transport = undefined; - - // Cache response headers - responseHeadersString = headers || ""; - - // Set readyState - jqXHR.readyState = status > 0 ? 4 : 0; - - // Determine if successful - isSuccess = status >= 200 && status < 300 || status === 304; - - // Get response data - if ( responses ) { - response = ajaxHandleResponses( s, jqXHR, responses ); - } - - // Use a noop converter for missing script - if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) { - s.converters[ "text script" ] = function() {}; - } - - // Convert no matter what (that way responseXXX fields are always set) - response = ajaxConvert( s, response, jqXHR, isSuccess ); - - // If successful, handle type chaining - if ( isSuccess ) { - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - modified = jqXHR.getResponseHeader( "Last-Modified" ); - if ( modified ) { - jQuery.lastModified[ cacheURL ] = modified; - } - modified = jqXHR.getResponseHeader( "etag" ); - if ( modified ) { - jQuery.etag[ cacheURL ] = modified; - } - } - - // if no content - if ( status === 204 || s.type === "HEAD" ) { - statusText = "nocontent"; - - // if not modified - } else if ( status === 304 ) { - statusText = "notmodified"; - - // If we have data, let's convert it - } else { - statusText = response.state; - success = response.data; - error = response.error; - isSuccess = !error; - } - } else { - - // Extract error from statusText and normalize for non-aborts - error = statusText; - if ( status || !statusText ) { - statusText = "error"; - if ( status < 0 ) { - status = 0; - } - } - } - - // Set data for the fake xhr object - jqXHR.status = status; - jqXHR.statusText = ( nativeStatusText || statusText ) + ""; - - // Success/Error - if ( isSuccess ) { - deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); - } else { - deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); - } - - // Status-dependent callbacks - jqXHR.statusCode( statusCode ); - statusCode = undefined; - - if ( fireGlobals ) { - globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", - [ jqXHR, s, isSuccess ? success : error ] ); - } - - // Complete - completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); - - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); - - // Handle the global AJAX counter - if ( !( --jQuery.active ) ) { - jQuery.event.trigger( "ajaxStop" ); - } - } - } - - return jqXHR; - }, - - getJSON: function( url, data, callback ) { - return jQuery.get( url, data, callback, "json" ); - }, - - getScript: function( url, callback ) { - return jQuery.get( url, undefined, callback, "script" ); - } -} ); - -jQuery.each( [ "get", "post" ], function( _i, method ) { - jQuery[ method ] = function( url, data, callback, type ) { - - // Shift arguments if data argument was omitted - if ( isFunction( data ) ) { - type = type || callback; - callback = data; - data = undefined; - } - - // The url can be an options object (which then must have .url) - return jQuery.ajax( jQuery.extend( { - url: url, - type: method, - dataType: type, - data: data, - success: callback - }, jQuery.isPlainObject( url ) && url ) ); - }; -} ); - -jQuery.ajaxPrefilter( function( s ) { - var i; - for ( i in s.headers ) { - if ( i.toLowerCase() === "content-type" ) { - s.contentType = s.headers[ i ] || ""; - } - } -} ); - - -jQuery._evalUrl = function( url, options, doc ) { - return jQuery.ajax( { - url: url, - - // Make this explicit, since user can override this through ajaxSetup (#11264) - type: "GET", - dataType: "script", - cache: true, - async: false, - global: false, - - // Only evaluate the response if it is successful (gh-4126) - // dataFilter is not invoked for failure responses, so using it instead - // of the default converter is kludgy but it works. - converters: { - "text script": function() {} - }, - dataFilter: function( response ) { - jQuery.globalEval( response, options, doc ); - } - } ); -}; - - -jQuery.fn.extend( { - wrapAll: function( html ) { - var wrap; - - if ( this[ 0 ] ) { - if ( isFunction( html ) ) { - html = html.call( this[ 0 ] ); - } - - // The elements to wrap the target around - wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); - - if ( this[ 0 ].parentNode ) { - wrap.insertBefore( this[ 0 ] ); - } - - wrap.map( function() { - var elem = this; - - while ( elem.firstElementChild ) { - elem = elem.firstElementChild; - } - - return elem; - } ).append( this ); - } - - return this; - }, - - wrapInner: function( html ) { - if ( isFunction( html ) ) { - return this.each( function( i ) { - jQuery( this ).wrapInner( html.call( this, i ) ); - } ); - } - - return this.each( function() { - var self = jQuery( this ), - contents = self.contents(); - - if ( contents.length ) { - contents.wrapAll( html ); - - } else { - self.append( html ); - } - } ); - }, - - wrap: function( html ) { - var htmlIsFunction = isFunction( html ); - - return this.each( function( i ) { - jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); - } ); - }, - - unwrap: function( selector ) { - this.parent( selector ).not( "body" ).each( function() { - jQuery( this ).replaceWith( this.childNodes ); - } ); - return this; - } -} ); - - -jQuery.expr.pseudos.hidden = function( elem ) { - return !jQuery.expr.pseudos.visible( elem ); -}; -jQuery.expr.pseudos.visible = function( elem ) { - return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); -}; - - - - -jQuery.ajaxSettings.xhr = function() { - try { - return new window.XMLHttpRequest(); - } catch ( e ) {} -}; - -var xhrSuccessStatus = { - - // File protocol always yields status code 0, assume 200 - 0: 200, - - // Support: IE <=9 only - // #1450: sometimes IE returns 1223 when it should be 204 - 1223: 204 - }, - xhrSupported = jQuery.ajaxSettings.xhr(); - -support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); -support.ajax = xhrSupported = !!xhrSupported; - -jQuery.ajaxTransport( function( options ) { - var callback, errorCallback; - - // Cross domain only allowed if supported through XMLHttpRequest - if ( support.cors || xhrSupported && !options.crossDomain ) { - return { - send: function( headers, complete ) { - var i, - xhr = options.xhr(); - - xhr.open( - options.type, - options.url, - options.async, - options.username, - options.password - ); - - // Apply custom fields if provided - if ( options.xhrFields ) { - for ( i in options.xhrFields ) { - xhr[ i ] = options.xhrFields[ i ]; - } - } - - // Override mime type if needed - if ( options.mimeType && xhr.overrideMimeType ) { - xhr.overrideMimeType( options.mimeType ); - } - - // X-Requested-With header - // For cross-domain requests, seeing as conditions for a preflight are - // akin to a jigsaw puzzle, we simply never set it to be sure. - // (it can always be set on a per-request basis or even using ajaxSetup) - // For same-domain requests, won't change header if already provided. - if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { - headers[ "X-Requested-With" ] = "XMLHttpRequest"; - } - - // Set headers - for ( i in headers ) { - xhr.setRequestHeader( i, headers[ i ] ); - } - - // Callback - callback = function( type ) { - return function() { - if ( callback ) { - callback = errorCallback = xhr.onload = - xhr.onerror = xhr.onabort = xhr.ontimeout = - xhr.onreadystatechange = null; - - if ( type === "abort" ) { - xhr.abort(); - } else if ( type === "error" ) { - - // Support: IE <=9 only - // On a manual native abort, IE9 throws - // errors on any property access that is not readyState - if ( typeof xhr.status !== "number" ) { - complete( 0, "error" ); - } else { - complete( - - // File: protocol always yields status 0; see #8605, #14207 - xhr.status, - xhr.statusText - ); - } - } else { - complete( - xhrSuccessStatus[ xhr.status ] || xhr.status, - xhr.statusText, - - // Support: IE <=9 only - // IE9 has no XHR2 but throws on binary (trac-11426) - // For XHR2 non-text, let the caller handle it (gh-2498) - ( xhr.responseType || "text" ) !== "text" || - typeof xhr.responseText !== "string" ? - { binary: xhr.response } : - { text: xhr.responseText }, - xhr.getAllResponseHeaders() - ); - } - } - }; - }; - - // Listen to events - xhr.onload = callback(); - errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); - - // Support: IE 9 only - // Use onreadystatechange to replace onabort - // to handle uncaught aborts - if ( xhr.onabort !== undefined ) { - xhr.onabort = errorCallback; - } else { - xhr.onreadystatechange = function() { - - // Check readyState before timeout as it changes - if ( xhr.readyState === 4 ) { - - // Allow onerror to be called first, - // but that will not handle a native abort - // Also, save errorCallback to a variable - // as xhr.onerror cannot be accessed - window.setTimeout( function() { - if ( callback ) { - errorCallback(); - } - } ); - } - }; - } - - // Create the abort callback - callback = callback( "abort" ); - - try { - - // Do send the request (this may raise an exception) - xhr.send( options.hasContent && options.data || null ); - } catch ( e ) { - - // #14683: Only rethrow if this hasn't been notified as an error yet - if ( callback ) { - throw e; - } - } - }, - - abort: function() { - if ( callback ) { - callback(); - } - } - }; - } -} ); - - - - -// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) -jQuery.ajaxPrefilter( function( s ) { - if ( s.crossDomain ) { - s.contents.script = false; - } -} ); - -// Install script dataType -jQuery.ajaxSetup( { - accepts: { - script: "text/javascript, application/javascript, " + - "application/ecmascript, application/x-ecmascript" - }, - contents: { - script: /\b(?:java|ecma)script\b/ - }, - converters: { - "text script": function( text ) { - jQuery.globalEval( text ); - return text; - } - } -} ); - -// Handle cache's special case and crossDomain -jQuery.ajaxPrefilter( "script", function( s ) { - if ( s.cache === undefined ) { - s.cache = false; - } - if ( s.crossDomain ) { - s.type = "GET"; - } -} ); - -// Bind script tag hack transport -jQuery.ajaxTransport( "script", function( s ) { - - // This transport only deals with cross domain or forced-by-attrs requests - if ( s.crossDomain || s.scriptAttrs ) { - var script, callback; - return { - send: function( _, complete ) { - script = jQuery( " - - - - - - - - - - - - - - - - - - -
- - -
- -
-
-
- -
-
-
-
- - -

Index

- -
- -
- - -
-
- -
-
-
-
- - - - - \ No newline at end of file diff --git a/asio/index.html b/asio/index.html deleted file mode 100644 index 6687a109f..000000000 --- a/asio/index.html +++ /dev/null @@ -1,211 +0,0 @@ - - - - - - - ASIO port - ESP32 - — ESP-Protocols latest documentation - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
- -
-
-
- -
-
-
-
- -
-

ASIO port

-
-

Overview

-

Asio is a cross-platform C++ library, see https://think-async.com/Asio/. It provides a consistent asynchronous model using a modern C++ approach.

-
-

ASIO documentation

-

Please refer to the original asio documentation at https://think-async.com/Asio/Documentation. -Asio also comes with a number of examples which could be find under Documentation/Examples on that web site.

-
-
-

Supported features

-

ESP platform port currently supports only network asynchronous socket operations; does not support serial port. -SSL/TLS support is disabled by default and could be enabled in component configuration menu by choosing TLS library from

-
    -
  • mbedTLS with OpenSSL translation layer (default option)

  • -
  • wolfSSL

  • -
-

SSL support is very basic at this stage and it does include following features:

-
    -
  • Verification callbacks

  • -
  • DH property files

  • -
  • Certificates/private keys file APIs

  • -
-

Internal asio settings for ESP include

-
    -
  • EXCEPTIONS are enabled in ASIO if enabled in menuconfig

  • -
  • TYPEID is enabled in ASIO if enabled in menuconfig

  • -
-
-
-
-

Application Example

-

ESP examples are based on standard asio examples :

- -

Please refer to the specific example README.md for details

-
-
- - -
-
- -
-
-
-
- - - - - diff --git a/asio/objects.inv b/asio/objects.inv deleted file mode 100644 index 55638542c..000000000 Binary files a/asio/objects.inv and /dev/null differ diff --git a/asio/search.html b/asio/search.html deleted file mode 100644 index 7b9bb7832..000000000 --- a/asio/search.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - Search - ESP32 - — ESP-Protocols latest documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
- -
-
-
-
    -
  • »
  • -
  • Search
  • -
  • -
  • -
-
-
-
-
- - - - -
- -
- -
-
- -
-
-
-
- - - - - - - - - - \ No newline at end of file diff --git a/asio/searchindex.js b/asio/searchindex.js deleted file mode 100644 index 1186c7146..000000000 --- a/asio/searchindex.js +++ /dev/null @@ -1 +0,0 @@ -Search.setIndex({docnames:["index"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":5,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":3,"sphinx.domains.rst":2,"sphinx.domains.std":2,"sphinx.ext.todo":2,sphinx:56},filenames:["index.rst"],objects:{},objnames:{},objtypes:{},terms:{"default":0,It:0,also:0,api:0,approach:0,ar:0,asio_chat:0,async:0,asynchron:0,base:0,basic:0,c:0,callback:0,certif:0,choos:0,com:0,come:0,compon:0,configur:0,consist:0,could:0,cross:0,current:0,detail:0,dh:0,disabl:0,doe:0,enabl:0,esp:0,except:0,file:0,find:0,follow:0,from:0,http:0,includ:0,intern:0,kei:0,layer:0,librari:0,mbedtl:0,md:0,menu:0,menuconfig:0,model:0,modern:0,network:0,number:0,onli:0,openssl:0,oper:0,option:0,origin:0,platform:0,pleas:0,privat:0,properti:0,provid:0,readm:0,refer:0,see:0,serial:0,set:0,site:0,socket:0,specif:0,ssl:0,ssl_client_serv:0,stage:0,standard:0,tcp_echo_serv:0,thi:0,think:0,tl:0,translat:0,typeid:0,udp_echo_serv:0,under:0,us:0,veri:0,verif:0,web:0,which:0,wolfssl:0},titles:["ASIO port"],titleterms:{applic:0,asio:0,document:0,exampl:0,featur:0,overview:0,port:0,support:0}}) \ No newline at end of file diff --git a/docs_versions.js b/docs_versions.js deleted file mode 100644 index 447ce23d1..000000000 --- a/docs_versions.js +++ /dev/null @@ -1,12 +0,0 @@ -var DOCUMENTATION_VERSIONS = { - VERSIONS: [ - { name: "latest", has_targets: true, supported_targets: [ "esp32", "esp32s2", "esp32s3", "esp32c2", "esp32c3" ] }, - ], - IDF_TARGETS: [ - { text: "ESP32", value: "esp32"}, - { text: "ESP32-S2", value: "esp32s2"}, - { text: "ESP32-S3", value: "esp32s3"}, - { text: "ESP32-C2", value: "esp32c2"}, - { text: "ESP32-C3", value: "esp32c3"} - ], -}; diff --git a/esp_modem/.buildinfo b/esp_modem/.buildinfo deleted file mode 100644 index 086b1f188..000000000 --- a/esp_modem/.buildinfo +++ /dev/null @@ -1,4 +0,0 @@ -# Sphinx build info version 1 -# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: d740c71820b26864ed688d5e0db8a303 -tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/esp_modem/.doctrees/README.doctree b/esp_modem/.doctrees/README.doctree deleted file mode 100644 index 043e995e0..000000000 Binary files a/esp_modem/.doctrees/README.doctree and /dev/null differ diff --git a/esp_modem/.doctrees/advanced_api.doctree b/esp_modem/.doctrees/advanced_api.doctree deleted file mode 100644 index 7d17b7eca..000000000 Binary files a/esp_modem/.doctrees/advanced_api.doctree and /dev/null differ diff --git a/esp_modem/.doctrees/api_docs.doctree b/esp_modem/.doctrees/api_docs.doctree deleted file mode 100644 index 1c9b66544..000000000 Binary files a/esp_modem/.doctrees/api_docs.doctree and /dev/null differ diff --git a/esp_modem/.doctrees/cxx_api_docs.doctree b/esp_modem/.doctrees/cxx_api_docs.doctree deleted file mode 100644 index 46da6c646..000000000 Binary files a/esp_modem/.doctrees/cxx_api_docs.doctree and /dev/null differ diff --git a/esp_modem/.doctrees/cxx_api_links.doctree b/esp_modem/.doctrees/cxx_api_links.doctree deleted file mode 100644 index da883df1b..000000000 Binary files a/esp_modem/.doctrees/cxx_api_links.doctree and /dev/null differ diff --git a/esp_modem/.doctrees/environment.pickle b/esp_modem/.doctrees/environment.pickle deleted file mode 100644 index 1d14b70d9..000000000 Binary files a/esp_modem/.doctrees/environment.pickle and /dev/null differ diff --git a/esp_modem/.doctrees/index.doctree b/esp_modem/.doctrees/index.doctree deleted file mode 100644 index 19dfecfe7..000000000 Binary files a/esp_modem/.doctrees/index.doctree and /dev/null differ diff --git a/esp_modem/.doctrees/internal_design.doctree b/esp_modem/.doctrees/internal_design.doctree deleted file mode 100644 index 4def8ff4c..000000000 Binary files a/esp_modem/.doctrees/internal_design.doctree and /dev/null differ diff --git a/esp_modem/.doctrees/internal_docs.doctree b/esp_modem/.doctrees/internal_docs.doctree deleted file mode 100644 index a4cc40a23..000000000 Binary files a/esp_modem/.doctrees/internal_docs.doctree and /dev/null differ diff --git a/esp_modem/README.html b/esp_modem/README.html deleted file mode 100644 index c2fddc4be..000000000 --- a/esp_modem/README.html +++ /dev/null @@ -1,236 +0,0 @@ - - - - - - - - - ESP MODEM — esp-modem documentation - - - - - - - - - - - - - - - - - - - -
-
-
- - -
- -
-

ESP MODEM

-

This component is used to communicate with modems in the command mode (using AT commands), as well as the data mode -(over PPPoS protocol). -The modem device is modeled with a DCE (Data Communication Equipment) object, which is composed of:

-
    -
  • DTE (Data Terminal Equipment), which abstracts the terminal (currently only UART implemented).

  • -
  • PPP Netif representing a network interface communicating with the DTE using PPP protocol.

  • -
  • Module abstracting the specific device model and its commands.

  • -
-
   +-----+
-   | DTE |--+
-   +-----+  |   +-------+
-            +-->|   DCE |
-   +-------+    |       |o--- set_mode(command/data)
-   | Module|--->|       |
-   +-------+    |       |o--- send_commands
-             +->|       |
-   +------+  |  +-------+
-   | PPP  |--+
-   | netif|------------------> network events
-   +------+
-
-
-
-

Modem components

-
-

DCE

-

This is the basic operational unit of the esp_modem component, abstracting a specific module in software, -which is basically configured by

-
    -
  • the I/O communication media (UART), defined by the DTE configuration

  • -
  • the specific command library supported by the device model, defined with the module type

  • -
  • network interface configuration (PPPoS config in lwip)

  • -
-

After the object is created, the application interaction with the DCE is in

-
    -
  • issuing specific commands to the modem

  • -
  • switching between data and command mode

  • -
-
-
-

DTE

-

Is an abstraction of the physical interface connected to the modem. Current implementation supports only UART

-
-
-

PPP netif

-

Is used to attach the specific network interface to a network communication protocol used by the modem. Currently implementation supports only PPPoS protocol.

-
-
-

Module

-

Abstraction of the specific modem device. Currently the component supports SIM800, BG96, SIM7600.

-
-
-
-

Use cases

-

Users interact with the esp-modem using the DCE’s interface, to basically

-
    -
  • Switch between command and data mode to connect to the internet via cellular network.

  • -
  • Send various commands to the device (e.g. send SMS)

  • -
-

The applications typically register handlers for network events to receive notification on the network availability and -IP address changes.

-

Common use cases of the esp-modem are also listed as the examples:

-
    -
  • examples/pppos_client – simple client which reads some module properties and switches to the data mode to connect to a public mqtt broker.

  • -
  • examples/modem_console – is an example to exercise all possible module commands in a console application.

  • -
  • examples/ap_to_pppos – this example focuses on the network connectivity of the esp-modem and provides a WiFi AP that forwards packets (and uses NAT) to and from the PPPoS connection.

  • -
-
-
-

Extensibility

-
-

CMUX

-

Implementation of virtual terminals is an experimental feature, which allows users to also issue commands in the data mode, -after creating multiple virtual terminals, designating some of them solely to data mode, others solely to command mode.

-
-
-

DTE’s

-

Currently, we support only UART (and USB as a preview feature), but modern modules support other communication interfaces, such as USB, SPI.

-
-
-

Other devices

-

Adding a new device is a must-have requirement for the esp-modem component. Different modules support different commands, -or some commands might have a different implementation. Adding a new device means to provide a new implementation -as a class derived from GenericModule, where we could add new commands or modify the existing ones.

-
-
-
-

Configuration

-

Modem abstraction is configurable both compile-time and run-time.

-
-

Component Kconfig

-

Compile-time configuration is provided using menuconfig. Please check the description for the CMUX mode configuration options.

-
-
-

Runtime configuration

-

Is defined using standard configuration structures for DTE and DCE objects separately. Please find documentation of

-
    -
  • :cpp:class:esp_modem_dte_config_t

  • -
  • :cpp:class:esp_modem_dce_config_t

  • -
-
-
-
- - -
- -
-
- -
-
- - - - - - - \ No newline at end of file diff --git a/esp_modem/_images/CMux_collaboration.png b/esp_modem/_images/CMux_collaboration.png deleted file mode 100644 index 7741ff066..000000000 Binary files a/esp_modem/_images/CMux_collaboration.png and /dev/null differ diff --git a/esp_modem/_images/DCE_DTE_collaboration.png b/esp_modem/_images/DCE_DTE_collaboration.png deleted file mode 100644 index ef3272a5e..000000000 Binary files a/esp_modem/_images/DCE_DTE_collaboration.png and /dev/null differ diff --git a/esp_modem/_sources/README.md.txt b/esp_modem/_sources/README.md.txt deleted file mode 100644 index 6e50d9bcd..000000000 --- a/esp_modem/_sources/README.md.txt +++ /dev/null @@ -1,92 +0,0 @@ -# ESP MODEM - -This component is used to communicate with modems in the command mode (using AT commands), as well as the data mode -(over PPPoS protocol). -The modem device is modeled with a DCE (Data Communication Equipment) object, which is composed of: -* DTE (Data Terminal Equipment), which abstracts the terminal (currently only UART implemented). -* PPP Netif representing a network interface communicating with the DTE using PPP protocol. -* Module abstracting the specific device model and its commands. - -``` - +-----+ - | DTE |--+ - +-----+ | +-------+ - +-->| DCE | - +-------+ | |o--- set_mode(command/data) - | Module|--->| | - +-------+ | |o--- send_commands - +->| | - +------+ | +-------+ - | PPP |--+ - | netif|------------------> network events - +------+ -``` - -## Modem components -### DCE - -This is the basic operational unit of the esp_modem component, abstracting a specific module in software, -which is basically configured by -* the I/O communication media (UART), defined by the DTE configuration -* the specific command library supported by the device model, defined with the module type -* network interface configuration (PPPoS config in lwip) - -After the object is created, the application interaction with the DCE is in -* issuing specific commands to the modem -* switching between data and command mode - -### DTE -Is an abstraction of the physical interface connected to the modem. Current implementation supports only UART - -### PPP netif - -Is used to attach the specific network interface to a network communication protocol used by the modem. Currently implementation supports only PPPoS protocol. - -### Module - -Abstraction of the specific modem device. Currently the component supports SIM800, BG96, SIM7600. - -## Use cases - -Users interact with the esp-modem using the DCE's interface, to basically -* Switch between command and data mode to connect to the internet via cellular network. -* Send various commands to the device (e.g. send SMS) - -The applications typically register handlers for network events to receive notification on the network availability and -IP address changes. - -Common use cases of the esp-modem are also listed as the examples: -* `examples/pppos_client` -- simple client which reads some module properties and switches to the data mode to connect to a public mqtt broker. -* `examples/modem_console` -- is an example to exercise all possible module commands in a console application. -* `examples/ap_to_pppos` -- this example focuses on the network connectivity of the esp-modem and provides a WiFi AP that forwards packets (and uses NAT) to and from the PPPoS connection. - -## Extensibility - -### CMUX - -Implementation of virtual terminals is an experimental feature, which allows users to also issue commands in the data mode, -after creating multiple virtual terminals, designating some of them solely to data mode, others solely to command mode. - -### DTE's - -Currently, we support only UART (and USB as a preview feature), but modern modules support other communication interfaces, such as USB, SPI. - -### Other devices - -Adding a new device is a must-have requirement for the esp-modem component. Different modules support different commands, -or some commands might have a different implementation. Adding a new device means to provide a new implementation -as a class derived from `GenericModule`, where we could add new commands or modify the existing ones. - -## Configuration - -Modem abstraction is configurable both compile-time and run-time. - -### Component Kconfig - -Compile-time configuration is provided using menuconfig. Please check the description for the CMUX mode configuration options. - -### Runtime configuration - -Is defined using standard configuration structures for `DTE` and `DCE` objects separately. Please find documentation of -* :cpp:class:`esp_modem_dte_config_t` -* :cpp:class:`esp_modem_dce_config_t` diff --git a/esp_modem/_sources/advanced_api.rst.txt b/esp_modem/_sources/advanced_api.rst.txt deleted file mode 100644 index a487398b3..000000000 --- a/esp_modem/_sources/advanced_api.rst.txt +++ /dev/null @@ -1,48 +0,0 @@ -Advanced esp-modem use cases -============================ - -This chapter outlines basic extensibility of the esp-modem component. - -.. _dce_factory: - -Custom instantiation with DCE factory --------------------------------------- - -It is possible to create a modem handle in many different ways: - -- Build a DCE on top a generic module, user defined module or build the module only (in case the application will only use AT command interface) -- Create the DCE as a shared, unique or a vanilla pointer -- Create a generic DCE or a templated DCE_T of a specific module (this could be one of the supported modules or a user defined module) - -All the functionality is provided by the DCE factory - -.. doxygengroup:: ESP_MODEM_DCE_FACTORY - :members: - -.. _create_custom_module: - -Create custom module --------------------- - -Creating a custom module is necessary if the application needs to use a specific device that is not supported -and their commands differ from any of the supported devices. In this case it is recommended to define a new class -representing this specific device and derive from the :cpp:class:`esp_modem::GenericModule`. In order to instantiate -the appropriate DCE of this module, application could use :ref:`the DCE factory`, and build the DCE with -the specific module, using :cpp:func:`esp_modem::dce_factory::Factory::build`. - -Please refer to the implementation of the existing modules. - -Please note that the ``modem_console`` example defines a trivial custom modem DCE which overrides one command, -for demonstration purposes only. - - -Create new communication interface ----------------------------------- - -In order to connect to a device using an unsupported interface (e.g. SPI or I2C), it is necessary to implement -a custom DTE object and supply it into :ref:`the DCE factory`. The DCE is typically created in two steps: - -- Define and create the corresponding terminal, which communicates on the custom interface. This terminal should support basic IO methods defined in :cpp:class:`esp_modem::Terminal` and derive from it. -- Create the DTE which uses the custom Terminal - -Please refer to the implementation of the existing UART DTE. diff --git a/esp_modem/_sources/api_docs.rst.txt b/esp_modem/_sources/api_docs.rst.txt deleted file mode 100644 index 4ace0e1ac..000000000 --- a/esp_modem/_sources/api_docs.rst.txt +++ /dev/null @@ -1,57 +0,0 @@ -.. _c_api: - -C API Documentation -=================== - - -The C API is very simple and consist of these two basic parts: - -- :ref:`lifecycle_api` -- :ref:`modem_commands` - -The Typical application workflow is to: - -- Create a DCE instance (using :cpp:func:`esp_modem_new`) -- Call specific functions to issue AT commands (:ref:`modem_commands`) -- Switch to the data mode (using :cpp:func:`esp_modem_set_mode`) -- Perform desired network operations (using standard networking API, unrelated to ESP-MODEM) -- Optionally switch back to command mode (again :cpp:func:`esp_modem_set_mode`) -- Destroy the DCE handle (sing :cpp:func:`esp_modem_destroy`) - -Note the configuration structures for DTE and DCE, needed for creating the DCE instance, is documented in :ref:`api_config` - -.. _lifecycle_api: - -Lifecycle API -------------- - -These functions are used to create, destroy and set modem working mode. - -- :cpp:func:`esp_modem_new` -- :cpp:func:`esp_modem_destroy` -- :cpp:func:`esp_modem_set_mode` - -.. doxygengroup:: ESP_MODEM_C_API - - -.. _modem_commands: - -Modem commands --------------- - -These functions are the actual commands to communicate with the modem using AT command interface. - -Note that the functions which implement AT commands returning textual values use plain ``char *`` -pointer as the return value. The API expects the output data to point to user allocated space of at least -``ESP_MODEM_C_API_STR_MAX`` (64 by default) bytes, it also truncates the output data to this size. - -.. doxygenfile:: esp_modem_api_commands.h - -.. _api_config: - -Configuration structures ------------------------- - - -.. doxygengroup:: ESP_MODEM_CONFIG - :members: diff --git a/esp_modem/_sources/cxx_api_docs.rst.txt b/esp_modem/_sources/cxx_api_docs.rst.txt deleted file mode 100644 index 94fdb94e1..000000000 --- a/esp_modem/_sources/cxx_api_docs.rst.txt +++ /dev/null @@ -1,44 +0,0 @@ -C++ API Documentation -===================== - -Similar to the :ref:`c_api`, the basic application workflow consist of - -.. toctree:: - -- :ref:`Construction of the DCE` -- :ref:`Switching modes` -- :ref:`Sending (AT) commands` -- :ref:`Destroying the DCE` - -.. _cpp_init: - -Create DTE and DCE ------------------- - -.. doxygengroup:: ESP_MODEM_INIT_DTE - -.. doxygengroup:: ESP_MODEM_INIT_DCE - - -.. _cpp_mode_switch: - -Mode switching commands ------------------------ - -.. doxygenclass:: esp_modem::DCE_T - :members: - -.. _cpp_modem_commands: - -Modem commands --------------- - -.. include:: cxx_api_links.rst - -.. _cpp_destroy: - -Destroy the DCE ---------------- - -The DCE object is created as ``std::unique_ptr`` by default and as such doesn't have to be explicitly destroyed. -It simply gets destroyed and cleaned-up automatically if the object goes out of the block scope. diff --git a/esp_modem/_sources/cxx_api_links.rst.txt b/esp_modem/_sources/cxx_api_links.rst.txt deleted file mode 100644 index ef5070b36..000000000 --- a/esp_modem/_sources/cxx_api_links.rst.txt +++ /dev/null @@ -1,37 +0,0 @@ - -- :cpp:func:`esp_modem::DCE::sync` -- :cpp:func:`esp_modem::DCE::get_operator_name` -- :cpp:func:`esp_modem::DCE::store_profile` -- :cpp:func:`esp_modem::DCE::set_pin` -- :cpp:func:`esp_modem::DCE::at` -- :cpp:func:`esp_modem::DCE::read_pin` -- :cpp:func:`esp_modem::DCE::set_echo` -- :cpp:func:`esp_modem::DCE::sms_txt_mode` -- :cpp:func:`esp_modem::DCE::sms_character_set` -- :cpp:func:`esp_modem::DCE::send_sms` -- :cpp:func:`esp_modem::DCE::resume_data_mode` -- :cpp:func:`esp_modem::DCE::set_pdp_context` -- :cpp:func:`esp_modem::DCE::set_command_mode` -- :cpp:func:`esp_modem::DCE::set_cmux` -- :cpp:func:`esp_modem::DCE::get_imsi` -- :cpp:func:`esp_modem::DCE::get_imei` -- :cpp:func:`esp_modem::DCE::get_module_name` -- :cpp:func:`esp_modem::DCE::set_data_mode` -- :cpp:func:`esp_modem::DCE::get_signal_quality` -- :cpp:func:`esp_modem::DCE::set_flow_control` -- :cpp:func:`esp_modem::DCE::hang_up` -- :cpp:func:`esp_modem::DCE::get_battery_status` -- :cpp:func:`esp_modem::DCE::power_down` -- :cpp:func:`esp_modem::DCE::reset` -- :cpp:func:`esp_modem::DCE::set_baud` -- :cpp:func:`esp_modem::DCE::set_operator` -- :cpp:func:`esp_modem::DCE::set_network_attachment_state` -- :cpp:func:`esp_modem::DCE::get_network_attachment_state` -- :cpp:func:`esp_modem::DCE::set_radio_state` -- :cpp:func:`esp_modem::DCE::get_radio_state` -- :cpp:func:`esp_modem::DCE::set_network_mode` -- :cpp:func:`esp_modem::DCE::set_preferred_mode` -- :cpp:func:`esp_modem::DCE::set_network_bands` -- :cpp:func:`esp_modem::DCE::get_network_system_mode` -- :cpp:func:`esp_modem::DCE::set_gnss_power_mode` -- :cpp:func:`esp_modem::DCE::get_gnss_power_mode` diff --git a/esp_modem/_sources/index.rst.txt b/esp_modem/_sources/index.rst.txt deleted file mode 100644 index 9a87192f6..000000000 --- a/esp_modem/_sources/index.rst.txt +++ /dev/null @@ -1,11 +0,0 @@ -ESP-MODEM Programmers manual -============================ - -.. toctree:: - - Brief intro - C interface - C++ interface - Advanced use cases - Internal design - Internal implementation diff --git a/esp_modem/_sources/internal_design.md.txt b/esp_modem/_sources/internal_design.md.txt deleted file mode 100644 index c132bede0..000000000 --- a/esp_modem/_sources/internal_design.md.txt +++ /dev/null @@ -1,36 +0,0 @@ -# Internal design - -## Design decisions - -* Use C++ with additional C API - -* Use exceptions - - Use macro wrapper over `try-catch` blocks when exceptions off (use `abort()` if `THROW()`) - -* Initializes and allocates in the constructor (might throw) - - easier code with exceptions ON, with exceptions OFF alloc/init failures are not treated as runtime error (program aborts) - - break down long initialization in constructor into more private methods - -* Implements different devices using inheritance from `GenericModule`, which is the most general implementation of a common modem - - Internally uses templates with device specialization (modeled as `DCE`) which could be used as well for some special cases, - such as implantation of a minimal device (ModuleIf), add new AT commands (oOnly in compile time), or using the Module with DTE only (no DCE, no Netif) for sending AT commands without network - -## DCE collaboration model - -The diagram describes how the DCE class collaborates with DTE, PPP and the device abstraction - -![DCE_architecture](DCE_DTE_collaboration.png) - -## Terminal inheritance - -Terminal is a class which can read or write data, and can handle callbacks when data are available. UART specialization -is provided implementing these method using the uart driver. - -## CMUX terminal - -The below diagram depicts the idea of using CMUX terminal mode using the CMuxInstance class which is a terminal -(it implements the basic read/write methods) interfacing arbitrary number of virtual terminals, -but at the same time it is also composed of CMux class, which consumes the original terminal and uses its read/write methods -to multiplex the terminal. - -![CMUX Terminal](CMux_collaboration.png) diff --git a/esp_modem/_sources/internal_docs.rst.txt b/esp_modem/_sources/internal_docs.rst.txt deleted file mode 100644 index bd2d269de..000000000 --- a/esp_modem/_sources/internal_docs.rst.txt +++ /dev/null @@ -1,117 +0,0 @@ -DCE Internal implementation -=========================== - -This chapter provides a detailed description of the classes and building blocks of the esp-modem component and their responsibilities. - -The esp-modem actually implements the DCE class, which in turn aggregates these thee units: - -- :ref:`DTE` to communicate with the device on a specific Terminal interface such as UART. -- :ref:`Netif` to provide the network connectivity -- :ref:`Module` to define the specific command library - -Developers would typically have to - -* Add support for a new module -* Implement a generic (common for all modules) AT command - -This is explained in the :ref:`Module` section, as :ref:`Adding new module or command` - ------------- - -.. doxygengroup:: ESP_MODEM_DCE - :members: - -.. _dte_impl: - -DTE abstraction ---------------- - -DTE is a basic unit to talk to the module using a Terminal interface. It also implements and uses the CMUX to multiplex -terminals. Besides the DTE documentation, this section also refers to the - -- :ref:`Terminal interface` -- :ref:`CMUX implementation` - - ------------- - -.. doxygengroup:: ESP_MODEM_DTE - :members: - -.. _term_impl: - -Terminal interface -^^^^^^^^^^^^^^^^^^ - -.. doxygengroup:: ESP_MODEM_TERMINAL - :members: - -.. _cmux_impl: - -CMUX implementation -^^^^^^^^^^^^^^^^^^^ - -.. doxygengroup:: ESP_MODEM_CMUX - :members: - -.. _netif_impl: - -Netif ------ - -.. doxygengroup:: ESP_MODEM_NETIF - :members: - -.. _module_impl: - -Module abstraction ------------------- - -.. doxygengroup:: ESP_MODEM_MODULE - :members: - -.. _module_addition: - -Adding new devices -^^^^^^^^^^^^^^^^^^ - -To support a new module, developers would have to implement a new class derived from :cpp:class:`esp_modem::GenericModule` the same way -as it is described in the :ref:`Advanced user manual`. The only difference is that the new class (and factory extension) -would be available in the esp_modem code base. - -Implement a new generic command -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Adding a generic command, i.e. the command that is shared for all modules and is included in the :cpp:class:`esp_modem::GenericModule`, -has to be declared first in the ``include/generate/esp_modem_command_declare.inc`` file, which is the single source -of supported command definitions, that is used in: - -* public C API -* public CPP API -* generated documentation -* implementation of the command - -Therefore, a care must be taken, to correctly specify all parameters and types, especially: - -* Keep number of parameters low (<= 6, used in preprocessor's forwarding to the command library) -* Use macros to specify parameter types (as they are used both from C and C++ with different underlying types) -* Parameter names are used only for clarity and documentation, they get expanded to numbered arguments. - -Please use the following pattern: ``INT_IN(p1, baud)``, meaning that the parameter is an input integer, -human readable argument name is ``baud``, it's the first argument, so expands to ``p1`` (second argument would be ``p2``, etc) - -Command library -^^^^^^^^^^^^^^^ - -This is a namespace holding a library of typical AT commands used by supported devices. -Please refer to the :ref:`c_api` for the list of supported commands. - -.. doxygengroup:: ESP_MODEM_DCE_COMMAND - :members: - - -Modem types ------------ - -.. doxygengroup:: ESP_MODEM_TYPES - :members: diff --git a/esp_modem/_static/alabaster.css b/esp_modem/_static/alabaster.css deleted file mode 100644 index 517d0b29c..000000000 --- a/esp_modem/_static/alabaster.css +++ /dev/null @@ -1,703 +0,0 @@ -@import url("basic.css"); - -/* -- page layout ----------------------------------------------------------- */ - -body { - font-family: Georgia, serif; - font-size: 17px; - background-color: #fff; - color: #000; - margin: 0; - padding: 0; -} - - -div.document { - width: 940px; - margin: 30px auto 0 auto; -} - -div.documentwrapper { - float: left; - width: 100%; -} - -div.bodywrapper { - margin: 0 0 0 220px; -} - -div.sphinxsidebar { - width: 220px; - font-size: 14px; - line-height: 1.5; -} - -hr { - border: 1px solid #B1B4B6; -} - -div.body { - background-color: #fff; - color: #3E4349; - padding: 0 30px 0 30px; -} - -div.body > .section { - text-align: left; -} - -div.footer { - width: 940px; - margin: 20px auto 30px auto; - font-size: 14px; - color: #888; - text-align: right; -} - -div.footer a { - color: #888; -} - -p.caption { - font-family: inherit; - font-size: inherit; -} - - -div.relations { - display: none; -} - - -div.sphinxsidebar a { - color: #444; - text-decoration: none; - border-bottom: 1px dotted #999; -} - -div.sphinxsidebar a:hover { - border-bottom: 1px solid #999; -} - -div.sphinxsidebarwrapper { - padding: 18px 10px; -} - -div.sphinxsidebarwrapper p.logo { - padding: 0; - margin: -10px 0 0 0px; - text-align: center; -} - -div.sphinxsidebarwrapper h1.logo { - margin-top: -10px; - text-align: center; - margin-bottom: 5px; - text-align: left; -} - -div.sphinxsidebarwrapper h1.logo-name { - margin-top: 0px; -} - -div.sphinxsidebarwrapper p.blurb { - margin-top: 0; - font-style: normal; -} - -div.sphinxsidebar h3, -div.sphinxsidebar h4 { - font-family: Georgia, serif; - color: #444; - font-size: 24px; - font-weight: normal; - margin: 0 0 5px 0; - padding: 0; -} - -div.sphinxsidebar h4 { - font-size: 20px; -} - -div.sphinxsidebar h3 a { - color: #444; -} - -div.sphinxsidebar p.logo a, -div.sphinxsidebar h3 a, -div.sphinxsidebar p.logo a:hover, -div.sphinxsidebar h3 a:hover { - border: none; -} - -div.sphinxsidebar p { - color: #555; - margin: 10px 0; -} - -div.sphinxsidebar ul { - margin: 10px 0; - padding: 0; - color: #000; -} - -div.sphinxsidebar ul li.toctree-l1 > a { - font-size: 120%; -} - -div.sphinxsidebar ul li.toctree-l2 > a { - font-size: 110%; -} - -div.sphinxsidebar input { - border: 1px solid #CCC; - font-family: Georgia, serif; - font-size: 1em; -} - -div.sphinxsidebar hr { - border: none; - height: 1px; - color: #AAA; - background: #AAA; - - text-align: left; - margin-left: 0; - width: 50%; -} - -div.sphinxsidebar .badge { - border-bottom: none; -} - -div.sphinxsidebar .badge:hover { - border-bottom: none; -} - -/* To address an issue with donation coming after search */ -div.sphinxsidebar h3.donation { - margin-top: 10px; -} - -/* -- body styles ----------------------------------------------------------- */ - -a { - color: #004B6B; - text-decoration: underline; -} - -a:hover { - color: #6D4100; - text-decoration: underline; -} - -div.body h1, -div.body h2, -div.body h3, -div.body h4, -div.body h5, -div.body h6 { - font-family: Georgia, serif; - font-weight: normal; - margin: 30px 0px 10px 0px; - padding: 0; -} - -div.body h1 { margin-top: 0; padding-top: 0; font-size: 240%; } -div.body h2 { font-size: 180%; } -div.body h3 { font-size: 150%; } -div.body h4 { font-size: 130%; } -div.body h5 { font-size: 100%; } -div.body h6 { font-size: 100%; } - -a.headerlink { - color: #DDD; - padding: 0 4px; - text-decoration: none; -} - -a.headerlink:hover { - color: #444; - background: #EAEAEA; -} - -div.body p, div.body dd, div.body li { - line-height: 1.4em; -} - -div.admonition { - margin: 20px 0px; - padding: 10px 30px; - background-color: #EEE; - border: 1px solid #CCC; -} - -div.admonition tt.xref, div.admonition code.xref, div.admonition a tt { - background-color: #FBFBFB; - border-bottom: 1px solid #fafafa; -} - -div.admonition p.admonition-title { - font-family: Georgia, serif; - font-weight: normal; - font-size: 24px; - margin: 0 0 10px 0; - padding: 0; - line-height: 1; -} - -div.admonition p.last { - margin-bottom: 0; -} - -div.highlight { - background-color: #fff; -} - -dt:target, .highlight { - background: #FAF3E8; -} - -div.warning { - background-color: #FCC; - border: 1px solid #FAA; -} - -div.danger { - background-color: #FCC; - border: 1px solid #FAA; - -moz-box-shadow: 2px 2px 4px #D52C2C; - -webkit-box-shadow: 2px 2px 4px #D52C2C; - box-shadow: 2px 2px 4px #D52C2C; -} - -div.error { - background-color: #FCC; - border: 1px solid #FAA; - -moz-box-shadow: 2px 2px 4px #D52C2C; - -webkit-box-shadow: 2px 2px 4px #D52C2C; - box-shadow: 2px 2px 4px #D52C2C; -} - -div.caution { - background-color: #FCC; - border: 1px solid #FAA; -} - -div.attention { - background-color: #FCC; - border: 1px solid #FAA; -} - -div.important { - background-color: #EEE; - border: 1px solid #CCC; -} - -div.note { - background-color: #EEE; - border: 1px solid #CCC; -} - -div.tip { - background-color: #EEE; - border: 1px solid #CCC; -} - -div.hint { - background-color: #EEE; - border: 1px solid #CCC; -} - -div.seealso { - background-color: #EEE; - border: 1px solid #CCC; -} - -div.topic { - background-color: #EEE; -} - -p.admonition-title { - display: inline; -} - -p.admonition-title:after { - content: ":"; -} - -pre, tt, code { - font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; - font-size: 0.9em; -} - -.hll { - background-color: #FFC; - margin: 0 -12px; - padding: 0 12px; - display: block; -} - -img.screenshot { -} - -tt.descname, tt.descclassname, code.descname, code.descclassname { - font-size: 0.95em; -} - -tt.descname, code.descname { - padding-right: 0.08em; -} - -img.screenshot { - -moz-box-shadow: 2px 2px 4px #EEE; - -webkit-box-shadow: 2px 2px 4px #EEE; - box-shadow: 2px 2px 4px #EEE; -} - -table.docutils { - border: 1px solid #888; - -moz-box-shadow: 2px 2px 4px #EEE; - -webkit-box-shadow: 2px 2px 4px #EEE; - box-shadow: 2px 2px 4px #EEE; -} - -table.docutils td, table.docutils th { - border: 1px solid #888; - padding: 0.25em 0.7em; -} - -table.field-list, table.footnote { - border: none; - -moz-box-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} - -table.footnote { - margin: 15px 0; - width: 100%; - border: 1px solid #EEE; - background: #FDFDFD; - font-size: 0.9em; -} - -table.footnote + table.footnote { - margin-top: -15px; - border-top: none; -} - -table.field-list th { - padding: 0 0.8em 0 0; -} - -table.field-list td { - padding: 0; -} - -table.field-list p { - margin-bottom: 0.8em; -} - -/* Cloned from - * https://github.com/sphinx-doc/sphinx/commit/ef60dbfce09286b20b7385333d63a60321784e68 - */ -.field-name { - -moz-hyphens: manual; - -ms-hyphens: manual; - -webkit-hyphens: manual; - hyphens: manual; -} - -table.footnote td.label { - width: .1px; - padding: 0.3em 0 0.3em 0.5em; -} - -table.footnote td { - padding: 0.3em 0.5em; -} - -dl { - margin-left: 0; - margin-right: 0; - margin-top: 0; - padding: 0; -} - -dl dd { - margin-left: 30px; -} - -blockquote { - margin: 0 0 0 30px; - padding: 0; -} - -ul, ol { - /* Matches the 30px from the narrow-screen "li > ul" selector below */ - margin: 10px 0 10px 30px; - padding: 0; -} - -pre { - background: #EEE; - padding: 7px 30px; - margin: 15px 0px; - line-height: 1.3em; -} - -div.viewcode-block:target { - background: #ffd; -} - -dl pre, blockquote pre, li pre { - margin-left: 0; - padding-left: 30px; -} - -tt, code { - background-color: #ecf0f3; - color: #222; - /* padding: 1px 2px; */ -} - -tt.xref, code.xref, a tt { - background-color: #FBFBFB; - border-bottom: 1px solid #fff; -} - -a.reference { - text-decoration: none; - border-bottom: 1px dotted #004B6B; -} - -/* Don't put an underline on images */ -a.image-reference, a.image-reference:hover { - border-bottom: none; -} - -a.reference:hover { - border-bottom: 1px solid #6D4100; -} - -a.footnote-reference { - text-decoration: none; - font-size: 0.7em; - vertical-align: top; - border-bottom: 1px dotted #004B6B; -} - -a.footnote-reference:hover { - border-bottom: 1px solid #6D4100; -} - -a:hover tt, a:hover code { - background: #EEE; -} - - -@media screen and (max-width: 870px) { - - div.sphinxsidebar { - display: none; - } - - div.document { - width: 100%; - - } - - div.documentwrapper { - margin-left: 0; - margin-top: 0; - margin-right: 0; - margin-bottom: 0; - } - - div.bodywrapper { - margin-top: 0; - margin-right: 0; - margin-bottom: 0; - margin-left: 0; - } - - ul { - margin-left: 0; - } - - li > ul { - /* Matches the 30px from the "ul, ol" selector above */ - margin-left: 30px; - } - - .document { - width: auto; - } - - .footer { - width: auto; - } - - .bodywrapper { - margin: 0; - } - - .footer { - width: auto; - } - - .github { - display: none; - } - - - -} - - - -@media screen and (max-width: 875px) { - - body { - margin: 0; - padding: 20px 30px; - } - - div.documentwrapper { - float: none; - background: #fff; - } - - div.sphinxsidebar { - display: block; - float: none; - width: 102.5%; - margin: 50px -30px -20px -30px; - padding: 10px 20px; - background: #333; - color: #FFF; - } - - div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p, - div.sphinxsidebar h3 a { - color: #fff; - } - - div.sphinxsidebar a { - color: #AAA; - } - - div.sphinxsidebar p.logo { - display: none; - } - - div.document { - width: 100%; - margin: 0; - } - - div.footer { - display: none; - } - - div.bodywrapper { - margin: 0; - } - - div.body { - min-height: 0; - padding: 0; - } - - .rtd_doc_footer { - display: none; - } - - .document { - width: auto; - } - - .footer { - width: auto; - } - - .footer { - width: auto; - } - - .github { - display: none; - } -} - - -/* misc. */ - -.revsys-inline { - display: none!important; -} - -/* Make nested-list/multi-paragraph items look better in Releases changelog - * pages. Without this, docutils' magical list fuckery causes inconsistent - * formatting between different release sub-lists. - */ -div#changelog > div.section > ul > li > p:only-child { - margin-bottom: 0; -} - -/* Hide fugly table cell borders in ..bibliography:: directive output */ -table.docutils.citation, table.docutils.citation td, table.docutils.citation th { - border: none; - /* Below needed in some edge cases; if not applied, bottom shadows appear */ - -moz-box-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} - - -/* relbar */ - -.related { - line-height: 30px; - width: 100%; - font-size: 0.9rem; -} - -.related.top { - border-bottom: 1px solid #EEE; - margin-bottom: 20px; -} - -.related.bottom { - border-top: 1px solid #EEE; -} - -.related ul { - padding: 0; - margin: 0; - list-style: none; -} - -.related li { - display: inline; -} - -nav#rellinks { - float: right; -} - -nav#rellinks li+li:before { - content: "|"; -} - -nav#breadcrumbs li+li:before { - content: "\00BB"; -} - -/* Hide certain items when printing */ -@media print { - div.related { - display: none; - } -} \ No newline at end of file diff --git a/esp_modem/_static/basic.css b/esp_modem/_static/basic.css deleted file mode 100644 index bf18350b6..000000000 --- a/esp_modem/_static/basic.css +++ /dev/null @@ -1,906 +0,0 @@ -/* - * basic.css - * ~~~~~~~~~ - * - * Sphinx stylesheet -- basic theme. - * - * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -/* -- main layout ----------------------------------------------------------- */ - -div.clearer { - clear: both; -} - -div.section::after { - display: block; - content: ''; - clear: left; -} - -/* -- relbar ---------------------------------------------------------------- */ - -div.related { - width: 100%; - font-size: 90%; -} - -div.related h3 { - display: none; -} - -div.related ul { - margin: 0; - padding: 0 0 0 10px; - list-style: none; -} - -div.related li { - display: inline; -} - -div.related li.right { - float: right; - margin-right: 5px; -} - -/* -- sidebar --------------------------------------------------------------- */ - -div.sphinxsidebarwrapper { - padding: 10px 5px 0 10px; -} - -div.sphinxsidebar { - float: left; - width: 230px; - margin-left: -100%; - font-size: 90%; - word-wrap: break-word; - overflow-wrap : break-word; -} - -div.sphinxsidebar ul { - list-style: none; -} - -div.sphinxsidebar ul ul, -div.sphinxsidebar ul.want-points { - margin-left: 20px; - list-style: square; -} - -div.sphinxsidebar ul ul { - margin-top: 0; - margin-bottom: 0; -} - -div.sphinxsidebar form { - margin-top: 10px; -} - -div.sphinxsidebar input { - border: 1px solid #98dbcc; - font-family: sans-serif; - font-size: 1em; -} - -div.sphinxsidebar #searchbox form.search { - overflow: hidden; -} - -div.sphinxsidebar #searchbox input[type="text"] { - float: left; - width: 80%; - padding: 0.25em; - box-sizing: border-box; -} - -div.sphinxsidebar #searchbox input[type="submit"] { - float: left; - width: 20%; - border-left: none; - padding: 0.25em; - box-sizing: border-box; -} - - -img { - border: 0; - max-width: 100%; -} - -/* -- search page ----------------------------------------------------------- */ - -ul.search { - margin: 10px 0 0 20px; - padding: 0; -} - -ul.search li { - padding: 5px 0 5px 20px; - background-image: url(file.png); - background-repeat: no-repeat; - background-position: 0 7px; -} - -ul.search li a { - font-weight: bold; -} - -ul.search li p.context { - color: #888; - margin: 2px 0 0 30px; - text-align: left; -} - -ul.keywordmatches li.goodmatch a { - font-weight: bold; -} - -/* -- index page ------------------------------------------------------------ */ - -table.contentstable { - width: 90%; - margin-left: auto; - margin-right: auto; -} - -table.contentstable p.biglink { - line-height: 150%; -} - -a.biglink { - font-size: 1.3em; -} - -span.linkdescr { - font-style: italic; - padding-top: 5px; - font-size: 90%; -} - -/* -- general index --------------------------------------------------------- */ - -table.indextable { - width: 100%; -} - -table.indextable td { - text-align: left; - vertical-align: top; -} - -table.indextable ul { - margin-top: 0; - margin-bottom: 0; - list-style-type: none; -} - -table.indextable > tbody > tr > td > ul { - padding-left: 0em; -} - -table.indextable tr.pcap { - height: 10px; -} - -table.indextable tr.cap { - margin-top: 10px; - background-color: #f2f2f2; -} - -img.toggler { - margin-right: 3px; - margin-top: 3px; - cursor: pointer; -} - -div.modindex-jumpbox { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - margin: 1em 0 1em 0; - padding: 0.4em; -} - -div.genindex-jumpbox { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - margin: 1em 0 1em 0; - padding: 0.4em; -} - -/* -- domain module index --------------------------------------------------- */ - -table.modindextable td { - padding: 2px; - border-collapse: collapse; -} - -/* -- general body styles --------------------------------------------------- */ - -div.body { - min-width: 450px; - max-width: 800px; -} - -div.body p, div.body dd, div.body li, div.body blockquote { - -moz-hyphens: auto; - -ms-hyphens: auto; - -webkit-hyphens: auto; - hyphens: auto; -} - -a.headerlink { - visibility: hidden; -} - -a.brackets:before, -span.brackets > a:before{ - content: "["; -} - -a.brackets:after, -span.brackets > a:after { - content: "]"; -} - -h1:hover > a.headerlink, -h2:hover > a.headerlink, -h3:hover > a.headerlink, -h4:hover > a.headerlink, -h5:hover > a.headerlink, -h6:hover > a.headerlink, -dt:hover > a.headerlink, -caption:hover > a.headerlink, -p.caption:hover > a.headerlink, -div.code-block-caption:hover > a.headerlink { - visibility: visible; -} - -div.body p.caption { - text-align: inherit; -} - -div.body td { - text-align: left; -} - -.first { - margin-top: 0 !important; -} - -p.rubric { - margin-top: 30px; - font-weight: bold; -} - -img.align-left, figure.align-left, .figure.align-left, object.align-left { - clear: left; - float: left; - margin-right: 1em; -} - -img.align-right, figure.align-right, .figure.align-right, object.align-right { - clear: right; - float: right; - margin-left: 1em; -} - -img.align-center, figure.align-center, .figure.align-center, object.align-center { - display: block; - margin-left: auto; - margin-right: auto; -} - -img.align-default, figure.align-default, .figure.align-default { - display: block; - margin-left: auto; - margin-right: auto; -} - -.align-left { - text-align: left; -} - -.align-center { - text-align: center; -} - -.align-default { - text-align: center; -} - -.align-right { - text-align: right; -} - -/* -- sidebars -------------------------------------------------------------- */ - -div.sidebar, -aside.sidebar { - margin: 0 0 0.5em 1em; - border: 1px solid #ddb; - padding: 7px; - background-color: #ffe; - width: 40%; - float: right; - clear: right; - overflow-x: auto; -} - -p.sidebar-title { - font-weight: bold; -} - -div.admonition, div.topic, blockquote { - clear: left; -} - -/* -- topics ---------------------------------------------------------------- */ - -div.topic { - border: 1px solid #ccc; - padding: 7px; - margin: 10px 0 10px 0; -} - -p.topic-title { - font-size: 1.1em; - font-weight: bold; - margin-top: 10px; -} - -/* -- admonitions ----------------------------------------------------------- */ - -div.admonition { - margin-top: 10px; - margin-bottom: 10px; - padding: 7px; -} - -div.admonition dt { - font-weight: bold; -} - -p.admonition-title { - margin: 0px 10px 5px 0px; - font-weight: bold; -} - -div.body p.centered { - text-align: center; - margin-top: 25px; -} - -/* -- content of sidebars/topics/admonitions -------------------------------- */ - -div.sidebar > :last-child, -aside.sidebar > :last-child, -div.topic > :last-child, -div.admonition > :last-child { - margin-bottom: 0; -} - -div.sidebar::after, -aside.sidebar::after, -div.topic::after, -div.admonition::after, -blockquote::after { - display: block; - content: ''; - clear: both; -} - -/* -- tables ---------------------------------------------------------------- */ - -table.docutils { - margin-top: 10px; - margin-bottom: 10px; - border: 0; - border-collapse: collapse; -} - -table.align-center { - margin-left: auto; - margin-right: auto; -} - -table.align-default { - margin-left: auto; - margin-right: auto; -} - -table caption span.caption-number { - font-style: italic; -} - -table caption span.caption-text { -} - -table.docutils td, table.docutils th { - padding: 1px 8px 1px 5px; - border-top: 0; - border-left: 0; - border-right: 0; - border-bottom: 1px solid #aaa; -} - -table.footnote td, table.footnote th { - border: 0 !important; -} - -th { - text-align: left; - padding-right: 5px; -} - -table.citation { - border-left: solid 1px gray; - margin-left: 1px; -} - -table.citation td { - border-bottom: none; -} - -th > :first-child, -td > :first-child { - margin-top: 0px; -} - -th > :last-child, -td > :last-child { - margin-bottom: 0px; -} - -/* -- figures --------------------------------------------------------------- */ - -div.figure, figure { - margin: 0.5em; - padding: 0.5em; -} - -div.figure p.caption, figcaption { - padding: 0.3em; -} - -div.figure p.caption span.caption-number, -figcaption span.caption-number { - font-style: italic; -} - -div.figure p.caption span.caption-text, -figcaption span.caption-text { -} - -/* -- field list styles ----------------------------------------------------- */ - -table.field-list td, table.field-list th { - border: 0 !important; -} - -.field-list ul { - margin: 0; - padding-left: 1em; -} - -.field-list p { - margin: 0; -} - -.field-name { - -moz-hyphens: manual; - -ms-hyphens: manual; - -webkit-hyphens: manual; - hyphens: manual; -} - -/* -- hlist styles ---------------------------------------------------------- */ - -table.hlist { - margin: 1em 0; -} - -table.hlist td { - vertical-align: top; -} - -/* -- object description styles --------------------------------------------- */ - -.sig { - font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; -} - -.sig-name, code.descname { - background-color: transparent; - font-weight: bold; -} - -.sig-name { - font-size: 1.1em; -} - -code.descname { - font-size: 1.2em; -} - -.sig-prename, code.descclassname { - background-color: transparent; -} - -.optional { - font-size: 1.3em; -} - -.sig-paren { - font-size: larger; -} - -.sig-param.n { - font-style: italic; -} - -/* C++ specific styling */ - -.sig-inline.c-texpr, -.sig-inline.cpp-texpr { - font-family: unset; -} - -.sig.c .k, .sig.c .kt, -.sig.cpp .k, .sig.cpp .kt { - color: #0033B3; -} - -.sig.c .m, -.sig.cpp .m { - color: #1750EB; -} - -.sig.c .s, .sig.c .sc, -.sig.cpp .s, .sig.cpp .sc { - color: #067D17; -} - - -/* -- other body styles ----------------------------------------------------- */ - -ol.arabic { - list-style: decimal; -} - -ol.loweralpha { - list-style: lower-alpha; -} - -ol.upperalpha { - list-style: upper-alpha; -} - -ol.lowerroman { - list-style: lower-roman; -} - -ol.upperroman { - list-style: upper-roman; -} - -:not(li) > ol > li:first-child > :first-child, -:not(li) > ul > li:first-child > :first-child { - margin-top: 0px; -} - -:not(li) > ol > li:last-child > :last-child, -:not(li) > ul > li:last-child > :last-child { - margin-bottom: 0px; -} - -ol.simple ol p, -ol.simple ul p, -ul.simple ol p, -ul.simple ul p { - margin-top: 0; -} - -ol.simple > li:not(:first-child) > p, -ul.simple > li:not(:first-child) > p { - margin-top: 0; -} - -ol.simple p, -ul.simple p { - margin-bottom: 0; -} - -dl.footnote > dt, -dl.citation > dt { - float: left; - margin-right: 0.5em; -} - -dl.footnote > dd, -dl.citation > dd { - margin-bottom: 0em; -} - -dl.footnote > dd:after, -dl.citation > dd:after { - content: ""; - clear: both; -} - -dl.field-list { - display: grid; - grid-template-columns: fit-content(30%) auto; -} - -dl.field-list > dt { - font-weight: bold; - word-break: break-word; - padding-left: 0.5em; - padding-right: 5px; -} - -dl.field-list > dt:after { - content: ":"; -} - -dl.field-list > dd { - padding-left: 0.5em; - margin-top: 0em; - margin-left: 0em; - margin-bottom: 0em; -} - -dl { - margin-bottom: 15px; -} - -dd > :first-child { - margin-top: 0px; -} - -dd ul, dd table { - margin-bottom: 10px; -} - -dd { - margin-top: 3px; - margin-bottom: 10px; - margin-left: 30px; -} - -dl > dd:last-child, -dl > dd:last-child > :last-child { - margin-bottom: 0; -} - -dt:target, span.highlighted { - background-color: #fbe54e; -} - -rect.highlighted { - fill: #fbe54e; -} - -dl.glossary dt { - font-weight: bold; - font-size: 1.1em; -} - -.versionmodified { - font-style: italic; -} - -.system-message { - background-color: #fda; - padding: 5px; - border: 3px solid red; -} - -.footnote:target { - background-color: #ffa; -} - -.line-block { - display: block; - margin-top: 1em; - margin-bottom: 1em; -} - -.line-block .line-block { - margin-top: 0; - margin-bottom: 0; - margin-left: 1.5em; -} - -.guilabel, .menuselection { - font-family: sans-serif; -} - -.accelerator { - text-decoration: underline; -} - -.classifier { - font-style: oblique; -} - -.classifier:before { - font-style: normal; - margin: 0 0.5em; - content: ":"; - display: inline-block; -} - -abbr, acronym { - border-bottom: dotted 1px; - cursor: help; -} - -/* -- code displays --------------------------------------------------------- */ - -pre { - overflow: auto; - overflow-y: hidden; /* fixes display issues on Chrome browsers */ -} - -pre, div[class*="highlight-"] { - clear: both; -} - -span.pre { - -moz-hyphens: none; - -ms-hyphens: none; - -webkit-hyphens: none; - hyphens: none; - white-space: nowrap; -} - -div[class*="highlight-"] { - margin: 1em 0; -} - -td.linenos pre { - border: 0; - background-color: transparent; - color: #aaa; -} - -table.highlighttable { - display: block; -} - -table.highlighttable tbody { - display: block; -} - -table.highlighttable tr { - display: flex; -} - -table.highlighttable td { - margin: 0; - padding: 0; -} - -table.highlighttable td.linenos { - padding-right: 0.5em; -} - -table.highlighttable td.code { - flex: 1; - overflow: hidden; -} - -.highlight .hll { - display: block; -} - -div.highlight pre, -table.highlighttable pre { - margin: 0; -} - -div.code-block-caption + div { - margin-top: 0; -} - -div.code-block-caption { - margin-top: 1em; - padding: 2px 5px; - font-size: small; -} - -div.code-block-caption code { - background-color: transparent; -} - -table.highlighttable td.linenos, -span.linenos, -div.highlight span.gp { /* gp: Generic.Prompt */ - user-select: none; - -webkit-user-select: text; /* Safari fallback only */ - -webkit-user-select: none; /* Chrome/Safari */ - -moz-user-select: none; /* Firefox */ - -ms-user-select: none; /* IE10+ */ -} - -div.code-block-caption span.caption-number { - padding: 0.1em 0.3em; - font-style: italic; -} - -div.code-block-caption span.caption-text { -} - -div.literal-block-wrapper { - margin: 1em 0; -} - -code.xref, a code { - background-color: transparent; - font-weight: bold; -} - -h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { - background-color: transparent; -} - -.viewcode-link { - float: right; -} - -.viewcode-back { - float: right; - font-family: sans-serif; -} - -div.viewcode-block:target { - margin: -1px -10px; - padding: 0 10px; -} - -/* -- math display ---------------------------------------------------------- */ - -img.math { - vertical-align: middle; -} - -div.body div.math p { - text-align: center; -} - -span.eqno { - float: right; -} - -span.eqno a.headerlink { - position: absolute; - z-index: 1; -} - -div.math:hover a.headerlink { - visibility: visible; -} - -/* -- printout stylesheet --------------------------------------------------- */ - -@media print { - div.document, - div.documentwrapper, - div.bodywrapper { - margin: 0 !important; - width: 100%; - } - - div.sphinxsidebar, - div.related, - div.footer, - #top-link { - display: none; - } -} \ No newline at end of file diff --git a/esp_modem/_static/custom.css b/esp_modem/_static/custom.css deleted file mode 100644 index 2a924f1d6..000000000 --- a/esp_modem/_static/custom.css +++ /dev/null @@ -1 +0,0 @@ -/* This file intentionally left blank. */ diff --git a/esp_modem/_static/doctools.js b/esp_modem/_static/doctools.js deleted file mode 100644 index e1bfd708b..000000000 --- a/esp_modem/_static/doctools.js +++ /dev/null @@ -1,358 +0,0 @@ -/* - * doctools.js - * ~~~~~~~~~~~ - * - * Sphinx JavaScript utilities for all documentation. - * - * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -/** - * select a different prefix for underscore - */ -$u = _.noConflict(); - -/** - * make the code below compatible with browsers without - * an installed firebug like debugger -if (!window.console || !console.firebug) { - var names = ["log", "debug", "info", "warn", "error", "assert", "dir", - "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", - "profile", "profileEnd"]; - window.console = {}; - for (var i = 0; i < names.length; ++i) - window.console[names[i]] = function() {}; -} - */ - -/** - * small helper function to urldecode strings - * - * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL - */ -jQuery.urldecode = function(x) { - if (!x) { - return x - } - return decodeURIComponent(x.replace(/\+/g, ' ')); -}; - -/** - * small helper function to urlencode strings - */ -jQuery.urlencode = encodeURIComponent; - -/** - * This function returns the parsed url parameters of the - * current request. Multiple values per key are supported, - * it will always return arrays of strings for the value parts. - */ -jQuery.getQueryParameters = function(s) { - if (typeof s === 'undefined') - s = document.location.search; - var parts = s.substr(s.indexOf('?') + 1).split('&'); - var result = {}; - for (var i = 0; i < parts.length; i++) { - var tmp = parts[i].split('=', 2); - var key = jQuery.urldecode(tmp[0]); - var value = jQuery.urldecode(tmp[1]); - if (key in result) - result[key].push(value); - else - result[key] = [value]; - } - return result; -}; - -/** - * highlight a given string on a jquery object by wrapping it in - * span elements with the given class name. - */ -jQuery.fn.highlightText = function(text, className) { - function highlight(node, addItems) { - if (node.nodeType === 3) { - var val = node.nodeValue; - var pos = val.toLowerCase().indexOf(text); - if (pos >= 0 && - !jQuery(node.parentNode).hasClass(className) && - !jQuery(node.parentNode).hasClass("nohighlight")) { - var span; - var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); - if (isInSVG) { - span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); - } else { - span = document.createElement("span"); - span.className = className; - } - span.appendChild(document.createTextNode(val.substr(pos, text.length))); - node.parentNode.insertBefore(span, node.parentNode.insertBefore( - document.createTextNode(val.substr(pos + text.length)), - node.nextSibling)); - node.nodeValue = val.substr(0, pos); - if (isInSVG) { - var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); - var bbox = node.parentElement.getBBox(); - rect.x.baseVal.value = bbox.x; - rect.y.baseVal.value = bbox.y; - rect.width.baseVal.value = bbox.width; - rect.height.baseVal.value = bbox.height; - rect.setAttribute('class', className); - addItems.push({ - "parent": node.parentNode, - "target": rect}); - } - } - } - else if (!jQuery(node).is("button, select, textarea")) { - jQuery.each(node.childNodes, function() { - highlight(this, addItems); - }); - } - } - var addItems = []; - var result = this.each(function() { - highlight(this, addItems); - }); - for (var i = 0; i < addItems.length; ++i) { - jQuery(addItems[i].parent).before(addItems[i].target); - } - return result; -}; - -/* - * backward compatibility for jQuery.browser - * This will be supported until firefox bug is fixed. - */ -if (!jQuery.browser) { - jQuery.uaMatch = function(ua) { - ua = ua.toLowerCase(); - - var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || - /(webkit)[ \/]([\w.]+)/.exec(ua) || - /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || - /(msie) ([\w.]+)/.exec(ua) || - ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || - []; - - return { - browser: match[ 1 ] || "", - version: match[ 2 ] || "0" - }; - }; - jQuery.browser = {}; - jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; -} - -/** - * Small JavaScript module for the documentation. - */ -var Documentation = { - - init : function() { - this.fixFirefoxAnchorBug(); - this.highlightSearchWords(); - this.initIndexTable(); - this.initOnKeyListeners(); - }, - - /** - * i18n support - */ - TRANSLATIONS : {}, - PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; }, - LOCALE : 'unknown', - - // gettext and ngettext don't access this so that the functions - // can safely bound to a different name (_ = Documentation.gettext) - gettext : function(string) { - var translated = Documentation.TRANSLATIONS[string]; - if (typeof translated === 'undefined') - return string; - return (typeof translated === 'string') ? translated : translated[0]; - }, - - ngettext : function(singular, plural, n) { - var translated = Documentation.TRANSLATIONS[singular]; - if (typeof translated === 'undefined') - return (n == 1) ? singular : plural; - return translated[Documentation.PLURALEXPR(n)]; - }, - - addTranslations : function(catalog) { - for (var key in catalog.messages) - this.TRANSLATIONS[key] = catalog.messages[key]; - this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); - this.LOCALE = catalog.locale; - }, - - /** - * add context elements like header anchor links - */ - addContextElements : function() { - $('div[id] > :header:first').each(function() { - $('\u00B6'). - attr('href', '#' + this.id). - attr('title', _('Permalink to this headline')). - appendTo(this); - }); - $('dt[id]').each(function() { - $('\u00B6'). - attr('href', '#' + this.id). - attr('title', _('Permalink to this definition')). - appendTo(this); - }); - }, - - /** - * workaround a firefox stupidity - * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075 - */ - fixFirefoxAnchorBug : function() { - if (document.location.hash && $.browser.mozilla) - window.setTimeout(function() { - document.location.href += ''; - }, 10); - }, - - /** - * highlight the search words provided in the url in the text - */ - highlightSearchWords : function() { - var params = $.getQueryParameters(); - var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; - if (terms.length) { - var body = $('div.body'); - if (!body.length) { - body = $('body'); - } - window.setTimeout(function() { - $.each(terms, function() { - body.highlightText(this.toLowerCase(), 'highlighted'); - }); - }, 10); - $('') - .appendTo($('#searchbox')); - } - }, - - /** - * init the domain index toggle buttons - */ - initIndexTable : function() { - var togglers = $('img.toggler').click(function() { - var src = $(this).attr('src'); - var idnum = $(this).attr('id').substr(7); - $('tr.cg-' + idnum).toggle(); - if (src.substr(-9) === 'minus.png') - $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); - else - $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); - }).css('display', ''); - if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { - togglers.click(); - } - }, - - /** - * helper function to hide the search marks again - */ - hideSearchWords : function() { - $('#searchbox .highlight-link').fadeOut(300); - $('span.highlighted').removeClass('highlighted'); - var url = new URL(window.location); - url.searchParams.delete('highlight'); - window.history.replaceState({}, '', url); - }, - - /** - * helper function to focus on search bar - */ - focusSearchBar : function() { - $('input[name=q]').first().focus(); - }, - - /** - * make the url absolute - */ - makeURL : function(relativeURL) { - return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; - }, - - /** - * get the current relative url - */ - getCurrentURL : function() { - var path = document.location.pathname; - var parts = path.split(/\//); - $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { - if (this === '..') - parts.pop(); - }); - var url = parts.join('/'); - return path.substring(url.lastIndexOf('/') + 1, path.length - 1); - }, - - initOnKeyListeners: function() { - // only install a listener if it is really needed - if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && - !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) - return; - - $(document).keydown(function(event) { - var activeElementType = document.activeElement.tagName; - // don't navigate when in search box, textarea, dropdown or button - if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT' - && activeElementType !== 'BUTTON') { - if (event.altKey || event.ctrlKey || event.metaKey) - return; - - if (!event.shiftKey) { - switch (event.key) { - case 'ArrowLeft': - if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) - break; - var prevHref = $('link[rel="prev"]').prop('href'); - if (prevHref) { - window.location.href = prevHref; - return false; - } - break; - case 'ArrowRight': - if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) - break; - var nextHref = $('link[rel="next"]').prop('href'); - if (nextHref) { - window.location.href = nextHref; - return false; - } - break; - case 'Escape': - if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) - break; - Documentation.hideSearchWords(); - return false; - } - } - - // some keyboard layouts may need Shift to get / - switch (event.key) { - case '/': - if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) - break; - Documentation.focusSearchBar(); - return false; - } - } - }); - } -}; - -// quick alias for translations -_ = Documentation.gettext; - -$(document).ready(function() { - Documentation.init(); -}); diff --git a/esp_modem/_static/documentation_options.js b/esp_modem/_static/documentation_options.js deleted file mode 100644 index b57ae3b83..000000000 --- a/esp_modem/_static/documentation_options.js +++ /dev/null @@ -1,14 +0,0 @@ -var DOCUMENTATION_OPTIONS = { - URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), - VERSION: '', - LANGUAGE: 'en', - COLLAPSE_INDEX: false, - BUILDER: 'html', - FILE_SUFFIX: '.html', - LINK_SUFFIX: '.html', - HAS_SOURCE: true, - SOURCELINK_SUFFIX: '.txt', - NAVIGATION_WITH_KEYS: false, - SHOW_SEARCH_SUMMARY: true, - ENABLE_SEARCH_SHORTCUTS: true, -}; \ No newline at end of file diff --git a/esp_modem/_static/file.png b/esp_modem/_static/file.png deleted file mode 100644 index a858a410e..000000000 Binary files a/esp_modem/_static/file.png and /dev/null differ diff --git a/esp_modem/_static/jquery-3.5.1.js b/esp_modem/_static/jquery-3.5.1.js deleted file mode 100644 index 50937333b..000000000 --- a/esp_modem/_static/jquery-3.5.1.js +++ /dev/null @@ -1,10872 +0,0 @@ -/*! - * jQuery JavaScript Library v3.5.1 - * https://jquery.com/ - * - * Includes Sizzle.js - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors - * Released under the MIT license - * https://jquery.org/license - * - * Date: 2020-05-04T22:49Z - */ -( function( global, factory ) { - - "use strict"; - - if ( typeof module === "object" && typeof module.exports === "object" ) { - - // For CommonJS and CommonJS-like environments where a proper `window` - // is present, execute the factory and get jQuery. - // For environments that do not have a `window` with a `document` - // (such as Node.js), expose a factory as module.exports. - // This accentuates the need for the creation of a real `window`. - // e.g. var jQuery = require("jquery")(window); - // See ticket #14549 for more info. - module.exports = global.document ? - factory( global, true ) : - function( w ) { - if ( !w.document ) { - throw new Error( "jQuery requires a window with a document" ); - } - return factory( w ); - }; - } else { - factory( global ); - } - -// Pass this if window is not defined yet -} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { - -// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 -// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode -// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common -// enough that all such attempts are guarded in a try block. -"use strict"; - -var arr = []; - -var getProto = Object.getPrototypeOf; - -var slice = arr.slice; - -var flat = arr.flat ? function( array ) { - return arr.flat.call( array ); -} : function( array ) { - return arr.concat.apply( [], array ); -}; - - -var push = arr.push; - -var indexOf = arr.indexOf; - -var class2type = {}; - -var toString = class2type.toString; - -var hasOwn = class2type.hasOwnProperty; - -var fnToString = hasOwn.toString; - -var ObjectFunctionString = fnToString.call( Object ); - -var support = {}; - -var isFunction = function isFunction( obj ) { - - // Support: Chrome <=57, Firefox <=52 - // In some browsers, typeof returns "function" for HTML elements - // (i.e., `typeof document.createElement( "object" ) === "function"`). - // We don't want to classify *any* DOM node as a function. - return typeof obj === "function" && typeof obj.nodeType !== "number"; - }; - - -var isWindow = function isWindow( obj ) { - return obj != null && obj === obj.window; - }; - - -var document = window.document; - - - - var preservedScriptAttributes = { - type: true, - src: true, - nonce: true, - noModule: true - }; - - function DOMEval( code, node, doc ) { - doc = doc || document; - - var i, val, - script = doc.createElement( "script" ); - - script.text = code; - if ( node ) { - for ( i in preservedScriptAttributes ) { - - // Support: Firefox 64+, Edge 18+ - // Some browsers don't support the "nonce" property on scripts. - // On the other hand, just using `getAttribute` is not enough as - // the `nonce` attribute is reset to an empty string whenever it - // becomes browsing-context connected. - // See https://github.com/whatwg/html/issues/2369 - // See https://html.spec.whatwg.org/#nonce-attributes - // The `node.getAttribute` check was added for the sake of - // `jQuery.globalEval` so that it can fake a nonce-containing node - // via an object. - val = node[ i ] || node.getAttribute && node.getAttribute( i ); - if ( val ) { - script.setAttribute( i, val ); - } - } - } - doc.head.appendChild( script ).parentNode.removeChild( script ); - } - - -function toType( obj ) { - if ( obj == null ) { - return obj + ""; - } - - // Support: Android <=2.3 only (functionish RegExp) - return typeof obj === "object" || typeof obj === "function" ? - class2type[ toString.call( obj ) ] || "object" : - typeof obj; -} -/* global Symbol */ -// Defining this global in .eslintrc.json would create a danger of using the global -// unguarded in another place, it seems safer to define global only for this module - - - -var - version = "3.5.1", - - // Define a local copy of jQuery - jQuery = function( selector, context ) { - - // The jQuery object is actually just the init constructor 'enhanced' - // Need init if jQuery is called (just allow error to be thrown if not included) - return new jQuery.fn.init( selector, context ); - }; - -jQuery.fn = jQuery.prototype = { - - // The current version of jQuery being used - jquery: version, - - constructor: jQuery, - - // The default length of a jQuery object is 0 - length: 0, - - toArray: function() { - return slice.call( this ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - - // Return all the elements in a clean array - if ( num == null ) { - return slice.call( this ); - } - - // Return just the one element from the set - return num < 0 ? this[ num + this.length ] : this[ num ]; - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems ) { - - // Build a new jQuery matched element set - var ret = jQuery.merge( this.constructor(), elems ); - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - each: function( callback ) { - return jQuery.each( this, callback ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map( this, function( elem, i ) { - return callback.call( elem, i, elem ); - } ) ); - }, - - slice: function() { - return this.pushStack( slice.apply( this, arguments ) ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - even: function() { - return this.pushStack( jQuery.grep( this, function( _elem, i ) { - return ( i + 1 ) % 2; - } ) ); - }, - - odd: function() { - return this.pushStack( jQuery.grep( this, function( _elem, i ) { - return i % 2; - } ) ); - }, - - eq: function( i ) { - var len = this.length, - j = +i + ( i < 0 ? len : 0 ); - return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); - }, - - end: function() { - return this.prevObject || this.constructor(); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: arr.sort, - splice: arr.splice -}; - -jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, - target = arguments[ 0 ] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - - // Skip the boolean and the target - target = arguments[ i ] || {}; - i++; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !isFunction( target ) ) { - target = {}; - } - - // Extend jQuery itself if only one argument is passed - if ( i === length ) { - target = this; - i--; - } - - for ( ; i < length; i++ ) { - - // Only deal with non-null/undefined values - if ( ( options = arguments[ i ] ) != null ) { - - // Extend the base object - for ( name in options ) { - copy = options[ name ]; - - // Prevent Object.prototype pollution - // Prevent never-ending loop - if ( name === "__proto__" || target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject( copy ) || - ( copyIsArray = Array.isArray( copy ) ) ) ) { - src = target[ name ]; - - // Ensure proper type for the source value - if ( copyIsArray && !Array.isArray( src ) ) { - clone = []; - } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { - clone = {}; - } else { - clone = src; - } - copyIsArray = false; - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend( { - - // Unique for each copy of jQuery on the page - expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), - - // Assume jQuery is ready without the ready module - isReady: true, - - error: function( msg ) { - throw new Error( msg ); - }, - - noop: function() {}, - - isPlainObject: function( obj ) { - var proto, Ctor; - - // Detect obvious negatives - // Use toString instead of jQuery.type to catch host objects - if ( !obj || toString.call( obj ) !== "[object Object]" ) { - return false; - } - - proto = getProto( obj ); - - // Objects with no prototype (e.g., `Object.create( null )`) are plain - if ( !proto ) { - return true; - } - - // Objects with prototype are plain iff they were constructed by a global Object function - Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; - return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; - }, - - isEmptyObject: function( obj ) { - var name; - - for ( name in obj ) { - return false; - } - return true; - }, - - // Evaluates a script in a provided context; falls back to the global one - // if not specified. - globalEval: function( code, options, doc ) { - DOMEval( code, { nonce: options && options.nonce }, doc ); - }, - - each: function( obj, callback ) { - var length, i = 0; - - if ( isArrayLike( obj ) ) { - length = obj.length; - for ( ; i < length; i++ ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } else { - for ( i in obj ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } - - return obj; - }, - - // results is for internal usage only - makeArray: function( arr, results ) { - var ret = results || []; - - if ( arr != null ) { - if ( isArrayLike( Object( arr ) ) ) { - jQuery.merge( ret, - typeof arr === "string" ? - [ arr ] : arr - ); - } else { - push.call( ret, arr ); - } - } - - return ret; - }, - - inArray: function( elem, arr, i ) { - return arr == null ? -1 : indexOf.call( arr, elem, i ); - }, - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - merge: function( first, second ) { - var len = +second.length, - j = 0, - i = first.length; - - for ( ; j < len; j++ ) { - first[ i++ ] = second[ j ]; - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, invert ) { - var callbackInverse, - matches = [], - i = 0, - length = elems.length, - callbackExpect = !invert; - - // Go through the array, only saving the items - // that pass the validator function - for ( ; i < length; i++ ) { - callbackInverse = !callback( elems[ i ], i ); - if ( callbackInverse !== callbackExpect ) { - matches.push( elems[ i ] ); - } - } - - return matches; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var length, value, - i = 0, - ret = []; - - // Go through the array, translating each of the items to their new values - if ( isArrayLike( elems ) ) { - length = elems.length; - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - - // Go through every key on the object, - } else { - for ( i in elems ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - } - - // Flatten any nested arrays - return flat( ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // jQuery.support is not used in Core but other projects attach their - // properties to it so it needs to exist. - support: support -} ); - -if ( typeof Symbol === "function" ) { - jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; -} - -// Populate the class2type map -jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), -function( _i, name ) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -} ); - -function isArrayLike( obj ) { - - // Support: real iOS 8.2 only (not reproducible in simulator) - // `in` check used to prevent JIT error (gh-2145) - // hasOwn isn't used here due to false negatives - // regarding Nodelist length in IE - var length = !!obj && "length" in obj && obj.length, - type = toType( obj ); - - if ( isFunction( obj ) || isWindow( obj ) ) { - return false; - } - - return type === "array" || length === 0 || - typeof length === "number" && length > 0 && ( length - 1 ) in obj; -} -var Sizzle = -/*! - * Sizzle CSS Selector Engine v2.3.5 - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors - * Released under the MIT license - * https://js.foundation/ - * - * Date: 2020-03-14 - */ -( function( window ) { -var i, - support, - Expr, - getText, - isXML, - tokenize, - compile, - select, - outermostContext, - sortInput, - hasDuplicate, - - // Local document vars - setDocument, - document, - docElem, - documentIsHTML, - rbuggyQSA, - rbuggyMatches, - matches, - contains, - - // Instance-specific data - expando = "sizzle" + 1 * new Date(), - preferredDoc = window.document, - dirruns = 0, - done = 0, - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - nonnativeSelectorCache = createCache(), - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - } - return 0; - }, - - // Instance methods - hasOwn = ( {} ).hasOwnProperty, - arr = [], - pop = arr.pop, - pushNative = arr.push, - push = arr.push, - slice = arr.slice, - - // Use a stripped-down indexOf as it's faster than native - // https://jsperf.com/thor-indexof-vs-for/5 - indexOf = function( list, elem ) { - var i = 0, - len = list.length; - for ( ; i < len; i++ ) { - if ( list[ i ] === elem ) { - return i; - } - } - return -1; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" + - "ismap|loop|multiple|open|readonly|required|scoped", - - // Regular expressions - - // http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - - // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram - identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + - "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", - - // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + - - // Operator (capture 2) - "*([*^$|!~]?=)" + whitespace + - - // "Attribute values must be CSS identifiers [capture 5] - // or strings [capture 3 or capture 4]" - "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + - whitespace + "*\\]", - - pseudos = ":(" + identifier + ")(?:\\((" + - - // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: - // 1. quoted (capture 3; capture 4 or capture 5) - "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + - - // 2. simple (capture 6) - "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + - - // 3. anything else (capture 2) - ".*" + - ")\\)|)", - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rwhitespace = new RegExp( whitespace + "+", "g" ), - rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + - whitespace + "+$", "g" ), - - rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + - "*" ), - rdescend = new RegExp( whitespace + "|>" ), - - rpseudo = new RegExp( pseudos ), - ridentifier = new RegExp( "^" + identifier + "$" ), - - matchExpr = { - "ID": new RegExp( "^#(" + identifier + ")" ), - "CLASS": new RegExp( "^\\.(" + identifier + ")" ), - "TAG": new RegExp( "^(" + identifier + "|[*])" ), - "ATTR": new RegExp( "^" + attributes ), - "PSEUDO": new RegExp( "^" + pseudos ), - "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + - whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + - whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), - - // For use in libraries implementing .is() - // We use this for POS matching in `select` - "needsContext": new RegExp( "^" + whitespace + - "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + - "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) - }, - - rhtml = /HTML$/i, - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - - rnative = /^[^{]+\{\s*\[native \w/, - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - - rsibling = /[+~]/, - - // CSS escapes - // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ), - funescape = function( escape, nonHex ) { - var high = "0x" + escape.slice( 1 ) - 0x10000; - - return nonHex ? - - // Strip the backslash prefix from a non-hex escape sequence - nonHex : - - // Replace a hexadecimal escape sequence with the encoded Unicode code point - // Support: IE <=11+ - // For values outside the Basic Multilingual Plane (BMP), manually construct a - // surrogate pair - high < 0 ? - String.fromCharCode( high + 0x10000 ) : - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }, - - // CSS string/identifier serialization - // https://drafts.csswg.org/cssom/#common-serializing-idioms - rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, - fcssescape = function( ch, asCodePoint ) { - if ( asCodePoint ) { - - // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER - if ( ch === "\0" ) { - return "\uFFFD"; - } - - // Control characters and (dependent upon position) numbers get escaped as code points - return ch.slice( 0, -1 ) + "\\" + - ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; - } - - // Other potentially-special ASCII characters get backslash-escaped - return "\\" + ch; - }, - - // Used for iframes - // See setDocument() - // Removing the function wrapper causes a "Permission Denied" - // error in IE - unloadHandler = function() { - setDocument(); - }, - - inDisabledFieldset = addCombinator( - function( elem ) { - return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; - }, - { dir: "parentNode", next: "legend" } - ); - -// Optimize for push.apply( _, NodeList ) -try { - push.apply( - ( arr = slice.call( preferredDoc.childNodes ) ), - preferredDoc.childNodes - ); - - // Support: Android<4.0 - // Detect silently failing push.apply - // eslint-disable-next-line no-unused-expressions - arr[ preferredDoc.childNodes.length ].nodeType; -} catch ( e ) { - push = { apply: arr.length ? - - // Leverage slice if possible - function( target, els ) { - pushNative.apply( target, slice.call( els ) ); - } : - - // Support: IE<9 - // Otherwise append directly - function( target, els ) { - var j = target.length, - i = 0; - - // Can't trust NodeList.length - while ( ( target[ j++ ] = els[ i++ ] ) ) {} - target.length = j - 1; - } - }; -} - -function Sizzle( selector, context, results, seed ) { - var m, i, elem, nid, match, groups, newSelector, - newContext = context && context.ownerDocument, - - // nodeType defaults to 9, since context defaults to document - nodeType = context ? context.nodeType : 9; - - results = results || []; - - // Return early from calls with invalid selector or context - if ( typeof selector !== "string" || !selector || - nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { - - return results; - } - - // Try to shortcut find operations (as opposed to filters) in HTML documents - if ( !seed ) { - setDocument( context ); - context = context || document; - - if ( documentIsHTML ) { - - // If the selector is sufficiently simple, try using a "get*By*" DOM method - // (excepting DocumentFragment context, where the methods don't exist) - if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { - - // ID selector - if ( ( m = match[ 1 ] ) ) { - - // Document context - if ( nodeType === 9 ) { - if ( ( elem = context.getElementById( m ) ) ) { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( elem.id === m ) { - results.push( elem ); - return results; - } - } else { - return results; - } - - // Element context - } else { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( newContext && ( elem = newContext.getElementById( m ) ) && - contains( context, elem ) && - elem.id === m ) { - - results.push( elem ); - return results; - } - } - - // Type selector - } else if ( match[ 2 ] ) { - push.apply( results, context.getElementsByTagName( selector ) ); - return results; - - // Class selector - } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName && - context.getElementsByClassName ) { - - push.apply( results, context.getElementsByClassName( m ) ); - return results; - } - } - - // Take advantage of querySelectorAll - if ( support.qsa && - !nonnativeSelectorCache[ selector + " " ] && - ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) && - - // Support: IE 8 only - // Exclude object elements - ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) { - - newSelector = selector; - newContext = context; - - // qSA considers elements outside a scoping root when evaluating child or - // descendant combinators, which is not what we want. - // In such cases, we work around the behavior by prefixing every selector in the - // list with an ID selector referencing the scope context. - // The technique has to be used as well when a leading combinator is used - // as such selectors are not recognized by querySelectorAll. - // Thanks to Andrew Dupont for this technique. - if ( nodeType === 1 && - ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) { - - // Expand context for sibling selectors - newContext = rsibling.test( selector ) && testContext( context.parentNode ) || - context; - - // We can use :scope instead of the ID hack if the browser - // supports it & if we're not changing the context. - if ( newContext !== context || !support.scope ) { - - // Capture the context ID, setting it first if necessary - if ( ( nid = context.getAttribute( "id" ) ) ) { - nid = nid.replace( rcssescape, fcssescape ); - } else { - context.setAttribute( "id", ( nid = expando ) ); - } - } - - // Prefix every selector in the list - groups = tokenize( selector ); - i = groups.length; - while ( i-- ) { - groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + - toSelector( groups[ i ] ); - } - newSelector = groups.join( "," ); - } - - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch ( qsaError ) { - nonnativeSelectorCache( selector, true ); - } finally { - if ( nid === expando ) { - context.removeAttribute( "id" ); - } - } - } - } - } - - // All others - return select( selector.replace( rtrim, "$1" ), context, results, seed ); -} - -/** - * Create key-value caches of limited size - * @returns {function(string, object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ -function createCache() { - var keys = []; - - function cache( key, value ) { - - // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) - if ( keys.push( key + " " ) > Expr.cacheLength ) { - - // Only keep the most recent entries - delete cache[ keys.shift() ]; - } - return ( cache[ key + " " ] = value ); - } - return cache; -} - -/** - * Mark a function for special use by Sizzle - * @param {Function} fn The function to mark - */ -function markFunction( fn ) { - fn[ expando ] = true; - return fn; -} - -/** - * Support testing using an element - * @param {Function} fn Passed the created element and returns a boolean result - */ -function assert( fn ) { - var el = document.createElement( "fieldset" ); - - try { - return !!fn( el ); - } catch ( e ) { - return false; - } finally { - - // Remove from its parent by default - if ( el.parentNode ) { - el.parentNode.removeChild( el ); - } - - // release memory in IE - el = null; - } -} - -/** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ -function addHandle( attrs, handler ) { - var arr = attrs.split( "|" ), - i = arr.length; - - while ( i-- ) { - Expr.attrHandle[ arr[ i ] ] = handler; - } -} - -/** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ -function siblingCheck( a, b ) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && - a.sourceIndex - b.sourceIndex; - - // Use IE sourceIndex if available on both nodes - if ( diff ) { - return diff; - } - - // Check if b follows a - if ( cur ) { - while ( ( cur = cur.nextSibling ) ) { - if ( cur === b ) { - return -1; - } - } - } - - return a ? 1 : -1; -} - -/** - * Returns a function to use in pseudos for input types - * @param {String} type - */ -function createInputPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ -function createButtonPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return ( name === "input" || name === "button" ) && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for :enabled/:disabled - * @param {Boolean} disabled true for :disabled; false for :enabled - */ -function createDisabledPseudo( disabled ) { - - // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable - return function( elem ) { - - // Only certain elements can match :enabled or :disabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled - if ( "form" in elem ) { - - // Check for inherited disabledness on relevant non-disabled elements: - // * listed form-associated elements in a disabled fieldset - // https://html.spec.whatwg.org/multipage/forms.html#category-listed - // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled - // * option elements in a disabled optgroup - // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled - // All such elements have a "form" property. - if ( elem.parentNode && elem.disabled === false ) { - - // Option elements defer to a parent optgroup if present - if ( "label" in elem ) { - if ( "label" in elem.parentNode ) { - return elem.parentNode.disabled === disabled; - } else { - return elem.disabled === disabled; - } - } - - // Support: IE 6 - 11 - // Use the isDisabled shortcut property to check for disabled fieldset ancestors - return elem.isDisabled === disabled || - - // Where there is no isDisabled, check manually - /* jshint -W018 */ - elem.isDisabled !== !disabled && - inDisabledFieldset( elem ) === disabled; - } - - return elem.disabled === disabled; - - // Try to winnow out elements that can't be disabled before trusting the disabled property. - // Some victims get caught in our net (label, legend, menu, track), but it shouldn't - // even exist on them, let alone have a boolean value. - } else if ( "label" in elem ) { - return elem.disabled === disabled; - } - - // Remaining elements are neither :enabled nor :disabled - return false; - }; -} - -/** - * Returns a function to use in pseudos for positionals - * @param {Function} fn - */ -function createPositionalPseudo( fn ) { - return markFunction( function( argument ) { - argument = +argument; - return markFunction( function( seed, matches ) { - var j, - matchIndexes = fn( [], seed.length, argument ), - i = matchIndexes.length; - - // Match elements found at the specified indexes - while ( i-- ) { - if ( seed[ ( j = matchIndexes[ i ] ) ] ) { - seed[ j ] = !( matches[ j ] = seed[ j ] ); - } - } - } ); - } ); -} - -/** - * Checks a node for validity as a Sizzle context - * @param {Element|Object=} context - * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value - */ -function testContext( context ) { - return context && typeof context.getElementsByTagName !== "undefined" && context; -} - -// Expose support vars for convenience -support = Sizzle.support = {}; - -/** - * Detects XML nodes - * @param {Element|Object} elem An element or a document - * @returns {Boolean} True iff elem is a non-HTML XML node - */ -isXML = Sizzle.isXML = function( elem ) { - var namespace = elem.namespaceURI, - docElem = ( elem.ownerDocument || elem ).documentElement; - - // Support: IE <=8 - // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes - // https://bugs.jquery.com/ticket/4833 - return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); -}; - -/** - * Sets document-related variables once based on the current document - * @param {Element|Object} [doc] An element or document object to use to set the document - * @returns {Object} Returns the current document - */ -setDocument = Sizzle.setDocument = function( node ) { - var hasCompare, subWindow, - doc = node ? node.ownerDocument || node : preferredDoc; - - // Return early if doc is invalid or already selected - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { - return document; - } - - // Update global variables - document = doc; - docElem = document.documentElement; - documentIsHTML = !isXML( document ); - - // Support: IE 9 - 11+, Edge 12 - 18+ - // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( preferredDoc != document && - ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { - - // Support: IE 11, Edge - if ( subWindow.addEventListener ) { - subWindow.addEventListener( "unload", unloadHandler, false ); - - // Support: IE 9 - 10 only - } else if ( subWindow.attachEvent ) { - subWindow.attachEvent( "onunload", unloadHandler ); - } - } - - // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only, - // Safari 4 - 5 only, Opera <=11.6 - 12.x only - // IE/Edge & older browsers don't support the :scope pseudo-class. - // Support: Safari 6.0 only - // Safari 6.0 supports :scope but it's an alias of :root there. - support.scope = assert( function( el ) { - docElem.appendChild( el ).appendChild( document.createElement( "div" ) ); - return typeof el.querySelectorAll !== "undefined" && - !el.querySelectorAll( ":scope fieldset div" ).length; - } ); - - /* Attributes - ---------------------------------------------------------------------- */ - - // Support: IE<8 - // Verify that getAttribute really returns attributes and not properties - // (excepting IE8 booleans) - support.attributes = assert( function( el ) { - el.className = "i"; - return !el.getAttribute( "className" ); - } ); - - /* getElement(s)By* - ---------------------------------------------------------------------- */ - - // Check if getElementsByTagName("*") returns only elements - support.getElementsByTagName = assert( function( el ) { - el.appendChild( document.createComment( "" ) ); - return !el.getElementsByTagName( "*" ).length; - } ); - - // Support: IE<9 - support.getElementsByClassName = rnative.test( document.getElementsByClassName ); - - // Support: IE<10 - // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programmatically-set names, - // so use a roundabout getElementsByName test - support.getById = assert( function( el ) { - docElem.appendChild( el ).id = expando; - return !document.getElementsByName || !document.getElementsByName( expando ).length; - } ); - - // ID filter and find - if ( support.getById ) { - Expr.filter[ "ID" ] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - return elem.getAttribute( "id" ) === attrId; - }; - }; - Expr.find[ "ID" ] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var elem = context.getElementById( id ); - return elem ? [ elem ] : []; - } - }; - } else { - Expr.filter[ "ID" ] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - var node = typeof elem.getAttributeNode !== "undefined" && - elem.getAttributeNode( "id" ); - return node && node.value === attrId; - }; - }; - - // Support: IE 6 - 7 only - // getElementById is not reliable as a find shortcut - Expr.find[ "ID" ] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var node, i, elems, - elem = context.getElementById( id ); - - if ( elem ) { - - // Verify the id attribute - node = elem.getAttributeNode( "id" ); - if ( node && node.value === id ) { - return [ elem ]; - } - - // Fall back on getElementsByName - elems = context.getElementsByName( id ); - i = 0; - while ( ( elem = elems[ i++ ] ) ) { - node = elem.getAttributeNode( "id" ); - if ( node && node.value === id ) { - return [ elem ]; - } - } - } - - return []; - } - }; - } - - // Tag - Expr.find[ "TAG" ] = support.getElementsByTagName ? - function( tag, context ) { - if ( typeof context.getElementsByTagName !== "undefined" ) { - return context.getElementsByTagName( tag ); - - // DocumentFragment nodes don't have gEBTN - } else if ( support.qsa ) { - return context.querySelectorAll( tag ); - } - } : - - function( tag, context ) { - var elem, - tmp = [], - i = 0, - - // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too - results = context.getElementsByTagName( tag ); - - // Filter out possible comments - if ( tag === "*" ) { - while ( ( elem = results[ i++ ] ) ) { - if ( elem.nodeType === 1 ) { - tmp.push( elem ); - } - } - - return tmp; - } - return results; - }; - - // Class - Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) { - if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { - return context.getElementsByClassName( className ); - } - }; - - /* QSA/matchesSelector - ---------------------------------------------------------------------- */ - - // QSA and matchesSelector support - - // matchesSelector(:active) reports false when true (IE9/Opera 11.5) - rbuggyMatches = []; - - // qSa(:focus) reports false when true (Chrome 21) - // We allow this because of a bug in IE8/9 that throws an error - // whenever `document.activeElement` is accessed on an iframe - // So, we allow :focus to pass through QSA all the time to avoid the IE error - // See https://bugs.jquery.com/ticket/13378 - rbuggyQSA = []; - - if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) { - - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert( function( el ) { - - var input; - - // Select is set to empty string on purpose - // This is to test IE's treatment of not explicitly - // setting a boolean content attribute, - // since its presence should be enough - // https://bugs.jquery.com/ticket/12359 - docElem.appendChild( el ).innerHTML = "" + - ""; - - // Support: IE8, Opera 11-12.16 - // Nothing should be selected when empty strings follow ^= or $= or *= - // The test attribute must be unknown in Opera but "safe" for WinRT - // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section - if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) { - rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); - } - - // Support: IE8 - // Boolean attributes and "value" are not treated correctly - if ( !el.querySelectorAll( "[selected]" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); - } - - // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ - if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { - rbuggyQSA.push( "~=" ); - } - - // Support: IE 11+, Edge 15 - 18+ - // IE 11/Edge don't find elements on a `[name='']` query in some cases. - // Adding a temporary attribute to the document before the selection works - // around the issue. - // Interestingly, IE 10 & older don't seem to have the issue. - input = document.createElement( "input" ); - input.setAttribute( "name", "" ); - el.appendChild( input ); - if ( !el.querySelectorAll( "[name='']" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + - whitespace + "*(?:''|\"\")" ); - } - - // Webkit/Opera - :checked should return selected option elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - // IE8 throws error here and will not see later tests - if ( !el.querySelectorAll( ":checked" ).length ) { - rbuggyQSA.push( ":checked" ); - } - - // Support: Safari 8+, iOS 8+ - // https://bugs.webkit.org/show_bug.cgi?id=136851 - // In-page `selector#id sibling-combinator selector` fails - if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { - rbuggyQSA.push( ".#.+[+~]" ); - } - - // Support: Firefox <=3.6 - 5 only - // Old Firefox doesn't throw on a badly-escaped identifier. - el.querySelectorAll( "\\\f" ); - rbuggyQSA.push( "[\\r\\n\\f]" ); - } ); - - assert( function( el ) { - el.innerHTML = "" + - ""; - - // Support: Windows 8 Native Apps - // The type and name attributes are restricted during .innerHTML assignment - var input = document.createElement( "input" ); - input.setAttribute( "type", "hidden" ); - el.appendChild( input ).setAttribute( "name", "D" ); - - // Support: IE8 - // Enforce case-sensitivity of name attribute - if ( el.querySelectorAll( "[name=d]" ).length ) { - rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); - } - - // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) - // IE8 throws error here and will not see later tests - if ( el.querySelectorAll( ":enabled" ).length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: IE9-11+ - // IE's :disabled selector does not pick up the children of disabled fieldsets - docElem.appendChild( el ).disabled = true; - if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: Opera 10 - 11 only - // Opera 10-11 does not throw on post-comma invalid pseudos - el.querySelectorAll( "*,:x" ); - rbuggyQSA.push( ",.*:" ); - } ); - } - - if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches || - docElem.webkitMatchesSelector || - docElem.mozMatchesSelector || - docElem.oMatchesSelector || - docElem.msMatchesSelector ) ) ) ) { - - assert( function( el ) { - - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call( el, "*" ); - - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( el, "[s!='']:x" ); - rbuggyMatches.push( "!=", pseudos ); - } ); - } - - rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); - rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) ); - - /* Contains - ---------------------------------------------------------------------- */ - hasCompare = rnative.test( docElem.compareDocumentPosition ); - - // Element contains another - // Purposefully self-exclusive - // As in, an element does not contain itself - contains = hasCompare || rnative.test( docElem.contains ) ? - function( a, b ) { - var adown = a.nodeType === 9 ? a.documentElement : a, - bup = b && b.parentNode; - return a === bup || !!( bup && bup.nodeType === 1 && ( - adown.contains ? - adown.contains( bup ) : - a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 - ) ); - } : - function( a, b ) { - if ( b ) { - while ( ( b = b.parentNode ) ) { - if ( b === a ) { - return true; - } - } - } - return false; - }; - - /* Sorting - ---------------------------------------------------------------------- */ - - // Document order sorting - sortOrder = hasCompare ? - function( a, b ) { - - // Flag for duplicate removal - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - // Sort on method existence if only one input has compareDocumentPosition - var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; - if ( compare ) { - return compare; - } - - // Calculate position if both inputs belong to the same document - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? - a.compareDocumentPosition( b ) : - - // Otherwise we know they are disconnected - 1; - - // Disconnected nodes - if ( compare & 1 || - ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { - - // Choose the first element that is related to our preferred document - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( a == document || a.ownerDocument == preferredDoc && - contains( preferredDoc, a ) ) { - return -1; - } - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( b == document || b.ownerDocument == preferredDoc && - contains( preferredDoc, b ) ) { - return 1; - } - - // Maintain original order - return sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - } - - return compare & 4 ? -1 : 1; - } : - function( a, b ) { - - // Exit early if the nodes are identical - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - var cur, - i = 0, - aup = a.parentNode, - bup = b.parentNode, - ap = [ a ], - bp = [ b ]; - - // Parentless nodes are either documents or disconnected - if ( !aup || !bup ) { - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - /* eslint-disable eqeqeq */ - return a == document ? -1 : - b == document ? 1 : - /* eslint-enable eqeqeq */ - aup ? -1 : - bup ? 1 : - sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - - // If the nodes are siblings, we can do a quick check - } else if ( aup === bup ) { - return siblingCheck( a, b ); - } - - // Otherwise we need full lists of their ancestors for comparison - cur = a; - while ( ( cur = cur.parentNode ) ) { - ap.unshift( cur ); - } - cur = b; - while ( ( cur = cur.parentNode ) ) { - bp.unshift( cur ); - } - - // Walk down the tree looking for a discrepancy - while ( ap[ i ] === bp[ i ] ) { - i++; - } - - return i ? - - // Do a sibling check if the nodes have a common ancestor - siblingCheck( ap[ i ], bp[ i ] ) : - - // Otherwise nodes in our document sort first - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - /* eslint-disable eqeqeq */ - ap[ i ] == preferredDoc ? -1 : - bp[ i ] == preferredDoc ? 1 : - /* eslint-enable eqeqeq */ - 0; - }; - - return document; -}; - -Sizzle.matches = function( expr, elements ) { - return Sizzle( expr, null, null, elements ); -}; - -Sizzle.matchesSelector = function( elem, expr ) { - setDocument( elem ); - - if ( support.matchesSelector && documentIsHTML && - !nonnativeSelectorCache[ expr + " " ] && - ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && - ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { - - try { - var ret = matches.call( elem, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || support.disconnectedMatch || - - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11 ) { - return ret; - } - } catch ( e ) { - nonnativeSelectorCache( expr, true ); - } - } - - return Sizzle( expr, document, null, [ elem ] ).length > 0; -}; - -Sizzle.contains = function( context, elem ) { - - // Set document vars if needed - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( ( context.ownerDocument || context ) != document ) { - setDocument( context ); - } - return contains( context, elem ); -}; - -Sizzle.attr = function( elem, name ) { - - // Set document vars if needed - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( ( elem.ownerDocument || elem ) != document ) { - setDocument( elem ); - } - - var fn = Expr.attrHandle[ name.toLowerCase() ], - - // Don't get fooled by Object.prototype properties (jQuery #13807) - val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? - fn( elem, name, !documentIsHTML ) : - undefined; - - return val !== undefined ? - val : - support.attributes || !documentIsHTML ? - elem.getAttribute( name ) : - ( val = elem.getAttributeNode( name ) ) && val.specified ? - val.value : - null; -}; - -Sizzle.escape = function( sel ) { - return ( sel + "" ).replace( rcssescape, fcssescape ); -}; - -Sizzle.error = function( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); -}; - -/** - * Document sorting and removing duplicates - * @param {ArrayLike} results - */ -Sizzle.uniqueSort = function( results ) { - var elem, - duplicates = [], - j = 0, - i = 0; - - // Unless we *know* we can detect duplicates, assume their presence - hasDuplicate = !support.detectDuplicates; - sortInput = !support.sortStable && results.slice( 0 ); - results.sort( sortOrder ); - - if ( hasDuplicate ) { - while ( ( elem = results[ i++ ] ) ) { - if ( elem === results[ i ] ) { - j = duplicates.push( i ); - } - } - while ( j-- ) { - results.splice( duplicates[ j ], 1 ); - } - } - - // Clear input after sorting to release objects - // See https://github.com/jquery/sizzle/pull/225 - sortInput = null; - - return results; -}; - -/** - * Utility function for retrieving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ -getText = Sizzle.getText = function( elem ) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if ( !nodeType ) { - - // If no nodeType, this is expected to be an array - while ( ( node = elem[ i++ ] ) ) { - - // Do not traverse comment nodes - ret += getText( node ); - } - } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { - - // Use textContent for elements - // innerText usage removed for consistency of new lines (jQuery #11153) - if ( typeof elem.textContent === "string" ) { - return elem.textContent; - } else { - - // Traverse its children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - ret += getText( elem ); - } - } - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - - // Do not include comment or processing instruction nodes - - return ret; -}; - -Expr = Sizzle.selectors = { - - // Can be adjusted by the user - cacheLength: 50, - - createPseudo: markFunction, - - match: matchExpr, - - attrHandle: {}, - - find: {}, - - relative: { - ">": { dir: "parentNode", first: true }, - " ": { dir: "parentNode" }, - "+": { dir: "previousSibling", first: true }, - "~": { dir: "previousSibling" } - }, - - preFilter: { - "ATTR": function( match ) { - match[ 1 ] = match[ 1 ].replace( runescape, funescape ); - - // Move the given value to match[3] whether quoted or unquoted - match[ 3 ] = ( match[ 3 ] || match[ 4 ] || - match[ 5 ] || "" ).replace( runescape, funescape ); - - if ( match[ 2 ] === "~=" ) { - match[ 3 ] = " " + match[ 3 ] + " "; - } - - return match.slice( 0, 4 ); - }, - - "CHILD": function( match ) { - - /* matches from matchExpr["CHILD"] - 1 type (only|nth|...) - 2 what (child|of-type) - 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) - 4 xn-component of xn+y argument ([+-]?\d*n|) - 5 sign of xn-component - 6 x of xn-component - 7 sign of y-component - 8 y of y-component - */ - match[ 1 ] = match[ 1 ].toLowerCase(); - - if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { - - // nth-* requires argument - if ( !match[ 3 ] ) { - Sizzle.error( match[ 0 ] ); - } - - // numeric x and y parameters for Expr.filter.CHILD - // remember that false/true cast respectively to 0/1 - match[ 4 ] = +( match[ 4 ] ? - match[ 5 ] + ( match[ 6 ] || 1 ) : - 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) ); - match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); - - // other types prohibit arguments - } else if ( match[ 3 ] ) { - Sizzle.error( match[ 0 ] ); - } - - return match; - }, - - "PSEUDO": function( match ) { - var excess, - unquoted = !match[ 6 ] && match[ 2 ]; - - if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) { - return null; - } - - // Accept quoted arguments as-is - if ( match[ 3 ] ) { - match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; - - // Strip excess characters from unquoted arguments - } else if ( unquoted && rpseudo.test( unquoted ) && - - // Get excess from tokenize (recursively) - ( excess = tokenize( unquoted, true ) ) && - - // advance to the next closing parenthesis - ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { - - // excess is a negative index - match[ 0 ] = match[ 0 ].slice( 0, excess ); - match[ 2 ] = unquoted.slice( 0, excess ); - } - - // Return only captures needed by the pseudo filter method (type and argument) - return match.slice( 0, 3 ); - } - }, - - filter: { - - "TAG": function( nodeNameSelector ) { - var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); - return nodeNameSelector === "*" ? - function() { - return true; - } : - function( elem ) { - return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; - }; - }, - - "CLASS": function( className ) { - var pattern = classCache[ className + " " ]; - - return pattern || - ( pattern = new RegExp( "(^|" + whitespace + - ")" + className + "(" + whitespace + "|$)" ) ) && classCache( - className, function( elem ) { - return pattern.test( - typeof elem.className === "string" && elem.className || - typeof elem.getAttribute !== "undefined" && - elem.getAttribute( "class" ) || - "" - ); - } ); - }, - - "ATTR": function( name, operator, check ) { - return function( elem ) { - var result = Sizzle.attr( elem, name ); - - if ( result == null ) { - return operator === "!="; - } - if ( !operator ) { - return true; - } - - result += ""; - - /* eslint-disable max-len */ - - return operator === "=" ? result === check : - operator === "!=" ? result !== check : - operator === "^=" ? check && result.indexOf( check ) === 0 : - operator === "*=" ? check && result.indexOf( check ) > -1 : - operator === "$=" ? check && result.slice( -check.length ) === check : - operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : - operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : - false; - /* eslint-enable max-len */ - - }; - }, - - "CHILD": function( type, what, _argument, first, last ) { - var simple = type.slice( 0, 3 ) !== "nth", - forward = type.slice( -4 ) !== "last", - ofType = what === "of-type"; - - return first === 1 && last === 0 ? - - // Shortcut for :nth-*(n) - function( elem ) { - return !!elem.parentNode; - } : - - function( elem, _context, xml ) { - var cache, uniqueCache, outerCache, node, nodeIndex, start, - dir = simple !== forward ? "nextSibling" : "previousSibling", - parent = elem.parentNode, - name = ofType && elem.nodeName.toLowerCase(), - useCache = !xml && !ofType, - diff = false; - - if ( parent ) { - - // :(first|last|only)-(child|of-type) - if ( simple ) { - while ( dir ) { - node = elem; - while ( ( node = node[ dir ] ) ) { - if ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) { - - return false; - } - } - - // Reverse direction for :only-* (if we haven't yet done so) - start = dir = type === "only" && !start && "nextSibling"; - } - return true; - } - - start = [ forward ? parent.firstChild : parent.lastChild ]; - - // non-xml :nth-child(...) stores cache data on `parent` - if ( forward && useCache ) { - - // Seek `elem` from a previously-cached index - - // ...in a gzip-friendly way - node = parent; - outerCache = node[ expando ] || ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex && cache[ 2 ]; - node = nodeIndex && parent.childNodes[ nodeIndex ]; - - while ( ( node = ++nodeIndex && node && node[ dir ] || - - // Fallback to seeking `elem` from the start - ( diff = nodeIndex = 0 ) || start.pop() ) ) { - - // When found, cache indexes on `parent` and break - if ( node.nodeType === 1 && ++diff && node === elem ) { - uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; - break; - } - } - - } else { - - // Use previously-cached element index if available - if ( useCache ) { - - // ...in a gzip-friendly way - node = elem; - outerCache = node[ expando ] || ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex; - } - - // xml :nth-child(...) - // or :nth-last-child(...) or :nth(-last)?-of-type(...) - if ( diff === false ) { - - // Use the same loop as above to seek `elem` from the start - while ( ( node = ++nodeIndex && node && node[ dir ] || - ( diff = nodeIndex = 0 ) || start.pop() ) ) { - - if ( ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) && - ++diff ) { - - // Cache the index of each encountered element - if ( useCache ) { - outerCache = node[ expando ] || - ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - uniqueCache[ type ] = [ dirruns, diff ]; - } - - if ( node === elem ) { - break; - } - } - } - } - } - - // Incorporate the offset, then check against cycle size - diff -= last; - return diff === first || ( diff % first === 0 && diff / first >= 0 ); - } - }; - }, - - "PSEUDO": function( pseudo, argument ) { - - // pseudo-class names are case-insensitive - // http://www.w3.org/TR/selectors/#pseudo-classes - // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters - // Remember that setFilters inherits from pseudos - var args, - fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || - Sizzle.error( "unsupported pseudo: " + pseudo ); - - // The user may use createPseudo to indicate that - // arguments are needed to create the filter function - // just as Sizzle does - if ( fn[ expando ] ) { - return fn( argument ); - } - - // But maintain support for old signatures - if ( fn.length > 1 ) { - args = [ pseudo, pseudo, "", argument ]; - return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? - markFunction( function( seed, matches ) { - var idx, - matched = fn( seed, argument ), - i = matched.length; - while ( i-- ) { - idx = indexOf( seed, matched[ i ] ); - seed[ idx ] = !( matches[ idx ] = matched[ i ] ); - } - } ) : - function( elem ) { - return fn( elem, 0, args ); - }; - } - - return fn; - } - }, - - pseudos: { - - // Potentially complex pseudos - "not": markFunction( function( selector ) { - - // Trim the selector passed to compile - // to avoid treating leading and trailing - // spaces as combinators - var input = [], - results = [], - matcher = compile( selector.replace( rtrim, "$1" ) ); - - return matcher[ expando ] ? - markFunction( function( seed, matches, _context, xml ) { - var elem, - unmatched = matcher( seed, null, xml, [] ), - i = seed.length; - - // Match elements unmatched by `matcher` - while ( i-- ) { - if ( ( elem = unmatched[ i ] ) ) { - seed[ i ] = !( matches[ i ] = elem ); - } - } - } ) : - function( elem, _context, xml ) { - input[ 0 ] = elem; - matcher( input, null, xml, results ); - - // Don't keep the element (issue #299) - input[ 0 ] = null; - return !results.pop(); - }; - } ), - - "has": markFunction( function( selector ) { - return function( elem ) { - return Sizzle( selector, elem ).length > 0; - }; - } ), - - "contains": markFunction( function( text ) { - text = text.replace( runescape, funescape ); - return function( elem ) { - return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1; - }; - } ), - - // "Whether an element is represented by a :lang() selector - // is based solely on the element's language value - // being equal to the identifier C, - // or beginning with the identifier C immediately followed by "-". - // The matching of C against the element's language value is performed case-insensitively. - // The identifier C does not have to be a valid language name." - // http://www.w3.org/TR/selectors/#lang-pseudo - "lang": markFunction( function( lang ) { - - // lang value must be a valid identifier - if ( !ridentifier.test( lang || "" ) ) { - Sizzle.error( "unsupported lang: " + lang ); - } - lang = lang.replace( runescape, funescape ).toLowerCase(); - return function( elem ) { - var elemLang; - do { - if ( ( elemLang = documentIsHTML ? - elem.lang : - elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { - - elemLang = elemLang.toLowerCase(); - return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; - } - } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); - return false; - }; - } ), - - // Miscellaneous - "target": function( elem ) { - var hash = window.location && window.location.hash; - return hash && hash.slice( 1 ) === elem.id; - }, - - "root": function( elem ) { - return elem === docElem; - }, - - "focus": function( elem ) { - return elem === document.activeElement && - ( !document.hasFocus || document.hasFocus() ) && - !!( elem.type || elem.href || ~elem.tabIndex ); - }, - - // Boolean properties - "enabled": createDisabledPseudo( false ), - "disabled": createDisabledPseudo( true ), - - "checked": function( elem ) { - - // In CSS3, :checked should return both checked and selected elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - var nodeName = elem.nodeName.toLowerCase(); - return ( nodeName === "input" && !!elem.checked ) || - ( nodeName === "option" && !!elem.selected ); - }, - - "selected": function( elem ) { - - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - // eslint-disable-next-line no-unused-expressions - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - // Contents - "empty": function( elem ) { - - // http://www.w3.org/TR/selectors/#empty-pseudo - // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), - // but not by others (comment: 8; processing instruction: 7; etc.) - // nodeType < 6 works because attributes (2) do not appear as children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - if ( elem.nodeType < 6 ) { - return false; - } - } - return true; - }, - - "parent": function( elem ) { - return !Expr.pseudos[ "empty" ]( elem ); - }, - - // Element/input types - "header": function( elem ) { - return rheader.test( elem.nodeName ); - }, - - "input": function( elem ) { - return rinputs.test( elem.nodeName ); - }, - - "button": function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === "button" || name === "button"; - }, - - "text": function( elem ) { - var attr; - return elem.nodeName.toLowerCase() === "input" && - elem.type === "text" && - - // Support: IE<8 - // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" - ( ( attr = elem.getAttribute( "type" ) ) == null || - attr.toLowerCase() === "text" ); - }, - - // Position-in-collection - "first": createPositionalPseudo( function() { - return [ 0 ]; - } ), - - "last": createPositionalPseudo( function( _matchIndexes, length ) { - return [ length - 1 ]; - } ), - - "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) { - return [ argument < 0 ? argument + length : argument ]; - } ), - - "even": createPositionalPseudo( function( matchIndexes, length ) { - var i = 0; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "odd": createPositionalPseudo( function( matchIndexes, length ) { - var i = 1; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "lt": createPositionalPseudo( function( matchIndexes, length, argument ) { - var i = argument < 0 ? - argument + length : - argument > length ? - length : - argument; - for ( ; --i >= 0; ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "gt": createPositionalPseudo( function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; ++i < length; ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ) - } -}; - -Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ]; - -// Add button/input type pseudos -for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { - Expr.pseudos[ i ] = createInputPseudo( i ); -} -for ( i in { submit: true, reset: true } ) { - Expr.pseudos[ i ] = createButtonPseudo( i ); -} - -// Easy API for creating new setFilters -function setFilters() {} -setFilters.prototype = Expr.filters = Expr.pseudos; -Expr.setFilters = new setFilters(); - -tokenize = Sizzle.tokenize = function( selector, parseOnly ) { - var matched, match, tokens, type, - soFar, groups, preFilters, - cached = tokenCache[ selector + " " ]; - - if ( cached ) { - return parseOnly ? 0 : cached.slice( 0 ); - } - - soFar = selector; - groups = []; - preFilters = Expr.preFilter; - - while ( soFar ) { - - // Comma and first run - if ( !matched || ( match = rcomma.exec( soFar ) ) ) { - if ( match ) { - - // Don't consume trailing commas as valid - soFar = soFar.slice( match[ 0 ].length ) || soFar; - } - groups.push( ( tokens = [] ) ); - } - - matched = false; - - // Combinators - if ( ( match = rcombinators.exec( soFar ) ) ) { - matched = match.shift(); - tokens.push( { - value: matched, - - // Cast descendant combinators to space - type: match[ 0 ].replace( rtrim, " " ) - } ); - soFar = soFar.slice( matched.length ); - } - - // Filters - for ( type in Expr.filter ) { - if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || - ( match = preFilters[ type ]( match ) ) ) ) { - matched = match.shift(); - tokens.push( { - value: matched, - type: type, - matches: match - } ); - soFar = soFar.slice( matched.length ); - } - } - - if ( !matched ) { - break; - } - } - - // Return the length of the invalid excess - // if we're just parsing - // Otherwise, throw an error or return tokens - return parseOnly ? - soFar.length : - soFar ? - Sizzle.error( selector ) : - - // Cache the tokens - tokenCache( selector, groups ).slice( 0 ); -}; - -function toSelector( tokens ) { - var i = 0, - len = tokens.length, - selector = ""; - for ( ; i < len; i++ ) { - selector += tokens[ i ].value; - } - return selector; -} - -function addCombinator( matcher, combinator, base ) { - var dir = combinator.dir, - skip = combinator.next, - key = skip || dir, - checkNonElements = base && key === "parentNode", - doneName = done++; - - return combinator.first ? - - // Check against closest ancestor/preceding element - function( elem, context, xml ) { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - return matcher( elem, context, xml ); - } - } - return false; - } : - - // Check against all ancestor/preceding elements - function( elem, context, xml ) { - var oldCache, uniqueCache, outerCache, - newCache = [ dirruns, doneName ]; - - // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching - if ( xml ) { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - if ( matcher( elem, context, xml ) ) { - return true; - } - } - } - } else { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - outerCache = elem[ expando ] || ( elem[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ elem.uniqueID ] || - ( outerCache[ elem.uniqueID ] = {} ); - - if ( skip && skip === elem.nodeName.toLowerCase() ) { - elem = elem[ dir ] || elem; - } else if ( ( oldCache = uniqueCache[ key ] ) && - oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { - - // Assign to newCache so results back-propagate to previous elements - return ( newCache[ 2 ] = oldCache[ 2 ] ); - } else { - - // Reuse newcache so results back-propagate to previous elements - uniqueCache[ key ] = newCache; - - // A match means we're done; a fail means we have to keep checking - if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { - return true; - } - } - } - } - } - return false; - }; -} - -function elementMatcher( matchers ) { - return matchers.length > 1 ? - function( elem, context, xml ) { - var i = matchers.length; - while ( i-- ) { - if ( !matchers[ i ]( elem, context, xml ) ) { - return false; - } - } - return true; - } : - matchers[ 0 ]; -} - -function multipleContexts( selector, contexts, results ) { - var i = 0, - len = contexts.length; - for ( ; i < len; i++ ) { - Sizzle( selector, contexts[ i ], results ); - } - return results; -} - -function condense( unmatched, map, filter, context, xml ) { - var elem, - newUnmatched = [], - i = 0, - len = unmatched.length, - mapped = map != null; - - for ( ; i < len; i++ ) { - if ( ( elem = unmatched[ i ] ) ) { - if ( !filter || filter( elem, context, xml ) ) { - newUnmatched.push( elem ); - if ( mapped ) { - map.push( i ); - } - } - } - } - - return newUnmatched; -} - -function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { - if ( postFilter && !postFilter[ expando ] ) { - postFilter = setMatcher( postFilter ); - } - if ( postFinder && !postFinder[ expando ] ) { - postFinder = setMatcher( postFinder, postSelector ); - } - return markFunction( function( seed, results, context, xml ) { - var temp, i, elem, - preMap = [], - postMap = [], - preexisting = results.length, - - // Get initial elements from seed or context - elems = seed || multipleContexts( - selector || "*", - context.nodeType ? [ context ] : context, - [] - ), - - // Prefilter to get matcher input, preserving a map for seed-results synchronization - matcherIn = preFilter && ( seed || !selector ) ? - condense( elems, preMap, preFilter, context, xml ) : - elems, - - matcherOut = matcher ? - - // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, - postFinder || ( seed ? preFilter : preexisting || postFilter ) ? - - // ...intermediate processing is necessary - [] : - - // ...otherwise use results directly - results : - matcherIn; - - // Find primary matches - if ( matcher ) { - matcher( matcherIn, matcherOut, context, xml ); - } - - // Apply postFilter - if ( postFilter ) { - temp = condense( matcherOut, postMap ); - postFilter( temp, [], context, xml ); - - // Un-match failing elements by moving them back to matcherIn - i = temp.length; - while ( i-- ) { - if ( ( elem = temp[ i ] ) ) { - matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); - } - } - } - - if ( seed ) { - if ( postFinder || preFilter ) { - if ( postFinder ) { - - // Get the final matcherOut by condensing this intermediate into postFinder contexts - temp = []; - i = matcherOut.length; - while ( i-- ) { - if ( ( elem = matcherOut[ i ] ) ) { - - // Restore matcherIn since elem is not yet a final match - temp.push( ( matcherIn[ i ] = elem ) ); - } - } - postFinder( null, ( matcherOut = [] ), temp, xml ); - } - - // Move matched elements from seed to results to keep them synchronized - i = matcherOut.length; - while ( i-- ) { - if ( ( elem = matcherOut[ i ] ) && - ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) { - - seed[ temp ] = !( results[ temp ] = elem ); - } - } - } - - // Add elements to results, through postFinder if defined - } else { - matcherOut = condense( - matcherOut === results ? - matcherOut.splice( preexisting, matcherOut.length ) : - matcherOut - ); - if ( postFinder ) { - postFinder( null, results, matcherOut, xml ); - } else { - push.apply( results, matcherOut ); - } - } - } ); -} - -function matcherFromTokens( tokens ) { - var checkContext, matcher, j, - len = tokens.length, - leadingRelative = Expr.relative[ tokens[ 0 ].type ], - implicitRelative = leadingRelative || Expr.relative[ " " ], - i = leadingRelative ? 1 : 0, - - // The foundational matcher ensures that elements are reachable from top-level context(s) - matchContext = addCombinator( function( elem ) { - return elem === checkContext; - }, implicitRelative, true ), - matchAnyContext = addCombinator( function( elem ) { - return indexOf( checkContext, elem ) > -1; - }, implicitRelative, true ), - matchers = [ function( elem, context, xml ) { - var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( - ( checkContext = context ).nodeType ? - matchContext( elem, context, xml ) : - matchAnyContext( elem, context, xml ) ); - - // Avoid hanging onto element (issue #299) - checkContext = null; - return ret; - } ]; - - for ( ; i < len; i++ ) { - if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { - matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; - } else { - matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); - - // Return special upon seeing a positional matcher - if ( matcher[ expando ] ) { - - // Find the next relative operator (if any) for proper handling - j = ++i; - for ( ; j < len; j++ ) { - if ( Expr.relative[ tokens[ j ].type ] ) { - break; - } - } - return setMatcher( - i > 1 && elementMatcher( matchers ), - i > 1 && toSelector( - - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens - .slice( 0, i - 1 ) - .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) - ).replace( rtrim, "$1" ), - matcher, - i < j && matcherFromTokens( tokens.slice( i, j ) ), - j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), - j < len && toSelector( tokens ) - ); - } - matchers.push( matcher ); - } - } - - return elementMatcher( matchers ); -} - -function matcherFromGroupMatchers( elementMatchers, setMatchers ) { - var bySet = setMatchers.length > 0, - byElement = elementMatchers.length > 0, - superMatcher = function( seed, context, xml, results, outermost ) { - var elem, j, matcher, - matchedCount = 0, - i = "0", - unmatched = seed && [], - setMatched = [], - contextBackup = outermostContext, - - // We must always have either seed elements or outermost context - elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ), - - // Use integer dirruns iff this is the outermost matcher - dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), - len = elems.length; - - if ( outermost ) { - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - outermostContext = context == document || context || outermost; - } - - // Add elements passing elementMatchers directly to results - // Support: IE<9, Safari - // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id - for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { - if ( byElement && elem ) { - j = 0; - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( !context && elem.ownerDocument != document ) { - setDocument( elem ); - xml = !documentIsHTML; - } - while ( ( matcher = elementMatchers[ j++ ] ) ) { - if ( matcher( elem, context || document, xml ) ) { - results.push( elem ); - break; - } - } - if ( outermost ) { - dirruns = dirrunsUnique; - } - } - - // Track unmatched elements for set filters - if ( bySet ) { - - // They will have gone through all possible matchers - if ( ( elem = !matcher && elem ) ) { - matchedCount--; - } - - // Lengthen the array for every element, matched or not - if ( seed ) { - unmatched.push( elem ); - } - } - } - - // `i` is now the count of elements visited above, and adding it to `matchedCount` - // makes the latter nonnegative. - matchedCount += i; - - // Apply set filters to unmatched elements - // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` - // equals `i`), unless we didn't visit _any_ elements in the above loop because we have - // no element matchers and no seed. - // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that - // case, which will result in a "00" `matchedCount` that differs from `i` but is also - // numerically zero. - if ( bySet && i !== matchedCount ) { - j = 0; - while ( ( matcher = setMatchers[ j++ ] ) ) { - matcher( unmatched, setMatched, context, xml ); - } - - if ( seed ) { - - // Reintegrate element matches to eliminate the need for sorting - if ( matchedCount > 0 ) { - while ( i-- ) { - if ( !( unmatched[ i ] || setMatched[ i ] ) ) { - setMatched[ i ] = pop.call( results ); - } - } - } - - // Discard index placeholder values to get only actual matches - setMatched = condense( setMatched ); - } - - // Add matches to results - push.apply( results, setMatched ); - - // Seedless set matches succeeding multiple successful matchers stipulate sorting - if ( outermost && !seed && setMatched.length > 0 && - ( matchedCount + setMatchers.length ) > 1 ) { - - Sizzle.uniqueSort( results ); - } - } - - // Override manipulation of globals by nested matchers - if ( outermost ) { - dirruns = dirrunsUnique; - outermostContext = contextBackup; - } - - return unmatched; - }; - - return bySet ? - markFunction( superMatcher ) : - superMatcher; -} - -compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { - var i, - setMatchers = [], - elementMatchers = [], - cached = compilerCache[ selector + " " ]; - - if ( !cached ) { - - // Generate a function of recursive functions that can be used to check each element - if ( !match ) { - match = tokenize( selector ); - } - i = match.length; - while ( i-- ) { - cached = matcherFromTokens( match[ i ] ); - if ( cached[ expando ] ) { - setMatchers.push( cached ); - } else { - elementMatchers.push( cached ); - } - } - - // Cache the compiled function - cached = compilerCache( - selector, - matcherFromGroupMatchers( elementMatchers, setMatchers ) - ); - - // Save selector and tokenization - cached.selector = selector; - } - return cached; -}; - -/** - * A low-level selection function that works with Sizzle's compiled - * selector functions - * @param {String|Function} selector A selector or a pre-compiled - * selector function built with Sizzle.compile - * @param {Element} context - * @param {Array} [results] - * @param {Array} [seed] A set of elements to match against - */ -select = Sizzle.select = function( selector, context, results, seed ) { - var i, tokens, token, type, find, - compiled = typeof selector === "function" && selector, - match = !seed && tokenize( ( selector = compiled.selector || selector ) ); - - results = results || []; - - // Try to minimize operations if there is only one selector in the list and no seed - // (the latter of which guarantees us context) - if ( match.length === 1 ) { - - // Reduce context if the leading compound selector is an ID - tokens = match[ 0 ] = match[ 0 ].slice( 0 ); - if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && - context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { - - context = ( Expr.find[ "ID" ]( token.matches[ 0 ] - .replace( runescape, funescape ), context ) || [] )[ 0 ]; - if ( !context ) { - return results; - - // Precompiled matchers will still verify ancestry, so step up a level - } else if ( compiled ) { - context = context.parentNode; - } - - selector = selector.slice( tokens.shift().value.length ); - } - - // Fetch a seed set for right-to-left matching - i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length; - while ( i-- ) { - token = tokens[ i ]; - - // Abort if we hit a combinator - if ( Expr.relative[ ( type = token.type ) ] ) { - break; - } - if ( ( find = Expr.find[ type ] ) ) { - - // Search, expanding context for leading sibling combinators - if ( ( seed = find( - token.matches[ 0 ].replace( runescape, funescape ), - rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) || - context - ) ) ) { - - // If seed is empty or no tokens remain, we can return early - tokens.splice( i, 1 ); - selector = seed.length && toSelector( tokens ); - if ( !selector ) { - push.apply( results, seed ); - return results; - } - - break; - } - } - } - } - - // Compile and execute a filtering function if one is not provided - // Provide `match` to avoid retokenization if we modified the selector above - ( compiled || compile( selector, match ) )( - seed, - context, - !documentIsHTML, - results, - !context || rsibling.test( selector ) && testContext( context.parentNode ) || context - ); - return results; -}; - -// One-time assignments - -// Sort stability -support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; - -// Support: Chrome 14-35+ -// Always assume duplicates if they aren't passed to the comparison function -support.detectDuplicates = !!hasDuplicate; - -// Initialize against the default document -setDocument(); - -// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) -// Detached nodes confoundingly follow *each other* -support.sortDetached = assert( function( el ) { - - // Should return 1, but returns 4 (following) - return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; -} ); - -// Support: IE<8 -// Prevent attribute/property "interpolation" -// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx -if ( !assert( function( el ) { - el.innerHTML = ""; - return el.firstChild.getAttribute( "href" ) === "#"; -} ) ) { - addHandle( "type|href|height|width", function( elem, name, isXML ) { - if ( !isXML ) { - return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); - } - } ); -} - -// Support: IE<9 -// Use defaultValue in place of getAttribute("value") -if ( !support.attributes || !assert( function( el ) { - el.innerHTML = ""; - el.firstChild.setAttribute( "value", "" ); - return el.firstChild.getAttribute( "value" ) === ""; -} ) ) { - addHandle( "value", function( elem, _name, isXML ) { - if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { - return elem.defaultValue; - } - } ); -} - -// Support: IE<9 -// Use getAttributeNode to fetch booleans when getAttribute lies -if ( !assert( function( el ) { - return el.getAttribute( "disabled" ) == null; -} ) ) { - addHandle( booleans, function( elem, name, isXML ) { - var val; - if ( !isXML ) { - return elem[ name ] === true ? name.toLowerCase() : - ( val = elem.getAttributeNode( name ) ) && val.specified ? - val.value : - null; - } - } ); -} - -return Sizzle; - -} )( window ); - - - -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; - -// Deprecated -jQuery.expr[ ":" ] = jQuery.expr.pseudos; -jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; -jQuery.escapeSelector = Sizzle.escape; - - - - -var dir = function( elem, dir, until ) { - var matched = [], - truncate = until !== undefined; - - while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { - if ( elem.nodeType === 1 ) { - if ( truncate && jQuery( elem ).is( until ) ) { - break; - } - matched.push( elem ); - } - } - return matched; -}; - - -var siblings = function( n, elem ) { - var matched = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - matched.push( n ); - } - } - - return matched; -}; - - -var rneedsContext = jQuery.expr.match.needsContext; - - - -function nodeName( elem, name ) { - - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - -}; -var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); - - - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, not ) { - if ( isFunction( qualifier ) ) { - return jQuery.grep( elements, function( elem, i ) { - return !!qualifier.call( elem, i, elem ) !== not; - } ); - } - - // Single element - if ( qualifier.nodeType ) { - return jQuery.grep( elements, function( elem ) { - return ( elem === qualifier ) !== not; - } ); - } - - // Arraylike of elements (jQuery, arguments, Array) - if ( typeof qualifier !== "string" ) { - return jQuery.grep( elements, function( elem ) { - return ( indexOf.call( qualifier, elem ) > -1 ) !== not; - } ); - } - - // Filtered directly for both simple and complex selectors - return jQuery.filter( qualifier, elements, not ); -} - -jQuery.filter = function( expr, elems, not ) { - var elem = elems[ 0 ]; - - if ( not ) { - expr = ":not(" + expr + ")"; - } - - if ( elems.length === 1 && elem.nodeType === 1 ) { - return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; - } - - return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { - return elem.nodeType === 1; - } ) ); -}; - -jQuery.fn.extend( { - find: function( selector ) { - var i, ret, - len = this.length, - self = this; - - if ( typeof selector !== "string" ) { - return this.pushStack( jQuery( selector ).filter( function() { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - } ) ); - } - - ret = this.pushStack( [] ); - - for ( i = 0; i < len; i++ ) { - jQuery.find( selector, self[ i ], ret ); - } - - return len > 1 ? jQuery.uniqueSort( ret ) : ret; - }, - filter: function( selector ) { - return this.pushStack( winnow( this, selector || [], false ) ); - }, - not: function( selector ) { - return this.pushStack( winnow( this, selector || [], true ) ); - }, - is: function( selector ) { - return !!winnow( - this, - - // If this is a positional/relative selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - typeof selector === "string" && rneedsContext.test( selector ) ? - jQuery( selector ) : - selector || [], - false - ).length; - } -} ); - - -// Initialize a jQuery object - - -// A central reference to the root jQuery(document) -var rootjQuery, - - // A simple way to check for HTML strings - // Prioritize #id over to avoid XSS via location.hash (#9521) - // Strict HTML recognition (#11290: must start with <) - // Shortcut simple #id case for speed - rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, - - init = jQuery.fn.init = function( selector, context, root ) { - var match, elem; - - // HANDLE: $(""), $(null), $(undefined), $(false) - if ( !selector ) { - return this; - } - - // Method init() accepts an alternate rootjQuery - // so migrate can support jQuery.sub (gh-2101) - root = root || rootjQuery; - - // Handle HTML strings - if ( typeof selector === "string" ) { - if ( selector[ 0 ] === "<" && - selector[ selector.length - 1 ] === ">" && - selector.length >= 3 ) { - - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = rquickExpr.exec( selector ); - } - - // Match html or make sure no context is specified for #id - if ( match && ( match[ 1 ] || !context ) ) { - - // HANDLE: $(html) -> $(array) - if ( match[ 1 ] ) { - context = context instanceof jQuery ? context[ 0 ] : context; - - // Option to run scripts is true for back-compat - // Intentionally let the error be thrown if parseHTML is not present - jQuery.merge( this, jQuery.parseHTML( - match[ 1 ], - context && context.nodeType ? context.ownerDocument || context : document, - true - ) ); - - // HANDLE: $(html, props) - if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { - for ( match in context ) { - - // Properties of context are called as methods if possible - if ( isFunction( this[ match ] ) ) { - this[ match ]( context[ match ] ); - - // ...and otherwise set as attributes - } else { - this.attr( match, context[ match ] ); - } - } - } - - return this; - - // HANDLE: $(#id) - } else { - elem = document.getElementById( match[ 2 ] ); - - if ( elem ) { - - // Inject the element directly into the jQuery object - this[ 0 ] = elem; - this.length = 1; - } - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return ( context || root ).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(DOMElement) - } else if ( selector.nodeType ) { - this[ 0 ] = selector; - this.length = 1; - return this; - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( isFunction( selector ) ) { - return root.ready !== undefined ? - root.ready( selector ) : - - // Execute immediately if ready is not present - selector( jQuery ); - } - - return jQuery.makeArray( selector, this ); - }; - -// Give the init function the jQuery prototype for later instantiation -init.prototype = jQuery.fn; - -// Initialize central reference -rootjQuery = jQuery( document ); - - -var rparentsprev = /^(?:parents|prev(?:Until|All))/, - - // Methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - -jQuery.fn.extend( { - has: function( target ) { - var targets = jQuery( target, this ), - l = targets.length; - - return this.filter( function() { - var i = 0; - for ( ; i < l; i++ ) { - if ( jQuery.contains( this, targets[ i ] ) ) { - return true; - } - } - } ); - }, - - closest: function( selectors, context ) { - var cur, - i = 0, - l = this.length, - matched = [], - targets = typeof selectors !== "string" && jQuery( selectors ); - - // Positional selectors never match, since there's no _selection_ context - if ( !rneedsContext.test( selectors ) ) { - for ( ; i < l; i++ ) { - for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { - - // Always skip document fragments - if ( cur.nodeType < 11 && ( targets ? - targets.index( cur ) > -1 : - - // Don't pass non-elements to Sizzle - cur.nodeType === 1 && - jQuery.find.matchesSelector( cur, selectors ) ) ) { - - matched.push( cur ); - break; - } - } - } - } - - return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); - }, - - // Determine the position of an element within the set - index: function( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; - } - - // Index in selector - if ( typeof elem === "string" ) { - return indexOf.call( jQuery( elem ), this[ 0 ] ); - } - - // Locate the position of the desired element - return indexOf.call( this, - - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[ 0 ] : elem - ); - }, - - add: function( selector, context ) { - return this.pushStack( - jQuery.uniqueSort( - jQuery.merge( this.get(), jQuery( selector, context ) ) - ) - ); - }, - - addBack: function( selector ) { - return this.add( selector == null ? - this.prevObject : this.prevObject.filter( selector ) - ); - } -} ); - -function sibling( cur, dir ) { - while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} - return cur; -} - -jQuery.each( { - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, _i, until ) { - return dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return sibling( elem, "nextSibling" ); - }, - prev: function( elem ) { - return sibling( elem, "previousSibling" ); - }, - nextAll: function( elem ) { - return dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, _i, until ) { - return dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, _i, until ) { - return dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return siblings( ( elem.parentNode || {} ).firstChild, elem ); - }, - children: function( elem ) { - return siblings( elem.firstChild ); - }, - contents: function( elem ) { - if ( elem.contentDocument != null && - - // Support: IE 11+ - // elements with no `data` attribute has an object - // `contentDocument` with a `null` prototype. - getProto( elem.contentDocument ) ) { - - return elem.contentDocument; - } - - // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only - // Treat the template element as a regular one in browsers that - // don't support it. - if ( nodeName( elem, "template" ) ) { - elem = elem.content || elem; - } - - return jQuery.merge( [], elem.childNodes ); - } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var matched = jQuery.map( this, fn, until ); - - if ( name.slice( -5 ) !== "Until" ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - matched = jQuery.filter( selector, matched ); - } - - if ( this.length > 1 ) { - - // Remove duplicates - if ( !guaranteedUnique[ name ] ) { - jQuery.uniqueSort( matched ); - } - - // Reverse order for parents* and prev-derivatives - if ( rparentsprev.test( name ) ) { - matched.reverse(); - } - } - - return this.pushStack( matched ); - }; -} ); -var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); - - - -// Convert String-formatted options into Object-formatted ones -function createOptions( options ) { - var object = {}; - jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { - object[ flag ] = true; - } ); - return object; -} - -/* - * Create a callback list using the following parameters: - * - * options: an optional list of space-separated options that will change how - * the callback list behaves or a more traditional option object - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible options: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ -jQuery.Callbacks = function( options ) { - - // Convert options from String-formatted to Object-formatted if needed - // (we check in cache first) - options = typeof options === "string" ? - createOptions( options ) : - jQuery.extend( {}, options ); - - var // Flag to know if list is currently firing - firing, - - // Last fire value for non-forgettable lists - memory, - - // Flag to know if list was already fired - fired, - - // Flag to prevent firing - locked, - - // Actual callback list - list = [], - - // Queue of execution data for repeatable lists - queue = [], - - // Index of currently firing callback (modified by add/remove as needed) - firingIndex = -1, - - // Fire callbacks - fire = function() { - - // Enforce single-firing - locked = locked || options.once; - - // Execute callbacks for all pending executions, - // respecting firingIndex overrides and runtime changes - fired = firing = true; - for ( ; queue.length; firingIndex = -1 ) { - memory = queue.shift(); - while ( ++firingIndex < list.length ) { - - // Run callback and check for early termination - if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && - options.stopOnFalse ) { - - // Jump to end and forget the data so .add doesn't re-fire - firingIndex = list.length; - memory = false; - } - } - } - - // Forget the data if we're done with it - if ( !options.memory ) { - memory = false; - } - - firing = false; - - // Clean up if we're done firing for good - if ( locked ) { - - // Keep an empty list if we have data for future add calls - if ( memory ) { - list = []; - - // Otherwise, this object is spent - } else { - list = ""; - } - } - }, - - // Actual Callbacks object - self = { - - // Add a callback or a collection of callbacks to the list - add: function() { - if ( list ) { - - // If we have memory from a past run, we should fire after adding - if ( memory && !firing ) { - firingIndex = list.length - 1; - queue.push( memory ); - } - - ( function add( args ) { - jQuery.each( args, function( _, arg ) { - if ( isFunction( arg ) ) { - if ( !options.unique || !self.has( arg ) ) { - list.push( arg ); - } - } else if ( arg && arg.length && toType( arg ) !== "string" ) { - - // Inspect recursively - add( arg ); - } - } ); - } )( arguments ); - - if ( memory && !firing ) { - fire(); - } - } - return this; - }, - - // Remove a callback from the list - remove: function() { - jQuery.each( arguments, function( _, arg ) { - var index; - while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { - list.splice( index, 1 ); - - // Handle firing indexes - if ( index <= firingIndex ) { - firingIndex--; - } - } - } ); - return this; - }, - - // Check if a given callback is in the list. - // If no argument is given, return whether or not list has callbacks attached. - has: function( fn ) { - return fn ? - jQuery.inArray( fn, list ) > -1 : - list.length > 0; - }, - - // Remove all callbacks from the list - empty: function() { - if ( list ) { - list = []; - } - return this; - }, - - // Disable .fire and .add - // Abort any current/pending executions - // Clear all callbacks and values - disable: function() { - locked = queue = []; - list = memory = ""; - return this; - }, - disabled: function() { - return !list; - }, - - // Disable .fire - // Also disable .add unless we have memory (since it would have no effect) - // Abort any pending executions - lock: function() { - locked = queue = []; - if ( !memory && !firing ) { - list = memory = ""; - } - return this; - }, - locked: function() { - return !!locked; - }, - - // Call all callbacks with the given context and arguments - fireWith: function( context, args ) { - if ( !locked ) { - args = args || []; - args = [ context, args.slice ? args.slice() : args ]; - queue.push( args ); - if ( !firing ) { - fire(); - } - } - return this; - }, - - // Call all the callbacks with the given arguments - fire: function() { - self.fireWith( this, arguments ); - return this; - }, - - // To know if the callbacks have already been called at least once - fired: function() { - return !!fired; - } - }; - - return self; -}; - - -function Identity( v ) { - return v; -} -function Thrower( ex ) { - throw ex; -} - -function adoptValue( value, resolve, reject, noValue ) { - var method; - - try { - - // Check for promise aspect first to privilege synchronous behavior - if ( value && isFunction( ( method = value.promise ) ) ) { - method.call( value ).done( resolve ).fail( reject ); - - // Other thenables - } else if ( value && isFunction( ( method = value.then ) ) ) { - method.call( value, resolve, reject ); - - // Other non-thenables - } else { - - // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: - // * false: [ value ].slice( 0 ) => resolve( value ) - // * true: [ value ].slice( 1 ) => resolve() - resolve.apply( undefined, [ value ].slice( noValue ) ); - } - - // For Promises/A+, convert exceptions into rejections - // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in - // Deferred#then to conditionally suppress rejection. - } catch ( value ) { - - // Support: Android 4.0 only - // Strict mode functions invoked without .call/.apply get global-object context - reject.apply( undefined, [ value ] ); - } -} - -jQuery.extend( { - - Deferred: function( func ) { - var tuples = [ - - // action, add listener, callbacks, - // ... .then handlers, argument index, [final state] - [ "notify", "progress", jQuery.Callbacks( "memory" ), - jQuery.Callbacks( "memory" ), 2 ], - [ "resolve", "done", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 0, "resolved" ], - [ "reject", "fail", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 1, "rejected" ] - ], - state = "pending", - promise = { - state: function() { - return state; - }, - always: function() { - deferred.done( arguments ).fail( arguments ); - return this; - }, - "catch": function( fn ) { - return promise.then( null, fn ); - }, - - // Keep pipe for back-compat - pipe: function( /* fnDone, fnFail, fnProgress */ ) { - var fns = arguments; - - return jQuery.Deferred( function( newDefer ) { - jQuery.each( tuples, function( _i, tuple ) { - - // Map tuples (progress, done, fail) to arguments (done, fail, progress) - var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; - - // deferred.progress(function() { bind to newDefer or newDefer.notify }) - // deferred.done(function() { bind to newDefer or newDefer.resolve }) - // deferred.fail(function() { bind to newDefer or newDefer.reject }) - deferred[ tuple[ 1 ] ]( function() { - var returned = fn && fn.apply( this, arguments ); - if ( returned && isFunction( returned.promise ) ) { - returned.promise() - .progress( newDefer.notify ) - .done( newDefer.resolve ) - .fail( newDefer.reject ); - } else { - newDefer[ tuple[ 0 ] + "With" ]( - this, - fn ? [ returned ] : arguments - ); - } - } ); - } ); - fns = null; - } ).promise(); - }, - then: function( onFulfilled, onRejected, onProgress ) { - var maxDepth = 0; - function resolve( depth, deferred, handler, special ) { - return function() { - var that = this, - args = arguments, - mightThrow = function() { - var returned, then; - - // Support: Promises/A+ section 2.3.3.3.3 - // https://promisesaplus.com/#point-59 - // Ignore double-resolution attempts - if ( depth < maxDepth ) { - return; - } - - returned = handler.apply( that, args ); - - // Support: Promises/A+ section 2.3.1 - // https://promisesaplus.com/#point-48 - if ( returned === deferred.promise() ) { - throw new TypeError( "Thenable self-resolution" ); - } - - // Support: Promises/A+ sections 2.3.3.1, 3.5 - // https://promisesaplus.com/#point-54 - // https://promisesaplus.com/#point-75 - // Retrieve `then` only once - then = returned && - - // Support: Promises/A+ section 2.3.4 - // https://promisesaplus.com/#point-64 - // Only check objects and functions for thenability - ( typeof returned === "object" || - typeof returned === "function" ) && - returned.then; - - // Handle a returned thenable - if ( isFunction( then ) ) { - - // Special processors (notify) just wait for resolution - if ( special ) { - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ) - ); - - // Normal processors (resolve) also hook into progress - } else { - - // ...and disregard older resolution values - maxDepth++; - - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ), - resolve( maxDepth, deferred, Identity, - deferred.notifyWith ) - ); - } - - // Handle all other returned values - } else { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Identity ) { - that = undefined; - args = [ returned ]; - } - - // Process the value(s) - // Default process is resolve - ( special || deferred.resolveWith )( that, args ); - } - }, - - // Only normal processors (resolve) catch and reject exceptions - process = special ? - mightThrow : - function() { - try { - mightThrow(); - } catch ( e ) { - - if ( jQuery.Deferred.exceptionHook ) { - jQuery.Deferred.exceptionHook( e, - process.stackTrace ); - } - - // Support: Promises/A+ section 2.3.3.3.4.1 - // https://promisesaplus.com/#point-61 - // Ignore post-resolution exceptions - if ( depth + 1 >= maxDepth ) { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Thrower ) { - that = undefined; - args = [ e ]; - } - - deferred.rejectWith( that, args ); - } - } - }; - - // Support: Promises/A+ section 2.3.3.3.1 - // https://promisesaplus.com/#point-57 - // Re-resolve promises immediately to dodge false rejection from - // subsequent errors - if ( depth ) { - process(); - } else { - - // Call an optional hook to record the stack, in case of exception - // since it's otherwise lost when execution goes async - if ( jQuery.Deferred.getStackHook ) { - process.stackTrace = jQuery.Deferred.getStackHook(); - } - window.setTimeout( process ); - } - }; - } - - return jQuery.Deferred( function( newDefer ) { - - // progress_handlers.add( ... ) - tuples[ 0 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onProgress ) ? - onProgress : - Identity, - newDefer.notifyWith - ) - ); - - // fulfilled_handlers.add( ... ) - tuples[ 1 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onFulfilled ) ? - onFulfilled : - Identity - ) - ); - - // rejected_handlers.add( ... ) - tuples[ 2 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onRejected ) ? - onRejected : - Thrower - ) - ); - } ).promise(); - }, - - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - return obj != null ? jQuery.extend( obj, promise ) : promise; - } - }, - deferred = {}; - - // Add list-specific methods - jQuery.each( tuples, function( i, tuple ) { - var list = tuple[ 2 ], - stateString = tuple[ 5 ]; - - // promise.progress = list.add - // promise.done = list.add - // promise.fail = list.add - promise[ tuple[ 1 ] ] = list.add; - - // Handle state - if ( stateString ) { - list.add( - function() { - - // state = "resolved" (i.e., fulfilled) - // state = "rejected" - state = stateString; - }, - - // rejected_callbacks.disable - // fulfilled_callbacks.disable - tuples[ 3 - i ][ 2 ].disable, - - // rejected_handlers.disable - // fulfilled_handlers.disable - tuples[ 3 - i ][ 3 ].disable, - - // progress_callbacks.lock - tuples[ 0 ][ 2 ].lock, - - // progress_handlers.lock - tuples[ 0 ][ 3 ].lock - ); - } - - // progress_handlers.fire - // fulfilled_handlers.fire - // rejected_handlers.fire - list.add( tuple[ 3 ].fire ); - - // deferred.notify = function() { deferred.notifyWith(...) } - // deferred.resolve = function() { deferred.resolveWith(...) } - // deferred.reject = function() { deferred.rejectWith(...) } - deferred[ tuple[ 0 ] ] = function() { - deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); - return this; - }; - - // deferred.notifyWith = list.fireWith - // deferred.resolveWith = list.fireWith - // deferred.rejectWith = list.fireWith - deferred[ tuple[ 0 ] + "With" ] = list.fireWith; - } ); - - // Make the deferred a promise - promise.promise( deferred ); - - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function( singleValue ) { - var - - // count of uncompleted subordinates - remaining = arguments.length, - - // count of unprocessed arguments - i = remaining, - - // subordinate fulfillment data - resolveContexts = Array( i ), - resolveValues = slice.call( arguments ), - - // the master Deferred - master = jQuery.Deferred(), - - // subordinate callback factory - updateFunc = function( i ) { - return function( value ) { - resolveContexts[ i ] = this; - resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; - if ( !( --remaining ) ) { - master.resolveWith( resolveContexts, resolveValues ); - } - }; - }; - - // Single- and empty arguments are adopted like Promise.resolve - if ( remaining <= 1 ) { - adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, - !remaining ); - - // Use .then() to unwrap secondary thenables (cf. gh-3000) - if ( master.state() === "pending" || - isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { - - return master.then(); - } - } - - // Multiple arguments are aggregated like Promise.all array elements - while ( i-- ) { - adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); - } - - return master.promise(); - } -} ); - - -// These usually indicate a programmer mistake during development, -// warn about them ASAP rather than swallowing them by default. -var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; - -jQuery.Deferred.exceptionHook = function( error, stack ) { - - // Support: IE 8 - 9 only - // Console exists when dev tools are open, which can happen at any time - if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { - window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); - } -}; - - - - -jQuery.readyException = function( error ) { - window.setTimeout( function() { - throw error; - } ); -}; - - - - -// The deferred used on DOM ready -var readyList = jQuery.Deferred(); - -jQuery.fn.ready = function( fn ) { - - readyList - .then( fn ) - - // Wrap jQuery.readyException in a function so that the lookup - // happens at the time of error handling instead of callback - // registration. - .catch( function( error ) { - jQuery.readyException( error ); - } ); - - return this; -}; - -jQuery.extend( { - - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Handle when the DOM is ready - ready: function( wait ) { - - // Abort if there are pending holds or we're already ready - if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { - return; - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith( document, [ jQuery ] ); - } -} ); - -jQuery.ready.then = readyList.then; - -// The ready event handler and self cleanup method -function completed() { - document.removeEventListener( "DOMContentLoaded", completed ); - window.removeEventListener( "load", completed ); - jQuery.ready(); -} - -// Catch cases where $(document).ready() is called -// after the browser event has already occurred. -// Support: IE <=9 - 10 only -// Older IE sometimes signals "interactive" too soon -if ( document.readyState === "complete" || - ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { - - // Handle it asynchronously to allow scripts the opportunity to delay ready - window.setTimeout( jQuery.ready ); - -} else { - - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", completed ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", completed ); -} - - - - -// Multifunctional method to get and set values of a collection -// The value/s can optionally be executed if it's a function -var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { - var i = 0, - len = elems.length, - bulk = key == null; - - // Sets many values - if ( toType( key ) === "object" ) { - chainable = true; - for ( i in key ) { - access( elems, fn, i, key[ i ], true, emptyGet, raw ); - } - - // Sets one value - } else if ( value !== undefined ) { - chainable = true; - - if ( !isFunction( value ) ) { - raw = true; - } - - if ( bulk ) { - - // Bulk operations run against the entire set - if ( raw ) { - fn.call( elems, value ); - fn = null; - - // ...except when executing function values - } else { - bulk = fn; - fn = function( elem, _key, value ) { - return bulk.call( jQuery( elem ), value ); - }; - } - } - - if ( fn ) { - for ( ; i < len; i++ ) { - fn( - elems[ i ], key, raw ? - value : - value.call( elems[ i ], i, fn( elems[ i ], key ) ) - ); - } - } - } - - if ( chainable ) { - return elems; - } - - // Gets - if ( bulk ) { - return fn.call( elems ); - } - - return len ? fn( elems[ 0 ], key ) : emptyGet; -}; - - -// Matches dashed string for camelizing -var rmsPrefix = /^-ms-/, - rdashAlpha = /-([a-z])/g; - -// Used by camelCase as callback to replace() -function fcamelCase( _all, letter ) { - return letter.toUpperCase(); -} - -// Convert dashed to camelCase; used by the css and data modules -// Support: IE <=9 - 11, Edge 12 - 15 -// Microsoft forgot to hump their vendor prefix (#9572) -function camelCase( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); -} -var acceptData = function( owner ) { - - // Accepts only: - // - Node - // - Node.ELEMENT_NODE - // - Node.DOCUMENT_NODE - // - Object - // - Any - return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); -}; - - - - -function Data() { - this.expando = jQuery.expando + Data.uid++; -} - -Data.uid = 1; - -Data.prototype = { - - cache: function( owner ) { - - // Check if the owner object already has a cache - var value = owner[ this.expando ]; - - // If not, create one - if ( !value ) { - value = {}; - - // We can accept data for non-element nodes in modern browsers, - // but we should not, see #8335. - // Always return an empty object. - if ( acceptData( owner ) ) { - - // If it is a node unlikely to be stringify-ed or looped over - // use plain assignment - if ( owner.nodeType ) { - owner[ this.expando ] = value; - - // Otherwise secure it in a non-enumerable property - // configurable must be true to allow the property to be - // deleted when data is removed - } else { - Object.defineProperty( owner, this.expando, { - value: value, - configurable: true - } ); - } - } - } - - return value; - }, - set: function( owner, data, value ) { - var prop, - cache = this.cache( owner ); - - // Handle: [ owner, key, value ] args - // Always use camelCase key (gh-2257) - if ( typeof data === "string" ) { - cache[ camelCase( data ) ] = value; - - // Handle: [ owner, { properties } ] args - } else { - - // Copy the properties one-by-one to the cache object - for ( prop in data ) { - cache[ camelCase( prop ) ] = data[ prop ]; - } - } - return cache; - }, - get: function( owner, key ) { - return key === undefined ? - this.cache( owner ) : - - // Always use camelCase key (gh-2257) - owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; - }, - access: function( owner, key, value ) { - - // In cases where either: - // - // 1. No key was specified - // 2. A string key was specified, but no value provided - // - // Take the "read" path and allow the get method to determine - // which value to return, respectively either: - // - // 1. The entire cache object - // 2. The data stored at the key - // - if ( key === undefined || - ( ( key && typeof key === "string" ) && value === undefined ) ) { - - return this.get( owner, key ); - } - - // When the key is not a string, or both a key and value - // are specified, set or extend (existing objects) with either: - // - // 1. An object of properties - // 2. A key and value - // - this.set( owner, key, value ); - - // Since the "set" path can have two possible entry points - // return the expected data based on which path was taken[*] - return value !== undefined ? value : key; - }, - remove: function( owner, key ) { - var i, - cache = owner[ this.expando ]; - - if ( cache === undefined ) { - return; - } - - if ( key !== undefined ) { - - // Support array or space separated string of keys - if ( Array.isArray( key ) ) { - - // If key is an array of keys... - // We always set camelCase keys, so remove that. - key = key.map( camelCase ); - } else { - key = camelCase( key ); - - // If a key with the spaces exists, use it. - // Otherwise, create an array by matching non-whitespace - key = key in cache ? - [ key ] : - ( key.match( rnothtmlwhite ) || [] ); - } - - i = key.length; - - while ( i-- ) { - delete cache[ key[ i ] ]; - } - } - - // Remove the expando if there's no more data - if ( key === undefined || jQuery.isEmptyObject( cache ) ) { - - // Support: Chrome <=35 - 45 - // Webkit & Blink performance suffers when deleting properties - // from DOM nodes, so set to undefined instead - // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) - if ( owner.nodeType ) { - owner[ this.expando ] = undefined; - } else { - delete owner[ this.expando ]; - } - } - }, - hasData: function( owner ) { - var cache = owner[ this.expando ]; - return cache !== undefined && !jQuery.isEmptyObject( cache ); - } -}; -var dataPriv = new Data(); - -var dataUser = new Data(); - - - -// Implementation Summary -// -// 1. Enforce API surface and semantic compatibility with 1.9.x branch -// 2. Improve the module's maintainability by reducing the storage -// paths to a single mechanism. -// 3. Use the same single mechanism to support "private" and "user" data. -// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) -// 5. Avoid exposing implementation details on user objects (eg. expando properties) -// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 - -var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, - rmultiDash = /[A-Z]/g; - -function getData( data ) { - if ( data === "true" ) { - return true; - } - - if ( data === "false" ) { - return false; - } - - if ( data === "null" ) { - return null; - } - - // Only convert to a number if it doesn't change the string - if ( data === +data + "" ) { - return +data; - } - - if ( rbrace.test( data ) ) { - return JSON.parse( data ); - } - - return data; -} - -function dataAttr( elem, key, data ) { - var name; - - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = getData( data ); - } catch ( e ) {} - - // Make sure we set the data so it isn't changed later - dataUser.set( elem, key, data ); - } else { - data = undefined; - } - } - return data; -} - -jQuery.extend( { - hasData: function( elem ) { - return dataUser.hasData( elem ) || dataPriv.hasData( elem ); - }, - - data: function( elem, name, data ) { - return dataUser.access( elem, name, data ); - }, - - removeData: function( elem, name ) { - dataUser.remove( elem, name ); - }, - - // TODO: Now that all calls to _data and _removeData have been replaced - // with direct calls to dataPriv methods, these can be deprecated. - _data: function( elem, name, data ) { - return dataPriv.access( elem, name, data ); - }, - - _removeData: function( elem, name ) { - dataPriv.remove( elem, name ); - } -} ); - -jQuery.fn.extend( { - data: function( key, value ) { - var i, name, data, - elem = this[ 0 ], - attrs = elem && elem.attributes; - - // Gets all values - if ( key === undefined ) { - if ( this.length ) { - data = dataUser.get( elem ); - - if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { - i = attrs.length; - while ( i-- ) { - - // Support: IE 11 only - // The attrs elements can be null (#14894) - if ( attrs[ i ] ) { - name = attrs[ i ].name; - if ( name.indexOf( "data-" ) === 0 ) { - name = camelCase( name.slice( 5 ) ); - dataAttr( elem, name, data[ name ] ); - } - } - } - dataPriv.set( elem, "hasDataAttrs", true ); - } - } - - return data; - } - - // Sets multiple values - if ( typeof key === "object" ) { - return this.each( function() { - dataUser.set( this, key ); - } ); - } - - return access( this, function( value ) { - var data; - - // The calling jQuery object (element matches) is not empty - // (and therefore has an element appears at this[ 0 ]) and the - // `value` parameter was not undefined. An empty jQuery object - // will result in `undefined` for elem = this[ 0 ] which will - // throw an exception if an attempt to read a data cache is made. - if ( elem && value === undefined ) { - - // Attempt to get data from the cache - // The key will always be camelCased in Data - data = dataUser.get( elem, key ); - if ( data !== undefined ) { - return data; - } - - // Attempt to "discover" the data in - // HTML5 custom data-* attrs - data = dataAttr( elem, key ); - if ( data !== undefined ) { - return data; - } - - // We tried really hard, but the data doesn't exist. - return; - } - - // Set the data... - this.each( function() { - - // We always store the camelCased key - dataUser.set( this, key, value ); - } ); - }, null, value, arguments.length > 1, null, true ); - }, - - removeData: function( key ) { - return this.each( function() { - dataUser.remove( this, key ); - } ); - } -} ); - - -jQuery.extend( { - queue: function( elem, type, data ) { - var queue; - - if ( elem ) { - type = ( type || "fx" ) + "queue"; - queue = dataPriv.get( elem, type ); - - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !queue || Array.isArray( data ) ) { - queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); - } else { - queue.push( data ); - } - } - return queue || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - startLength = queue.length, - fn = queue.shift(), - hooks = jQuery._queueHooks( elem, type ), - next = function() { - jQuery.dequeue( elem, type ); - }; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - startLength--; - } - - if ( fn ) { - - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift( "inprogress" ); - } - - // Clear up the last queue stop function - delete hooks.stop; - fn.call( elem, next, hooks ); - } - - if ( !startLength && hooks ) { - hooks.empty.fire(); - } - }, - - // Not public - generate a queueHooks object, or return the current one - _queueHooks: function( elem, type ) { - var key = type + "queueHooks"; - return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { - empty: jQuery.Callbacks( "once memory" ).add( function() { - dataPriv.remove( elem, [ type + "queue", key ] ); - } ) - } ); - } -} ); - -jQuery.fn.extend( { - queue: function( type, data ) { - var setter = 2; - - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - setter--; - } - - if ( arguments.length < setter ) { - return jQuery.queue( this[ 0 ], type ); - } - - return data === undefined ? - this : - this.each( function() { - var queue = jQuery.queue( this, type, data ); - - // Ensure a hooks for this queue - jQuery._queueHooks( this, type ); - - if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - } ); - }, - dequeue: function( type ) { - return this.each( function() { - jQuery.dequeue( this, type ); - } ); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, obj ) { - var tmp, - count = 1, - defer = jQuery.Deferred(), - elements = this, - i = this.length, - resolve = function() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - }; - - if ( typeof type !== "string" ) { - obj = type; - type = undefined; - } - type = type || "fx"; - - while ( i-- ) { - tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); - if ( tmp && tmp.empty ) { - count++; - tmp.empty.add( resolve ); - } - } - resolve(); - return defer.promise( obj ); - } -} ); -var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; - -var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); - - -var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; - -var documentElement = document.documentElement; - - - - var isAttached = function( elem ) { - return jQuery.contains( elem.ownerDocument, elem ); - }, - composed = { composed: true }; - - // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only - // Check attachment across shadow DOM boundaries when possible (gh-3504) - // Support: iOS 10.0-10.2 only - // Early iOS 10 versions support `attachShadow` but not `getRootNode`, - // leading to errors. We need to check for `getRootNode`. - if ( documentElement.getRootNode ) { - isAttached = function( elem ) { - return jQuery.contains( elem.ownerDocument, elem ) || - elem.getRootNode( composed ) === elem.ownerDocument; - }; - } -var isHiddenWithinTree = function( elem, el ) { - - // isHiddenWithinTree might be called from jQuery#filter function; - // in that case, element will be second argument - elem = el || elem; - - // Inline style trumps all - return elem.style.display === "none" || - elem.style.display === "" && - - // Otherwise, check computed style - // Support: Firefox <=43 - 45 - // Disconnected elements can have computed display: none, so first confirm that elem is - // in the document. - isAttached( elem ) && - - jQuery.css( elem, "display" ) === "none"; - }; - - - -function adjustCSS( elem, prop, valueParts, tween ) { - var adjusted, scale, - maxIterations = 20, - currentValue = tween ? - function() { - return tween.cur(); - } : - function() { - return jQuery.css( elem, prop, "" ); - }, - initial = currentValue(), - unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), - - // Starting value computation is required for potential unit mismatches - initialInUnit = elem.nodeType && - ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && - rcssNum.exec( jQuery.css( elem, prop ) ); - - if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { - - // Support: Firefox <=54 - // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) - initial = initial / 2; - - // Trust units reported by jQuery.css - unit = unit || initialInUnit[ 3 ]; - - // Iteratively approximate from a nonzero starting point - initialInUnit = +initial || 1; - - while ( maxIterations-- ) { - - // Evaluate and update our best guess (doubling guesses that zero out). - // Finish if the scale equals or crosses 1 (making the old*new product non-positive). - jQuery.style( elem, prop, initialInUnit + unit ); - if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { - maxIterations = 0; - } - initialInUnit = initialInUnit / scale; - - } - - initialInUnit = initialInUnit * 2; - jQuery.style( elem, prop, initialInUnit + unit ); - - // Make sure we update the tween properties later on - valueParts = valueParts || []; - } - - if ( valueParts ) { - initialInUnit = +initialInUnit || +initial || 0; - - // Apply relative offset (+=/-=) if specified - adjusted = valueParts[ 1 ] ? - initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : - +valueParts[ 2 ]; - if ( tween ) { - tween.unit = unit; - tween.start = initialInUnit; - tween.end = adjusted; - } - } - return adjusted; -} - - -var defaultDisplayMap = {}; - -function getDefaultDisplay( elem ) { - var temp, - doc = elem.ownerDocument, - nodeName = elem.nodeName, - display = defaultDisplayMap[ nodeName ]; - - if ( display ) { - return display; - } - - temp = doc.body.appendChild( doc.createElement( nodeName ) ); - display = jQuery.css( temp, "display" ); - - temp.parentNode.removeChild( temp ); - - if ( display === "none" ) { - display = "block"; - } - defaultDisplayMap[ nodeName ] = display; - - return display; -} - -function showHide( elements, show ) { - var display, elem, - values = [], - index = 0, - length = elements.length; - - // Determine new display value for elements that need to change - for ( ; index < length; index++ ) { - elem = elements[ index ]; - if ( !elem.style ) { - continue; - } - - display = elem.style.display; - if ( show ) { - - // Since we force visibility upon cascade-hidden elements, an immediate (and slow) - // check is required in this first loop unless we have a nonempty display value (either - // inline or about-to-be-restored) - if ( display === "none" ) { - values[ index ] = dataPriv.get( elem, "display" ) || null; - if ( !values[ index ] ) { - elem.style.display = ""; - } - } - if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { - values[ index ] = getDefaultDisplay( elem ); - } - } else { - if ( display !== "none" ) { - values[ index ] = "none"; - - // Remember what we're overwriting - dataPriv.set( elem, "display", display ); - } - } - } - - // Set the display of the elements in a second loop to avoid constant reflow - for ( index = 0; index < length; index++ ) { - if ( values[ index ] != null ) { - elements[ index ].style.display = values[ index ]; - } - } - - return elements; -} - -jQuery.fn.extend( { - show: function() { - return showHide( this, true ); - }, - hide: function() { - return showHide( this ); - }, - toggle: function( state ) { - if ( typeof state === "boolean" ) { - return state ? this.show() : this.hide(); - } - - return this.each( function() { - if ( isHiddenWithinTree( this ) ) { - jQuery( this ).show(); - } else { - jQuery( this ).hide(); - } - } ); - } -} ); -var rcheckableType = ( /^(?:checkbox|radio)$/i ); - -var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); - -var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); - - - -( function() { - var fragment = document.createDocumentFragment(), - div = fragment.appendChild( document.createElement( "div" ) ), - input = document.createElement( "input" ); - - // Support: Android 4.0 - 4.3 only - // Check state lost if the name is set (#11217) - // Support: Windows Web Apps (WWA) - // `name` and `type` must use .setAttribute for WWA (#14901) - input.setAttribute( "type", "radio" ); - input.setAttribute( "checked", "checked" ); - input.setAttribute( "name", "t" ); - - div.appendChild( input ); - - // Support: Android <=4.1 only - // Older WebKit doesn't clone checked state correctly in fragments - support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Support: IE <=11 only - // Make sure textarea (and checkbox) defaultValue is properly cloned - div.innerHTML = ""; - support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; - - // Support: IE <=9 only - // IE <=9 replaces "; - support.option = !!div.lastChild; -} )(); - - -// We have to close these tags to support XHTML (#13200) -var wrapMap = { - - // XHTML parsers do not magically insert elements in the - // same way that tag soup parsers do. So we cannot shorten - // this by omitting or other required elements. - thead: [ 1, "", "
" ], - col: [ 2, "", "
" ], - tr: [ 2, "", "
" ], - td: [ 3, "", "
" ], - - _default: [ 0, "", "" ] -}; - -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - -// Support: IE <=9 only -if ( !support.option ) { - wrapMap.optgroup = wrapMap.option = [ 1, "" ]; -} - - -function getAll( context, tag ) { - - // Support: IE <=9 - 11 only - // Use typeof to avoid zero-argument method invocation on host objects (#15151) - var ret; - - if ( typeof context.getElementsByTagName !== "undefined" ) { - ret = context.getElementsByTagName( tag || "*" ); - - } else if ( typeof context.querySelectorAll !== "undefined" ) { - ret = context.querySelectorAll( tag || "*" ); - - } else { - ret = []; - } - - if ( tag === undefined || tag && nodeName( context, tag ) ) { - return jQuery.merge( [ context ], ret ); - } - - return ret; -} - - -// Mark scripts as having already been evaluated -function setGlobalEval( elems, refElements ) { - var i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - dataPriv.set( - elems[ i ], - "globalEval", - !refElements || dataPriv.get( refElements[ i ], "globalEval" ) - ); - } -} - - -var rhtml = /<|&#?\w+;/; - -function buildFragment( elems, context, scripts, selection, ignored ) { - var elem, tmp, tag, wrap, attached, j, - fragment = context.createDocumentFragment(), - nodes = [], - i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - elem = elems[ i ]; - - if ( elem || elem === 0 ) { - - // Add nodes directly - if ( toType( elem ) === "object" ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); - - // Convert non-html into a text node - } else if ( !rhtml.test( elem ) ) { - nodes.push( context.createTextNode( elem ) ); - - // Convert html into DOM nodes - } else { - tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); - - // Deserialize a standard representation - tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); - wrap = wrapMap[ tag ] || wrapMap._default; - tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; - - // Descend through wrappers to the right content - j = wrap[ 0 ]; - while ( j-- ) { - tmp = tmp.lastChild; - } - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, tmp.childNodes ); - - // Remember the top-level container - tmp = fragment.firstChild; - - // Ensure the created nodes are orphaned (#12392) - tmp.textContent = ""; - } - } - } - - // Remove wrapper from fragment - fragment.textContent = ""; - - i = 0; - while ( ( elem = nodes[ i++ ] ) ) { - - // Skip elements already in the context collection (trac-4087) - if ( selection && jQuery.inArray( elem, selection ) > -1 ) { - if ( ignored ) { - ignored.push( elem ); - } - continue; - } - - attached = isAttached( elem ); - - // Append to fragment - tmp = getAll( fragment.appendChild( elem ), "script" ); - - // Preserve script evaluation history - if ( attached ) { - setGlobalEval( tmp ); - } - - // Capture executables - if ( scripts ) { - j = 0; - while ( ( elem = tmp[ j++ ] ) ) { - if ( rscriptType.test( elem.type || "" ) ) { - scripts.push( elem ); - } - } - } - } - - return fragment; -} - - -var - rkeyEvent = /^key/, - rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, - rtypenamespace = /^([^.]*)(?:\.(.+)|)/; - -function returnTrue() { - return true; -} - -function returnFalse() { - return false; -} - -// Support: IE <=9 - 11+ -// focus() and blur() are asynchronous, except when they are no-op. -// So expect focus to be synchronous when the element is already active, -// and blur to be synchronous when the element is not already active. -// (focus and blur are always synchronous in other supported browsers, -// this just defines when we can count on it). -function expectSync( elem, type ) { - return ( elem === safeActiveElement() ) === ( type === "focus" ); -} - -// Support: IE <=9 only -// Accessing document.activeElement can throw unexpectedly -// https://bugs.jquery.com/ticket/13393 -function safeActiveElement() { - try { - return document.activeElement; - } catch ( err ) { } -} - -function on( elem, types, selector, data, fn, one ) { - var origFn, type; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { - - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for ( type in types ) { - on( elem, type, selector, data, types[ type ], one ); - } - return elem; - } - - if ( data == null && fn == null ) { - - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return elem; - } - - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return elem.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - } ); -} - -/* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ -jQuery.event = { - - global: {}, - - add: function( elem, types, handler, data, selector ) { - - var handleObjIn, eventHandle, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.get( elem ); - - // Only attach events to objects that accept data - if ( !acceptData( elem ) ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Ensure that invalid selectors throw exceptions at attach time - // Evaluate against documentElement in case elem is a non-element node (e.g., document) - if ( selector ) { - jQuery.find.matchesSelector( documentElement, selector ); - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - if ( !( events = elemData.events ) ) { - events = elemData.events = Object.create( null ); - } - if ( !( eventHandle = elemData.handle ) ) { - eventHandle = elemData.handle = function( e ) { - - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? - jQuery.event.dispatch.apply( elem, arguments ) : undefined; - }; - } - - // Handle multiple events separated by a space - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // There *must* be a type, no attaching namespace-only handlers - if ( !type ) { - continue; - } - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; - - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend( { - type: type, - origType: origType, - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - needsContext: selector && jQuery.expr.match.needsContext.test( selector ), - namespace: namespaces.join( "." ) - }, handleObjIn ); - - // Init the event handler queue if we're the first - if ( !( handlers = events[ type ] ) ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; - - // Only use addEventListener if the special events handler returns false - if ( !special.setup || - special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - }, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, selector, mappedTypes ) { - - var j, origCount, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); - - if ( !elemData || !( events = elemData.events ) ) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); - } - continue; - } - - special = jQuery.event.special[ type ] || {}; - type = ( selector ? special.delegateType : special.bindType ) || type; - handlers = events[ type ] || []; - tmp = tmp[ 2 ] && - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); - - // Remove matching events - origCount = j = handlers.length; - while ( j-- ) { - handleObj = handlers[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !tmp || tmp.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || - selector === "**" && handleObj.selector ) ) { - handlers.splice( j, 1 ); - - if ( handleObj.selector ) { - handlers.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( origCount && !handlers.length ) { - if ( !special.teardown || - special.teardown.call( elem, namespaces, elemData.handle ) === false ) { - - jQuery.removeEvent( elem, type, elemData.handle ); - } - - delete events[ type ]; - } - } - - // Remove data and the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - dataPriv.remove( elem, "handle events" ); - } - }, - - dispatch: function( nativeEvent ) { - - var i, j, ret, matched, handleObj, handlerQueue, - args = new Array( arguments.length ), - - // Make a writable jQuery.Event from the native event object - event = jQuery.event.fix( nativeEvent ), - - handlers = ( - dataPriv.get( this, "events" ) || Object.create( null ) - )[ event.type ] || [], - special = jQuery.event.special[ event.type ] || {}; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[ 0 ] = event; - - for ( i = 1; i < arguments.length; i++ ) { - args[ i ] = arguments[ i ]; - } - - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { - return; - } - - // Determine handlers - handlerQueue = jQuery.event.handlers.call( this, event, handlers ); - - // Run delegates first; they may want to stop propagation beneath us - i = 0; - while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { - event.currentTarget = matched.elem; - - j = 0; - while ( ( handleObj = matched.handlers[ j++ ] ) && - !event.isImmediatePropagationStopped() ) { - - // If the event is namespaced, then each handler is only invoked if it is - // specially universal or its namespaces are a superset of the event's. - if ( !event.rnamespace || handleObj.namespace === false || - event.rnamespace.test( handleObj.namespace ) ) { - - event.handleObj = handleObj; - event.data = handleObj.data; - - ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || - handleObj.handler ).apply( matched.elem, args ); - - if ( ret !== undefined ) { - if ( ( event.result = ret ) === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if ( special.postDispatch ) { - special.postDispatch.call( this, event ); - } - - return event.result; - }, - - handlers: function( event, handlers ) { - var i, handleObj, sel, matchedHandlers, matchedSelectors, - handlerQueue = [], - delegateCount = handlers.delegateCount, - cur = event.target; - - // Find delegate handlers - if ( delegateCount && - - // Support: IE <=9 - // Black-hole SVG instance trees (trac-13180) - cur.nodeType && - - // Support: Firefox <=42 - // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) - // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click - // Support: IE 11 only - // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) - !( event.type === "click" && event.button >= 1 ) ) { - - for ( ; cur !== this; cur = cur.parentNode || this ) { - - // Don't check non-elements (#13208) - // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) - if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { - matchedHandlers = []; - matchedSelectors = {}; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - - // Don't conflict with Object.prototype properties (#13203) - sel = handleObj.selector + " "; - - if ( matchedSelectors[ sel ] === undefined ) { - matchedSelectors[ sel ] = handleObj.needsContext ? - jQuery( sel, this ).index( cur ) > -1 : - jQuery.find( sel, this, null, [ cur ] ).length; - } - if ( matchedSelectors[ sel ] ) { - matchedHandlers.push( handleObj ); - } - } - if ( matchedHandlers.length ) { - handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); - } - } - } - } - - // Add the remaining (directly-bound) handlers - cur = this; - if ( delegateCount < handlers.length ) { - handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); - } - - return handlerQueue; - }, - - addProp: function( name, hook ) { - Object.defineProperty( jQuery.Event.prototype, name, { - enumerable: true, - configurable: true, - - get: isFunction( hook ) ? - function() { - if ( this.originalEvent ) { - return hook( this.originalEvent ); - } - } : - function() { - if ( this.originalEvent ) { - return this.originalEvent[ name ]; - } - }, - - set: function( value ) { - Object.defineProperty( this, name, { - enumerable: true, - configurable: true, - writable: true, - value: value - } ); - } - } ); - }, - - fix: function( originalEvent ) { - return originalEvent[ jQuery.expando ] ? - originalEvent : - new jQuery.Event( originalEvent ); - }, - - special: { - load: { - - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - click: { - - // Utilize native event to ensure correct state for checkable inputs - setup: function( data ) { - - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Claim the first handler - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, "input" ) ) { - - // dataPriv.set( el, "click", ... ) - leverageNative( el, "click", returnTrue ); - } - - // Return false to allow normal processing in the caller - return false; - }, - trigger: function( data ) { - - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Force setup before triggering a click - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, "input" ) ) { - - leverageNative( el, "click" ); - } - - // Return non-false to allow normal event-path propagation - return true; - }, - - // For cross-browser consistency, suppress native .click() on links - // Also prevent it if we're currently inside a leveraged native-event stack - _default: function( event ) { - var target = event.target; - return rcheckableType.test( target.type ) && - target.click && nodeName( target, "input" ) && - dataPriv.get( target, "click" ) || - nodeName( target, "a" ); - } - }, - - beforeunload: { - postDispatch: function( event ) { - - // Support: Firefox 20+ - // Firefox doesn't alert if the returnValue field is not set. - if ( event.result !== undefined && event.originalEvent ) { - event.originalEvent.returnValue = event.result; - } - } - } - } -}; - -// Ensure the presence of an event listener that handles manually-triggered -// synthetic events by interrupting progress until reinvoked in response to -// *native* events that it fires directly, ensuring that state changes have -// already occurred before other listeners are invoked. -function leverageNative( el, type, expectSync ) { - - // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add - if ( !expectSync ) { - if ( dataPriv.get( el, type ) === undefined ) { - jQuery.event.add( el, type, returnTrue ); - } - return; - } - - // Register the controller as a special universal handler for all event namespaces - dataPriv.set( el, type, false ); - jQuery.event.add( el, type, { - namespace: false, - handler: function( event ) { - var notAsync, result, - saved = dataPriv.get( this, type ); - - if ( ( event.isTrigger & 1 ) && this[ type ] ) { - - // Interrupt processing of the outer synthetic .trigger()ed event - // Saved data should be false in such cases, but might be a leftover capture object - // from an async native handler (gh-4350) - if ( !saved.length ) { - - // Store arguments for use when handling the inner native event - // There will always be at least one argument (an event object), so this array - // will not be confused with a leftover capture object. - saved = slice.call( arguments ); - dataPriv.set( this, type, saved ); - - // Trigger the native event and capture its result - // Support: IE <=9 - 11+ - // focus() and blur() are asynchronous - notAsync = expectSync( this, type ); - this[ type ](); - result = dataPriv.get( this, type ); - if ( saved !== result || notAsync ) { - dataPriv.set( this, type, false ); - } else { - result = {}; - } - if ( saved !== result ) { - - // Cancel the outer synthetic event - event.stopImmediatePropagation(); - event.preventDefault(); - return result.value; - } - - // If this is an inner synthetic event for an event with a bubbling surrogate - // (focus or blur), assume that the surrogate already propagated from triggering the - // native event and prevent that from happening again here. - // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the - // bubbling surrogate propagates *after* the non-bubbling base), but that seems - // less bad than duplication. - } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { - event.stopPropagation(); - } - - // If this is a native event triggered above, everything is now in order - // Fire an inner synthetic event with the original arguments - } else if ( saved.length ) { - - // ...and capture the result - dataPriv.set( this, type, { - value: jQuery.event.trigger( - - // Support: IE <=9 - 11+ - // Extend with the prototype to reset the above stopImmediatePropagation() - jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), - saved.slice( 1 ), - this - ) - } ); - - // Abort handling of the native event - event.stopImmediatePropagation(); - } - } - } ); -} - -jQuery.removeEvent = function( elem, type, handle ) { - - // This "if" is needed for plain objects - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle ); - } -}; - -jQuery.Event = function( src, props ) { - - // Allow instantiation without the 'new' keyword - if ( !( this instanceof jQuery.Event ) ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = src.defaultPrevented || - src.defaultPrevented === undefined && - - // Support: Android <=2.3 only - src.returnValue === false ? - returnTrue : - returnFalse; - - // Create target properties - // Support: Safari <=6 - 7 only - // Target should not be a text node (#504, #13143) - this.target = ( src.target && src.target.nodeType === 3 ) ? - src.target.parentNode : - src.target; - - this.currentTarget = src.currentTarget; - this.relatedTarget = src.relatedTarget; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || Date.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - constructor: jQuery.Event, - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse, - isSimulated: false, - - preventDefault: function() { - var e = this.originalEvent; - - this.isDefaultPrevented = returnTrue; - - if ( e && !this.isSimulated ) { - e.preventDefault(); - } - }, - stopPropagation: function() { - var e = this.originalEvent; - - this.isPropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopPropagation(); - } - }, - stopImmediatePropagation: function() { - var e = this.originalEvent; - - this.isImmediatePropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopImmediatePropagation(); - } - - this.stopPropagation(); - } -}; - -// Includes all common event props including KeyEvent and MouseEvent specific props -jQuery.each( { - altKey: true, - bubbles: true, - cancelable: true, - changedTouches: true, - ctrlKey: true, - detail: true, - eventPhase: true, - metaKey: true, - pageX: true, - pageY: true, - shiftKey: true, - view: true, - "char": true, - code: true, - charCode: true, - key: true, - keyCode: true, - button: true, - buttons: true, - clientX: true, - clientY: true, - offsetX: true, - offsetY: true, - pointerId: true, - pointerType: true, - screenX: true, - screenY: true, - targetTouches: true, - toElement: true, - touches: true, - - which: function( event ) { - var button = event.button; - - // Add which for key events - if ( event.which == null && rkeyEvent.test( event.type ) ) { - return event.charCode != null ? event.charCode : event.keyCode; - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { - if ( button & 1 ) { - return 1; - } - - if ( button & 2 ) { - return 3; - } - - if ( button & 4 ) { - return 2; - } - - return 0; - } - - return event.which; - } -}, jQuery.event.addProp ); - -jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { - jQuery.event.special[ type ] = { - - // Utilize native event if possible so blur/focus sequence is correct - setup: function() { - - // Claim the first handler - // dataPriv.set( this, "focus", ... ) - // dataPriv.set( this, "blur", ... ) - leverageNative( this, type, expectSync ); - - // Return false to allow normal processing in the caller - return false; - }, - trigger: function() { - - // Force setup before trigger - leverageNative( this, type ); - - // Return non-false to allow normal event-path propagation - return true; - }, - - delegateType: delegateType - }; -} ); - -// Create mouseenter/leave events using mouseover/out and event-time checks -// so that event delegation works in jQuery. -// Do the same for pointerenter/pointerleave and pointerover/pointerout -// -// Support: Safari 7 only -// Safari sends mouseenter too often; see: -// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 -// for the description of the bug (it existed in older Chrome versions as well). -jQuery.each( { - mouseenter: "mouseover", - mouseleave: "mouseout", - pointerenter: "pointerover", - pointerleave: "pointerout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function( event ) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - - // For mouseenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; -} ); - -jQuery.fn.extend( { - - on: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn ); - }, - one: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn, 1 ); - }, - off: function( types, selector, fn ) { - var handleObj, type; - if ( types && types.preventDefault && types.handleObj ) { - - // ( event ) dispatched jQuery.Event - handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace ? - handleObj.origType + "." + handleObj.namespace : - handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - - // ( types-object [, selector] ) - for ( type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { - - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each( function() { - jQuery.event.remove( this, types, fn, selector ); - } ); - } -} ); - - -var - - // Support: IE <=10 - 11, Edge 12 - 13 only - // In IE/Edge using regex groups here causes severe slowdowns. - // See https://connect.microsoft.com/IE/feedback/details/1736512/ - rnoInnerhtml = /\s*$/g; - -// Prefer a tbody over its parent table for containing new rows -function manipulationTarget( elem, content ) { - if ( nodeName( elem, "table" ) && - nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { - - return jQuery( elem ).children( "tbody" )[ 0 ] || elem; - } - - return elem; -} - -// Replace/restore the type attribute of script elements for safe DOM manipulation -function disableScript( elem ) { - elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; - return elem; -} -function restoreScript( elem ) { - if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { - elem.type = elem.type.slice( 5 ); - } else { - elem.removeAttribute( "type" ); - } - - return elem; -} - -function cloneCopyEvent( src, dest ) { - var i, l, type, pdataOld, udataOld, udataCur, events; - - if ( dest.nodeType !== 1 ) { - return; - } - - // 1. Copy private data: events, handlers, etc. - if ( dataPriv.hasData( src ) ) { - pdataOld = dataPriv.get( src ); - events = pdataOld.events; - - if ( events ) { - dataPriv.remove( dest, "handle events" ); - - for ( type in events ) { - for ( i = 0, l = events[ type ].length; i < l; i++ ) { - jQuery.event.add( dest, type, events[ type ][ i ] ); - } - } - } - } - - // 2. Copy user data - if ( dataUser.hasData( src ) ) { - udataOld = dataUser.access( src ); - udataCur = jQuery.extend( {}, udataOld ); - - dataUser.set( dest, udataCur ); - } -} - -// Fix IE bugs, see support tests -function fixInput( src, dest ) { - var nodeName = dest.nodeName.toLowerCase(); - - // Fails to persist the checked state of a cloned checkbox or radio button. - if ( nodeName === "input" && rcheckableType.test( src.type ) ) { - dest.checked = src.checked; - - // Fails to return the selected option to the default selected state when cloning options - } else if ( nodeName === "input" || nodeName === "textarea" ) { - dest.defaultValue = src.defaultValue; - } -} - -function domManip( collection, args, callback, ignored ) { - - // Flatten any nested arrays - args = flat( args ); - - var fragment, first, scripts, hasScripts, node, doc, - i = 0, - l = collection.length, - iNoClone = l - 1, - value = args[ 0 ], - valueIsFunction = isFunction( value ); - - // We can't cloneNode fragments that contain checked, in WebKit - if ( valueIsFunction || - ( l > 1 && typeof value === "string" && - !support.checkClone && rchecked.test( value ) ) ) { - return collection.each( function( index ) { - var self = collection.eq( index ); - if ( valueIsFunction ) { - args[ 0 ] = value.call( this, index, self.html() ); - } - domManip( self, args, callback, ignored ); - } ); - } - - if ( l ) { - fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); - first = fragment.firstChild; - - if ( fragment.childNodes.length === 1 ) { - fragment = first; - } - - // Require either new content or an interest in ignored elements to invoke the callback - if ( first || ignored ) { - scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); - hasScripts = scripts.length; - - // Use the original fragment for the last item - // instead of the first because it can end up - // being emptied incorrectly in certain situations (#8070). - for ( ; i < l; i++ ) { - node = fragment; - - if ( i !== iNoClone ) { - node = jQuery.clone( node, true, true ); - - // Keep references to cloned scripts for later restoration - if ( hasScripts ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( scripts, getAll( node, "script" ) ); - } - } - - callback.call( collection[ i ], node, i ); - } - - if ( hasScripts ) { - doc = scripts[ scripts.length - 1 ].ownerDocument; - - // Reenable scripts - jQuery.map( scripts, restoreScript ); - - // Evaluate executable scripts on first document insertion - for ( i = 0; i < hasScripts; i++ ) { - node = scripts[ i ]; - if ( rscriptType.test( node.type || "" ) && - !dataPriv.access( node, "globalEval" ) && - jQuery.contains( doc, node ) ) { - - if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { - - // Optional AJAX dependency, but won't run scripts if not present - if ( jQuery._evalUrl && !node.noModule ) { - jQuery._evalUrl( node.src, { - nonce: node.nonce || node.getAttribute( "nonce" ) - }, doc ); - } - } else { - DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); - } - } - } - } - } - } - - return collection; -} - -function remove( elem, selector, keepData ) { - var node, - nodes = selector ? jQuery.filter( selector, elem ) : elem, - i = 0; - - for ( ; ( node = nodes[ i ] ) != null; i++ ) { - if ( !keepData && node.nodeType === 1 ) { - jQuery.cleanData( getAll( node ) ); - } - - if ( node.parentNode ) { - if ( keepData && isAttached( node ) ) { - setGlobalEval( getAll( node, "script" ) ); - } - node.parentNode.removeChild( node ); - } - } - - return elem; -} - -jQuery.extend( { - htmlPrefilter: function( html ) { - return html; - }, - - clone: function( elem, dataAndEvents, deepDataAndEvents ) { - var i, l, srcElements, destElements, - clone = elem.cloneNode( true ), - inPage = isAttached( elem ); - - // Fix IE cloning issues - if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && - !jQuery.isXMLDoc( elem ) ) { - - // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 - destElements = getAll( clone ); - srcElements = getAll( elem ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - fixInput( srcElements[ i ], destElements[ i ] ); - } - } - - // Copy the events from the original to the clone - if ( dataAndEvents ) { - if ( deepDataAndEvents ) { - srcElements = srcElements || getAll( elem ); - destElements = destElements || getAll( clone ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - cloneCopyEvent( srcElements[ i ], destElements[ i ] ); - } - } else { - cloneCopyEvent( elem, clone ); - } - } - - // Preserve script evaluation history - destElements = getAll( clone, "script" ); - if ( destElements.length > 0 ) { - setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); - } - - // Return the cloned set - return clone; - }, - - cleanData: function( elems ) { - var data, elem, type, - special = jQuery.event.special, - i = 0; - - for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { - if ( acceptData( elem ) ) { - if ( ( data = elem[ dataPriv.expando ] ) ) { - if ( data.events ) { - for ( type in data.events ) { - if ( special[ type ] ) { - jQuery.event.remove( elem, type ); - - // This is a shortcut to avoid jQuery.event.remove's overhead - } else { - jQuery.removeEvent( elem, type, data.handle ); - } - } - } - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataPriv.expando ] = undefined; - } - if ( elem[ dataUser.expando ] ) { - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataUser.expando ] = undefined; - } - } - } - } -} ); - -jQuery.fn.extend( { - detach: function( selector ) { - return remove( this, selector, true ); - }, - - remove: function( selector ) { - return remove( this, selector ); - }, - - text: function( value ) { - return access( this, function( value ) { - return value === undefined ? - jQuery.text( this ) : - this.empty().each( function() { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - this.textContent = value; - } - } ); - }, null, value, arguments.length ); - }, - - append: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.appendChild( elem ); - } - } ); - }, - - prepend: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.insertBefore( elem, target.firstChild ); - } - } ); - }, - - before: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this ); - } - } ); - }, - - after: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this.nextSibling ); - } - } ); - }, - - empty: function() { - var elem, - i = 0; - - for ( ; ( elem = this[ i ] ) != null; i++ ) { - if ( elem.nodeType === 1 ) { - - // Prevent memory leaks - jQuery.cleanData( getAll( elem, false ) ); - - // Remove any remaining nodes - elem.textContent = ""; - } - } - - return this; - }, - - clone: function( dataAndEvents, deepDataAndEvents ) { - dataAndEvents = dataAndEvents == null ? false : dataAndEvents; - deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - - return this.map( function() { - return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); - } ); - }, - - html: function( value ) { - return access( this, function( value ) { - var elem = this[ 0 ] || {}, - i = 0, - l = this.length; - - if ( value === undefined && elem.nodeType === 1 ) { - return elem.innerHTML; - } - - // See if we can take a shortcut and just use innerHTML - if ( typeof value === "string" && !rnoInnerhtml.test( value ) && - !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { - - value = jQuery.htmlPrefilter( value ); - - try { - for ( ; i < l; i++ ) { - elem = this[ i ] || {}; - - // Remove element nodes and prevent memory leaks - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - elem.innerHTML = value; - } - } - - elem = 0; - - // If using innerHTML throws an exception, use the fallback method - } catch ( e ) {} - } - - if ( elem ) { - this.empty().append( value ); - } - }, null, value, arguments.length ); - }, - - replaceWith: function() { - var ignored = []; - - // Make the changes, replacing each non-ignored context element with the new content - return domManip( this, arguments, function( elem ) { - var parent = this.parentNode; - - if ( jQuery.inArray( this, ignored ) < 0 ) { - jQuery.cleanData( getAll( this ) ); - if ( parent ) { - parent.replaceChild( elem, this ); - } - } - - // Force callback invocation - }, ignored ); - } -} ); - -jQuery.each( { - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" -}, function( name, original ) { - jQuery.fn[ name ] = function( selector ) { - var elems, - ret = [], - insert = jQuery( selector ), - last = insert.length - 1, - i = 0; - - for ( ; i <= last; i++ ) { - elems = i === last ? this : this.clone( true ); - jQuery( insert[ i ] )[ original ]( elems ); - - // Support: Android <=4.0 only, PhantomJS 1 only - // .get() because push.apply(_, arraylike) throws on ancient WebKit - push.apply( ret, elems.get() ); - } - - return this.pushStack( ret ); - }; -} ); -var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); - -var getStyles = function( elem ) { - - // Support: IE <=11 only, Firefox <=30 (#15098, #14150) - // IE throws on elements created in popups - // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" - var view = elem.ownerDocument.defaultView; - - if ( !view || !view.opener ) { - view = window; - } - - return view.getComputedStyle( elem ); - }; - -var swap = function( elem, options, callback ) { - var ret, name, - old = {}; - - // Remember the old values, and insert the new ones - for ( name in options ) { - old[ name ] = elem.style[ name ]; - elem.style[ name ] = options[ name ]; - } - - ret = callback.call( elem ); - - // Revert the old values - for ( name in options ) { - elem.style[ name ] = old[ name ]; - } - - return ret; -}; - - -var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); - - - -( function() { - - // Executing both pixelPosition & boxSizingReliable tests require only one layout - // so they're executed at the same time to save the second computation. - function computeStyleTests() { - - // This is a singleton, we need to execute it only once - if ( !div ) { - return; - } - - container.style.cssText = "position:absolute;left:-11111px;width:60px;" + - "margin-top:1px;padding:0;border:0"; - div.style.cssText = - "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + - "margin:auto;border:1px;padding:1px;" + - "width:60%;top:1%"; - documentElement.appendChild( container ).appendChild( div ); - - var divStyle = window.getComputedStyle( div ); - pixelPositionVal = divStyle.top !== "1%"; - - // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 - reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; - - // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 - // Some styles come back with percentage values, even though they shouldn't - div.style.right = "60%"; - pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; - - // Support: IE 9 - 11 only - // Detect misreporting of content dimensions for box-sizing:border-box elements - boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; - - // Support: IE 9 only - // Detect overflow:scroll screwiness (gh-3699) - // Support: Chrome <=64 - // Don't get tricked when zoom affects offsetWidth (gh-4029) - div.style.position = "absolute"; - scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; - - documentElement.removeChild( container ); - - // Nullify the div so it wouldn't be stored in the memory and - // it will also be a sign that checks already performed - div = null; - } - - function roundPixelMeasures( measure ) { - return Math.round( parseFloat( measure ) ); - } - - var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, - reliableTrDimensionsVal, reliableMarginLeftVal, - container = document.createElement( "div" ), - div = document.createElement( "div" ); - - // Finish early in limited (non-browser) environments - if ( !div.style ) { - return; - } - - // Support: IE <=9 - 11 only - // Style of cloned element affects source element cloned (#8908) - div.style.backgroundClip = "content-box"; - div.cloneNode( true ).style.backgroundClip = ""; - support.clearCloneStyle = div.style.backgroundClip === "content-box"; - - jQuery.extend( support, { - boxSizingReliable: function() { - computeStyleTests(); - return boxSizingReliableVal; - }, - pixelBoxStyles: function() { - computeStyleTests(); - return pixelBoxStylesVal; - }, - pixelPosition: function() { - computeStyleTests(); - return pixelPositionVal; - }, - reliableMarginLeft: function() { - computeStyleTests(); - return reliableMarginLeftVal; - }, - scrollboxSize: function() { - computeStyleTests(); - return scrollboxSizeVal; - }, - - // Support: IE 9 - 11+, Edge 15 - 18+ - // IE/Edge misreport `getComputedStyle` of table rows with width/height - // set in CSS while `offset*` properties report correct values. - // Behavior in IE 9 is more subtle than in newer versions & it passes - // some versions of this test; make sure not to make it pass there! - reliableTrDimensions: function() { - var table, tr, trChild, trStyle; - if ( reliableTrDimensionsVal == null ) { - table = document.createElement( "table" ); - tr = document.createElement( "tr" ); - trChild = document.createElement( "div" ); - - table.style.cssText = "position:absolute;left:-11111px"; - tr.style.height = "1px"; - trChild.style.height = "9px"; - - documentElement - .appendChild( table ) - .appendChild( tr ) - .appendChild( trChild ); - - trStyle = window.getComputedStyle( tr ); - reliableTrDimensionsVal = parseInt( trStyle.height ) > 3; - - documentElement.removeChild( table ); - } - return reliableTrDimensionsVal; - } - } ); -} )(); - - -function curCSS( elem, name, computed ) { - var width, minWidth, maxWidth, ret, - - // Support: Firefox 51+ - // Retrieving style before computed somehow - // fixes an issue with getting wrong values - // on detached elements - style = elem.style; - - computed = computed || getStyles( elem ); - - // getPropertyValue is needed for: - // .css('filter') (IE 9 only, #12537) - // .css('--customProperty) (#3144) - if ( computed ) { - ret = computed.getPropertyValue( name ) || computed[ name ]; - - if ( ret === "" && !isAttached( elem ) ) { - ret = jQuery.style( elem, name ); - } - - // A tribute to the "awesome hack by Dean Edwards" - // Android Browser returns percentage for some values, - // but width seems to be reliably pixels. - // This is against the CSSOM draft spec: - // https://drafts.csswg.org/cssom/#resolved-values - if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { - - // Remember the original values - width = style.width; - minWidth = style.minWidth; - maxWidth = style.maxWidth; - - // Put in the new values to get a computed value out - style.minWidth = style.maxWidth = style.width = ret; - ret = computed.width; - - // Revert the changed values - style.width = width; - style.minWidth = minWidth; - style.maxWidth = maxWidth; - } - } - - return ret !== undefined ? - - // Support: IE <=9 - 11 only - // IE returns zIndex value as an integer. - ret + "" : - ret; -} - - -function addGetHookIf( conditionFn, hookFn ) { - - // Define the hook, we'll check on the first run if it's really needed. - return { - get: function() { - if ( conditionFn() ) { - - // Hook not needed (or it's not possible to use it due - // to missing dependency), remove it. - delete this.get; - return; - } - - // Hook needed; redefine it so that the support test is not executed again. - return ( this.get = hookFn ).apply( this, arguments ); - } - }; -} - - -var cssPrefixes = [ "Webkit", "Moz", "ms" ], - emptyStyle = document.createElement( "div" ).style, - vendorProps = {}; - -// Return a vendor-prefixed property or undefined -function vendorPropName( name ) { - - // Check for vendor prefixed names - var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), - i = cssPrefixes.length; - - while ( i-- ) { - name = cssPrefixes[ i ] + capName; - if ( name in emptyStyle ) { - return name; - } - } -} - -// Return a potentially-mapped jQuery.cssProps or vendor prefixed property -function finalPropName( name ) { - var final = jQuery.cssProps[ name ] || vendorProps[ name ]; - - if ( final ) { - return final; - } - if ( name in emptyStyle ) { - return name; - } - return vendorProps[ name ] = vendorPropName( name ) || name; -} - - -var - - // Swappable if display is none or starts with table - // except "table", "table-cell", or "table-caption" - // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display - rdisplayswap = /^(none|table(?!-c[ea]).+)/, - rcustomProp = /^--/, - cssShow = { position: "absolute", visibility: "hidden", display: "block" }, - cssNormalTransform = { - letterSpacing: "0", - fontWeight: "400" - }; - -function setPositiveNumber( _elem, value, subtract ) { - - // Any relative (+/-) values have already been - // normalized at this point - var matches = rcssNum.exec( value ); - return matches ? - - // Guard against undefined "subtract", e.g., when used as in cssHooks - Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : - value; -} - -function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { - var i = dimension === "width" ? 1 : 0, - extra = 0, - delta = 0; - - // Adjustment may not be necessary - if ( box === ( isBorderBox ? "border" : "content" ) ) { - return 0; - } - - for ( ; i < 4; i += 2 ) { - - // Both box models exclude margin - if ( box === "margin" ) { - delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); - } - - // If we get here with a content-box, we're seeking "padding" or "border" or "margin" - if ( !isBorderBox ) { - - // Add padding - delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - - // For "border" or "margin", add border - if ( box !== "padding" ) { - delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - - // But still keep track of it otherwise - } else { - extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - - // If we get here with a border-box (content + padding + border), we're seeking "content" or - // "padding" or "margin" - } else { - - // For "content", subtract padding - if ( box === "content" ) { - delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - } - - // For "content" or "padding", subtract border - if ( box !== "margin" ) { - delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } - } - - // Account for positive content-box scroll gutter when requested by providing computedVal - if ( !isBorderBox && computedVal >= 0 ) { - - // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border - // Assuming integer scroll gutter, subtract the rest and round down - delta += Math.max( 0, Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - computedVal - - delta - - extra - - 0.5 - - // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter - // Use an explicit zero to avoid NaN (gh-3964) - ) ) || 0; - } - - return delta; -} - -function getWidthOrHeight( elem, dimension, extra ) { - - // Start with computed style - var styles = getStyles( elem ), - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). - // Fake content-box until we know it's needed to know the true value. - boxSizingNeeded = !support.boxSizingReliable() || extra, - isBorderBox = boxSizingNeeded && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - valueIsBorderBox = isBorderBox, - - val = curCSS( elem, dimension, styles ), - offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); - - // Support: Firefox <=54 - // Return a confounding non-pixel value or feign ignorance, as appropriate. - if ( rnumnonpx.test( val ) ) { - if ( !extra ) { - return val; - } - val = "auto"; - } - - - // Support: IE 9 - 11 only - // Use offsetWidth/offsetHeight for when box sizing is unreliable. - // In those cases, the computed value can be trusted to be border-box. - if ( ( !support.boxSizingReliable() && isBorderBox || - - // Support: IE 10 - 11+, Edge 15 - 18+ - // IE/Edge misreport `getComputedStyle` of table rows with width/height - // set in CSS while `offset*` properties report correct values. - // Interestingly, in some cases IE 9 doesn't suffer from this issue. - !support.reliableTrDimensions() && nodeName( elem, "tr" ) || - - // Fall back to offsetWidth/offsetHeight when value is "auto" - // This happens for inline elements with no explicit setting (gh-3571) - val === "auto" || - - // Support: Android <=4.1 - 4.3 only - // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) - !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && - - // Make sure the element is visible & connected - elem.getClientRects().length ) { - - isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; - - // Where available, offsetWidth/offsetHeight approximate border box dimensions. - // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the - // retrieved value as a content box dimension. - valueIsBorderBox = offsetProp in elem; - if ( valueIsBorderBox ) { - val = elem[ offsetProp ]; - } - } - - // Normalize "" and auto - val = parseFloat( val ) || 0; - - // Adjust for the element's box model - return ( val + - boxModelAdjustment( - elem, - dimension, - extra || ( isBorderBox ? "border" : "content" ), - valueIsBorderBox, - styles, - - // Provide the current computed size to request scroll gutter calculation (gh-3589) - val - ) - ) + "px"; -} - -jQuery.extend( { - - // Add in style property hooks for overriding the default - // behavior of getting and setting a style property - cssHooks: { - opacity: { - get: function( elem, computed ) { - if ( computed ) { - - // We should always get a number back from opacity - var ret = curCSS( elem, "opacity" ); - return ret === "" ? "1" : ret; - } - } - } - }, - - // Don't automatically add "px" to these possibly-unitless properties - cssNumber: { - "animationIterationCount": true, - "columnCount": true, - "fillOpacity": true, - "flexGrow": true, - "flexShrink": true, - "fontWeight": true, - "gridArea": true, - "gridColumn": true, - "gridColumnEnd": true, - "gridColumnStart": true, - "gridRow": true, - "gridRowEnd": true, - "gridRowStart": true, - "lineHeight": true, - "opacity": true, - "order": true, - "orphans": true, - "widows": true, - "zIndex": true, - "zoom": true - }, - - // Add in properties whose names you wish to fix before - // setting or getting the value - cssProps: {}, - - // Get and set the style property on a DOM Node - style: function( elem, name, value, extra ) { - - // Don't set styles on text and comment nodes - if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { - return; - } - - // Make sure that we're working with the right name - var ret, type, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ), - style = elem.style; - - // Make sure that we're working with the right name. We don't - // want to query the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Gets hook for the prefixed version, then unprefixed version - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // Check if we're setting a value - if ( value !== undefined ) { - type = typeof value; - - // Convert "+=" or "-=" to relative numbers (#7345) - if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { - value = adjustCSS( elem, name, ret ); - - // Fixes bug #9237 - type = "number"; - } - - // Make sure that null and NaN values aren't set (#7116) - if ( value == null || value !== value ) { - return; - } - - // If a number was passed in, add the unit (except for certain CSS properties) - // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append - // "px" to a few hardcoded values. - if ( type === "number" && !isCustomProp ) { - value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); - } - - // background-* props affect original clone's values - if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { - style[ name ] = "inherit"; - } - - // If a hook was provided, use that value, otherwise just set the specified value - if ( !hooks || !( "set" in hooks ) || - ( value = hooks.set( elem, value, extra ) ) !== undefined ) { - - if ( isCustomProp ) { - style.setProperty( name, value ); - } else { - style[ name ] = value; - } - } - - } else { - - // If a hook was provided get the non-computed value from there - if ( hooks && "get" in hooks && - ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { - - return ret; - } - - // Otherwise just get the value from the style object - return style[ name ]; - } - }, - - css: function( elem, name, extra, styles ) { - var val, num, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ); - - // Make sure that we're working with the right name. We don't - // want to modify the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Try prefixed name followed by the unprefixed name - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // If a hook was provided get the computed value from there - if ( hooks && "get" in hooks ) { - val = hooks.get( elem, true, extra ); - } - - // Otherwise, if a way to get the computed value exists, use that - if ( val === undefined ) { - val = curCSS( elem, name, styles ); - } - - // Convert "normal" to computed value - if ( val === "normal" && name in cssNormalTransform ) { - val = cssNormalTransform[ name ]; - } - - // Make numeric if forced or a qualifier was provided and val looks numeric - if ( extra === "" || extra ) { - num = parseFloat( val ); - return extra === true || isFinite( num ) ? num || 0 : val; - } - - return val; - } -} ); - -jQuery.each( [ "height", "width" ], function( _i, dimension ) { - jQuery.cssHooks[ dimension ] = { - get: function( elem, computed, extra ) { - if ( computed ) { - - // Certain elements can have dimension info if we invisibly show them - // but it must have a current display style that would benefit - return rdisplayswap.test( jQuery.css( elem, "display" ) ) && - - // Support: Safari 8+ - // Table columns in Safari have non-zero offsetWidth & zero - // getBoundingClientRect().width unless display is changed. - // Support: IE <=11 only - // Running getBoundingClientRect on a disconnected node - // in IE throws an error. - ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? - swap( elem, cssShow, function() { - return getWidthOrHeight( elem, dimension, extra ); - } ) : - getWidthOrHeight( elem, dimension, extra ); - } - }, - - set: function( elem, value, extra ) { - var matches, - styles = getStyles( elem ), - - // Only read styles.position if the test has a chance to fail - // to avoid forcing a reflow. - scrollboxSizeBuggy = !support.scrollboxSize() && - styles.position === "absolute", - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) - boxSizingNeeded = scrollboxSizeBuggy || extra, - isBorderBox = boxSizingNeeded && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - subtract = extra ? - boxModelAdjustment( - elem, - dimension, - extra, - isBorderBox, - styles - ) : - 0; - - // Account for unreliable border-box dimensions by comparing offset* to computed and - // faking a content-box to get border and padding (gh-3699) - if ( isBorderBox && scrollboxSizeBuggy ) { - subtract -= Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - parseFloat( styles[ dimension ] ) - - boxModelAdjustment( elem, dimension, "border", false, styles ) - - 0.5 - ); - } - - // Convert to pixels if value adjustment is needed - if ( subtract && ( matches = rcssNum.exec( value ) ) && - ( matches[ 3 ] || "px" ) !== "px" ) { - - elem.style[ dimension ] = value; - value = jQuery.css( elem, dimension ); - } - - return setPositiveNumber( elem, value, subtract ); - } - }; -} ); - -jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, - function( elem, computed ) { - if ( computed ) { - return ( parseFloat( curCSS( elem, "marginLeft" ) ) || - elem.getBoundingClientRect().left - - swap( elem, { marginLeft: 0 }, function() { - return elem.getBoundingClientRect().left; - } ) - ) + "px"; - } - } -); - -// These hooks are used by animate to expand properties -jQuery.each( { - margin: "", - padding: "", - border: "Width" -}, function( prefix, suffix ) { - jQuery.cssHooks[ prefix + suffix ] = { - expand: function( value ) { - var i = 0, - expanded = {}, - - // Assumes a single number if not a string - parts = typeof value === "string" ? value.split( " " ) : [ value ]; - - for ( ; i < 4; i++ ) { - expanded[ prefix + cssExpand[ i ] + suffix ] = - parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; - } - - return expanded; - } - }; - - if ( prefix !== "margin" ) { - jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; - } -} ); - -jQuery.fn.extend( { - css: function( name, value ) { - return access( this, function( elem, name, value ) { - var styles, len, - map = {}, - i = 0; - - if ( Array.isArray( name ) ) { - styles = getStyles( elem ); - len = name.length; - - for ( ; i < len; i++ ) { - map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); - } - - return map; - } - - return value !== undefined ? - jQuery.style( elem, name, value ) : - jQuery.css( elem, name ); - }, name, value, arguments.length > 1 ); - } -} ); - - -function Tween( elem, options, prop, end, easing ) { - return new Tween.prototype.init( elem, options, prop, end, easing ); -} -jQuery.Tween = Tween; - -Tween.prototype = { - constructor: Tween, - init: function( elem, options, prop, end, easing, unit ) { - this.elem = elem; - this.prop = prop; - this.easing = easing || jQuery.easing._default; - this.options = options; - this.start = this.now = this.cur(); - this.end = end; - this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); - }, - cur: function() { - var hooks = Tween.propHooks[ this.prop ]; - - return hooks && hooks.get ? - hooks.get( this ) : - Tween.propHooks._default.get( this ); - }, - run: function( percent ) { - var eased, - hooks = Tween.propHooks[ this.prop ]; - - if ( this.options.duration ) { - this.pos = eased = jQuery.easing[ this.easing ]( - percent, this.options.duration * percent, 0, 1, this.options.duration - ); - } else { - this.pos = eased = percent; - } - this.now = ( this.end - this.start ) * eased + this.start; - - if ( this.options.step ) { - this.options.step.call( this.elem, this.now, this ); - } - - if ( hooks && hooks.set ) { - hooks.set( this ); - } else { - Tween.propHooks._default.set( this ); - } - return this; - } -}; - -Tween.prototype.init.prototype = Tween.prototype; - -Tween.propHooks = { - _default: { - get: function( tween ) { - var result; - - // Use a property on the element directly when it is not a DOM element, - // or when there is no matching style property that exists. - if ( tween.elem.nodeType !== 1 || - tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { - return tween.elem[ tween.prop ]; - } - - // Passing an empty string as a 3rd parameter to .css will automatically - // attempt a parseFloat and fallback to a string if the parse fails. - // Simple values such as "10px" are parsed to Float; - // complex values such as "rotate(1rad)" are returned as-is. - result = jQuery.css( tween.elem, tween.prop, "" ); - - // Empty strings, null, undefined and "auto" are converted to 0. - return !result || result === "auto" ? 0 : result; - }, - set: function( tween ) { - - // Use step hook for back compat. - // Use cssHook if its there. - // Use .style if available and use plain properties where available. - if ( jQuery.fx.step[ tween.prop ] ) { - jQuery.fx.step[ tween.prop ]( tween ); - } else if ( tween.elem.nodeType === 1 && ( - jQuery.cssHooks[ tween.prop ] || - tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { - jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); - } else { - tween.elem[ tween.prop ] = tween.now; - } - } - } -}; - -// Support: IE <=9 only -// Panic based approach to setting things on disconnected nodes -Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { - set: function( tween ) { - if ( tween.elem.nodeType && tween.elem.parentNode ) { - tween.elem[ tween.prop ] = tween.now; - } - } -}; - -jQuery.easing = { - linear: function( p ) { - return p; - }, - swing: function( p ) { - return 0.5 - Math.cos( p * Math.PI ) / 2; - }, - _default: "swing" -}; - -jQuery.fx = Tween.prototype.init; - -// Back compat <1.8 extension point -jQuery.fx.step = {}; - - - - -var - fxNow, inProgress, - rfxtypes = /^(?:toggle|show|hide)$/, - rrun = /queueHooks$/; - -function schedule() { - if ( inProgress ) { - if ( document.hidden === false && window.requestAnimationFrame ) { - window.requestAnimationFrame( schedule ); - } else { - window.setTimeout( schedule, jQuery.fx.interval ); - } - - jQuery.fx.tick(); - } -} - -// Animations created synchronously will run synchronously -function createFxNow() { - window.setTimeout( function() { - fxNow = undefined; - } ); - return ( fxNow = Date.now() ); -} - -// Generate parameters to create a standard animation -function genFx( type, includeWidth ) { - var which, - i = 0, - attrs = { height: type }; - - // If we include width, step value is 1 to do all cssExpand values, - // otherwise step value is 2 to skip over Left and Right - includeWidth = includeWidth ? 1 : 0; - for ( ; i < 4; i += 2 - includeWidth ) { - which = cssExpand[ i ]; - attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; - } - - if ( includeWidth ) { - attrs.opacity = attrs.width = type; - } - - return attrs; -} - -function createTween( value, prop, animation ) { - var tween, - collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), - index = 0, - length = collection.length; - for ( ; index < length; index++ ) { - if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { - - // We're done with this property - return tween; - } - } -} - -function defaultPrefilter( elem, props, opts ) { - var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, - isBox = "width" in props || "height" in props, - anim = this, - orig = {}, - style = elem.style, - hidden = elem.nodeType && isHiddenWithinTree( elem ), - dataShow = dataPriv.get( elem, "fxshow" ); - - // Queue-skipping animations hijack the fx hooks - if ( !opts.queue ) { - hooks = jQuery._queueHooks( elem, "fx" ); - if ( hooks.unqueued == null ) { - hooks.unqueued = 0; - oldfire = hooks.empty.fire; - hooks.empty.fire = function() { - if ( !hooks.unqueued ) { - oldfire(); - } - }; - } - hooks.unqueued++; - - anim.always( function() { - - // Ensure the complete handler is called before this completes - anim.always( function() { - hooks.unqueued--; - if ( !jQuery.queue( elem, "fx" ).length ) { - hooks.empty.fire(); - } - } ); - } ); - } - - // Detect show/hide animations - for ( prop in props ) { - value = props[ prop ]; - if ( rfxtypes.test( value ) ) { - delete props[ prop ]; - toggle = toggle || value === "toggle"; - if ( value === ( hidden ? "hide" : "show" ) ) { - - // Pretend to be hidden if this is a "show" and - // there is still data from a stopped show/hide - if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { - hidden = true; - - // Ignore all other no-op show/hide data - } else { - continue; - } - } - orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); - } - } - - // Bail out if this is a no-op like .hide().hide() - propTween = !jQuery.isEmptyObject( props ); - if ( !propTween && jQuery.isEmptyObject( orig ) ) { - return; - } - - // Restrict "overflow" and "display" styles during box animations - if ( isBox && elem.nodeType === 1 ) { - - // Support: IE <=9 - 11, Edge 12 - 15 - // Record all 3 overflow attributes because IE does not infer the shorthand - // from identically-valued overflowX and overflowY and Edge just mirrors - // the overflowX value there. - opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; - - // Identify a display type, preferring old show/hide data over the CSS cascade - restoreDisplay = dataShow && dataShow.display; - if ( restoreDisplay == null ) { - restoreDisplay = dataPriv.get( elem, "display" ); - } - display = jQuery.css( elem, "display" ); - if ( display === "none" ) { - if ( restoreDisplay ) { - display = restoreDisplay; - } else { - - // Get nonempty value(s) by temporarily forcing visibility - showHide( [ elem ], true ); - restoreDisplay = elem.style.display || restoreDisplay; - display = jQuery.css( elem, "display" ); - showHide( [ elem ] ); - } - } - - // Animate inline elements as inline-block - if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { - if ( jQuery.css( elem, "float" ) === "none" ) { - - // Restore the original display value at the end of pure show/hide animations - if ( !propTween ) { - anim.done( function() { - style.display = restoreDisplay; - } ); - if ( restoreDisplay == null ) { - display = style.display; - restoreDisplay = display === "none" ? "" : display; - } - } - style.display = "inline-block"; - } - } - } - - if ( opts.overflow ) { - style.overflow = "hidden"; - anim.always( function() { - style.overflow = opts.overflow[ 0 ]; - style.overflowX = opts.overflow[ 1 ]; - style.overflowY = opts.overflow[ 2 ]; - } ); - } - - // Implement show/hide animations - propTween = false; - for ( prop in orig ) { - - // General show/hide setup for this element animation - if ( !propTween ) { - if ( dataShow ) { - if ( "hidden" in dataShow ) { - hidden = dataShow.hidden; - } - } else { - dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); - } - - // Store hidden/visible for toggle so `.stop().toggle()` "reverses" - if ( toggle ) { - dataShow.hidden = !hidden; - } - - // Show elements before animating them - if ( hidden ) { - showHide( [ elem ], true ); - } - - /* eslint-disable no-loop-func */ - - anim.done( function() { - - /* eslint-enable no-loop-func */ - - // The final step of a "hide" animation is actually hiding the element - if ( !hidden ) { - showHide( [ elem ] ); - } - dataPriv.remove( elem, "fxshow" ); - for ( prop in orig ) { - jQuery.style( elem, prop, orig[ prop ] ); - } - } ); - } - - // Per-property setup - propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); - if ( !( prop in dataShow ) ) { - dataShow[ prop ] = propTween.start; - if ( hidden ) { - propTween.end = propTween.start; - propTween.start = 0; - } - } - } -} - -function propFilter( props, specialEasing ) { - var index, name, easing, value, hooks; - - // camelCase, specialEasing and expand cssHook pass - for ( index in props ) { - name = camelCase( index ); - easing = specialEasing[ name ]; - value = props[ index ]; - if ( Array.isArray( value ) ) { - easing = value[ 1 ]; - value = props[ index ] = value[ 0 ]; - } - - if ( index !== name ) { - props[ name ] = value; - delete props[ index ]; - } - - hooks = jQuery.cssHooks[ name ]; - if ( hooks && "expand" in hooks ) { - value = hooks.expand( value ); - delete props[ name ]; - - // Not quite $.extend, this won't overwrite existing keys. - // Reusing 'index' because we have the correct "name" - for ( index in value ) { - if ( !( index in props ) ) { - props[ index ] = value[ index ]; - specialEasing[ index ] = easing; - } - } - } else { - specialEasing[ name ] = easing; - } - } -} - -function Animation( elem, properties, options ) { - var result, - stopped, - index = 0, - length = Animation.prefilters.length, - deferred = jQuery.Deferred().always( function() { - - // Don't match elem in the :animated selector - delete tick.elem; - } ), - tick = function() { - if ( stopped ) { - return false; - } - var currentTime = fxNow || createFxNow(), - remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), - - // Support: Android 2.3 only - // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) - temp = remaining / animation.duration || 0, - percent = 1 - temp, - index = 0, - length = animation.tweens.length; - - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( percent ); - } - - deferred.notifyWith( elem, [ animation, percent, remaining ] ); - - // If there's more to do, yield - if ( percent < 1 && length ) { - return remaining; - } - - // If this was an empty animation, synthesize a final progress notification - if ( !length ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - } - - // Resolve the animation and report its conclusion - deferred.resolveWith( elem, [ animation ] ); - return false; - }, - animation = deferred.promise( { - elem: elem, - props: jQuery.extend( {}, properties ), - opts: jQuery.extend( true, { - specialEasing: {}, - easing: jQuery.easing._default - }, options ), - originalProperties: properties, - originalOptions: options, - startTime: fxNow || createFxNow(), - duration: options.duration, - tweens: [], - createTween: function( prop, end ) { - var tween = jQuery.Tween( elem, animation.opts, prop, end, - animation.opts.specialEasing[ prop ] || animation.opts.easing ); - animation.tweens.push( tween ); - return tween; - }, - stop: function( gotoEnd ) { - var index = 0, - - // If we are going to the end, we want to run all the tweens - // otherwise we skip this part - length = gotoEnd ? animation.tweens.length : 0; - if ( stopped ) { - return this; - } - stopped = true; - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( 1 ); - } - - // Resolve when we played the last frame; otherwise, reject - if ( gotoEnd ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - deferred.resolveWith( elem, [ animation, gotoEnd ] ); - } else { - deferred.rejectWith( elem, [ animation, gotoEnd ] ); - } - return this; - } - } ), - props = animation.props; - - propFilter( props, animation.opts.specialEasing ); - - for ( ; index < length; index++ ) { - result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); - if ( result ) { - if ( isFunction( result.stop ) ) { - jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = - result.stop.bind( result ); - } - return result; - } - } - - jQuery.map( props, createTween, animation ); - - if ( isFunction( animation.opts.start ) ) { - animation.opts.start.call( elem, animation ); - } - - // Attach callbacks from options - animation - .progress( animation.opts.progress ) - .done( animation.opts.done, animation.opts.complete ) - .fail( animation.opts.fail ) - .always( animation.opts.always ); - - jQuery.fx.timer( - jQuery.extend( tick, { - elem: elem, - anim: animation, - queue: animation.opts.queue - } ) - ); - - return animation; -} - -jQuery.Animation = jQuery.extend( Animation, { - - tweeners: { - "*": [ function( prop, value ) { - var tween = this.createTween( prop, value ); - adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); - return tween; - } ] - }, - - tweener: function( props, callback ) { - if ( isFunction( props ) ) { - callback = props; - props = [ "*" ]; - } else { - props = props.match( rnothtmlwhite ); - } - - var prop, - index = 0, - length = props.length; - - for ( ; index < length; index++ ) { - prop = props[ index ]; - Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; - Animation.tweeners[ prop ].unshift( callback ); - } - }, - - prefilters: [ defaultPrefilter ], - - prefilter: function( callback, prepend ) { - if ( prepend ) { - Animation.prefilters.unshift( callback ); - } else { - Animation.prefilters.push( callback ); - } - } -} ); - -jQuery.speed = function( speed, easing, fn ) { - var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { - complete: fn || !fn && easing || - isFunction( speed ) && speed, - duration: speed, - easing: fn && easing || easing && !isFunction( easing ) && easing - }; - - // Go to the end state if fx are off - if ( jQuery.fx.off ) { - opt.duration = 0; - - } else { - if ( typeof opt.duration !== "number" ) { - if ( opt.duration in jQuery.fx.speeds ) { - opt.duration = jQuery.fx.speeds[ opt.duration ]; - - } else { - opt.duration = jQuery.fx.speeds._default; - } - } - } - - // Normalize opt.queue - true/undefined/null -> "fx" - if ( opt.queue == null || opt.queue === true ) { - opt.queue = "fx"; - } - - // Queueing - opt.old = opt.complete; - - opt.complete = function() { - if ( isFunction( opt.old ) ) { - opt.old.call( this ); - } - - if ( opt.queue ) { - jQuery.dequeue( this, opt.queue ); - } - }; - - return opt; -}; - -jQuery.fn.extend( { - fadeTo: function( speed, to, easing, callback ) { - - // Show any hidden elements after setting opacity to 0 - return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() - - // Animate to the value specified - .end().animate( { opacity: to }, speed, easing, callback ); - }, - animate: function( prop, speed, easing, callback ) { - var empty = jQuery.isEmptyObject( prop ), - optall = jQuery.speed( speed, easing, callback ), - doAnimation = function() { - - // Operate on a copy of prop so per-property easing won't be lost - var anim = Animation( this, jQuery.extend( {}, prop ), optall ); - - // Empty animations, or finishing resolves immediately - if ( empty || dataPriv.get( this, "finish" ) ) { - anim.stop( true ); - } - }; - doAnimation.finish = doAnimation; - - return empty || optall.queue === false ? - this.each( doAnimation ) : - this.queue( optall.queue, doAnimation ); - }, - stop: function( type, clearQueue, gotoEnd ) { - var stopQueue = function( hooks ) { - var stop = hooks.stop; - delete hooks.stop; - stop( gotoEnd ); - }; - - if ( typeof type !== "string" ) { - gotoEnd = clearQueue; - clearQueue = type; - type = undefined; - } - if ( clearQueue ) { - this.queue( type || "fx", [] ); - } - - return this.each( function() { - var dequeue = true, - index = type != null && type + "queueHooks", - timers = jQuery.timers, - data = dataPriv.get( this ); - - if ( index ) { - if ( data[ index ] && data[ index ].stop ) { - stopQueue( data[ index ] ); - } - } else { - for ( index in data ) { - if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { - stopQueue( data[ index ] ); - } - } - } - - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && - ( type == null || timers[ index ].queue === type ) ) { - - timers[ index ].anim.stop( gotoEnd ); - dequeue = false; - timers.splice( index, 1 ); - } - } - - // Start the next in the queue if the last step wasn't forced. - // Timers currently will call their complete callbacks, which - // will dequeue but only if they were gotoEnd. - if ( dequeue || !gotoEnd ) { - jQuery.dequeue( this, type ); - } - } ); - }, - finish: function( type ) { - if ( type !== false ) { - type = type || "fx"; - } - return this.each( function() { - var index, - data = dataPriv.get( this ), - queue = data[ type + "queue" ], - hooks = data[ type + "queueHooks" ], - timers = jQuery.timers, - length = queue ? queue.length : 0; - - // Enable finishing flag on private data - data.finish = true; - - // Empty the queue first - jQuery.queue( this, type, [] ); - - if ( hooks && hooks.stop ) { - hooks.stop.call( this, true ); - } - - // Look for any active animations, and finish them - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && timers[ index ].queue === type ) { - timers[ index ].anim.stop( true ); - timers.splice( index, 1 ); - } - } - - // Look for any animations in the old queue and finish them - for ( index = 0; index < length; index++ ) { - if ( queue[ index ] && queue[ index ].finish ) { - queue[ index ].finish.call( this ); - } - } - - // Turn off finishing flag - delete data.finish; - } ); - } -} ); - -jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) { - var cssFn = jQuery.fn[ name ]; - jQuery.fn[ name ] = function( speed, easing, callback ) { - return speed == null || typeof speed === "boolean" ? - cssFn.apply( this, arguments ) : - this.animate( genFx( name, true ), speed, easing, callback ); - }; -} ); - -// Generate shortcuts for custom animations -jQuery.each( { - slideDown: genFx( "show" ), - slideUp: genFx( "hide" ), - slideToggle: genFx( "toggle" ), - fadeIn: { opacity: "show" }, - fadeOut: { opacity: "hide" }, - fadeToggle: { opacity: "toggle" } -}, function( name, props ) { - jQuery.fn[ name ] = function( speed, easing, callback ) { - return this.animate( props, speed, easing, callback ); - }; -} ); - -jQuery.timers = []; -jQuery.fx.tick = function() { - var timer, - i = 0, - timers = jQuery.timers; - - fxNow = Date.now(); - - for ( ; i < timers.length; i++ ) { - timer = timers[ i ]; - - // Run the timer and safely remove it when done (allowing for external removal) - if ( !timer() && timers[ i ] === timer ) { - timers.splice( i--, 1 ); - } - } - - if ( !timers.length ) { - jQuery.fx.stop(); - } - fxNow = undefined; -}; - -jQuery.fx.timer = function( timer ) { - jQuery.timers.push( timer ); - jQuery.fx.start(); -}; - -jQuery.fx.interval = 13; -jQuery.fx.start = function() { - if ( inProgress ) { - return; - } - - inProgress = true; - schedule(); -}; - -jQuery.fx.stop = function() { - inProgress = null; -}; - -jQuery.fx.speeds = { - slow: 600, - fast: 200, - - // Default speed - _default: 400 -}; - - -// Based off of the plugin by Clint Helfers, with permission. -// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ -jQuery.fn.delay = function( time, type ) { - time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; - type = type || "fx"; - - return this.queue( type, function( next, hooks ) { - var timeout = window.setTimeout( next, time ); - hooks.stop = function() { - window.clearTimeout( timeout ); - }; - } ); -}; - - -( function() { - var input = document.createElement( "input" ), - select = document.createElement( "select" ), - opt = select.appendChild( document.createElement( "option" ) ); - - input.type = "checkbox"; - - // Support: Android <=4.3 only - // Default value for a checkbox should be "on" - support.checkOn = input.value !== ""; - - // Support: IE <=11 only - // Must access selectedIndex to make default options select - support.optSelected = opt.selected; - - // Support: IE <=11 only - // An input loses its value after becoming a radio - input = document.createElement( "input" ); - input.value = "t"; - input.type = "radio"; - support.radioValue = input.value === "t"; -} )(); - - -var boolHook, - attrHandle = jQuery.expr.attrHandle; - -jQuery.fn.extend( { - attr: function( name, value ) { - return access( this, jQuery.attr, name, value, arguments.length > 1 ); - }, - - removeAttr: function( name ) { - return this.each( function() { - jQuery.removeAttr( this, name ); - } ); - } -} ); - -jQuery.extend( { - attr: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set attributes on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - // Fallback to prop when attributes are not supported - if ( typeof elem.getAttribute === "undefined" ) { - return jQuery.prop( elem, name, value ); - } - - // Attribute hooks are determined by the lowercase version - // Grab necessary hook if one is defined - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - hooks = jQuery.attrHooks[ name.toLowerCase() ] || - ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); - } - - if ( value !== undefined ) { - if ( value === null ) { - jQuery.removeAttr( elem, name ); - return; - } - - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - elem.setAttribute( name, value + "" ); - return value; - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - ret = jQuery.find.attr( elem, name ); - - // Non-existent attributes return null, we normalize to undefined - return ret == null ? undefined : ret; - }, - - attrHooks: { - type: { - set: function( elem, value ) { - if ( !support.radioValue && value === "radio" && - nodeName( elem, "input" ) ) { - var val = elem.value; - elem.setAttribute( "type", value ); - if ( val ) { - elem.value = val; - } - return value; - } - } - } - }, - - removeAttr: function( elem, value ) { - var name, - i = 0, - - // Attribute names can contain non-HTML whitespace characters - // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 - attrNames = value && value.match( rnothtmlwhite ); - - if ( attrNames && elem.nodeType === 1 ) { - while ( ( name = attrNames[ i++ ] ) ) { - elem.removeAttribute( name ); - } - } - } -} ); - -// Hooks for boolean attributes -boolHook = { - set: function( elem, value, name ) { - if ( value === false ) { - - // Remove boolean attributes when set to false - jQuery.removeAttr( elem, name ); - } else { - elem.setAttribute( name, name ); - } - return name; - } -}; - -jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) { - var getter = attrHandle[ name ] || jQuery.find.attr; - - attrHandle[ name ] = function( elem, name, isXML ) { - var ret, handle, - lowercaseName = name.toLowerCase(); - - if ( !isXML ) { - - // Avoid an infinite loop by temporarily removing this function from the getter - handle = attrHandle[ lowercaseName ]; - attrHandle[ lowercaseName ] = ret; - ret = getter( elem, name, isXML ) != null ? - lowercaseName : - null; - attrHandle[ lowercaseName ] = handle; - } - return ret; - }; -} ); - - - - -var rfocusable = /^(?:input|select|textarea|button)$/i, - rclickable = /^(?:a|area)$/i; - -jQuery.fn.extend( { - prop: function( name, value ) { - return access( this, jQuery.prop, name, value, arguments.length > 1 ); - }, - - removeProp: function( name ) { - return this.each( function() { - delete this[ jQuery.propFix[ name ] || name ]; - } ); - } -} ); - -jQuery.extend( { - prop: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set properties on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - - // Fix name and attach hooks - name = jQuery.propFix[ name ] || name; - hooks = jQuery.propHooks[ name ]; - } - - if ( value !== undefined ) { - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - return ( elem[ name ] = value ); - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - return elem[ name ]; - }, - - propHooks: { - tabIndex: { - get: function( elem ) { - - // Support: IE <=9 - 11 only - // elem.tabIndex doesn't always return the - // correct value when it hasn't been explicitly set - // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ - // Use proper attribute retrieval(#12072) - var tabindex = jQuery.find.attr( elem, "tabindex" ); - - if ( tabindex ) { - return parseInt( tabindex, 10 ); - } - - if ( - rfocusable.test( elem.nodeName ) || - rclickable.test( elem.nodeName ) && - elem.href - ) { - return 0; - } - - return -1; - } - } - }, - - propFix: { - "for": "htmlFor", - "class": "className" - } -} ); - -// Support: IE <=11 only -// Accessing the selectedIndex property -// forces the browser to respect setting selected -// on the option -// The getter ensures a default option is selected -// when in an optgroup -// eslint rule "no-unused-expressions" is disabled for this code -// since it considers such accessions noop -if ( !support.optSelected ) { - jQuery.propHooks.selected = { - get: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent && parent.parentNode ) { - parent.parentNode.selectedIndex; - } - return null; - }, - set: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent ) { - parent.selectedIndex; - - if ( parent.parentNode ) { - parent.parentNode.selectedIndex; - } - } - } - }; -} - -jQuery.each( [ - "tabIndex", - "readOnly", - "maxLength", - "cellSpacing", - "cellPadding", - "rowSpan", - "colSpan", - "useMap", - "frameBorder", - "contentEditable" -], function() { - jQuery.propFix[ this.toLowerCase() ] = this; -} ); - - - - - // Strip and collapse whitespace according to HTML spec - // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace - function stripAndCollapse( value ) { - var tokens = value.match( rnothtmlwhite ) || []; - return tokens.join( " " ); - } - - -function getClass( elem ) { - return elem.getAttribute && elem.getAttribute( "class" ) || ""; -} - -function classesToArray( value ) { - if ( Array.isArray( value ) ) { - return value; - } - if ( typeof value === "string" ) { - return value.match( rnothtmlwhite ) || []; - } - return []; -} - -jQuery.fn.extend( { - addClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - classes = classesToArray( value ); - - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - if ( cur.indexOf( " " + clazz + " " ) < 0 ) { - cur += clazz + " "; - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - removeClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - if ( !arguments.length ) { - return this.attr( "class", "" ); - } - - classes = classesToArray( value ); - - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - - // This expression is here for better compressibility (see addClass) - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - - // Remove *all* instances - while ( cur.indexOf( " " + clazz + " " ) > -1 ) { - cur = cur.replace( " " + clazz + " ", " " ); - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - toggleClass: function( value, stateVal ) { - var type = typeof value, - isValidValue = type === "string" || Array.isArray( value ); - - if ( typeof stateVal === "boolean" && isValidValue ) { - return stateVal ? this.addClass( value ) : this.removeClass( value ); - } - - if ( isFunction( value ) ) { - return this.each( function( i ) { - jQuery( this ).toggleClass( - value.call( this, i, getClass( this ), stateVal ), - stateVal - ); - } ); - } - - return this.each( function() { - var className, i, self, classNames; - - if ( isValidValue ) { - - // Toggle individual class names - i = 0; - self = jQuery( this ); - classNames = classesToArray( value ); - - while ( ( className = classNames[ i++ ] ) ) { - - // Check each className given, space separated list - if ( self.hasClass( className ) ) { - self.removeClass( className ); - } else { - self.addClass( className ); - } - } - - // Toggle whole class name - } else if ( value === undefined || type === "boolean" ) { - className = getClass( this ); - if ( className ) { - - // Store className if set - dataPriv.set( this, "__className__", className ); - } - - // If the element has a class name or if we're passed `false`, - // then remove the whole classname (if there was one, the above saved it). - // Otherwise bring back whatever was previously saved (if anything), - // falling back to the empty string if nothing was stored. - if ( this.setAttribute ) { - this.setAttribute( "class", - className || value === false ? - "" : - dataPriv.get( this, "__className__" ) || "" - ); - } - } - } ); - }, - - hasClass: function( selector ) { - var className, elem, - i = 0; - - className = " " + selector + " "; - while ( ( elem = this[ i++ ] ) ) { - if ( elem.nodeType === 1 && - ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { - return true; - } - } - - return false; - } -} ); - - - - -var rreturn = /\r/g; - -jQuery.fn.extend( { - val: function( value ) { - var hooks, ret, valueIsFunction, - elem = this[ 0 ]; - - if ( !arguments.length ) { - if ( elem ) { - hooks = jQuery.valHooks[ elem.type ] || - jQuery.valHooks[ elem.nodeName.toLowerCase() ]; - - if ( hooks && - "get" in hooks && - ( ret = hooks.get( elem, "value" ) ) !== undefined - ) { - return ret; - } - - ret = elem.value; - - // Handle most common string cases - if ( typeof ret === "string" ) { - return ret.replace( rreturn, "" ); - } - - // Handle cases where value is null/undef or number - return ret == null ? "" : ret; - } - - return; - } - - valueIsFunction = isFunction( value ); - - return this.each( function( i ) { - var val; - - if ( this.nodeType !== 1 ) { - return; - } - - if ( valueIsFunction ) { - val = value.call( this, i, jQuery( this ).val() ); - } else { - val = value; - } - - // Treat null/undefined as ""; convert numbers to string - if ( val == null ) { - val = ""; - - } else if ( typeof val === "number" ) { - val += ""; - - } else if ( Array.isArray( val ) ) { - val = jQuery.map( val, function( value ) { - return value == null ? "" : value + ""; - } ); - } - - hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; - - // If set returns undefined, fall back to normal setting - if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { - this.value = val; - } - } ); - } -} ); - -jQuery.extend( { - valHooks: { - option: { - get: function( elem ) { - - var val = jQuery.find.attr( elem, "value" ); - return val != null ? - val : - - // Support: IE <=10 - 11 only - // option.text throws exceptions (#14686, #14858) - // Strip and collapse whitespace - // https://html.spec.whatwg.org/#strip-and-collapse-whitespace - stripAndCollapse( jQuery.text( elem ) ); - } - }, - select: { - get: function( elem ) { - var value, option, i, - options = elem.options, - index = elem.selectedIndex, - one = elem.type === "select-one", - values = one ? null : [], - max = one ? index + 1 : options.length; - - if ( index < 0 ) { - i = max; - - } else { - i = one ? index : 0; - } - - // Loop through all the selected options - for ( ; i < max; i++ ) { - option = options[ i ]; - - // Support: IE <=9 only - // IE8-9 doesn't update selected after form reset (#2551) - if ( ( option.selected || i === index ) && - - // Don't return options that are disabled or in a disabled optgroup - !option.disabled && - ( !option.parentNode.disabled || - !nodeName( option.parentNode, "optgroup" ) ) ) { - - // Get the specific value for the option - value = jQuery( option ).val(); - - // We don't need an array for one selects - if ( one ) { - return value; - } - - // Multi-Selects return an array - values.push( value ); - } - } - - return values; - }, - - set: function( elem, value ) { - var optionSet, option, - options = elem.options, - values = jQuery.makeArray( value ), - i = options.length; - - while ( i-- ) { - option = options[ i ]; - - /* eslint-disable no-cond-assign */ - - if ( option.selected = - jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 - ) { - optionSet = true; - } - - /* eslint-enable no-cond-assign */ - } - - // Force browsers to behave consistently when non-matching value is set - if ( !optionSet ) { - elem.selectedIndex = -1; - } - return values; - } - } - } -} ); - -// Radios and checkboxes getter/setter -jQuery.each( [ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = { - set: function( elem, value ) { - if ( Array.isArray( value ) ) { - return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); - } - } - }; - if ( !support.checkOn ) { - jQuery.valHooks[ this ].get = function( elem ) { - return elem.getAttribute( "value" ) === null ? "on" : elem.value; - }; - } -} ); - - - - -// Return jQuery for attributes-only inclusion - - -support.focusin = "onfocusin" in window; - - -var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, - stopPropagationCallback = function( e ) { - e.stopPropagation(); - }; - -jQuery.extend( jQuery.event, { - - trigger: function( event, data, elem, onlyHandlers ) { - - var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, - eventPath = [ elem || document ], - type = hasOwn.call( event, "type" ) ? event.type : event, - namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; - - cur = lastElement = tmp = elem = elem || document; - - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } - - if ( type.indexOf( "." ) > -1 ) { - - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split( "." ); - type = namespaces.shift(); - namespaces.sort(); - } - ontype = type.indexOf( ":" ) < 0 && "on" + type; - - // Caller can pass in a jQuery.Event object, Object, or just an event type string - event = event[ jQuery.expando ] ? - event : - new jQuery.Event( type, typeof event === "object" && event ); - - // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) - event.isTrigger = onlyHandlers ? 2 : 3; - event.namespace = namespaces.join( "." ); - event.rnamespace = event.namespace ? - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : - null; - - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data == null ? - [ event ] : - jQuery.makeArray( data, [ event ] ); - - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { - - bubbleType = special.delegateType || type; - if ( !rfocusMorph.test( bubbleType + type ) ) { - cur = cur.parentNode; - } - for ( ; cur; cur = cur.parentNode ) { - eventPath.push( cur ); - tmp = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( tmp === ( elem.ownerDocument || document ) ) { - eventPath.push( tmp.defaultView || tmp.parentWindow || window ); - } - } - - // Fire handlers on the event path - i = 0; - while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { - lastElement = cur; - event.type = i > 1 ? - bubbleType : - special.bindType || type; - - // jQuery handler - handle = ( - dataPriv.get( cur, "events" ) || Object.create( null ) - )[ event.type ] && - dataPriv.get( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - - // Native handler - handle = ontype && cur[ ontype ]; - if ( handle && handle.apply && acceptData( cur ) ) { - event.result = handle.apply( cur, data ); - if ( event.result === false ) { - event.preventDefault(); - } - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( ( !special._default || - special._default.apply( eventPath.pop(), data ) === false ) && - acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name as the event. - // Don't do default actions on window, that's where global variables be (#6170) - if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - tmp = elem[ ontype ]; - - if ( tmp ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - - if ( event.isPropagationStopped() ) { - lastElement.addEventListener( type, stopPropagationCallback ); - } - - elem[ type ](); - - if ( event.isPropagationStopped() ) { - lastElement.removeEventListener( type, stopPropagationCallback ); - } - - jQuery.event.triggered = undefined; - - if ( tmp ) { - elem[ ontype ] = tmp; - } - } - } - } - - return event.result; - }, - - // Piggyback on a donor event to simulate a different one - // Used only for `focus(in | out)` events - simulate: function( type, elem, event ) { - var e = jQuery.extend( - new jQuery.Event(), - event, - { - type: type, - isSimulated: true - } - ); - - jQuery.event.trigger( e, null, elem ); - } - -} ); - -jQuery.fn.extend( { - - trigger: function( type, data ) { - return this.each( function() { - jQuery.event.trigger( type, data, this ); - } ); - }, - triggerHandler: function( type, data ) { - var elem = this[ 0 ]; - if ( elem ) { - return jQuery.event.trigger( type, data, elem, true ); - } - } -} ); - - -// Support: Firefox <=44 -// Firefox doesn't have focus(in | out) events -// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 -// -// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 -// focus(in | out) events fire after focus & blur events, -// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order -// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 -if ( !support.focusin ) { - jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler on the document while someone wants focusin/focusout - var handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); - }; - - jQuery.event.special[ fix ] = { - setup: function() { - - // Handle: regular nodes (via `this.ownerDocument`), window - // (via `this.document`) & document (via `this`). - var doc = this.ownerDocument || this.document || this, - attaches = dataPriv.access( doc, fix ); - - if ( !attaches ) { - doc.addEventListener( orig, handler, true ); - } - dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); - }, - teardown: function() { - var doc = this.ownerDocument || this.document || this, - attaches = dataPriv.access( doc, fix ) - 1; - - if ( !attaches ) { - doc.removeEventListener( orig, handler, true ); - dataPriv.remove( doc, fix ); - - } else { - dataPriv.access( doc, fix, attaches ); - } - } - }; - } ); -} -var location = window.location; - -var nonce = { guid: Date.now() }; - -var rquery = ( /\?/ ); - - - -// Cross-browser xml parsing -jQuery.parseXML = function( data ) { - var xml; - if ( !data || typeof data !== "string" ) { - return null; - } - - // Support: IE 9 - 11 only - // IE throws on parseFromString with invalid input. - try { - xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); - } catch ( e ) { - xml = undefined; - } - - if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { - jQuery.error( "Invalid XML: " + data ); - } - return xml; -}; - - -var - rbracket = /\[\]$/, - rCRLF = /\r?\n/g, - rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, - rsubmittable = /^(?:input|select|textarea|keygen)/i; - -function buildParams( prefix, obj, traditional, add ) { - var name; - - if ( Array.isArray( obj ) ) { - - // Serialize array item. - jQuery.each( obj, function( i, v ) { - if ( traditional || rbracket.test( prefix ) ) { - - // Treat each array item as a scalar. - add( prefix, v ); - - } else { - - // Item is non-scalar (array or object), encode its numeric index. - buildParams( - prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", - v, - traditional, - add - ); - } - } ); - - } else if ( !traditional && toType( obj ) === "object" ) { - - // Serialize object item. - for ( name in obj ) { - buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); - } - - } else { - - // Serialize scalar item. - add( prefix, obj ); - } -} - -// Serialize an array of form elements or a set of -// key/values into a query string -jQuery.param = function( a, traditional ) { - var prefix, - s = [], - add = function( key, valueOrFunction ) { - - // If value is a function, invoke it and use its return value - var value = isFunction( valueOrFunction ) ? - valueOrFunction() : - valueOrFunction; - - s[ s.length ] = encodeURIComponent( key ) + "=" + - encodeURIComponent( value == null ? "" : value ); - }; - - if ( a == null ) { - return ""; - } - - // If an array was passed in, assume that it is an array of form elements. - if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { - - // Serialize the form elements - jQuery.each( a, function() { - add( this.name, this.value ); - } ); - - } else { - - // If traditional, encode the "old" way (the way 1.3.2 or older - // did it), otherwise encode params recursively. - for ( prefix in a ) { - buildParams( prefix, a[ prefix ], traditional, add ); - } - } - - // Return the resulting serialization - return s.join( "&" ); -}; - -jQuery.fn.extend( { - serialize: function() { - return jQuery.param( this.serializeArray() ); - }, - serializeArray: function() { - return this.map( function() { - - // Can add propHook for "elements" to filter or add form elements - var elements = jQuery.prop( this, "elements" ); - return elements ? jQuery.makeArray( elements ) : this; - } ) - .filter( function() { - var type = this.type; - - // Use .is( ":disabled" ) so that fieldset[disabled] works - return this.name && !jQuery( this ).is( ":disabled" ) && - rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && - ( this.checked || !rcheckableType.test( type ) ); - } ) - .map( function( _i, elem ) { - var val = jQuery( this ).val(); - - if ( val == null ) { - return null; - } - - if ( Array.isArray( val ) ) { - return jQuery.map( val, function( val ) { - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ); - } - - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ).get(); - } -} ); - - -var - r20 = /%20/g, - rhash = /#.*$/, - rantiCache = /([?&])_=[^&]*/, - rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, - - // #7653, #8125, #8152: local protocol detection - rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, - rnoContent = /^(?:GET|HEAD)$/, - rprotocol = /^\/\//, - - /* Prefilters - * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) - * 2) These are called: - * - BEFORE asking for a transport - * - AFTER param serialization (s.data is a string if s.processData is true) - * 3) key is the dataType - * 4) the catchall symbol "*" can be used - * 5) execution will start with transport dataType and THEN continue down to "*" if needed - */ - prefilters = {}, - - /* Transports bindings - * 1) key is the dataType - * 2) the catchall symbol "*" can be used - * 3) selection will start with transport dataType and THEN go to "*" if needed - */ - transports = {}, - - // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression - allTypes = "*/".concat( "*" ), - - // Anchor tag for parsing the document origin - originAnchor = document.createElement( "a" ); - originAnchor.href = location.href; - -// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport -function addToPrefiltersOrTransports( structure ) { - - // dataTypeExpression is optional and defaults to "*" - return function( dataTypeExpression, func ) { - - if ( typeof dataTypeExpression !== "string" ) { - func = dataTypeExpression; - dataTypeExpression = "*"; - } - - var dataType, - i = 0, - dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; - - if ( isFunction( func ) ) { - - // For each dataType in the dataTypeExpression - while ( ( dataType = dataTypes[ i++ ] ) ) { - - // Prepend if requested - if ( dataType[ 0 ] === "+" ) { - dataType = dataType.slice( 1 ) || "*"; - ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); - - // Otherwise append - } else { - ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); - } - } - } - }; -} - -// Base inspection function for prefilters and transports -function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { - - var inspected = {}, - seekingTransport = ( structure === transports ); - - function inspect( dataType ) { - var selected; - inspected[ dataType ] = true; - jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { - var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); - if ( typeof dataTypeOrTransport === "string" && - !seekingTransport && !inspected[ dataTypeOrTransport ] ) { - - options.dataTypes.unshift( dataTypeOrTransport ); - inspect( dataTypeOrTransport ); - return false; - } else if ( seekingTransport ) { - return !( selected = dataTypeOrTransport ); - } - } ); - return selected; - } - - return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); -} - -// A special extend for ajax options -// that takes "flat" options (not to be deep extended) -// Fixes #9887 -function ajaxExtend( target, src ) { - var key, deep, - flatOptions = jQuery.ajaxSettings.flatOptions || {}; - - for ( key in src ) { - if ( src[ key ] !== undefined ) { - ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; - } - } - if ( deep ) { - jQuery.extend( true, target, deep ); - } - - return target; -} - -/* Handles responses to an ajax request: - * - finds the right dataType (mediates between content-type and expected dataType) - * - returns the corresponding response - */ -function ajaxHandleResponses( s, jqXHR, responses ) { - - var ct, type, finalDataType, firstDataType, - contents = s.contents, - dataTypes = s.dataTypes; - - // Remove auto dataType and get content-type in the process - while ( dataTypes[ 0 ] === "*" ) { - dataTypes.shift(); - if ( ct === undefined ) { - ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); - } - } - - // Check if we're dealing with a known content-type - if ( ct ) { - for ( type in contents ) { - if ( contents[ type ] && contents[ type ].test( ct ) ) { - dataTypes.unshift( type ); - break; - } - } - } - - // Check to see if we have a response for the expected dataType - if ( dataTypes[ 0 ] in responses ) { - finalDataType = dataTypes[ 0 ]; - } else { - - // Try convertible dataTypes - for ( type in responses ) { - if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { - finalDataType = type; - break; - } - if ( !firstDataType ) { - firstDataType = type; - } - } - - // Or just use first one - finalDataType = finalDataType || firstDataType; - } - - // If we found a dataType - // We add the dataType to the list if needed - // and return the corresponding response - if ( finalDataType ) { - if ( finalDataType !== dataTypes[ 0 ] ) { - dataTypes.unshift( finalDataType ); - } - return responses[ finalDataType ]; - } -} - -/* Chain conversions given the request and the original response - * Also sets the responseXXX fields on the jqXHR instance - */ -function ajaxConvert( s, response, jqXHR, isSuccess ) { - var conv2, current, conv, tmp, prev, - converters = {}, - - // Work with a copy of dataTypes in case we need to modify it for conversion - dataTypes = s.dataTypes.slice(); - - // Create converters map with lowercased keys - if ( dataTypes[ 1 ] ) { - for ( conv in s.converters ) { - converters[ conv.toLowerCase() ] = s.converters[ conv ]; - } - } - - current = dataTypes.shift(); - - // Convert to each sequential dataType - while ( current ) { - - if ( s.responseFields[ current ] ) { - jqXHR[ s.responseFields[ current ] ] = response; - } - - // Apply the dataFilter if provided - if ( !prev && isSuccess && s.dataFilter ) { - response = s.dataFilter( response, s.dataType ); - } - - prev = current; - current = dataTypes.shift(); - - if ( current ) { - - // There's only work to do if current dataType is non-auto - if ( current === "*" ) { - - current = prev; - - // Convert response if prev dataType is non-auto and differs from current - } else if ( prev !== "*" && prev !== current ) { - - // Seek a direct converter - conv = converters[ prev + " " + current ] || converters[ "* " + current ]; - - // If none found, seek a pair - if ( !conv ) { - for ( conv2 in converters ) { - - // If conv2 outputs current - tmp = conv2.split( " " ); - if ( tmp[ 1 ] === current ) { - - // If prev can be converted to accepted input - conv = converters[ prev + " " + tmp[ 0 ] ] || - converters[ "* " + tmp[ 0 ] ]; - if ( conv ) { - - // Condense equivalence converters - if ( conv === true ) { - conv = converters[ conv2 ]; - - // Otherwise, insert the intermediate dataType - } else if ( converters[ conv2 ] !== true ) { - current = tmp[ 0 ]; - dataTypes.unshift( tmp[ 1 ] ); - } - break; - } - } - } - } - - // Apply converter (if not an equivalence) - if ( conv !== true ) { - - // Unless errors are allowed to bubble, catch and return them - if ( conv && s.throws ) { - response = conv( response ); - } else { - try { - response = conv( response ); - } catch ( e ) { - return { - state: "parsererror", - error: conv ? e : "No conversion from " + prev + " to " + current - }; - } - } - } - } - } - } - - return { state: "success", data: response }; -} - -jQuery.extend( { - - // Counter for holding the number of active queries - active: 0, - - // Last-Modified header cache for next request - lastModified: {}, - etag: {}, - - ajaxSettings: { - url: location.href, - type: "GET", - isLocal: rlocalProtocol.test( location.protocol ), - global: true, - processData: true, - async: true, - contentType: "application/x-www-form-urlencoded; charset=UTF-8", - - /* - timeout: 0, - data: null, - dataType: null, - username: null, - password: null, - cache: null, - throws: false, - traditional: false, - headers: {}, - */ - - accepts: { - "*": allTypes, - text: "text/plain", - html: "text/html", - xml: "application/xml, text/xml", - json: "application/json, text/javascript" - }, - - contents: { - xml: /\bxml\b/, - html: /\bhtml/, - json: /\bjson\b/ - }, - - responseFields: { - xml: "responseXML", - text: "responseText", - json: "responseJSON" - }, - - // Data converters - // Keys separate source (or catchall "*") and destination types with a single space - converters: { - - // Convert anything to text - "* text": String, - - // Text to html (true = no transformation) - "text html": true, - - // Evaluate text as a json expression - "text json": JSON.parse, - - // Parse text as xml - "text xml": jQuery.parseXML - }, - - // For options that shouldn't be deep extended: - // you can add your own custom options here if - // and when you create one that shouldn't be - // deep extended (see ajaxExtend) - flatOptions: { - url: true, - context: true - } - }, - - // Creates a full fledged settings object into target - // with both ajaxSettings and settings fields. - // If target is omitted, writes into ajaxSettings. - ajaxSetup: function( target, settings ) { - return settings ? - - // Building a settings object - ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : - - // Extending ajaxSettings - ajaxExtend( jQuery.ajaxSettings, target ); - }, - - ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), - ajaxTransport: addToPrefiltersOrTransports( transports ), - - // Main method - ajax: function( url, options ) { - - // If url is an object, simulate pre-1.5 signature - if ( typeof url === "object" ) { - options = url; - url = undefined; - } - - // Force options to be an object - options = options || {}; - - var transport, - - // URL without anti-cache param - cacheURL, - - // Response headers - responseHeadersString, - responseHeaders, - - // timeout handle - timeoutTimer, - - // Url cleanup var - urlAnchor, - - // Request state (becomes false upon send and true upon completion) - completed, - - // To know if global events are to be dispatched - fireGlobals, - - // Loop variable - i, - - // uncached part of the url - uncached, - - // Create the final options object - s = jQuery.ajaxSetup( {}, options ), - - // Callbacks context - callbackContext = s.context || s, - - // Context for global events is callbackContext if it is a DOM node or jQuery collection - globalEventContext = s.context && - ( callbackContext.nodeType || callbackContext.jquery ) ? - jQuery( callbackContext ) : - jQuery.event, - - // Deferreds - deferred = jQuery.Deferred(), - completeDeferred = jQuery.Callbacks( "once memory" ), - - // Status-dependent callbacks - statusCode = s.statusCode || {}, - - // Headers (they are sent all at once) - requestHeaders = {}, - requestHeadersNames = {}, - - // Default abort message - strAbort = "canceled", - - // Fake xhr - jqXHR = { - readyState: 0, - - // Builds headers hashtable if needed - getResponseHeader: function( key ) { - var match; - if ( completed ) { - if ( !responseHeaders ) { - responseHeaders = {}; - while ( ( match = rheaders.exec( responseHeadersString ) ) ) { - responseHeaders[ match[ 1 ].toLowerCase() + " " ] = - ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) - .concat( match[ 2 ] ); - } - } - match = responseHeaders[ key.toLowerCase() + " " ]; - } - return match == null ? null : match.join( ", " ); - }, - - // Raw string - getAllResponseHeaders: function() { - return completed ? responseHeadersString : null; - }, - - // Caches the header - setRequestHeader: function( name, value ) { - if ( completed == null ) { - name = requestHeadersNames[ name.toLowerCase() ] = - requestHeadersNames[ name.toLowerCase() ] || name; - requestHeaders[ name ] = value; - } - return this; - }, - - // Overrides response content-type header - overrideMimeType: function( type ) { - if ( completed == null ) { - s.mimeType = type; - } - return this; - }, - - // Status-dependent callbacks - statusCode: function( map ) { - var code; - if ( map ) { - if ( completed ) { - - // Execute the appropriate callbacks - jqXHR.always( map[ jqXHR.status ] ); - } else { - - // Lazy-add the new callbacks in a way that preserves old ones - for ( code in map ) { - statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; - } - } - } - return this; - }, - - // Cancel the request - abort: function( statusText ) { - var finalText = statusText || strAbort; - if ( transport ) { - transport.abort( finalText ); - } - done( 0, finalText ); - return this; - } - }; - - // Attach deferreds - deferred.promise( jqXHR ); - - // Add protocol if not provided (prefilters might expect it) - // Handle falsy url in the settings object (#10093: consistency with old signature) - // We also use the url parameter if available - s.url = ( ( url || s.url || location.href ) + "" ) - .replace( rprotocol, location.protocol + "//" ); - - // Alias method option to type as per ticket #12004 - s.type = options.method || options.type || s.method || s.type; - - // Extract dataTypes list - s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; - - // A cross-domain request is in order when the origin doesn't match the current origin. - if ( s.crossDomain == null ) { - urlAnchor = document.createElement( "a" ); - - // Support: IE <=8 - 11, Edge 12 - 15 - // IE throws exception on accessing the href property if url is malformed, - // e.g. http://example.com:80x/ - try { - urlAnchor.href = s.url; - - // Support: IE <=8 - 11 only - // Anchor's host property isn't correctly set when s.url is relative - urlAnchor.href = urlAnchor.href; - s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== - urlAnchor.protocol + "//" + urlAnchor.host; - } catch ( e ) { - - // If there is an error parsing the URL, assume it is crossDomain, - // it can be rejected by the transport if it is invalid - s.crossDomain = true; - } - } - - // Convert data if not already a string - if ( s.data && s.processData && typeof s.data !== "string" ) { - s.data = jQuery.param( s.data, s.traditional ); - } - - // Apply prefilters - inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); - - // If request was aborted inside a prefilter, stop there - if ( completed ) { - return jqXHR; - } - - // We can fire global events as of now if asked to - // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) - fireGlobals = jQuery.event && s.global; - - // Watch for a new set of requests - if ( fireGlobals && jQuery.active++ === 0 ) { - jQuery.event.trigger( "ajaxStart" ); - } - - // Uppercase the type - s.type = s.type.toUpperCase(); - - // Determine if request has content - s.hasContent = !rnoContent.test( s.type ); - - // Save the URL in case we're toying with the If-Modified-Since - // and/or If-None-Match header later on - // Remove hash to simplify url manipulation - cacheURL = s.url.replace( rhash, "" ); - - // More options handling for requests with no content - if ( !s.hasContent ) { - - // Remember the hash so we can put it back - uncached = s.url.slice( cacheURL.length ); - - // If data is available and should be processed, append data to url - if ( s.data && ( s.processData || typeof s.data === "string" ) ) { - cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; - - // #9682: remove data so that it's not used in an eventual retry - delete s.data; - } - - // Add or update anti-cache param if needed - if ( s.cache === false ) { - cacheURL = cacheURL.replace( rantiCache, "$1" ); - uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) + - uncached; - } - - // Put hash and anti-cache on the URL that will be requested (gh-1732) - s.url = cacheURL + uncached; - - // Change '%20' to '+' if this is encoded form body content (gh-2658) - } else if ( s.data && s.processData && - ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { - s.data = s.data.replace( r20, "+" ); - } - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - if ( jQuery.lastModified[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); - } - if ( jQuery.etag[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); - } - } - - // Set the correct header, if data is being sent - if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { - jqXHR.setRequestHeader( "Content-Type", s.contentType ); - } - - // Set the Accepts header for the server, depending on the dataType - jqXHR.setRequestHeader( - "Accept", - s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? - s.accepts[ s.dataTypes[ 0 ] ] + - ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : - s.accepts[ "*" ] - ); - - // Check for headers option - for ( i in s.headers ) { - jqXHR.setRequestHeader( i, s.headers[ i ] ); - } - - // Allow custom headers/mimetypes and early abort - if ( s.beforeSend && - ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { - - // Abort if not done already and return - return jqXHR.abort(); - } - - // Aborting is no longer a cancellation - strAbort = "abort"; - - // Install callbacks on deferreds - completeDeferred.add( s.complete ); - jqXHR.done( s.success ); - jqXHR.fail( s.error ); - - // Get transport - transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); - - // If no transport, we auto-abort - if ( !transport ) { - done( -1, "No Transport" ); - } else { - jqXHR.readyState = 1; - - // Send global event - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); - } - - // If request was aborted inside ajaxSend, stop there - if ( completed ) { - return jqXHR; - } - - // Timeout - if ( s.async && s.timeout > 0 ) { - timeoutTimer = window.setTimeout( function() { - jqXHR.abort( "timeout" ); - }, s.timeout ); - } - - try { - completed = false; - transport.send( requestHeaders, done ); - } catch ( e ) { - - // Rethrow post-completion exceptions - if ( completed ) { - throw e; - } - - // Propagate others as results - done( -1, e ); - } - } - - // Callback for when everything is done - function done( status, nativeStatusText, responses, headers ) { - var isSuccess, success, error, response, modified, - statusText = nativeStatusText; - - // Ignore repeat invocations - if ( completed ) { - return; - } - - completed = true; - - // Clear timeout if it exists - if ( timeoutTimer ) { - window.clearTimeout( timeoutTimer ); - } - - // Dereference transport for early garbage collection - // (no matter how long the jqXHR object will be used) - transport = undefined; - - // Cache response headers - responseHeadersString = headers || ""; - - // Set readyState - jqXHR.readyState = status > 0 ? 4 : 0; - - // Determine if successful - isSuccess = status >= 200 && status < 300 || status === 304; - - // Get response data - if ( responses ) { - response = ajaxHandleResponses( s, jqXHR, responses ); - } - - // Use a noop converter for missing script - if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) { - s.converters[ "text script" ] = function() {}; - } - - // Convert no matter what (that way responseXXX fields are always set) - response = ajaxConvert( s, response, jqXHR, isSuccess ); - - // If successful, handle type chaining - if ( isSuccess ) { - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - modified = jqXHR.getResponseHeader( "Last-Modified" ); - if ( modified ) { - jQuery.lastModified[ cacheURL ] = modified; - } - modified = jqXHR.getResponseHeader( "etag" ); - if ( modified ) { - jQuery.etag[ cacheURL ] = modified; - } - } - - // if no content - if ( status === 204 || s.type === "HEAD" ) { - statusText = "nocontent"; - - // if not modified - } else if ( status === 304 ) { - statusText = "notmodified"; - - // If we have data, let's convert it - } else { - statusText = response.state; - success = response.data; - error = response.error; - isSuccess = !error; - } - } else { - - // Extract error from statusText and normalize for non-aborts - error = statusText; - if ( status || !statusText ) { - statusText = "error"; - if ( status < 0 ) { - status = 0; - } - } - } - - // Set data for the fake xhr object - jqXHR.status = status; - jqXHR.statusText = ( nativeStatusText || statusText ) + ""; - - // Success/Error - if ( isSuccess ) { - deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); - } else { - deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); - } - - // Status-dependent callbacks - jqXHR.statusCode( statusCode ); - statusCode = undefined; - - if ( fireGlobals ) { - globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", - [ jqXHR, s, isSuccess ? success : error ] ); - } - - // Complete - completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); - - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); - - // Handle the global AJAX counter - if ( !( --jQuery.active ) ) { - jQuery.event.trigger( "ajaxStop" ); - } - } - } - - return jqXHR; - }, - - getJSON: function( url, data, callback ) { - return jQuery.get( url, data, callback, "json" ); - }, - - getScript: function( url, callback ) { - return jQuery.get( url, undefined, callback, "script" ); - } -} ); - -jQuery.each( [ "get", "post" ], function( _i, method ) { - jQuery[ method ] = function( url, data, callback, type ) { - - // Shift arguments if data argument was omitted - if ( isFunction( data ) ) { - type = type || callback; - callback = data; - data = undefined; - } - - // The url can be an options object (which then must have .url) - return jQuery.ajax( jQuery.extend( { - url: url, - type: method, - dataType: type, - data: data, - success: callback - }, jQuery.isPlainObject( url ) && url ) ); - }; -} ); - -jQuery.ajaxPrefilter( function( s ) { - var i; - for ( i in s.headers ) { - if ( i.toLowerCase() === "content-type" ) { - s.contentType = s.headers[ i ] || ""; - } - } -} ); - - -jQuery._evalUrl = function( url, options, doc ) { - return jQuery.ajax( { - url: url, - - // Make this explicit, since user can override this through ajaxSetup (#11264) - type: "GET", - dataType: "script", - cache: true, - async: false, - global: false, - - // Only evaluate the response if it is successful (gh-4126) - // dataFilter is not invoked for failure responses, so using it instead - // of the default converter is kludgy but it works. - converters: { - "text script": function() {} - }, - dataFilter: function( response ) { - jQuery.globalEval( response, options, doc ); - } - } ); -}; - - -jQuery.fn.extend( { - wrapAll: function( html ) { - var wrap; - - if ( this[ 0 ] ) { - if ( isFunction( html ) ) { - html = html.call( this[ 0 ] ); - } - - // The elements to wrap the target around - wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); - - if ( this[ 0 ].parentNode ) { - wrap.insertBefore( this[ 0 ] ); - } - - wrap.map( function() { - var elem = this; - - while ( elem.firstElementChild ) { - elem = elem.firstElementChild; - } - - return elem; - } ).append( this ); - } - - return this; - }, - - wrapInner: function( html ) { - if ( isFunction( html ) ) { - return this.each( function( i ) { - jQuery( this ).wrapInner( html.call( this, i ) ); - } ); - } - - return this.each( function() { - var self = jQuery( this ), - contents = self.contents(); - - if ( contents.length ) { - contents.wrapAll( html ); - - } else { - self.append( html ); - } - } ); - }, - - wrap: function( html ) { - var htmlIsFunction = isFunction( html ); - - return this.each( function( i ) { - jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); - } ); - }, - - unwrap: function( selector ) { - this.parent( selector ).not( "body" ).each( function() { - jQuery( this ).replaceWith( this.childNodes ); - } ); - return this; - } -} ); - - -jQuery.expr.pseudos.hidden = function( elem ) { - return !jQuery.expr.pseudos.visible( elem ); -}; -jQuery.expr.pseudos.visible = function( elem ) { - return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); -}; - - - - -jQuery.ajaxSettings.xhr = function() { - try { - return new window.XMLHttpRequest(); - } catch ( e ) {} -}; - -var xhrSuccessStatus = { - - // File protocol always yields status code 0, assume 200 - 0: 200, - - // Support: IE <=9 only - // #1450: sometimes IE returns 1223 when it should be 204 - 1223: 204 - }, - xhrSupported = jQuery.ajaxSettings.xhr(); - -support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); -support.ajax = xhrSupported = !!xhrSupported; - -jQuery.ajaxTransport( function( options ) { - var callback, errorCallback; - - // Cross domain only allowed if supported through XMLHttpRequest - if ( support.cors || xhrSupported && !options.crossDomain ) { - return { - send: function( headers, complete ) { - var i, - xhr = options.xhr(); - - xhr.open( - options.type, - options.url, - options.async, - options.username, - options.password - ); - - // Apply custom fields if provided - if ( options.xhrFields ) { - for ( i in options.xhrFields ) { - xhr[ i ] = options.xhrFields[ i ]; - } - } - - // Override mime type if needed - if ( options.mimeType && xhr.overrideMimeType ) { - xhr.overrideMimeType( options.mimeType ); - } - - // X-Requested-With header - // For cross-domain requests, seeing as conditions for a preflight are - // akin to a jigsaw puzzle, we simply never set it to be sure. - // (it can always be set on a per-request basis or even using ajaxSetup) - // For same-domain requests, won't change header if already provided. - if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { - headers[ "X-Requested-With" ] = "XMLHttpRequest"; - } - - // Set headers - for ( i in headers ) { - xhr.setRequestHeader( i, headers[ i ] ); - } - - // Callback - callback = function( type ) { - return function() { - if ( callback ) { - callback = errorCallback = xhr.onload = - xhr.onerror = xhr.onabort = xhr.ontimeout = - xhr.onreadystatechange = null; - - if ( type === "abort" ) { - xhr.abort(); - } else if ( type === "error" ) { - - // Support: IE <=9 only - // On a manual native abort, IE9 throws - // errors on any property access that is not readyState - if ( typeof xhr.status !== "number" ) { - complete( 0, "error" ); - } else { - complete( - - // File: protocol always yields status 0; see #8605, #14207 - xhr.status, - xhr.statusText - ); - } - } else { - complete( - xhrSuccessStatus[ xhr.status ] || xhr.status, - xhr.statusText, - - // Support: IE <=9 only - // IE9 has no XHR2 but throws on binary (trac-11426) - // For XHR2 non-text, let the caller handle it (gh-2498) - ( xhr.responseType || "text" ) !== "text" || - typeof xhr.responseText !== "string" ? - { binary: xhr.response } : - { text: xhr.responseText }, - xhr.getAllResponseHeaders() - ); - } - } - }; - }; - - // Listen to events - xhr.onload = callback(); - errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); - - // Support: IE 9 only - // Use onreadystatechange to replace onabort - // to handle uncaught aborts - if ( xhr.onabort !== undefined ) { - xhr.onabort = errorCallback; - } else { - xhr.onreadystatechange = function() { - - // Check readyState before timeout as it changes - if ( xhr.readyState === 4 ) { - - // Allow onerror to be called first, - // but that will not handle a native abort - // Also, save errorCallback to a variable - // as xhr.onerror cannot be accessed - window.setTimeout( function() { - if ( callback ) { - errorCallback(); - } - } ); - } - }; - } - - // Create the abort callback - callback = callback( "abort" ); - - try { - - // Do send the request (this may raise an exception) - xhr.send( options.hasContent && options.data || null ); - } catch ( e ) { - - // #14683: Only rethrow if this hasn't been notified as an error yet - if ( callback ) { - throw e; - } - } - }, - - abort: function() { - if ( callback ) { - callback(); - } - } - }; - } -} ); - - - - -// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) -jQuery.ajaxPrefilter( function( s ) { - if ( s.crossDomain ) { - s.contents.script = false; - } -} ); - -// Install script dataType -jQuery.ajaxSetup( { - accepts: { - script: "text/javascript, application/javascript, " + - "application/ecmascript, application/x-ecmascript" - }, - contents: { - script: /\b(?:java|ecma)script\b/ - }, - converters: { - "text script": function( text ) { - jQuery.globalEval( text ); - return text; - } - } -} ); - -// Handle cache's special case and crossDomain -jQuery.ajaxPrefilter( "script", function( s ) { - if ( s.cache === undefined ) { - s.cache = false; - } - if ( s.crossDomain ) { - s.type = "GET"; - } -} ); - -// Bind script tag hack transport -jQuery.ajaxTransport( "script", function( s ) { - - // This transport only deals with cross domain or forced-by-attrs requests - if ( s.crossDomain || s.scriptAttrs ) { - var script, callback; - return { - send: function( _, complete ) { - script = jQuery( " - - - - - - - - - - - - - - - - -
-
-
- - -
- -
-

Advanced esp-modem use cases

-

This chapter outlines basic extensibility of the esp-modem component.

-
-

Custom instantiation with DCE factory

-

It is possible to create a modem handle in many different ways:

-
    -
  • Build a DCE on top a generic module, user defined module or build the module only (in case the application will only use AT command interface)

  • -
  • Create the DCE as a shared, unique or a vanilla pointer

  • -
  • Create a generic DCE or a templated DCE_T of a specific module (this could be one of the supported modules or a user defined module)

  • -
-

All the functionality is provided by the DCE factory

-
-
-group ESP_MODEM_DCE_FACTORY
-

DCE modem factory.

-
-

Enums

-
-
-enum class ModemType
-

Specific modem choice when creating by the Factory.

-

Values:

-
-
-enumerator GenericModule
-

Default generic module with the most common commands

-
- -
-
-enumerator SIM7600
-

Derived from the GenericModule, specifics applied to SIM7600 model

-
- -
-
-enumerator SIM7070
-

Derived from the GenericModule, specifics applied to SIM7070 model

-
- -
-
-enumerator SIM7000
-

Derived from the GenericModule, specifics applied to SIM7000 model

-
- -
-
-enumerator BG96
-

Derived from the GenericModule, specifics applied to BG69 model

-
- -
-
-enumerator SIM800
-

Derived from the GenericModule with specifics applied to SIM800 model

-
- -
- -
-
-
-class FactoryHelper
-
-#include <esp_modem_dce_factory.hpp>
-

Helper class for creating a user define pointer in a specific way, either as a plain pointer, shared_ptr or unique_ptr.

-
- -
-
-template<typename T_Module>
class Creator
-
-#include <esp_modem_dce_factory.hpp>
-

Creator class for building a DCE_T<Module> in a specific way, either from a Module object or by default from the DTE and netif.

-
-
Throws
-

-
-
- -
-
-class esp_modem::dce_factory::Factory
-
-#include <esp_modem_dce_factory.hpp>
-

Factory class for creating virtual DCE objects based on the configuration of the supplied module. This could also be used to create a custom module or a DCE_T<module>, provided user app derives from this factory.

-
-

Public Functions

-
-
-template<typename ...Args>
inline std::unique_ptr<DCE> build_unique(const config *cfg, Args&&... args)
-

Create a default unique_ptr DCE generically, with the chosen module derived from the GenericModule.

-
-
Template Parameters
-

Args – Arguments to the builder, i.e. constructor of esp_modem::DCE_T class

-
-
Parameters
-
-
-
Returns
-

unique_ptr DCE of the created DCE on success

-
-
-
- -
-
-

Public Static Functions

-
-
-template<typename T_Module, typename ...Args>
static inline std::unique_ptr<DCE> build_unique(const config *cfg, Args&&... args)
-

Create a default unique_ptr DCE in a specific way (from the module)

-
-
Template Parameters
-
    -
  • Module – Specific Module used in this DCE

  • -
  • Args – Arguments to the builder, i.e. constructor of esp_modem::DCE_T class

  • -
-
-
Parameters
-
-
-
Returns
-

unique_ptr DCE of the created DCE on success

-
-
-
- -
-
-template<typename T_Module, typename ...Args>
static inline DCE *build(const config *cfg, Args&&... args)
-

Create a DCE.

-
-
Template Parameters
-
    -
  • Module – Specific Module used in this DCE

  • -
  • Args – Arguments to the builder, i.e. constructor of esp_modem::DCE_T class

  • -
-
-
Parameters
-
-
-
Returns
-

DCE pointer the created DCE on success

-
-
-
- -
-
- -
- -
-
-

Create custom module

-

Creating a custom module is necessary if the application needs to use a specific device that is not supported -and their commands differ from any of the supported devices. In this case it is recommended to define a new class -representing this specific device and derive from the esp_modem::GenericModule. In order to instantiate -the appropriate DCE of this module, application could use the DCE factory, and build the DCE with -the specific module, using esp_modem::dce_factory::Factory::build().

-

Please refer to the implementation of the existing modules.

-

Please note that the modem_console example defines a trivial custom modem DCE which overrides one command, -for demonstration purposes only.

-
-
-

Create new communication interface

-

In order to connect to a device using an unsupported interface (e.g. SPI or I2C), it is necessary to implement -a custom DTE object and supply it into the DCE factory. The DCE is typically created in two steps:

-
    -
  • Define and create the corresponding terminal, which communicates on the custom interface. This terminal should support basic IO methods defined in esp_modem::Terminal and derive from it.

  • -
  • Create the DTE which uses the custom Terminal

  • -
-

Please refer to the implementation of the existing UART DTE.

-
-
- - -
- -
-
- -
-
- - - - - - - \ No newline at end of file diff --git a/esp_modem/api_docs.html b/esp_modem/api_docs.html deleted file mode 100644 index 5fd5ee791..000000000 --- a/esp_modem/api_docs.html +++ /dev/null @@ -1,1157 +0,0 @@ - - - - - - - - - C API Documentation — esp-modem documentation - - - - - - - - - - - - - - - - - - - -
-
-
- - -
- -
-

C API Documentation

-

The C API is very simple and consist of these two basic parts:

- -

The Typical application workflow is to:

- -

Note the configuration structures for DTE and DCE, needed for creating the DCE instance, is documented in Configuration structures

-
-

Lifecycle API

-

These functions are used to create, destroy and set modem working mode.

- -
-
-group ESP_MODEM_C_API
-

Set of basic C API for ESP-MODEM.

-
-

Typedefs

-
-
-typedef enum esp_modem_dce_mode esp_modem_dce_mode_t
-

DCE mode: This enum is used to set desired operation mode of the DCE.

-
- -
-
-typedef enum esp_modem_dce_device esp_modem_dce_device_t
-

DCE devices: Enum list of supported devices.

-
- -
-
-typedef enum esp_modem_terminal_error esp_modem_terminal_error_t
-

Terminal errors.

-
- -
-
-typedef void (*esp_modem_terminal_error_cbt)(esp_modem_terminal_error_t)
-

Terminal error callback.

-
- -
-
-

Enums

-
-
-enum esp_modem_dce_mode
-

DCE mode: This enum is used to set desired operation mode of the DCE.

-

Values:

-
-
-enumerator ESP_MODEM_MODE_COMMAND
-

Default mode after modem startup, used for sending AT commands

-
- -
-
-enumerator ESP_MODEM_MODE_DATA
-

Used for switching to PPP mode for the modem to connect to a network

-
- -
-
-enumerator ESP_MODEM_MODE_CMUX
-

Multiplexed terminal mode

-
- -
-
-enumerator ESP_MODEM_MODE_CMUX_MANUAL
-

CMUX manual mode

-
- -
-
-enumerator ESP_MODEM_MODE_CMUX_MANUAL_EXIT
-

Exit CMUX manual mode

-
- -
-
-enumerator ESP_MODEM_MODE_CMUX_MANUAL_SWAP
-

Swap terminals in CMUX manual mode

-
- -
-
-enumerator ESP_MODEM_MODE_CMUX_MANUAL_DATA
-

Set DATA mode in CMUX manual mode

-
- -
-
-enumerator ESP_MODEM_MODE_CMUX_MANUAL_COMMAND
-

Set COMMAND mode in CMUX manual mode

-
- -
- -
-
-enum esp_modem_dce_device
-

DCE devices: Enum list of supported devices.

-

Values:

-
-
-enumerator ESP_MODEM_DCE_GENETIC
-

The most generic device

-
- -
-
-enumerator ESP_MODEM_DCE_SIM7600
-
- -
-
-enumerator ESP_MODEM_DCE_SIM7070
-
- -
-
-enumerator ESP_MODEM_DCE_SIM7000
-
- -
-
-enumerator ESP_MODEM_DCE_BG96
-
- -
-
-enumerator ESP_MODEM_DCE_SIM800
-
- -
- -
-
-enum esp_modem_terminal_error
-

Terminal errors.

-

Values:

-
-
-enumerator ESP_MODEM_TERMINAL_BUFFER_OVERFLOW
-
- -
-
-enumerator ESP_MODEM_TERMINAL_CHECKSUM_ERROR
-
- -
-
-enumerator ESP_MODEM_TERMINAL_UNEXPECTED_CONTROL_FLOW
-
- -
-
-enumerator ESP_MODEM_TERMINAL_DEVICE_GONE
-
- -
-
-enumerator ESP_MODEM_TERMINAL_UNKNOWN_ERROR
-
- -
- -
-
-

Functions

-
-
-esp_modem_dce_t *esp_modem_new(const esp_modem_dte_config_t *dte_config, const esp_modem_dce_config_t *dce_config, esp_netif_t *netif)
-

Create a generic DCE handle for new modem API.

-
-
Parameters
-
    -
  • dte_config – DTE configuration (UART config for now)

  • -
  • dce_config – DCE configuration

  • -
  • netif – Network interface handle for the data mode

  • -
-
-
Returns
-

DCE pointer on success, NULL on failure

-
-
-
- -
-
-esp_modem_dce_t *esp_modem_new_dev(esp_modem_dce_device_t module, const esp_modem_dte_config_t *dte_config, const esp_modem_dce_config_t *dce_config, esp_netif_t *netif)
-

Create a DCE handle using the supplied device.

-
-
Parameters
-
    -
  • module – Specific device for creating this DCE

  • -
  • dte_config – DTE configuration (UART config for now)

  • -
  • dce_config – DCE configuration

  • -
  • netif – Network interface handle for the data mode

  • -
-
-
Returns
-

DCE pointer on success, NULL on failure

-
-
-
- -
-
-void esp_modem_destroy(esp_modem_dce_t *dce)
-

Destroys modem’s DCE handle.

-
-
Parameters
-

dce – DCE to destroy

-
-
-
- -
-
-esp_err_t esp_modem_set_error_cb(esp_modem_dce_t *dce, esp_modem_terminal_error_cbt err_cb)
-

Set DTE’s error callback.

-
-
Parameters
-
    -
  • dce – Modem DCE handle

  • -
  • err_cb[in] Error callback

  • -
-
-
Returns
-

ESP_OK on success, ESP_FAIL on failure

-
-
-
- -
-
-esp_err_t esp_modem_set_mode(esp_modem_dce_t *dce, esp_modem_dce_mode_t mode)
-

Set operation mode for this DCE.

-
-
Parameters
-
    -
  • dce – Modem DCE handle

  • -
  • mode – Desired MODE

  • -
-
-
Returns
-

ESP_OK on success, ESP_FAIL on failure

-
-
-
- -
-
-esp_err_t esp_modem_command(esp_modem_dce_t *dce, const char *command, esp_err_t (*got_line_cb)(uint8_t *data, size_t len), uint32_t timeout_ms)
-
- -
-
- -
-
-

Modem commands

-

These functions are the actual commands to communicate with the modem using AT command interface.

-

Note that the functions which implement AT commands returning textual values use plain char * -pointer as the return value. The API expects the output data to point to user allocated space of at least -ESP_MODEM_C_API_STR_MAX (64 by default) bytes, it also truncates the output data to this size.

-
-

Functions

-
-
-command_result esp_modem_sync()
-

Sends the initial AT sequence to sync up with the device.

-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result esp_modem_get_operator_name(STRING_OUT(p1, name), INT_OUT(p2, act))
-

Reads the operator name.

-
-
Parameters
-
    -
  • operator[out] name

  • -
  • access[out] technology

  • -
-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result esp_modem_store_profile()
-

Stores current user profile.

-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result esp_modem_set_pin(STRING_IN(p1, pin))
-

Sets the supplied PIN code.

-
-
Parameters
-

pin[in] Pin

-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result esp_modem_at(STRING_IN(p1, cmd), STRING_OUT(p2, out), INT_IN(p3, timeout))
-

Execute the supplied AT command.

-
-
Parameters
-
    -
  • at[in] AT command

  • -
  • out[out] Command output string

  • -
  • timeout[in] AT command timeout in milliseconds

  • -
-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result esp_modem_read_pin(BOOL_OUT(p1, pin_ok))
-

Checks if the SIM needs a PIN.

-
-
Parameters
-

pin_ok[out] true if the SIM card doesn’t need a PIN to unlock

-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result esp_modem_set_echo(BOOL_IN(p1, echo_on))
-

Sets echo mode.

-
-
Parameters
-

echo_on[in] true if echo mode on (repeats the commands)

-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result esp_modem_sms_txt_mode(BOOL_IN(p1, txt))
-

Sets the Txt or Pdu mode for SMS (only txt is supported)

-
-
Parameters
-

txt[in] true if txt mode

-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result esp_modem_sms_character_set()
-

Sets the default (GSM) character set.

-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result esp_modem_send_sms(STRING_IN(p1, number), STRING_IN(p2, message))
-

Sends SMS message in txt mode.

-
-
Parameters
-
    -
  • number[in] Phone number to send the message to

  • -
  • message[in] Text message to be sent

  • -
-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result esp_modem_resume_data_mode()
-

Resumes data mode (Switches back to the data mode, which was temporarily suspended)

-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result esp_modem_set_pdp_context(STRUCT_OUT(PdpContext, p1))
-

Sets php context.

-
-
Parameters
-

p1[in] PdP context struct to setup modem cellular connection

-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result esp_modem_set_command_mode()
-

Switches to the command mode.

-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result esp_modem_set_cmux()
-

Switches to the CMUX mode.

-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result esp_modem_get_imsi(STRING_OUT(p1, imsi))
-

Reads the IMSI number.

-
-
Parameters
-

imsi[out] Module’s IMSI number

-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result esp_modem_get_imei(STRING_OUT(p1, imei))
-

Reads the IMEI number.

-
-
Parameters
-

imei[out] Module’s IMEI number

-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result esp_modem_get_module_name(STRING_OUT(p1, name))
-

Reads the module name.

-
-
Parameters
-

name[out] module name

-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result esp_modem_set_data_mode()
-

Sets the modem to data mode.

-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result esp_modem_get_signal_quality(INT_OUT(p1, rssi), INT_OUT(p2, ber))
-

Get Signal quality.

-
-
Parameters
-
    -
  • rssi[out] signal strength indication

  • -
  • ber[out] channel bit error rate

  • -
-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result esp_modem_set_flow_control(INT_IN(p1, dce_flow), INT_IN(p2, dte_flow))
-

Sets HW control flow.

-
-
Parameters
-
    -
  • dce_flow[in] 0=none, 2=RTS hw flow control of DCE

  • -
  • dte_flow[in] 0=none, 2=CTS hw flow control of DTE

  • -
-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result esp_modem_hang_up()
-

Hangs up current data call.

-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result esp_modem_get_battery_status(INT_OUT(p1, voltage), INT_OUT(p2, bcs), INT_OUT(p3, bcl))
-

Get voltage levels of modem power up circuitry.

-
-
Parameters
-
    -
  • voltage[out] Current status in mV

  • -
  • bcs[out] charge status (-1-Not available, 0-Not charging, 1-Charging, 2-Charging done)

  • -
  • bcl[out] 1-100% battery capacity, -1-Not available

  • -
-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result esp_modem_power_down()
-

Power down the module.

-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result esp_modem_reset()
-

Reset the module.

-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result esp_modem_set_baud(INT_IN(p1, baud))
-

Configures the baudrate.

-
-
Parameters
-

baud[in] Desired baud rate of the DTE

-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result esp_modem_set_operator(INT_IN(p1, mode), INT_IN(p2, format), STRING_IN(p3, oper))
-

Force an attempt to connect to a specific operator.

-
-
Parameters
-
    -
  • mode[in] mode of attempt mode=0 - automatic mode=1 - manual mode=2 - deregister mode=3 - set format for read operation mode=4 - manual with fallback to automatic

  • -
  • format[in] what format the operator is given in format=0 - long format format=1 - short format format=2 - numeric

  • -
  • oper[in] the operator to connect to

  • -
-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result esp_modem_set_network_attachment_state(INT_IN(p1, state))
-

Attach or detach from the GPRS service.

-
-
Parameters
-

state[in] 1-attach 0-detach

-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result esp_modem_get_network_attachment_state(INT_OUT(p1, state))
-

Get network attachment state.

-
-
Parameters
-

state[out] 1-attached 0-detached

-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result esp_modem_set_radio_state(INT_IN(p1, state))
-

What mode the radio should be set to.

-
-
Parameters
-

state[in] state 1-full 0-minimum …

-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result esp_modem_get_radio_state(INT_OUT(p1, state))
-

Get current radio state.

-
-
Parameters
-

state[out] 1-full 0-minimum …

-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result esp_modem_set_network_mode(INT_IN(p1, mode))
-

Set network mode.

-
-
Parameters
-

mode[in] preferred mode

-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result esp_modem_set_preferred_mode(INT_IN(p1, mode))
-

Preferred network mode (CAT-M and/or NB-IoT)

-
-
Parameters
-

mode[in] preferred selection

-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result esp_modem_set_network_bands(STRING_IN(p1, mode), INTEGER_LIST_IN(p2, bands), INT_IN(p3, size))
-

Set network bands for CAT-M or NB-IoT.

-
-
Parameters
-

mode[in] CAT-M or NB-IoT

-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result esp_modem_get_network_system_mode(INT_OUT(p1, mode))
-

Show network system mode.

-
-
Parameters
-

mode[out] current network mode

-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result esp_modem_set_gnss_power_mode(INT_IN(p1, mode))
-

GNSS power control.

-
-
Parameters
-

mode[out] power mode (0 - off, 1 - on)

-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result esp_modem_get_gnss_power_mode(INT_OUT(p1, mode))
-

GNSS power control.

-
-
Parameters
-

mode[out] power mode (0 - off, 1 - on)

-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-
-

Configuration structures

-
-
-group ESP_MODEM_CONFIG
-

Configuration structures for DTE and DCE.

-
-

Defines

-
-
-ESP_MODEM_DEFAULT_UART_CLK
-
- -
-
-ESP_MODEM_DTE_DEFAULT_CONFIG()
-

ESP Modem DTE Default Configuration.

-
- -
-
-ESP_MODEM_DCE_DEFAULT_CONFIG(APN)
-

ESP Modem DCE Default Configuration.

-
- -
-
-

Typedefs

-
-
-typedef struct esp_modem_dte_config esp_modem_dte_config_t
-
- -
-
-typedef struct esp_modem_dce_config esp_modem_dce_config_t
-
- -
-
-

Enums

-
-
-enum esp_modem_flow_ctrl_t
-

Modem flow control type.

-

Values:

-
-
-enumerator ESP_MODEM_FLOW_CONTROL_NONE
-
- -
-
-enumerator ESP_MODEM_FLOW_CONTROL_SW
-
- -
-
-enumerator ESP_MODEM_FLOW_CONTROL_HW
-
- -
- -
-
-
-struct esp_modem_uart_term_config
-
-#include <esp_modem_config.h>
-

UART configuration structure.

-
-

Public Members

-
-
-uart_port_t port_num
-

UART port number

-
- -
-
-uart_word_length_t data_bits
-

Data bits of UART

-
- -
-
-uart_stop_bits_t stop_bits
-

Stop bits of UART

-
- -
-
-uart_parity_t parity
-

Parity type

-
- -
-
-esp_modem_flow_ctrl_t flow_control
-

Flow control type

-
- -
-
-uart_sclk_t source_clk
-

UART source clock selection

-
- -
-
-int baud_rate
-

Communication baud rate

-
- -
-
-int tx_io_num
-

TXD Pin Number

-
- -
-
-int rx_io_num
-

RXD Pin Number

-
- -
-
-int rts_io_num
-

RTS Pin Number

-
- -
-
-int cts_io_num
-

CTS Pin Number

-
- -
-
-int rx_buffer_size
-

UART RX Buffer Size

-
- -
-
-int tx_buffer_size
-

UART TX Buffer Size

-
- -
-
-int event_queue_size
-

UART Event Queue Size, set to 0 if no event queue needed

-
- -
-
- -
-
-struct esp_modem_vfs_term_config
-
-#include <esp_modem_config.h>
-

VFS configuration structure.

-
-

Public Members

-
-
-int fd
-

Already created file descriptor

-
- -
-
-void (*deleter)(int, struct esp_modem_vfs_resource*)
-

Custom close function for the fd

-
- -
-
-struct esp_modem_vfs_resource *resource
-

Resource attached to the VFS (need for clenaup)

-
- -
-
- -
-
-struct esp_modem_dte_config
-
-#include <esp_modem_config.h>
-

Complete DTE configuration structure.

-

Note that the generic part is common for DTE and its SW resources The following portions for config is dedicated to the chosen HW resource used as a communication terminal for this DTE

-
-

Public Members

-
-
-size_t dte_buffer_size
-

DTE buffer size

-
- -
-
-uint32_t task_stack_size
-

Terminal task stack size

-
- -
-
-unsigned task_priority
-

Terminal task priority

-
- -
-
-struct esp_modem_uart_term_config uart_config
-

Configuration for UART Terminal

-
- -
-
-struct esp_modem_vfs_term_config vfs_config
-

Configuration for VFS Terminal

-
- -
-
-void *extension_config
-

Configuration for app specific Terminal

-
- -
-
- -
-
-struct esp_modem_dce_config
-
-#include <esp_modem_dce_config.h>
-

DCE configuration structure.

-
-

Public Members

-
-
-const char *apn
-

APN: Logical name of the Access point

-
- -
-
- -
- -
-
- - -
- -
-
- -
-
- - - - - - - \ No newline at end of file diff --git a/esp_modem/cxx_api_docs.html b/esp_modem/cxx_api_docs.html deleted file mode 100644 index 362509fa7..000000000 --- a/esp_modem/cxx_api_docs.html +++ /dev/null @@ -1,302 +0,0 @@ - - - - - - - - - C++ API Documentation — esp-modem documentation - - - - - - - - - - - - - - - - - - - -
-
-
- - -
- -
-

C++ API Documentation

-

Similar to the C API Documentation, the basic application workflow consist of

-
-
- -
-

Create DTE and DCE

-
-
-group ESP_MODEM_INIT_DTE
-

Create DTE’s.

-
-

Typedefs

-
-
-using dce_config = ::esp_modem_dce_config
-
- -
-
-using dte_config = ::esp_modem_dte_config
-
- -
-
-

Functions

-
-
-std::shared_ptr<DTE> create_uart_dte(const dte_config *config)
-

Create UART DTE.

-
-
Parameters
-

configDTE configuration

-
-
Returns
-

shared ptr to DTE on success nullptr on failure (either due to insufficient memory or wrong dte configuration) if exceptions are disabled the API abort()’s on error

-
-
-
- -
-
-std::shared_ptr<DTE> create_vfs_dte(const dte_config *config)
-

Create VFS DTE.

-
-
Parameters
-

configDTE configuration

-
-
Returns
-

shared ptr to DTE on success nullptr on failure (either due to insufficient memory or wrong dte configuration) if exceptions are disabled the API abort()’s on error

-
-
-
- -
-
- -
-
-group ESP_MODEM_INIT_DCE
-

ESP_MODEM Initialization API for DCE.

-
-

Functions

-
-
-std::unique_ptr<DCE> create_SIM7600_dce(const dce_config *config, std::shared_ptr<DTE> dte, esp_netif_t *netif)
-

Create DCE based on SIM7600 module.

-
-
Parameters
-
    -
  • configDCE configuration

  • -
  • dte – reference to the communicating DTE

  • -
  • netif – reference to the network interface

  • -
-
-
Returns
-

unique ptr to the created DCE on success nullptr on failure if exceptions are disabled the API abort()’s on error

-
-
-
- -
-
-std::unique_ptr<DCE> create_SIM7070_dce(const dce_config *config, std::shared_ptr<DTE> dte, esp_netif_t *netif)
-

Create DCE based on SIM7070 module.

-
- -
-
-std::unique_ptr<DCE> create_SIM7000_dce(const dce_config *config, std::shared_ptr<DTE> dte, esp_netif_t *netif)
-

Create DCE based on SIM7000 module.

-
- -
-
-std::unique_ptr<DCE> create_SIM800_dce(const dce_config *config, std::shared_ptr<DTE> dte, esp_netif_t *netif)
-

Create DCE based on SIM800 module.

-
- -
-
-std::unique_ptr<DCE> create_BG96_dce(const dce_config *config, std::shared_ptr<DTE> dte, esp_netif_t *netif)
-

Create DCE based on BG96 module.

-
- -
-
-std::unique_ptr<DCE> create_generic_dce(const dce_config *config, std::shared_ptr<DTE> dte, esp_netif_t *netif)
-

Create generic DCE.

-
- -
-
- -
-
-

Mode switching commands

-
-
-template<class SpecificModule>
class esp_modem::DCE_T
-

General DCE class templated on a specific module. It is responsible for all the necessary transactions related to switching modes and consequent synergy with aggregated objects of DTE, Netif and a specific Module.

-
-

Public Functions

-
-
-inline void set_data()
-

Set data mode!

-
- -
-
- -
-
-

Modem commands

- -
-
-

Destroy the DCE

-

The DCE object is created as std::unique_ptr by default and as such doesn’t have to be explicitly destroyed. -It simply gets destroyed and cleaned-up automatically if the object goes out of the block scope.

-
-
- - -
- -
-
- -
-
- - - - - - - \ No newline at end of file diff --git a/esp_modem/cxx_api_links.html b/esp_modem/cxx_api_links.html deleted file mode 100644 index 55cc79f12..000000000 --- a/esp_modem/cxx_api_links.html +++ /dev/null @@ -1,144 +0,0 @@ - - - - - - - - - <no title> — esp-modem documentation - - - - - - - - - - - - - - - - - -
- - -
-
- - - - - - - \ No newline at end of file diff --git a/esp_modem/genindex.html b/esp_modem/genindex.html deleted file mode 100644 index 4840dabc4..000000000 --- a/esp_modem/genindex.html +++ /dev/null @@ -1,670 +0,0 @@ - - - - - - - - Index — esp-modem documentation - - - - - - - - - - - - - - - - - -
-
-
- - -
- - -

Index

- -
- C - | D - | E - | G - | M - | P - | S - | T - -
-

C

- - - -
- -

D

- - - -
- -

E

- - - -
- -

G

- - - -
- -

M

- - - -
- -

P

- - - -
- -

S

- - - -
- -

T

- - - -
- - - -
- -
-
- -
-
- - - - - - - \ No newline at end of file diff --git a/esp_modem/index.html b/esp_modem/index.html deleted file mode 100644 index 23a1131b3..000000000 --- a/esp_modem/index.html +++ /dev/null @@ -1,179 +0,0 @@ - - - - - - - - - ESP-MODEM Programmers manual — esp-modem documentation - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/esp_modem/internal_design.html b/esp_modem/internal_design.html deleted file mode 100644 index 4456df6ed..000000000 --- a/esp_modem/internal_design.html +++ /dev/null @@ -1,160 +0,0 @@ - - - - - - - - - Internal design — esp-modem documentation - - - - - - - - - - - - - - - - - - - -
-
-
- - -
- -
-

Internal design

-
-

Design decisions

-
    -
  • Use C++ with additional C API

  • -
  • Use exceptions

    -
      -
    • Use macro wrapper over try-catch blocks when exceptions off (use abort() if THROW())

    • -
    -
  • -
  • Initializes and allocates in the constructor (might throw)

    -
      -
    • easier code with exceptions ON, with exceptions OFF alloc/init failures are not treated as runtime error (program aborts)

    • -
    • break down long initialization in constructor into more private methods

    • -
    -
  • -
  • Implements different devices using inheritance from GenericModule, which is the most general implementation of a common modem

    -
      -
    • Internally uses templates with device specialization (modeled as DCE<SpecificModule>) which could be used as well for some special cases, -such as implantation of a minimal device (ModuleIf), add new AT commands (oOnly in compile time), or using the Module with DTE only (no DCE, no Netif) for sending AT commands without network

    • -
    -
  • -
-
-
-

DCE collaboration model

-

The diagram describes how the DCE class collaborates with DTE, PPP and the device abstraction

-

DCE_architecture

-
-
-

Terminal inheritance

-

Terminal is a class which can read or write data, and can handle callbacks when data are available. UART specialization -is provided implementing these method using the uart driver.

-
-
-

CMUX terminal

-

The below diagram depicts the idea of using CMUX terminal mode using the CMuxInstance class which is a terminal -(it implements the basic read/write methods) interfacing arbitrary number of virtual terminals, -but at the same time it is also composed of CMux class, which consumes the original terminal and uses its read/write methods -to multiplex the terminal.

-

CMUX Terminal

-
-
- - -
- -
-
- -
-
- - - - - - - \ No newline at end of file diff --git a/esp_modem/internal_docs.html b/esp_modem/internal_docs.html deleted file mode 100644 index 47760d8ba..000000000 --- a/esp_modem/internal_docs.html +++ /dev/null @@ -1,1490 +0,0 @@ - - - - - - - - - DCE Internal implementation — esp-modem documentation - - - - - - - - - - - - - - - - - - -
-
-
- - -
- -
-

DCE Internal implementation

-

This chapter provides a detailed description of the classes and building blocks of the esp-modem component and their responsibilities.

-

The esp-modem actually implements the DCE class, which in turn aggregates these thee units:

-
    -
  • DTE to communicate with the device on a specific Terminal interface such as UART.

  • -
  • Netif to provide the network connectivity

  • -
  • Module to define the specific command library

  • -
-

Developers would typically have to

-
    -
  • Add support for a new module

  • -
  • Implement a generic (common for all modules) AT command

  • -
-

This is explained in the Module section, as Adding new module or command

-
-
-
-group ESP_MODEM_DCE
-

Definition of DCE abstraction.

-
-
-class DCE_Mode
-
-#include <esp_modem_dce.hpp>
-

Helper class responsible for switching modes of the DCE’s.

-
- -
-
-template<class SpecificModule>
class esp_modem::DCE_T
-
-#include <esp_modem_dce.hpp>
-

General DCE class templated on a specific module. It is responsible for all the necessary transactions related to switching modes and consequent synergy with aggregated objects of DTE, Netif and a specific Module.

-
-

Public Functions

-
-
-inline void set_data()
-

Set data mode!

-
- -
-
- -
-
-class esp_modem::DCE : public esp_modem::DCE_T<GenericModule>, public esp_modem::DCE_T<GenericModule>
-
-#include <esp_modem_dce.hpp>
-

Common abstraction of the modem DCE, specialized by the GenericModule which is a parent class for the supported devices and most common modems, as well.

-
-

Public Functions

-
-
-command_result sync()
-

Sends the initial AT sequence to sync up with the device.

-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result get_operator_name(STRING_OUT(p1, name), INT_OUT(p2, act))
-

Reads the operator name.

-
-
Parameters
-
    -
  • operator[out] name

  • -
  • access[out] technology

  • -
-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result store_profile()
-

Stores current user profile.

-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result set_pin(STRING_IN(p1, pin))
-

Sets the supplied PIN code.

-
-
Parameters
-

pin[in] Pin

-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result at(STRING_IN(p1, cmd), STRING_OUT(p2, out), INT_IN(p3, timeout))
-

Execute the supplied AT command.

-
-
Parameters
-
    -
  • at[in] AT command

  • -
  • out[out] Command output string

  • -
  • timeout[in] AT command timeout in milliseconds

  • -
-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result read_pin(BOOL_OUT(p1, pin_ok))
-

Checks if the SIM needs a PIN.

-
-
Parameters
-

pin_ok[out] true if the SIM card doesn’t need a PIN to unlock

-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result set_echo(BOOL_IN(p1, echo_on))
-

Sets echo mode.

-
-
Parameters
-

echo_on[in] true if echo mode on (repeats the commands)

-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result sms_txt_mode(BOOL_IN(p1, txt))
-

Sets the Txt or Pdu mode for SMS (only txt is supported)

-
-
Parameters
-

txt[in] true if txt mode

-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result sms_character_set()
-

Sets the default (GSM) character set.

-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result send_sms(STRING_IN(p1, number), STRING_IN(p2, message))
-

Sends SMS message in txt mode.

-
-
Parameters
-
    -
  • number[in] Phone number to send the message to

  • -
  • message[in] Text message to be sent

  • -
-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result resume_data_mode()
-

Resumes data mode (Switches back to the data mode, which was temporarily suspended)

-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result set_pdp_context(STRUCT_OUT(PdpContext, p1))
-

Sets php context.

-
-
Parameters
-

p1[in] PdP context struct to setup modem cellular connection

-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result set_command_mode()
-

Switches to the command mode.

-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result set_cmux()
-

Switches to the CMUX mode.

-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result get_imsi(STRING_OUT(p1, imsi))
-

Reads the IMSI number.

-
-
Parameters
-

imsi[out] Module’s IMSI number

-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result get_imei(STRING_OUT(p1, imei))
-

Reads the IMEI number.

-
-
Parameters
-

imei[out] Module’s IMEI number

-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result get_module_name(STRING_OUT(p1, name))
-

Reads the module name.

-
-
Parameters
-

name[out] module name

-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result set_data_mode()
-

Sets the modem to data mode.

-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result get_signal_quality(INT_OUT(p1, rssi), INT_OUT(p2, ber))
-

Get Signal quality.

-
-
Parameters
-
    -
  • rssi[out] signal strength indication

  • -
  • ber[out] channel bit error rate

  • -
-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result set_flow_control(INT_IN(p1, dce_flow), INT_IN(p2, dte_flow))
-

Sets HW control flow.

-
-
Parameters
-
    -
  • dce_flow[in] 0=none, 2=RTS hw flow control of DCE

  • -
  • dte_flow[in] 0=none, 2=CTS hw flow control of DTE

  • -
-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result hang_up()
-

Hangs up current data call.

-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result get_battery_status(INT_OUT(p1, voltage), INT_OUT(p2, bcs), INT_OUT(p3, bcl))
-

Get voltage levels of modem power up circuitry.

-
-
Parameters
-
    -
  • voltage[out] Current status in mV

  • -
  • bcs[out] charge status (-1-Not available, 0-Not charging, 1-Charging, 2-Charging done)

  • -
  • bcl[out] 1-100% battery capacity, -1-Not available

  • -
-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result power_down()
-

Power down the module.

-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result reset()
-

Reset the module.

-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result set_baud(INT_IN(p1, baud))
-

Configures the baudrate.

-
-
Parameters
-

baud[in] Desired baud rate of the DTE

-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result set_operator(INT_IN(p1, mode), INT_IN(p2, format), STRING_IN(p3, oper))
-

Force an attempt to connect to a specific operator.

-
-
Parameters
-
    -
  • mode[in] mode of attempt mode=0 - automatic mode=1 - manual mode=2 - deregister mode=3 - set format for read operation mode=4 - manual with fallback to automatic

  • -
  • format[in] what format the operator is given in format=0 - long format format=1 - short format format=2 - numeric

  • -
  • oper[in] the operator to connect to

  • -
-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result set_network_attachment_state(INT_IN(p1, state))
-

Attach or detach from the GPRS service.

-
-
Parameters
-

state[in] 1-attach 0-detach

-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result get_network_attachment_state(INT_OUT(p1, state))
-

Get network attachment state.

-
-
Parameters
-

state[out] 1-attached 0-detached

-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result set_radio_state(INT_IN(p1, state))
-

What mode the radio should be set to.

-
-
Parameters
-

state[in] state 1-full 0-minimum …

-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result get_radio_state(INT_OUT(p1, state))
-

Get current radio state.

-
-
Parameters
-

state[out] 1-full 0-minimum …

-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result set_network_mode(INT_IN(p1, mode))
-

Set network mode.

-
-
Parameters
-

mode[in] preferred mode

-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result set_preferred_mode(INT_IN(p1, mode))
-

Preferred network mode (CAT-M and/or NB-IoT)

-
-
Parameters
-

mode[in] preferred selection

-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result set_network_bands(STRING_IN(p1, mode), INTEGER_LIST_IN(p2, bands), INT_IN(p3, size))
-

Set network bands for CAT-M or NB-IoT.

-
-
Parameters
-

mode[in] CAT-M or NB-IoT

-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result get_network_system_mode(INT_OUT(p1, mode))
-

Show network system mode.

-
-
Parameters
-

mode[out] current network mode

-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result set_gnss_power_mode(INT_IN(p1, mode))
-

GNSS power control.

-
-
Parameters
-

mode[out] power mode (0 - off, 1 - on)

-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
-command_result get_gnss_power_mode(INT_OUT(p1, mode))
-

GNSS power control.

-
-
Parameters
-

mode[out] power mode (0 - off, 1 - on)

-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
- -
- -
-

DTE abstraction

-

DTE is a basic unit to talk to the module using a Terminal interface. It also implements and uses the CMUX to multiplex -terminals. Besides the DTE documentation, this section also refers to the

- -
-
-
-group ESP_MODEM_DTE
-

Definition of DTE and related classes.

-
-
-struct DTE_Command
-
-#include <esp_modem_dte.hpp>
-
- -
-
-class esp_modem::DTE : public esp_modem::CommandableIf
-
-#include <esp_modem_dte.hpp>
-

DTE (Data Terminal Equipment) class

-
-

Public Functions

-
-
-explicit DTE(const esp_modem_dte_config *config, std::unique_ptr<Terminal> t)
-

Creates a DTE instance from the terminal.

-
-
Parameters
-
    -
  • configDTE config structure

  • -
  • t – unique-ptr to Terminal

  • -
  • s – unique-ptr to secondary Terminal

  • -
-
-
-
- -
-
-virtual int write(uint8_t *data, size_t len) override
-

Writing to the underlying terminal.

-
-
Parameters
-
    -
  • data – Data pointer to write

  • -
  • len – Data len to write

  • -
-
-
Returns
-

number of bytes written

-
-
-
- -
-
-int read(uint8_t **d, size_t len)
-

Reading from the underlying terminal.

-
-
Parameters
-
    -
  • d – Returning the data pointer of the received payload

  • -
  • len – Length of the data payload

  • -
-
-
Returns
-

number of bytes read

-
-
-
- -
-
-void set_read_cb(std::function<bool(uint8_t *data, size_t len)> f)
-

Sets read callback with valid data and length.

-
-
Parameters
-

f – Function to be called on data available

-
-
-
- -
-
-void set_error_cb(std::function<void(terminal_error err)> f)
-

Sets DTE error callback.

-
-
Parameters
-

f – Function to be called on DTE error

-
-
-
- -
-
-bool set_mode(modem_mode m)
-

Sets the DTE to desired mode (Command/Data/Cmux)

-
-
Parameters
-

m – Desired operation mode

-
-
Returns
-

true on success

-
-
-
- -
-
-virtual command_result command(const std::string &command, got_line_cb got_line, uint32_t time_ms) override
-

Sends command and provides callback with responding line.

-
-
Parameters
-
    -
  • command – String parameter representing command

  • -
  • got_line – Function to be called after line available as a response

  • -
  • time_ms – Time in ms to wait for the answer

  • -
-
-
Returns
-

OK, FAIL, TIMEOUT

-
-
-
- -
-
-virtual command_result command(const std::string &command, got_line_cb got_line, uint32_t time_ms, char separator) override
-

Sends the command (same as above) but with a specific separator.

-
- -
-
- -
- -
-

Terminal interface

-
-
-group ESP_MODEM_TERMINAL
-

Definition of an abstract terminal to be attached to DTE class.

-
-

Enums

-
-
-enum class terminal_error
-

Terminal errors.

-

Values:

-
-
-enumerator BUFFER_OVERFLOW
-
- -
-
-enumerator CHECKSUM_ERROR
-
- -
-
-enumerator UNEXPECTED_CONTROL_FLOW
-
- -
-
-enumerator DEVICE_GONE
-
- -
- -
-
-
-class esp_modem::Terminal
-
-#include <esp_modem_terminal.hpp>
-

Terminal interface. All communication interfaces must comply to this interface in order to be used as a DTE.

-

Subclassed by esp_modem::CMuxInstance

-
-

Public Functions

-
-
-virtual int write(uint8_t *data, size_t len) = 0
-

Writes data to the terminal.

-
-
Parameters
-
    -
  • data – Data pointer

  • -
  • len – Data len

  • -
-
-
Returns
-

length of data written

-
-
-
- -
-
-virtual int read(uint8_t *data, size_t len) = 0
-

Read from the terminal. This function doesn’t block, but return all available data.

-
-
Parameters
-
    -
  • data – Data pointer to store the read payload

  • -
  • len – Maximum data len to read

  • -
-
-
Returns
-

length of data actually read

-
-
-
- -
-
- -
- -
-
-

CMUX implementation

-
-
-group ESP_MODEM_CMUX
-

Definition of CMUX terminal.

-
-

Enums

-
-
-enum class cmux_state
-

CMUX state machine.

-

Values:

-
-
-enumerator INIT
-
- -
-
-enumerator HEADER
-
- -
-
-enumerator PAYLOAD
-
- -
-
-enumerator FOOTER
-
- -
-
-enumerator RECOVER
-
- -
- -
-
-
-class esp_modem::CMux
-
-#include <esp_modem_cmux.hpp>
-

CMux class which consumes the original terminal and creates multiple virtual terminals from it. This class itself is not usable as a DTE terminal, only via its instances defined in CMuxInstance

-
-

Public Functions

-
-
-bool init()
-

Initializes CMux protocol.

-
-
Returns
-

true on success

-
-
-
- -
-
-bool deinit()
-

Closes and deinits CMux protocol.

-
-
Returns
-

true on success

-
-
-
- -
-
-std::pair<std::shared_ptr<Terminal>, unique_buffer> detach()
-

Ejects the attached terminal and buffer, so they could be used as traditional command/data DTE’s.

-
-
Returns
-

pair of the original terminal and buffer

-
-
-
- -
-
-void set_read_cb(int inst, std::function<bool(uint8_t *data, size_t len)> f)
-

Sets read callback for the appropriate terminal.

-
-
Parameters
-
    -
  • inst – Index of the terminal

  • -
  • f – function pointer

  • -
-
-
-
- -
-
-int write(int i, uint8_t *data, size_t len)
-

Writes to the appropriate terminal.

-
-
Parameters
-
    -
  • i – Index of the terminal

  • -
  • data – Data to write

  • -
  • len – Data length to write

  • -
-
-
Returns
-

The actual written length

-
-
-
- -
-
- -
-
-class esp_modem::CMuxInstance : public esp_modem::Terminal
-
-#include <esp_modem_cmux.hpp>
-

This represents a specific instance of a CMUX virtual terminal. This class also implements Terminal interface and as such could be used as a DTE’s terminal.

-
-

Public Functions

-
-
-inline virtual int write(uint8_t *data, size_t len) override
-

Writes data to the terminal.

-
-
Parameters
-
    -
  • data – Data pointer

  • -
  • len – Data len

  • -
-
-
Returns
-

length of data written

-
-
-
- -
-
-inline virtual int read(uint8_t *data, size_t len) override
-

Read from the terminal. This function doesn’t block, but return all available data.

-
-
Parameters
-
    -
  • data – Data pointer to store the read payload

  • -
  • len – Maximum data len to read

  • -
-
-
Returns
-

length of data actually read

-
-
-
- -
-
- -
- -
-
-
-

Netif

-
-
-group ESP_MODEM_NETIF
-

Network interface layer of the esp-modem.

-
-
-class esp_modem::Netif
-
-#include <esp_modem_netif.hpp>
-

Network interface class responsible to glue the esp-netif to the modem’s DCE.

-
-

Public Functions

-
-
-void start()
-

Start the network interface.

-
- -
-
-void wait_until_ppp_exits()
-

Blocks until the network interface closes.

-
- -
-
-void stop()
-

Stop the network interface.

-
- -
-
- -
- -
-
-

Module abstraction

-
-
-group ESP_MODEM_MODULE
-

Definition of modules representing specific modem devices.

-
-
-class esp_modem::GenericModule : public esp_modem::ModuleIf
-
-#include <esp_modem_dce_module.hpp>
-

This is a basic building block for custom modules as well as for the supported modules in the esp-modem component It derives from the ModuleIf.

-

Subclassed by esp_modem::BG96, esp_modem::SIM7000, esp_modem::SIM7070, esp_modem::SIM7600, esp_modem::SIM800

-
-

Public Functions

-
-
-inline explicit GenericModule(std::shared_ptr<DTE> dte, std::unique_ptr<PdpContext> pdp)
-

We can construct a generic device with an existent DTE and it’s configuration The configuration could be either the dce-config struct or just a pdp context.

-
- -
-
-inline virtual bool setup_data_mode() override
-

This is a mandatory method for ModuleIf class, which sets up the device to be able to connect to the network. This typically consists of setting basic communication parameters and setting the PDP (defining logical access point to cellular network)

-
- -
-
-inline virtual bool set_mode(modem_mode mode) override
-

This is a mandatory method of ModuleIf class, which defines basic commands for switching between DATA, COMMAND and CMUX modes.

-
- -
-
-inline void configure_pdp_context(std::unique_ptr<PdpContext> new_pdp)
-

Additional method providing runtime configuration of PDP context.

-
- -
-
-inline command_result get_operator_name(std::string &name)
-

Simplified version of operator name (without the ACT, which is included in the command library)

-
- -
-
- -
-
-class SIM7600 : public esp_modem::GenericModule
-
-#include <esp_modem_dce_module.hpp>
-

Specific definition of the SIM7600 module.

-
- -
-
-class SIM7070 : public esp_modem::GenericModule
-
-#include <esp_modem_dce_module.hpp>
-

Specific definition of the SIM7070 module.

-
- -
-
-class SIM7000 : public esp_modem::GenericModule
-
-#include <esp_modem_dce_module.hpp>
-

Specific definition of the SIM7000 module.

-
- -
-
-class SIM800 : public esp_modem::GenericModule
-
-#include <esp_modem_dce_module.hpp>
-

Specific definition of the SIM800 module.

-
- -
-
-class BG96 : public esp_modem::GenericModule
-
-#include <esp_modem_dce_module.hpp>
-

Specific definition of the BG96 module.

-
- -
- -
-

Adding new devices

-

To support a new module, developers would have to implement a new class derived from esp_modem::GenericModule the same way -as it is described in the Advanced user manual. The only difference is that the new class (and factory extension) -would be available in the esp_modem code base.

-
-
-

Implement a new generic command

-

Adding a generic command, i.e. the command that is shared for all modules and is included in the esp_modem::GenericModule, -has to be declared first in the include/generate/esp_modem_command_declare.inc file, which is the single source -of supported command definitions, that is used in:

-
    -
  • public C API

  • -
  • public CPP API

  • -
  • generated documentation

  • -
  • implementation of the command

  • -
-

Therefore, a care must be taken, to correctly specify all parameters and types, especially:

-
    -
  • Keep number of parameters low (<= 6, used in preprocessor’s forwarding to the command library)

  • -
  • Use macros to specify parameter types (as they are used both from C and C++ with different underlying types)

  • -
  • Parameter names are used only for clarity and documentation, they get expanded to numbered arguments.

  • -
-

Please use the following pattern: INT_IN(p1, baud), meaning that the parameter is an input integer, -human readable argument name is baud, it’s the first argument, so expands to p1 (second argument would be p2, etc)

-
-
-

Command library

-

This is a namespace holding a library of typical AT commands used by supported devices. -Please refer to the C API Documentation for the list of supported commands.

-
-
-group ESP_MODEM_DCE_COMMAND
-

Library of the most useful DCE commands.

-
-

Defines

-
-
-ESP_MODEM_DECLARE_DCE_COMMAND(name, return_type, num, ...)
-

Declaration of all commands is generated from esp_modem_command_declare.inc.

-
- -
-
-

Functions

-
-
-command_result generic_command(CommandableIf *t, const std::string &command, const std::string &pass_phrase, const std::string &fail_phrase, uint32_t timeout_ms)
-

Generic AT command to be send with pass and fail phrases.

-
-
Parameters
-
    -
  • t – Commandable object (anything that can accept commands)

  • -
  • command – Command to be sent do the commandable object

  • -
  • pass_phrase – String to be present in the reply to pass this command

  • -
  • fail_phrase – String to be present in the reply to fail this command

  • -
  • timeout_ms – Timeout in ms

  • -
-
-
-
- -
-
-command_result get_battery_status_sim7xxx(CommandableIf *t, int &voltage, int &bcs, int &bcl)
-

Following commands that are different for some specific modules.

-
- -
-
-command_result set_gnss_power_mode_sim76xx(CommandableIf *t, int mode)
-
- -
-
-command_result power_down_sim76xx(CommandableIf *t)
-
- -
-
-command_result power_down_sim70xx(CommandableIf *t)
-
- -
-
-command_result set_network_bands_sim76xx(CommandableIf *t, const std::string &mode, const int *bands, int size)
-
- -
-
-command_result power_down_sim8xx(CommandableIf *t)
-
- -
-
-command_result set_data_mode_sim8xx(CommandableIf *t)
-
- -
-
- -
-
-
-

Modem types

-
-
-group ESP_MODEM_TYPES
-

Basic type definitions used in esp-modem.

-
-

Typedefs

-
-
-typedef std::function<command_result(uint8_t *data, size_t len)> got_line_cb
-
- -
-
-

Enums

-
-
-enum class modem_mode
-

Modem working mode.

-

Values:

-
-
-enumerator UNDEF
-
- -
-
-enumerator COMMAND_MODE
-

Command mode &#8212; the modem is supposed to send AT commands in this mode

-
- -
-
-enumerator DATA_MODE
-

Data mode &#8212; the modem communicates with network interface on PPP protocol

-
- -
-
-enumerator DUAL_MODE
-

Dual mode &#8212; the modem has two real terminals. Data and commands work at the same time

-
- -
-
-enumerator CMUX_MODE
-

CMUX (Multiplex mode) &#8212; Simplified CMUX mode, which creates two virtual terminals, assigning one solely to command interface and the other to the data mode

-
- -
-
-enumerator CMUX_MANUAL_MODE
-

Enter CMUX mode manually &#8212; just creates two virtual terminals

-
- -
-
-enumerator CMUX_MANUAL_EXIT
-

Exits CMUX mode manually &#8212; just destroys two virtual terminals

-
- -
-
-enumerator CMUX_MANUAL_DATA
-

Sets the primary terminal to DATA mode in manual CMUX

-
- -
-
-enumerator CMUX_MANUAL_COMMAND
-

Sets the primary terminal to COMMAND mode in manual CMUX

-
- -
-
-enumerator CMUX_MANUAL_SWAP
-

Swaps virtual terminals in manual CMUX mode (primary <-> secondary)

-
- -
- -
-
-enum class command_result
-

Module command result.

-

Values:

-
-
-enumerator OK
-

The command completed successfully

-
- -
-
-enumerator FAIL
-

The command explicitly failed

-
- -
-
-enumerator TIMEOUT
-

The device didn’t respond in the specified timeline

-
- -
- -
-
-
-struct PdpContext
-
-#include <esp_modem_types.hpp>
-

PDP context used for configuring and setting the data mode up.

-
- -
-
-class esp_modem::CommandableIf
-
-#include <esp_modem_types.hpp>
-

Interface for classes eligible to send AT commands (Modules, DCEs, DTEs)

-

Subclassed by esp_modem::DTE

-
-

Public Functions

-
-
-virtual command_result command(const std::string &command, got_line_cb got_line, uint32_t time_ms, const char separator) = 0
-

Sends custom AT command.

-
-
Parameters
-
    -
  • command – Command to be sent

  • -
  • got_line – callback if a line received

  • -
  • time_ms – timeout in milliseconds

  • -
-
-
Returns
-

OK, FAIL or TIMEOUT

-
-
-
- -
-
- -
-
-class esp_modem::ModuleIf
-
-#include <esp_modem_types.hpp>
-

Interface for classes implementing a module for the modem.

-

Subclassed by esp_modem::GenericModule

-
-

Public Functions

-
-
-virtual bool setup_data_mode() = 0
-

Sets the data mode up (provides the necessary configuration to connect to the cellular network)

-
-
Returns
-

true on success

-
-
-
- -
-
-virtual bool set_mode(modem_mode mode) = 0
-

Sets the operation mode.

-
-
Parameters
-

mode – Desired mode

-
-
Returns
-

true on success

-
-
-
- -
-
- -
- -
-
- - -
- -
-
- -
-
- - - - - - - \ No newline at end of file diff --git a/esp_modem/objects.inv b/esp_modem/objects.inv deleted file mode 100644 index 1edc896cf..000000000 Binary files a/esp_modem/objects.inv and /dev/null differ diff --git a/esp_modem/search.html b/esp_modem/search.html deleted file mode 100644 index 73dcc244f..000000000 --- a/esp_modem/search.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - Search — esp-modem documentation - - - - - - - - - - - - - - - - - - - - - - - -
-
-
- - -
- -

Search

- - - - -

- Searching for multiple words only shows matches that contain - all words. -

- - -
- - - -
- - - -
- -
- - -
- -
-
- -
-
- - - - - - - \ No newline at end of file diff --git a/esp_modem/searchindex.js b/esp_modem/searchindex.js deleted file mode 100644 index 47f57c06e..000000000 --- a/esp_modem/searchindex.js +++ /dev/null @@ -1 +0,0 @@ -Search.setIndex({docnames:["README","advanced_api","api_docs","cxx_api_docs","cxx_api_links","index","internal_design","internal_docs"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":5,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":3,"sphinx.domains.rst":2,"sphinx.domains.std":2,sphinx:56},filenames:["README.md","advanced_api.rst","api_docs.rst","cxx_api_docs.rst","cxx_api_links.rst","index.rst","internal_design.md","internal_docs.rst"],objects:{"":[[2,0,1,"c.ESP_MODEM_DCE_DEFAULT_CONFIG","ESP_MODEM_DCE_DEFAULT_CONFIG"],[7,0,1,"c.ESP_MODEM_DECLARE_DCE_COMMAND","ESP_MODEM_DECLARE_DCE_COMMAND"],[2,0,1,"c.ESP_MODEM_DEFAULT_UART_CLK","ESP_MODEM_DEFAULT_UART_CLK"],[2,0,1,"c.ESP_MODEM_DTE_DEFAULT_CONFIG","ESP_MODEM_DTE_DEFAULT_CONFIG"],[2,1,1,"_CPPv4N20esp_modem_dce_device18ESP_MODEM_DCE_BG96E","ESP_MODEM_DCE_BG96"],[2,1,1,"_CPPv4N20esp_modem_dce_device21ESP_MODEM_DCE_GENETICE","ESP_MODEM_DCE_GENETIC"],[2,1,1,"_CPPv4N20esp_modem_dce_device21ESP_MODEM_DCE_SIM7000E","ESP_MODEM_DCE_SIM7000"],[2,1,1,"_CPPv4N20esp_modem_dce_device21ESP_MODEM_DCE_SIM7070E","ESP_MODEM_DCE_SIM7070"],[2,1,1,"_CPPv4N20esp_modem_dce_device21ESP_MODEM_DCE_SIM7600E","ESP_MODEM_DCE_SIM7600"],[2,1,1,"_CPPv4N20esp_modem_dce_device20ESP_MODEM_DCE_SIM800E","ESP_MODEM_DCE_SIM800"],[2,1,1,"_CPPv4N21esp_modem_flow_ctrl_t25ESP_MODEM_FLOW_CONTROL_HWE","ESP_MODEM_FLOW_CONTROL_HW"],[2,1,1,"_CPPv4N21esp_modem_flow_ctrl_t27ESP_MODEM_FLOW_CONTROL_NONEE","ESP_MODEM_FLOW_CONTROL_NONE"],[2,1,1,"_CPPv4N21esp_modem_flow_ctrl_t25ESP_MODEM_FLOW_CONTROL_SWE","ESP_MODEM_FLOW_CONTROL_SW"],[2,1,1,"_CPPv4N18esp_modem_dce_mode19ESP_MODEM_MODE_CMUXE","ESP_MODEM_MODE_CMUX"],[2,1,1,"_CPPv4N18esp_modem_dce_mode26ESP_MODEM_MODE_CMUX_MANUALE","ESP_MODEM_MODE_CMUX_MANUAL"],[2,1,1,"_CPPv4N18esp_modem_dce_mode34ESP_MODEM_MODE_CMUX_MANUAL_COMMANDE","ESP_MODEM_MODE_CMUX_MANUAL_COMMAND"],[2,1,1,"_CPPv4N18esp_modem_dce_mode31ESP_MODEM_MODE_CMUX_MANUAL_DATAE","ESP_MODEM_MODE_CMUX_MANUAL_DATA"],[2,1,1,"_CPPv4N18esp_modem_dce_mode31ESP_MODEM_MODE_CMUX_MANUAL_EXITE","ESP_MODEM_MODE_CMUX_MANUAL_EXIT"],[2,1,1,"_CPPv4N18esp_modem_dce_mode31ESP_MODEM_MODE_CMUX_MANUAL_SWAPE","ESP_MODEM_MODE_CMUX_MANUAL_SWAP"],[2,1,1,"_CPPv4N18esp_modem_dce_mode22ESP_MODEM_MODE_COMMANDE","ESP_MODEM_MODE_COMMAND"],[2,1,1,"_CPPv4N18esp_modem_dce_mode19ESP_MODEM_MODE_DATAE","ESP_MODEM_MODE_DATA"],[2,1,1,"_CPPv4N24esp_modem_terminal_error34ESP_MODEM_TERMINAL_BUFFER_OVERFLOWE","ESP_MODEM_TERMINAL_BUFFER_OVERFLOW"],[2,1,1,"_CPPv4N24esp_modem_terminal_error33ESP_MODEM_TERMINAL_CHECKSUM_ERRORE","ESP_MODEM_TERMINAL_CHECKSUM_ERROR"],[2,1,1,"_CPPv4N24esp_modem_terminal_error30ESP_MODEM_TERMINAL_DEVICE_GONEE","ESP_MODEM_TERMINAL_DEVICE_GONE"],[2,1,1,"_CPPv4N24esp_modem_terminal_error42ESP_MODEM_TERMINAL_UNEXPECTED_CONTROL_FLOWE","ESP_MODEM_TERMINAL_UNEXPECTED_CONTROL_FLOW"],[2,1,1,"_CPPv4N24esp_modem_terminal_error32ESP_MODEM_TERMINAL_UNKNOWN_ERRORE","ESP_MODEM_TERMINAL_UNKNOWN_ERROR"],[1,2,1,"_CPPv49ModemType","ModemType"],[1,1,1,"_CPPv4N9ModemType4BG96E","ModemType::BG96"],[1,1,1,"_CPPv4N9ModemType13GenericModuleE","ModemType::GenericModule"],[1,1,1,"_CPPv4N9ModemType7SIM7000E","ModemType::SIM7000"],[1,1,1,"_CPPv4N9ModemType7SIM7070E","ModemType::SIM7070"],[1,1,1,"_CPPv4N9ModemType7SIM7600E","ModemType::SIM7600"],[1,1,1,"_CPPv4N9ModemType6SIM800E","ModemType::SIM800"],[7,2,1,"_CPPv410cmux_state","cmux_state"],[7,1,1,"_CPPv4N10cmux_state6FOOTERE","cmux_state::FOOTER"],[7,1,1,"_CPPv4N10cmux_state6HEADERE","cmux_state::HEADER"],[7,1,1,"_CPPv4N10cmux_state4INITE","cmux_state::INIT"],[7,1,1,"_CPPv4N10cmux_state7PAYLOADE","cmux_state::PAYLOAD"],[7,1,1,"_CPPv4N10cmux_state7RECOVERE","cmux_state::RECOVER"],[7,2,1,"_CPPv414command_result","command_result"],[7,1,1,"_CPPv4N14command_result4FAILE","command_result::FAIL"],[7,1,1,"_CPPv4N14command_result2OKE","command_result::OK"],[7,1,1,"_CPPv4N14command_result7TIMEOUTE","command_result::TIMEOUT"],[3,3,1,"_CPPv415create_BG96_dcePK10dce_configNSt10shared_ptrI3DTEEEP11esp_netif_t","create_BG96_dce"],[3,4,1,"_CPPv415create_BG96_dcePK10dce_configNSt10shared_ptrI3DTEEEP11esp_netif_t","create_BG96_dce::config"],[3,4,1,"_CPPv415create_BG96_dcePK10dce_configNSt10shared_ptrI3DTEEEP11esp_netif_t","create_BG96_dce::dte"],[3,4,1,"_CPPv415create_BG96_dcePK10dce_configNSt10shared_ptrI3DTEEEP11esp_netif_t","create_BG96_dce::netif"],[3,3,1,"_CPPv418create_SIM7000_dcePK10dce_configNSt10shared_ptrI3DTEEEP11esp_netif_t","create_SIM7000_dce"],[3,4,1,"_CPPv418create_SIM7000_dcePK10dce_configNSt10shared_ptrI3DTEEEP11esp_netif_t","create_SIM7000_dce::config"],[3,4,1,"_CPPv418create_SIM7000_dcePK10dce_configNSt10shared_ptrI3DTEEEP11esp_netif_t","create_SIM7000_dce::dte"],[3,4,1,"_CPPv418create_SIM7000_dcePK10dce_configNSt10shared_ptrI3DTEEEP11esp_netif_t","create_SIM7000_dce::netif"],[3,3,1,"_CPPv418create_SIM7070_dcePK10dce_configNSt10shared_ptrI3DTEEEP11esp_netif_t","create_SIM7070_dce"],[3,4,1,"_CPPv418create_SIM7070_dcePK10dce_configNSt10shared_ptrI3DTEEEP11esp_netif_t","create_SIM7070_dce::config"],[3,4,1,"_CPPv418create_SIM7070_dcePK10dce_configNSt10shared_ptrI3DTEEEP11esp_netif_t","create_SIM7070_dce::dte"],[3,4,1,"_CPPv418create_SIM7070_dcePK10dce_configNSt10shared_ptrI3DTEEEP11esp_netif_t","create_SIM7070_dce::netif"],[3,3,1,"_CPPv418create_SIM7600_dcePK10dce_configNSt10shared_ptrI3DTEEEP11esp_netif_t","create_SIM7600_dce"],[3,4,1,"_CPPv418create_SIM7600_dcePK10dce_configNSt10shared_ptrI3DTEEEP11esp_netif_t","create_SIM7600_dce::config"],[3,4,1,"_CPPv418create_SIM7600_dcePK10dce_configNSt10shared_ptrI3DTEEEP11esp_netif_t","create_SIM7600_dce::dte"],[3,4,1,"_CPPv418create_SIM7600_dcePK10dce_configNSt10shared_ptrI3DTEEEP11esp_netif_t","create_SIM7600_dce::netif"],[3,3,1,"_CPPv417create_SIM800_dcePK10dce_configNSt10shared_ptrI3DTEEEP11esp_netif_t","create_SIM800_dce"],[3,4,1,"_CPPv417create_SIM800_dcePK10dce_configNSt10shared_ptrI3DTEEEP11esp_netif_t","create_SIM800_dce::config"],[3,4,1,"_CPPv417create_SIM800_dcePK10dce_configNSt10shared_ptrI3DTEEEP11esp_netif_t","create_SIM800_dce::dte"],[3,4,1,"_CPPv417create_SIM800_dcePK10dce_configNSt10shared_ptrI3DTEEEP11esp_netif_t","create_SIM800_dce::netif"],[3,3,1,"_CPPv418create_generic_dcePK10dce_configNSt10shared_ptrI3DTEEEP11esp_netif_t","create_generic_dce"],[3,4,1,"_CPPv418create_generic_dcePK10dce_configNSt10shared_ptrI3DTEEEP11esp_netif_t","create_generic_dce::config"],[3,4,1,"_CPPv418create_generic_dcePK10dce_configNSt10shared_ptrI3DTEEEP11esp_netif_t","create_generic_dce::dte"],[3,4,1,"_CPPv418create_generic_dcePK10dce_configNSt10shared_ptrI3DTEEEP11esp_netif_t","create_generic_dce::netif"],[3,3,1,"_CPPv415create_uart_dtePK10dte_config","create_uart_dte"],[3,4,1,"_CPPv415create_uart_dtePK10dte_config","create_uart_dte::config"],[3,3,1,"_CPPv414create_vfs_dtePK10dte_config","create_vfs_dte"],[3,4,1,"_CPPv414create_vfs_dtePK10dte_config","create_vfs_dte::config"],[3,5,1,"_CPPv410dce_config","dce_config"],[3,5,1,"_CPPv410dte_config","dte_config"],[7,6,1,"_CPPv4N9esp_modem4BG96E","esp_modem::BG96"],[7,6,1,"_CPPv4N9esp_modem4CMuxE","esp_modem::CMux"],[7,3,1,"_CPPv4N9esp_modem4CMux6deinitEv","esp_modem::CMux::deinit"],[7,3,1,"_CPPv4N9esp_modem4CMux6detachEv","esp_modem::CMux::detach"],[7,3,1,"_CPPv4N9esp_modem4CMux4initEv","esp_modem::CMux::init"],[7,3,1,"_CPPv4N9esp_modem4CMux11set_read_cbEiNSt8functionIFbP7uint8_t6size_tEEE","esp_modem::CMux::set_read_cb"],[7,4,1,"_CPPv4N9esp_modem4CMux11set_read_cbEiNSt8functionIFbP7uint8_t6size_tEEE","esp_modem::CMux::set_read_cb::f"],[7,4,1,"_CPPv4N9esp_modem4CMux11set_read_cbEiNSt8functionIFbP7uint8_t6size_tEEE","esp_modem::CMux::set_read_cb::inst"],[7,3,1,"_CPPv4N9esp_modem4CMux5writeEiP7uint8_t6size_t","esp_modem::CMux::write"],[7,4,1,"_CPPv4N9esp_modem4CMux5writeEiP7uint8_t6size_t","esp_modem::CMux::write::data"],[7,4,1,"_CPPv4N9esp_modem4CMux5writeEiP7uint8_t6size_t","esp_modem::CMux::write::i"],[7,4,1,"_CPPv4N9esp_modem4CMux5writeEiP7uint8_t6size_t","esp_modem::CMux::write::len"],[7,6,1,"_CPPv4N9esp_modem12CMuxInstanceE","esp_modem::CMuxInstance"],[7,3,1,"_CPPv4N9esp_modem12CMuxInstance4readEP7uint8_t6size_t","esp_modem::CMuxInstance::read"],[7,4,1,"_CPPv4N9esp_modem12CMuxInstance4readEP7uint8_t6size_t","esp_modem::CMuxInstance::read::data"],[7,4,1,"_CPPv4N9esp_modem12CMuxInstance4readEP7uint8_t6size_t","esp_modem::CMuxInstance::read::len"],[7,3,1,"_CPPv4N9esp_modem12CMuxInstance5writeEP7uint8_t6size_t","esp_modem::CMuxInstance::write"],[7,4,1,"_CPPv4N9esp_modem12CMuxInstance5writeEP7uint8_t6size_t","esp_modem::CMuxInstance::write::data"],[7,4,1,"_CPPv4N9esp_modem12CMuxInstance5writeEP7uint8_t6size_t","esp_modem::CMuxInstance::write::len"],[7,6,1,"_CPPv4N9esp_modem13CommandableIfE","esp_modem::CommandableIf"],[7,3,1,"_CPPv4N9esp_modem13CommandableIf7commandERKNSt6stringE11got_line_cb8uint32_tKc","esp_modem::CommandableIf::command"],[7,4,1,"_CPPv4N9esp_modem13CommandableIf7commandERKNSt6stringE11got_line_cb8uint32_tKc","esp_modem::CommandableIf::command::command"],[7,4,1,"_CPPv4N9esp_modem13CommandableIf7commandERKNSt6stringE11got_line_cb8uint32_tKc","esp_modem::CommandableIf::command::got_line"],[7,4,1,"_CPPv4N9esp_modem13CommandableIf7commandERKNSt6stringE11got_line_cb8uint32_tKc","esp_modem::CommandableIf::command::separator"],[7,4,1,"_CPPv4N9esp_modem13CommandableIf7commandERKNSt6stringE11got_line_cb8uint32_tKc","esp_modem::CommandableIf::command::time_ms"],[7,6,1,"_CPPv4N9esp_modem3DCEE","esp_modem::DCE"],[7,3,1,"_CPPv4N9esp_modem3DCE2atEF9STRING_IN2p13cmdEF10STRING_OUT2p23outEF6INT_IN2p37timeoutE","esp_modem::DCE::at"],[7,3,1,"_CPPv4N9esp_modem3DCE18get_battery_statusEF7INT_OUT2p17voltageEF7INT_OUT2p23bcsEF7INT_OUT2p33bclE","esp_modem::DCE::get_battery_status"],[7,3,1,"_CPPv4N9esp_modem3DCE19get_gnss_power_modeEF7INT_OUT2p14modeE","esp_modem::DCE::get_gnss_power_mode"],[7,3,1,"_CPPv4N9esp_modem3DCE8get_imeiEF10STRING_OUT2p14imeiE","esp_modem::DCE::get_imei"],[7,3,1,"_CPPv4N9esp_modem3DCE8get_imsiEF10STRING_OUT2p14imsiE","esp_modem::DCE::get_imsi"],[7,3,1,"_CPPv4N9esp_modem3DCE15get_module_nameEF10STRING_OUT2p14nameE","esp_modem::DCE::get_module_name"],[7,3,1,"_CPPv4N9esp_modem3DCE28get_network_attachment_stateEF7INT_OUT2p15stateE","esp_modem::DCE::get_network_attachment_state"],[7,3,1,"_CPPv4N9esp_modem3DCE23get_network_system_modeEF7INT_OUT2p14modeE","esp_modem::DCE::get_network_system_mode"],[7,3,1,"_CPPv4N9esp_modem3DCE17get_operator_nameEF10STRING_OUT2p14nameEF7INT_OUT2p23actE","esp_modem::DCE::get_operator_name"],[7,3,1,"_CPPv4N9esp_modem3DCE15get_radio_stateEF7INT_OUT2p15stateE","esp_modem::DCE::get_radio_state"],[7,3,1,"_CPPv4N9esp_modem3DCE18get_signal_qualityEF7INT_OUT2p14rssiEF7INT_OUT2p23berE","esp_modem::DCE::get_signal_quality"],[7,3,1,"_CPPv4N9esp_modem3DCE7hang_upEv","esp_modem::DCE::hang_up"],[7,3,1,"_CPPv4N9esp_modem3DCE10power_downEv","esp_modem::DCE::power_down"],[7,3,1,"_CPPv4N9esp_modem3DCE8read_pinEF8BOOL_OUT2p16pin_okE","esp_modem::DCE::read_pin"],[7,3,1,"_CPPv4N9esp_modem3DCE5resetEv","esp_modem::DCE::reset"],[7,3,1,"_CPPv4N9esp_modem3DCE16resume_data_modeEv","esp_modem::DCE::resume_data_mode"],[7,3,1,"_CPPv4N9esp_modem3DCE8send_smsEF9STRING_IN2p16numberEF9STRING_IN2p27messageE","esp_modem::DCE::send_sms"],[7,3,1,"_CPPv4N9esp_modem3DCE8set_baudEF6INT_IN2p14baudE","esp_modem::DCE::set_baud"],[7,3,1,"_CPPv4N9esp_modem3DCE8set_cmuxEv","esp_modem::DCE::set_cmux"],[7,3,1,"_CPPv4N9esp_modem3DCE16set_command_modeEv","esp_modem::DCE::set_command_mode"],[7,3,1,"_CPPv4N9esp_modem3DCE13set_data_modeEv","esp_modem::DCE::set_data_mode"],[7,3,1,"_CPPv4N9esp_modem3DCE8set_echoEF7BOOL_IN2p17echo_onE","esp_modem::DCE::set_echo"],[7,3,1,"_CPPv4N9esp_modem3DCE16set_flow_controlEF6INT_IN2p18dce_flowEF6INT_IN2p28dte_flowE","esp_modem::DCE::set_flow_control"],[7,3,1,"_CPPv4N9esp_modem3DCE19set_gnss_power_modeEF6INT_IN2p14modeE","esp_modem::DCE::set_gnss_power_mode"],[7,3,1,"_CPPv4N9esp_modem3DCE28set_network_attachment_stateEF6INT_IN2p15stateE","esp_modem::DCE::set_network_attachment_state"],[7,3,1,"_CPPv4N9esp_modem3DCE17set_network_bandsEF9STRING_IN2p14modeEF15INTEGER_LIST_IN2p25bandsEF6INT_IN2p34sizeE","esp_modem::DCE::set_network_bands"],[7,3,1,"_CPPv4N9esp_modem3DCE16set_network_modeEF6INT_IN2p14modeE","esp_modem::DCE::set_network_mode"],[7,3,1,"_CPPv4N9esp_modem3DCE12set_operatorEF6INT_IN2p14modeEF6INT_IN2p26formatEF9STRING_IN2p34operE","esp_modem::DCE::set_operator"],[7,3,1,"_CPPv4N9esp_modem3DCE15set_pdp_contextEF10STRUCT_OUT10PdpContext2p1E","esp_modem::DCE::set_pdp_context"],[7,3,1,"_CPPv4N9esp_modem3DCE7set_pinEF9STRING_IN2p13pinE","esp_modem::DCE::set_pin"],[7,3,1,"_CPPv4N9esp_modem3DCE18set_preferred_modeEF6INT_IN2p14modeE","esp_modem::DCE::set_preferred_mode"],[7,3,1,"_CPPv4N9esp_modem3DCE15set_radio_stateEF6INT_IN2p15stateE","esp_modem::DCE::set_radio_state"],[7,3,1,"_CPPv4N9esp_modem3DCE17sms_character_setEv","esp_modem::DCE::sms_character_set"],[7,3,1,"_CPPv4N9esp_modem3DCE12sms_txt_modeEF7BOOL_IN2p13txtE","esp_modem::DCE::sms_txt_mode"],[7,3,1,"_CPPv4N9esp_modem3DCE13store_profileEv","esp_modem::DCE::store_profile"],[7,3,1,"_CPPv4N9esp_modem3DCE4syncEv","esp_modem::DCE::sync"],[7,6,1,"_CPPv4N9esp_modem8DCE_ModeE","esp_modem::DCE_Mode"],[3,6,1,"_CPPv4I0EN9esp_modem5DCE_TE","esp_modem::DCE_T"],[7,6,1,"_CPPv4I0EN9esp_modem5DCE_TE","esp_modem::DCE_T"],[3,7,1,"_CPPv4I0EN9esp_modem5DCE_TE","esp_modem::DCE_T::SpecificModule"],[7,7,1,"_CPPv4I0EN9esp_modem5DCE_TE","esp_modem::DCE_T::SpecificModule"],[3,3,1,"_CPPv4N9esp_modem5DCE_T8set_dataEv","esp_modem::DCE_T::set_data"],[7,3,1,"_CPPv4N9esp_modem5DCE_T8set_dataEv","esp_modem::DCE_T::set_data"],[7,6,1,"_CPPv4N9esp_modem3DTEE","esp_modem::DTE"],[7,3,1,"_CPPv4N9esp_modem3DTE3DTEEPK20esp_modem_dte_configNSt10unique_ptrI8TerminalEE","esp_modem::DTE::DTE"],[7,4,1,"_CPPv4N9esp_modem3DTE3DTEEPK20esp_modem_dte_configNSt10unique_ptrI8TerminalEE","esp_modem::DTE::DTE::config"],[7,4,1,"_CPPv4N9esp_modem3DTE3DTEEPK20esp_modem_dte_configNSt10unique_ptrI8TerminalEE","esp_modem::DTE::DTE::t"],[7,3,1,"_CPPv4N9esp_modem3DTE7commandERKNSt6stringE11got_line_cb8uint32_t","esp_modem::DTE::command"],[7,3,1,"_CPPv4N9esp_modem3DTE7commandERKNSt6stringE11got_line_cb8uint32_tc","esp_modem::DTE::command"],[7,4,1,"_CPPv4N9esp_modem3DTE7commandERKNSt6stringE11got_line_cb8uint32_t","esp_modem::DTE::command::command"],[7,4,1,"_CPPv4N9esp_modem3DTE7commandERKNSt6stringE11got_line_cb8uint32_tc","esp_modem::DTE::command::command"],[7,4,1,"_CPPv4N9esp_modem3DTE7commandERKNSt6stringE11got_line_cb8uint32_t","esp_modem::DTE::command::got_line"],[7,4,1,"_CPPv4N9esp_modem3DTE7commandERKNSt6stringE11got_line_cb8uint32_tc","esp_modem::DTE::command::got_line"],[7,4,1,"_CPPv4N9esp_modem3DTE7commandERKNSt6stringE11got_line_cb8uint32_tc","esp_modem::DTE::command::separator"],[7,4,1,"_CPPv4N9esp_modem3DTE7commandERKNSt6stringE11got_line_cb8uint32_t","esp_modem::DTE::command::time_ms"],[7,4,1,"_CPPv4N9esp_modem3DTE7commandERKNSt6stringE11got_line_cb8uint32_tc","esp_modem::DTE::command::time_ms"],[7,3,1,"_CPPv4N9esp_modem3DTE4readEPP7uint8_t6size_t","esp_modem::DTE::read"],[7,4,1,"_CPPv4N9esp_modem3DTE4readEPP7uint8_t6size_t","esp_modem::DTE::read::d"],[7,4,1,"_CPPv4N9esp_modem3DTE4readEPP7uint8_t6size_t","esp_modem::DTE::read::len"],[7,3,1,"_CPPv4N9esp_modem3DTE12set_error_cbENSt8functionIFv14terminal_errorEEE","esp_modem::DTE::set_error_cb"],[7,4,1,"_CPPv4N9esp_modem3DTE12set_error_cbENSt8functionIFv14terminal_errorEEE","esp_modem::DTE::set_error_cb::f"],[7,3,1,"_CPPv4N9esp_modem3DTE8set_modeE10modem_mode","esp_modem::DTE::set_mode"],[7,4,1,"_CPPv4N9esp_modem3DTE8set_modeE10modem_mode","esp_modem::DTE::set_mode::m"],[7,3,1,"_CPPv4N9esp_modem3DTE11set_read_cbENSt8functionIFbP7uint8_t6size_tEEE","esp_modem::DTE::set_read_cb"],[7,4,1,"_CPPv4N9esp_modem3DTE11set_read_cbENSt8functionIFbP7uint8_t6size_tEEE","esp_modem::DTE::set_read_cb::f"],[7,3,1,"_CPPv4N9esp_modem3DTE5writeEP7uint8_t6size_t","esp_modem::DTE::write"],[7,4,1,"_CPPv4N9esp_modem3DTE5writeEP7uint8_t6size_t","esp_modem::DTE::write::data"],[7,4,1,"_CPPv4N9esp_modem3DTE5writeEP7uint8_t6size_t","esp_modem::DTE::write::len"],[7,6,1,"_CPPv4N9esp_modem11DTE_CommandE","esp_modem::DTE_Command"],[7,6,1,"_CPPv4N9esp_modem13GenericModuleE","esp_modem::GenericModule"],[7,3,1,"_CPPv4N9esp_modem13GenericModule13GenericModuleENSt10shared_ptrI3DTEEENSt10unique_ptrI10PdpContextEE","esp_modem::GenericModule::GenericModule"],[7,4,1,"_CPPv4N9esp_modem13GenericModule13GenericModuleENSt10shared_ptrI3DTEEENSt10unique_ptrI10PdpContextEE","esp_modem::GenericModule::GenericModule::dte"],[7,4,1,"_CPPv4N9esp_modem13GenericModule13GenericModuleENSt10shared_ptrI3DTEEENSt10unique_ptrI10PdpContextEE","esp_modem::GenericModule::GenericModule::pdp"],[7,3,1,"_CPPv4N9esp_modem13GenericModule21configure_pdp_contextENSt10unique_ptrI10PdpContextEE","esp_modem::GenericModule::configure_pdp_context"],[7,4,1,"_CPPv4N9esp_modem13GenericModule21configure_pdp_contextENSt10unique_ptrI10PdpContextEE","esp_modem::GenericModule::configure_pdp_context::new_pdp"],[7,3,1,"_CPPv4N9esp_modem13GenericModule17get_operator_nameERNSt6stringE","esp_modem::GenericModule::get_operator_name"],[7,4,1,"_CPPv4N9esp_modem13GenericModule17get_operator_nameERNSt6stringE","esp_modem::GenericModule::get_operator_name::name"],[7,3,1,"_CPPv4N9esp_modem13GenericModule8set_modeE10modem_mode","esp_modem::GenericModule::set_mode"],[7,4,1,"_CPPv4N9esp_modem13GenericModule8set_modeE10modem_mode","esp_modem::GenericModule::set_mode::mode"],[7,3,1,"_CPPv4N9esp_modem13GenericModule15setup_data_modeEv","esp_modem::GenericModule::setup_data_mode"],[7,6,1,"_CPPv4N9esp_modem8ModuleIfE","esp_modem::ModuleIf"],[7,3,1,"_CPPv4N9esp_modem8ModuleIf8set_modeE10modem_mode","esp_modem::ModuleIf::set_mode"],[7,4,1,"_CPPv4N9esp_modem8ModuleIf8set_modeE10modem_mode","esp_modem::ModuleIf::set_mode::mode"],[7,3,1,"_CPPv4N9esp_modem8ModuleIf15setup_data_modeEv","esp_modem::ModuleIf::setup_data_mode"],[7,6,1,"_CPPv4N9esp_modem5NetifE","esp_modem::Netif"],[7,3,1,"_CPPv4N9esp_modem5Netif5startEv","esp_modem::Netif::start"],[7,3,1,"_CPPv4N9esp_modem5Netif4stopEv","esp_modem::Netif::stop"],[7,3,1,"_CPPv4N9esp_modem5Netif20wait_until_ppp_exitsEv","esp_modem::Netif::wait_until_ppp_exits"],[7,6,1,"_CPPv4N9esp_modem10PdpContextE","esp_modem::PdpContext"],[7,6,1,"_CPPv4N9esp_modem7SIM7000E","esp_modem::SIM7000"],[7,6,1,"_CPPv4N9esp_modem7SIM7070E","esp_modem::SIM7070"],[7,6,1,"_CPPv4N9esp_modem7SIM7600E","esp_modem::SIM7600"],[7,6,1,"_CPPv4N9esp_modem6SIM800E","esp_modem::SIM800"],[7,6,1,"_CPPv4N9esp_modem8TerminalE","esp_modem::Terminal"],[7,3,1,"_CPPv4N9esp_modem8Terminal4readEP7uint8_t6size_t","esp_modem::Terminal::read"],[7,4,1,"_CPPv4N9esp_modem8Terminal4readEP7uint8_t6size_t","esp_modem::Terminal::read::data"],[7,4,1,"_CPPv4N9esp_modem8Terminal4readEP7uint8_t6size_t","esp_modem::Terminal::read::len"],[7,3,1,"_CPPv4N9esp_modem8Terminal5writeEP7uint8_t6size_t","esp_modem::Terminal::write"],[7,4,1,"_CPPv4N9esp_modem8Terminal5writeEP7uint8_t6size_t","esp_modem::Terminal::write::data"],[7,4,1,"_CPPv4N9esp_modem8Terminal5writeEP7uint8_t6size_t","esp_modem::Terminal::write::len"],[1,6,1,"_CPPv4I0EN9esp_modem11dce_factory7CreatorE","esp_modem::dce_factory::Creator"],[1,7,1,"_CPPv4I0EN9esp_modem11dce_factory7CreatorE","esp_modem::dce_factory::Creator::T_Module"],[1,6,1,"_CPPv4N9esp_modem11dce_factory7FactoryE","esp_modem::dce_factory::Factory"],[1,3,1,"_CPPv4I0DpEN9esp_modem11dce_factory7Factory5buildEP3DCEPK6configDpRR4Args","esp_modem::dce_factory::Factory::build"],[1,7,1,"_CPPv4I0DpEN9esp_modem11dce_factory7Factory5buildEP3DCEPK6configDpRR4Args","esp_modem::dce_factory::Factory::build::Args"],[1,7,1,"_CPPv4I0DpEN9esp_modem11dce_factory7Factory5buildEP3DCEPK6configDpRR4Args","esp_modem::dce_factory::Factory::build::T_Module"],[1,4,1,"_CPPv4I0DpEN9esp_modem11dce_factory7Factory5buildEP3DCEPK6configDpRR4Args","esp_modem::dce_factory::Factory::build::args"],[1,4,1,"_CPPv4I0DpEN9esp_modem11dce_factory7Factory5buildEP3DCEPK6configDpRR4Args","esp_modem::dce_factory::Factory::build::cfg"],[1,3,1,"_CPPv4I0DpEN9esp_modem11dce_factory7Factory12build_uniqueENSt10unique_ptrI3DCEEEPK6configDpRR4Args","esp_modem::dce_factory::Factory::build_unique"],[1,3,1,"_CPPv4IDpEN9esp_modem11dce_factory7Factory12build_uniqueENSt10unique_ptrI3DCEEEPK6configDpRR4Args","esp_modem::dce_factory::Factory::build_unique"],[1,7,1,"_CPPv4I0DpEN9esp_modem11dce_factory7Factory12build_uniqueENSt10unique_ptrI3DCEEEPK6configDpRR4Args","esp_modem::dce_factory::Factory::build_unique::Args"],[1,7,1,"_CPPv4IDpEN9esp_modem11dce_factory7Factory12build_uniqueENSt10unique_ptrI3DCEEEPK6configDpRR4Args","esp_modem::dce_factory::Factory::build_unique::Args"],[1,7,1,"_CPPv4I0DpEN9esp_modem11dce_factory7Factory12build_uniqueENSt10unique_ptrI3DCEEEPK6configDpRR4Args","esp_modem::dce_factory::Factory::build_unique::T_Module"],[1,4,1,"_CPPv4I0DpEN9esp_modem11dce_factory7Factory12build_uniqueENSt10unique_ptrI3DCEEEPK6configDpRR4Args","esp_modem::dce_factory::Factory::build_unique::args"],[1,4,1,"_CPPv4IDpEN9esp_modem11dce_factory7Factory12build_uniqueENSt10unique_ptrI3DCEEEPK6configDpRR4Args","esp_modem::dce_factory::Factory::build_unique::args"],[1,4,1,"_CPPv4I0DpEN9esp_modem11dce_factory7Factory12build_uniqueENSt10unique_ptrI3DCEEEPK6configDpRR4Args","esp_modem::dce_factory::Factory::build_unique::cfg"],[1,4,1,"_CPPv4IDpEN9esp_modem11dce_factory7Factory12build_uniqueENSt10unique_ptrI3DCEEEPK6configDpRR4Args","esp_modem::dce_factory::Factory::build_unique::cfg"],[1,6,1,"_CPPv4N9esp_modem11dce_factory13FactoryHelperE","esp_modem::dce_factory::FactoryHelper"],[2,3,1,"_CPPv412esp_modem_atF9STRING_IN2p13cmdEF10STRING_OUT2p23outEF6INT_IN2p37timeoutE","esp_modem_at"],[2,3,1,"_CPPv417esp_modem_commandP15esp_modem_dce_tPKcPF9esp_err_tP7uint8_t6size_tE8uint32_t","esp_modem_command"],[2,4,1,"_CPPv417esp_modem_commandP15esp_modem_dce_tPKcPF9esp_err_tP7uint8_t6size_tE8uint32_t","esp_modem_command::command"],[2,4,1,"_CPPv417esp_modem_commandP15esp_modem_dce_tPKcPF9esp_err_tP7uint8_t6size_tE8uint32_t","esp_modem_command::dce"],[2,4,1,"_CPPv417esp_modem_commandP15esp_modem_dce_tPKcPF9esp_err_tP7uint8_t6size_tE8uint32_t","esp_modem_command::got_line_cb"],[2,4,1,"_CPPv417esp_modem_commandP15esp_modem_dce_tPKcPF9esp_err_tP7uint8_t6size_tE8uint32_t","esp_modem_command::timeout_ms"],[2,6,1,"_CPPv420esp_modem_dce_config","esp_modem_dce_config"],[2,8,1,"_CPPv4N20esp_modem_dce_config3apnE","esp_modem_dce_config::apn"],[2,5,1,"_CPPv422esp_modem_dce_config_t","esp_modem_dce_config_t"],[2,2,1,"_CPPv420esp_modem_dce_device","esp_modem_dce_device"],[2,1,1,"_CPPv4N20esp_modem_dce_device18ESP_MODEM_DCE_BG96E","esp_modem_dce_device::ESP_MODEM_DCE_BG96"],[2,1,1,"_CPPv4N20esp_modem_dce_device21ESP_MODEM_DCE_GENETICE","esp_modem_dce_device::ESP_MODEM_DCE_GENETIC"],[2,1,1,"_CPPv4N20esp_modem_dce_device21ESP_MODEM_DCE_SIM7000E","esp_modem_dce_device::ESP_MODEM_DCE_SIM7000"],[2,1,1,"_CPPv4N20esp_modem_dce_device21ESP_MODEM_DCE_SIM7070E","esp_modem_dce_device::ESP_MODEM_DCE_SIM7070"],[2,1,1,"_CPPv4N20esp_modem_dce_device21ESP_MODEM_DCE_SIM7600E","esp_modem_dce_device::ESP_MODEM_DCE_SIM7600"],[2,1,1,"_CPPv4N20esp_modem_dce_device20ESP_MODEM_DCE_SIM800E","esp_modem_dce_device::ESP_MODEM_DCE_SIM800"],[2,5,1,"_CPPv422esp_modem_dce_device_t","esp_modem_dce_device_t"],[2,2,1,"_CPPv418esp_modem_dce_mode","esp_modem_dce_mode"],[2,1,1,"_CPPv4N18esp_modem_dce_mode19ESP_MODEM_MODE_CMUXE","esp_modem_dce_mode::ESP_MODEM_MODE_CMUX"],[2,1,1,"_CPPv4N18esp_modem_dce_mode26ESP_MODEM_MODE_CMUX_MANUALE","esp_modem_dce_mode::ESP_MODEM_MODE_CMUX_MANUAL"],[2,1,1,"_CPPv4N18esp_modem_dce_mode34ESP_MODEM_MODE_CMUX_MANUAL_COMMANDE","esp_modem_dce_mode::ESP_MODEM_MODE_CMUX_MANUAL_COMMAND"],[2,1,1,"_CPPv4N18esp_modem_dce_mode31ESP_MODEM_MODE_CMUX_MANUAL_DATAE","esp_modem_dce_mode::ESP_MODEM_MODE_CMUX_MANUAL_DATA"],[2,1,1,"_CPPv4N18esp_modem_dce_mode31ESP_MODEM_MODE_CMUX_MANUAL_EXITE","esp_modem_dce_mode::ESP_MODEM_MODE_CMUX_MANUAL_EXIT"],[2,1,1,"_CPPv4N18esp_modem_dce_mode31ESP_MODEM_MODE_CMUX_MANUAL_SWAPE","esp_modem_dce_mode::ESP_MODEM_MODE_CMUX_MANUAL_SWAP"],[2,1,1,"_CPPv4N18esp_modem_dce_mode22ESP_MODEM_MODE_COMMANDE","esp_modem_dce_mode::ESP_MODEM_MODE_COMMAND"],[2,1,1,"_CPPv4N18esp_modem_dce_mode19ESP_MODEM_MODE_DATAE","esp_modem_dce_mode::ESP_MODEM_MODE_DATA"],[2,5,1,"_CPPv420esp_modem_dce_mode_t","esp_modem_dce_mode_t"],[2,3,1,"_CPPv417esp_modem_destroyP15esp_modem_dce_t","esp_modem_destroy"],[2,4,1,"_CPPv417esp_modem_destroyP15esp_modem_dce_t","esp_modem_destroy::dce"],[2,6,1,"_CPPv420esp_modem_dte_config","esp_modem_dte_config"],[2,8,1,"_CPPv4N20esp_modem_dte_config15dte_buffer_sizeE","esp_modem_dte_config::dte_buffer_size"],[2,8,1,"_CPPv4N20esp_modem_dte_config16extension_configE","esp_modem_dte_config::extension_config"],[2,8,1,"_CPPv4N20esp_modem_dte_config13task_priorityE","esp_modem_dte_config::task_priority"],[2,8,1,"_CPPv4N20esp_modem_dte_config15task_stack_sizeE","esp_modem_dte_config::task_stack_size"],[2,8,1,"_CPPv4N20esp_modem_dte_config11uart_configE","esp_modem_dte_config::uart_config"],[2,8,1,"_CPPv4N20esp_modem_dte_config10vfs_configE","esp_modem_dte_config::vfs_config"],[2,5,1,"_CPPv422esp_modem_dte_config_t","esp_modem_dte_config_t"],[2,2,1,"_CPPv421esp_modem_flow_ctrl_t","esp_modem_flow_ctrl_t"],[2,1,1,"_CPPv4N21esp_modem_flow_ctrl_t25ESP_MODEM_FLOW_CONTROL_HWE","esp_modem_flow_ctrl_t::ESP_MODEM_FLOW_CONTROL_HW"],[2,1,1,"_CPPv4N21esp_modem_flow_ctrl_t27ESP_MODEM_FLOW_CONTROL_NONEE","esp_modem_flow_ctrl_t::ESP_MODEM_FLOW_CONTROL_NONE"],[2,1,1,"_CPPv4N21esp_modem_flow_ctrl_t25ESP_MODEM_FLOW_CONTROL_SWE","esp_modem_flow_ctrl_t::ESP_MODEM_FLOW_CONTROL_SW"],[2,3,1,"_CPPv428esp_modem_get_battery_statusF7INT_OUT2p17voltageEF7INT_OUT2p23bcsEF7INT_OUT2p33bclE","esp_modem_get_battery_status"],[2,3,1,"_CPPv429esp_modem_get_gnss_power_modeF7INT_OUT2p14modeE","esp_modem_get_gnss_power_mode"],[2,3,1,"_CPPv418esp_modem_get_imeiF10STRING_OUT2p14imeiE","esp_modem_get_imei"],[2,3,1,"_CPPv418esp_modem_get_imsiF10STRING_OUT2p14imsiE","esp_modem_get_imsi"],[2,3,1,"_CPPv425esp_modem_get_module_nameF10STRING_OUT2p14nameE","esp_modem_get_module_name"],[2,3,1,"_CPPv438esp_modem_get_network_attachment_stateF7INT_OUT2p15stateE","esp_modem_get_network_attachment_state"],[2,3,1,"_CPPv433esp_modem_get_network_system_modeF7INT_OUT2p14modeE","esp_modem_get_network_system_mode"],[2,3,1,"_CPPv427esp_modem_get_operator_nameF10STRING_OUT2p14nameEF7INT_OUT2p23actE","esp_modem_get_operator_name"],[2,3,1,"_CPPv425esp_modem_get_radio_stateF7INT_OUT2p15stateE","esp_modem_get_radio_state"],[2,3,1,"_CPPv428esp_modem_get_signal_qualityF7INT_OUT2p14rssiEF7INT_OUT2p23berE","esp_modem_get_signal_quality"],[2,3,1,"_CPPv417esp_modem_hang_upv","esp_modem_hang_up"],[2,3,1,"_CPPv413esp_modem_newPK22esp_modem_dte_config_tPK22esp_modem_dce_config_tP11esp_netif_t","esp_modem_new"],[2,4,1,"_CPPv413esp_modem_newPK22esp_modem_dte_config_tPK22esp_modem_dce_config_tP11esp_netif_t","esp_modem_new::dce_config"],[2,4,1,"_CPPv413esp_modem_newPK22esp_modem_dte_config_tPK22esp_modem_dce_config_tP11esp_netif_t","esp_modem_new::dte_config"],[2,4,1,"_CPPv413esp_modem_newPK22esp_modem_dte_config_tPK22esp_modem_dce_config_tP11esp_netif_t","esp_modem_new::netif"],[2,3,1,"_CPPv417esp_modem_new_dev22esp_modem_dce_device_tPK22esp_modem_dte_config_tPK22esp_modem_dce_config_tP11esp_netif_t","esp_modem_new_dev"],[2,4,1,"_CPPv417esp_modem_new_dev22esp_modem_dce_device_tPK22esp_modem_dte_config_tPK22esp_modem_dce_config_tP11esp_netif_t","esp_modem_new_dev::dce_config"],[2,4,1,"_CPPv417esp_modem_new_dev22esp_modem_dce_device_tPK22esp_modem_dte_config_tPK22esp_modem_dce_config_tP11esp_netif_t","esp_modem_new_dev::dte_config"],[2,4,1,"_CPPv417esp_modem_new_dev22esp_modem_dce_device_tPK22esp_modem_dte_config_tPK22esp_modem_dce_config_tP11esp_netif_t","esp_modem_new_dev::module"],[2,4,1,"_CPPv417esp_modem_new_dev22esp_modem_dce_device_tPK22esp_modem_dte_config_tPK22esp_modem_dce_config_tP11esp_netif_t","esp_modem_new_dev::netif"],[2,3,1,"_CPPv420esp_modem_power_downv","esp_modem_power_down"],[2,3,1,"_CPPv418esp_modem_read_pinF8BOOL_OUT2p16pin_okE","esp_modem_read_pin"],[2,3,1,"_CPPv415esp_modem_resetv","esp_modem_reset"],[2,3,1,"_CPPv426esp_modem_resume_data_modev","esp_modem_resume_data_mode"],[2,3,1,"_CPPv418esp_modem_send_smsF9STRING_IN2p16numberEF9STRING_IN2p27messageE","esp_modem_send_sms"],[2,3,1,"_CPPv418esp_modem_set_baudF6INT_IN2p14baudE","esp_modem_set_baud"],[2,3,1,"_CPPv418esp_modem_set_cmuxv","esp_modem_set_cmux"],[2,3,1,"_CPPv426esp_modem_set_command_modev","esp_modem_set_command_mode"],[2,3,1,"_CPPv423esp_modem_set_data_modev","esp_modem_set_data_mode"],[2,3,1,"_CPPv418esp_modem_set_echoF7BOOL_IN2p17echo_onE","esp_modem_set_echo"],[2,3,1,"_CPPv422esp_modem_set_error_cbP15esp_modem_dce_t28esp_modem_terminal_error_cbt","esp_modem_set_error_cb"],[2,4,1,"_CPPv422esp_modem_set_error_cbP15esp_modem_dce_t28esp_modem_terminal_error_cbt","esp_modem_set_error_cb::dce"],[2,4,1,"_CPPv422esp_modem_set_error_cbP15esp_modem_dce_t28esp_modem_terminal_error_cbt","esp_modem_set_error_cb::err_cb"],[2,3,1,"_CPPv426esp_modem_set_flow_controlF6INT_IN2p18dce_flowEF6INT_IN2p28dte_flowE","esp_modem_set_flow_control"],[2,3,1,"_CPPv429esp_modem_set_gnss_power_modeF6INT_IN2p14modeE","esp_modem_set_gnss_power_mode"],[2,3,1,"_CPPv418esp_modem_set_modeP15esp_modem_dce_t20esp_modem_dce_mode_t","esp_modem_set_mode"],[2,4,1,"_CPPv418esp_modem_set_modeP15esp_modem_dce_t20esp_modem_dce_mode_t","esp_modem_set_mode::dce"],[2,4,1,"_CPPv418esp_modem_set_modeP15esp_modem_dce_t20esp_modem_dce_mode_t","esp_modem_set_mode::mode"],[2,3,1,"_CPPv438esp_modem_set_network_attachment_stateF6INT_IN2p15stateE","esp_modem_set_network_attachment_state"],[2,3,1,"_CPPv427esp_modem_set_network_bandsF9STRING_IN2p14modeEF15INTEGER_LIST_IN2p25bandsEF6INT_IN2p34sizeE","esp_modem_set_network_bands"],[2,3,1,"_CPPv426esp_modem_set_network_modeF6INT_IN2p14modeE","esp_modem_set_network_mode"],[2,3,1,"_CPPv422esp_modem_set_operatorF6INT_IN2p14modeEF6INT_IN2p26formatEF9STRING_IN2p34operE","esp_modem_set_operator"],[2,3,1,"_CPPv425esp_modem_set_pdp_contextF10STRUCT_OUT10PdpContext2p1E","esp_modem_set_pdp_context"],[2,3,1,"_CPPv417esp_modem_set_pinF9STRING_IN2p13pinE","esp_modem_set_pin"],[2,3,1,"_CPPv428esp_modem_set_preferred_modeF6INT_IN2p14modeE","esp_modem_set_preferred_mode"],[2,3,1,"_CPPv425esp_modem_set_radio_stateF6INT_IN2p15stateE","esp_modem_set_radio_state"],[2,3,1,"_CPPv427esp_modem_sms_character_setv","esp_modem_sms_character_set"],[2,3,1,"_CPPv422esp_modem_sms_txt_modeF7BOOL_IN2p13txtE","esp_modem_sms_txt_mode"],[2,3,1,"_CPPv423esp_modem_store_profilev","esp_modem_store_profile"],[2,3,1,"_CPPv414esp_modem_syncv","esp_modem_sync"],[2,2,1,"_CPPv424esp_modem_terminal_error","esp_modem_terminal_error"],[2,1,1,"_CPPv4N24esp_modem_terminal_error34ESP_MODEM_TERMINAL_BUFFER_OVERFLOWE","esp_modem_terminal_error::ESP_MODEM_TERMINAL_BUFFER_OVERFLOW"],[2,1,1,"_CPPv4N24esp_modem_terminal_error33ESP_MODEM_TERMINAL_CHECKSUM_ERRORE","esp_modem_terminal_error::ESP_MODEM_TERMINAL_CHECKSUM_ERROR"],[2,1,1,"_CPPv4N24esp_modem_terminal_error30ESP_MODEM_TERMINAL_DEVICE_GONEE","esp_modem_terminal_error::ESP_MODEM_TERMINAL_DEVICE_GONE"],[2,1,1,"_CPPv4N24esp_modem_terminal_error42ESP_MODEM_TERMINAL_UNEXPECTED_CONTROL_FLOWE","esp_modem_terminal_error::ESP_MODEM_TERMINAL_UNEXPECTED_CONTROL_FLOW"],[2,1,1,"_CPPv4N24esp_modem_terminal_error32ESP_MODEM_TERMINAL_UNKNOWN_ERRORE","esp_modem_terminal_error::ESP_MODEM_TERMINAL_UNKNOWN_ERROR"],[2,5,1,"_CPPv428esp_modem_terminal_error_cbt","esp_modem_terminal_error_cbt"],[2,5,1,"_CPPv426esp_modem_terminal_error_t","esp_modem_terminal_error_t"],[2,6,1,"_CPPv426esp_modem_uart_term_config","esp_modem_uart_term_config"],[2,8,1,"_CPPv4N26esp_modem_uart_term_config9baud_rateE","esp_modem_uart_term_config::baud_rate"],[2,8,1,"_CPPv4N26esp_modem_uart_term_config10cts_io_numE","esp_modem_uart_term_config::cts_io_num"],[2,8,1,"_CPPv4N26esp_modem_uart_term_config9data_bitsE","esp_modem_uart_term_config::data_bits"],[2,8,1,"_CPPv4N26esp_modem_uart_term_config16event_queue_sizeE","esp_modem_uart_term_config::event_queue_size"],[2,8,1,"_CPPv4N26esp_modem_uart_term_config12flow_controlE","esp_modem_uart_term_config::flow_control"],[2,8,1,"_CPPv4N26esp_modem_uart_term_config6parityE","esp_modem_uart_term_config::parity"],[2,8,1,"_CPPv4N26esp_modem_uart_term_config8port_numE","esp_modem_uart_term_config::port_num"],[2,8,1,"_CPPv4N26esp_modem_uart_term_config10rts_io_numE","esp_modem_uart_term_config::rts_io_num"],[2,8,1,"_CPPv4N26esp_modem_uart_term_config14rx_buffer_sizeE","esp_modem_uart_term_config::rx_buffer_size"],[2,8,1,"_CPPv4N26esp_modem_uart_term_config9rx_io_numE","esp_modem_uart_term_config::rx_io_num"],[2,8,1,"_CPPv4N26esp_modem_uart_term_config10source_clkE","esp_modem_uart_term_config::source_clk"],[2,8,1,"_CPPv4N26esp_modem_uart_term_config9stop_bitsE","esp_modem_uart_term_config::stop_bits"],[2,8,1,"_CPPv4N26esp_modem_uart_term_config14tx_buffer_sizeE","esp_modem_uart_term_config::tx_buffer_size"],[2,8,1,"_CPPv4N26esp_modem_uart_term_config9tx_io_numE","esp_modem_uart_term_config::tx_io_num"],[2,6,1,"_CPPv425esp_modem_vfs_term_config","esp_modem_vfs_term_config"],[2,8,1,"_CPPv4N25esp_modem_vfs_term_config7deleterE","esp_modem_vfs_term_config::deleter"],[2,8,1,"_CPPv4N25esp_modem_vfs_term_config2fdE","esp_modem_vfs_term_config::fd"],[2,8,1,"_CPPv4N25esp_modem_vfs_term_config8resourceE","esp_modem_vfs_term_config::resource"],[7,3,1,"_CPPv415generic_commandP13CommandableIfRKNSt6stringERKNSt6stringERKNSt6stringE8uint32_t","generic_command"],[7,4,1,"_CPPv415generic_commandP13CommandableIfRKNSt6stringERKNSt6stringERKNSt6stringE8uint32_t","generic_command::command"],[7,4,1,"_CPPv415generic_commandP13CommandableIfRKNSt6stringERKNSt6stringERKNSt6stringE8uint32_t","generic_command::fail_phrase"],[7,4,1,"_CPPv415generic_commandP13CommandableIfRKNSt6stringERKNSt6stringERKNSt6stringE8uint32_t","generic_command::pass_phrase"],[7,4,1,"_CPPv415generic_commandP13CommandableIfRKNSt6stringERKNSt6stringERKNSt6stringE8uint32_t","generic_command::t"],[7,4,1,"_CPPv415generic_commandP13CommandableIfRKNSt6stringERKNSt6stringERKNSt6stringE8uint32_t","generic_command::timeout_ms"],[7,3,1,"_CPPv426get_battery_status_sim7xxxP13CommandableIfRiRiRi","get_battery_status_sim7xxx"],[7,4,1,"_CPPv426get_battery_status_sim7xxxP13CommandableIfRiRiRi","get_battery_status_sim7xxx::bcl"],[7,4,1,"_CPPv426get_battery_status_sim7xxxP13CommandableIfRiRiRi","get_battery_status_sim7xxx::bcs"],[7,4,1,"_CPPv426get_battery_status_sim7xxxP13CommandableIfRiRiRi","get_battery_status_sim7xxx::t"],[7,4,1,"_CPPv426get_battery_status_sim7xxxP13CommandableIfRiRiRi","get_battery_status_sim7xxx::voltage"],[7,5,1,"_CPPv411got_line_cb","got_line_cb"],[7,2,1,"_CPPv410modem_mode","modem_mode"],[7,1,1,"_CPPv4N10modem_mode19CMUX_MANUAL_COMMANDE","modem_mode::CMUX_MANUAL_COMMAND"],[7,1,1,"_CPPv4N10modem_mode16CMUX_MANUAL_DATAE","modem_mode::CMUX_MANUAL_DATA"],[7,1,1,"_CPPv4N10modem_mode16CMUX_MANUAL_EXITE","modem_mode::CMUX_MANUAL_EXIT"],[7,1,1,"_CPPv4N10modem_mode16CMUX_MANUAL_MODEE","modem_mode::CMUX_MANUAL_MODE"],[7,1,1,"_CPPv4N10modem_mode16CMUX_MANUAL_SWAPE","modem_mode::CMUX_MANUAL_SWAP"],[7,1,1,"_CPPv4N10modem_mode9CMUX_MODEE","modem_mode::CMUX_MODE"],[7,1,1,"_CPPv4N10modem_mode12COMMAND_MODEE","modem_mode::COMMAND_MODE"],[7,1,1,"_CPPv4N10modem_mode9DATA_MODEE","modem_mode::DATA_MODE"],[7,1,1,"_CPPv4N10modem_mode9DUAL_MODEE","modem_mode::DUAL_MODE"],[7,1,1,"_CPPv4N10modem_mode5UNDEFE","modem_mode::UNDEF"],[7,3,1,"_CPPv418power_down_sim70xxP13CommandableIf","power_down_sim70xx"],[7,4,1,"_CPPv418power_down_sim70xxP13CommandableIf","power_down_sim70xx::t"],[7,3,1,"_CPPv418power_down_sim76xxP13CommandableIf","power_down_sim76xx"],[7,4,1,"_CPPv418power_down_sim76xxP13CommandableIf","power_down_sim76xx::t"],[7,3,1,"_CPPv417power_down_sim8xxP13CommandableIf","power_down_sim8xx"],[7,4,1,"_CPPv417power_down_sim8xxP13CommandableIf","power_down_sim8xx::t"],[7,3,1,"_CPPv420set_data_mode_sim8xxP13CommandableIf","set_data_mode_sim8xx"],[7,4,1,"_CPPv420set_data_mode_sim8xxP13CommandableIf","set_data_mode_sim8xx::t"],[7,3,1,"_CPPv427set_gnss_power_mode_sim76xxP13CommandableIfi","set_gnss_power_mode_sim76xx"],[7,4,1,"_CPPv427set_gnss_power_mode_sim76xxP13CommandableIfi","set_gnss_power_mode_sim76xx::mode"],[7,4,1,"_CPPv427set_gnss_power_mode_sim76xxP13CommandableIfi","set_gnss_power_mode_sim76xx::t"],[7,3,1,"_CPPv425set_network_bands_sim76xxP13CommandableIfRKNSt6stringEPKii","set_network_bands_sim76xx"],[7,4,1,"_CPPv425set_network_bands_sim76xxP13CommandableIfRKNSt6stringEPKii","set_network_bands_sim76xx::bands"],[7,4,1,"_CPPv425set_network_bands_sim76xxP13CommandableIfRKNSt6stringEPKii","set_network_bands_sim76xx::mode"],[7,4,1,"_CPPv425set_network_bands_sim76xxP13CommandableIfRKNSt6stringEPKii","set_network_bands_sim76xx::size"],[7,4,1,"_CPPv425set_network_bands_sim76xxP13CommandableIfRKNSt6stringEPKii","set_network_bands_sim76xx::t"],[7,2,1,"_CPPv414terminal_error","terminal_error"],[7,1,1,"_CPPv4N14terminal_error15BUFFER_OVERFLOWE","terminal_error::BUFFER_OVERFLOW"],[7,1,1,"_CPPv4N14terminal_error14CHECKSUM_ERRORE","terminal_error::CHECKSUM_ERROR"],[7,1,1,"_CPPv4N14terminal_error11DEVICE_GONEE","terminal_error::DEVICE_GONE"],[7,1,1,"_CPPv4N14terminal_error23UNEXPECTED_CONTROL_FLOWE","terminal_error::UNEXPECTED_CONTROL_FLOW"]]},objnames:{"0":["c","macro","C macro"],"1":["cpp","enumerator","C++ enumerator"],"2":["cpp","enum","C++ enum"],"3":["cpp","function","C++ function"],"4":["cpp","functionParam","C++ function parameter"],"5":["cpp","type","C++ type"],"6":["cpp","class","C++ class"],"7":["cpp","templateParam","C++ template parameter"],"8":["cpp","member","C++ member"]},objtypes:{"0":"c:macro","1":"cpp:enumerator","2":"cpp:enum","3":"cpp:function","4":"cpp:functionParam","5":"cpp:type","6":"cpp:class","7":"cpp:templateParam","8":"cpp:member"},terms:{"0":[2,7],"1":[2,7],"100":[2,7],"2":[2,7],"3":[2,7],"4":[2,7],"6":7,"64":2,"8212":7,"abstract":[0,5,6],"break":6,"byte":[2,7],"case":[5,6],"catch":6,"char":[2,7],"class":[0,1,3,6,7],"const":[1,2,3,7],"default":[1,2,3,7],"do":7,"enum":[1,2,7],"function":[1,2,3,7],"int":[2,7],"long":[2,6,7],"new":[0,2,5,6],"null":2,"public":[0,1,2,3,7],"return":[1,2,3,7],"short":[2,7],"static":1,"switch":[0,2,5,7],"throw":[1,6],"true":[2,7],"try":6,"void":[2,3,7],AT:[0,1,2,3,6,7],In:1,Is:0,It:[1,3,7],Not:[2,7],ON:6,The:[0,1,2,3,6,7],These:2,To:7,_:0,abl:7,abort:[3,6],abov:7,accept:7,access:[2,7],act:[2,7],actual:[2,7],ad:[0,5],add:[0,6,7],addit:[6,7],address:0,advanc:[5,7],after:[0,2,7],again:2,aggreg:[3,7],all:[0,1,3,7],alloc:[2,6],allow:0,alreadi:2,also:[0,1,2,6,7],an:[0,1,2,7],ani:1,answer:7,anyth:7,ap:0,ap_to_pppo:0,api:[5,6,7],apn:2,app:[1,2],appli:1,applic:[0,1,2,3],appropri:[1,7],ar:[0,2,3,6,7],arbitrari:6,arg:1,argument:[1,7],assign:7,attach:[0,2,7],attempt:[2,7],automat:[2,3,7],avail:[0,2,6,7],back:[2,7],band:[2,7],base:[1,3,7],basic:[0,1,2,3,6,7],batteri:[2,7],baud:[2,7],baud_rat:2,baudrat:[2,7],bc:[2,7],bcl:[2,7],below:6,ber:[2,7],besid:7,between:[0,7],bg69:1,bg96:[0,1,3,7],bit:[2,7],block:[3,6,7],bool:7,bool_in:[2,7],bool_out:[2,7],both:[0,7],brief:5,broker:0,buffer:[2,7],buffer_overflow:7,build:[1,7],build_uniqu:1,builder:1,c:[5,6,7],call:[2,7],callback:[2,6,7],can:[6,7],capac:[2,7],card:[2,7],care:7,cat:[2,7],cellular:[0,2,7],cfg:1,chang:0,channel:[2,7],chapter:[1,7],charact:[2,7],charg:[2,7],check:[0,2,7],checksum_error:7,choic:1,chosen:[1,2],circuitri:[2,7],clariti:7,clean:3,clenaup:2,client:0,clock:2,close:[2,7],cmd:[2,7],cmux:[2,5],cmux_manual_command:7,cmux_manual_data:7,cmux_manual_exit:7,cmux_manual_mod:7,cmux_manual_swap:7,cmux_mod:7,cmux_stat:7,cmuxinst:[6,7],code:[2,6,7],collabor:5,command:[0,1,5,6],command_mod:7,command_result:[2,7],commandableif:7,common:[0,1,2,6,7],commun:[0,2,3,5,7],compil:[0,6],complet:[2,7],compli:7,compon:[1,5,7],compos:[0,6],config:[0,1,2,3,7],configur:[1,3,5,7],configure_pdp_context:7,connect:[0,1,2,7],consequ:[3,7],consist:[2,3,7],consol:0,construct:[3,7],constructor:[1,6],consum:[6,7],context:[2,7],control:[2,7],correctli:7,correspond:1,could:[0,1,6,7],cpp:[0,7],creat:[0,2,5,7],create_bg96_dc:3,create_generic_dc:3,create_sim7000_dc:3,create_sim7070_dc:3,create_sim7600_dc:3,create_sim800_dc:3,create_uart_dt:3,create_vfs_dt:3,creator:1,ct:[2,7],cts_io_num:2,current:[0,2,7],custom:[2,5,7],d:7,data:[0,2,3,6,7],data_bit:2,data_mod:7,dce:[2,4,5],dce_config:[2,3],dce_factori:1,dce_flow:[2,7],dce_mod:7,dce_t:[1,3,7],decis:5,declar:7,dedic:2,defin:[0,1,2,7],definit:7,deinit:7,delet:2,demonstr:1,depict:6,deregist:[2,7],deriv:[0,1,7],describ:[6,7],descript:[0,7],descriptor:2,design:[0,5],desir:[2,7],destroi:[2,5,7],detach:[2,7],detail:7,develop:7,devic:[1,2,5,6],device_gon:7,diagram:6,didn:7,differ:[0,1,6,7],disabl:3,document:[0,7],doesn:[2,3,7],done:[2,7],down:[2,6,7],driver:6,dte:[1,2,5,6],dte_buffer_s:2,dte_command:7,dte_config:[2,3],dte_flow:[2,7],dual:7,dual_mod:7,due:3,e:[0,1,7],easier:6,echo:[2,7],echo_on:[2,7],either:[1,3,7],eject:7,elig:7,enter:7,enumer:[1,2,7],equip:[0,7],err:7,err_cb:2,error:[2,3,6,7],esp:[2,7],esp_err_t:2,esp_fail:2,esp_modem:[1,3,4,7],esp_modem_at:2,esp_modem_c_api:2,esp_modem_c_api_str_max:2,esp_modem_cmux:7,esp_modem_command:2,esp_modem_command_declar:7,esp_modem_config:2,esp_modem_dc:7,esp_modem_dce_bg96:2,esp_modem_dce_command:7,esp_modem_dce_config:[2,3],esp_modem_dce_config_t:[0,2],esp_modem_dce_default_config:2,esp_modem_dce_devic:2,esp_modem_dce_device_t:2,esp_modem_dce_factori:1,esp_modem_dce_genet:2,esp_modem_dce_mod:2,esp_modem_dce_mode_t:2,esp_modem_dce_modul:7,esp_modem_dce_sim7000:2,esp_modem_dce_sim7070:2,esp_modem_dce_sim7600:2,esp_modem_dce_sim800:2,esp_modem_dce_t:2,esp_modem_declare_dce_command:7,esp_modem_default_uart_clk:2,esp_modem_destroi:2,esp_modem_dt:7,esp_modem_dte_config:[1,2,3,7],esp_modem_dte_config_t:[0,2],esp_modem_dte_default_config:2,esp_modem_flow_control_hw:2,esp_modem_flow_control_non:2,esp_modem_flow_control_sw:2,esp_modem_flow_ctrl_t:2,esp_modem_get_battery_statu:2,esp_modem_get_gnss_power_mod:2,esp_modem_get_imei:2,esp_modem_get_imsi:2,esp_modem_get_module_nam:2,esp_modem_get_network_attachment_st:2,esp_modem_get_network_system_mod:2,esp_modem_get_operator_nam:2,esp_modem_get_radio_st:2,esp_modem_get_signal_qu:2,esp_modem_hang_up:2,esp_modem_init_dc:3,esp_modem_init_dt:3,esp_modem_mode_cmux:2,esp_modem_mode_cmux_manu:2,esp_modem_mode_cmux_manual_command:2,esp_modem_mode_cmux_manual_data:2,esp_modem_mode_cmux_manual_exit:2,esp_modem_mode_cmux_manual_swap:2,esp_modem_mode_command:2,esp_modem_mode_data:2,esp_modem_modul:7,esp_modem_netif:7,esp_modem_new:2,esp_modem_new_dev:2,esp_modem_power_down:2,esp_modem_read_pin:2,esp_modem_reset:2,esp_modem_resume_data_mod:2,esp_modem_send_sm:2,esp_modem_set_baud:2,esp_modem_set_cmux:2,esp_modem_set_command_mod:2,esp_modem_set_data_mod:2,esp_modem_set_echo:2,esp_modem_set_error_cb:2,esp_modem_set_flow_control:2,esp_modem_set_gnss_power_mod:2,esp_modem_set_mod:2,esp_modem_set_network_attachment_st:2,esp_modem_set_network_band:2,esp_modem_set_network_mod:2,esp_modem_set_oper:2,esp_modem_set_pdp_context:2,esp_modem_set_pin:2,esp_modem_set_preferred_mod:2,esp_modem_set_radio_st:2,esp_modem_sms_character_set:2,esp_modem_sms_txt_mod:2,esp_modem_store_profil:2,esp_modem_sync:2,esp_modem_termin:7,esp_modem_terminal_buffer_overflow:2,esp_modem_terminal_checksum_error:2,esp_modem_terminal_device_gon:2,esp_modem_terminal_error:2,esp_modem_terminal_error_cbt:2,esp_modem_terminal_error_t:2,esp_modem_terminal_unexpected_control_flow:2,esp_modem_terminal_unknown_error:2,esp_modem_typ:7,esp_modem_uart_term_config:2,esp_modem_vfs_resourc:2,esp_modem_vfs_term_config:2,esp_netif_t:[2,3],esp_ok:2,especi:7,etc:7,event:[0,2],event_queue_s:2,exampl:[0,1],except:[3,6],execut:[2,7],exercis:0,exist:[0,1,7],exit:[2,7],expand:7,expect:2,experiment:0,explain:7,explicit:7,explicitli:[3,7],extens:[1,5,7],extension_config:2,f:7,factori:[5,7],factoryhelp:1,fail:[2,7],fail_phras:7,failur:[2,3,6],fallback:[2,7],fd:2,featur:0,file:[2,7],find:0,first:7,flow:[2,7],flow_control:2,focus:0,follow:[2,7],footer:7,forc:[2,7],format:[2,7],forward:[0,7],from:[0,1,2,6,7],full:[2,7],g:[0,1],gener:[1,2,3,5,6],generic_command:7,genericmodul:[0,1,6,7],get:[2,3,7],get_battery_statu:[3,4,7],get_battery_status_sim7xxx:7,get_gnss_power_mod:[3,4,7],get_imei:[3,4,7],get_imsi:[3,4,7],get_module_nam:[3,4,7],get_network_attachment_st:[3,4,7],get_network_system_mod:[3,4,7],get_operator_nam:[3,4,7],get_radio_st:[3,4,7],get_signal_qu:[3,4,7],given:[2,7],glue:7,gnss:[2,7],goe:3,got_lin:7,got_line_cb:[2,7],gpr:[2,7],group:[1,2,3,7],gsm:[2,7],h:2,ha:7,handl:[1,2,6],handler:0,hang:[2,7],hang_up:[3,4,7],have:[0,3,7],header:7,helper:[1,7],hold:7,how:6,hpp:[1,7],human:7,hw:[2,7],i2c:1,i:[0,1,7],idea:6,imei:[2,7],implant:6,implement:[0,1,2,5,6],imsi:[2,7],inc:7,includ:[1,2,7],index:7,indic:[2,7],inherit:5,init:[6,7],initi:[2,3,6,7],inlin:[1,3,7],input:7,inst:7,instanc:[2,7],instanti:5,insuffici:3,int_in:[2,7],int_out:[2,7],integ:7,integer_list_in:[2,7],interact:0,interfac:[0,2,3,5,6],intern:5,internet:0,intro:5,io:1,iot:[2,7],ip:0,issu:[0,2],its:[0,2,6,7],itself:7,just:7,kconfig:5,keep:7,layer:7,least:2,len:[2,7],length:7,level:[2,7],librari:[0,5],lifecycl:5,line:7,list:[0,2,7],logic:[2,7],low:7,lwip:0,m:[2,7],machin:7,macro:[6,7],mandatori:7,mani:1,manual:[2,7],maximum:7,mean:[0,7],media:0,member:2,memori:3,menuconfig:0,messag:[2,7],method:[1,6,7],might:[0,6],millisecond:[2,7],minim:6,minimum:[2,7],mode:[0,2,5,6,7],model:[0,1,5],modem:6,modem_consol:[0,1],modem_mod:7,modemtyp:1,modern:0,modifi:0,modul:[2,3,5,6],moduleif:[6,7],more:6,most:[1,2,6,7],mqtt:0,ms:7,multipl:[0,7],multiplex:[2,6,7],must:[0,7],mv:[2,7],name:[2,7],namespac:7,nat:0,nb:[2,7],necessari:[1,3,7],need:[1,2,7],netif:[1,2,3,5,6],network:[0,1,2,3,6,7],new_pdp:7,none:[2,7],note:[1,2],notif:0,now:2,nullptr:3,num:7,number:[2,6,7],numer:[2,7],o:0,object:[0,1,3,7],off:[2,6,7],ok:[2,7],one:[1,7],ones:0,onli:[0,1,2,6,7],oonli:6,oper:[0,2,7],option:[0,2],order:[1,7],origin:[6,7],other:[5,7],out:[2,3,7],outlin:1,output:[2,7],over:[0,6],overrid:[1,7],p1:[2,7],p2:[2,7],p3:[2,7],packet:0,pair:7,paramet:[1,2,3,7],parent:7,pariti:2,part:2,pass:7,pass_phras:7,pattern:7,payload:7,pdp:[2,7],pdpcontext:[2,7],pdu:[2,7],perform:2,phone:[2,7],php:[2,7],phrase:7,physic:0,pin:[2,7],pin_ok:[2,7],plain:[1,2],pleas:[0,1,7],point:[2,7],pointer:[1,2,7],port:2,port_num:2,portion:2,possibl:[0,1],power:[2,7],power_down:[3,4,7],power_down_sim70xx:7,power_down_sim76xx:7,power_down_sim8xx:7,ppp:[1,2,5,6,7],pppo:0,pppos_client:0,prefer:[2,7],preprocessor:7,present:7,preview:0,primari:7,prioriti:2,privat:6,profil:[2,7],program:6,properti:0,protocol:[0,7],provid:[0,1,6,7],ptr:[3,7],purpos:1,qualiti:[2,7],queue:2,radio:[2,7],rate:[2,7],read:[0,2,6,7],read_pin:[3,4,7],readabl:7,real:7,receiv:[0,7],recommend:1,recov:7,refer:[1,3,7],regist:0,relat:[3,7],repeat:[2,7],repli:7,repres:[0,1,7],requir:0,reset:[2,3,4,7],resourc:2,respond:7,respons:[3,7],result:7,resum:[2,7],resume_data_mod:[3,4,7],return_typ:7,rssi:[2,7],rt:[2,7],rts_io_num:2,run:0,runtim:[5,6,7],rx:2,rx_buffer_s:2,rx_io_num:2,rxd:2,s:[2,3,5,7],same:[6,7],scope:3,second:7,secondari:7,section:7,select:[2,7],send:[0,2,3,6,7],send_command:0,send_sm:[3,4,7],sent:[2,7],separ:[0,7],sequenc:[2,7],servic:[2,7],set:[2,3,7],set_baud:[3,4,7],set_cmux:[3,4,7],set_command_mod:[3,4,7],set_data:[3,7],set_data_mod:[3,4,7],set_data_mode_sim8xx:7,set_echo:[3,4,7],set_error_cb:7,set_flow_control:[3,4,7],set_gnss_power_mod:[3,4,7],set_gnss_power_mode_sim76xx:7,set_mod:[0,7],set_network_attachment_st:[3,4,7],set_network_band:[3,4,7],set_network_bands_sim76xx:7,set_network_mod:[3,4,7],set_oper:[3,4,7],set_pdp_context:[3,4,7],set_pin:[3,4,7],set_preferred_mod:[3,4,7],set_radio_st:[3,4,7],set_read_cb:7,setup:[2,7],setup_data_mod:7,share:[1,3,7],shared_ptr:[1,3,7],should:[1,2,7],show:[2,7],signal:[2,7],sim7000:[1,3,7],sim7070:[1,3,7],sim7600:[0,1,3,7],sim800:[0,1,3,7],sim:[2,7],similar:3,simpl:[0,2],simpli:3,simplifi:7,sing:2,singl:7,size:[2,7],size_t:[2,7],sm:[0,2,7],sms_character_set:[3,4,7],sms_txt_mode:[3,4,7],so:7,softwar:0,sole:[0,7],some:[0,6,7],sourc:[2,7],source_clk:2,space:2,special:[6,7],specif:[0,1,2,3,7],specifi:7,specificmodul:[3,6,7],spi:[0,1],stack:2,standard:[0,2],start:7,startup:2,state:[2,7],statu:[2,7],std:[1,3,7],step:1,stop:[2,7],stop_bit:2,store:[2,7],store_profil:[3,4,7],strength:[2,7],string:[2,7],string_in:[2,7],string_out:[2,7],struct:[2,7],struct_out:[2,7],structur:[0,1,5,7],subclass:7,success:[1,2,3,7],successfulli:7,suppli:[1,2,7],support:[0,1,2,7],suppos:7,suspend:[2,7],sw:2,swap:[2,7],sync:[2,3,4,7],synergi:[3,7],system:[2,7],t:[2,3,7],t_modul:1,taken:7,talk:7,task:2,task_prior:2,task_stack_s:2,technolog:[2,7],templat:[1,3,6,7],temporarili:[2,7],termin:[0,1,2,5],terminal_error:7,text:[2,7],textual:2,thee:7,thei:7,them:0,therefor:7,thi:[0,1,2,7],time:[0,6,7],time_m:7,timelin:7,timeout:[2,7],timeout_m:[2,7],top:1,tradit:7,transact:[3,7],treat:6,trivial:1,truncat:2,turn:7,two:[1,2,7],tx:2,tx_buffer_s:2,tx_io_num:2,txd:2,txt:[2,7],type:[0,2,5],typedef:[2,3,7],typenam:1,typic:[0,1,2,7],uart:[0,1,2,3,6,7],uart_config:2,uart_parity_t:2,uart_port_t:2,uart_sclk_t:2,uart_stop_bits_t:2,uart_word_length_t:2,uint32_t:[2,7],uint8_t:[2,7],undef:7,underli:7,unexpected_control_flow:7,uniqu:[1,3,7],unique_buff:7,unique_ptr:[1,3,7],unit:[0,7],unlock:[2,7],unrel:2,unsign:2,unsupport:1,until:7,up:[2,3,7],us:[2,3,5,6,7],usabl:7,usb:0,user:[0,1,2,7],valid:7,valu:[1,2,7],vanilla:1,variou:0,veri:2,version:7,vf:[2,3],vfs_config:2,via:[0,7],virtual:[0,1,6,7],voltag:[2,7],wa:[2,7],wai:[1,7],wait:7,wait_until_ppp_exit:7,we:[0,7],well:[0,6,7],what:[2,7],when:[1,6],where:0,which:[0,1,2,6,7],wifi:0,without:[6,7],work:[2,7],workflow:[2,3],would:7,wrapper:6,write:[6,7],written:7,wrong:3},titles:["ESP MODEM","Advanced esp-modem use cases","C API Documentation","C++ API Documentation","<no title>","ESP-MODEM Programmers manual","Internal design","DCE Internal implementation"],titleterms:{"abstract":7,"case":[0,1],"new":[1,7],"switch":3,ad:7,advanc:1,api:[2,3],c:[2,3],cmux:[0,6,7],collabor:6,command:[2,3,7],commun:1,compon:0,configur:[0,2],creat:[1,3],custom:1,dce:[0,1,3,6,7],decis:6,design:6,destroi:3,devic:[0,7],document:[2,3],dte:[0,3,7],esp:[0,1,5],extens:0,factori:1,gener:7,implement:7,inherit:6,instanti:1,interfac:[1,7],intern:[6,7],kconfig:0,librari:7,lifecycl:2,manual:5,mode:3,model:6,modem:[0,1,2,3,5,7],modul:[0,1,7],netif:[0,7],other:0,ppp:0,programm:5,runtim:0,s:0,structur:2,termin:[6,7],type:7,us:[0,1]}}) \ No newline at end of file diff --git a/esp_websocket_client/.buildinfo b/esp_websocket_client/.buildinfo deleted file mode 100644 index 79a68a3cb..000000000 --- a/esp_websocket_client/.buildinfo +++ /dev/null @@ -1,4 +0,0 @@ -# Sphinx build info version 1 -# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: 0e2cb719c4031f2e7c969c2e270236dc -tags: 549b3d6d0415232fb7e35403b330ff49 diff --git a/esp_websocket_client/_sources/index.rst.txt b/esp_websocket_client/_sources/index.rst.txt deleted file mode 100644 index 2469e1473..000000000 --- a/esp_websocket_client/_sources/index.rst.txt +++ /dev/null @@ -1,126 +0,0 @@ -ESP WebSocket Client -==================== - -Overview --------- -The ESP WebSocket client is an implementation of `WebSocket protocol client `_ for {IDF_TARGET_NAME} - -Features --------- - * Supports WebSocket over TCP, TLS with mbedtls - * Easy to setup with URI - * Multiple instances (Multiple clients in one application) - -Configuration -------------- -URI -^^^ - -- Supports ``ws``, ``wss`` schemes -- WebSocket samples: - - - ``ws://echo.websocket.org``: WebSocket over TCP, default port 80 - - ``wss://echo.websocket.org``: WebSocket over SSL, default port 443 - -Minimal configurations: - -.. code:: c - - const esp_websocket_client_config_t ws_cfg = { - .uri = "ws://echo.websocket.org", - }; - -The WebSocket client supports the use of both path and query in the URI. Sample: - -.. code:: c - - const esp_websocket_client_config_t ws_cfg = { - .uri = "ws://echo.websocket.org/connectionhandler?id=104", - }; - - -If there are any options related to the URI in -:cpp:type:`esp_websocket_client_config_t`, the option defined by the URI will be -overridden. Sample: - -.. code:: c - - const esp_websocket_client_config_t ws_cfg = { - .uri = "ws://echo.websocket.org:123", - .port = 4567, - }; - //WebSocket client will connect to websocket.org using port 4567 - -TLS -^^^ - -Configuration: - -.. code:: c - - const esp_websocket_client_config_t ws_cfg = { - .uri = "wss://echo.websocket.org", - .cert_pem = (const char *)websocket_org_pem_start, - }; - -.. note:: If you want to verify the server, then you need to provide a certificate in PEM format, and provide to ``cert_pem`` in :cpp:type:`websocket_client_config_t`. If no certficate is provided then the TLS connection will default to not requiring verification. - -PEM certificate for this example could be extracted from an openssl `s_client` command connecting to websocket.org. -In case a host operating system has `openssl` and `sed` packages installed, one could execute the following command to download and save the root or intermediate root certificate to a file (Note for Windows users: Both Linux like environment or Windows native packages may be used). -``` -echo "" | openssl s_client -showcerts -connect websocket.org:443 | sed -n "1,/Root/d; /BEGIN/,/END/p" | openssl x509 -outform PEM >websocket_org.pem -``` - -This command will extract the second certificate in the chain and save it as a pem-file. - -Subprotocol -^^^^^^^^^^^ - -The subprotocol field in the config struct can be used to request a subprotocol - -.. code:: c - - const esp_websocket_client_config_t ws_cfg = { - .uri = "ws://websocket.org", - .subprotocol = "soap", - }; - -.. note:: The client is indifferent to the subprotocol field in the server response and will accept the connection no matter what the server replies. - -For more options on :cpp:type:`esp_websocket_client_config_t`, please refer to API reference below - -Events ------- -* `WEBSOCKET_EVENT_CONNECTED`: The client has successfully established a connection to the server. The client is now ready to send and receive data. Contains no event data. -* `WEBSOCKET_EVENT_DISCONNECTED`: The client has aborted the connection due to the transport layer failing to read data, e.g. because the server is unavailable. Contains no event data. -* `WEBSOCKET_EVENT_DATA`: The client has successfully received and parsed a WebSocket frame. The event data contains a pointer to the payload data, the length of the payload data as well as the opcode of the received frame. A message may be fragmented into multiple events if the length exceeds the buffer size. This event will also be posted for non-payload frames, e.g. pong or connection close frames. -* `WEBSOCKET_EVENT_ERROR`: Not used in the current implementation of the client. - -If the client handle is needed in the event handler it can be accessed through the pointer passed to the event handler: - -.. code:: c - - esp_websocket_client_handle_t client = (esp_websocket_client_handle_t)handler_args; - - -Limitations and Known Issues ----------------------------- -* The client is able to request the use of a subprotocol from the server during the handshake, but does not do any subprotocol related checks on the response from the server. - -Application Example -------------------- -A simple WebSocket example that uses esp_websocket_client to establish a websocket connection and send/receive data with the `websocket.org `_ server can be found here: :example:`example <../examples>`. - -Sending Text Data -^^^^^^^^^^^^^^^^^ -The WebSocket client supports sending data as a text data frame, which informs the application layer that the payload data is text data encoded as UTF-8. Example: - -.. code:: cpp - - esp_websocket_client_send_text(client, data, len, portMAX_DELAY); - - -API Reference -------------- - -.. include-build-file:: inc/esp_websocket_client.inc diff --git a/esp_websocket_client/_static/DejaVuSans.ttf b/esp_websocket_client/_static/DejaVuSans.ttf deleted file mode 100644 index 19ed0b468..000000000 Binary files a/esp_websocket_client/_static/DejaVuSans.ttf and /dev/null differ diff --git a/esp_websocket_client/_static/NotoSansSC-Regular.otf b/esp_websocket_client/_static/NotoSansSC-Regular.otf deleted file mode 100644 index 7cd0b77ae..000000000 Binary files a/esp_websocket_client/_static/NotoSansSC-Regular.otf and /dev/null differ diff --git a/esp_websocket_client/_static/basic.css b/esp_websocket_client/_static/basic.css deleted file mode 100644 index bf18350b6..000000000 --- a/esp_websocket_client/_static/basic.css +++ /dev/null @@ -1,906 +0,0 @@ -/* - * basic.css - * ~~~~~~~~~ - * - * Sphinx stylesheet -- basic theme. - * - * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -/* -- main layout ----------------------------------------------------------- */ - -div.clearer { - clear: both; -} - -div.section::after { - display: block; - content: ''; - clear: left; -} - -/* -- relbar ---------------------------------------------------------------- */ - -div.related { - width: 100%; - font-size: 90%; -} - -div.related h3 { - display: none; -} - -div.related ul { - margin: 0; - padding: 0 0 0 10px; - list-style: none; -} - -div.related li { - display: inline; -} - -div.related li.right { - float: right; - margin-right: 5px; -} - -/* -- sidebar --------------------------------------------------------------- */ - -div.sphinxsidebarwrapper { - padding: 10px 5px 0 10px; -} - -div.sphinxsidebar { - float: left; - width: 230px; - margin-left: -100%; - font-size: 90%; - word-wrap: break-word; - overflow-wrap : break-word; -} - -div.sphinxsidebar ul { - list-style: none; -} - -div.sphinxsidebar ul ul, -div.sphinxsidebar ul.want-points { - margin-left: 20px; - list-style: square; -} - -div.sphinxsidebar ul ul { - margin-top: 0; - margin-bottom: 0; -} - -div.sphinxsidebar form { - margin-top: 10px; -} - -div.sphinxsidebar input { - border: 1px solid #98dbcc; - font-family: sans-serif; - font-size: 1em; -} - -div.sphinxsidebar #searchbox form.search { - overflow: hidden; -} - -div.sphinxsidebar #searchbox input[type="text"] { - float: left; - width: 80%; - padding: 0.25em; - box-sizing: border-box; -} - -div.sphinxsidebar #searchbox input[type="submit"] { - float: left; - width: 20%; - border-left: none; - padding: 0.25em; - box-sizing: border-box; -} - - -img { - border: 0; - max-width: 100%; -} - -/* -- search page ----------------------------------------------------------- */ - -ul.search { - margin: 10px 0 0 20px; - padding: 0; -} - -ul.search li { - padding: 5px 0 5px 20px; - background-image: url(file.png); - background-repeat: no-repeat; - background-position: 0 7px; -} - -ul.search li a { - font-weight: bold; -} - -ul.search li p.context { - color: #888; - margin: 2px 0 0 30px; - text-align: left; -} - -ul.keywordmatches li.goodmatch a { - font-weight: bold; -} - -/* -- index page ------------------------------------------------------------ */ - -table.contentstable { - width: 90%; - margin-left: auto; - margin-right: auto; -} - -table.contentstable p.biglink { - line-height: 150%; -} - -a.biglink { - font-size: 1.3em; -} - -span.linkdescr { - font-style: italic; - padding-top: 5px; - font-size: 90%; -} - -/* -- general index --------------------------------------------------------- */ - -table.indextable { - width: 100%; -} - -table.indextable td { - text-align: left; - vertical-align: top; -} - -table.indextable ul { - margin-top: 0; - margin-bottom: 0; - list-style-type: none; -} - -table.indextable > tbody > tr > td > ul { - padding-left: 0em; -} - -table.indextable tr.pcap { - height: 10px; -} - -table.indextable tr.cap { - margin-top: 10px; - background-color: #f2f2f2; -} - -img.toggler { - margin-right: 3px; - margin-top: 3px; - cursor: pointer; -} - -div.modindex-jumpbox { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - margin: 1em 0 1em 0; - padding: 0.4em; -} - -div.genindex-jumpbox { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - margin: 1em 0 1em 0; - padding: 0.4em; -} - -/* -- domain module index --------------------------------------------------- */ - -table.modindextable td { - padding: 2px; - border-collapse: collapse; -} - -/* -- general body styles --------------------------------------------------- */ - -div.body { - min-width: 450px; - max-width: 800px; -} - -div.body p, div.body dd, div.body li, div.body blockquote { - -moz-hyphens: auto; - -ms-hyphens: auto; - -webkit-hyphens: auto; - hyphens: auto; -} - -a.headerlink { - visibility: hidden; -} - -a.brackets:before, -span.brackets > a:before{ - content: "["; -} - -a.brackets:after, -span.brackets > a:after { - content: "]"; -} - -h1:hover > a.headerlink, -h2:hover > a.headerlink, -h3:hover > a.headerlink, -h4:hover > a.headerlink, -h5:hover > a.headerlink, -h6:hover > a.headerlink, -dt:hover > a.headerlink, -caption:hover > a.headerlink, -p.caption:hover > a.headerlink, -div.code-block-caption:hover > a.headerlink { - visibility: visible; -} - -div.body p.caption { - text-align: inherit; -} - -div.body td { - text-align: left; -} - -.first { - margin-top: 0 !important; -} - -p.rubric { - margin-top: 30px; - font-weight: bold; -} - -img.align-left, figure.align-left, .figure.align-left, object.align-left { - clear: left; - float: left; - margin-right: 1em; -} - -img.align-right, figure.align-right, .figure.align-right, object.align-right { - clear: right; - float: right; - margin-left: 1em; -} - -img.align-center, figure.align-center, .figure.align-center, object.align-center { - display: block; - margin-left: auto; - margin-right: auto; -} - -img.align-default, figure.align-default, .figure.align-default { - display: block; - margin-left: auto; - margin-right: auto; -} - -.align-left { - text-align: left; -} - -.align-center { - text-align: center; -} - -.align-default { - text-align: center; -} - -.align-right { - text-align: right; -} - -/* -- sidebars -------------------------------------------------------------- */ - -div.sidebar, -aside.sidebar { - margin: 0 0 0.5em 1em; - border: 1px solid #ddb; - padding: 7px; - background-color: #ffe; - width: 40%; - float: right; - clear: right; - overflow-x: auto; -} - -p.sidebar-title { - font-weight: bold; -} - -div.admonition, div.topic, blockquote { - clear: left; -} - -/* -- topics ---------------------------------------------------------------- */ - -div.topic { - border: 1px solid #ccc; - padding: 7px; - margin: 10px 0 10px 0; -} - -p.topic-title { - font-size: 1.1em; - font-weight: bold; - margin-top: 10px; -} - -/* -- admonitions ----------------------------------------------------------- */ - -div.admonition { - margin-top: 10px; - margin-bottom: 10px; - padding: 7px; -} - -div.admonition dt { - font-weight: bold; -} - -p.admonition-title { - margin: 0px 10px 5px 0px; - font-weight: bold; -} - -div.body p.centered { - text-align: center; - margin-top: 25px; -} - -/* -- content of sidebars/topics/admonitions -------------------------------- */ - -div.sidebar > :last-child, -aside.sidebar > :last-child, -div.topic > :last-child, -div.admonition > :last-child { - margin-bottom: 0; -} - -div.sidebar::after, -aside.sidebar::after, -div.topic::after, -div.admonition::after, -blockquote::after { - display: block; - content: ''; - clear: both; -} - -/* -- tables ---------------------------------------------------------------- */ - -table.docutils { - margin-top: 10px; - margin-bottom: 10px; - border: 0; - border-collapse: collapse; -} - -table.align-center { - margin-left: auto; - margin-right: auto; -} - -table.align-default { - margin-left: auto; - margin-right: auto; -} - -table caption span.caption-number { - font-style: italic; -} - -table caption span.caption-text { -} - -table.docutils td, table.docutils th { - padding: 1px 8px 1px 5px; - border-top: 0; - border-left: 0; - border-right: 0; - border-bottom: 1px solid #aaa; -} - -table.footnote td, table.footnote th { - border: 0 !important; -} - -th { - text-align: left; - padding-right: 5px; -} - -table.citation { - border-left: solid 1px gray; - margin-left: 1px; -} - -table.citation td { - border-bottom: none; -} - -th > :first-child, -td > :first-child { - margin-top: 0px; -} - -th > :last-child, -td > :last-child { - margin-bottom: 0px; -} - -/* -- figures --------------------------------------------------------------- */ - -div.figure, figure { - margin: 0.5em; - padding: 0.5em; -} - -div.figure p.caption, figcaption { - padding: 0.3em; -} - -div.figure p.caption span.caption-number, -figcaption span.caption-number { - font-style: italic; -} - -div.figure p.caption span.caption-text, -figcaption span.caption-text { -} - -/* -- field list styles ----------------------------------------------------- */ - -table.field-list td, table.field-list th { - border: 0 !important; -} - -.field-list ul { - margin: 0; - padding-left: 1em; -} - -.field-list p { - margin: 0; -} - -.field-name { - -moz-hyphens: manual; - -ms-hyphens: manual; - -webkit-hyphens: manual; - hyphens: manual; -} - -/* -- hlist styles ---------------------------------------------------------- */ - -table.hlist { - margin: 1em 0; -} - -table.hlist td { - vertical-align: top; -} - -/* -- object description styles --------------------------------------------- */ - -.sig { - font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; -} - -.sig-name, code.descname { - background-color: transparent; - font-weight: bold; -} - -.sig-name { - font-size: 1.1em; -} - -code.descname { - font-size: 1.2em; -} - -.sig-prename, code.descclassname { - background-color: transparent; -} - -.optional { - font-size: 1.3em; -} - -.sig-paren { - font-size: larger; -} - -.sig-param.n { - font-style: italic; -} - -/* C++ specific styling */ - -.sig-inline.c-texpr, -.sig-inline.cpp-texpr { - font-family: unset; -} - -.sig.c .k, .sig.c .kt, -.sig.cpp .k, .sig.cpp .kt { - color: #0033B3; -} - -.sig.c .m, -.sig.cpp .m { - color: #1750EB; -} - -.sig.c .s, .sig.c .sc, -.sig.cpp .s, .sig.cpp .sc { - color: #067D17; -} - - -/* -- other body styles ----------------------------------------------------- */ - -ol.arabic { - list-style: decimal; -} - -ol.loweralpha { - list-style: lower-alpha; -} - -ol.upperalpha { - list-style: upper-alpha; -} - -ol.lowerroman { - list-style: lower-roman; -} - -ol.upperroman { - list-style: upper-roman; -} - -:not(li) > ol > li:first-child > :first-child, -:not(li) > ul > li:first-child > :first-child { - margin-top: 0px; -} - -:not(li) > ol > li:last-child > :last-child, -:not(li) > ul > li:last-child > :last-child { - margin-bottom: 0px; -} - -ol.simple ol p, -ol.simple ul p, -ul.simple ol p, -ul.simple ul p { - margin-top: 0; -} - -ol.simple > li:not(:first-child) > p, -ul.simple > li:not(:first-child) > p { - margin-top: 0; -} - -ol.simple p, -ul.simple p { - margin-bottom: 0; -} - -dl.footnote > dt, -dl.citation > dt { - float: left; - margin-right: 0.5em; -} - -dl.footnote > dd, -dl.citation > dd { - margin-bottom: 0em; -} - -dl.footnote > dd:after, -dl.citation > dd:after { - content: ""; - clear: both; -} - -dl.field-list { - display: grid; - grid-template-columns: fit-content(30%) auto; -} - -dl.field-list > dt { - font-weight: bold; - word-break: break-word; - padding-left: 0.5em; - padding-right: 5px; -} - -dl.field-list > dt:after { - content: ":"; -} - -dl.field-list > dd { - padding-left: 0.5em; - margin-top: 0em; - margin-left: 0em; - margin-bottom: 0em; -} - -dl { - margin-bottom: 15px; -} - -dd > :first-child { - margin-top: 0px; -} - -dd ul, dd table { - margin-bottom: 10px; -} - -dd { - margin-top: 3px; - margin-bottom: 10px; - margin-left: 30px; -} - -dl > dd:last-child, -dl > dd:last-child > :last-child { - margin-bottom: 0; -} - -dt:target, span.highlighted { - background-color: #fbe54e; -} - -rect.highlighted { - fill: #fbe54e; -} - -dl.glossary dt { - font-weight: bold; - font-size: 1.1em; -} - -.versionmodified { - font-style: italic; -} - -.system-message { - background-color: #fda; - padding: 5px; - border: 3px solid red; -} - -.footnote:target { - background-color: #ffa; -} - -.line-block { - display: block; - margin-top: 1em; - margin-bottom: 1em; -} - -.line-block .line-block { - margin-top: 0; - margin-bottom: 0; - margin-left: 1.5em; -} - -.guilabel, .menuselection { - font-family: sans-serif; -} - -.accelerator { - text-decoration: underline; -} - -.classifier { - font-style: oblique; -} - -.classifier:before { - font-style: normal; - margin: 0 0.5em; - content: ":"; - display: inline-block; -} - -abbr, acronym { - border-bottom: dotted 1px; - cursor: help; -} - -/* -- code displays --------------------------------------------------------- */ - -pre { - overflow: auto; - overflow-y: hidden; /* fixes display issues on Chrome browsers */ -} - -pre, div[class*="highlight-"] { - clear: both; -} - -span.pre { - -moz-hyphens: none; - -ms-hyphens: none; - -webkit-hyphens: none; - hyphens: none; - white-space: nowrap; -} - -div[class*="highlight-"] { - margin: 1em 0; -} - -td.linenos pre { - border: 0; - background-color: transparent; - color: #aaa; -} - -table.highlighttable { - display: block; -} - -table.highlighttable tbody { - display: block; -} - -table.highlighttable tr { - display: flex; -} - -table.highlighttable td { - margin: 0; - padding: 0; -} - -table.highlighttable td.linenos { - padding-right: 0.5em; -} - -table.highlighttable td.code { - flex: 1; - overflow: hidden; -} - -.highlight .hll { - display: block; -} - -div.highlight pre, -table.highlighttable pre { - margin: 0; -} - -div.code-block-caption + div { - margin-top: 0; -} - -div.code-block-caption { - margin-top: 1em; - padding: 2px 5px; - font-size: small; -} - -div.code-block-caption code { - background-color: transparent; -} - -table.highlighttable td.linenos, -span.linenos, -div.highlight span.gp { /* gp: Generic.Prompt */ - user-select: none; - -webkit-user-select: text; /* Safari fallback only */ - -webkit-user-select: none; /* Chrome/Safari */ - -moz-user-select: none; /* Firefox */ - -ms-user-select: none; /* IE10+ */ -} - -div.code-block-caption span.caption-number { - padding: 0.1em 0.3em; - font-style: italic; -} - -div.code-block-caption span.caption-text { -} - -div.literal-block-wrapper { - margin: 1em 0; -} - -code.xref, a code { - background-color: transparent; - font-weight: bold; -} - -h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { - background-color: transparent; -} - -.viewcode-link { - float: right; -} - -.viewcode-back { - float: right; - font-family: sans-serif; -} - -div.viewcode-block:target { - margin: -1px -10px; - padding: 0 10px; -} - -/* -- math display ---------------------------------------------------------- */ - -img.math { - vertical-align: middle; -} - -div.body div.math p { - text-align: center; -} - -span.eqno { - float: right; -} - -span.eqno a.headerlink { - position: absolute; - z-index: 1; -} - -div.math:hover a.headerlink { - visibility: visible; -} - -/* -- printout stylesheet --------------------------------------------------- */ - -@media print { - div.document, - div.documentwrapper, - div.bodywrapper { - margin: 0 !important; - width: 100%; - } - - div.sphinxsidebar, - div.related, - div.footer, - #top-link { - display: none; - } -} \ No newline at end of file diff --git a/esp_websocket_client/_static/check-solid.svg b/esp_websocket_client/_static/check-solid.svg deleted file mode 100644 index 92fad4b5c..000000000 --- a/esp_websocket_client/_static/check-solid.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/esp_websocket_client/_static/clipboard.min.js b/esp_websocket_client/_static/clipboard.min.js deleted file mode 100644 index 54b3c4638..000000000 --- a/esp_websocket_client/_static/clipboard.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * clipboard.js v2.0.8 - * https://clipboardjs.com/ - * - * Licensed MIT © Zeno Rocha - */ -!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 - - - - diff --git a/esp_websocket_client/_static/copybutton.css b/esp_websocket_client/_static/copybutton.css deleted file mode 100644 index 40eafe5fc..000000000 --- a/esp_websocket_client/_static/copybutton.css +++ /dev/null @@ -1,93 +0,0 @@ -/* Copy buttons */ -button.copybtn { - position: absolute; - display: flex; - top: .3em; - right: .3em; - width: 1.7em; - height: 1.7em; - opacity: 0; - transition: opacity 0.3s, border .3s, background-color .3s; - user-select: none; - padding: 0; - border: none; - outline: none; - border-radius: 0.4em; - /* The colors that GitHub uses */ - border: #1b1f2426 1px solid; - background-color: #f6f8fa; - color: #57606a; -} - -button.copybtn.success { - border-color: #22863a; - color: #22863a; -} - -button.copybtn svg { - stroke: currentColor; - width: 1.5em; - height: 1.5em; - padding: 0.1em; -} - -div.highlight { - position: relative; -} - -.highlight:hover button.copybtn { - opacity: 1; -} - -.highlight button.copybtn:hover { - background-color: rgb(235, 235, 235); -} - -.highlight button.copybtn:active { - background-color: rgb(187, 187, 187); -} - -/** - * A minimal CSS-only tooltip copied from: - * https://codepen.io/mildrenben/pen/rVBrpK - * - * To use, write HTML like the following: - * - *

Short

- */ - .o-tooltip--left { - position: relative; - } - - .o-tooltip--left:after { - opacity: 0; - visibility: hidden; - position: absolute; - content: attr(data-tooltip); - padding: .2em; - font-size: .8em; - left: -.2em; - background: grey; - color: white; - white-space: nowrap; - z-index: 2; - border-radius: 2px; - transform: translateX(-102%) translateY(0); - transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); -} - -.o-tooltip--left:hover:after { - display: block; - opacity: 1; - visibility: visible; - transform: translateX(-100%) translateY(0); - transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); - transition-delay: .5s; -} - -/* By default the copy button shouldn't show up when printing a page */ -@media print { - button.copybtn { - display: none; - } -} diff --git a/esp_websocket_client/_static/copybutton.js b/esp_websocket_client/_static/copybutton.js deleted file mode 100644 index 40ac33108..000000000 --- a/esp_websocket_client/_static/copybutton.js +++ /dev/null @@ -1,220 +0,0 @@ -// Localization support -const messages = { - 'en': { - 'copy': 'Copy', - 'copy_to_clipboard': 'Copy to clipboard', - 'copy_success': 'Copied!', - 'copy_failure': 'Failed to copy', - }, - 'es' : { - 'copy': 'Copiar', - 'copy_to_clipboard': 'Copiar al portapapeles', - 'copy_success': '¡Copiado!', - 'copy_failure': 'Error al copiar', - }, - 'de' : { - 'copy': 'Kopieren', - 'copy_to_clipboard': 'In die Zwischenablage kopieren', - 'copy_success': 'Kopiert!', - 'copy_failure': 'Fehler beim Kopieren', - }, - 'fr' : { - 'copy': 'Copier', - 'copy_to_clipboard': 'Copié dans le presse-papier', - 'copy_success': 'Copié !', - 'copy_failure': 'Échec de la copie', - }, - 'ru': { - 'copy': 'Скопировать', - 'copy_to_clipboard': 'Скопировать в буфер', - 'copy_success': 'Скопировано!', - 'copy_failure': 'Не удалось скопировать', - }, - 'zh-CN': { - 'copy': '复制', - 'copy_to_clipboard': '复制到剪贴板', - 'copy_success': '复制成功!', - 'copy_failure': '复制失败', - }, - 'it' : { - 'copy': 'Copiare', - 'copy_to_clipboard': 'Copiato negli appunti', - 'copy_success': 'Copiato!', - 'copy_failure': 'Errore durante la copia', - } -} - -let locale = 'en' -if( document.documentElement.lang !== undefined - && messages[document.documentElement.lang] !== undefined ) { - locale = document.documentElement.lang -} - -let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; -if (doc_url_root == '#') { - doc_url_root = ''; -} - -/** - * SVG files for our copy buttons - */ -let iconCheck = ` - ${messages[locale]['copy_success']} - - -` - -// If the user specified their own SVG use that, otherwise use the default -let iconCopy = ``; -if (!iconCopy) { - iconCopy = ` - ${messages[locale]['copy_to_clipboard']} - - - -` -} - -/** - * Set up copy/paste for code blocks - */ - -const runWhenDOMLoaded = cb => { - if (document.readyState != 'loading') { - cb() - } else if (document.addEventListener) { - document.addEventListener('DOMContentLoaded', cb) - } else { - document.attachEvent('onreadystatechange', function() { - if (document.readyState == 'complete') cb() - }) - } -} - -const codeCellId = index => `codecell${index}` - -// Clears selected text since ClipboardJS will select the text when copying -const clearSelection = () => { - if (window.getSelection) { - window.getSelection().removeAllRanges() - } else if (document.selection) { - document.selection.empty() - } -} - -// Changes tooltip text for two seconds, then changes it back -const temporarilyChangeTooltip = (el, oldText, newText) => { - el.setAttribute('data-tooltip', newText) - el.classList.add('success') - setTimeout(() => el.setAttribute('data-tooltip', oldText), 2000) - setTimeout(() => el.classList.remove('success'), 2000) -} - -// Changes the copy button icon for two seconds, then changes it back -const temporarilyChangeIcon = (el) => { - el.innerHTML = iconCheck; - setTimeout(() => {el.innerHTML = iconCopy}, 2000) -} - -const addCopyButtonToCodeCells = () => { - // If ClipboardJS hasn't loaded, wait a bit and try again. This - // happens because we load ClipboardJS asynchronously. - if (window.ClipboardJS === undefined) { - setTimeout(addCopyButtonToCodeCells, 250) - return - } - - // Add copybuttons to all of our code cells - const codeCells = document.querySelectorAll('div.highlight pre') - codeCells.forEach((codeCell, index) => { - const id = codeCellId(index) - codeCell.setAttribute('id', id) - - const clipboardButton = id => - `` - codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) - }) - -function escapeRegExp(string) { - return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string -} - -// Callback when a copy button is clicked. Will be passed the node that was clicked -// should then grab the text and replace pieces of text that shouldn't be used in output -function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { - - var regexp; - var match; - - // Do we check for line continuation characters and "HERE-documents"? - var useLineCont = !!lineContinuationChar - var useHereDoc = !!hereDocDelim - - // create regexp to capture prompt and remaining line - if (isRegexp) { - regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') - } else { - regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') - } - - const outputLines = []; - var promptFound = false; - var gotLineCont = false; - var gotHereDoc = false; - const lineGotPrompt = []; - for (const line of textContent.split('\n')) { - match = line.match(regexp) - if (match || gotLineCont || gotHereDoc) { - promptFound = regexp.test(line) - lineGotPrompt.push(promptFound) - if (removePrompts && promptFound) { - outputLines.push(match[2]) - } else { - outputLines.push(line) - } - gotLineCont = line.endsWith(lineContinuationChar) & useLineCont - if (line.includes(hereDocDelim) & useHereDoc) - gotHereDoc = !gotHereDoc - } else if (!onlyCopyPromptLines) { - outputLines.push(line) - } else if (copyEmptyLines && line.trim() === '') { - outputLines.push(line) - } - } - - // If no lines with the prompt were found then just use original lines - if (lineGotPrompt.some(v => v === true)) { - textContent = outputLines.join('\n'); - } - - // Remove a trailing newline to avoid auto-running when pasting - if (textContent.endsWith("\n")) { - textContent = textContent.slice(0, -1) - } - return textContent -} - - -var copyTargetText = (trigger) => { - var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); - return formatCopyText(target.innerText, '', false, true, true, true, '', '') -} - - // Initialize with a callback so we can modify the text before copy - const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) - - // Update UI with error/success messages - clipboard.on('success', event => { - clearSelection() - temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) - temporarilyChangeIcon(event.trigger) - }) - - clipboard.on('error', event => { - temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) - }) -} - -runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/esp_websocket_client/_static/copybutton_funcs.js b/esp_websocket_client/_static/copybutton_funcs.js deleted file mode 100644 index b9168c556..000000000 --- a/esp_websocket_client/_static/copybutton_funcs.js +++ /dev/null @@ -1,58 +0,0 @@ -function escapeRegExp(string) { - return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string -} - -// Callback when a copy button is clicked. Will be passed the node that was clicked -// should then grab the text and replace pieces of text that shouldn't be used in output -export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { - - var regexp; - var match; - - // Do we check for line continuation characters and "HERE-documents"? - var useLineCont = !!lineContinuationChar - var useHereDoc = !!hereDocDelim - - // create regexp to capture prompt and remaining line - if (isRegexp) { - regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') - } else { - regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') - } - - const outputLines = []; - var promptFound = false; - var gotLineCont = false; - var gotHereDoc = false; - const lineGotPrompt = []; - for (const line of textContent.split('\n')) { - match = line.match(regexp) - if (match || gotLineCont || gotHereDoc) { - promptFound = regexp.test(line) - lineGotPrompt.push(promptFound) - if (removePrompts && promptFound) { - outputLines.push(match[2]) - } else { - outputLines.push(line) - } - gotLineCont = line.endsWith(lineContinuationChar) & useLineCont - if (line.includes(hereDocDelim) & useHereDoc) - gotHereDoc = !gotHereDoc - } else if (!onlyCopyPromptLines) { - outputLines.push(line) - } else if (copyEmptyLines && line.trim() === '') { - outputLines.push(line) - } - } - - // If no lines with the prompt were found then just use original lines - if (lineGotPrompt.some(v => v === true)) { - textContent = outputLines.join('\n'); - } - - // Remove a trailing newline to avoid auto-running when pasting - if (textContent.endsWith("\n")) { - textContent = textContent.slice(0, -1) - } - return textContent -} diff --git a/esp_websocket_client/_static/css/badge_only.css b/esp_websocket_client/_static/css/badge_only.css deleted file mode 100644 index e380325bc..000000000 --- a/esp_websocket_client/_static/css/badge_only.css +++ /dev/null @@ -1 +0,0 @@ -.fa:before{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} \ No newline at end of file diff --git a/esp_websocket_client/_static/css/fonts/Roboto-Slab-Bold.woff b/esp_websocket_client/_static/css/fonts/Roboto-Slab-Bold.woff deleted file mode 100644 index 6cb600001..000000000 Binary files a/esp_websocket_client/_static/css/fonts/Roboto-Slab-Bold.woff and /dev/null differ diff --git a/esp_websocket_client/_static/css/fonts/Roboto-Slab-Bold.woff2 b/esp_websocket_client/_static/css/fonts/Roboto-Slab-Bold.woff2 deleted file mode 100644 index 7059e2314..000000000 Binary files a/esp_websocket_client/_static/css/fonts/Roboto-Slab-Bold.woff2 and /dev/null differ diff --git a/esp_websocket_client/_static/css/fonts/Roboto-Slab-Regular.woff b/esp_websocket_client/_static/css/fonts/Roboto-Slab-Regular.woff deleted file mode 100644 index f815f63f9..000000000 Binary files a/esp_websocket_client/_static/css/fonts/Roboto-Slab-Regular.woff and /dev/null differ diff --git a/esp_websocket_client/_static/css/fonts/Roboto-Slab-Regular.woff2 b/esp_websocket_client/_static/css/fonts/Roboto-Slab-Regular.woff2 deleted file mode 100644 index f2c76e5bd..000000000 Binary files a/esp_websocket_client/_static/css/fonts/Roboto-Slab-Regular.woff2 and /dev/null differ diff --git a/esp_websocket_client/_static/css/fonts/fontawesome-webfont.eot b/esp_websocket_client/_static/css/fonts/fontawesome-webfont.eot deleted file mode 100644 index e9f60ca95..000000000 Binary files a/esp_websocket_client/_static/css/fonts/fontawesome-webfont.eot and /dev/null differ diff --git a/esp_websocket_client/_static/css/fonts/fontawesome-webfont.svg b/esp_websocket_client/_static/css/fonts/fontawesome-webfont.svg deleted file mode 100644 index 855c845e5..000000000 --- a/esp_websocket_client/_static/css/fonts/fontawesome-webfont.svg +++ /dev/null @@ -1,2671 +0,0 @@ - - - - -Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 - By ,,, -Copyright Dave Gandy 2016. All rights reserved. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/esp_websocket_client/_static/css/fonts/fontawesome-webfont.ttf b/esp_websocket_client/_static/css/fonts/fontawesome-webfont.ttf deleted file mode 100644 index 35acda2fa..000000000 Binary files a/esp_websocket_client/_static/css/fonts/fontawesome-webfont.ttf and /dev/null differ diff --git a/esp_websocket_client/_static/css/fonts/fontawesome-webfont.woff b/esp_websocket_client/_static/css/fonts/fontawesome-webfont.woff deleted file mode 100644 index 400014a4b..000000000 Binary files a/esp_websocket_client/_static/css/fonts/fontawesome-webfont.woff and /dev/null differ diff --git a/esp_websocket_client/_static/css/fonts/fontawesome-webfont.woff2 b/esp_websocket_client/_static/css/fonts/fontawesome-webfont.woff2 deleted file mode 100644 index 4d13fc604..000000000 Binary files a/esp_websocket_client/_static/css/fonts/fontawesome-webfont.woff2 and /dev/null differ diff --git a/esp_websocket_client/_static/css/fonts/lato-bold-italic.woff b/esp_websocket_client/_static/css/fonts/lato-bold-italic.woff deleted file mode 100644 index 88ad05b9f..000000000 Binary files a/esp_websocket_client/_static/css/fonts/lato-bold-italic.woff and /dev/null differ diff --git a/esp_websocket_client/_static/css/fonts/lato-bold-italic.woff2 b/esp_websocket_client/_static/css/fonts/lato-bold-italic.woff2 deleted file mode 100644 index c4e3d804b..000000000 Binary files a/esp_websocket_client/_static/css/fonts/lato-bold-italic.woff2 and /dev/null differ diff --git a/esp_websocket_client/_static/css/fonts/lato-bold.woff b/esp_websocket_client/_static/css/fonts/lato-bold.woff deleted file mode 100644 index c6dff51f0..000000000 Binary files a/esp_websocket_client/_static/css/fonts/lato-bold.woff and /dev/null differ diff --git a/esp_websocket_client/_static/css/fonts/lato-bold.woff2 b/esp_websocket_client/_static/css/fonts/lato-bold.woff2 deleted file mode 100644 index bb195043c..000000000 Binary files a/esp_websocket_client/_static/css/fonts/lato-bold.woff2 and /dev/null differ diff --git a/esp_websocket_client/_static/css/fonts/lato-normal-italic.woff b/esp_websocket_client/_static/css/fonts/lato-normal-italic.woff deleted file mode 100644 index 76114bc03..000000000 Binary files a/esp_websocket_client/_static/css/fonts/lato-normal-italic.woff and /dev/null differ diff --git a/esp_websocket_client/_static/css/fonts/lato-normal-italic.woff2 b/esp_websocket_client/_static/css/fonts/lato-normal-italic.woff2 deleted file mode 100644 index 3404f37e2..000000000 Binary files a/esp_websocket_client/_static/css/fonts/lato-normal-italic.woff2 and /dev/null differ diff --git a/esp_websocket_client/_static/css/fonts/lato-normal.woff b/esp_websocket_client/_static/css/fonts/lato-normal.woff deleted file mode 100644 index ae1307ff5..000000000 Binary files a/esp_websocket_client/_static/css/fonts/lato-normal.woff and /dev/null differ diff --git a/esp_websocket_client/_static/css/fonts/lato-normal.woff2 b/esp_websocket_client/_static/css/fonts/lato-normal.woff2 deleted file mode 100644 index 3bf984332..000000000 Binary files a/esp_websocket_client/_static/css/fonts/lato-normal.woff2 and /dev/null differ diff --git a/esp_websocket_client/_static/css/theme.css b/esp_websocket_client/_static/css/theme.css deleted file mode 100644 index ba75bdc2e..000000000 --- a/esp_websocket_client/_static/css/theme.css +++ /dev/null @@ -1,4 +0,0 @@ -html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,.wy-nav-top a,.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! - * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome - * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs li{display:inline-block}.wy-breadcrumbs li.wy-breadcrumbs-aside{float:right}.wy-breadcrumbs li a{display:inline-block;padding:5px}.wy-breadcrumbs li a:first-child{padding-left:0}.rst-content .wy-breadcrumbs li tt,.wy-breadcrumbs li .rst-content tt,.wy-breadcrumbs li code{padding:5px;border:none;background:none}.rst-content .wy-breadcrumbs li tt.literal,.wy-breadcrumbs li .rst-content tt.literal,.wy-breadcrumbs li code.literal{color:#404040}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.selectors{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;font-size:110%;line-height:1.6em;color:hsla(0,0%,100%,.3)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}footer .footer li{display:inline-block}footer .footer li.footer-aside{float:right;display:inline-block}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.field-list>dt:after,html.writer-html5 .rst-content dl.footnote>dt:after{content:":"}html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.footnote>dt>span.brackets{margin-right:.5rem}html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{font-style:italic}html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.footnote>dd p,html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{font-size:inherit;line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.field-list)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dl:not(.field-list)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.field-list)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dl:not(.field-list)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel{border:1px solid #7fbbe3;background:#e7f2fa;font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/esp_websocket_client/_static/doctools.js b/esp_websocket_client/_static/doctools.js deleted file mode 100644 index e1bfd708b..000000000 --- a/esp_websocket_client/_static/doctools.js +++ /dev/null @@ -1,358 +0,0 @@ -/* - * doctools.js - * ~~~~~~~~~~~ - * - * Sphinx JavaScript utilities for all documentation. - * - * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -/** - * select a different prefix for underscore - */ -$u = _.noConflict(); - -/** - * make the code below compatible with browsers without - * an installed firebug like debugger -if (!window.console || !console.firebug) { - var names = ["log", "debug", "info", "warn", "error", "assert", "dir", - "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", - "profile", "profileEnd"]; - window.console = {}; - for (var i = 0; i < names.length; ++i) - window.console[names[i]] = function() {}; -} - */ - -/** - * small helper function to urldecode strings - * - * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL - */ -jQuery.urldecode = function(x) { - if (!x) { - return x - } - return decodeURIComponent(x.replace(/\+/g, ' ')); -}; - -/** - * small helper function to urlencode strings - */ -jQuery.urlencode = encodeURIComponent; - -/** - * This function returns the parsed url parameters of the - * current request. Multiple values per key are supported, - * it will always return arrays of strings for the value parts. - */ -jQuery.getQueryParameters = function(s) { - if (typeof s === 'undefined') - s = document.location.search; - var parts = s.substr(s.indexOf('?') + 1).split('&'); - var result = {}; - for (var i = 0; i < parts.length; i++) { - var tmp = parts[i].split('=', 2); - var key = jQuery.urldecode(tmp[0]); - var value = jQuery.urldecode(tmp[1]); - if (key in result) - result[key].push(value); - else - result[key] = [value]; - } - return result; -}; - -/** - * highlight a given string on a jquery object by wrapping it in - * span elements with the given class name. - */ -jQuery.fn.highlightText = function(text, className) { - function highlight(node, addItems) { - if (node.nodeType === 3) { - var val = node.nodeValue; - var pos = val.toLowerCase().indexOf(text); - if (pos >= 0 && - !jQuery(node.parentNode).hasClass(className) && - !jQuery(node.parentNode).hasClass("nohighlight")) { - var span; - var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); - if (isInSVG) { - span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); - } else { - span = document.createElement("span"); - span.className = className; - } - span.appendChild(document.createTextNode(val.substr(pos, text.length))); - node.parentNode.insertBefore(span, node.parentNode.insertBefore( - document.createTextNode(val.substr(pos + text.length)), - node.nextSibling)); - node.nodeValue = val.substr(0, pos); - if (isInSVG) { - var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); - var bbox = node.parentElement.getBBox(); - rect.x.baseVal.value = bbox.x; - rect.y.baseVal.value = bbox.y; - rect.width.baseVal.value = bbox.width; - rect.height.baseVal.value = bbox.height; - rect.setAttribute('class', className); - addItems.push({ - "parent": node.parentNode, - "target": rect}); - } - } - } - else if (!jQuery(node).is("button, select, textarea")) { - jQuery.each(node.childNodes, function() { - highlight(this, addItems); - }); - } - } - var addItems = []; - var result = this.each(function() { - highlight(this, addItems); - }); - for (var i = 0; i < addItems.length; ++i) { - jQuery(addItems[i].parent).before(addItems[i].target); - } - return result; -}; - -/* - * backward compatibility for jQuery.browser - * This will be supported until firefox bug is fixed. - */ -if (!jQuery.browser) { - jQuery.uaMatch = function(ua) { - ua = ua.toLowerCase(); - - var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || - /(webkit)[ \/]([\w.]+)/.exec(ua) || - /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || - /(msie) ([\w.]+)/.exec(ua) || - ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || - []; - - return { - browser: match[ 1 ] || "", - version: match[ 2 ] || "0" - }; - }; - jQuery.browser = {}; - jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; -} - -/** - * Small JavaScript module for the documentation. - */ -var Documentation = { - - init : function() { - this.fixFirefoxAnchorBug(); - this.highlightSearchWords(); - this.initIndexTable(); - this.initOnKeyListeners(); - }, - - /** - * i18n support - */ - TRANSLATIONS : {}, - PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; }, - LOCALE : 'unknown', - - // gettext and ngettext don't access this so that the functions - // can safely bound to a different name (_ = Documentation.gettext) - gettext : function(string) { - var translated = Documentation.TRANSLATIONS[string]; - if (typeof translated === 'undefined') - return string; - return (typeof translated === 'string') ? translated : translated[0]; - }, - - ngettext : function(singular, plural, n) { - var translated = Documentation.TRANSLATIONS[singular]; - if (typeof translated === 'undefined') - return (n == 1) ? singular : plural; - return translated[Documentation.PLURALEXPR(n)]; - }, - - addTranslations : function(catalog) { - for (var key in catalog.messages) - this.TRANSLATIONS[key] = catalog.messages[key]; - this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); - this.LOCALE = catalog.locale; - }, - - /** - * add context elements like header anchor links - */ - addContextElements : function() { - $('div[id] > :header:first').each(function() { - $('\u00B6'). - attr('href', '#' + this.id). - attr('title', _('Permalink to this headline')). - appendTo(this); - }); - $('dt[id]').each(function() { - $('\u00B6'). - attr('href', '#' + this.id). - attr('title', _('Permalink to this definition')). - appendTo(this); - }); - }, - - /** - * workaround a firefox stupidity - * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075 - */ - fixFirefoxAnchorBug : function() { - if (document.location.hash && $.browser.mozilla) - window.setTimeout(function() { - document.location.href += ''; - }, 10); - }, - - /** - * highlight the search words provided in the url in the text - */ - highlightSearchWords : function() { - var params = $.getQueryParameters(); - var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; - if (terms.length) { - var body = $('div.body'); - if (!body.length) { - body = $('body'); - } - window.setTimeout(function() { - $.each(terms, function() { - body.highlightText(this.toLowerCase(), 'highlighted'); - }); - }, 10); - $('') - .appendTo($('#searchbox')); - } - }, - - /** - * init the domain index toggle buttons - */ - initIndexTable : function() { - var togglers = $('img.toggler').click(function() { - var src = $(this).attr('src'); - var idnum = $(this).attr('id').substr(7); - $('tr.cg-' + idnum).toggle(); - if (src.substr(-9) === 'minus.png') - $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); - else - $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); - }).css('display', ''); - if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { - togglers.click(); - } - }, - - /** - * helper function to hide the search marks again - */ - hideSearchWords : function() { - $('#searchbox .highlight-link').fadeOut(300); - $('span.highlighted').removeClass('highlighted'); - var url = new URL(window.location); - url.searchParams.delete('highlight'); - window.history.replaceState({}, '', url); - }, - - /** - * helper function to focus on search bar - */ - focusSearchBar : function() { - $('input[name=q]').first().focus(); - }, - - /** - * make the url absolute - */ - makeURL : function(relativeURL) { - return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; - }, - - /** - * get the current relative url - */ - getCurrentURL : function() { - var path = document.location.pathname; - var parts = path.split(/\//); - $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { - if (this === '..') - parts.pop(); - }); - var url = parts.join('/'); - return path.substring(url.lastIndexOf('/') + 1, path.length - 1); - }, - - initOnKeyListeners: function() { - // only install a listener if it is really needed - if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && - !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) - return; - - $(document).keydown(function(event) { - var activeElementType = document.activeElement.tagName; - // don't navigate when in search box, textarea, dropdown or button - if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT' - && activeElementType !== 'BUTTON') { - if (event.altKey || event.ctrlKey || event.metaKey) - return; - - if (!event.shiftKey) { - switch (event.key) { - case 'ArrowLeft': - if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) - break; - var prevHref = $('link[rel="prev"]').prop('href'); - if (prevHref) { - window.location.href = prevHref; - return false; - } - break; - case 'ArrowRight': - if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) - break; - var nextHref = $('link[rel="next"]').prop('href'); - if (nextHref) { - window.location.href = nextHref; - return false; - } - break; - case 'Escape': - if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) - break; - Documentation.hideSearchWords(); - return false; - } - } - - // some keyboard layouts may need Shift to get / - switch (event.key) { - case '/': - if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) - break; - Documentation.focusSearchBar(); - return false; - } - } - }); - } -}; - -// quick alias for translations -_ = Documentation.gettext; - -$(document).ready(function() { - Documentation.init(); -}); diff --git a/esp_websocket_client/_static/documentation_options.js b/esp_websocket_client/_static/documentation_options.js deleted file mode 100644 index f8d32270a..000000000 --- a/esp_websocket_client/_static/documentation_options.js +++ /dev/null @@ -1,14 +0,0 @@ -var DOCUMENTATION_OPTIONS = { - URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), - VERSION: 'latest', - LANGUAGE: 'en', - COLLAPSE_INDEX: false, - BUILDER: 'html', - FILE_SUFFIX: '.html', - LINK_SUFFIX: '.html', - HAS_SOURCE: true, - SOURCELINK_SUFFIX: '.txt', - NAVIGATION_WITH_KEYS: false, - SHOW_SEARCH_SUMMARY: true, - ENABLE_SEARCH_SHORTCUTS: true, -}; \ No newline at end of file diff --git a/esp_websocket_client/_static/espressif-logo.svg b/esp_websocket_client/_static/espressif-logo.svg deleted file mode 100644 index 1725310bf..000000000 --- a/esp_websocket_client/_static/espressif-logo.svg +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/esp_websocket_client/_static/espressif2.pdf b/esp_websocket_client/_static/espressif2.pdf deleted file mode 100644 index 05d20ec86..000000000 --- a/esp_websocket_client/_static/espressif2.pdf +++ /dev/null @@ -1,785 +0,0 @@ -%PDF-1.5 % -1 0 obj <>/OCGs[5 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream - - - - - Adobe Illustrator CC 2015 (Macintosh) - 2018-07-17T18:09:55+08:00 - 2018-07-17T18:09:55+08:00 - 2018-07-17T18:09:55+08:00 - - - - 256 - 256 - JPEG - /9j/4AAQSkZJRgABAgEAkACQAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAAkAAAAAEA AQCQAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq8Q/Pz8+Na8h6zp+i+X4bOe8lgNzftdq8nBWbjCqiOSOhP BieVdqYCWUY28r/6G5/M/wD5ZNJ/6R5/+q+DiZcARFl/zl/+Yccym70vSriDfmiR3ETnbaj+s4G/ +SceJeBk+lf85lW7ShdW8sPHFTeW0uhI1a/77kjjHT/Lx4kcDP8Ay5/zkz+VGstHHNfy6RcSEgRa hEY1BHjLGZYVG37TjDbHhL0vTNW0vVbRLzTLyG+tHFUnt5FljPyZCRhQisVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVSfzR5w8s+VdOOo+YNQi0+1rRWkJLO1CeMca1d2oOign FWI6b/zkP+T9/snmGOB6043MM8Peg+J4wm/XrgtNFmek+Z/LWsAHSNWs9RqK/wCi3EU2w6/YZsKE zxV2KvMPzL/5x+8neetQl1e4mudP1uVFRryF/Ujb0wFXnDJVaBR+wV8cBCRKnz151/5xl/Mby6sl xYQpr9gm/qWIPrgVI+K3b46/6nLBTMSeSyxSwyNFKjRyoeLo4KsCOxB6ZFktxV2KphonmHXdCvFv dG1C40+6Ug+rbSNGTQ1o3EjkPY7YVp7d5F/5y18y6eY7XzdZrrFoKA3tuFgu1G9SyikUnbb4PmcP EwMX0f5L/MPyh5zsjdeXtRjuuABntj8FxFUkD1Imo61INDSh7HJMSGR4odirsVdirsVdirsVdirs VdirsVdirsVdiqC1rWdM0XSrrVdUuFtdPs0MtxO/RVHy3JJ2AG5O2Kvn3y7/AM5ZW9z5+uLfVrYW vk+6ZYbC44/v7fiaCaahPJZK/EB9nalaGotlwvoyGaGeGOeCRZYZVDxSoQysrCqsrDYgjocLFfir w/8ANz/nJfRvLLTaP5WEWra4pKTXJPK0tmHWpX+9cHbiDQdz2wEshG3yl5i8z+YPMmpPqWu38uoX snWWZq0H8qKKKi/5KgDIswEswJXRySRuHjYo6mqspIIPsRirM/Ln50fmf5e4Lp/mG6aBBRba6YXU QHgEnEnH/Y0w2jhD1ryp/wA5hahFwh81aIlwgADXmnMY326kwyllYn2dRh4mJg9r8m/nN+XPm4pF pWrxpev00+6/0e4rXoqvQOf9QtkrYkM2xQwvz/8AlB5E88pz1qx4agF4x6pakQ3SgEbF6MsgoKAS KwG9KYKSDT5g/Mn/AJxs86+Ullv9Mrr+ixjk9xbIVuIlABJltwXNBv8AEhYUFW44CGYk8iyLJ2Ku xVF6Tq+qaPqEOo6XdS2V9btyhuIWKOp+Y7HuO+FX05+Un/OUlrfmHRvPbJaXdFSHXFASCVun+kKA BE3+WPg8QuSBazF9EI6uodCGVgCrA1BB6EHCxbxV2KuxV2KuxV2KuxV2KuxV2KuxVpmVVLMQqqKs x2AA7nFXxj/zkF+c0nnTVzoujzH/AAvp0n7tl2F1MuxmbxQb+mPp+USWyIY9+Tv5Sap+YevGEM1r olnRtTvwK0B6RR12Mj9vAbnsCAFJp9yaPo+m6NpdrpWmQLbWFnGIreBOiovz3J8SeuTa3hf/ADlZ +YXmTQbPTPL2kT/VLfWIp3v7iOomZEKqIlb9lW5HlTc9NhWoJZRD5PyDY7FXYq7FXYq7FXAkGo64 q9K8if8AOQP5i+UjFAt7+ldLjoPqF+WlAUVFI5a+olK7UNPbDbExfS35d/8AOQ3kPziY7SSb9C6y 9ALC8ZQrse0M+yP8jxb/ACckCwIp6hhQ8o/NP/nHjyl50E+o2Cro3mN+Tm8hX9zPITX/AEmIbEk1 q60bep5dMBCRKnyP528heaPJertpmv2bW8pqbedfignQH7cMg2Ybj3HcA7ZEhsBtj2BLsVdir2j8 kf8AnIO/8nyQ6H5ieS88sMQkUm7y2dSByTqWiHdO37PgZAsTF9hWN9Z39nBe2U6XNpcostvcRMGR 0YVVlYbEEZJrVsVdirsVdirsVdirsVdirsVdirwL/nKP81n0bS18maRNw1LU4+eqTIfiitTsIxTo 03f/ACf9bASyiHzR5J8n6t5w8y2WgaWtbm7ejSt9iKMbySvT9lF3/Ab5EMyaffHknydo3k/y3aaD pMfG2tl+OQgc5ZT9uWQjqzH+nQZNqTzFXzF/zmbbxrc+UrgV9SRL+NvCkZtyP+ThyMmcHzZkWbsV dirsVdirsVdirsVdir138sP+cj/N/lForDVmfXNBWi/V5n/0iFdh+5mapooGyNt4cckCxMX1l5K8 ++VvOmlDUtAvVuYxQTwH4ZoWIrwljO6n8D2JyTWQjPM/lXy/5o0iXSNeskvrCUhvTeoKuKgPG60Z HFTRlNcVfHP5xfkJr3kOaXU7HnqXlVnAjvQKy24c0VLoKABueIkA4safZJC5AhsEreVYGTsVdir2 j/nHz87ZPJ9+nl7XJi3li9k/dyuSfqczn7YqdomP2x2+141kCxkH2Ojq6h0IZWAKsDUEHoQck1t4 q7FXYq7FXYq7FXYq7FUn84eaNP8AK3lnUfMGoH/RtPhMpQGhd+kcanxdyFHzxV+fPmTzBqXmLXb7 W9Tk9W+v5WmmbsK9FXwVVoqjsBkG0B9e/wDONv5Xr5T8prreoQ8de1xFlk5D4obU/FFFuKgt9t/e g/ZyQDCRt7DhYuxV5x+cP5M235lfoj19VfTP0T9Y48IRN6n1n0utXSnH0fxwEJBp5nP/AM4ZWxA9 DzY6HevqWIcHw6XCUwcLLjSK8/5w683oD9S13T5z2Eyzwj/hVmx4V42Iax/zjV+b2mq0i6Sl/EnV rOeKQ/QjFJD9C40niDz/AFny35h0Sb0dZ0y606WtAl1DJCT8uYWv0YE2l2BLsVdirsVdirsVTXyz 5p1/yxq0WraHeyWV7CdnQ/Cy1qUkU/C6HurCmFBD7D/Jz8/dE89RppepCPTPM6rva8qQ3PEbtblj WvcxncDxFTkgWsinqlxb29zby21zEk1vMjRzQyKHR0cUZWU1BBBoQcKHyT+ev/OPNx5ba48yeVIX n8vUaW9sgeUlmK7sv7Tw7+5Uddt8iQzjJ4TkWbsVdir6n/5xb/Ns31qvkTWZh9btELaHM7fFLCgq 1vv+1EBVP8io/ZyYLXIPonCxdirsVdirsVdirsVdir5g/wCcu/PbSXWneSrST93CBf6oAertVYIz /qrycj/KXwyJZxDzj8gPy+HnLz/bLdRepo+lUvdRqKqwQ/uoj/xkfqP5QcACZF9zZNrdirsVQN9r 2h2BIvtRtbQjqJ5o4zv0+0RiqBh89+SJpDFD5h0ySRTxZEvLdmB8CA/XFU5gngniWWCRZYmrxkQh lNDQ0I264qvxVSurS1u7d7e6hS4t5BSSGVQ6MAa7qwIOKvNPNn/OOH5W+YfUlj046PePU/WNOb0V 5HpWEhoaV8FHzwUkSLwzzv8A84qeeNFEt1oEsfmCxSrCKMejdhev90xKvT/Ick/y4KZiTxi8sryy uZLW9gktrmI8ZYJkaORT4MrAEZFko4q7FXYq7FV8M00EyTQSNFNGweORCVZWBqCrDcEYq+sPyH/5 yGTXzb+V/Nsyx62fgsNTaipdeEcnQLN4Ho/+t9qYLXKL31lVlKsAVIoQdwQcLF8jf85D/kUfLc83 mzy1AB5fncG+sYlP+hyP+0oHSFm/4EmnSlIkM4yeEZFm7FUZo+r6jo+qWuqabM1vfWUqzW8y9VdD UfMeI7jCr9Afy886WXnPyhp3mG1AT61HS5gBJ9K4T4ZY6kAni4NDTcUOTaiGR4odirsVdirsVdiq ld3dvZ2k13cuIra3jaWaQ1oqICzMaeAGKvzt85+ZLnzN5q1TX7n+81G4eYL/ACoTSNN67IgCj5ZA toD67/5xk8lDy9+XEOozJx1DzAwvZiRQiAVW3X5cKuP9bJBhI7vXMLF47+an/OSPlnyhNNpWjout 6/ESkqI1La3cbESyCvJlPVE+RKnASyEbfNPm386vzK80yudQ1qaC1atLGyY20AB/ZKxkFx/rljkb ZiIYOSSancnqcCXYqr2l/fWUnqWdzLbSfzwu0Z291I8cKsx0P87fzV0Z0Np5kvJUTYRXbi7Tj4Uu BJt8sbRwh6Z5Z/5zB8x23CLzHo1vqEY2a4tGa2l+ZVvVRj8uOHiYmD2byd/zkB+WXmgxww6mNNvn oBZ6iBbsSR0VyTExrtQPX2w2xIL0YEEVG4PQ4UMY87/lr5N862f1fX9PSeRRSG9T93cxdfsSr8VN 68TVfEYpBfLH5o/841+avKay6lopbXNCSrM8a/6VAoFayxL9pR/On0hciQzEnjuRZOxV2KuxVtWZ WDKSGBqCNiCMVfWX/OPH58HX0h8peaLiuuRrx0y/f/j6RRX05D/v5QNj+2P8r7UwWuUXvNzbW91b y21zEk9vOjRzQyKHR0ccWVlaoZWBoQcLF8Ufn3+Ts3kPXvr2mRO3lXUnJspN3FvKasbV2NTsATGW 3Ze5KscgQ2RNvKsDJ2Kvfv8AnErz0dP8y3nlG6kpaawpuLIE7LdwLVlAp/uyIb7/ALA8clFhIPrL JMHYq7FXYq7FXYq8w/5yQ8yNof5T6oI2KT6q0emxEGm09TKNvGFHGApjzfGnlLQJvMPmjStDh2fU bqK3LD9lXcBm/wBitTkQ2Ev0VtbW3tLWG1t0EdvbosUMY6KiAKqivgBk2p8/f85IfnjcaQZfJflm 4MepOlNY1CM/FAjiogiYHaRlNWb9kHb4vsgllEPlUkk1O5PU5BsdirsVdirsVdirsVdirPfIP52+ f/JTpFp98bvS1I5aXeVlgp4R1IeL/YEe4OEFBi+oPyz/AOchvJfnRorC4b9C69JRVsLlgY5XPaCa iq5/yWCt4A5IFrMaep4UPFfzg/5xv0TzUk+seWlj0rzFu7xAcba6buHUbRuf51G/7Q7gEMhKnyPr eh6toeqXGlatayWd/atwmt5RxYHsfcEbgjYjcZFstA4FdirsVXwTTQTRzwu0c0TB4pEJDKymqsCO hBxV9q/kF+ccfnrRDpuqOq+Z9MjX60Nl+sxCii4UeNdpANgfYgZMFqIp6H5q8saR5o8v3uhavEZb C+ThIFNHUg8kdCQaOjAMpp1wofAvn3yTq/kvzReaBqa1ktzyguACEngbeOZPZh18DUdRkCG0G2PY Eph5e1u80LXdP1myYrdafcR3MVCRUxsG4mnZqUPthUv0W0nU7TVdLs9Ts3D2l9DHcQOO8cqh1P3H JtKKxV2KuxV2KuxV8y/85ka3WTy3oaHoJ72YfMrFF+p8jJnBhv8AzipoA1L80Vv3UGLR7Oa5BO49 SSkCD50lYj5YhMn1R+ZHm+Pyh5I1fzCy85LKH/R0IqGnlYRQg/5PqOvL2yTAB+fN9e3d9eT3t5K0 93cyNNcTOas8jkszE+JJyttUcVdirsVdirsVdirsVdirsVcCQajrir3L8of+cltZ8uGDRvNbSapo QokV4avdWyjYbn+9jH8p+Idj2yQLAxfWWj6zpetaZb6ppV1HeafdIHguIjyVgf1EHYg7g7HfJMGH fmx+UOgfmFpPp3AFrrVsjfo7U1HxITvwkA+3GT1HbqMBCQafEXmryrrnlbXLnRdatjbX1saEHdXU /Zkjb9pG7HItgKU4EuxV2Kpt5V8z6t5X8wWWu6TL6V7ZSB068XXo8bgdUdaqw8MKCH315C866V50 8rWWv6aaR3K0ngJBaGZdpInp3U/eKHvk2ohhH/OQ/wCVg86eUWvtOg5+YtGVprIIpLzxdZbfbckg ckFPtCg+0cBCYmnxNkG12Kvtv/nGbzG2s/lRYQySGS40iWXT5SRQhUIkiHQbLFKi19vHJhqlzeq4 UOxV2KuxV2KvjH/nKzUZLr815LdmqthY20CL4BuUx/GXIybI8md/84a6WgtfM2qstXd7a1jbfYKJ JHHhvyXGKJsg/wCcvNUltvy906wjcqL/AFFPWUU+KOGKR+J/2fA/RhKI83yFkGx2KuxVOvK3kvzV 5rvHs/L2mzajPEoaYRABUB6F3Yqi1ptU74aQSyuf/nHr844Fq/luUilf3c9rIfHokrY0jiDFdX8j +c9GSSTVtCv7GKIkPNPbTRxihpX1GXgRXuDjSbSTAl2KuxV2KuxV2Ks+/Kf84PMH5e6rztybzRLh q3+lM1FftzjJB4SDx79DhBQRb7a8p+bNC816Fb63olwLixuB8njcfajkX9l17j+FDk2pjX5vflPp H5haAbeQLba1agtpeo8alG6+m9NzG/cduowEJBp8Na5omqaFq11pGq27WuoWchiuIX6hh3B6FT1B GxG4yLaEDgV2KuxV67/zjh+Z58o+bl0q/l46DrjpDOWPww3H2YZtyAoqeLnw3/ZyQLGQfaeSa3xZ /wA5KflsvlPzqdUsIhHouvl7m3VaBYrhSDcRAA7Crh12Ao3EfZyJDZEvIsiyfTn/ADhrq0rW/mbS GI9KN7a7iHflIJI5K/RGmSiwm+lMkwdirsVdirsVfCP/ADkDdNc/nF5lkahKzRRfD0pFbxxj6aLv kC2R5Pfv+cRLRIvy2v7ig9S41WYlh14pBCoB+RqfpyQYy5sV/wCczZW9XylFU8Qt+5HapNuP4YJJ g+acizdirsVfZ3/OKqaSPyqiaz4fXGvLj9Jlac/VDfAH/wCePCmTDXLm9iwsXEAih6YqxLzR+U/5 d+Zw51jQrWWd6Vu4l9C426fvoeDn5E40kF4f53/5xCnjWW68m6p6wAqumahQOTUkhLhAF9gGQe7Z HhZCb5/8xeWPMHlvUX03XbCbT71N/SmWnJa05I26uv8AlKSMDIFLMCXYq7FXYqz78nvzY1T8vfMI uE5T6JeFU1WwH7aCoEkdekiV28ehwgoIt9zaNrGm6zpdrqumXC3VheRiW3nQ7MrfiCOhB3B2OTan kP8Azkh+UEfmnQ38y6RAP8RaVGTKiD4rq1TdkPi8YqyeO6+FAQyiafHOQbHYq7FXYq+4P+cefzEP nHyHFHeS+prOjFbO/LGrOoX9zMf9dBQ+LKcmC1EUnv5v+QI/PXkW+0VeI1BKXWlyNWi3UIPCu4FH VmjJNaBq02xKg0+BJYpIZXilUpLGxR0OxDKaEH5HINr3P/nEC9mj/MPVLQN+4uNKkd0oN3iuIeBr 12Dt9+Sixm+u8k1uxV2KuxV2Kvgb87v/ACbPmj/mOf8AUMgWyPJ9Jf8AOJnH/lVklAQf0lccqmtT 6cXTbwyQYy5sa/5zJ0ieTSfLWsKP3FrPc2kpp+1cIkke/wD0btgkmD5byLN2KuxVkXk38wvOPk26 kuPLmpSWRnoLiKiyQycenOKQMhI7GlR2OG0EW9Fg/wCcsvzUjcs6abMK14PbuB8vglQ/jh4kcAZf oP8AzmRLyij1/wAuKVp++ubCYg8qdVhlB2J7GXHiRwPWvJv57/ln5rMcNnqq2V/JxAsL8C3l5vWi KWPpyNt0R2w2xIegYUJP5p8oeW/NWmNpuv2EV/atUoJB8cbEEc4nFGRqH7SkHFXyV+cP/OO2t+TB NrOiM+qeWV+KRiK3NqO/rKoAZB/vxf8AZAdTEhsEnjmRZOxV2KuxV7l/zjT+bx8uayvlTWZ6aFqk gFnK5ottdMaDc9El6N4Gh8ckCwkH19kmD4x/5yU/K9fKfmoa1psXDQ9cZpERQAsN0N5YgB0Vq81+ kfs5EhsiXjuRZOxV2KvSv+cffPR8pfmNZGeThpmrUsL+pooErD0pD/qSU38K4QxkH3Nk2t8V/wDO TfkkeXfzGm1C3j4WGvqb2KnQT143C9OvP4/9lkS2RKY/84jf+TPu/wDtk3H/ACfgxis+T7DyTW7F XYq7FXYq+FP+chrR7X84vMaPvzlglU0oCJbaJx93KmQLZHk95/5xCvVl/LnUbUn95barKaUP2JII Spr/AKwbJBjLm9G/NTyWvnPyJquggD61NF6lg5IAW5iPOLc9AzDi3sThKAX5/wBzbXFrcy21zG0N xA7RzROKMjoeLKwPQgimVtqnirsVdirsVdirsVekflx+fXnnyS0dsk51XREoDpd27MqIABSCTdoq AbAVX/JwgsTF9bflx+a3lPz9pxuNInMd7EAbzTJqLcQnxp0dPB12+R2ydsCKZkyqylWAKkUIO4IO KHyt/wA5A/8AOPyaSlx5u8o24XS1Bk1XSoxQW4G7TQqP91fzL+x1Hw/ZiQzjJ88ZFm7FXYq4Eg1H XFX27/zjz+ZjedfJawX8vPXtG421+WNWljI/czn3dVIb/KUnvkwWqQpln5leSLPzr5N1DQLiiyTp zspj/uq5j+KJ++3LZv8AJJGFQX5+Xtnc2V5PZXUZiubaR4Z4m6rJGxVlPyIyttUcVdirgSDUdcVf ff5NecT5u/LnSNVlfnerH9Vvz3+sW/wMx93AD/7LLA1EJN/zkD+Wt/568mw2+kRLLrdhcpNZq7rG GR/3cycmIUDiwf8A2O2AhQaY9+Q/5B6z5D1qbzBrWoQS3k9m1othbBmVPUeOQs0zcKkenSgWm/XE BMpW9vwsXYq7FXYq7FXxr/zlhpj2n5pC6IHDUNPt5wRXqheEg+/7oZGTZBmf/OGuqLTzPpTfa/0W 6i6dP3kb/wDGmMUTfS+SYPm//nJP8jp7yWfzv5ZtzJcFeWt2EQJZ+I/3pjUdTQfvB3+115ZEhlGT 5fyLY7FXYq7FXYq7FXYqjtF1vVtD1S31XSLqSy1C1YPBcRGjAjsezKehU7EbHbCr7Q/JL87dN8/6 aLK9KWnmi0St3aDZZ1GxngB7fzL+z8qHJAtRFPUmVWUqwBUihB3BBwofGP8AzkT+Tw8ma2ut6NDx 8s6o54Rr0tbk1ZofZGHxR/SOwrEhsiXjuRZOxV2Ks+/JHz8/krz/AGN/LIV0u8P1PVFrt6EpA5n/ AIxvR/kCO+EFEg+8gQRUbg9Dk2p8ef8AOVfkhdF88w6/axcLLzBGZJSo+EXcNFl6fzqUf3JbIlsi XiWRZOxV2Kvo/wD5w881enf635VmcBLhF1G0UmnxxkRTADuWVkPyXJRYTD6hyTB2KuxV2KuxV2Ku xV82f85kaGTbeXNdQGkbz2M57fGFli/4hJkZM4PPv+cXdfGl/mtbWrvwh1e2msmr0L0E0f0loaD5 4hMuT7UyTW7FXh/5q/8AOMeheZZptX8sSR6NrMhLzW7Aiznc7klVBaJj3Kgj/JrvgIZCT5o82/ld 598pyONb0a4ggQn/AE1F9W2IHcTR8k360JB9sjTMEMWwJdirsVdirsVdiqN0TWtU0PVrXVtLuGtd QspBLbzoaEMPHxUjZgdiNjthV94/lR+Y+n+fvKUGsQARX0Z9DU7QdYrhRvT/ACHHxIfD3ByYaiKT rzf5W0zzV5bv9A1Na2l/EYy4ALRv1SRKgjkjAMPfFD8+/M/l3UfLfmC/0LUl43unzNDLSvFqfZda 0PF1IZfY5BtBSvAl2KuxV91fkB5xPmj8stMmmk9S+04fo68JILc7cAIx92iKE175MNRG6G/5yO8p DzD+VuoyRpzvNHK6lbkCp4w1Ewr1p6LMfoGJWJ3fD2QbXYq7FWbfkt5i/wAP/mh5e1Bn4QvdLa3B PQRXQMDE/wCr6nL6MIRLk++sm1OxV2KuxV2KuxV2KvOv+cgvLDeYPyq1mGJDJdWCrqFsF3PK2PKT bv8AuS42wFI5viTy7rVzoev6drNsSLjTrmK5jp3MThqb+NKZFsL9F9N1C11LTrXUbR/UtL2GO4t3 /mjlUOh+lTk2pE4q7FXYqkd/5E8j6jL6uoeXtMvJdz6lxZ28rb9d3QntitsZ1j8gPyj1SJkk8vQ2 rtustmz27KfECNgn0FSMFJsvG/P3/OI+o2cUt75LvjqCL8X6LvCiT08I5hxjc+zBfmcBDISfPl/Y X2n3s1jf28lreW7mOe3mUpIjjqrK1CDgZqGBXYq7FXpP5CfmQ3kjzzA91Jw0TVSlpqgY0RFZv3c5 qQP3TGpP8pbCCxkH3Pk2t8x/85feSFjm0vznaxgCb/cfqbDqXAL27kAfyh1JJ7KMjJnAvmvIs3Yq 7FX0J/zh95mNv5j1ny5K9I7+3W8t1P8Av22biwHuyS1/2OSiwmH1PdWsF3azWtwnqW9wjRTRmoDI 4KsNt9wckwfnL5k0abQ/MOp6NNUy6bdTWrE9zDIUr9NK5BtCXYEuxVdHI8ciyRsVdCGRh1BBqDir 9HPLGrDWPLelauCCNRs4Lrbb++iV/wDjbLGlMsVdirsVdirsVdiq2WKKaJ4pVDxSKUkRhUMrChBH uMVfnn+YnlObyn511fQJAQlncMLZmBHOB/jhfev2o2GQLaC+pf8AnFfzsuteQm0K4k5X+gSekFNK m1lJeFv9ieSfQMkGEhu9pwsXYq7FXYq7FXYq80/Ob8mNH8/aRJcW8aW3me3T/Qb/AOz6nHpDMQPi Q9j1U+1QQQkGnxFqGn3unX1xYX0LW95ayNDcQSCjJIh4spHiCMi2ofArsVdir7w/Ijzi3mv8s9Kv JpPUv7NTYX5Lc29W2ooZyf2pI+Dn/WyYaiE0/Nfyuvmf8u9d0cJznltXltFrT/SIP30O/vIgB9sJ UF+feVtrsVdirOPyR1xtF/NXy3dh+CS3a2kpPThdgwHl7fvK4QiXJ98ZNqfEH/OS2jrpv5vasyLx jv44LxR7vEFc/TIjHIlsjyeXZFk7FXYq+6v+cedS/SH5P+XpDXnBHLbMCD/uieSNdz1+ADpkw1Hm 9GwodirsVdirsVdirsVfN3/OXfkQy22n+dbOKrW9LHVWUD7DGtvI1PBiUJPioyJZxLxz8lPzAPkj z7ZalM5XSrr/AETVVHT0JSPjp/xW4D/QR3wAspC33mjo6K6MGRgGVlNQQdwQRk2pvFXz5+cX/OTi 6Hf3Hl/yakV1f27GO81WUc4YpFNGSFOkjL0LH4QexwEshF4FqP5xfmnqE5nn81akjmppbXElsm/+ RAY0/DI2zoMn8nf85LfmZoF1H9fvP09p4P721vaeoR34XAHqKf8AW5D2w2gxD60/L/8AMDy/558v x6zo0h4V9O6tZKCWCUCpjkAr41BGxGSYEMlxQ+Wf+cuPIMVnqNj50souKagRZ6px6euiVhkPu8al T/qjxyJZxL51yLN2KuxV9Lf84b683qeY/L8ko4lYL+2gqK1BMU7gde8QOSiwm+mskwfnV550ePRv OmvaTFGYobHULm3gRgQfSjmZY+vYoARkC2hJMCXYqr2F29lfW15HvJbSpMg6bxsGH6sKv0mgning jniblFKoeNqEVVhUGh36ZNpfKX/OYtkqeb9BvafFPp7Qk+0MzMP+T2Rkzg+f8izdiqZ+WPLupeZP MFhoWmp6l7qEqwxDsK7s7f5KKCzewwoJfoL5O8r6d5V8s6d5f08f6Lp8QjDkAM7n4pJGpQcnclj8 8m1JxirsVdirsVdirsVdiqX+YNC07X9EvdG1GP1bK/haCde9GHUeDKdwfHFX59edfKWp+UvM9/5f 1Ff9IspCqyAELJGd45Ur+y6kHIFtBt9Rf84v/mkuveXv8JanNXV9GjH1JnPxTWQ2UCvUw14f6vH3 yQLCQZl+fPnG58qflnqd9ZSGHULrhY2UoNCr3BozKezLEHZfcYlAG74QyDa7FXYq9X/5xp843Ogf mZZWJkI0/Xv9Buo6/CZCCbdqfzCT4R7MckGMhs+2ck1vPfz/ANHi1T8o/MMbrye1hW8iYdVa3dZC R/sAwPscBSOb4RyDa7FXYq9n/wCcTbkw/mo8Y6XOm3ER+QeKT/mXkosZ8n2Tkmt8Kf8AOQ0KQ/nJ 5kRBQGWBzQU3ktYnP4tkC2R5POsDJ2KuxV+jHk2b1/KGhzUp6un2r0O5+KBTljS8E/5zNgBtvKc9 d0e+jpTqHFuevtwyMmcHzFkWbsVfX/8AzjR+UbeWtGPmnWISmuatEBawuKNb2jUYAg7h5di3gKDx yYDXI29xwsXYq7FXYq7FXYq7FXYq7FXi3/OSv5Tt5q8vjzFpMPPXtGjPONftXFoKs6Ad3jJLL47j ckYCGUTT5K8ueYdV8ua5Z63pMxg1CxkEsEnUeBVh3VlJVh3GRbCH0X+dXnPT/wAxvyFsvMGlUR7D U7aTVrMmr28hilgKt/kl51Kt3B+dCeTAbF8xZFm7FXYqy/8AJ/T7i/8AzS8qwQCrpqdtcEf5FtIJ 5D9CRnCEHk/QHJtTEvzcvI7T8rvNcsgqraVdwj/WmhaJfxfEpHN+fmVtrsVdir2H/nFQE/mzCQKg WNyT7CijJRYz5Ps/JNb4Z/5yONfzo8xmlN7Qbe1lAMgWyPJ5rgZOxV2Kv0U8iAjyP5eB6/oyz/6h 0yxpYp+c35Pf8rKttKg/S/6J/RjzPy+r/WfU9YIKf3sPGnD3wEJBp5Tcf84ZXKx1t/NqSSV+zJYG MU+YuJP1YOFlxp7+Xv8AzinZ6D5kg1fzDqcWsW9p+8t7BICiNMD8LSlmbkq9eNNz12FCQEGT6Aws XYq7FXYq7FXYq7FXYq7FXYq7FXyT/wA5I/kq2g30vnDy/b00O8flqVrGNrWdz9tQOkUhPyVtuhAy JDOJeQ+VvNVzocl5Aym40jVYTa6tp5bis0R+yw6hZIm+ON6fC3tUEAsiEu1DT2tWSSN/Xsp6m1ug OIcLSoIqeLrUclrt7gglUFCYEuxV9V/84x/k7f6Jy85+YIDb31zEYtJs5BSSKKT7czg7qzj4VHXj XxyYDXIvoXCxeLf85W+a49K/LpdFSSl3r1wkXAdfq9uRNK3/AAQjX6cBZRG744yDY7FXYq95/wCc P9Kmn89atqdB9XstOMLHeokuJkKU2p9mF++Siwm+t8kwfAn51aoup/mt5ouVBAS/kthXv9Vpb16n r6VcgW2PJhWBLsVdir9I9DtJLPRdPs5BSS2toYXGx+KOMKem3bLGlG4q7FUHq+saXo2mz6nqt1HZ 2FsvKe5mbiiitOvudgO+KomGaGeGOeCRZYZVDxSoQysrCqsrDYgjocVX4q7FXYq7FXYq7FXYq7FX Yq7FVK8tLW9tJrS7iWe1uEaKeGQBkdHHFlYHqCDir4z/AD0/Iu88kXjazoyvc+Vbl9juz2jsdo5D 3Q/sP9B36xIbIyeeeVvND6HdMLizh1XSLgr9f0m6FYplXurfailUE8ZE+JfkSCAUkPoDyZ+Sn5Df mLp/6V8v32p2DKALvSI7mIyWzn9lhNFM5H8rciD864aDGyHqPk38g/yy8qXEd5Z6ab3UIiDHe37f WHVhuGVSFiVh/MqA4aYkl6HhQoX19Z2FnPe3syW9pbI0txPIeKIiCrMxPYDFXwh+c35kS+ffOlxq cfJNJth9W0mF9isCmvNh2aRqsfoHbIEtsRTBcCXYq7FX15/ziP5ZOn+RL3XZUAl1u7IicGvK3tKx r8v3rS5MNcub2nVtSttL0q81O6YJbWMElzO56BIkLsfuGFi/OG/vrm/vrm+um53N3K8870pWSRiz Gg8Scg3KGBXYqnnkbSX1fznoWloKm8v7aE+AVpVDE+wWpwhB5P0UybU7FUj84+dfLfk/R5NW167W 2tl2jTrLK9NkiTqzH/b2xV8V/m3+cWu/mHqgaYGz0S1Y/UNMViQO3qSn9uQjv0HQdyYEtgFPYP8A nE3zF5+ube50me3a68n2ob0L+Zipt59j6MJNfUVq1K/s9aitDIMZPpDCxdirsVdirsVdirsVdirs VdirsVUruztL21ltLuFLi1nUxzQSqHR0YUKsrVBBxV8nfnV/zjdfaC1x5g8nxPeaHvJdaatXntR1 LJ1aSIf8Eo61FTkSGYk8X8veY9c8uarDq2iXkljqEB/dzxHseqsDVWU91YUOBmQ+q/yt/wCcoPL2 vLDpnm309G1c0Rb2tLKZum7H+5J/yvh/yu2SBazF7kjo6K6MGRgGVlNQQdwQRhYrbi3guIJLe4jW aCVSksUihkZWFCrKaggjtir5P/PL/nHO40L6x5l8oQtPogrLe6YtWktAN2eOu7xDuOq+46RIZiTw LIs3Yqj9A0PUNe1ux0bTo/UvtQmS3gXenJzTk1AaKvVj2G+FS/RDy5oVnoGgafollX6rp1vHbRFv tMI1C8mp+03U++TaWM/nPovmrXPy71TRvLESzalfhIWVpViPocg0oVn+El1XhQkbHriUh8N+YPKv mTy7d/VNc02406f9lbiNkDe6MfhYe6nIU2ApVgSybyp+WvnvzWy/oHRbm7hatLvj6dvs3E/v5OEV Qe3KuGkEvoz8nv8AnGa48ra9Y+ZvMWoxz6hZFnt9OtVJhWRlZFZ5n4luIatAo+LuR1kAwMre/YWL x780P+ckvKflNZtP0Rk1zXlqvpxNW1hbcfvZV+0Qf2E38SuAlkI2+TPOHnbzL5w1ZtU1+9e7uT8M SnaOJOvCKMfCi/L5nfI2zAp6L+TP/OPur+dJIdY1oSad5XryWT7M10B+zCD0Q95KfL2ICDJ9haNo ulaLplvpelWqWen2q8ILeIUVR1+ZJO5J3J65JrRuKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KvFvzY /wCcavL/AJqabVvLpj0bXn+KRKUtLhu5dEBMbn+ZRv3BJrgIZCVPlPzb5L8z+UtTbTvMFhJZXG5j LCscig05RSCquvyORpmDbIfy+/Ovz55IZIdOvfrWlKatpV3WWCnfhuGj/wBgR7g4gqY2+ivJP/OV PkLWljt9dWTQL9qBmlrLak07TIKrv/OoHvkrYGJew6fqem6lapd6ddw3tpJ9i4t5Fljb5OhZThYs b8yflL+W/mMyvq3l+0luJyDLdRJ6FwxFKEzQmOQ9O7e3TGk2891b/nEf8uLqUyWN5qOnAinopLHL GPcerGz/APD4KTxFM/yq/wCceNG8g+ZLnXTqTatOYzFpyyQCI24evqMWDvzdlotQFoK+OICmVvXM LF2KobUNN07UrV7TUbWG9tJPt29xGssbfNHBU4qxjSPyf/LDSLtruw8t2SXLP6okkj9Yo4AAMfrF /T6fsUxpNsquLmzsbVpriWO1tYQOcsjLHGg6CrGijFDynzr/AM5N/lx5eV4dOmbzBqC1AhsjSAEf zXDDhT/UDYLZCJfOv5g/n/5/85erbPc/orR5Kr+jrIsgZT2lk+3J7jZfbIkshFg/l/y3r3mLUo9M 0Sxlv76X7MMK1oP5mP2VUd2YgDFJL6g/Kj/nFzS9GeHV/ObR6lqS0eLS0+K1ibr+8J/vmHh9n/Wy QDAye+qqqoVQFVRRVGwAHYYWLeKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kpfrvl7RNf06TTt asob+yk+1BOoYV8V7qw7Eb4q+fvPn/OItrKZbzyVqH1djVhpd8SydK8Y5wCw8AHB92yNMxJ4F5s/ Lzzr5TmMev6RcWSVKrclecD0NPgmTlG3X+bBTIFLdG8w69odyLrR9RudOuAa+pbSvETtTfiRXY98 Vp6ZoH/OUX5raWES6urbV4U243sA5Ef8ZITCxPuScNo4QzzS/wDnMr4OOq+WKv8A79tbqg6f77kj /wCN8eJHAyay/wCcvfy5lUC607VbaTetIoJE9txMG/4XDaOEor/obP8AKziT6ep1BA4/V46mtd/7 3tja8JQ93/zl3+W0SH6vYarcSUqoEMCLXwJaao+gHG14SxzVP+cyrYIy6V5YdnP2Jbq6Cgb9Skcb V2/y8HEngYLr/wDzlX+aOpBksGs9HiIoDaw+pJQ+L3BlFfcKMbTwvMtf82+Z/MM3ra5qt1qL/s/W JXdVp/KpPFfoGC0gL/LfkzzX5mufq2gaVcajJWjGFCUXp9uQ0RBv+0RjSkvePIn/ADiJdyNHd+dd REMezHS7A8nPtJOw4r8kVv8AWGHhYmT6H8r+T/LPlbTxYeX9Oh0+225iIfG5HRpJDV3PuxOSYJxi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdiq2aGKaJ4pkWSKQFXjcBlZTsQQdiMVee eZ/+cffyq8ws8s2jLYXUhqbnTmNs1T1Ppr+5PjumCk2XmOuf84b2xJfQvMboK/DBfQBzT3liZP8A k3g4WXGwjU/+cT/zTtHpanT9RSlQ0FwUPXoROkW+PCnjY9d/848/nHauEfy5K9a0aKe2lBA90lan 04KXiCB/5Ul+bH/Ur33/AAA/rjS8QRdr/wA4/fnFcsFj8tTqSOX72W3iFPnJIgr7Y0vEGQad/wA4 p/mvdSKtxHY2Cnq89yGAp7QLMcPCvEGaaJ/zhvKaPrnmRV6Vhsrcn5/vZWH/ACbx4Ucb0zy1/wA4 3/lPobJIdLbVbhKES6lJ64NPGIBID9MeGmPEXpNpZ2lnbpbWcEdtbRCkcEKqiKCa/CqgAb4UKuKu xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV//2Q== - - - - 1 - False - False - - 56.333333 - 57.333333 - Pixels - - - - Black - - - - - - 默认色板组 - 0 - - - - application/pdf - - - 黑鱼白底 - - - proof:pdf - xmp.did:279a03ea-f3e7-40a3-ae53-771dd64b883e - uuid:c3a85fc4-4db4-b943-8504-bfeab2b33386 - uuid:f45c532c-a658-3748-b74d-0cf5e658e16a - - uuid:28112cc2-f74a-0b45-b4e8-5de3f55b3424 - uuid:f45c532c-a658-3748-b74d-0cf5e658e16a - uuid:f45c532c-a658-3748-b74d-0cf5e658e16a - proof:pdf - - - - - saved - xmp.iid:279a03ea-f3e7-40a3-ae53-771dd64b883e - 2018-07-17T18:09:54+08:00 - Adobe Illustrator CC 2015 (Macintosh) - / - - - - Adobe PDF library 15.00 - - - - - - - - - - - - - - - - - - - - - - - - - endstream endobj 3 0 obj <> endobj 7 0 obj <>/Resources<>/Properties<>>>/Thumb 11 0 R/TrimBox[0.0 0.0 56.3333 57.3333]/Type/Page>> endobj 8 0 obj <>stream -HDWˮ\W|olׁ 'q$RS>70Ul滿}x_?(_?}oo|r0櫵~oI10nGaո4U;Q@?[`nɅqN&`TяPۋpFSS'F(5k s*GO݂1ã_*8Cu5b  -!u6G:.N5Gf'l! ES@]C`we,ÍWSpn=v*mua7jSh kO Ɓy{(Axflt-8utɈQ7& އ`fΆfDQ5x%YK7]b~ۿX@w_GƆ&a!z:>鏻hXzli*jϫF#\{<؋Bz^Bp6jÃlʫAlTf};E;Uj~vצt8$nrpGg ثHJ?3q񘻙hqDD&:U.#m0I5LY#v Ql؆5Pf1_r}3za%GFĊ$H58>>D-ZA"ч EWϘС$!Gĩ93zab_MA <GkIuNID"R2Iti_4d9G3y餲M,'&8imsԥ${KD0|%G=DԜ{J0pM% T@,I3zG86ANq0ݧ6lBc561OK%D%E B9%g83ᄖF9fe_&*U碌)x v<|%@n-;mA-7PWirWkԢg!(#oƷ-םJt8jvoX'Whλj7}o=|{.0wf+A:˓!S0ad[Y|0PM8]eS+U0?ո {TUQ* ϣ);C|;6K8tMp{$̗sF6| d^˅GZ3^S{2; W("ym!*LV~HIX9dǵYjN 9!sՏ:*>SYn 0gu>5 1L7|Qtw\MW\+>{oW@z'2Ǖȁߧ c|H~hˌuʋF9ޒ-$nߔAa3ە#ߡ3xIRzzyUtO:P0cP& -uifu^0$)>'+^%F{[갡f)S|K]lkqG9a~vwG*Caֳ?J 꽤=R+Z %&| kf xencB }{C1V^_O!Z}]4)Y:5TP)ҭ}͎l:vhAf^A b|\"QWdy|ʌLClН84LẓoEVcτeq|DK!xNh_y|O#'7s%ᓌxYytG'CI̾=Ѵwf1!էK,Cg8v{xyO|zߘ2 h۵Lgh3 gT92n/Ȧ,1foZ|- -#EL0D]gH`qy38!Яm _unO-B&2oJ:° =r+|QPf;Z&]vFX$K`&d|%(J:e+ݢ/p_Skm~]#EoE\,17]CasXocSMp2 U $Oso˒& E"_jeɍs#y0*[ʯ\t'#_](3Eu G71C2Ssv9[6; ̾<g¢M\fx_FL`i%iS!v)DOAMr5o(A'aQTg/OR0|p{@\DM{[E*>tp*=˫wyS/. `wמojr؏nU'Z~*!dIGxPPQ6ߑ F -|_~:s4T]%^L?Fp ξNNBсŠxޥ@Tix2't1~CG[9S=Hxy2d8b0QV}^n$/SDwfi28GzqoT'n9yп)R  }5}T4KVB q5<] -Ď!O5ĵ踯4(,*TF,jXqj=uOnXz' - 4S ΆL̬*p;-) -djUQ3)5W酜LMFhF!]zD4!@-jb)=ߖaBrǨ0SJ4sTY))HIuAVxc2kSP?y  Ty#Sx~ҝgvȏ r=?uu6"H -CEcӐAһFHkְxa -l?Wx_LW]t K,Zp1*ZM: -1x^#jQd`'1j]!Yô1~eD 2#07ܻFQg80i&yӁ3h"Gt% -8N5 -^i͜ P -mSU<ÀכO(ÁaYvqAES%GѪWBDWH=*R+%$^4tU)$].%2J4tFTl?]#N}kĹ^UB:hxDWP1Ѻ},M *P1p=3OW|u>&i3j %p:_{VNywl6r*E)L)5 ݁>f - )`vr`]H L nvK"Nb.02sNWr[LQ{FtggƼ -ص0Á4!@Y5b-Jܡ9e=*<(;k&lBf#݇T & -tBTkk1!F%0X][VkӜLO]t ;&c`]Id3`~(]v&LV~Y\t0]KD!OJӺ/s.-{u7*ֵ6㗮)]bg3V {F]k]Tsˠr{b1Y.I2xzՌy-! k@ڮphQcm{lPb$)Z᎝cWbh<,!sAVFԢ|%e={ikHJ{^t 4T"롣/Wr9Kn^p'vPK} );\|e44>h6rDZW -m7Mp:5xY )\het[#7z7`3-6p -/Mܚ>Sv=4>F5֖ZEIU"t$Yp?yػ -ek|ex?pȒ~/UsS*]bD|w޳ddub#gj2V°-M'O [ӍaU8T' ]' Ku=]&'ю*Fw -8\ַE)}U9 h*\Q/*<+j<4|Q$4ܗ==7>!Yg#ql%bJVF%hP>%*ov L6z!LE"eo}8M΍Uuܶ[ʂT>hN -~\`@jّP _}b| __|~ݼ~t?/|AW5/m??φhbi߃_B {.vx,!RFBE0'aR&a*Ec?/M(~(8Hu6>\Zic uA:2<4_ 〉QڅuҰn4tJ5:KȰvຕ;T7PA?x]^FNVYS65~?ݰgbHdb٢0\^cןX,#r/jJ^RR4?u,T)8VZh U oAvMcwHEaOВ< Op8}~Ij|KNd)a/5QC1EAYɏ>99uIeuD ;:ͩH7vƱHJ.!b7>OɚNƤ8ᤘdlq”l*}x@<6{(ك}>&D'osQ_`FW1!Fi+@Q%pթ5g$ˎ)"rhD+5yz2X>OFf؍&P !X$aHb0t05<t7#T XCh<3H{f@&A׌km%RjCDzQ#i+/bneڦz\?{' \20PvJV7ӳ6o,:vE:^ɓ^AKE}H]b3o!B' -Ig{(Ecң"R5e2MS$>Բ[)Fӳ 9vt`}`OHCVL E ձt%{rttJrG\k* -`QVe^IlS#g5S)T]a;N}aTUv]²Z)񀪲-E|. :g1: N6yDgwGE0:5ˈN& 0:?k.?Q=l38viV'kV țANQs˲&uc6 7^e"΍ոBv5$$D`ՃZ NPJ\ڀ7l3|xh\}lXvx#$󈖽#͵r76RX mL9JFQް3:@!oUvN9M}_q[- |Xa¤Vx%-mCZ<;_Š)bu8ʟ%] RRMH٪:zZ̤0(ov{ǑG@MH:#plύ х es|I^1܅*, ,O8.Yx$D|Ҵ2H|ھr$nݔ7rO:vR w4])7~sm( 6!"sCZHOX"}zLF80F#5Zwpn1)αlS3[]W6r@uid uI{d7:Ih_ߑ ;G#\!9{v -eաCGB}f8aSP *enl|#3e4Q  ʆ'Z9nOCl<aWGBW zAHFBh8KV3Vj)حXkFbG n̛VjLCNHpIRyI2^|$mu<- ,eؙ]$Sm=cCVUndO {)Tpm- =Q]ʃn-hbN%5O{&kLafS8-ie?} -Y=nGSy+^2bFt6D\p< {ēÁ+"64b1p$%;qxjp+ap n|IGfEՔ -Bw]Uh '1Qjč0xpTt ^:Fl4;3#|KjC]G.qŢc&©i-x8nFDk*{C 8*;6&p*/,(ٳ^Jl6Id*lcrFMJָ(!׉)A푥 Gvp0nIVwa,1$Ds:IYrxձÑwC-FAS)3t+T\yN!<ŖcX3o ;IptMpDLDUk\F3XO˰qޢ'oK5 rEI)cfG cֈ~byʹ׍=[Ȍ ->i.c7]+4ł]װhk [Ƕ,HCrmzP 5W3I/1MM' Acx"Lr8WJ<bBFlzPuחaPF$6xUxdήMNbn{U/eeUw+S!%P4_P$;囹Ј"m&]吝WSJ'>BgՈ\OI7Hj=6nTӑdQ@FtKZ\B2]IKW3rNjwz?[ cT;[7%M2+Y7N*m~ԯ,M:hǕ:l(SVj X*+AӺ:W8,)JQk4"5&rǖ> }%@> -,}51UpχgYk -S1=%ev2n(&6rw=T:" -3Vp$p}p!b`|y^yI4zԯ?. SE01[٠h)'yᢚcu:)"PkRWXh`NV%x0sA7k _M=qw`2k[5m;b<gh)eyOLZ{|wePnz>$}TT&ȷY5ct ƗpL#,,M=kj.B=hpk"@ k#UϼO4Z/$bq[] dֈmxno3"aLOB[uf=>72cZ[~Ī&Z -=2xOuopZK?_c9pX#hb8j`G>!ֶ#& {Yu -sr* jEl9t]%;[v)٥4+{J)xX0_LRAw;4*w)j~)"LB<9u{A:RApߦcVF#cJ˖|DgHe3d 9 ۭQB~w?ؕ]>mi ;6g?}{Xp=eўYF(NK]{;BO@ 7sݝUl$g`#f)Hmj6c7=r@pڀ=B]. tKPq;I~DyDq&wJ;,o)NjҚ unv}\x_#?HiؑZH0s%xZ|^#^zIqG ݲ;t7;̾25՝.m*FtI=ovyM5w֧]"^$S<P_,``OdM֙2)Z_)~dc_z8MҏP!kg\߭@&s9*vw=K𻚒 ij T>Q5x" hm#FJ= f9 -`G+ ļ -@G#\ʺi 2ZL-ıG `}# ֔>C `Gy70M1zJsUuQbVi˂]V"S5e]ix; p^ב"cIp HA}gk1 -opyj%: '0׶dД -R!`>V,4 XGjѨ#jaNbz-GZ -%e9:ؖFN } uUMAU<&p4k" wlf4#0HC"kx;X-|\!MӗU|4嵀 -&XOk<%@8rrDt"+iA2S! 8lK}udkWoTBO!Zőzʓ C6=nȚ5eo$DUk<(2kks.qeAS|d֧ ,DsՈ~Xoz:(tB8MJyGߚ2ȑ]{e⼣m,Hrm`ݭ+l_mЌXMv6MRDe:Hl(ؓ -u۫h]#&^|j_n.,A DVBJ@q/N?iI<wMS/5GQEb*eMO[N YN|9$Ϊ)Noz26mp$#%Ⱥp"$mU#ԅd5Nfl6zvpҥ-*ǨvoK &dhWbnT(5)ͩ_oY7Vu$+unQUW uu`yfIWB|&p,-Y2Sƕߣh(E^k6M8-}$@$7e*<`J/#,!A& AH:/ҩ^ #Tҧx4 -G$9od1F̜27KҎvl7nИi#wTKLU(UXV6ڙ9"ѣ1/XCb|$ -=3+O涋E3CJ[dvt"Ff,_M rR"O; "NѫM3٪)ME%$ߙ83 oPڪ\бKiTO '˪}AF0b=S+ֶc -cH5ԚhDJ35`zA55 ͻa˿]#\ *F$TS^-fӍ^@OcDQ,؟L`nѰ+!?t LtS6AY5##HљFX/7a.|i{{9(p rH>. -{=x7>Z6NkuH:$F4l@<wӼ[۴}ЈylODGz}d)mm-O*Uђhg`{ze #?:=NֱsI ϱ?h,@lBO>EpHGI(zhCu -=x* ' -v'JvB4उ6=Ed_LR4};4BSuZSA=IH3)Ha҆(@IH(ٚM[7 "i"$M$PUSiBB?C}g=ͩǟOXl?6OO0 i!i_~Ǔ2rן_@ -C~~$ʮGtu桷!ߚ\oHD'}Qj֧[߫斿g;n^y˚OVxVi: C$#B!ɻ~i\s!\ NA%@TU#iS"4 c5HYlMȟ\nmj!O VyLSE$aUḢjW&ZCXvzr:|Svv~k2'3^l;wؓߞ/~v~`Ylx8<ʱH$9z 6+*K]yx C!O634%Azǚay>_~DI@HIa-Y3 -qkzD /ɳf^{JjE '3kRb'y7Rb9_r#x~8y7[ө$P=⵩`s{I ;P}dfl1x #Dϱm K鐝;9 L֠?_ZsI"9 1|)M3IЈrhgVl @n`(/cD-^ w;t$\~"68MqeM{&Q>謏Zt,j4wMРrus_ JH v1 şPaO - KfIIC;^I \$Y[)8ZOnxd j$M"u}t g9p^SТg:m[S-HAw#A[8p$B<Ǟعţ# ]d gU67(b >T[pL't08V - 8Ͼ[gl)<8d]e g8e4P)G GP= 8"@6qy&VSHYra+kG,- -vu'|M{>HT)8qlp߬جtџ͹5=R/qB#FVGд@:7|\F ɑB@c-2ԭo^kl3NcLte4:(Yv}XvMN Mfvt0NtxMh˱8֔ŪFhf셼d xy# 0iFA0)Ү78Z^AɦĘ5jR488I1h!ǎrx\{b2sM7Ǹp?!7vx[3FX{9p`(c;mEl٣iZQ, < -XL!.bhD=8qR\leVt#rj<嘫fԈnD)>A㗃4h$QH]490I4w1y8B*l}#CV@۾,ftSg?9R/^[FԒ}׌ѥAӀ޲NM3)S "rL eeR1uF7p7v^ZEvSBDCJn}#ZJ7SBSʹ6 GiԍkUǕL8`˖9tX+Gwx$lz+]LoLWM$ )3-#g ,rMH7xCS]DOoT(.7 gK8<ݶ~g@p&x2jfki&>byGژbk\n:b&>STwpo<r't"$2mynMR۱/W=ouGIM^+ĭ* 6E4.G bpy$̈́4dr`;J2Vr4UgH9UDjz8ES,2dթHLIL'*cJ!MΓlo.Z-x1o TV%]zqRᨾfc#M$ ':~ELVx{Qܶߟ'*>ESR߹2J?}߿(eU'=?_B ߨZK>gY?왕7*mP2WI?,U98>P9Ѯh[mC }=kwczOw|T B+&E?E*KQl1|O1 0lϯׯ}fGL>m[X=2ݏ&E,-^8P+Gȇp8~y "kOcEuq zkcCGe-ZϮ[: Jetxp)vsLͮ2;8pdh(sg)H{_)Ng/@ɝU s -ZGyx@Wx|+yf}^&3S~Q&݌q>˼F>}}Q.$Zao~2Ӟl״kspq5/3Z)ffaڨc8QeC໖SUb2X8Ç8NBui) S4%t+GrW2$X:j -׶I)9mv\Q*+B'l44#zQtԷscx=&On|h[~x)M!PN 'm餟)v!`4OyCVt$i=h3eKߴa!;U]fn?$4iBGaOƶZ -]#&k/BFW`M!;su>q* wKtcG:FeOꜘ71x`IÎv$WZY[`㓟+ pnn6L6̮L.MJ&K9AruٺPWu^ɩ`o1b;l  $㴥$W 2minˁq4IӳnxyԼ$b+='ENfrSUztM#I'E}mrӂe ޏk(M -*pcc= C` -\y<RCVg]=Sֆ8 -_ Rm!0=`Tvl _|%1pu5kϘ6P)l2MVmfq8Zq`cz \Ք#L+k$G,-6 ut 4E1SC59U -މScfzXӉ#GN@Z!pFDV`iŘ@VY7<\PD–ZZ^%V Z67sL};VM4̲S7£02oa o͉\ZPN30Μ#so$mF|4h)">}Z6:ޘp2yF4t. xNќ+p[L}Xuch}T/%K;R3*0ިV/kyw%^ L=XJ=)pH65ޮW6QUw5ÁrAy@+ӘM|$MBmS.n~Ct( -v$%iI8DU`Y_kOJfi|SzcgP^ -U߼#m6sO3"=XkTc{\cE,4`Q* >oaKk>Q>)MZZ2+ZQ`9<+&j`vW\5=ԃ_ rOM(Ѳt#vɀsnCI֐ o_1Cd+W ZtՍ/luJ@%BaNMw]9 h?ia-vzYM*fѡtf&\Wst7F% ,j۩2bg }ɭ[xRifw•6?4bMJ8|dR`|XvqK2$bUQMӻ.'ިP]n$ϖ.PIeZ=rc_4p{A;2V>[%U6l4Vi\6-6lI i -`-JcWwPdhw϶r2 ,pNYfSeLǫSn=O4T0I$C^' \ 77ZbP`7J 5>7?Q}'FH Ou: -m1@M?OT}jW!~seV!7v>}5uQVc ʪ?Ւ+˭潊lg[B dOII8I %;pUozJ gV\gT el=L "?X=Bh ڒyrc߁zY^T'H]fa]) -ҽh)Lx8PBƼtAh)A+""=2C>|{C,tݸP$A 2 Mek(k%D^ ?'FXu]AgOp]/v~WGf3H$YlvIA1n>= %a u *`ӠF'f )_؀\1o/F1ٟ\Cpi0z4K﹄`,{.>?gXbK:Xs>``g=V7F:4? rD{ӯ·UC-B͍GrmvEs#R^L'ufJaP," 3gYVeD Q.`˃B-r>5-يP<r%i6];~`+zޕ qB^C?{q`K>!ͧ_t̎^ = #XrCvgpC+#YsgDX*ۘG>LOfLi'NҬ+_ޕ|-ΔtO(O 0ق]tog&7JC|Lw{XA7\{(-,=dM&7XR!Mk65X٣܅^Pn\6tT9m Ya)GK.R;uTp퐵,dHpr~.(\{UߍkV4ĖΓ'%e;7Xг]"~.-j9ž{ -g ||~'Gģ : 뇺f>cTU'LVaYQeIo8u|z c9|{ߔf q[6˘QS˯y8h ߦ1Ƨö4Nmg/}l¸Xt,0w|"1m g.x<_\),#.]-E_)Vx%s+34$ -w#, xI, 4$%qb(i{kH[a$Yӏynm%r®Xw񅅻\^8ZB.g@c0")ϸS3NSg2ԁG˙"Y 8amXrqR@1K8?7ÛoKLUL]f8COHu*mȪ'!XvW*9Q_}HQc}7C!}^lA^);=e -N B 98(\e@fq^jE㡪"lIa;SyXVocThl)ξ&81R&=KM FV!e"1,`C:HY -\o085X]wH rX +hL5eEXfY5 QB܇<0+mL -ёI=V\ c2h2r1*zJ8&'+V̳XsC"*ɕ,:E^f182_F2"YwR J.ws@$zoCƘL.R翸=>}L2m']%IGo6Xqw/QN:DKL <&pDN1/ !}@rw9N LؕXkx(NYT|ݤ5O=u ^otJs?|ԝ6-8kX9P-}}'+vG WWM_|#%ssS -~K]ZIJ4Nd/}m59e8ib3T,L -6?wKxX -L>._ͶέBҠ4<`W "KM!Jߐb+}0GUa=0xT% iw -Dt~փg Jf7zh(%kCkl[vtSVxTûnpއ 6Pep/rҨؾӪe*(z O7lXh <f =lX5Gt㚢"P`:< NcCe]15{yC,"k{XVmɆQoH†zd4vGּհrnޫ0Yjօl5GmzhjT j+ c{@╹|Q4S؍ݗ+89_L{*>wY$Q0sb0`=k&&)iHJoM_r.yȣ=ioӆqduyDNVk;Yvv Vź[/,ryv|S΀t+x6")xR3nSfe3EӍͩ1 rrR%cGn7rx3R,bmz%Gϡ6ܩ:.@X_6 |x;?G%MđCFjr!`=s؂3*0%,Fka|XLU[Ce9ʋYaanAΗ1n9r]6"WfQs7S0d fo#-9]4LKxVn.GտvEwVXqUjqs71qa۬isƌn6X7uy .;xUtÒ*tY>,:! }NH<S#1W83'C#a.o_a>rK.*GaMg{?J9xLB;0JF=|+jX}* e -7C!\zezx)%S, -]m@*'6+TQ?T(b$[4+ZD-.`^yC2'SB*&~d'ع[zlX~|(AD`\Y#J߯I3K5qpVb%7ṫO+!TM]kSˡڷ -j_oϯ}BPПȰ_1n5]U3?HKTⴴٙB+t -' -I@Y]X&R)Ho )qOK!Ҁ{c{!&ץ-b)p%vC JY"_mdmvNJAe xnGѽR@8-xT@ӒxfCpn^ -7 tT`4&[pu<"6TL=̅aMe[$ -|wMf.M@cQCokP+6>Uۢ+po -+t8@\모Fif-$TxVd=8 - #Z]7O>kd*VBN - y+{nŘQ zĩs=e(Ƕ#A1V sݴ'^~v,k‡g s(xrQr̃p_²ĦOͥ^Ň'(VL] pc +LK, 0mf~o;R`IuB?CSһ2(.)SS?[®E%z)|6R[_bxbw^ؾfJ|iyZd^΄]jsޖ!qIu~C%:~P/ oTK |;Ù4iWsMeΰ%.qx>ڛrN73_4¤Km%B~Fƛ i&+!S;j!H0+&1s;tZt^1osVirR0m7WBa}U`9Vd+kJN"k]׬=WQe^᱊*#5(Q(L=s,L;- -x 7t%w@GG+0GMO= y( :@. z>-݅;&C ͸z^R?V=&jx=h@B-54,@a@ -\iRVihϳ: n-<mkCu1'Y|mkW4 - sXj&Jt2Ws,.6qEF8_n~Vz --4A;Z (MuT"a0-*EtCuH\-eܑΝ=J$fZyhw=,P4yG7yq0XGOg۬cL Ӄ wyeSyt=lᅸ,b]aER ϷK;x -~{WuL䎦>kGz -ڡ{jz:w^r/g7QGl.5gVkiuO'&ݟXU1ƗI*1_~G*&j%?)XiN.8>.v4!ڕj/Denix- &E P)5Na'bG ly#5ɏm9`zMӔB;09YjK7_8ÚZTQcBPt`Ш5ʝctaqt5b0XNSb394ZI 3kI;,KȘXIf%[IlbJnNϯ߿ڷ~?9x?5Kq*e^^!&g1zzGP(c7W|NRƇXP'|z5(xNꗟ\l_2HI?8}XOMD;PД PQ!ߔE j 8s:@)75_:a ̄RG,6a ;\aD^aXdU]V%;b^`ˡE&C>AG`[L.̑}tB߆ iЄ0!y$)Lٽb,4Ű弻HWe6.<I>):yևjW+|9&|K%{ú]د{1IyTǼ;z)\584 ;̷ ܳw 6_ վy92 -~QkY}T^Te}Ґ]v|p-j?z/n9Qp<8\DMbC򀃗y$NOo1?\Ti%XUx?At7nH'"2) -oCCfx,1dIu# =X̮UE=1N I[ĮI+EZv~HĮ3)6vzC3=ysS.v9 !qUIu6LwyRJqTwygヵw/{p;>xֿ]~D;i ɾ*"'J7KM {&3;ss-vIo -wU69Ѕi;+M؇ݑ EzyY10iX{WU筛<]~x|V&+0޾*0qf3W k 6ܮy) ?_Yuj -ǪV9>Ze3 _ w༢kH]eAOQc It0Q}\s~K~y-%9zw?U(R~L?ʛ(֜z=NIv -wK'Kq56wrbYV!RG z+(؇t0wAhB%_sB$ڝ(j#KV5Q0VGdhK/ |`lY^ry{JYjFH5%*Wlncڐ] jti.i8<5ELh3L器VeɻGa`_^ cueZ3]PtoSoǶ5hG3u4tw!g8hC-E,>צb"tccwQ,+`%ѳ̉~@G-ϳ$C^PUܼŏY:zeftoY8qOL-Ҿ3Vb#tv֟}lqKlF>PJx>/ -vFiskh~{A:aO䊦 -_aQYov(M5]^CF/og5R+TM\`F8&ee-KL "OtMLx@e $_|F1Am_稽 -D'S=Å?lO]uv RKtK©HQ$Gq@վ lbܪ-RV䠸9y8WQQM)-(rsr˚YͱaiS^ skIR'QoG2]6-cKշS:?r.Bt&\?qɷՐQ1YS%ݡgZylVu HȘb9[ `hO?㿟!VNo"GGT3>ME4 w9-^ Hv;{G ;#oaaK G~Ox #]c?Rw3Mpŭ._^6.6Bz۝,sD%Hu&2C|A"jj;!=EJ n?9<5B=ټS+yo|;>;ҧ9m= ':J5="H9EoZd/wPQv{q^ -ohSauqo$":ph+Ƿp#,܈$ȕ[>'$t^ bwaϩ^{2ɚL?7iZj9t;CFRo+!cG1{=mI| XW-B?*+mH𴏸8w.ot[𤚕mYnxCh͡'BjjҼU!D8@k:ZC JLHfȚ"ɫO"ݲ9JGQb^&)Y2 D[hrslh E.h['{t홬3"_T/6 ,:&4`h CKWJИM<,atMh׋e܊{ =rU^t_Pm|0G4\Rr:ܲpF:w@g0+ںӝ1P*0Pe@F Mkrࣜ`DߓInC]:P1>T]e/G0) XQCo@zm>)\4R>g9IlA2nD5K!ST2HnU@1$œ+M.poz}l?/Jہ5G"ྋ38!)98ThЄ(Os>Uch3iĶFCM "V[2i]ߛ{1fh.WCK/|o1LĔFS-X>&$=”ⲇi3ir 6c2r^J*gC=[ܣ0 f^t_Lo]*ÇJYm`xNmF cՃ@A0HC}pn]`cԃ;ék)Þ6h7Ž. `YSz pEhM#\rum<8ߏed dOO>W˶DT3:T={6:]ra)pQ`o]\8:㊞:r0oAj/̷ =@X8JbQܞ^wv{wEjbFmK] i:-"~o.`">D?{g F]+=/cU2ԁUz0^',Մ , Nho7LT\5BD PWx;M}g9S)i܆`K"w߂tA,,;aAZ)>kKA[HC~Sj!ߦEJsl:Dս4y:z箒I-iN7PU3uތǰZVZh40RW4Y%W3lOi׆K:6M4Y:<5~.Խ"Se#׋닯Ohx*X^ma$S="NSdVng ԇ{QUV gH+Xum"3D2zT -kIw㕑P 6O81VSBQSs(gC*DAB4 KVnθ.2Lg~5;*x#~Q!>OJJ0(SJ4ӂ֎ Cbbw+ISF34_5a _ueb[E(¨3ª {@,s]mKX*g*\&M,_)V%쨰pI -RtyRB;_΄1;{ѭ-P ne -uɉcJP`N3 ~O@PԙගIPϿ~OՃASb5?\2/]Gܠnr7y)\yҥF/ȵ>k;7_fږHj%:οE%=,68Q.kM>T?oB"^e(4V<ӨGOwn8m v'} ݩaZ~} ~ȶEv;ǯJ¤ƣD=vMR_8%W"TDy(94 abAI^719d`hAgsf,nb|ČXG5B<b=ƖOS8 s3 4Litف4eڇ-{hNUl g(R%pz$p*fg_#MЖ lAUn'q6t#Yamډw%"|ZᖈTfRH5#FaA ݇hN8ڱ_(]V|{>G腵{#j[Y>Da9}d -++?i{!b ?^-'XxD -L޴;i)&ܖ:MYmf維 B$]#ٲ19A`$=x\D}i;~jV. {>^ƪPY$|p- iaVIѽO`Y AX"}>n3K2aM9u7zʊx;dYrS DmuڴY[.@ȥ޼d$İLGPNy9Z9!I$2OL^O<}9h9L (Tx>ۚ`w-ЇZ=goܻhTn';&XC*)0AB6z"7`jcS>P1yko .̤CPLMD3,8>%\Q!xH ꋷw5(USrMc{Bk#Y*1bm55$`#%6/jq,OQ^TEvF7s;b'ɞAB+ŤђL/+%,S1myI+D95uݺ)CٕЋb-\ S.CD.fSF!jDfndwIswL'ScUX#ɂS J)Pi_Iفr .7nC -H5P4=ٱ SAO[T׶_Kr(H1TC ˡ,ľˑyNWʩRuVPxJ4 1J&M9 >h,4ԯ(#=[/i;&fH6(["&$v$x0@ݗl8U^qP-> ("crC㮊A21[h[w%&^kE`8Pި3,y@ZSphmFLU94E -,#~(:xOaPN5+L X[6B^v# i=14 l-j_lq!bY {iz76fGW-ya/T<(! -1*Uzu:%)HaNC AFAJc>h{*{Kp+Iǁql2/j&VD$&m5M`R֨7h lJh'Gӟg 4 e@ʤֿ?RM7-dUS)Vh`Lg5Аli)^ J8[hߩÏXϣvh\ïMt_wcS**1A&-X;XI -w@Y6bHGk-XX6,ƙSQ!zaL[h6gxO4(ev \ FX;uE LD$LǵZ!$|~_0]Dnى%HT{U]D bc,+n9LXQM`'nzet2@rbHN~T=H!JEL?Ty .'=H"SJ񄋅Ī&X pM -R;b]¯k'Kalnc99(b_QŦ;X{ɩn2nOS F1$}Rܲվ)JĤok9p jx. %P6@a E-#*%`E+,Q!_/`°ozjmxsH]̧ |]h4r -EY ։ HQ{o3"Yא4i%㹩Lɏ Eډ;D4R?JLxzX<4k 0ƅct"xSN \TcfaysA:7|Ȕe҉gabSN4D&HDk҉Zeb։DJ̘F$ -0 -1DupLHDbǬ ڬ>D(u@:8^2>&P&Z'DЎ_^?` aֹ0}vAL;[ έyӼs+n޹wb޹f޹j޹7s[üs'xvyyOm`m ;&;$&;E&;f"̡N玺b炅碉⑉ià:\5\<6\6\D7\7\F0\0\N1\ 1^3-R,) *?GNED6jӇh oDZ@HT3N޺1O n$G1XrCK"Qbp&syi..މCht̮5[A)8ҐMy!Qt!b؁Ou⹅9U'.n g4$-2Q鼲A yኑH H \!؟#ts"q Sֈ۷in)ge+O& /w3Z* $ZF['<{T$rO1@S 2ނfOJNOHskFyH x񙳴@hh5/]HA~ -4H|1 @\;"9} IQ},)F)p 93tNH1k1`>a!J :36߀y?+X=S5VO|ss{lB%+WvT%ϡ$^I\4G5l$uIu+o=+~7 sZc6ƻj+WT~֐;<c5L(g %-C8ESiB؆1c}.)%[ &V](m~iҬ#|us6L!22 9ȂB# >Gn J}K[?9V)15r>-igǶw` }h/1ƸZπP{}(8:[+ -M ;vAHЗS-'~ Z9CBx x/ki\aJ2+]IPߛO1+A t0_8W .9۷jhpYdXp2YgW> ۅ_WINb+6|z ϗLͷ43i>eĊ_n\S+i1i TQkcԔ&|PC&*fFed U%n@h:TqW_l@pR 5884_ICAGl@HJ=&WM k 2\ըPB ׷'3j+xQo1j;P&bb͚&6̬-5kΞ5q(FMQj5FM$QeD5'AE_&2ܬ0kH (u&D5QbMX.ք5bMxXf#ք5aWbMX'؄# -6aMxhs:˕m.&m 6CE Dٴy߿~ן I endstream endobj 11 0 obj <>stream -8;S=C0`_7S%"\noO8`:`1K?(.gkjkgO>Z(g[7.,"GQA!K)E&9'~> endstream endobj 12 0 obj [/Indexed/DeviceRGB 255 13 0 R] endobj 13 0 obj <>stream -8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 -b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` -E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn -6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( -l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 5 0 obj <> endobj 14 0 obj [/View/Design] endobj 15 0 obj <>>> endobj 10 0 obj <> endobj 9 0 obj <> endobj 16 0 obj <> endobj 17 0 obj <>stream -%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 17.0 %%AI8_CreatorVersion: 19.0.0 %%For: (Graphics) () %%Title: (黑鱼白底.ai) %%CreationDate: 2018/7/17 下午6:09 %%Canvassize: 16383 %%BoundingBox: 512 14 580 82 %%HiResBoundingBox: 512.519474100296 14.5993985160931 579.268412090863 81.3483365066604 %%DocumentProcessColors: Black %AI5_FileFormat 13.0 %AI12_BuildNumber: 44 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%CMYKProcessColor: 1 1 1 1 ([套版色]) %AI3_Cropmarks: 516.333333333334 18 572.666666666666 75.3333333333339 %AI3_TemplateBox: 297.5 420.5 297.5 420.5 %AI3_TileBox: 265 -333.333333333332 824 449.666666666667 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 6 %AI9_ColorModel: 2 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI17_Begin_Content_if_version_gt:17 1 %AI9_OpenToView: 504 120 6 1448 814 26 0 0 67 38 0 0 0 1 1 0 1 1 0 1 %AI17_Alternate_Content %AI9_OpenToView: 504 120 6 1448 814 26 0 0 67 38 0 0 0 1 1 0 1 1 0 1 %AI17_End_Versioned_Content %AI5_OpenViewLayers: 7 %%PageOrigin:0 0 %AI7_GridSettings: 72 8 72 8 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 18 0 obj <>stream -%%BoundingBox: 512 14 580 82 %%HiResBoundingBox: 512.519474100296 14.5993985160931 579.268412090863 81.3483365066604 %AI7_Thumbnail: 128 128 8 %%BeginData: 17418 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDD6FF7D7D527D527D %527D7DA8A8FD74FFA827F8272027F8272027F8272052527DA8FD6FFF7DF8 %26F827F826F827F826F827F826F827F8527DFD6CFF272720272027202720 %272027202720272027202720527DFD6AFF7D52F827F826F827F826F827F8 %26F827F826F827F826207DA8FD69FFA852272027F8272027F8272027F827 %2027F8272027F82752FD52FF7D27F82727527DA8A8FD0FFFA87D2726F827 %F826F827F826F827F826F827F826F827F87DA8FD4EFF5227202720272027 %2027277D7DFD0FFF7D4B2027202720272027202720272027202720272027 %7DFD3DFF52A8FD0CFF7DF826F827F826F827F826F827F826F82752A8A8FD %0CFFA82726F827F826F827F826F827F826F827F827F82727A8FD3AFF7D20 %27A8FD09FFA852F8272027F8272027F8272027F8272027F827202752A8FD %0CFF7D27F8272027F8272027F8272027F8272027F827207DFD38FF52F827 %F827A8FD07FF7D27F826F827F826F827F826F827F826F827F826F827F826 %F8277DA8FD0AFFA852F827F826F827F826F827F826F827F826F827F852A8 %FD35FF7D20272027207DFD06FF5227202720272027202720272027202720 %2720272027202720272027207DA8FD0BFF27272027202720272027202720 %27202720272052A8FD33FFA8F826F827F852FD06FF5226F827F826F827F8 %26F827F826F827F826F827F826F827F826F827F826F82727A8FD0AFF7D26 %F827F826F827F826F827F826F827F827F827A8FD32FFF8272027F852FD06 %FFA8272027F8272027F8272027F8272027F8272027F8272027F8272027F8 %272027F82720527DFD09FFA852F8272027F8272027F8272027F8272027F8 %27A8FD30FF2726F827F827A8FD06FFA8F827F826F827F826F827F826F827 %F826F827F826F827F826F827F826F827F826F827F82627A8FD09FF7DF827 %F826F827F826F827F826F827F826F8277DFD2EFF522720272027A8FD07FF %A82720272027202720272027202720272027202720272027202720272027 %2027202720272027207DA8FD09FF27272027202720272027202720272027 %20277DFD2CFF7D27F826F8277DFD09FFF827F826F827F826F827F826F827 %F826F827F826F827F826F827F826F827F826F827F826F827F8267DFD09FF %5226F827F826F827F826F827F826F827F826A8FD2BFF27F827202752FD0A %FF27F8272027F8272027F8272027F8272027F8272027F8272027F8272027 %F8272027F8272027F827202727FD09FF7D27F8272027F8272027F8272027 %F8272027A8FD29FF7DF826F82727FD0BFF2026F827F826F827F826F827F8 %26F827F826F827F826F827F826F827F826F827F826F827F826F827F826F8 %7DFD08FF7D26F827F826F827F826F827F826F827F827A8FD27FFA9202720 %2720A8FD0BFF272027202720272027202720272027202720272027202720 %272027202720272027202720272027202720272052A8FD07FFA827202720 %27202720272027202720272052FD27FF2727F826F87DFD0CFF2727275227 %27F827F826F827F826F827F826F827F826F827F826F827F826F827F826F8 %27F826F827F826F827F8277DFD07FFA827F826F827F826F827F826F827F8 %26F87DFD25FF7D27F8272027FD13FFA8A8A87D7D27272027F8272027F827 %2027F8272027F8272027F8272027F8272027F8272027F82720277DFD07FF %A8522027F8272027F8272027F8272027F8FD24FFA827F826F8277DFD19FF %A8A87D522627F826F827F826F827F826F827F826F827F826F827F826F827 %F826F827F82652FD07FFA852F826F827F826F827F826F827F82627FD23FF %A82027202752FD1FFFA87D27272027202720272027202720272027202720 %272027202720272027202727FD08FF522027202720272027202720272027 %7DFD22FF2727F826F8A8FD22FFA87D2726F827F826F827F826F827F826F8 %27F826F827F826F827F826F82720A8FD07FF27F827F826F827F826F827F8 %26F827A8FD20FFA827F8272052FD26FFA852F8272027F8272027F8272027 %F8272027F8272027F8272027F82720A8FD07FF27F8272027F8272027F827 %2027F87DFD20FF52F826F827A8FD0DFFA8A87EA87D7D7DA8A8FD12FFA852 %27F826F827F826F827F826F827F826F827F826F827F826F827F8A8FD06FF %A827F827F826F827F826F827F826F8A8FD1FFF2027202727FD0BFFA87D52 %2720272027202720272752527D7DA8FD0EFFA87D20272027202720272027 %202720272027202720272027202720A9FD06FFA827202720272027202720 %27202752FD1EFF5227F826F8A8FD09FFA85227F826F827F826F827F826F8 %27F826F827F82752A8A8FD0CFFA82727F827F827F826F827F826F827F826 %F827F826F827F826F8A8FD06FF7D27F826F827F826F827F826F827A8FD1D %FF27F8272027AFFD07FFA87D2027F8272027F8272027F8272027F8272027 %F8272027F827277DA8FD0BFF7D272027F8272027F8272027F8272027F827 %2027F8272027F8FD07FF7D272027F8272027F8272027F87DFD1CFFA8F826 %F82752FD07FFA827F827F826F827F826F827F826F827F826F827F826F827 %F826F827F82627A8FD0AFFA852F826F827F826F827F826F827F826F827F8 %26F827F826F8FD07FF5227F826F827F826F827F826F8FD1CFF7D27202720 %A8FD06FF7D27202720272027202720272027202720272027202720272027 %202720272027204B7DFD0AFFA82727202720272027202720272027202720 %272027202727FD07FF2727202720272027202720277DFD1BFF27F826F827 %FD06FF7D27F827F827F826F827F826F827F826F827F826F827F826F827F8 %26F827F826F827F826277DFD0AFF4B27F827F827F826F827F826F827F826 %F827F826F82752FD06FFA8F826F827F826F827F826F852FD1AFFA8F82720 %2752FD05FFA827F8272027F8272027F8272027F8272027F8272027F82720 %27F8272027F8272027F8272027F8277DFD09FF7D272027F8272027F82720 %27F8272027F8272027F8277DFD06FF7D2027F8272027F8272027F8FD1AFF %7D26F827F8A8FD04FFA827F826F827F826F827F826F827F826F827F826F8 %27F826F827F826F827F826F827F826F827F826F82727A8FD08FF7D27F826 %F827F826F827F826F827F826F827F826F8277DFD06FF52F826F827F826F8 %27F8267DFD19FF5220272027A8FD04FF7D20272027202720272027202720 %272027202720272027202720272027202720272027202720272027202720 %7DFD08FFA8272027202720272027202720272027202720272027A8FD05FF %A8272027202720272027207DFD19FF2726F82727FD04FFA8F827F826F827 %F826F827F826F827F826F827F826F827F826F827F826F827F826F827F826 %F827F826F827F826F852A8FD07FFA827F827F826F827F826F827F826F827 %F826F827F852FD06FF7D26F827F826F827F826F8FD18FFA8272027F87DFD %04FF5227F8272027F8272027F8272027F8272027F8272027F8272027F827 %2027F8272027F8272027F8272027F8272027F8277DFD08FF4BF8272027F8 %272027F8272027F8272027F827207DFD06FF2727F8272027F8272027A8FD %17FFA8F827F8267DFFFFFFA827F826F827F826F827F826F827F826F827F8 %26F827F826F827F826F827F826F827F826F827F826F827F826F827F826F8 %2752FD07FFA827F827F826F827F826F827F826F827F826F827F8A8FD05FF %A8F826F827F826F827F87DFD17FF7D27202720FD04FFA820272027202720 %272027202720272027202720272027202720272027202720272027202720 %2720272027202720272027202752FD07FFA8522027202720272027202720 %2720272027202727FD06FF7D202720272027202752FD17FF52F827F827A8 %FFFFFF7D27F826F827F826F827F826F827F826F827F826F827F826F827F8 %26F827F826F827F826F827F826F827F826F827F826F827F82627FD07FFA8 %27F827F827F826F827F826F827F826F827F8267DFD05FFA827F827F826F8 %27F827FD17FF5227F82727FD04FF7DF8272027F8272027F8272027F82720 %27F8272727F8272027F8272027F8272027F8272027F8272027F8272027F8 %272027F827202726FD07FFA8272027F8272027F8272027F8272027F82720 %27A8FD05FF7D27F8272027F82720FD16FFA84BF826F852FD04FF5226F827 %F826F827F826F827F826F8277DFFA8FFA8A87D7D5227F827F826F827F826 %F827F826F827F826F827F826F827F826F827F826F8FD07FF7D27F826F827 %F826F827F826F827F826F827F852FD06FF2726F827F826F827A8FD16FF27 %27202752FD04FF2720272027202720272027202720277DFD0BFF7D522027 %20272027202720272027202720272027202720272027202727FD07FF7D27 %2027202720272027202720272027202720A8FD05FFA820272027202720A8 %FD15FFA827F826F87DFD04FF2026F827F826F827F826F827F826F8FD0FFF %7D52F826F827F826F827F826F827F826F827F826F827F826F82727FD07FF %5226F827F826F827F826F827F826F827F82627FD06FF27F827F826F8277D %FD15FFA8F82720277DFFFFFFA8272027F8272027F8272027F8272027A8FD %10FFA85227F8272027F8272027F8272027F8272027F8272027F82752FD07 %FF2727F8272027F8272027F8272027F82720277DFD05FF7D27F8272027F8 %7DFD15FFA826F827F8A8FD04FFF827F826F827F826F827F826F827F87DFD %12FFA852F827F826F827F826F827F826F827F826F827F826F82752FD06FF %A8F826F827F826F827F826F827F826F827F852FD06FF2726F827F82652FD %15FFA8202720277DFFFFFFA827202720272027202720272027202720A8FD %13FFA8272720272027202720272027202720272027202720277DFD06FF7D %2027202720272027202720272027202720A8FD05FFA820272027207DFD15 %FFA826F827F8A8FD04FFF827F826F827F826F827F826F827F826F8275252 %527D7DA8A8FD0DFF5226F827F826F827F826F827F826F827F826F827F826 %A8FD05FFA827F827F826F827F826F827F826F827F82627FD05FFA827F827 %F82652FD15FFA82027F8277DFD04FF52F8272027F8272027F8272027F827 %2027F8272027F827202752A8FD0CFFA827F8272027F8272027F8272027F8 %272027F8272052FD06FF7D27F8272027F8272027F8272027F8272027A8FD %05FF7D27F827207DFD15FF7D27F826F8A8FD04FF7D26F827F826F827F826 %F827F826F827F826F827F826F827F826F82752A8FD0AFFA827F827F826F8 %27F826F827F826F827F826F827F87DFD06FF2726F827F826F827F826F827 %F826F827F852FD05FFA8F826F82752FD16FF202720277DFD05FF20272027 %2027202720272027202720272027202720272027202720272052A8FD0AFF %5220272027202720272027202720272027202720FD06FFA8202720272027 %2027202720272027202720FD06FF522027207DFD15FFA827F826F8A8FD05 %FF52F827F826F827F826F827F826F827F826F827F826F827F826F827F826 %F82727A8FD09FF52F826F827F826F827F826F827F826F827F82627FD06FF %52F827F826F827F826F827F826F827F82659FD05FF7D26F8277DFD16FF20 %2720277DFD05FFA827F8272027F8272027F8272027F8272027F8272027F8 %272027F8272027F827207DFD09FF7D2027F8272027F8272027F8272027F8 %2720277DFD05FFA827F8272027F8272027F8272027F827204BFD06FF277D %A8FD17FF27F827F852FD06FF2726F827F826F827F826F827F826F827F826 %F827F826F827F826F827F826F827F827A8FD08FF52F826F827F826F827F8 %26F827F826F827F827A8FD05FF5226F827F826F827F826F827F826F827F8 %A8FD1FFF2727202752FD07FF202720272027202720272027202720272027 %20272027202720272027202720272027A8FD08FF52202720272027202720 %2720272027202720A8FD05FFA82027202720272027202720272027202752 %FD1FFF52F827F827FD07FF84F827F826F827F826F827F826F827F826F827 %F826F827F826F827F826F827F827F8277DFD07FFA827F827F826F827F826 %F827F826F827F82627FD06FF52F827F826F827F826F827F826F827F827A8 %FD1EFF7D27F82727FD08FF7DF8272027F8272027F8272027F8272027F827 %2027F8272027F8272027F8272027F8277DFD07FFA827F8272027F8272027 %F8272027F82720277DFD05FFA827F8272027F8272027F8272027F82720A8 %FD1EFFA8F826F827A8FD08FF7DF827F826F827F826F827F826F827F826F8 %27F826F827F826F827F826F827F826F8277DFD07FF5226F827F826F827F8 %26F827F826F827F827A8FD05FF2726F827F826F827F826F827F826F82752 %FD1EFFA827202720A8FD09FFA82027202720272027202720272027202720 %2720272027202720272027202720272027A8FD07FF272720272027202720 %2720272027202720A8FD05FF7D20272027202720272027202720272052FD %1FFFF826F82752FD0AFFA82726F827F826F827F826F827F826F827F826F8 %27F826F827F826F827F826F827F826A8FD06FFA8F827F826F827F826F827 %F826F827F82652FD05FFA826F827F826F827F826F827F826F827F8A8FD1E %FF522027F852FD0CFF7D4BF8272027F8272027F8272027F8272027F82720 %27F8272027F8272027F8272052FD07FF52F8272027F8272027F8272027F8 %272027A8FD05FF2727F8272027F8272027F8272027F8277DFD1EFF5227F8 %26F8A8FD0DFFA85227F826F827F826F827F826F827F826F827F826F827F8 %26F827F826F827F87DFD06FFA826F827F826F827F826F827F826F827F87D %FD05FF7DF826F827F826F827F826F827F826F852FD1EFFA8202720277DFD %11FF7DA87D7D525220272027202720272027202720272027202720272027 %20FD07FF5227202720272027202720272027202727FD05FFA82720272027 %2027202720272027202727FD1EFFA827F826F852FD17FFA87D27F827F826 %F827F826F827F826F827F826F827F82627FD06FFA8F827F826F827F826F8 %27F826F827F826A8FD05FF2726F827F826F827F826F827F826F827A8FD1E %FF2727202720FD1AFFA827272027F8272027F8272027F8272027F8272027 %7DFD06FF52F8272027F8272027F8272027F82720A8FD05FF7D2027F82720 %27F8272027F8272027F8A8FD1EFF7DF827F8267DFD1BFF5227F826F827F8 %26F827F826F827F826F827F84BFD06FF7D26F827F826F827F826F827F826 %F82752FD05FF7D27F826F827F826F827F826F827F8267DFD1EFFA8272027 %2052FD1CFF7D272027202720272027202720272027202720A8FD06FF2027 %202720272027202720272027204BFD05FFA9202720272027202720272027 %2027207DFD1FFF2727F826F8A9FD1CFFA826F827F826F827F826F827F826 %F827F82652FD06FF52F827F826F827F826F827F826F827F8A8FD04FFA827 %F826F827F826F827F826F827F82627FD1FFFA8F827202752FD1DFF7D27F8 %272027F8272027F8272027F8272027A8FD05FF7D27F8272027F8272027F8 %272027F8277DFD05FF27272027F8272027F8272027F8272027FD1FFFA827 %F827F827A8FD1DFF5226F827F826F827F826F827F826F827F87DFD06FFF8 %26F827F826F827F826F827F826F87DFD05FF52F827F826F827F826F827F8 %26F827F8A8FD1FFF5227202720A8FD0EFF7DA87DA8A8FD0BFF2727202720 %272027202720272027202752FD06FF272027202720272027202720272027 %52FD05FF7D27202720272027202720272027204BFD20FFA8F827F82627FD %0BFFA852F826F827F82627A8FD09FFA8F827F826F827F826F827F826F827 %F827A8FD05FF5226F827F826F827F826F827F826F852FD05FFA8F827F826 %F827F826F827F826F8277DFD21FF52F82720277DFD09FF7D27F8272027F8 %272027F87DFD09FF4BF8272027F8272027F8272027F82720FD06FF7D2027 %F8272027F8272027F827202727FD05FFA827F8272027F8272027F8272027 %4BFD22FFA826F827F827A8FD07FF7D27F826F827F826F827F826F87DFD08 %FF7D26F827F826F827F826F827F826F8277DFD05FF7D27F826F827F826F8 %27F826F827F826A8FD04FFA8F826F827F826F827F826F827F8A8FD23FF52 %272027207DFD06FFA82720272027202720272027202720A8FD08FF202720 %2720272027202720272027207DFD06FF2027202720272027202720272027 %20A8FD05FF2720272027202720272027207DFD24FFA8F827F826F8A8FD05 %FF52F827F826F827F826F827F826F82752FD08FF27F827F826F827F826F8 %27F826F82752FD05FFA827F826F827F826F827F826F827F8267DFD05FF27 %26F827F826F827F827F852FD26FF7DF827202727FD05FF2027F8272027F8 %272027F8272027F827A8FD07FF5227F8272027F8272027F8272027F876FD %06FF20272027F8272027F8272027F82720A8FD05FF522027F8272027F827 %2027A8FD26FFA827F827F8267DFFFFFF7D27F826F827F826F827F826F827 %F826F8A8FD07FF7DF826F827F826F827F826F827F82627FD05FFA827F827 %F826F827F826F827F826F8277DFD05FF2727F826F827F826F8277DFD28FF %7D2720272027A8FFFFA8202720272027202720272027202720277DFD07FF %7D272027202720272027202720272052FD06FF2727202720272027202720 %27202720A8FD05FF5220272027202720277DFD2AFF5227F827F827FFFF7D %27F826F827F826F827F826F827F826F87DFD07FF7DF826F827F826F827F8 %26F827F82652FD06FF27F827F826F827F826F827F826F8277DFD05FF2727 %2627F827F82652FD2CFF20272027F87DFFA8F8272027F8272027F8272027 %F82720277DFD07FF52272027F8272027F8272027F8272052FD06FF2727F8 %272027F8272027F8272027F8A8FD0AFFA8FFA8FD2DFFA8F827F826F87DA8 %26F827F826F827F826F827F826F827F8A8FD07FF52F827F826F827F826F8 %27F826F82752FD05FFA827F826F827F826F827F826F827F8267DFD3BFF7D %2027202720A852272027202720272027202720272052FD08FF2727202720 %272027202720272027207DFD06FF262720272027202720272027202720A8 %FD3CFF52F827F827207DF827F826F827F826F827F827F827A8FD07FFA826 %F827F826F827F826F827F826F8277DFD05FFA827F826F827F826F827F826 %F827F8267DFD3CFFA8272027F8272752F8272027F8272027F82720277DFD %08FF7D2027F8272027F8272027F8272027F8A8FD05FFA8F8272027F82720 %27F8272027F82720A8FD3DFFA827F826F8272052F827F826F827F826F827 %7DFD09FF2727F826F827F826F827F826F827F826A8FD05FF7D26F827F826 %F827F826F827F826F827A8FD0DFFA87DA8FD2EFFA82720272027277D5227 %202720272052A8FD09FF7D27202720272027202720272027202727FD06FF %7D202720272027202720272027202727FD0EFF522027A8FD2EFF7D26F827 %F82620A8A8A87D7D7DA8FD0BFF27F827F826F827F826F827F826F827F852 %FD06FF2726F827F826F827F826F827F826F852FD0CFFA852F827F827A8FD %2EFF8427F8272027F8A8FD0FFF7D2027F8272027F8272027F8272027F827 %7DFD05FFA8272027F8272027F8272027F82720277DFD0BFFA8272027F827 %2052FD2FFF7D26F827F826F852A8FD0CFF7DF827F826F827F826F827F826 %F827F826F8FD06FF7DF827F826F827F826F827F826F827F8A8FD0AFF7D26 %F827F826F852FD31FFA82720272027204BA8FD0BFFA82720272027202720 %27202720272027207DFD06FF52272027202720272027202720272027A8FD %09FF762720272027207DFD33FFA827F826F827F8267DFD0BFFA84BF826F8 %27F826F827F826F827F826A8FD05FFA826F827F826F827F826F827F826F8 %2752FD08FFA82727F827F827F87DFD35FFA8522027F827202727FD0CFF52 %2027F8272027F8272027F82727FD06FFA82727F8272027F8272027F82727 %7DA8FD08FF7D2027F8272027F8A8FD38FF7DF826F827F826F87DA8FD0AFF %7DF826F827F826F827F826F8A8FD08FF8452F827F826F827F8527DFD09FF %7D27F827F826F82727A8FD3AFFA820272027202720277DFD0BFF7D7D2727 %202720272052FD0CFF7D52277DA8FD0AFFA8522720272027202752FD3EFF %5227F826F827F826277DA8FD0BFFA87D527D2727A8FD19FFA852F827F826 %F827F8277DFD40FF7D272027F8272027F8277DFD28FFA827272027F82720 %27F87DFD43FFA87DF826F827F826F827F8527DFD22FFA85227F826F827F8 %26F82727A8FD47FF5227202720272027202727527DFD1BFFA8A8524B2027 %20272027202720527DFD4AFFA852F826F827F826F827F826F84B527D7DFD %12FFA87D7D2727F827F826F827F826F827277DFD4FFF7D27F8272027F827 %2027F8272027205252767DA87DA87DA87DA87D84525227272027F8272027 %F8272027F82720527DFD52FFA87D2727F826F827F826F827F826F827F826 %F827F826F827F826F827F826F827F826F827F826F827F82752A8FD57FFA8 %845227202720272027202720272027202720272027202720272027202720 %27202720527DA8FD5DFFA8A85252F827F826F827F826F827F826F827F826 %F827F826F827F82627527DA8FD65FFA8A87D52FD0427F8272027F8272027 %275252527DA8A8FD6EFFA8FFA8A87DA87DA87EA8A8FFA8FDFCFFFDFCFFFD %FCFFFDFCFFFD46FFFF %%EndData endstream endobj 19 0 obj <>stream -HWn X)l`=y+Y'n|,H=C\SC3C`E/ -h{ѻ@{U4-2My4>H$aIC~G|`#b&O8D -}Eegw g?8l ƤgŠ= -o;i^Ω| PXq[Ĕz'|O? >#Ag:jpʯXK`$Cv<<+~8V!VqcwB}qUqM0e"gNy4 GvPrϨL~w)$9K@t'=C$Jʯ%郃m\C"+l; XmF -3P5\ndil@ Pz]Un(_B2q1*z"!(%JfgG>ad39\"F5'h_:1>vCˇׅw s֡m9 8ށo}TJ•l(/O_/Hvq20av`_R#U@$Яs6*.!onzz,8c{ :mî ߰R/kP'gg4Z:fm^s1sE'[(mQ.Gt@׌'0ðZ;puO{NKŞgN~;G e6YV#~,NڨWW;[CwiZHV9zZap{fhEZ]޵B5!q$2舶q+Dhusg8ȓ8˜f$vcyg1MZX/ơafcios#Q ;2tbm_܄Bǒ=u:biF8ĆqaV}L9AFT Ӏ*TEͲ^<v[달͚7P64Lc"p4JXgU5A9Ы1>؂><t|*zf:jr3e**f|"${%'Nњ~]LߣIXzȒIBXʎ~.=ŤTΚ><_&VmC$ڡzвQ`cDw -fRϴvΩ,Z$ kYLm46L,с5;Nf--t'UK܈-u$>Bz]ಶ\'IzZʜt"T&$gi6Q/#iFe]{ANEd.EG&1h~lc@@HR@&g En"$CIIL3)Niz5ץ$%= Ri^cEW7g6CF#Ƴj)w{{[=J?Uua5 SQ@H+`vRj Sn#ijw{v[۸ninn23$I8?胫g%]`㼟[5ǍxG+ XY/"".:2e0wVЇ2iH$R˔-V{Pr4p0*ߙAkUA< X#?/D#yJCYsW  y-%!g,"XdsХ܊(Ȟ؛MH2Cܨ!\S&tpzuAq w SV= .Z>'!zӛVq k04 "[&Ꙃ,i&;PI F3T"bqx[p3Tg`Q4uI"~8I\d |!w+? 9&(}FЧN" - WA,9A8tBu`)e4w =s.饁nUAq+[Q9,tع >5!{'/CF DH5 J[z֯e5 9#r;(VOO"-,+SIdC4kq`)Ʊ9wR%h jbz8PR 5pF iKH_ؚu0x~qqg~Nդ[zؘ0hP0p Uj$Vl(ʢ[ј.5#VTSc4Z@.85h0/T_:_- I6BPa=oHod$8<&bF%@,uMuJ>9|U FY|f/Qdߨ ,DO&#(:c \|zS(ygQ Db XI10ʡuE쾰ңȣl B$ȮFFl.+FF#h*yGaYs1#e35=F:LkU쪡8X7 -[ڐ8DL0#J z-*Pm9GԂlr- E:l "#p4 ,>N 6$]@@US茌[ь&4M*d`!;gGzOƜ%FHUb"08צ[P1ÒA:!T!*W֖J[,L.zk |_t& =,vF=h?Cz&nA<}M/E.],r\% ^ӗ\S -T"b1)F>@J>{eVmY8uQY V1w% ظ( -&CCZ+ l.l8ȓmIwI@kFۅP+5Dz%pH 7@+txW$6 !~K9ne:)[*VU7Lِ4Sa)Z^iigp~`n^䳜;% Gn`2 P `P -MuCgo9ӧ,˦E|U")4JHC58h ;w}.fVxyѦ{2V$ȘVk<] H*A'arKwB ;'ŒFbH -^I5<X"΀W L,,"@]0('Ȓ *2w8`Yg3靳'cVy~)\,HZL ەl}Y$"w-߆ыc+4l@%JنwYq j\^[TO'ܨdg&7'4HJR~;UK ->8~(`M$65&u5V{iޫ|2™9LL~B~Ż~ 9p#:-cs[) Pӳsw2俙9h?"tCg97^@! n5 `A S[(Z,؜z9$dqy|[Ace!ھۣb='Ov@a@6{+;`r`"&XP I -q+BPuVO85*Q{B4ȋ>->ecĀFǁ3 -BG -k =h4h u hzh,TJ @',4tҩwL.TQƈߐjXpÀmz[I@ | 3o"zyu&YhvΩ /G/ƔC^º@ݥSC{c~o Byn$ZH,00-cm>aKA -@^5vhR~Q$+|kkِ/g>J#۹X -P$}1|&K4h%!ؕXu 9 oH~S}HqłɖۊM}D᪗Y=<eЙihg{4]҃ڏl AcǷREqVJ 6x2Lwi-~:hZ vZ [,{{ FoXA(wEjⷰnDk \͉ۗqTZvoj50 gXy*k >Dkd;KD nϊ-q_T&IΞPA&Z'(dZW>Z[p:Ke#?g;kqVJ.5V-QE.I8뛕;k dKQNj+駘>]o8eO^İ*2kMk6L{]ifN,78͸BN[H/gdi7]9 #M<{mGO|ŋ+- Y-XPQ@ɻ.^g7ߘj{ˠ0vjwXu'Oy&6.cpl ;MϝpZgzGb[)i&AR{gljˊCD"D/k>h,)?< - -ҏ.z^.2hj6q3׆;)&/'gׅIXAe)HR|4d!ZG -X74(݊LPBk"R ϩH9>t0VY?fEϟMeORQ۾A Puc+ʙ(v}^?,F*~üw zռ<~P\b9Ƚٟ }e -R9O=밠/iF@O7ג] y?<$W'5N]7\:%]Ykt%E]No mIn?Y|}aXk_"c؏σ1!cȘ~=^-4q&W)!ZCo)(orAsjB^~}Sߺ29CJ -Hd6"I2QdKPf7RVc- ء+#fO<#W\3L9ӖN[N.CFW<~l$Xу&4|.IKUk>(A )ܓ]lpZ–k(a#~hbՇ'pUS`l!?ʜPQB:M#GPX[o*x%!zd nzW^oq=~7xQmp0-qg Gg-+W%fDcQMQ}w --ѨWZ2ڨM$zĵ:kLJ_˘!K -ȸS69% =/>N>u|N;ASSģ4lҠ&˽%QLhTw%JؗlhlEXGaɸ/ц7tWuKƽw? r-~d$d~H~ѡNY$;-{otL3sDL1?a^iP &LЬPHڐ!Bax+ɛ$$Y6QQ,3gT=<O;%%;l0`g~d "E@ɢ^EUyqE2kOޔkmFQq~sUo˝`P8Kk*ZBE#QE _,-}([aX47,Gl" -dG*dpxd͚6Q4. 1'*Zh*hPfWJAm|M}P5Irlhp6W4P4X8kaMƢ9v ~iߐGծ|u;mgϙdžn*3̧ƃY |)Y0$e bY.$( =Πj`eEc'g 7Q9zaN%'4,Y4_|_Yo|ßbϚp{E,(xקxM1X5Y/bgsP0C8BBqOᄟ܂! -4,YӰ6C#(BP䊪Kq| ;d'܎`/ԓ$:BIE4!WJ &:|^IaV`/3 -A'){Vח+~]q}炕ߺgᛘ,c|Tr :}V(-GIv;Yţ/7fZ,Lo,v9iF,twʍkӦxfL_Ք^:+'';q@|jo> YU7nܬV2pZ,ipˁw_5 ֝xcz̿K./r/Y{i^kg$v5vs:/URVb:mBJgՋ4;^ -{h,~p.K$^{ΥKA,ˍK3}AL/RY{ŸN~oNzo+WoK|7@-ec& _/ֈj"?|biJxr=LI=w> @Ov[F,u߻:9:eoyC+?U?[0MyX ?_Ň4y-p}w$~"9GܤK< 9%Q5.bHRZ}J5lb};il<Җb˕ֵ2CLYxHi2w_Vd7HY-wAjUUI{ӜIGϘgD? e&hl㭪V?mkY:EV\?ɂO>I +bΣ ޣNI{~Dgn[A~MO~/ -.&3meڍ2F*Zm4:a ` 6~^ISr 2z5 `gفx0xjC--qb>X/ìNJg^*B&6uc!֒;C٩4y:\'A5OSC`'Qp7eKxdM1Av?0Q5.bqFG(0vrBvHgk7=ց#E:4j|'/C dEO8r:WBt=Rh84x'iܺx *mGsɠY*^",ti(/%˟pz'1%&Q.QpNcMd,o,wiyPft%B5Ka>E %j *84%Qhe؟J -<%UءD܀uQ@0"qݍ*FnӲJ tDbAM2;OV(rWF}z1Hί\%׹yԙZWh5/jFNF[(|۹}ڹ=1ஙx)TgPqO^xXT v#fMJšxJ'$,pV[nA(Se%vqS9H `Z] Ś2ߧ{;Ŷ$ {U{Kx8`\R[lS[Ҧ6:ێ\_TM5VN PsŘ2D^t= Y4k!,> )[pAEBLCh1. GiaX5~⩤D"zDʐb8fYI=+r9%|-lVC_:*39XCjQ^eJK1nlCÕ怌lhs:Sb' {E~}Bٗ;;5n -Cb"G)GX0NE_z㯇9`( O^\ -R,_I>=e-VTZpCF`}Oxo[k`dA˧ 32n` -u\ 8cMo{%=>p*သm4I[R5dÚ_35`@kHv$2D0pB -!N%c5=`-Zk/A"mØQ<<51o]ʂqdF%.o/0n:p ƃ߂k'|7xϫFǏuj_X'խꋿ;ؾ;J+s:;"ncSN'KpIn /x3RUwgF`"Pʃ׹xwEGyJ[, 'fӆ˩SҐJz IT8b;O}wlj;vKOpngSh -45g'&?/ʠ?.C%JGUIA)uȔ rz{s;oo |wє *B3:qbst -6#&۩e|1ՌvL + .9 BBAJ}]$ay1ng%^G jn+xXmוEF:J\U`\Xwy qo Ɯ".sAۏ_V8M0@SHLfȪ ҂_\za -,]U}ȧ94(AC m U_-Dn^-2aDÍh q!ِ2=AhB$`@=DNB`P<3=\u)ͰAW7HStȌqW%"bE=I~FD,hpT{5q)m,vdhɪ_7'g`slb'"Cf[M}ZF4ۄ),;*^zTLϏJS{?"|_\R#*p@ˈ g\PB OI$0,l s -bTҹ_cĭ=VagvET;sws \Vԕ -oF,XTx[yO1کժ _jIF'C -# deuz!yj(}Bќߖ[CnoKLC9y; =K/hbl:s Zňy|B_gm~y -sO60`F?w 7Oŵ "$5rytvj'ijDےϼ*OTs#[kЄR%d% -oe{V0_OB 9d`~yB)˥¡S0wJNFMURbS_D0?r"MxVd ɑ'DKXΊFJ»%91C.K6ߜZˇtf~4>Cd,"ˌ1By# +$%$"%5>stream -HW^L}<@H $Vh HE,?dyofa&Lk6A-uYXZvbֹ`a{|h)T.Fe9jUrѾ&eI6MZe59YzeP +rŊiPsƽ*]fWqS֡,O&jNgQJku޵ןVdl E$f|e)>9Н{T= -XyN\|k< n'] d ov"m}|UƱ"dIJ1>%*%"Eg7\;Pg^^ZyOI2/e\WAott̎&ӆ%5$m5a5!JV^\Z{3\ckE%ơȉ٣|2]xIGO&ʒ ԂH* -J+aB'J:'R ȥɏҜfw!;rɳB^l8T}\l&<+dKwQ٩e-nbQ Bn'&{ࣀI%dLx0Syyhdپy"0Ur{ ۚ$3eKs>r^2z!X?a론8¶~Ycu<ϬZhU]]Gڑ$wcN9;9+{۟SSVG:YFpNzG!F[Sr0KSL㤿Y. ~6et,Q4kFQ*j>GǽR'σ IvЖ R's3͖ ɐ_xI:(aAGHy cp޹_ 艟]k2qH2J+Z=UZ4kN^xv'iǤ V$\/ZǹIt$Z ƙ?4" G< |y›c<%kh!.:"T\b4-?S!Kܽ -.)ןL^+ora,bw.Y-ڹrI%QxBҊNAzxR6 '?6v{z؂~sCd*8^hjph3f}>U҉] Tzy:Y$ֆ\ANRU1{abVC,aB]IR+kmZv;U-g1,#.cii+tdRr x OhmRt W(lqrc Pآm(}1KӁ5N(MD̑@)͋J*N'`q K-7dەVW1FVvY~A}'RcmVE1x<[ح1 -JWNxRс,GqI>łyA`  -(]%+O=MvNm͂rR$rYm.zeiNߦi!*eK+^KPífZXϔ4ox@+;o(+ #X#(O)`~}Q^> TkE._p}e3BPwGqBG1W\;{j sx+|6t(4jB -mH"jB4-`&DVm>ֆעqW\D8CX#7L5pLnr=ʢ&L4^R.6o^?Li|h 2*Xbslo9DcXm$"s$C9WRސQ ɜE͞fwå"X>ޠi qJ=^Vesq{=Y5urX}7/maa!WFiÒjrې#v72e@@9aΊgF!T^^ZEms>X X*j̀cu3Jˬ|(g>oY!Y^Y!1hiXf .dgO >GP9WH2o.TWQoHL@䪃XϘ5dBIWzJ}bQc&K{TM100{v[k> ёPĮnȁ5{zhD#?5 Xb,H/p+z|ƶx-l@i*Fp=]Ɉ|tjg)LSwA`p4|g$Z:_@*Ex:ecT- R:p ;`@_>4ˢ];Ja;n QqZH[t"!&8gF=0:*RmK֢1-s:#[+(kUy;87Z?Q V9C}uyqai'a\Qo/U $҃ĩq;j>9}_ã}hԩplAWÓb}-&Ppm_Ĝ_>E]qu贾3?OqܢP,|, pI`Omg.CzZ7ۍ4YGjBLlBN{ѻ [i턨6GN'ł2Vɞ 6q5Ft("_f!7 -g!/BHz[܋Vߣ4sܨv |ycNӔĆtwBxkd7ڂ 1ŏN7UmsGRGՙ^zѷQ>K.=ϺX.;X[% l춾{rNօypr^Uk8?SX0ۥ?j{4V'c271 R~ kg(lUsqɰRI;:BtC._%0+#$D 8Ԥ3w(? !JL_hxWNM~}۫MmSmСBN{\7=p?UȾ Y?ǾN^B`x99Mˇ,b{j=Н- JbǶXU6{͝,u׷i낼$RqOK;l"ЕN)ޘ Zk8'p j5\ DрڃKˉ{eiDOSU͗쉺TU)5&k!n:Q22}WmE E[ $u G1% K-Dg)a;yO:uw9aT:%6Q at!cPP{ʞK !nv6փxo4hfBCi7+AGy&N+!rgOu2 Bg+SVPy:rτtևN{RZm %ilTv'0>$.X߈e64eH ʅ䖃]9d s{?-g^epEqN&7=vr;ؘE"Z6]r6_󄏥kz@u'2!u/%4t3};0CRD-QjJWC Rh@hҵpy'$3*s&z"pߙhMu`Y9E{svq, 9Hʳ꾆gOhPYSm; -Ǐ+7Z3d8>ꮍv7TEPr<ө -`=@モY"T9`6Pc7-#LBLmggKA:!=_c駾[phyhɖ"TR4 ŚWo*ʛ_DV뷽*ًA hv@]I3Q?F\;#I \6KDa:˱Cw9H?Q7mO^mWD0Z$<,tuiݒE}mкv Lt(ٯ*iNC* ??.nno#̿1Ώ -9=ZxA{2kI> `$Kn5 YnY'*H!_qRh6$bvk̢+;<9A K@K +-,zw eUxBѻr[=\xPf]B{jJaQ`) |]Ci5F&^Ki&OgPUwEDUӀ8za^bӘEDՊpH3J{rqdXH!0^2Iк(kJLبOľ G%e lBݪa" FX8ހ_nۙPOhcxoؗ5y3Pɿn|u|-?T,FxJ=~>@ǬrPJj<)-Uzx8&GGJ)f<\I! r_JX[O;$HQHgN! ?YI&=of*ȧrvհz Jهta՝ˡ'O%=`S3|֊_l0L\''vԹC{Mɻ5 W|l)PFqS8/E~);מ(L|@q1\Tj1>vvbHɎuct+8}9gT>s!q:QQGP vy)x8o'yx〱9v -%E徍9RI kJb'b2ս)jj \dU;hoU{:P;Ѥ-q;&#OӰuQh=䶩1tYoVݕ2ZWK ;;a9+݅-oco^{<˥hoo:'O,f%\iG `)pW)`hyGgßP斊*,̱ygܕ^r2u-wSLɻ"-\-[e%r3"'Bsx-c jf34b|hfޗ-u_䳟~@ 0f䳌rA"ȰV'Y[+񾈌&ގYJ46Xpi3/<[@G+Q(ȚƷ\ˈ!f@3l4-LQϮL?c4dz5 B3If~3dhA { @5?BFf}g8H=kB2 !-?o lA"|e;MyG cNnjcXZU ->ZmT!6dH*LUVIx FUnFΕv/oqx`AZm+>(0 kQ{GȿAɆWYkّYaHj8:.7u *{^GDcFrjR ^c/@ LAƞ"X]K"`5AvE&~DŎ놪t0'PtY3 @;^0܈LRgR7W}S< *TMUKe:-#VSDa̰S2"޺0v̵+e@Qmxw --> R*,BV* (Ŝ Sg= -_+FSjL/z3uhd5Cݼ\V/$n) aM6'd"gN˸_HE@WѺO"pyrkX[MYۑއ%3ۻKN(h5կrzȿzSݗ *˄=7K1\Au_ʘMp}o(k~li;n}3L-q=%Cg7U>x2\Y"^I$e䫐AkZ+/H-/u2JjdV{ͼxb/-YLG?QJr& -ѫ[ \I U^!NSytg6< MA$Etܩ Apwhq= -czakbHZFKet,oA: CH[%3T9z_F㡿f +3{ 1O<[^g`(,t? %D(/Yi>:aڨ7f~/u]|G_'!UQ..B9u̢B@s%#t,u'[K/A/b#nIe&VIuJo9I0]^@UY%KJٗ2+kYW-xb<_F'5QY؀ =IY_ZKF/1l *MN\I'f f1&l`m fs9\`n1bn BQYY_f~ 4 &2/(P:˸aW A_RY -$whax2GSN -3?C3&fBSXjoiMZzx>|ɕ.A^ Az0X>I PZ)2?fq])pWȘb=^+k -.g-MA]Ll-wiC8Y8`I|>F"%vXޛFWbqfxz(uKi -^ÚGEÛppg胍(;G#/W"QJ9jf5c'iLo.F{%S7kx+ɪ#0QotQ3gא[}*)Aŕdֱ{Z+PQ:[bݧ2g=ZIN#y`^N> ytk.ƪ|~GlvGxtPpO!@Y"`Rm *&'S2X]Q3|n;ߩ C-3]D&+g煇nMdrvDgmylխoU3:^\Ѷ0rd3?*;aR -x0ϒr1Y= -Tpk])3a{AFwL[j])hɛ,b.IHf}ZA,=:v̴ 5O_셴H8ZKƽ6>_+It)7)pL8׎+ b 7:T}ɴ#FA>OWxJݡ­*PBTWYwkJ#FLvF솽SVA$gyL7HpImH)|s5;᩾}eNאּA8Sɍu}BQF&iCcj2$Il0ۇlCA4^_:AC=iqN_neL+wh=Ga`~iAsB)!u#EA@k68D>Nɦk=@] 2:n?TCg,*eBG.ƎB&)DUyQ_d9Vs3©@pG6P>} N_ҙ5 - .hՑ}T1ȉ`'6TgW{W Q8o -ZRmp "›R"An{JTp wѭ;-e)b{OYdeVcί IJ QBRjoo^O3ƎQ:ӪlW7OlةE[iɀLgZ 'Aud9bGH?"i⚞~u"COR$S4X%qObvV-<^B{}JW=ka(ùQq> L)45s;ˈ<¢0FȌjӘٖ'jg/ASX5 -)ʁ͖Xk>a ku ud BDbL,Q4S|Cd\ȖU N-A)_C%LkS&2>B#"s1!@b2&ăSf1VM@W_'u0-#KoBv9tq7E)g͕ݪ1#QSO{0NSuUNgkCMjs11ha{օP -D{h&x?/f7̓nG*Zo-ސٗvwX)zN2 !'-A7x? &L:4^Ke&/dd5W3]@G#.HO@R{eDC e]S2Ehl>`7Ƹ/,/]JZnwx) } J j,lGZV5.iOLoCzoG<$ 5E}\Ը+;p5'U&K˒YrI;='Oo$ J -sy -g4W$/🶈<@#P 60" - -7%bĆ&9BAz!Uoj2*'ur{%H2!cFkD -;d/W])sRU@CMa IֳzuzX׺a`v6Al/K:1~"OHrD%Չ+}"'5bN/>MxI -:jeUOpޡ6.yWZ B5:3?*+322u~CPp;]ǟ_?G;/Σޮ?]{?~xivGm15f{2ͣóƯW*W{}|Iȏ$ۏgnwkY[2`ެoֽ2 i*=={Z~Yx[`{aP;[![zŲ=|Mo@zkz6Z :@okxi¸wѬj1oDI[3Zu*n}U kbXv̘Z]Vw>+CrFta=f!x\vE:9TC@%>FH-g{хsH]Tt3ACuNC - -$)DLgњa@#ސ`QH B 3u$9է0$Ci;VD6 -<$uCQr09G, 9v=`XwTgY&{v L ;1y&m #iE|4 2 &|$e/&IF4}-uy`rOcuXIc`qE 9g`fVu0 ̄|K`3 ybC4XH:8xAɴ_߅yR<ЗQ2EaBm`4=MB45sX(2z0HcBc1LT)K -:,#:@"Qa0Q(? HJ)aT]&1 ABR=6d7A6rn qҸT&b>0v*σAa;Rv4)/(|0fF3.;ͻ*B"_DݧN(f' *e\A)sqj()廾GoLC-t, &e6FZLjF1) ,%S{1QJrL-^1  jqS3 -huAFkŢ%j:G)` 4bCä2d09EmR#+\qp^yC<ڜ0p쥋Chbh9yjapg.OAh !bAI(^!&e:rEi*+<$~JǑ4 T^|!#hmLMCx|M:TAVSR Rln[Ţd~3 0HzYo e ,+kȏ0`UXGÍI&|Pu:F -EH{Jͧ{&(9t؍M(^"͐XgH3b!A5 KY8UQמR=Ӝ|YFkrV4Jy*xI+dAe93A# -l5"֙=uV7bTMj@hV`fvSZo䕕{?}G $ك~0w,SrXAaAL 0oi:+6Bx10U`.>aYp*r!xTWt*#r#AY˃A(g28ힰ'0Zn|#~>{-yav0C;7U#`0᥉Tyca!FIWd KQKMօ_8od0>|4(TALNSE?0[w[bDi -;#1l'ƍ;1qeWuA-1FcN1 }\KZPeZ;h-Y\Vjx7Cb458`UH:ϥ~u<]Ƀۼ@ G]΅MLsQA!M ߉beVrհCy -]>=6ԾPt -kR!<" x3\!dhq$൴հ k8;jڪj&%84uwq -f4]5 a.X^?hJ5GÆ2)Ewԩ0;9KS|j?70 }<Eϑt[&vpc} N֥]LwLչQs CF]@C!soio[H~`na}~_`!8e8Gu2SҷMοqC!`# -I .b7N` Ӣzmaȱܶb054^H-h -QB˭k$ -f,XclSUW$?4)8֎Ruw,]TϤJk|r.{_uXbX:-1ֆtù;{X;èH{^(wS"SjȈ3!8Mi7)7ͬI8JF?M:38eW.M>]'zd80]v W``:O[M16wi -@L_ -Yуc(E9iL,*,ʖb)hSt$yuyWU~!J3,FŮZ^!Oy8blbEFxųt&[f*55+[ "ƿE9}/DQ]}b&@QIͻ n?S`ac*؞pVa, -Iև`>'`%{m134?dF cN ^3-[}.&Meyb? c[ˑ[~W- ,W ނ -!-]h11}Gq#j6Cvszj6ca~z^ƋZ& bPȄ 2¿G3Pf}P=ƿaL̀e99"&\C,#r\p|:{4qLޚ:a -d0* V(X2BnFu -!J؉lPwʦ쑚/oa"Q? -_i ^1:fCpF_$gW0s,1ƗqZL-J<4M<RMC qgi<0(#Ϩpzf)) a; -ybbL&USc_K-3KMo$j_r11G.:^r#tW%1'72a= -{~m`W$1EK̕<=ʿ!/DcG>0틢ßP5dGD yԪ 6R [Wi=3P /b̀'hf(>T縫j@\=_  -(&@fbToXT0EC=9]YXR9OB^GT-DQdZ8 ND0Vy%r@Q_85-\'`Z ( ';ƕ)/% &L'C!۪U0Es; -8l'N(o濳igӺ5d?!EĦꋙe!(a%'0 aobU׭[\U A: KP3[*f*̜jh D|@2 MŽP5Ab\hgcIJ>+¡&] >u c`h@ab%ȄbR+|*=` `zNb`փa?N GIǠ-bܾٚzQYx3\b !2א{bx:]!!HN ;`u㈁옃ֵRKN9*! JvͿc -ܽ Q땆x" )a@<2j2^ul)e!b*-~lckb=}>›xzQzi/NbA"Ђ -MC[J5ũu.3bs}lPxK-01(y X ͆'ِ7:F!bnf,O(u_ 7 zJ(] &KmAdO!pM+-ϴ3vK=WxL95!WΘ&@Y_+TU~\d#Oxq2Bg|t -zE2|d`Hd_Bf CR ^dzĬ5 sq-O0Ou6!5 Ђj ÝAy1=>—qDoal_\t{YDIU}ߊɺ8 @dg3ro0hB0G*)f!pxHU^ $ATȬ,c]bPL rl1s>UW>гqaVI 3x'AHU3) O J|Ijݵ[aeFk)4+#} -YKWr --T6BWuߧ} Q[`d( _ /myЄ&}L .c1,@wFD t C@xI}4b'%/`5}}9)1ɏʍ񦕄%Y1 'yesŷH11䉷q6IctznS"py_瘵Þ0}zɬ,95JkwVQ.Fݘ'Z30M[Er Ѫa0 eWs',zs[a,+׎g`4^^f)S">WԳkbPBcy;P}&*=ɛU? -e0L5IU"KDFU'/afIp9Ycbn<XJA 6b3 *FcxfFCOZ*v -^LxT^׍*։è*:0t*PfxPP -9{~3Pc,l},pXӺ1o^x5x,4#)Faұ{ƜnDQ=H oEFOJjHi ?X:M-Oa?EHk6FlNLX1 >´DؓXQdXV U3>Ql91WZ;:݁8et8EXX04дn Gʫ80)]1v Ưt~ʥkbm|o-5B={//@l8e"eJ<7 -Q|T(ו9+k7 " ݩ #ְSVriqЗ=0?~w~?ߎ_Guri{*+e[D)c0bq^B`9@W"K#qbh(Kpao l.;ロ-1s%ID(,*@#g%a-D -7gYʨX02d^YYsè5y<~+J+ Q;X73 '"{9S uwG,2g ,m>ܘƫ& .WaÙ -_!l<(ئK:pYd1Lm;96~_u0q|HJ20P:qɅb]$Υ4%#VϚɮNz: ZrmR1Eq :oވx׏I<:ogJcۂ$pN'*h/Xm8c%Fҭi~t cArD\[f a,!68[cOʾ.ɦ\gQWFM9ya"@M'diw~5k0x(ߔJ:S,yUJa0ù)f616nM["3;,mC543v9݊%o1)0IVN2!sÒޙdRrI;'=*leDG2D`3q׾2 +E7)^qQVl$V׏8xsu8:jϓ~{O8Ò[ Ay"}VQ|jO*5@usdqcʎ9*s| eqɥ FzrǮ3BcOF&11 8~%3 - -0H]O7*0 -?.%'[J`IQ>'fnRnlB&0y:+gKтSG9)*sǹH<!ϲ07fLR\>zCQ[ֿ.H(Ie2&ŵ0"ODI.w&=0Z"uaZ4Bd -[0TEW6PS kT]x`;}aF! 9UslN55(@V;'uNVaSNӏ^z1ag1LM%w.{$$C7>QXatԹxCFGنv%8x Ty{@d -+ {uԻ9#1X2q7s0/5D+E Ϣ]V=%LOw@dCʰJˀj:b$ v՘bNBMMKxv}vj8dȋ(b@s)}s4VT瀏ygMlrt[~:[?ztU*\H)V~rj53:56հVS3il7_1{EdoyLjrR\zLHM˶X$~o;zTYXW Z>X52v: (.{Y& $W5L|%0 mn(J$|RnmBNO[i@4J5"\53~`̆?DqRoF9σ_kM-߭2Cy=L1PIisX_(&YHړJO(`5{/;"LP_{3-]LK~`z"!\^i(9w.ru9]pB| }%EF7&5~\ pqIhG]Xb&2vj<@;/ZN>HΛ%⊃sB2?5ϡ|NZuc2e1s/Yr}WOVj{zfb7 JFc"RN% qSUj@CzA*_e9 endstream endobj 21 0 obj <>stream -HDݑe)-Xʂ~|ZKLLtW!R߶5}E<ǜsjbGHwf0?ձE06l07l\6;WZ.}7_W̱jq%LU͝O bHADVnkV]L$'$_$wrU^UmE|5|X Cfq?O߳g㕼W?kinjLcA0_LԊ 3+axhB^bfMF07EBnoyyj.q!ZkZׂMj> y!foqܼ)SU_47" %H0vbt+J*A'Rs*%Ȩ SQD 6ـoFﱮ.ŏ~mNs!Ra3?QZ_vFhb&TZn/ūIX~_XJNT[UavY %&5u! t/ߝCRHCu( I Bpu3AӔ@u] rMFC\߳JVH&n[ |S z)m3*$Դ(r1dg%G1bP!t oeՐ{s`) m70ǧ]Hë}T(&hf\}i8Dգ @ #nS`6mDc]KF).V04^/HI|RWJ 1=! nTDDe-^Bd<(97ƐފߣLMD -?Dk A#99xGQK `؅ ycYQw -IɽtfX0^& @絜؇]49n⼫[s7_ba`DI'd)s+.,0L ,a {8gdKOOZK0+8K` d@gS Y:0xU}!-31J0{R}9Ys4I$T%C!k $΄~!tPA-aA̦,fje'm0EsETY2[^Cn8*A,8E]~j -Cv]%>s0Wrgd+ESj2)WY]-+;吒cxt,gG+V jl0HYo>B./?ɘn||xBqr-!艺Ta0iI0-|trahC.Sұz;.tZW(.JsLa0  /im^ -DP'L of Gգ. U1=e!seh'VS]zΛE(UPaeG4ynK`ZE7I!7ADsƖ(*M[Ő>FD}>C}f #MZMQ @[Ԕt#DZ.PL|S{א8m pJEÊH8-Kbю:!{B6yzLV:8IU :"48 w\+ʥ`\},Qdz3ed "mM yi`%PD7l.|g -lr.ftK5/w&K;C>v\V@j6IX|o ;iF$ a>U`2B~YO{K.&j_DCclp0%ef|1kC8gH<Bq1ķ,aߠ#AӴVaaj]CA }L{"]/Tp/`x2 ZKYC4TeP1/t:Ydv;>kNZJe7p=#C\( Y8SVE~5ߢ|U!O`(V㞝%!1ؖS1=Ҍk CşOs|99 %RRJ)-`UæG|&鱁u9#dzb Px DOZO¢˕^v=|JWۘB33aFO8]zT!%vbaMwɊ&gz߰ LgFz^:wDiS&,-#,1~":0x4;t l9O#~yI;)Y򌒌دYҤd[2 c.4:NL56fF=7&fx-W07.̝SV0Nuw13`HCi>~M+Pq\ D]^'On6.WXoaƓUhju%/*`* m!o )IG`Fi^zZɐ~,\3 ϻ3E=sx,;\Œl}F| OA$͎1.u.#]6rOq-OؼҕY}a]{L\P -,lsH`FҊ(ތ c(7[ƾT -sJZˀqT®$/AE$rl0n1dy\u6q ';آTb)K%˖0*W<˦@0Bi -bl D4 '%`}la0+$ Ӣ"7oSP h @TwD彐 0'kwaQ`b0UpLt / s$(R[īOup{!DP/;; - - nSkaP ) q܅A:$ gWFqD|12X=vlxӝUd'T ~%Z.+B9#6d?,SjP` #b# 눳JĬ\j*f )x< Fw^L̍Fn~Hb9bM -+'ӓa:.MZ}ٌ;:jBtWG$!ô]j3θ= o)vy0-3xfg18nǼC^ԬBQJ0 @ydLX,!R#! eDˤ+W@;A fQK2-$6v'_]YE3AmJ11Y{Zzy]܎ʷ8ӟ2 -&)NS_Kk~0?|cO4:X2w$=1v#h[0Nz J5?tyŔ+j"Xgd4^=-$&ω25G0z_`Qg5{'9(II~LsG%&FN--wlL nȥZqs%7M4Q;QU<c0YKLWRq,0AFkYcE2l=(f\oړ( r?ʜ!9# ZXɯtFnwsyxzcu8b 13'bIaf0ka$4"q4zU%OXuzCPہ@\`٩ƥeG3K5*ƥ,k`L>}Ӑ&;6!ͧԭT-"g2wcHƘ%6֓& UZa=J{?JA[&ܾ~|L>ĎԽȰ9!#X][@$176o6$e,_1B+FU%uy(sAo JfbŒyZ;̦@<o[0ФC$o.6 IjM -*Rq*>W /<DBK sDlǽD f :d!R-&ȅq'J4(ՅQ$*EP&2DU Fdr[jdr, 1s?,HIŻ -UֵQ$~ϣ L -~[@24R%Bs8Uy,ٖxO&`NmKcmyWuaȊ:E1Q$iǷENr@0u4a3Zr1({fE y" -Y"hxZɁ=LMpM̘ 59>bAL:Q܎u.`FDDiD3r }CPS/Z[m`{&E- !)$ \s rhl; WYVF- y&F-0u4פ3Dezr/B9V\4@^Ȕ!1W3Տ]^R&KÜM A\6@(S,waLgks, N)O\&ZL o> "YxE4%Ls0‰qdB3Lh]åA+}(j +a|YmEka9kI$: r9$wF\+&Һ:rObӫ5ȴ)zc ~̨ѥ')XhX잡5J4 -|U_ -}xsAwLx]s6F?01jR=MQOa `O#~8.tv2mqS x7TCd -zýƯP#W:bAeGf*~/>陮:q,Kp

%{!pî_U{2\>͓Qź]PJP)u\7A -y-cw;wByX>DK( : CfhT?2ű[EYg+Vg~:&9J0HьmJVsF gWЈkB% F b9n۶YR|ĆRHc[ `zmD;}Jh*4xJ@se9y+LSFG'AIT}-LcZmUmw5"8!VyOǽI@0;}̸oGv|ԓu,syPumhC:v&޾ 3*&56D1? nn{=1OR-T;'<ǽnB3I<؊ROXg;T$m7|:-nk`,QΜC)Tk]+W g&슛h>=L?80U{aUa>o0D9>}/kdzev0eC APPŢP>~.++0Te'>=mHUBٲ -b({a蘊*c,b8:"=KôHĸX40>B!& -kQ7$޽0FZ0(!֫m̠TNhJv0JYHzbt`ZhƁ`fAB_}hC/9XȘ {GAB$|P:1ݷ 'ӚcE 6i6@ DN@-sI$)i2{ 9% FREy_\ `b[f@m/l$U|Pv]vƭbĘ[q'x6v-1> 7T# õ2ee,hZգkrQ+*iz0 V^'A01 Fļt8MyT!uk-l5B7{/Kž( ]ѷ~F\c(|[G6\wJHH -Nggش'[LzZǥ`f&)pu8=0#p~=R`zjfrj"0J1>[pYO~<G xI7ALv=,݂qdgcI%L&t2]VP ѷo%q4YkHf#–q'~WќsaZ=}cՖO-YRGtt3щ #ow![ M_|ЉUtUIs{Cx9+[펛Jzq!+3y{c)pRX8Fj}G_R(mDt{W0.q[Rm0{I'{|-vb𐨩Mt` &xXJi5c0O3XKr6}9Io>'P={yq >"F/ y!I3+B!17&E$+sλ1j?b{D̼k ފ(0)Ĭi0ULǻ@gRMWѢ<тpyc^V=;(?Aⴭ}֑ B&@Aߪ]uơiHS껬K -K(\{mgu\wn,TT7Ɣƛ=QZ0:;w$G CKxQۊ#0T.~ö~vґw Yh1z!RF>X 31>mc249$gaj &:*sG>:#ʒy*7Bs:\mXc>6L杂pR;151gѕh-Xkg62J BU9|ӧ-dqOҐs,DuL'&Қ4]|w,Vԝ1{g”DM>^ rR<=GXp- [ӓqޥOlD쯷٩qT4yæ0$x焗G4hzw0-.Kt1_I3`i & ?ckaFb}0LL Y ucDu91q' *#9 :F*3=?L&'\Fx+X$}pU׺J" zTL)+ҔT: -P-Iט^Q7. $w.0;B~C9EQ4ze+rH|1@+׼龈@9s4oă gq|6>wq-LE0rXӢG>[b "_nj0Lq^+bt * v -kcI؀q]hm, Hz12bƙCh^Ս7O83 > >,3oz*t3*Eʞ!!jkaN SΤ(6-d~Ӓ( )JQ`(p;:ERKGİ^k+qsoP7&Q2Ns0{-*tZ`T3뜻'Y*~׸=5ĎPS3Wl3_;F< !jn\Nv<)C Y3rm|O2G$ʚs A5&<k!\϶sE!,O|49cA w2f*J="wU* zJ@ɔň3L3&`2ukP1)jK=Kq0D qY'5vr`h4ƶDMt Ƌ8 'h0yF>p[u~pEH`MHYs/e4L-K} mBʌ7F_jbNNV¢hHM @h+ -qyZXbb0ΎlL=AϹ1#E'\Icݘ$!#gc &iѕ -ka؀ 2ZΜ-uƖݣia$iOXOg!D;lmA 8HᙕJ#V=>Gg$QFչ$D`@$31mc7 o 1*k˯X$Ɠ+SaEȐƌzϕo f 9a\>x5Shf錹p! 3+#kx_wqH&76YFĭU5$g2wcӈύ1KdM53úl߬~N;;+UTu5f≊}yuj í2K- -:0;+!7Z eR׷BI{ß&-'gù5q/4l ps]-cjPݘMNZδb`DUT>9Q9gI&zc+7sZ)Ujͦc GڀM&n'ȕI5,E% ?U[Yӓ`WxaQKw?qzvBHu>+SK2?u7.Ko\SG Ew I=GUc)S 2\P qÁܜ>!LGgYT Dvϱbi'؛sM -13lk^ю4WO0:k X{!V={aC'JB)$g~Ƽ1̱` =QB;V4R#*ǀQ8s,S\WdF}k2]Ex`"E\s{0jBe[Egxxabya60oHۿTvIr0!!;]af[WGsjS?|~H蟩2YLVxIxҢ,N]&;\1r0KN;]lӨV6$apD?4˝<8p=<\Y_C6wxOz$ m}5줍ZCaϽ~^awa>c<Ԥ{">ddx9|#>Fq\8e8'poD=1RBo\-$, *sr!j00FgıRJ_/8.B*h |/LS@ՙ)f W(_ ov^Nfp]4wFoWC)AqŖxr=\T8i-cyW-4t. USWkSnnٓМ %/$p Yt^Fۿtj7NRr,=a`41=܂i)91^ I[g҄Zl=CNH[5Lhb;U:'3f#;Kc`Mx]]uf2ousaB Өc8Ѧ͝de)k0g`^|y&TrLH`.6͓ŔY{/\EM{X繓\K:Qu)BUkN9Čۍ`8br=^z ,5w\b*UZ&g>զG(9:Yuns{@ΘUSb޺[Xfbj"9H84434w%uD1za`,ٷ -8R#695p X׷}@*wҧB4^=}#LoamiqDrɤ:6V_1vW#Ut0D 8 -njnY'ȎzgF>G^=6^6:T$4l̡f `fOG^w̓T # qm@g~1]-Y< d 5׷NZa`0(gNڊd1<"*8ĕ`pe}2}vM4\~7` G^@$_27颜m',qe~0eC}eϡ!xs"Ǣ> SP~.++0Te'>}HUBٲ -b(ka蘊*c,b8:"=KHqǸX40>m -kQ7$$,{/da`ɣX[ߘAeP7Zsa0{#ҁ9Z[hƁ`fAB_}h|C/9XȘ {GAB$|P:1ݷ 'ӚcE <6i6@ DN@-sI$)7թd&X!>9% FREy_\ `b[f@m/l$U5;W[OcboŝnB <3 P$ ˔ᗱ0i]=^QOCplu`Dw3ƹ0lʭ wKka{AX* DqfEsY7Onap9k+ !)S;=<;Ʀ%d<7X.{ɤu\ fFmr ^ 3 3A./ $]V8@LN-òRFI7rm G[ǃ0ψ/f0Ty;}-K`8YřXRɞ^~ -&c:c.+4T04E&BC[d yM5rW^T aK޸~UќsaZ=}c՞O(Ҭ!UF!9UO F#Ō(sEx%U'R"b!20@a*z}G?޹o-)O+15qL+^|bf.*8vbbN#apC-W B a1ef=fJ\!Q0%^C)ۛp"y/DpDJc!LAbf# 6<3>2.Í ggO*pּ;~bs FRm_C ȸL.FJs1]V1kD ^9o^Lw{JLgOJ ixi!xx;0*/<M]{_7?>COS?cNi8F'i,q`SVу7c)#NaAcuI?^sŐ0@MI[<֋'1g1J.;4C;1j`欄n6#k~F scM̊"s},Qa$5ybZlAt ģ/&OC\dDȱO*U!:gGTwhp>|Hʜ^ZCu}.7HI($S󕻚_Ieb];tUkl ǎ 4HU|W W` -I=: L+pfRσYͲAc>s<7iv1}:)SX).B]"aЮO/(OS"tESqZs$f4`JspX -t#H-@HK[1:m]e5Sqծ\=H3ɠIBrx֎<+_q]C{$|oc2abW*J^Qq@W1I4ˀ9yk0)K#V>%+(ٴeh& Gkjr4ͷM:鈁8"dž3c4 - -E `q; ,}bh oU8De{!CnԝВ~guLv(W>_d V)0;sa1ABGt` sLQ#V/CW3aGΎs @Ũ#0zzF68D#f,5*'Zi~#@("2gAW[Y4RTGxU1:,$LTSՈadF8:÷dbJYm`4Zby6Ũn9>'ť~,מ]9Evfc{+H~bx? \;-fQĐNlZYH 4 ]@%CL v%f ũ1MGp#f=8G*~gyEhFW10auYB1c;WG8+1}G0kRr;m$A*qe?El -⊙L6`xbE= &͎`Ob8 1CoE;B󎠌H3}Մ!b40r#1;VѸS?(@Q1h6:AȲ•OHNLRo)Kƃuyd423P"U>,FW:2Aߏ`=:,2;YntM @? Ƣ) md= |.<56[ ǰ ;}H̲J|-cp>̊%~OaB31.FM-J/wx׺ĆofbMUȶ!*=11X= Q1`ޡ祈'pagk vao.%0=cʀY^b -Sb|x3P:䆴.m;;#{!zsi' ȗz0uq\6捁bQaj8 ck}@ HZR/Zq FøeoTXƑ*Ɔ_˔HYLJ5qbmYH׍Yf2\jy:'P̖<3%B{PL;nƬIEPKe`)]V3F (r {&f:tWYX:jWW|O^pcύu82 ->)/-cAhRx (᭎ቑKtrm}? HҦ@GG kKϣC06<HJbl =tI=mĨv~ୢ,T ^7=@sdii;Vq+1\8$q06#40TX&j[b3:"CMa{L+l *g5j^Sӎacyg'/ CY+> K 20ʉY؉ 0D] ۨ((`v3{ttE`'@ig -q;X5~iMB; otbx;hIs&{6^)MZKK G3daU !u3&;`LX*J@tzS TUutL<1`\]$w?+ &RhrW&CADC#+yk` ;!d+ 2 (|0Kb "cww`*Y`]sV(Ksyg;XwߓWQu"-8P<8;cEݧ৑f|aB|T6W|r RM IET#--Mzz*DxFF=*1M s2w7ođ1v><!sc11@shG:8a|3^wgYLlߝMd79/^K}tДa.b}Ś54PeraN0f0ocE)iA+x:> |f H:_9=UT -fg';)pfPr-N2$ -5H~c&W\:3M~v a0VF*``0׬;XDݡ ǁ4ew%"V?0qS#_҃kܹ($séxh?KzsF~λ8.iֈw } [A2i;a1^lfI5 R=?ep_ꀐv0s%s`;;aXt /-j GwW k/1ܥ2HgJT"Hח^2<seyX.BJ 5PU#TM녂&5Ix.rZ?Ԁpr+ -Pk| -Pa(>LS??1¬LaxfY 4 %0MO^nf$XLdA_ cf"'w:[0Q'/.-3bap|^0;$fޯ&f 1sT@z݅90v6EuaSda0LEg'>I =:$ - b -(>G Y`VaG4-k _/pqm(\utZsAJ)^0ǘXuCby;+k.6 NLԗAu( !:Lnq.L<opS|) MIIcXQt0W4'ZMmu_qOEx@z.TLg)7HkbX3^>$Ԥ㢙B8φ1cV-O^Z!Q/3/~בJ)Xz1szlaSc#C|\a0=Y>_Ә5'w(F7hcbhLˆng A(ފA +=\҃1l1f0}4tga$(|B+ KdI= SCUQE0Eٰ0a$S cDY c*`#@;>ұ'fT -VªVE3FHña:`X6s-LIu0T ^W."[SLa͆ )BFN5?Ydu \̭AH6ň]nMɖ"]?' бo1H1 ّQ%3܄Vp4(HT,=")Eha xc3j[(@ BI|DʉR+8f[NXI W>$1heD~)gÕSuY5~1N7g05:c7ƒfKBV)+KHgYt*Į?#n &&d%Vx3]t~M%pR027_u2Gʇ!q <2m,zIVvg1:K^GøcrX0zL3mm|Q]IE,N2M0gޘ'J]\YT~!EjW_.gb$'6JS3NEEjM2 -cNJ„@ ~:{B+i%yZ˼6gc2.#MVKl;^Œ^tD탱d&h%ڭ/ -sԚ2I_ 6Ng*1]1!|>8oMVտ+b]7s8_0l,<ƪey21F'sי0x}6Li NOe2s0Z鱿*QĶ0l/Sأ`zDpЪOs:T30gtUQԹf?#8m yFPC*+gLl 42#LH ^>=g1=QeD`8~&nLr0%౾#'c T ]gzěn-;Bgi$+0|NQ9=ox,*`08L'c'fa, Sgc=lcI"X*P awFdv7#5ɒa(۵&n^5uPodXGeE[_$ߞ^W:T'&Ci~>4 -3 KgL{ A:p_@숾'U P߷I{z04osssdzQz|x4&Lq~şϯ7?s~,.j9+?ԜMsbzHZ00u-/4]5#t d\>dN`2 QKU8wQ|~ƆK#h6=~ - gajzmͮ}cg&X(_O*Q#6瞋Jgc)6]|vЕ=PQ†/L;`]'u;](剧IFm34#e üqDSW34)sO|9Ҙgܜ+) -ݟ瞺qsWymOQG&cC]pC8NxcQ+97w}8;B0Ӿ)R9Fڞ702%Jܿe`69H>͸xי'9%I7&y6њl̝pP\}z.F@{º>@Y+}|#8F3<=MGXw]$4d+6CP@ܼE1s p]ɳ&q"-NY[jE5I)fkp#B1X?<))`dcGMٳ :ǜ{[IE\mYDZ,kL3=s?C!=cA$.,+^<1WU>M{[mKٟJB㴑xJr,R }x^AV0\b BO_f.Jab]fmۀQv"1F*@QLی=,cz~Z$tigA:V'ぅ\N8C #;qBFCvoHI&u|F9M]T:RrC0>ar!'e.|S{;0 @\}¯mcu[""Ư<&t0GWUȐ[OǿcAW ͡/tEGwX=ijhR -Q;kW3)Sz+35_4#JԾ%%C?o\pXMS) -?zi;xCNǺsvK@AԲ#(H->aݢy>!TşhiDk ?cb{Jƒ"_̘u&gT7m}_mٚJW| kj?@Ig{ st1%>&QwRk)Z>P盭b}㯳dQ; 0:{|Y( d&Rׄ&وVL)L -ճFc"o> Z|rO\_2}&Ynyr FMg>oѕ>߹CpO0W\?0Y7лu֥?"%h] e|CM^s˩Tz6!|ĜPy¤$oאַ+nP˝gw"B\)f$ax>R%UB> %ێ`qV(̑R%ٙ!2&v90涮 -&PY;-fiUaU3(da{)db(îhc<Ǩ8ͦ"afu9gV2rK&&a]>B*1K{PM>$gy6Q8B~ƾɾ TvG 0Ǒ2XٚUt;1)S=[G8C4~CG rN(IN>jW* ϖx51[! ;kĘC|1x~kd-q¨ :tNLєzv /wy6zVafeR_UEk00N K1Q&qd( GN_%YV90Fv}colnwE/15=AufobSa]?uC7TjU\&1vcޙE$UN KðǺ4.7f R0pA kРkb({̗qȅ/oӠǸvoQ]*a*c9#Snۖn`Τ*5_$o8t5W:a3 4, e_ w8TqVRٛvEyH= 3ۈXe܇2XJ~߱+p-S4aQt{N2W,&w޵c[X7(r؎VPKu: yI׀׋T^[ oT-&9+=Ajּ)oYe_G0v$<>0bҕYbK|x&.cTw$j'e#0VV,8J9mYe 5R åP61gs7:"aINVZ-Tp暚/맦;f\wWHĠ%F@LrRA H{> !]$pVyt5>?#] zzv&T(aٮ4+07yx+'6W+ 3e΂+M:<-6z&TcUaH]fg@@`;*Rm~LZZSwa'f{X%^]5!jE,ja 術 ,<w -DU{Bd74,2:LLAh.Xe;_׸1qP\cωE{# ">)ÕOR߉^eoWq'ޟoi2n쓡 -#13!yo̻Qoh|!5cS)1g -;Nt8 \qf_s^rLo:ot+=ya߯[lk{TT s1'+^0AzQF}) 4ɠ9kaqy0 ~.(jS%VJ0+znTN{D s_+#QԴ ka=4e7/wѵjygkXݦW`{Dxc4?%4Bs<{M7"UQEaz&AbHN%K5Q -L;11D" kBdF14l%IE!&ޑXHXH 1 0҈g5ƔU͌85FdW;IojQ/Sy%j^γTY9;5nfsPSAK_ңKZY&IA6wy*Z $d]$ ,-Ŕ@8x /A9Μq[:J7ʺ;9*i]^tc֌n -j!LM*o3:y`q 'S(ҰÇo-7T=sٙ!âs<yh UM\/p?ŜP(bm].鋤|,R$>ٮ9!ӘwseqiZ~!1pxDRLLEgN`xnV(0 Qj 9jgspE\~&NXhV ,*f&4CX|X.B85Pi"|v<"l -ⓩ=$)גSx!zPj@xs -J1 Pa(.oʟfaV&Sz]6C~a18~``I bStdOnfF0`m,+OUZL`&&Y#DB5ZQ6@ߌV*{y d{u敆0``n I-;N*y{X5pa췕3 -l)GwGnhSJ0rY*J`TW斤}wI j5Ii1QiH[9ԡgob D7]bV@JWCw(kat Csh3:ɰu= ڙ!2b0LEMI.bl˦]nAXtj6Tfߐ<e( U U`M|԰Ch5M=@p6(Xuzr }̡bdA4{N;h6h@I1 D-r0z ̛xSiDIð(tt0CMb %F~hӅ>zf!8b8*T0Dn`Tg`Uh5b*QH& Lv!ԎK$f2F <`GkdXxJ*D7םXOc"vLh@72if1pJ~$L?N'8PtfMc% sIa3~1U) -t3'\itMW2躍LJC3;9 SC9c9Fz+$Hr R.tBMm !t1 -;D`kJ6i^CO%j KL=S*BLjc) ^F3TB8fL}Q(TZ p,(-dQ DJ+b6iH'!  -s`ExjCwdKLGAx _A`(2$H#"b5쑘!tXTcuBQ垇-~+S{R#4N< /DPCTF_qA7Lu0(ZˋuSSb wT@X_b*#H{^sdX rჀ:Gx[|Y{$q_OSY7|4Rbb'0$LSY sasxG@A%`<3D:RSKJt`fw@ܝbݷI] Hp[SwLmXϞcC50} /=4FD,`C`pK:pwS\8ϾŠ|$rE}w= 14*jLRkߏ?O?;|O~~~rzˮH%qbSqX]!(%3US `I73 '_3KkaJGwu 3,je"6쫩j<ZaYS~d~=%7S$IT$_ݧ(Kؒ/Rl\N_q0 -҃JDQz2S5}4]DכKY-z\E\G@Cli_=_:Gl\9 #A%89]]#ȯ0Ry ‚/NxI϶W,JOgaMwr3g>0s*^֒sbQ!!b,4)+Jram^h4P8 B)I UQ -"Mؕ }NL7[ ʻc6 ^H -FM8ckA9dyw˰BEP)MNۣ=6Ku ^v%)p`BMڒ2:8EDiiw6S0JpDhʡ)׻ (F 02AE]~Z>̚Kָ8./`D)&ѻu ]NFJR&p.6n d(혰DR}?3=*tlŶ]sd\Wj endstream endobj 22 0 obj <>stream -HLc7 #p@E$oǧڵ[i{gϜs,o\3V_L(U{1b"X$2Wxm֎5Ŭme¤uW|1wF)k[񕕵bd0sG{9j,Lj_ճj^. Uq{E^Lw[- m6A^̴ms݂tof׸G 2nd;6t̜/f{6 zo>N2` rfOb*wE}0aكܓ)Pk0.ATT*F8.#L׏&Ni?rjP_P)8;P; ^ޓN~m2FZתE&'hL:TynS0179{74FYS_Sgd]XS3_> ˧v/L _ǩ6Tk/f6?n26`=p{ ?:Ks0L&5O*8p043AzWŀ3 `)6CÜ*96ý[ck2%R:(tM]KH\߁ЉbP_Jε㐊R͕r)F)Q<1֔)j閯BHIHiJ"6ue(+,F ƫ?gu Y0lpT=B(LAHm H_Y9®iF>qq Fr78 Lpa~ !2>؈-a0AT#b ZV 1EN!W0g3sDHγRpK_3Ec/Hy>s8abtN08t*n i -o0XgI7q1vd20R,݋; bL2Uc| '$jK؇biKFԆU×$_H;Q>czbO%~lǽAɤҶ`3zZ_u@q*Vc1)L S&3)͠ -p.8{KR &TE}9H 1ot^+mѕOma7*ZWBI԰5\%&Ä-N\z֝?Zxb& ˹9@oK,7&I5\?kn T|7x.LNZ_Q'Iڗ%85(Ԙ 6sW gr}GɜY.~^N;_c-롨a܆\g<ڣC68{$R l!%5-;dLYaal}-^` )1?LBQRB曱]~Dl ܨoCg]9 0n3uueOfC$:*j/}Si(:(:}J܍¨Qo0#jR7a.J S"k|`% N0N1 #nFکWVo%We%+-繂Y2Ӈi .<ϲΊ5YܸNgۄ1=ܣW{M0FC{R5yםЖ{ExW´8厶޸(ajY}׷0z):6q֞QzHE`32?-(y_DUuX0/3u)sKnci\Ϊq9eIºޕAZ"CgMY,i% _+J1mό?R] | "0, 3})C.-oX;U[ھF@P( cB܇MI8_RRf ,>g>`MaBP;*17ajڠ`?uWcK뢣`LUvVFoKBztDŽ#WHTۂZcJ>$J8#@ ҅$aN\Q3|[+X, fZ =Y -0(ݹB lcTrʁXEJfXR /!MIaa;E0H\m YB+Gj[ūp%EW$.#ۧkC -S; -Ȇ{curI(0#oP0fYV,.mcTfHZ2HS݅wdoL:~2\[U`UL_/>D}aujx9eY7m%6\y?zCfV𒑐Dd ԛ8 IP"FAG|Iw#k^*}wo0$ MK>v_<0vE:[IrGSZhJEz!l[`<\x2# -2%J'/nd,l Zgg嚼ɥӤv7*018]`f -*Yf;^2+`2Ky\Vè_}$_;f_Ĉvo>Djzc2: #1h!^6u{6.^7r wH8X@\",j.o0XAMcb.X3+f,Ag{s>`( Ǝ##;qK3WԸ2- \xŷ|K sN0O.(9PUrEL7FLLF`J:=GK95'`YrXi}EvYIE۝ú/im޲tmCPg$Oף+Tc#lk -iruZ}6&c`z? a21 -\T:2}ZBI0f3==(_<)pv9&mCT񇡃I(q*JS;EIO0'=6DIw-W_߉7a8`FT6svCh y0='{z g\)Ru a5Gyfl0y2,O!G3EB\}CM(t!)A Iz״zY%ĩf.:Ap  -M~UYxVXaZj i(͔oYΖmo<08cU0.;wۏpxM#ifSU$YsHY`&Բ\o/OQ0Eo}vIY)Ӆ_uL^lTA[vKZ 4mo۵>1TB |YgT\ȇ7%ǿ4I 3a\#xјhм՗b# 9àϙ{Xiu1wJKbtu~K)&L֢+9=Oͥ. -W{$ųC*[H4jXDy#ͪ-Iif0q˔WSUsbQlguݓ|L<0D:LYrdddY*٫* ؊8sR- zK:ߜ^I @&5}5o:zNx\PܟwbJbS1* -Nq/j d`$=lJ(GlL!vDtiM{x,@X*lXorkFm׉j輭Oɉ[\"6KNjua`dQń#ƾ%rsa1dD,$2ᑭumz|#.b<#]e}Pi]ؼ#!-J=Si2;n凟?ӏҏ~O퓘[OVKD UJ4~|×<(cXN+K -Q-V5U?}#&rLl$w,gď -?Ldz'G^4Zo%ّ:]&}'l 昢R2/w`PaHi3ջƷ[ 3VZ''a&&"ev\#c]c+12f l0W_\`Qt,03OK$W ɉvjcD -[i-OI`eOE#9d&EII0F#IǐiJEɭ5LM2]+// f'D?pWm3-S.ycZ̖nrXv s$TlXxNG/ y8;aF֡2T}}V$5c؍j!+gP)@g [/= `rf/5HL!%ȳ |f g0 .KF( zr*Dy `I!1Yd yur6vmk{lW,*$lgMЛX0_gzM-!^ɤ/Փ=AƠ~X빼Z9z0OL || Q:9$)|ɼ?㍁F˅e7n^Q aXu>qM%]T}C.yNf~|:e2#K~j A4N߉ᑾN/֧階O hoD fR=Y:'<H1`d[/7?1#Q+QmO`!|>$jƇ |{t bC]H`lZV垅h0٢HCxՑu,ZߊXO(R&1l&HncU:NLm3dH׌9%q Ts%$F]f1&# @'=^.[ <`8{cD`Jzi-=dP)CdYqhk'kbcCκ*ZַVfېZBЄȂРL6\3Z'erQ<޼fzrFۆA!:&!Uc!a[lZB]1WvuR~`0t%ٍ#A݊V\LPIN iDy7eJ)1g%= 1h0-c_{J=%b-V7!fQ6G|hPΕL ﲮ eEWTլdg=ٵA$b<bWpM^AH;yM1qF?It-!ff2^~Z=7`%c0:߬/^A5,A+AGe Gt%:FLRQ=;Lmھsd_ a --Qsd>_-"| -)*"DxdCzu)Eo -ue"d1q3x9rTvpL X&9,ML!}0o:k:Cv211Q[Jψ7:erCZSo+_d$o/)O9=% Ču9˜Ww1i)?.래u"9ƉgG-݃ӅuYYl^bo|8Z$ͽ<c}:19yލp+:\Ͷ&HI2@Iq'80R?GS1*~e*ҹCTzVA'FbKӬgz7^B#a%=NW!a'c@xKwxWݪu. doϛ _wՇ8L1p>1{Ϲ^Aboya`̫ȉ珷:GG~Pa蚁lĘ !Z4p$>ʱ FeWb_݂q[ooTم4Nmv>t}tAXs8[3sa4r=bŔe&7T=TDNK<cp<_lZ>ٟ 2ot+M*)%׾QuyK()h50c]B'Y;\͸֯W<jpB 7ي%)ƅkͺf[28~]9>r=&'KaMŶ7Kth \3z\'ƃ[r[ɜ _ ΆwS٦mfux(jbؼӰc/Kc:/*>lS J̲VCjS< -a=֚EZ^`Xgb_LPen7c; {?513[kӗQ 8rc ͨ&4eOfB`כϳd 2^"} -˶~lFa#jSxY'f\*̒{]|̠V= CxsJkBq7 -ުZ7҈oJ㯴8s2哛{{e)G}w8Nsmh퓛縶ф!7h='[jgpV1Ww=0[No)m8.JakjcﱖVPakQE?{ר0Z_+h~MGǙs7'İA )S{52fP9\Ƚٸie,RrDkE 0`sbVÐ/.Z,Һo9ޙ21…m(O /Zだc w6rnJ s|IɚM P{x|ƃx9ݷa -qM:laey<B:k CGCˆ0 "oƽ'ly/SA92{_kI2aO/.;3ꄩ8TJ_ 2J(Lێ0(_d5 2Kpigƈ":P4B]Ee q$'cs#UiƮE^68 -SNczS6Sa׷He\ -naLFv_$6iQa.Kag ٺ)l1?6"L. -XTuQ@+;pP <w #m1-~!Q^]d&N~3۠aJX,^+3s[~!=ܹ+ -y19a61ZJ91!XR /!˛¬ fz*Fb@>u8Raxǽz^B+"k~Sūp%EgW۫kS фob1 :?;ƾXVb27ξߤ}0Ey`zۨfu=K6;T{z#h=+xHHwb,Œx^C=őg?1_N$\hc6:j;H>c=)̡Bѿ2]}P1i g31+ʵc=P4e6QVZI]g0-%q(՟DQz F{K玌 -yF~Y^ uTXgR:Ph =H$`zj;?xFJ -%霌, MwnZ@-W[:RzT-u6}[veFjM (܃}kř|vqk Kܰә0jtxQ=uϑ.4oi1 YhkgJr]): a #{tcsF@;zb)I,CelBB}'N=;@aΗ\.J(vddħX qL2OTtqm9(2X]&7[E82=TN'L](2g2m{mUJNJ;{:y=IoJI @ϾL7I-fY'}{%m9n%wJW#d[lUVfkj\p.=GlrZ}kcB ǢsKkb!i^TDZl[L?Ǫi}mDކc8,wJ'@N񃐅IG\3Lca2 n Y#Nry3DumۺC&Gk[;!, -{bD"W>'#YR~?Ͽo|[?>7?l> Œ4c}r3i;{P)ӣXaʯ-a[z F*e\Nnޓ8ѐL׹NȢSwbfOp(I0HC2n ʮALx޽Ԇj>s|q=$ʹYe(FDTo=W"!qWǍу,QaZzPniVt4XuxE> CΠܐns'< GtߘK$IE*$ tq_<&(^Lj đZ+Ǹ#_֦ة4K>+^ACVZhP. ˳Sm>r .˾06Q[XF!OzxUFX Im8!%a\NcO~s!%r( q)-o=n5:wAI*yf( 81(M1IhU:>+ȗǦr_2>U={<{rfc"k?F\{ $BU1_#WY>-P -Vgד4^t6VӧyNB.imnDM'W['LyC*rc 93 FT9Oiܵt[iea$jnM u\1NJL"iw< ks8fu:apLgߵ/{=EZ &ĉZ#jɓ"ub"ijZ'F$҄k~3uKQ/LZQ P# uވX0gy]bÝ0jo<px0̩٦o(gX,&:gյRq#(=1*@=b _9jl -"OA(h -T($/ic+\qٟu)[BD.*6_imvkQ(>{{Q -|IȣϟChRz*~m:ON`bTklA{pU->Xgi-&_ykޢp8"c̎p)oٯLVS:<ԙQ -B=(YHvaoAuM<60i흈RAoNֵ[ Jƭ=3ܾc[f|&]q>; >>0|ʛzx?K:aO_}*Fe2$.|'Kj:?=&QSZ$Xo!)VƐJ 鞈)Y$zz, c5T0ƥTnZ"dRXcyZ\2%@X71΄(( k/$f:MVH: :6;}`z? -x'g`gJh^i%t7b}0{Yi8丷`<)_CsY|I.}9L$c=O/W CKΈ;,:}ڦ)"eFȽ#]gٕ@@%cWA1wT~gz7y\O`B~ٳf.Nv(\5-#bּ8KFA1\v94wG%D ސ1zǾamOW0ʉ~q { kk. u EV?[T όbGc#wz)oPxS o$FK)N &K&E+Z}D{2S[_2GB0WQtcwab4i0"EL5覡|~NCV9F鯑j~g7!wv$+\` 6s.(k<ƅ_c􂚱;ns;,;:BE̵0w3cq41l˕^DYU5;%V^;tF]  oNM,!u#K=_{a#xO9y`">=Tc1~%f`U_1Kɕ6*k׳ZQ$h\ =oυ&7Xvsas)eEe+Džї|{_[\!YȌ?ŝ>`.CŽ8JKCS->h[p_C"A5/ 3Kp01 E;Y iéas -'M]4hxLbgFT\ -hS?´"22wAuT%!76-7\LiBr`|9r\}`ݾeLT{BĸY2~FQX+j^ XVH7"Y'~w_/l_T_laZ,L|OG< oczl^k(!93u:!q:9gQ+h}}y ̸|wY8ogcyd5;YuXδ~FaBUFW0W M.  \߳XLjj%ҘQW=~υ%e\NZS -cl#Pqm R&jd -M呚a懹Bg0ϑOe+̋;0d%s,qVKQҞY1 -_Sl'ama~J?1\q:QC7>L}`T;XeN8sЕNé Qj ǘOy¤" <佶F!h a, y.l֌1,x$r*^a8HS>uW)5濿8%Ų;g$h({υ$;ث_>k;fgD;GzXCG}TUf<##'`#j;8;FḴd␬vY|iZeokfO]qJI B*8n-BG7Rs:t1DiǻN%,@ݱn0M}(0eϗN`8WhYXf ėrD#חI>O?ً -TDezVnoQt5\gd)oeFhK^!;]eGLab`rmH™H%qJfUҝ%f[? 5z){{A%Duo3.߸GۇтY0_n?m>096scD9\ E9 ;-E-2M}ěr' -rbo3?[}SOV"r2 -{& u8퉫PeTqut;ZXOg<7ߘڬsLH5R}ejp*Yȼ^lDuglom'Ru{f^}1Xu7(XL}{z[ -5Y=U3{|!X~?XvPQcRK c8"t᜞յdcNndTVK[ y!% ;>όgu$|1<[GfFHXc E+ >6:whԃh`Ha_ ",wΤM_ݳFG7r(kg.9~М)Wrp7/ƃff yJ> ct1S {`azI$/F=_ꙶH<p++]Wwl/۩@:Z-DgޡCPaB")&B\8cD}֚Hg5 @E>@ Q↉/y+*& ;_{K{YAJ8ڮg#=՜؋F_t9{AX;9 'θuąJcEh5=)~ -X!C&: -v+KE ԕqJ]-*['d^Ӯ0ڴMxxgPLxS$50u3M CQ,zai&-9רqHLp.Fozh}ۏq)ka~<|=*K ύq~}Dzqa6/9xc x>艼U(^1"}ܐ ` *n(@k@4ba]8k28z=*OĢ;g-Mڼލ8XsCd`A'*M!F.uPLuv -T'1EBdupQb2Qq$JobsQm/@ -3CL0t`ˎ ;| -!gi0(IS,:LK)G`;Y$1^+~yt)sH~¼4-?Љ ) k鑊I ۜFŠv/05ֱf668 iC鐳r#Oi6m*:yl-U("CBc;WbO35z}!=9 OjMv3h4`_ҥ~Zf38O`[U -U̮\DQ<~U! MƲ&^Td?@4~OXBTxU`פjZr/IaB፧$iEFƃacJl阅wσW$n=֔/``oYit}#LLӢg}i}ECYx_4/q"Qnj=4p2XkjC|34Js,% :ρ/x g/ʆb:w1Nq)F3"o2ΌӃRP -xlddQʬ/YK*ϵ@-&6&PZ KJ4/Fꃢg -~N t6MP*@~]96$fu6\}Bsq0l2nX mX~NÕa RF0L MZNl1<; V'pP{2= -FFM4mo7KELbuƲ*}3Dɵ1yi\uiGO .gL)ď%$I4scS6d`f؂Їrirdy,3Bň_wT>3jV%V^;tFnLWi 7&zH"Ϻ%ՖW6tnUjS7 &csKu`#ïDBW+f)ZZWvzvK+{"4ƕ1DJS`˟Ю6f>gRf\l1ҿ8^6pzH 2#ϡtq'cQ l1(v5 (/ M -ԯ>:n]Hl̽3P\PgMOw0̷ch9nzŒFS1-Ɋ)hDť6nLM!"351 -M!JBd3o0l+Zn{c2 =-Gp}Qwn-ezM?.'͒qF3jl26M?`ظ9pbY-#gc[YMOz Qu[a'0y6&>[gG< `z½QC's0gṍu:!q:9gQ+}}y qVp_:'jɞ+jvw:7fi 47x`l#-N0t[:7j욅}wŘ{a\~bϷWodL>U -kC'.bZY0!TA#\qjPT0oȁ㢬 -V ^\1452[p}b25J1+$ K4ʸ4ZS -cl#P_`X52iĠBge]=v`$n JX8VKQҞ٣1 -_S%$]O{~bbt67>>0 ,2 -R69@'ԍfcLkcR S]LkqLޫ{Pimaȳwaga1#SJ9Jƌ70C=zM1؋I6[hc|f}}\e1))]9#DCyo &i^kۘ=Nbr?EuZe6uCȒ<^w11.1^CG_m%̗VU&6SW\GRGκe_XjN?CSH=xTB? ԌMvaoC$Œ>_:?B#ĒVh # -9mLcXLZ~żA+{T_ua/daZ/78vƲspU[{q?DK -jc,;sCg}+If8RB:WiofvӂZ!דgqbw>TzWφ#xdLQA[r^^6c8Y)ta̰08/pU|WJwΗno]r~jSoxkn"&K { %N3.߸%hA?l0_n?ҭ>`axv&rsyf^<~H+7|s[iRL?$6?b9G3>H*FA"}2rfGlY<5(Hxka8Y) 30!Ä}|S#eUA$Y$U>çcǫ] yawQ/]-zM5==(VI{S>N`4YC2aN~+ΐ>Ͻޅdl>?],x9_ďg1ֶ9sc Djp;s -z8|ƳxqӴ+o޸&xL沞hȀ F'5>(>`xim2_#N\$VNuDŞ+ >4G#52Uz;&d㊂J8vec#zkKY/:-Wg<7_keutgO5Rudjfy9oڔrQ'jMf߄:0Y#Pg0ޖЭ&s싆 ĈM DAMv MQK#R͠ lU<޹e`c}v*;JǤ|y  qD*9-yPg<&&Ŋ%Œ^GR=h}u["3sIGݰCjJ Ki"Z%ŒT/[T03@SQoϤ[28z5#1=w.u|2jM:#_Rߘ$}b |W̿Va !Y s-=r"maGPK AM gi\:aƸv: 6A[3/ ˮ{bTw'Fhwy{B%=PaKmF>CA? ; 0g:3 5%XEx L`y($A=Fҗsa&`bR{@0fGeL:N{bC̱{Dy'^u ൐7cL 7E:nLLCU_L`ұ:֑lszL%Q·®0$P! /iŦ~@*J0#0VZC a83̰ -\/3I# -9(A ?2SԒ+тE-V!&cANa+/ؐFU?GU]ūQvY[qeKoa'1F0#Ŵc`?Chus X RVWFra~zf鄳1*ԠmuBìGʩqPIFf]iNj y0Tޫ˩z%LzxN n? Br- gyӴ׶DӐ̙Cb̑d`Nj)n]ԓ6-sF3l,SHƴ['UuVΐuLw#!-uǷk0UfA\\G=$^^vٌ Q#u<>i_DH㭠aϏZ w-v8FNp ;CsI!T_$\gGxiO(jxRm9!:װW9:=9I2奞V"A0/h_I{!zꘖat6D^`fVs9)k$ -W$u\p*Wvg-\E'co|1\^ӿ(֮61<8:T333T{/ -qB}1fDz"7Fm|lj -$22~Gj0)8̑P^E,ݱ̩Ҥ={#k柉 gJ# -سR0=޹h0 ߅;!S05EZg6\8Rg}ə獎7HR4fr.նx -CZ n7qcxk)\k~<<ݶuNފya+&[ĉTck#C `+A D;#z  e yL"}aj&+u>:+5׻60*-_2=A:̈́[8'"3niSR`%bf|0nhd=#:?>yn[ Qҋ -+A-:̟2sսb<j\>Kj Hb˄m $ah%6O|,`6ambF;ɘϡ)<RX{MڵIf i&/R-sx LoWclΑ޺1~-KORJDŽ`@cO1KcYǧ~gʾ_У+>h~' c(!+]gM MI7h {E'DD؈yu' {.%y4,0=IxŃ=E cK+3#/A&'Co6bZ{̒˞5\FDzXyJHtV4švW {'f1P)_aSхټLoz"R Cxo1 4r;7GX_m:t2p TIGmE$ U`]E y=J9ЪOy0Xf7ЂVOaǴ`xHV] ѽ:O8!wQklѹcרG>wLnv={ -oB~G]*c[ܝIhyE G7sTJar#,jvx%D){RhxFn$Ĥ-5'UV8RNB}5M>!j1]0)A 9V{aZ-ugez`0/ &R@2yM a{ X:~,W%hbd &ybUO;3rP [ȚzbrTNQOdUM`=bD -:2걹% l@I -hKx?tQM=; Q3vcΧkmVf>2sv5ny%6ų/q»;E4Plik1h?ύ1~{֧2u>BTFm}3Zsu:O 5?Lv;YV0Ϊ[ғI$(L =nmM?Mk`|ܛ -Ĩ)sV짏Z̝{= -j|KS|@Ju&GD-om-;A-wQZ|[4;3 *chLh=C&ڷ $$:>ِ5lġ_6ٵ+k`ʱ3Y=ʕ(x{0b׻ǔ$ we܅cQ7 ->ރ0Y;fć!ԙ`̹, @. NZ4X%BǞc3JdƲ1bA7!J~<+'܇zJ@5` }J;aTˆϊFIQ@6`ƕlHq< R| w͍#̕1YOdF/m31^7&D7RE ;clSrm20-buknI ){O -X{`Mo*f~(j&.H K;[Duwhb䖍16/<Y`%F8mN< D5y~= )ď;x?SUgM;G[1 Dj¼1BL2zGR1ad(2L2x{V>+:ƴ+$0(qqı-T»E 3$Px[0L[?r0}R|V|Bi+o D&ce)ƠMڬ"o26bMdtDŽ-I |MR-, VMf}$-#o cRތU- WzSiq qٸQx[/#0,8Y; 1lSffcѸw]]X"cctm6̻l|l -lL[a辯Fc}p~F% ]Zύ dQ<0X%}a -*$RbA a|{&OqOۘd{>x+ &j+37(zWE<6*_W -E쏜RFXkAJ${ 0v3C$#= --նզFHT{,ZQ fk: ' ~}淞4muº8(UFɠyh-R0}Ey.C*$jWv0l9<7i 1y7L$)%ٮoL^S'j0)ƷƄ|_IJ0FV>`//̝'1᧐$;E>e.&ouELz: ?sąښyIK"9%Z^k-f kˣِju,&kŸsdYՇ^B#wU\UBDy\3D$[7&#žːs'\OGc.2h19&-6/ğWA߲b2=lx./)['@^ʻU=d: ^GV1kQ#n`ؐ4S$ -gKdzrz>gp^Qao -:eU?繎 A^Ukg}Qo !WE?DfĖҥI_'ƲX1k ߺp`_~nwZLNtw\Q=#Ѯ?XP,smXzTWwզo=+ƔnX=zR:)@Lm'LGo[O`9 endstream endobj 23 0 obj <>stream -HD۵e'#89zӟ~ݫkJlQ>/20su19m:=n0Z2sV8bVV7l9*ﬖŜ5Yw/3w;3„6^/DHdp*qqP\HwnAf5cwLG) Ԫ bVE(),&i9-rƼV.bUcbaxu1` j1OU0R\Rv-O\vM0F$%#ofoAja:r{ ;zub,.@HQe{DY afwQE(,TR 銹=>ؤ60 Q\̞Q<'&0zPXJOQNB -dS)' TfBZ0t19܉SpRb*WaI*f]vxyb6]9~ؿA<$MG &\~tHbҐ<*gHb5)x>1S@d@ "\>/H sa3,dS}圃' -11ҼC XN/ǾeDc\BC׊p TrΉ{`ѩ%L1wHBGl17C -aHOŬsΠlʛ=Lcޘo ރ'a3a.q##q\~)|-Q b&c>V6ޛƫ EaăR/PT-Jɧ=h$$. ~Q%ل&L&NlEѿE8Tօ9ME(a#Da(6 -2q0#æIl~>sUQ;c[rTFE[X= C0~ h0N \>bwhCZ"(&1 %E?rG|o4$ iÔSJQ18xok.=ĥ1Dq̍ &s qa|9yq|W&Y5q9T$opOh<,2>NQIڇas a1wܖV6]?LB %^UJ=U!h3cIӯw9Q5ص(Y"q،4b3L] -9S<3mKm_'3\F6bLV=kt)Gu9HdAb9F{xks`nt:iD8֙ڲ!3>J-~],(GYzs8V8aIwJ)ra}h`Ȗ܅.3?`DlSc+VːWIaLEr6&1d%T^j`UǽӞvW0N4z 1Ug bd&7TL9UW15h‰|k8HM F)I`Y`!T|?F ;fv@% -w1j@0 x=zx40_Y-"°`a#Ab_}aR<$!DZ]9b1 ȵȎJ'e |?lC5 -M&A=5sd\xj0=#h"4{? ͇A!]8}T\O>zAj0gtK sC?K`ĿF9̻η`Jƪ&5~Uy3ń`B3EY{DEn;R~D0:'9[~kƨa,[H1N>"IaZ)ՄG[ofhFD9n-Rk[SL`kbE\)vmX:iU7KvJ]gDqt79Cey€P޼Ynywzn/ơ(dQ(b -%qU6m^^׬1p ǘˀar]@HIfǘPaR-* V|A@IywN0I<:l,f&n̝,=# qK+c,W7&q:Ǚw1lOr퉶8xIэ].0 &qOw5 E\nIDz^u1/C[>9;CtufdFH4SO@°-F9i^=Ls00-ĨCkRs ۏXQdbf@ s$iU]X5bX'$Z -3ŷW;B:;)uM >2gF5+ԞG-׋Ajgou.Ln *Of9"%!`8l}s33]F&Ӧp.,JN uZϚ{'"`0-]8Sfu MCeI㮮jR:ILњ2j`ݐB [q<1<$R){uKq"B5&T:g&"Ø5*EĶ$S aZf{ -oB~G]*ѱPKF 6G푾ar4ـۘ ZFj[q(ecbG:ǫ\xҏG -I`:D-F3!:-~0yU-ذLk %D -Hz0Ē^64\9_ H|'Z:^"J@L*Ū;+LAnE"k>Q9E>ߑU56suĈI[S[͍ .3yFp9w\t'|Ĝw&W?bی:ͼe$ e,Jl(gr kmwy@ Ι4O}=7X[%iDZB!*#F:rtim_]a w]BMN$e E3tg ']CϺ[zj:{]1ӥ0OJcs+MA{)*_{r3v:L&,a23+>q<g "Jo&yt׃Ce!X g}C&&ZT|y/TS`PxJo#cic&ƋcGgQʕ(sLa45V'M!iw!*$ -6oA }͈cCӽsYwt1f[jbZsJ{ QJ 33 b TOs\O>Sx6D?`.o9[] }6HxLHyZybhc 8W0Os$I[C/ Ax$='xy&nag1ӑ쥦„q04V6m\CBXZt>OL/u17$]Ez̹Z0m.|SǕ@3j }8vA]FTᎧ"=.X̙ܲ0ŘG p" 죤Elu%cZ9rB>K+y~i`ǝ$z'#|adՉ1£IE}aeׅ9}k``~m<`=י[&ID#'}|g1"nfY(E5Efk>)L6UQ2ua&m"߃˳ #3&3{x/K<¸bS}+[72_YrUl}KTY Kw1;NĨDB4T¼iX4n{'H0^m֪ + sW:#q1 ->JNژ .œy Q+& * L .<;Ih-u1f\{'2Lgp^a樰7`X2=h{ir\7uԉ0g -\q+smgpP_~LtbDh i*%IILE;25mCAk̚eOEMocᷭ=DS`(:crʹU=s) IKDR8?y#?qWqV#>xc'˳MBiԴq3D3Q {d/3q sDUY^B/{^×}HXKC~oEN1X^/签_1h;KBx5u}?{'i{ h=IJm<8Y}_VhrG^Tih{^~yzs4\ SehK!>UJuyٙu}%? Gӣ4Ll,&gcғxP&@;a~o3PAQ1H\WS0yYb24vL"ATia -֑{U~؉@˼2\@l;ic#u i&H?1:Wk L\pEw gwZw\v<c?l,}1bUrq_) m<ܷ <*:$ {i싩Mߘ>U\d4G&w'x)Mƶ+cRɑ{ D\ޅAW2#]CD6XzywZL f$Taߘw0$'$E'~SǸqҟLgW01e,Ŏ037LWX*jy9QypQw9lC%h|kaXW1r0і CPGR~۬.`*xF}fh  -H\GmՉLW]+2jX4o<((wjQ%*[}p QsoY@zk{Js~9ż91f - g$N{F{rMLX'{cHL.TBozm?Chr𔇠'wa~` 2co/ُ=n+-K?Vˆ&JeCٚVqmוmV1 -9KkOΡ(:Jc7hۯħXHuO(oSV^Ox:~vrڠe@dӗ]!R#syN?L/Yu'?uYRYM8?pxSZ'?dŗwȍkN+ +w"lhķw"2KE Mw2" X@Ї>V?mnxiqut)qu^ϧn.kJ &WylyH$g0g Q=/{a`ν[ϳ?DQ[`NIkz !Q'jNѤ% >TGQt8RdY+'ȯA߃a:T>e1jsT ~Hx0c4Ěfف`֣Ԟ9mpa& CcMD>|$(.j|;lw~=kZ?[sGh1pAGN( -2acL1 6\Lk6q0S@{-K@M1(:x>~QPc(s!τdxyqJI ˝NY'0$`JT?==p]3[n;qtq\]ܞ(_p=1'ɜ3 _vRaHpbD$i'0QxA~S -_Ĭ0Zu/,~, }f4"7;CiX - &S˗jyBh| 05W,[=sۂ˨CAO@;QQc c8:ׄ`+T?Z1ײ.S"7&9͒i Zu~0+3dޔ+nAV 06DWYboB1Dds++fڍQ -'ˍYa] 3YFXܿ'-;O{:vd6 `+5~[N"Ǯɱz~տ??/~?¯~//fY.e[~ ok9/Q6*AO!:Lx%ƄE)>{瘌jRTHs#aoXtL+#M/L%|uOeBD&/sXFG'Yƞ`>d}rH -OCm'w͙Ǽ`\&SBz\n?FZzy/7W}jr61%.a_kks^9C?ʇ1"g|ך||ۗ?~b4>"bOi&rr^e`ɆV/RP"ʳ 5꿍WsXg$c9b<&Ffc=OSB5qWĜi'qz[;7d٢kX.q1Li*(a3T?u? z0{ wq>'D>je6V;n; AyRnA7Yq`VEp5v%J UU&1`92 eޘ4)et<( -[7e'٥cW(\g+-TlEO($&"e4dV{֕x}u M%,Y@T>c=b U7]S {FEj R`غ$in<V˟3e%rӯߚHs17CG\XQ[2ꃱWB}렃 X0(fYR n2]ej#a5k,j'}BFgo Ѡzj>v?Z]o#"u6[^FcpGYPE4or~Wn־`ҹn4Tc6h<\Nje/ra>ca_l&]5ܲݫ\X'O/So U65rKD 4l΀\_iuPXM3ǎg,}Qga6SQόl$a{=o` wa>TlmL9ڍ@q 8Ѵ$LfHal1Tod,cr@G -J3( OZs˂8o `!=lJxkh":Xp!jfTYƘ'8 d4&k`n(?QM4gd7ߘ45 -6d{ӆ  IѮtC$*Id%ŏdqT΀]q=Iki똌vl'#k Wn>1ۺaeh0"vTĠj!"@ӧ&ao(t UFv=R~cөa4s0h(h<[8sVu93sV&=rG#:$i'-T*`07uNE9YfF.l s9&|ꨢ{5k#acL~Uy%1F%ޘLJw;n#f@8gᐾܤWӡ& -:H؟?{43\{e.vֿ #~T#<Ħ0Mh@oF -'JQNX 1E91CNq+ׅPs4ى#\j|?NN)ig! EoT[(~摖{l(9 kOd d_7R#LMmGN&ԉwĪ ._VQb_/NogFݩSzs. @vƂafUr >i$l#KRшChM*D&3ҵd_ 픑Oߣ<gtq.Vk%6\#f*{^E.R8mi˞KEkOii99k#%V:C(!٘5]׵.+gL_=j"e&KqMȜoVd$)t1,'Nn^vZfaVQaqA -%q| P\iy?(BhO!U*W|rV6Zt,c.]Ņjl/@"kG[q7&Ԧ?[uF;??-(#(pŪqM=׻H)mޞ}=X@Ae5לpY -=ڜ*f^2rw&YaFM{#^H_.jLޚW;K[Ns>kVވ)Dua8cM{Tb>#⌢pWL*mw m0Y}K&+5 䨁oZISCsiT`7B+e=+Ucwf4ܑH&5X<ڌ|npChFM6 -z49lYҽIyYjhb|a)2Tl\--:*WR%㛷8߬lAڒmD3KbOx*\E'^7޸(65:ofbWt'qi!.Ba5H2լJB̘(Ǭ\/nndwr}pݻqjZcnBV$rZ"?..w j^Y*y?Gf#2*Ov8kB].,&>b2T䂛Xg{R `Aݬ\WS,Q쳎<]bĄYZbp)]?ҕnyW}Y% -7:fKJ/I`&{:v<#9T&ܯ[R-ˎ=k.X-:u -ndN΍y6kӬIS'Pm_g C-,t$G&Gרop,BǬ\Q -o0jbs0Y^wi㔍;ҶUaI{~Wr% &꾶?G_ܹ.l~SWEYS+%g@k72 qf_b|$pQ 9tt`BW3z a0g8:+X¶;J~OA{vSz9)L@X}0%O-gi͎6}VcR~3mm6淽oRZF:ϬiKB9bj30W -"S =@kc]˱hcş2P.qqX~m2( t#bf61A,-r*:\\1 ڑ+rNykZ͚ *~&K8 sn9J^۾ç i|eDMos?T&jub Ù'Yp<\Q钟 J3B,79W\!IW[\phpBwrlRUle=x~4fI?\b0s3[^kgƥoO0êL"2rk .s)).f)PAmGgFl޸'HlUУQf{*5HBX1gK\ ;ʠ{0Vy6tV@J/7׬y\+ti_hRDMk PzOxϼf5~I gsvDr,a\MwEBiJ̚Oh8F b qh@Lt.@<(aGB.:|Y PgƩ@>j; CҊj> #հt45f -Xtpg=5R:/<h= a[GǗ%4W|.Q #lQbKBue"H%oͯI+5PZiF m5Vj\_/IxrTQ鵻KGA"A! }~85d{_}=&9LCiiYϡHY#8Y,C"zeY'ɂftQi Nu[4F5:l%9k -eo⨨p{pT @q]f% -nv"@Ԅ=*_vo&r[x5SM"ծpK moߓ1lVL:\5=p?y?4CFbLZin R3!YCp=_O5#6nNw%u;xƈ/[5;LOnщZ]#➅"^,R\,Jkac$sՅ;sC)0V/x^0>glu z=k܇spڑf&,D<Lh@2J($"{i*byu -!hs+G]-S8=[h2aq;k֒x5#4@uEN?]5Z!L3c7&`W8 L75Ĉ+g=(&4 %=cH|)kNTٍRkaO=qL37gru织W{R㈡3v SEfR̐RfW Z|LL% -\+4s]:ʵR Sa8h ѧ&K6N9o Vɦ{ -'Ơ{IdA&YEbhf}!G蓜P=Խh.n4;Zb]◁g?DqFt$]n9 ?^0L68wMgvEA1!Kh׾kķ?OR9Ԥa^䎒֙$k9D ){LwVێ;kozXއe-a;U3ԛ=DT]@` 11MGI"AiXlCk}kDT Uj\'9|O1vCPjs #o+ꤑn|@Y+9j?"ubvk5a+$i -ml#Jl"}U H D8=*)# @,xUԤ0 H6cSW5-f1nLDr/rw٠̖#X~L3!/0>E@[݋TH]ѵK(eSVSFm$-$` $skfr:|v&*P]`2?o #8,USuK<4rcl~dCYzr3yrF@0d艽&< dI6QܪzWf?ĥ+~Q85}%7y|^5jlN"$(s\(1}ᅭV-'% "}aHL oϧ#fެŞ?RpdgK;ٔ} -8twpVƵdw2S&=GmVW =S05iWueXsI4ߘ͔h(0jGaXy,/}J쯝t -5f&C{7\K|cOM>(F̠I\#!Z(wjxL/xc1L2dan+RNvM]!c`m]a߉ h?bQXiv)dgS -xq/4tOOSs/zi;I35A[GV ٌҔh@5ҧ_I1[""hƵkrq=#~J hghs#Z5.ayA'v-UjS#B|`Nf (!ΐUPLEXKU"_C;!09U?w<>IԸΠC-1{0]=K %6 CCJٙ3c%ڮДMيo y)Qc0 Sbt$C׮ n{$e:VlǴ8 - xB0@6^9k7?ˏ?o?;?|;?V>??^&+B1 1%yV`WA4Dkq2k./:dlH+ϵ0BcWjhTޝu֌nhlgy'yQ"SCɺ}5 ϮI|DyhKHHq0•+=ٌ& n M9lC y)[tE)9-LIXw߻X|'15$^ڻ XZR3aIlf芩 -|lmYX>ܬ5RS%TP275uңםIdog-KChQw|olJڂ(B/q &?:tXN K6K7of8X`fz\tx-zYia~`e:&XXkf`6t<"ް&a7sgEVvJSgTqw6ϭ%%*PZ5oKT"e~Nq2j6]&%Jt Yn@J`Bcs.E=1w5J ڌ]#p'FJcX%+;@p%{{5vG5"3NVu1GM;fjhI:y_r$۔d V,{--[Gjy$\7`˴2?[ɇx-1Otƞjm< -e -[5my P=!*.u \R2Xl7ON26&@dthU @qw!}IC-M|5^uԑX0Ls]Y60*:/3` Ma Hf4cyIWH*L$*{T,1M;•ta{A+T<3mu-ƪf)( -讉rcީ.Q_NWtuRO1M > q^(y"l(ο\H=6'Hwiw1/}EHQb05:P'%&ݫk~[F|4;kϢ>S$3s#D]:+lq(4/+[}L+)5<IZ_FnЖ㳚M7*D&3ҵd__ 픑O?溬gtq.Vk%6#3=p&s7)gδeOץߢ5~h'4\eVﺎC(!٘5]׵x ʝ<3i/52ݥ8&V]fdN7e$)t1,o'DBo-~ɰr+QaqA -%q| P\iy?(BhO!U*W|rV6Zt,c.]Ņjl/@"kG[q7&Ԧ?[uE;?v–w^~bոUTҞ] +mޞ}3X@Ae5לpY -=ڜ>*f^2rw&Y~aFM{#^H_.jLޚW;K[Ns>kVވ)Duc8cM{Tb>#⌢$1ls} T\ X`A2Faf1"&+Y 7w$I/-6#v1QMg[lR^F5mX - /+5wpK DʕTfb-7)$[Pd)̒S5 -W/t׍7. -4 ƞ6YM۬Y[P$9-`vw1q8dMh4=9޷PF ұzL5k﷼3918˨[3;ꮜs5\)c\V)Xۇe\경}!!p~~h~|?+yj6+i7j3,b1]S\+l/Z!,Ȼk5~jb%&O<|X)1a\iJ׏t%[U_|ox~fw $0[jh;~#9T&<[R-ˎ3k=kb8ܪ .^ -+YYƭī6EY d)Vɇy! W:#}v#kԷH8YZcg+ڸ<\2LVWSy8ecGŶmgX^2\C H5?>m+'w8"ȖZ7uE[4l5R Vr-.'Lj1M,W uȾN@ &zy:3GsV%lO~V2(`OβrJ/'?3DYf?~^I)_P6[snx+s%oPΠ&r -؃'L/va  還=Odݯt~2#x _SADr3cl40qq,*ePsVz^wX;T!vF`ztD.Li._(gjFb{8-qnAjݘJ=%߇+sVC?$.#NM¡Amނ0v- C1*HVp'_bGqGٱ+FBD6m.JWRc졆h\ ;A{Vjyڹ P6h җn߱j^e^A͑uOO׈wUT -$Kd#@ɣՈ{1 Oj`8%|x1"cѥt+)MK^s0AUBe-@!) Zr;ŰKC=zV160(AjW TGjKFgVwpB(,M^, ZF6F㩡4KnLw a jS+^#& \s\ ārͪyKiDG1VԜQ>&I'BzW161&9̅v2C=2q,!}>4Լ'ɂZ^bTQ\ YN= - is[[r4~CW* - ']34zh5. o]}ՔH&p^IFLP&1:-T{c@yHaVP%\s7NNW%y:x'Oùlּ?A˜DtbgȟxdHW+[[j @ixFxĝ!GӒf.='}]V1 z]5>8NMX0y. 0Ѐd-ΕPHD351<8RC9ÙΎWc;S8=7uwdW||Q)j=Кgj:|:kYZ!t3b7$]תy'Fp/F65b6kkUhdПU"x,IM+U?',A0}sdO;z~򐠛b(7ܫ -J"PTH-_LΙto)1B(u:*'\+頎vNTC> bXm!ԤyWwzajDy߯dRB#cP5R$S Wj"14ڳ 3p#IN4a7@A 1a*e {O5Q7Ul9 ?^i0L68VMm+CZBBA`Q ܹ\BN=~=jEA!KLkjķ?OR{qPBy3JqZG>wrlR 7\{6tzzLDՑ}kbj‚F7?ߒcD1Dt~d/(E&ՏFD=_T p4ϏQ3 -X@~33|| tce|MԑwՄ5쒜 RhF 7vU$^oHG[FxC6Ζ -ĄS)JM:d36uUsW3¬~ fDSN7Oj"1l{ JoقWK7SK iljбs -6R0#:W %lho=6t D`ntΠ*1֫e:&|0>Ȣ\%9إ>/Iyp˳}Rn̐f wgS#{ƑiV# ]Xj܉&< dK6Qܪzת/q錁rv$঑ Mᅁ_{FMéVdyc%'^Jcu'ĺ 2*fl- gL]V6ͮ'Yyce[6lNʸ -YKĺ盳+ua"tD>p]$R2obJ 4Q h 5G0WJr mAX5k&BҼ =kꃢj\)qvT'čp -+5B<ӱ&LsӟUlwQ5XpkcG8V"B`1ڭ,2m4. 4yjB>^$ 75\^#t+D )}##lFbiJ\@+}WRו.\59p iھb0W%gfƖ'dk9ң~Ss'WbdY5wBѰ7~lƔ3bT7ij4y uNQu@朗'%1ܔnv;@c=,a: aդ)J_rjDJA DO>p7 ^WdNQy8X%Z dWX5y,N8ΠCo.a:*=CZ(lԻ CCJ#c%UC)2_i 8w2RF Q&3 0\O!r-b?WMpM-&)P[}"8PhܦƋ+5\ٰGGӯ~~ok/~۾};nǾi@ti'\"RuRbӽU{s3^oIvZ@tJ*|\u*k6I2`yOIפ 眚ui]l'-W,zm3'j:tPףla$m\oӆ06ӌ9L-⊈۹ ,L,,1[K]ua{yJ GӺ}D2)@ jql?WFu>Zkbj\]zqXIkL=ML+ba>M%38Fɰ:s8pywt)dZDr |@RQSfp =c;$;%2fb0EBO -@+ -\RdO JSt*!R10n UB>?YwU9b#hYL_ vXvZM QX -&c-sH߉q`~0^CD -FP3e42s^ ?<0w`̥t6[cf'FJ)0'B0s e17 Wz"T֋J栾kǃ0ɵ1ʇζ?aᜆu{-a>>oh+֪*~o$$l#&p;W650v38N0F2i2lRTs0-Erl,w; -vQvØ-ƀjOR?W*vlP?.>-05NQ[JYJ^#fO{{,k,/w|tgnFo`o˚ԭnbwW2@OOuUZ!cu=?x0heČX{kWjVrmm c\It{jѤ-47a _^u5s0FŻ'\ٷv~?qƽ[;^&RSַ`Ҽsk/o%ݍ%UmH*|$ @Xdƾ% Ez\ƛ"[ݷ)i&&"l&l%hIvi6MpAp(?#W{!.m2cudduSzO3_t3}7?-mcEב́{/9тhƕ.xSLUjyEcEl&mv* C N.i0XlD0?.uA“+)DdNh}ylYzK4fD+͂c($k`Bv 0 ;wq:U h>̑rd5Q;O*oh10`ἡ0'ռ0t0k aRrs:#S 骆 G=-qD/ A5BZb Yg (۽ Vv:iA0:"K)qw?y~hf"Jt(y <%OQ"ߨ3gCwԙcdc;ϙ`$gpf~>J -\@ (} 3.Ys[g<ÆiZcaP\$ҬzW־ H" h0H2V 畟Wi3[3l0V3XR SS݊틉Z pX%6pVw[dc8l]sϢ.kBo1V3/,LY/i)+z݇9p -3c7Shh1!ŝ~#S %sI_yHv8rVmd*za6qR>3t?g-0-BMa!X4Dd7[n?+Vbs5 +گsw+g)^쀉Bt6Y 񌲫3Lo֗|^w_\s$<ܕMբvSx-粕iO1|Qi5b]ʼnO݀SȱnaO2όx씂=ώzȔJ#; -nwg?/*+jCnjzk9?/b?G7Pa|/c'ט-'[ˎ7-[V [I/b+:߸D`ʾc<`I٤#gX/{@N|~.}<{/kh%\{TX[2Y',SmXg4y/~nyWBH9noP=seO.PΠ qcqV07Kb廻zk+}1Ym.Xe+sUDa\~HJ\|vb35Bju5"jdz_js<3ݷѯ/~amsj TOXTRETB0d&–A1àyaKxFI{ Ӱ+Je\GT_ +u]upfOF¦zFCrsؙ\'aGա_E/2F h0&9OO"yޔ(anq-aٲobYht ҝg sHVd%Xވ#Kq$xM_Z+ʂv3dSlcY.F<~M_䤭AkE&>:Kvb(^A(N7e`bf7e,;eA1.^*QWweBz=9>^wBJ w9CH5nyqqS|*+? yP1b4|=R2 k lI_,>_gMS:ln_hD]{%=v<ȧ=\ z%c"/{vC!9v;bJso:;FޝgtO>ews >KI "Au-uw%4;GY sIO9s_s=>y켞h 9rHřWwd…8V4Y3G9M&*gf 휫l}-Nn-Y Z@иHs'iPS(rWNƊОc_F=_- Io!qLփΗ<ݫ ld}ʗ ҴkeY_3mY<ؕYVܶ-'bP/soY7e0 -NP'e†BD|VEŒ4zWWC]bglL5l{X%qf(}wF)^"jU2ȟ|A4neI)$RTa{{/j1oo/mXk'ULekY m?DYx`KiF}oiɼe/NnKpoXK|e.jiZn?|m5U96WƲڎhDg4ƻڲhDעvΩ<ַ'aq8:chpH{}fx=72R5>v%qc}J(Yc"g^,)#h3|M  7 < "%J$ZEӥ*E0@h۽m4HU;щ(Ys dQ(޼bnP -7EvÛec5z4=Ҍa18G,A4wX! $"dPgהVS7hz"_+M08öIă-Mۥ1Y -[֑zBMy-%fQMu̘oIÄ^*Rk~ +H$z2J'q#^:B4;jpT"wVErfϣ0ܫw%.l$ h̔`1 %}QrW\å{5˥bra$\"O}g+jrPaD#Lک ^n1P]=Zr{ߚa8У1ΣA5' 룉O;a:tOh6eݮH/gy We`K)Ҟ#W{' \){i"I]+[K4]}4-)3?^s_3Hܷꭎ8H^ 0׷}M%M=U}-ؗU2ި׏eh#`Tmž :L3ޕǹ/wk"+lx:)T.=w,b/)# u` q=^iq1*^4.0"8pK3 g)k@je4]:AZ;6VwFPt4A82եgMv+C;ȢYU`}]3UXFh c_F1 Lft2;HCh+. Y,cKє as.1el<&s,q&NV4"Ύ%}3y׻˒PjTIwUJiٔX7lư^;L4w/7 Sw`f&~ endstream endobj 24 0 obj <>stream -Hʥ9axMU% 7 "#:0 s>+ow{vϪU+ezx++ӺGX+`ódKV2k^󕖫blxG[mYo\|WσIY=F/+aՖ}ԁT8nܘ|{F1˹>`;궦0@**19g`Rk^m~/?~ן^竽['s_ҍ_˛ןB rhO8Ǡgi;x:݅ K1j|3) -"$]fZH䵄Ib|灘 u i[,? S3D kM*1""Tr\Ud@TO}pcU9jCh3x91 B]I9V $`xH^aNkv ()>H3#MdLtn$[nncPXp`1I'fҌ8Ϩ?l~6neXhxaRjFvw5Q9ccarqZ-3占HGdY~q!7C- g{.! ]KQFLz7JHvZ]D2mW΃A֙}ڗ߹;0WBya$f/#c(R}ڻf'IbWZYV``\`ȒtI}scH^~Bf608]dszF}0)Tk,SCc'Ck!T 76CfA2RUEH -j;ZcTJ3S˜̄|Q:aYAAgIZ@P1SAYqaI|0P2ɆL5bG9aL  f8B[)z'Ub 1  sOeKr95v+dQK?6~Maah߈aMmNR;ug=3䆴B8t%6b&xV[)ɸ1~Gvcu{Zl(ڪwa5Vܫ:juqVYcP\ *);CPaI>~e!T/fW6wCYAIE:`XHpuɚN5o3 -D˚D|u-ˮDHSL:_ L Uu(TU -` -y^%5&[MAp"U[E u`moP2<eފֱepB3!R־p>C;kZ[Xz,OȢ^lddFy+z}*WcV=2hsRv7a@pju5s`,$WONje[ְyT?|!.r`JS)Hjyq9oC\A -Ыw>(,"Cl"y{A_h]yWSJCՙWbhXc o&NG CE^`vQ[U&M^W`Щ9D_kU07s]=!,.LEZZ`&u^h8 )LJ*YD՟xiB UN2鴓`y#@@FWlHf.bQLN"^z%!RzHVX] x4+Ì$0ĕB0wNZRj9|0Ms4+d4FcΆԶۺ4NiA/ineؑŞgMLWt:gk9 :( "j~ W -nF Ol FT!Pl@#idTh!fe,&oV|f̒9֒C9 -_:^ LLaDDܘe:X>E xw=OL`l^T!g (}G^ -(8asf[ՃY4cG=R+Fӊ\Ex>t+#Qf#51 bh}]ElWo f@BJhSFߚv^dc:|(no)#Z°,8dc4b5I2‰2 -a~ Xrذ;?X+ 5AQ/RpyY &~sI7p\M̌6j -YC;x.[f 1wcegJٹX N|zYhN!U='RF\R9W.GT\QX,6Ce/*? -b5j9^17j2_~_8PJ&yRKl}Mˎ;V'͖R%0-rEWeg'SKa%eV#>gǃ؃oM'Z.}@pڴv1Slc,z#._䤭]7r O4r:eA3.pUloEBnwuctŸLvH䵃H:.m*<>J7q즒[}BHE -uyRm❉p{u_>WrE,tC:C!=+e ߈~'0ywD\x0n*;n9rb.bOv#bXc3{ -xU ;\˼3^s04Lw?k -$ lz;=_q6!`M; A}A\Q&ob &U(P{9-oLv.`s/*g׻ᮀG԰<iF=hn9Te?—` 8+ Fdc]i;NGŦFC uJq/L4)ߺ5"Jj 2#DWL͠:gV\gcgb-z C*ZV8rU{zխ&Z/Ceh_1X3hw[@2 3y,18-n^Ֆғ+< g6~:&.l-Vy {QbؗKs5y}Kl3*ZsI-o#"eNX%74XѕHq.]Soi渝dD7{U._]vQؐhӽl.ٖHj8A.}ir"y5:y-:c7`SG@B2:% tu[@JxyqC,B̘hH fJPdFXLE8+M=UBC\R*9GVOٜ4(@2q*Uw34dS$v*SC\'^VQX/UTFC}bRpo UA&L(Sh;ndK#yG!4#^4T45{gAD}K.\cR{լ7oH|>sܥt, -iQ<_wïf?4-OsåуK]Uzp `Ѿ>YB#~O!NQ2]S yv[~K'ߡkLbva( O۽Lc-xϷ˶,?e]we^uQݗ*S<:bU -q|{;`- endstream endobj 6 0 obj [5 0 R] endobj 25 0 obj <> endobj xref 0 26 0000000000 65535 f -0000000016 00000 n -0000000144 00000 n -0000025173 00000 n -0000000000 00000 f -0000065496 00000 n -0000216446 00000 n -0000025224 00000 n -0000025562 00000 n -0000065799 00000 n -0000065686 00000 n -0000064745 00000 n -0000064935 00000 n -0000064983 00000 n -0000065570 00000 n -0000065601 00000 n -0000065872 00000 n -0000066155 00000 n -0000067473 00000 n -0000085125 00000 n -0000098214 00000 n -0000119906 00000 n -0000150354 00000 n -0000180599 00000 n -0000210222 00000 n -0000216469 00000 n -trailer <<636425E0298441309A895498F62E903C>]>> startxref 216662 %%EOF \ No newline at end of file diff --git a/esp_websocket_client/_static/file.png b/esp_websocket_client/_static/file.png deleted file mode 100644 index a858a410e..000000000 Binary files a/esp_websocket_client/_static/file.png and /dev/null differ diff --git a/esp_websocket_client/_static/jquery-3.5.1.js b/esp_websocket_client/_static/jquery-3.5.1.js deleted file mode 100644 index 50937333b..000000000 --- a/esp_websocket_client/_static/jquery-3.5.1.js +++ /dev/null @@ -1,10872 +0,0 @@ -/*! - * jQuery JavaScript Library v3.5.1 - * https://jquery.com/ - * - * Includes Sizzle.js - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors - * Released under the MIT license - * https://jquery.org/license - * - * Date: 2020-05-04T22:49Z - */ -( function( global, factory ) { - - "use strict"; - - if ( typeof module === "object" && typeof module.exports === "object" ) { - - // For CommonJS and CommonJS-like environments where a proper `window` - // is present, execute the factory and get jQuery. - // For environments that do not have a `window` with a `document` - // (such as Node.js), expose a factory as module.exports. - // This accentuates the need for the creation of a real `window`. - // e.g. var jQuery = require("jquery")(window); - // See ticket #14549 for more info. - module.exports = global.document ? - factory( global, true ) : - function( w ) { - if ( !w.document ) { - throw new Error( "jQuery requires a window with a document" ); - } - return factory( w ); - }; - } else { - factory( global ); - } - -// Pass this if window is not defined yet -} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { - -// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 -// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode -// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common -// enough that all such attempts are guarded in a try block. -"use strict"; - -var arr = []; - -var getProto = Object.getPrototypeOf; - -var slice = arr.slice; - -var flat = arr.flat ? function( array ) { - return arr.flat.call( array ); -} : function( array ) { - return arr.concat.apply( [], array ); -}; - - -var push = arr.push; - -var indexOf = arr.indexOf; - -var class2type = {}; - -var toString = class2type.toString; - -var hasOwn = class2type.hasOwnProperty; - -var fnToString = hasOwn.toString; - -var ObjectFunctionString = fnToString.call( Object ); - -var support = {}; - -var isFunction = function isFunction( obj ) { - - // Support: Chrome <=57, Firefox <=52 - // In some browsers, typeof returns "function" for HTML elements - // (i.e., `typeof document.createElement( "object" ) === "function"`). - // We don't want to classify *any* DOM node as a function. - return typeof obj === "function" && typeof obj.nodeType !== "number"; - }; - - -var isWindow = function isWindow( obj ) { - return obj != null && obj === obj.window; - }; - - -var document = window.document; - - - - var preservedScriptAttributes = { - type: true, - src: true, - nonce: true, - noModule: true - }; - - function DOMEval( code, node, doc ) { - doc = doc || document; - - var i, val, - script = doc.createElement( "script" ); - - script.text = code; - if ( node ) { - for ( i in preservedScriptAttributes ) { - - // Support: Firefox 64+, Edge 18+ - // Some browsers don't support the "nonce" property on scripts. - // On the other hand, just using `getAttribute` is not enough as - // the `nonce` attribute is reset to an empty string whenever it - // becomes browsing-context connected. - // See https://github.com/whatwg/html/issues/2369 - // See https://html.spec.whatwg.org/#nonce-attributes - // The `node.getAttribute` check was added for the sake of - // `jQuery.globalEval` so that it can fake a nonce-containing node - // via an object. - val = node[ i ] || node.getAttribute && node.getAttribute( i ); - if ( val ) { - script.setAttribute( i, val ); - } - } - } - doc.head.appendChild( script ).parentNode.removeChild( script ); - } - - -function toType( obj ) { - if ( obj == null ) { - return obj + ""; - } - - // Support: Android <=2.3 only (functionish RegExp) - return typeof obj === "object" || typeof obj === "function" ? - class2type[ toString.call( obj ) ] || "object" : - typeof obj; -} -/* global Symbol */ -// Defining this global in .eslintrc.json would create a danger of using the global -// unguarded in another place, it seems safer to define global only for this module - - - -var - version = "3.5.1", - - // Define a local copy of jQuery - jQuery = function( selector, context ) { - - // The jQuery object is actually just the init constructor 'enhanced' - // Need init if jQuery is called (just allow error to be thrown if not included) - return new jQuery.fn.init( selector, context ); - }; - -jQuery.fn = jQuery.prototype = { - - // The current version of jQuery being used - jquery: version, - - constructor: jQuery, - - // The default length of a jQuery object is 0 - length: 0, - - toArray: function() { - return slice.call( this ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - - // Return all the elements in a clean array - if ( num == null ) { - return slice.call( this ); - } - - // Return just the one element from the set - return num < 0 ? this[ num + this.length ] : this[ num ]; - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems ) { - - // Build a new jQuery matched element set - var ret = jQuery.merge( this.constructor(), elems ); - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - each: function( callback ) { - return jQuery.each( this, callback ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map( this, function( elem, i ) { - return callback.call( elem, i, elem ); - } ) ); - }, - - slice: function() { - return this.pushStack( slice.apply( this, arguments ) ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - even: function() { - return this.pushStack( jQuery.grep( this, function( _elem, i ) { - return ( i + 1 ) % 2; - } ) ); - }, - - odd: function() { - return this.pushStack( jQuery.grep( this, function( _elem, i ) { - return i % 2; - } ) ); - }, - - eq: function( i ) { - var len = this.length, - j = +i + ( i < 0 ? len : 0 ); - return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); - }, - - end: function() { - return this.prevObject || this.constructor(); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: arr.sort, - splice: arr.splice -}; - -jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, - target = arguments[ 0 ] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - - // Skip the boolean and the target - target = arguments[ i ] || {}; - i++; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !isFunction( target ) ) { - target = {}; - } - - // Extend jQuery itself if only one argument is passed - if ( i === length ) { - target = this; - i--; - } - - for ( ; i < length; i++ ) { - - // Only deal with non-null/undefined values - if ( ( options = arguments[ i ] ) != null ) { - - // Extend the base object - for ( name in options ) { - copy = options[ name ]; - - // Prevent Object.prototype pollution - // Prevent never-ending loop - if ( name === "__proto__" || target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject( copy ) || - ( copyIsArray = Array.isArray( copy ) ) ) ) { - src = target[ name ]; - - // Ensure proper type for the source value - if ( copyIsArray && !Array.isArray( src ) ) { - clone = []; - } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { - clone = {}; - } else { - clone = src; - } - copyIsArray = false; - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend( { - - // Unique for each copy of jQuery on the page - expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), - - // Assume jQuery is ready without the ready module - isReady: true, - - error: function( msg ) { - throw new Error( msg ); - }, - - noop: function() {}, - - isPlainObject: function( obj ) { - var proto, Ctor; - - // Detect obvious negatives - // Use toString instead of jQuery.type to catch host objects - if ( !obj || toString.call( obj ) !== "[object Object]" ) { - return false; - } - - proto = getProto( obj ); - - // Objects with no prototype (e.g., `Object.create( null )`) are plain - if ( !proto ) { - return true; - } - - // Objects with prototype are plain iff they were constructed by a global Object function - Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; - return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; - }, - - isEmptyObject: function( obj ) { - var name; - - for ( name in obj ) { - return false; - } - return true; - }, - - // Evaluates a script in a provided context; falls back to the global one - // if not specified. - globalEval: function( code, options, doc ) { - DOMEval( code, { nonce: options && options.nonce }, doc ); - }, - - each: function( obj, callback ) { - var length, i = 0; - - if ( isArrayLike( obj ) ) { - length = obj.length; - for ( ; i < length; i++ ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } else { - for ( i in obj ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } - - return obj; - }, - - // results is for internal usage only - makeArray: function( arr, results ) { - var ret = results || []; - - if ( arr != null ) { - if ( isArrayLike( Object( arr ) ) ) { - jQuery.merge( ret, - typeof arr === "string" ? - [ arr ] : arr - ); - } else { - push.call( ret, arr ); - } - } - - return ret; - }, - - inArray: function( elem, arr, i ) { - return arr == null ? -1 : indexOf.call( arr, elem, i ); - }, - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - merge: function( first, second ) { - var len = +second.length, - j = 0, - i = first.length; - - for ( ; j < len; j++ ) { - first[ i++ ] = second[ j ]; - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, invert ) { - var callbackInverse, - matches = [], - i = 0, - length = elems.length, - callbackExpect = !invert; - - // Go through the array, only saving the items - // that pass the validator function - for ( ; i < length; i++ ) { - callbackInverse = !callback( elems[ i ], i ); - if ( callbackInverse !== callbackExpect ) { - matches.push( elems[ i ] ); - } - } - - return matches; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var length, value, - i = 0, - ret = []; - - // Go through the array, translating each of the items to their new values - if ( isArrayLike( elems ) ) { - length = elems.length; - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - - // Go through every key on the object, - } else { - for ( i in elems ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - } - - // Flatten any nested arrays - return flat( ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // jQuery.support is not used in Core but other projects attach their - // properties to it so it needs to exist. - support: support -} ); - -if ( typeof Symbol === "function" ) { - jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; -} - -// Populate the class2type map -jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), -function( _i, name ) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -} ); - -function isArrayLike( obj ) { - - // Support: real iOS 8.2 only (not reproducible in simulator) - // `in` check used to prevent JIT error (gh-2145) - // hasOwn isn't used here due to false negatives - // regarding Nodelist length in IE - var length = !!obj && "length" in obj && obj.length, - type = toType( obj ); - - if ( isFunction( obj ) || isWindow( obj ) ) { - return false; - } - - return type === "array" || length === 0 || - typeof length === "number" && length > 0 && ( length - 1 ) in obj; -} -var Sizzle = -/*! - * Sizzle CSS Selector Engine v2.3.5 - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors - * Released under the MIT license - * https://js.foundation/ - * - * Date: 2020-03-14 - */ -( function( window ) { -var i, - support, - Expr, - getText, - isXML, - tokenize, - compile, - select, - outermostContext, - sortInput, - hasDuplicate, - - // Local document vars - setDocument, - document, - docElem, - documentIsHTML, - rbuggyQSA, - rbuggyMatches, - matches, - contains, - - // Instance-specific data - expando = "sizzle" + 1 * new Date(), - preferredDoc = window.document, - dirruns = 0, - done = 0, - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - nonnativeSelectorCache = createCache(), - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - } - return 0; - }, - - // Instance methods - hasOwn = ( {} ).hasOwnProperty, - arr = [], - pop = arr.pop, - pushNative = arr.push, - push = arr.push, - slice = arr.slice, - - // Use a stripped-down indexOf as it's faster than native - // https://jsperf.com/thor-indexof-vs-for/5 - indexOf = function( list, elem ) { - var i = 0, - len = list.length; - for ( ; i < len; i++ ) { - if ( list[ i ] === elem ) { - return i; - } - } - return -1; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" + - "ismap|loop|multiple|open|readonly|required|scoped", - - // Regular expressions - - // http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - - // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram - identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + - "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", - - // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + - - // Operator (capture 2) - "*([*^$|!~]?=)" + whitespace + - - // "Attribute values must be CSS identifiers [capture 5] - // or strings [capture 3 or capture 4]" - "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + - whitespace + "*\\]", - - pseudos = ":(" + identifier + ")(?:\\((" + - - // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: - // 1. quoted (capture 3; capture 4 or capture 5) - "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + - - // 2. simple (capture 6) - "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + - - // 3. anything else (capture 2) - ".*" + - ")\\)|)", - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rwhitespace = new RegExp( whitespace + "+", "g" ), - rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + - whitespace + "+$", "g" ), - - rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + - "*" ), - rdescend = new RegExp( whitespace + "|>" ), - - rpseudo = new RegExp( pseudos ), - ridentifier = new RegExp( "^" + identifier + "$" ), - - matchExpr = { - "ID": new RegExp( "^#(" + identifier + ")" ), - "CLASS": new RegExp( "^\\.(" + identifier + ")" ), - "TAG": new RegExp( "^(" + identifier + "|[*])" ), - "ATTR": new RegExp( "^" + attributes ), - "PSEUDO": new RegExp( "^" + pseudos ), - "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + - whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + - whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), - - // For use in libraries implementing .is() - // We use this for POS matching in `select` - "needsContext": new RegExp( "^" + whitespace + - "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + - "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) - }, - - rhtml = /HTML$/i, - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - - rnative = /^[^{]+\{\s*\[native \w/, - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - - rsibling = /[+~]/, - - // CSS escapes - // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ), - funescape = function( escape, nonHex ) { - var high = "0x" + escape.slice( 1 ) - 0x10000; - - return nonHex ? - - // Strip the backslash prefix from a non-hex escape sequence - nonHex : - - // Replace a hexadecimal escape sequence with the encoded Unicode code point - // Support: IE <=11+ - // For values outside the Basic Multilingual Plane (BMP), manually construct a - // surrogate pair - high < 0 ? - String.fromCharCode( high + 0x10000 ) : - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }, - - // CSS string/identifier serialization - // https://drafts.csswg.org/cssom/#common-serializing-idioms - rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, - fcssescape = function( ch, asCodePoint ) { - if ( asCodePoint ) { - - // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER - if ( ch === "\0" ) { - return "\uFFFD"; - } - - // Control characters and (dependent upon position) numbers get escaped as code points - return ch.slice( 0, -1 ) + "\\" + - ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; - } - - // Other potentially-special ASCII characters get backslash-escaped - return "\\" + ch; - }, - - // Used for iframes - // See setDocument() - // Removing the function wrapper causes a "Permission Denied" - // error in IE - unloadHandler = function() { - setDocument(); - }, - - inDisabledFieldset = addCombinator( - function( elem ) { - return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; - }, - { dir: "parentNode", next: "legend" } - ); - -// Optimize for push.apply( _, NodeList ) -try { - push.apply( - ( arr = slice.call( preferredDoc.childNodes ) ), - preferredDoc.childNodes - ); - - // Support: Android<4.0 - // Detect silently failing push.apply - // eslint-disable-next-line no-unused-expressions - arr[ preferredDoc.childNodes.length ].nodeType; -} catch ( e ) { - push = { apply: arr.length ? - - // Leverage slice if possible - function( target, els ) { - pushNative.apply( target, slice.call( els ) ); - } : - - // Support: IE<9 - // Otherwise append directly - function( target, els ) { - var j = target.length, - i = 0; - - // Can't trust NodeList.length - while ( ( target[ j++ ] = els[ i++ ] ) ) {} - target.length = j - 1; - } - }; -} - -function Sizzle( selector, context, results, seed ) { - var m, i, elem, nid, match, groups, newSelector, - newContext = context && context.ownerDocument, - - // nodeType defaults to 9, since context defaults to document - nodeType = context ? context.nodeType : 9; - - results = results || []; - - // Return early from calls with invalid selector or context - if ( typeof selector !== "string" || !selector || - nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { - - return results; - } - - // Try to shortcut find operations (as opposed to filters) in HTML documents - if ( !seed ) { - setDocument( context ); - context = context || document; - - if ( documentIsHTML ) { - - // If the selector is sufficiently simple, try using a "get*By*" DOM method - // (excepting DocumentFragment context, where the methods don't exist) - if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { - - // ID selector - if ( ( m = match[ 1 ] ) ) { - - // Document context - if ( nodeType === 9 ) { - if ( ( elem = context.getElementById( m ) ) ) { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( elem.id === m ) { - results.push( elem ); - return results; - } - } else { - return results; - } - - // Element context - } else { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( newContext && ( elem = newContext.getElementById( m ) ) && - contains( context, elem ) && - elem.id === m ) { - - results.push( elem ); - return results; - } - } - - // Type selector - } else if ( match[ 2 ] ) { - push.apply( results, context.getElementsByTagName( selector ) ); - return results; - - // Class selector - } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName && - context.getElementsByClassName ) { - - push.apply( results, context.getElementsByClassName( m ) ); - return results; - } - } - - // Take advantage of querySelectorAll - if ( support.qsa && - !nonnativeSelectorCache[ selector + " " ] && - ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) && - - // Support: IE 8 only - // Exclude object elements - ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) { - - newSelector = selector; - newContext = context; - - // qSA considers elements outside a scoping root when evaluating child or - // descendant combinators, which is not what we want. - // In such cases, we work around the behavior by prefixing every selector in the - // list with an ID selector referencing the scope context. - // The technique has to be used as well when a leading combinator is used - // as such selectors are not recognized by querySelectorAll. - // Thanks to Andrew Dupont for this technique. - if ( nodeType === 1 && - ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) { - - // Expand context for sibling selectors - newContext = rsibling.test( selector ) && testContext( context.parentNode ) || - context; - - // We can use :scope instead of the ID hack if the browser - // supports it & if we're not changing the context. - if ( newContext !== context || !support.scope ) { - - // Capture the context ID, setting it first if necessary - if ( ( nid = context.getAttribute( "id" ) ) ) { - nid = nid.replace( rcssescape, fcssescape ); - } else { - context.setAttribute( "id", ( nid = expando ) ); - } - } - - // Prefix every selector in the list - groups = tokenize( selector ); - i = groups.length; - while ( i-- ) { - groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + - toSelector( groups[ i ] ); - } - newSelector = groups.join( "," ); - } - - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch ( qsaError ) { - nonnativeSelectorCache( selector, true ); - } finally { - if ( nid === expando ) { - context.removeAttribute( "id" ); - } - } - } - } - } - - // All others - return select( selector.replace( rtrim, "$1" ), context, results, seed ); -} - -/** - * Create key-value caches of limited size - * @returns {function(string, object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ -function createCache() { - var keys = []; - - function cache( key, value ) { - - // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) - if ( keys.push( key + " " ) > Expr.cacheLength ) { - - // Only keep the most recent entries - delete cache[ keys.shift() ]; - } - return ( cache[ key + " " ] = value ); - } - return cache; -} - -/** - * Mark a function for special use by Sizzle - * @param {Function} fn The function to mark - */ -function markFunction( fn ) { - fn[ expando ] = true; - return fn; -} - -/** - * Support testing using an element - * @param {Function} fn Passed the created element and returns a boolean result - */ -function assert( fn ) { - var el = document.createElement( "fieldset" ); - - try { - return !!fn( el ); - } catch ( e ) { - return false; - } finally { - - // Remove from its parent by default - if ( el.parentNode ) { - el.parentNode.removeChild( el ); - } - - // release memory in IE - el = null; - } -} - -/** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ -function addHandle( attrs, handler ) { - var arr = attrs.split( "|" ), - i = arr.length; - - while ( i-- ) { - Expr.attrHandle[ arr[ i ] ] = handler; - } -} - -/** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ -function siblingCheck( a, b ) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && - a.sourceIndex - b.sourceIndex; - - // Use IE sourceIndex if available on both nodes - if ( diff ) { - return diff; - } - - // Check if b follows a - if ( cur ) { - while ( ( cur = cur.nextSibling ) ) { - if ( cur === b ) { - return -1; - } - } - } - - return a ? 1 : -1; -} - -/** - * Returns a function to use in pseudos for input types - * @param {String} type - */ -function createInputPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ -function createButtonPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return ( name === "input" || name === "button" ) && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for :enabled/:disabled - * @param {Boolean} disabled true for :disabled; false for :enabled - */ -function createDisabledPseudo( disabled ) { - - // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable - return function( elem ) { - - // Only certain elements can match :enabled or :disabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled - if ( "form" in elem ) { - - // Check for inherited disabledness on relevant non-disabled elements: - // * listed form-associated elements in a disabled fieldset - // https://html.spec.whatwg.org/multipage/forms.html#category-listed - // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled - // * option elements in a disabled optgroup - // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled - // All such elements have a "form" property. - if ( elem.parentNode && elem.disabled === false ) { - - // Option elements defer to a parent optgroup if present - if ( "label" in elem ) { - if ( "label" in elem.parentNode ) { - return elem.parentNode.disabled === disabled; - } else { - return elem.disabled === disabled; - } - } - - // Support: IE 6 - 11 - // Use the isDisabled shortcut property to check for disabled fieldset ancestors - return elem.isDisabled === disabled || - - // Where there is no isDisabled, check manually - /* jshint -W018 */ - elem.isDisabled !== !disabled && - inDisabledFieldset( elem ) === disabled; - } - - return elem.disabled === disabled; - - // Try to winnow out elements that can't be disabled before trusting the disabled property. - // Some victims get caught in our net (label, legend, menu, track), but it shouldn't - // even exist on them, let alone have a boolean value. - } else if ( "label" in elem ) { - return elem.disabled === disabled; - } - - // Remaining elements are neither :enabled nor :disabled - return false; - }; -} - -/** - * Returns a function to use in pseudos for positionals - * @param {Function} fn - */ -function createPositionalPseudo( fn ) { - return markFunction( function( argument ) { - argument = +argument; - return markFunction( function( seed, matches ) { - var j, - matchIndexes = fn( [], seed.length, argument ), - i = matchIndexes.length; - - // Match elements found at the specified indexes - while ( i-- ) { - if ( seed[ ( j = matchIndexes[ i ] ) ] ) { - seed[ j ] = !( matches[ j ] = seed[ j ] ); - } - } - } ); - } ); -} - -/** - * Checks a node for validity as a Sizzle context - * @param {Element|Object=} context - * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value - */ -function testContext( context ) { - return context && typeof context.getElementsByTagName !== "undefined" && context; -} - -// Expose support vars for convenience -support = Sizzle.support = {}; - -/** - * Detects XML nodes - * @param {Element|Object} elem An element or a document - * @returns {Boolean} True iff elem is a non-HTML XML node - */ -isXML = Sizzle.isXML = function( elem ) { - var namespace = elem.namespaceURI, - docElem = ( elem.ownerDocument || elem ).documentElement; - - // Support: IE <=8 - // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes - // https://bugs.jquery.com/ticket/4833 - return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); -}; - -/** - * Sets document-related variables once based on the current document - * @param {Element|Object} [doc] An element or document object to use to set the document - * @returns {Object} Returns the current document - */ -setDocument = Sizzle.setDocument = function( node ) { - var hasCompare, subWindow, - doc = node ? node.ownerDocument || node : preferredDoc; - - // Return early if doc is invalid or already selected - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { - return document; - } - - // Update global variables - document = doc; - docElem = document.documentElement; - documentIsHTML = !isXML( document ); - - // Support: IE 9 - 11+, Edge 12 - 18+ - // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( preferredDoc != document && - ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { - - // Support: IE 11, Edge - if ( subWindow.addEventListener ) { - subWindow.addEventListener( "unload", unloadHandler, false ); - - // Support: IE 9 - 10 only - } else if ( subWindow.attachEvent ) { - subWindow.attachEvent( "onunload", unloadHandler ); - } - } - - // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only, - // Safari 4 - 5 only, Opera <=11.6 - 12.x only - // IE/Edge & older browsers don't support the :scope pseudo-class. - // Support: Safari 6.0 only - // Safari 6.0 supports :scope but it's an alias of :root there. - support.scope = assert( function( el ) { - docElem.appendChild( el ).appendChild( document.createElement( "div" ) ); - return typeof el.querySelectorAll !== "undefined" && - !el.querySelectorAll( ":scope fieldset div" ).length; - } ); - - /* Attributes - ---------------------------------------------------------------------- */ - - // Support: IE<8 - // Verify that getAttribute really returns attributes and not properties - // (excepting IE8 booleans) - support.attributes = assert( function( el ) { - el.className = "i"; - return !el.getAttribute( "className" ); - } ); - - /* getElement(s)By* - ---------------------------------------------------------------------- */ - - // Check if getElementsByTagName("*") returns only elements - support.getElementsByTagName = assert( function( el ) { - el.appendChild( document.createComment( "" ) ); - return !el.getElementsByTagName( "*" ).length; - } ); - - // Support: IE<9 - support.getElementsByClassName = rnative.test( document.getElementsByClassName ); - - // Support: IE<10 - // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programmatically-set names, - // so use a roundabout getElementsByName test - support.getById = assert( function( el ) { - docElem.appendChild( el ).id = expando; - return !document.getElementsByName || !document.getElementsByName( expando ).length; - } ); - - // ID filter and find - if ( support.getById ) { - Expr.filter[ "ID" ] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - return elem.getAttribute( "id" ) === attrId; - }; - }; - Expr.find[ "ID" ] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var elem = context.getElementById( id ); - return elem ? [ elem ] : []; - } - }; - } else { - Expr.filter[ "ID" ] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - var node = typeof elem.getAttributeNode !== "undefined" && - elem.getAttributeNode( "id" ); - return node && node.value === attrId; - }; - }; - - // Support: IE 6 - 7 only - // getElementById is not reliable as a find shortcut - Expr.find[ "ID" ] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var node, i, elems, - elem = context.getElementById( id ); - - if ( elem ) { - - // Verify the id attribute - node = elem.getAttributeNode( "id" ); - if ( node && node.value === id ) { - return [ elem ]; - } - - // Fall back on getElementsByName - elems = context.getElementsByName( id ); - i = 0; - while ( ( elem = elems[ i++ ] ) ) { - node = elem.getAttributeNode( "id" ); - if ( node && node.value === id ) { - return [ elem ]; - } - } - } - - return []; - } - }; - } - - // Tag - Expr.find[ "TAG" ] = support.getElementsByTagName ? - function( tag, context ) { - if ( typeof context.getElementsByTagName !== "undefined" ) { - return context.getElementsByTagName( tag ); - - // DocumentFragment nodes don't have gEBTN - } else if ( support.qsa ) { - return context.querySelectorAll( tag ); - } - } : - - function( tag, context ) { - var elem, - tmp = [], - i = 0, - - // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too - results = context.getElementsByTagName( tag ); - - // Filter out possible comments - if ( tag === "*" ) { - while ( ( elem = results[ i++ ] ) ) { - if ( elem.nodeType === 1 ) { - tmp.push( elem ); - } - } - - return tmp; - } - return results; - }; - - // Class - Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) { - if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { - return context.getElementsByClassName( className ); - } - }; - - /* QSA/matchesSelector - ---------------------------------------------------------------------- */ - - // QSA and matchesSelector support - - // matchesSelector(:active) reports false when true (IE9/Opera 11.5) - rbuggyMatches = []; - - // qSa(:focus) reports false when true (Chrome 21) - // We allow this because of a bug in IE8/9 that throws an error - // whenever `document.activeElement` is accessed on an iframe - // So, we allow :focus to pass through QSA all the time to avoid the IE error - // See https://bugs.jquery.com/ticket/13378 - rbuggyQSA = []; - - if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) { - - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert( function( el ) { - - var input; - - // Select is set to empty string on purpose - // This is to test IE's treatment of not explicitly - // setting a boolean content attribute, - // since its presence should be enough - // https://bugs.jquery.com/ticket/12359 - docElem.appendChild( el ).innerHTML = "" + - ""; - - // Support: IE8, Opera 11-12.16 - // Nothing should be selected when empty strings follow ^= or $= or *= - // The test attribute must be unknown in Opera but "safe" for WinRT - // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section - if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) { - rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); - } - - // Support: IE8 - // Boolean attributes and "value" are not treated correctly - if ( !el.querySelectorAll( "[selected]" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); - } - - // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ - if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { - rbuggyQSA.push( "~=" ); - } - - // Support: IE 11+, Edge 15 - 18+ - // IE 11/Edge don't find elements on a `[name='']` query in some cases. - // Adding a temporary attribute to the document before the selection works - // around the issue. - // Interestingly, IE 10 & older don't seem to have the issue. - input = document.createElement( "input" ); - input.setAttribute( "name", "" ); - el.appendChild( input ); - if ( !el.querySelectorAll( "[name='']" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + - whitespace + "*(?:''|\"\")" ); - } - - // Webkit/Opera - :checked should return selected option elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - // IE8 throws error here and will not see later tests - if ( !el.querySelectorAll( ":checked" ).length ) { - rbuggyQSA.push( ":checked" ); - } - - // Support: Safari 8+, iOS 8+ - // https://bugs.webkit.org/show_bug.cgi?id=136851 - // In-page `selector#id sibling-combinator selector` fails - if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { - rbuggyQSA.push( ".#.+[+~]" ); - } - - // Support: Firefox <=3.6 - 5 only - // Old Firefox doesn't throw on a badly-escaped identifier. - el.querySelectorAll( "\\\f" ); - rbuggyQSA.push( "[\\r\\n\\f]" ); - } ); - - assert( function( el ) { - el.innerHTML = "" + - ""; - - // Support: Windows 8 Native Apps - // The type and name attributes are restricted during .innerHTML assignment - var input = document.createElement( "input" ); - input.setAttribute( "type", "hidden" ); - el.appendChild( input ).setAttribute( "name", "D" ); - - // Support: IE8 - // Enforce case-sensitivity of name attribute - if ( el.querySelectorAll( "[name=d]" ).length ) { - rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); - } - - // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) - // IE8 throws error here and will not see later tests - if ( el.querySelectorAll( ":enabled" ).length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: IE9-11+ - // IE's :disabled selector does not pick up the children of disabled fieldsets - docElem.appendChild( el ).disabled = true; - if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: Opera 10 - 11 only - // Opera 10-11 does not throw on post-comma invalid pseudos - el.querySelectorAll( "*,:x" ); - rbuggyQSA.push( ",.*:" ); - } ); - } - - if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches || - docElem.webkitMatchesSelector || - docElem.mozMatchesSelector || - docElem.oMatchesSelector || - docElem.msMatchesSelector ) ) ) ) { - - assert( function( el ) { - - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call( el, "*" ); - - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( el, "[s!='']:x" ); - rbuggyMatches.push( "!=", pseudos ); - } ); - } - - rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); - rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) ); - - /* Contains - ---------------------------------------------------------------------- */ - hasCompare = rnative.test( docElem.compareDocumentPosition ); - - // Element contains another - // Purposefully self-exclusive - // As in, an element does not contain itself - contains = hasCompare || rnative.test( docElem.contains ) ? - function( a, b ) { - var adown = a.nodeType === 9 ? a.documentElement : a, - bup = b && b.parentNode; - return a === bup || !!( bup && bup.nodeType === 1 && ( - adown.contains ? - adown.contains( bup ) : - a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 - ) ); - } : - function( a, b ) { - if ( b ) { - while ( ( b = b.parentNode ) ) { - if ( b === a ) { - return true; - } - } - } - return false; - }; - - /* Sorting - ---------------------------------------------------------------------- */ - - // Document order sorting - sortOrder = hasCompare ? - function( a, b ) { - - // Flag for duplicate removal - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - // Sort on method existence if only one input has compareDocumentPosition - var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; - if ( compare ) { - return compare; - } - - // Calculate position if both inputs belong to the same document - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? - a.compareDocumentPosition( b ) : - - // Otherwise we know they are disconnected - 1; - - // Disconnected nodes - if ( compare & 1 || - ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { - - // Choose the first element that is related to our preferred document - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( a == document || a.ownerDocument == preferredDoc && - contains( preferredDoc, a ) ) { - return -1; - } - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( b == document || b.ownerDocument == preferredDoc && - contains( preferredDoc, b ) ) { - return 1; - } - - // Maintain original order - return sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - } - - return compare & 4 ? -1 : 1; - } : - function( a, b ) { - - // Exit early if the nodes are identical - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - var cur, - i = 0, - aup = a.parentNode, - bup = b.parentNode, - ap = [ a ], - bp = [ b ]; - - // Parentless nodes are either documents or disconnected - if ( !aup || !bup ) { - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - /* eslint-disable eqeqeq */ - return a == document ? -1 : - b == document ? 1 : - /* eslint-enable eqeqeq */ - aup ? -1 : - bup ? 1 : - sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - - // If the nodes are siblings, we can do a quick check - } else if ( aup === bup ) { - return siblingCheck( a, b ); - } - - // Otherwise we need full lists of their ancestors for comparison - cur = a; - while ( ( cur = cur.parentNode ) ) { - ap.unshift( cur ); - } - cur = b; - while ( ( cur = cur.parentNode ) ) { - bp.unshift( cur ); - } - - // Walk down the tree looking for a discrepancy - while ( ap[ i ] === bp[ i ] ) { - i++; - } - - return i ? - - // Do a sibling check if the nodes have a common ancestor - siblingCheck( ap[ i ], bp[ i ] ) : - - // Otherwise nodes in our document sort first - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - /* eslint-disable eqeqeq */ - ap[ i ] == preferredDoc ? -1 : - bp[ i ] == preferredDoc ? 1 : - /* eslint-enable eqeqeq */ - 0; - }; - - return document; -}; - -Sizzle.matches = function( expr, elements ) { - return Sizzle( expr, null, null, elements ); -}; - -Sizzle.matchesSelector = function( elem, expr ) { - setDocument( elem ); - - if ( support.matchesSelector && documentIsHTML && - !nonnativeSelectorCache[ expr + " " ] && - ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && - ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { - - try { - var ret = matches.call( elem, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || support.disconnectedMatch || - - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11 ) { - return ret; - } - } catch ( e ) { - nonnativeSelectorCache( expr, true ); - } - } - - return Sizzle( expr, document, null, [ elem ] ).length > 0; -}; - -Sizzle.contains = function( context, elem ) { - - // Set document vars if needed - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( ( context.ownerDocument || context ) != document ) { - setDocument( context ); - } - return contains( context, elem ); -}; - -Sizzle.attr = function( elem, name ) { - - // Set document vars if needed - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( ( elem.ownerDocument || elem ) != document ) { - setDocument( elem ); - } - - var fn = Expr.attrHandle[ name.toLowerCase() ], - - // Don't get fooled by Object.prototype properties (jQuery #13807) - val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? - fn( elem, name, !documentIsHTML ) : - undefined; - - return val !== undefined ? - val : - support.attributes || !documentIsHTML ? - elem.getAttribute( name ) : - ( val = elem.getAttributeNode( name ) ) && val.specified ? - val.value : - null; -}; - -Sizzle.escape = function( sel ) { - return ( sel + "" ).replace( rcssescape, fcssescape ); -}; - -Sizzle.error = function( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); -}; - -/** - * Document sorting and removing duplicates - * @param {ArrayLike} results - */ -Sizzle.uniqueSort = function( results ) { - var elem, - duplicates = [], - j = 0, - i = 0; - - // Unless we *know* we can detect duplicates, assume their presence - hasDuplicate = !support.detectDuplicates; - sortInput = !support.sortStable && results.slice( 0 ); - results.sort( sortOrder ); - - if ( hasDuplicate ) { - while ( ( elem = results[ i++ ] ) ) { - if ( elem === results[ i ] ) { - j = duplicates.push( i ); - } - } - while ( j-- ) { - results.splice( duplicates[ j ], 1 ); - } - } - - // Clear input after sorting to release objects - // See https://github.com/jquery/sizzle/pull/225 - sortInput = null; - - return results; -}; - -/** - * Utility function for retrieving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ -getText = Sizzle.getText = function( elem ) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if ( !nodeType ) { - - // If no nodeType, this is expected to be an array - while ( ( node = elem[ i++ ] ) ) { - - // Do not traverse comment nodes - ret += getText( node ); - } - } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { - - // Use textContent for elements - // innerText usage removed for consistency of new lines (jQuery #11153) - if ( typeof elem.textContent === "string" ) { - return elem.textContent; - } else { - - // Traverse its children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - ret += getText( elem ); - } - } - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - - // Do not include comment or processing instruction nodes - - return ret; -}; - -Expr = Sizzle.selectors = { - - // Can be adjusted by the user - cacheLength: 50, - - createPseudo: markFunction, - - match: matchExpr, - - attrHandle: {}, - - find: {}, - - relative: { - ">": { dir: "parentNode", first: true }, - " ": { dir: "parentNode" }, - "+": { dir: "previousSibling", first: true }, - "~": { dir: "previousSibling" } - }, - - preFilter: { - "ATTR": function( match ) { - match[ 1 ] = match[ 1 ].replace( runescape, funescape ); - - // Move the given value to match[3] whether quoted or unquoted - match[ 3 ] = ( match[ 3 ] || match[ 4 ] || - match[ 5 ] || "" ).replace( runescape, funescape ); - - if ( match[ 2 ] === "~=" ) { - match[ 3 ] = " " + match[ 3 ] + " "; - } - - return match.slice( 0, 4 ); - }, - - "CHILD": function( match ) { - - /* matches from matchExpr["CHILD"] - 1 type (only|nth|...) - 2 what (child|of-type) - 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) - 4 xn-component of xn+y argument ([+-]?\d*n|) - 5 sign of xn-component - 6 x of xn-component - 7 sign of y-component - 8 y of y-component - */ - match[ 1 ] = match[ 1 ].toLowerCase(); - - if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { - - // nth-* requires argument - if ( !match[ 3 ] ) { - Sizzle.error( match[ 0 ] ); - } - - // numeric x and y parameters for Expr.filter.CHILD - // remember that false/true cast respectively to 0/1 - match[ 4 ] = +( match[ 4 ] ? - match[ 5 ] + ( match[ 6 ] || 1 ) : - 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) ); - match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); - - // other types prohibit arguments - } else if ( match[ 3 ] ) { - Sizzle.error( match[ 0 ] ); - } - - return match; - }, - - "PSEUDO": function( match ) { - var excess, - unquoted = !match[ 6 ] && match[ 2 ]; - - if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) { - return null; - } - - // Accept quoted arguments as-is - if ( match[ 3 ] ) { - match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; - - // Strip excess characters from unquoted arguments - } else if ( unquoted && rpseudo.test( unquoted ) && - - // Get excess from tokenize (recursively) - ( excess = tokenize( unquoted, true ) ) && - - // advance to the next closing parenthesis - ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { - - // excess is a negative index - match[ 0 ] = match[ 0 ].slice( 0, excess ); - match[ 2 ] = unquoted.slice( 0, excess ); - } - - // Return only captures needed by the pseudo filter method (type and argument) - return match.slice( 0, 3 ); - } - }, - - filter: { - - "TAG": function( nodeNameSelector ) { - var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); - return nodeNameSelector === "*" ? - function() { - return true; - } : - function( elem ) { - return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; - }; - }, - - "CLASS": function( className ) { - var pattern = classCache[ className + " " ]; - - return pattern || - ( pattern = new RegExp( "(^|" + whitespace + - ")" + className + "(" + whitespace + "|$)" ) ) && classCache( - className, function( elem ) { - return pattern.test( - typeof elem.className === "string" && elem.className || - typeof elem.getAttribute !== "undefined" && - elem.getAttribute( "class" ) || - "" - ); - } ); - }, - - "ATTR": function( name, operator, check ) { - return function( elem ) { - var result = Sizzle.attr( elem, name ); - - if ( result == null ) { - return operator === "!="; - } - if ( !operator ) { - return true; - } - - result += ""; - - /* eslint-disable max-len */ - - return operator === "=" ? result === check : - operator === "!=" ? result !== check : - operator === "^=" ? check && result.indexOf( check ) === 0 : - operator === "*=" ? check && result.indexOf( check ) > -1 : - operator === "$=" ? check && result.slice( -check.length ) === check : - operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : - operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : - false; - /* eslint-enable max-len */ - - }; - }, - - "CHILD": function( type, what, _argument, first, last ) { - var simple = type.slice( 0, 3 ) !== "nth", - forward = type.slice( -4 ) !== "last", - ofType = what === "of-type"; - - return first === 1 && last === 0 ? - - // Shortcut for :nth-*(n) - function( elem ) { - return !!elem.parentNode; - } : - - function( elem, _context, xml ) { - var cache, uniqueCache, outerCache, node, nodeIndex, start, - dir = simple !== forward ? "nextSibling" : "previousSibling", - parent = elem.parentNode, - name = ofType && elem.nodeName.toLowerCase(), - useCache = !xml && !ofType, - diff = false; - - if ( parent ) { - - // :(first|last|only)-(child|of-type) - if ( simple ) { - while ( dir ) { - node = elem; - while ( ( node = node[ dir ] ) ) { - if ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) { - - return false; - } - } - - // Reverse direction for :only-* (if we haven't yet done so) - start = dir = type === "only" && !start && "nextSibling"; - } - return true; - } - - start = [ forward ? parent.firstChild : parent.lastChild ]; - - // non-xml :nth-child(...) stores cache data on `parent` - if ( forward && useCache ) { - - // Seek `elem` from a previously-cached index - - // ...in a gzip-friendly way - node = parent; - outerCache = node[ expando ] || ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex && cache[ 2 ]; - node = nodeIndex && parent.childNodes[ nodeIndex ]; - - while ( ( node = ++nodeIndex && node && node[ dir ] || - - // Fallback to seeking `elem` from the start - ( diff = nodeIndex = 0 ) || start.pop() ) ) { - - // When found, cache indexes on `parent` and break - if ( node.nodeType === 1 && ++diff && node === elem ) { - uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; - break; - } - } - - } else { - - // Use previously-cached element index if available - if ( useCache ) { - - // ...in a gzip-friendly way - node = elem; - outerCache = node[ expando ] || ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex; - } - - // xml :nth-child(...) - // or :nth-last-child(...) or :nth(-last)?-of-type(...) - if ( diff === false ) { - - // Use the same loop as above to seek `elem` from the start - while ( ( node = ++nodeIndex && node && node[ dir ] || - ( diff = nodeIndex = 0 ) || start.pop() ) ) { - - if ( ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) && - ++diff ) { - - // Cache the index of each encountered element - if ( useCache ) { - outerCache = node[ expando ] || - ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - uniqueCache[ type ] = [ dirruns, diff ]; - } - - if ( node === elem ) { - break; - } - } - } - } - } - - // Incorporate the offset, then check against cycle size - diff -= last; - return diff === first || ( diff % first === 0 && diff / first >= 0 ); - } - }; - }, - - "PSEUDO": function( pseudo, argument ) { - - // pseudo-class names are case-insensitive - // http://www.w3.org/TR/selectors/#pseudo-classes - // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters - // Remember that setFilters inherits from pseudos - var args, - fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || - Sizzle.error( "unsupported pseudo: " + pseudo ); - - // The user may use createPseudo to indicate that - // arguments are needed to create the filter function - // just as Sizzle does - if ( fn[ expando ] ) { - return fn( argument ); - } - - // But maintain support for old signatures - if ( fn.length > 1 ) { - args = [ pseudo, pseudo, "", argument ]; - return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? - markFunction( function( seed, matches ) { - var idx, - matched = fn( seed, argument ), - i = matched.length; - while ( i-- ) { - idx = indexOf( seed, matched[ i ] ); - seed[ idx ] = !( matches[ idx ] = matched[ i ] ); - } - } ) : - function( elem ) { - return fn( elem, 0, args ); - }; - } - - return fn; - } - }, - - pseudos: { - - // Potentially complex pseudos - "not": markFunction( function( selector ) { - - // Trim the selector passed to compile - // to avoid treating leading and trailing - // spaces as combinators - var input = [], - results = [], - matcher = compile( selector.replace( rtrim, "$1" ) ); - - return matcher[ expando ] ? - markFunction( function( seed, matches, _context, xml ) { - var elem, - unmatched = matcher( seed, null, xml, [] ), - i = seed.length; - - // Match elements unmatched by `matcher` - while ( i-- ) { - if ( ( elem = unmatched[ i ] ) ) { - seed[ i ] = !( matches[ i ] = elem ); - } - } - } ) : - function( elem, _context, xml ) { - input[ 0 ] = elem; - matcher( input, null, xml, results ); - - // Don't keep the element (issue #299) - input[ 0 ] = null; - return !results.pop(); - }; - } ), - - "has": markFunction( function( selector ) { - return function( elem ) { - return Sizzle( selector, elem ).length > 0; - }; - } ), - - "contains": markFunction( function( text ) { - text = text.replace( runescape, funescape ); - return function( elem ) { - return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1; - }; - } ), - - // "Whether an element is represented by a :lang() selector - // is based solely on the element's language value - // being equal to the identifier C, - // or beginning with the identifier C immediately followed by "-". - // The matching of C against the element's language value is performed case-insensitively. - // The identifier C does not have to be a valid language name." - // http://www.w3.org/TR/selectors/#lang-pseudo - "lang": markFunction( function( lang ) { - - // lang value must be a valid identifier - if ( !ridentifier.test( lang || "" ) ) { - Sizzle.error( "unsupported lang: " + lang ); - } - lang = lang.replace( runescape, funescape ).toLowerCase(); - return function( elem ) { - var elemLang; - do { - if ( ( elemLang = documentIsHTML ? - elem.lang : - elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { - - elemLang = elemLang.toLowerCase(); - return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; - } - } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); - return false; - }; - } ), - - // Miscellaneous - "target": function( elem ) { - var hash = window.location && window.location.hash; - return hash && hash.slice( 1 ) === elem.id; - }, - - "root": function( elem ) { - return elem === docElem; - }, - - "focus": function( elem ) { - return elem === document.activeElement && - ( !document.hasFocus || document.hasFocus() ) && - !!( elem.type || elem.href || ~elem.tabIndex ); - }, - - // Boolean properties - "enabled": createDisabledPseudo( false ), - "disabled": createDisabledPseudo( true ), - - "checked": function( elem ) { - - // In CSS3, :checked should return both checked and selected elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - var nodeName = elem.nodeName.toLowerCase(); - return ( nodeName === "input" && !!elem.checked ) || - ( nodeName === "option" && !!elem.selected ); - }, - - "selected": function( elem ) { - - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - // eslint-disable-next-line no-unused-expressions - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - // Contents - "empty": function( elem ) { - - // http://www.w3.org/TR/selectors/#empty-pseudo - // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), - // but not by others (comment: 8; processing instruction: 7; etc.) - // nodeType < 6 works because attributes (2) do not appear as children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - if ( elem.nodeType < 6 ) { - return false; - } - } - return true; - }, - - "parent": function( elem ) { - return !Expr.pseudos[ "empty" ]( elem ); - }, - - // Element/input types - "header": function( elem ) { - return rheader.test( elem.nodeName ); - }, - - "input": function( elem ) { - return rinputs.test( elem.nodeName ); - }, - - "button": function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === "button" || name === "button"; - }, - - "text": function( elem ) { - var attr; - return elem.nodeName.toLowerCase() === "input" && - elem.type === "text" && - - // Support: IE<8 - // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" - ( ( attr = elem.getAttribute( "type" ) ) == null || - attr.toLowerCase() === "text" ); - }, - - // Position-in-collection - "first": createPositionalPseudo( function() { - return [ 0 ]; - } ), - - "last": createPositionalPseudo( function( _matchIndexes, length ) { - return [ length - 1 ]; - } ), - - "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) { - return [ argument < 0 ? argument + length : argument ]; - } ), - - "even": createPositionalPseudo( function( matchIndexes, length ) { - var i = 0; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "odd": createPositionalPseudo( function( matchIndexes, length ) { - var i = 1; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "lt": createPositionalPseudo( function( matchIndexes, length, argument ) { - var i = argument < 0 ? - argument + length : - argument > length ? - length : - argument; - for ( ; --i >= 0; ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "gt": createPositionalPseudo( function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; ++i < length; ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ) - } -}; - -Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ]; - -// Add button/input type pseudos -for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { - Expr.pseudos[ i ] = createInputPseudo( i ); -} -for ( i in { submit: true, reset: true } ) { - Expr.pseudos[ i ] = createButtonPseudo( i ); -} - -// Easy API for creating new setFilters -function setFilters() {} -setFilters.prototype = Expr.filters = Expr.pseudos; -Expr.setFilters = new setFilters(); - -tokenize = Sizzle.tokenize = function( selector, parseOnly ) { - var matched, match, tokens, type, - soFar, groups, preFilters, - cached = tokenCache[ selector + " " ]; - - if ( cached ) { - return parseOnly ? 0 : cached.slice( 0 ); - } - - soFar = selector; - groups = []; - preFilters = Expr.preFilter; - - while ( soFar ) { - - // Comma and first run - if ( !matched || ( match = rcomma.exec( soFar ) ) ) { - if ( match ) { - - // Don't consume trailing commas as valid - soFar = soFar.slice( match[ 0 ].length ) || soFar; - } - groups.push( ( tokens = [] ) ); - } - - matched = false; - - // Combinators - if ( ( match = rcombinators.exec( soFar ) ) ) { - matched = match.shift(); - tokens.push( { - value: matched, - - // Cast descendant combinators to space - type: match[ 0 ].replace( rtrim, " " ) - } ); - soFar = soFar.slice( matched.length ); - } - - // Filters - for ( type in Expr.filter ) { - if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || - ( match = preFilters[ type ]( match ) ) ) ) { - matched = match.shift(); - tokens.push( { - value: matched, - type: type, - matches: match - } ); - soFar = soFar.slice( matched.length ); - } - } - - if ( !matched ) { - break; - } - } - - // Return the length of the invalid excess - // if we're just parsing - // Otherwise, throw an error or return tokens - return parseOnly ? - soFar.length : - soFar ? - Sizzle.error( selector ) : - - // Cache the tokens - tokenCache( selector, groups ).slice( 0 ); -}; - -function toSelector( tokens ) { - var i = 0, - len = tokens.length, - selector = ""; - for ( ; i < len; i++ ) { - selector += tokens[ i ].value; - } - return selector; -} - -function addCombinator( matcher, combinator, base ) { - var dir = combinator.dir, - skip = combinator.next, - key = skip || dir, - checkNonElements = base && key === "parentNode", - doneName = done++; - - return combinator.first ? - - // Check against closest ancestor/preceding element - function( elem, context, xml ) { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - return matcher( elem, context, xml ); - } - } - return false; - } : - - // Check against all ancestor/preceding elements - function( elem, context, xml ) { - var oldCache, uniqueCache, outerCache, - newCache = [ dirruns, doneName ]; - - // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching - if ( xml ) { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - if ( matcher( elem, context, xml ) ) { - return true; - } - } - } - } else { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - outerCache = elem[ expando ] || ( elem[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ elem.uniqueID ] || - ( outerCache[ elem.uniqueID ] = {} ); - - if ( skip && skip === elem.nodeName.toLowerCase() ) { - elem = elem[ dir ] || elem; - } else if ( ( oldCache = uniqueCache[ key ] ) && - oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { - - // Assign to newCache so results back-propagate to previous elements - return ( newCache[ 2 ] = oldCache[ 2 ] ); - } else { - - // Reuse newcache so results back-propagate to previous elements - uniqueCache[ key ] = newCache; - - // A match means we're done; a fail means we have to keep checking - if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { - return true; - } - } - } - } - } - return false; - }; -} - -function elementMatcher( matchers ) { - return matchers.length > 1 ? - function( elem, context, xml ) { - var i = matchers.length; - while ( i-- ) { - if ( !matchers[ i ]( elem, context, xml ) ) { - return false; - } - } - return true; - } : - matchers[ 0 ]; -} - -function multipleContexts( selector, contexts, results ) { - var i = 0, - len = contexts.length; - for ( ; i < len; i++ ) { - Sizzle( selector, contexts[ i ], results ); - } - return results; -} - -function condense( unmatched, map, filter, context, xml ) { - var elem, - newUnmatched = [], - i = 0, - len = unmatched.length, - mapped = map != null; - - for ( ; i < len; i++ ) { - if ( ( elem = unmatched[ i ] ) ) { - if ( !filter || filter( elem, context, xml ) ) { - newUnmatched.push( elem ); - if ( mapped ) { - map.push( i ); - } - } - } - } - - return newUnmatched; -} - -function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { - if ( postFilter && !postFilter[ expando ] ) { - postFilter = setMatcher( postFilter ); - } - if ( postFinder && !postFinder[ expando ] ) { - postFinder = setMatcher( postFinder, postSelector ); - } - return markFunction( function( seed, results, context, xml ) { - var temp, i, elem, - preMap = [], - postMap = [], - preexisting = results.length, - - // Get initial elements from seed or context - elems = seed || multipleContexts( - selector || "*", - context.nodeType ? [ context ] : context, - [] - ), - - // Prefilter to get matcher input, preserving a map for seed-results synchronization - matcherIn = preFilter && ( seed || !selector ) ? - condense( elems, preMap, preFilter, context, xml ) : - elems, - - matcherOut = matcher ? - - // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, - postFinder || ( seed ? preFilter : preexisting || postFilter ) ? - - // ...intermediate processing is necessary - [] : - - // ...otherwise use results directly - results : - matcherIn; - - // Find primary matches - if ( matcher ) { - matcher( matcherIn, matcherOut, context, xml ); - } - - // Apply postFilter - if ( postFilter ) { - temp = condense( matcherOut, postMap ); - postFilter( temp, [], context, xml ); - - // Un-match failing elements by moving them back to matcherIn - i = temp.length; - while ( i-- ) { - if ( ( elem = temp[ i ] ) ) { - matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); - } - } - } - - if ( seed ) { - if ( postFinder || preFilter ) { - if ( postFinder ) { - - // Get the final matcherOut by condensing this intermediate into postFinder contexts - temp = []; - i = matcherOut.length; - while ( i-- ) { - if ( ( elem = matcherOut[ i ] ) ) { - - // Restore matcherIn since elem is not yet a final match - temp.push( ( matcherIn[ i ] = elem ) ); - } - } - postFinder( null, ( matcherOut = [] ), temp, xml ); - } - - // Move matched elements from seed to results to keep them synchronized - i = matcherOut.length; - while ( i-- ) { - if ( ( elem = matcherOut[ i ] ) && - ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) { - - seed[ temp ] = !( results[ temp ] = elem ); - } - } - } - - // Add elements to results, through postFinder if defined - } else { - matcherOut = condense( - matcherOut === results ? - matcherOut.splice( preexisting, matcherOut.length ) : - matcherOut - ); - if ( postFinder ) { - postFinder( null, results, matcherOut, xml ); - } else { - push.apply( results, matcherOut ); - } - } - } ); -} - -function matcherFromTokens( tokens ) { - var checkContext, matcher, j, - len = tokens.length, - leadingRelative = Expr.relative[ tokens[ 0 ].type ], - implicitRelative = leadingRelative || Expr.relative[ " " ], - i = leadingRelative ? 1 : 0, - - // The foundational matcher ensures that elements are reachable from top-level context(s) - matchContext = addCombinator( function( elem ) { - return elem === checkContext; - }, implicitRelative, true ), - matchAnyContext = addCombinator( function( elem ) { - return indexOf( checkContext, elem ) > -1; - }, implicitRelative, true ), - matchers = [ function( elem, context, xml ) { - var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( - ( checkContext = context ).nodeType ? - matchContext( elem, context, xml ) : - matchAnyContext( elem, context, xml ) ); - - // Avoid hanging onto element (issue #299) - checkContext = null; - return ret; - } ]; - - for ( ; i < len; i++ ) { - if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { - matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; - } else { - matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); - - // Return special upon seeing a positional matcher - if ( matcher[ expando ] ) { - - // Find the next relative operator (if any) for proper handling - j = ++i; - for ( ; j < len; j++ ) { - if ( Expr.relative[ tokens[ j ].type ] ) { - break; - } - } - return setMatcher( - i > 1 && elementMatcher( matchers ), - i > 1 && toSelector( - - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens - .slice( 0, i - 1 ) - .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) - ).replace( rtrim, "$1" ), - matcher, - i < j && matcherFromTokens( tokens.slice( i, j ) ), - j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), - j < len && toSelector( tokens ) - ); - } - matchers.push( matcher ); - } - } - - return elementMatcher( matchers ); -} - -function matcherFromGroupMatchers( elementMatchers, setMatchers ) { - var bySet = setMatchers.length > 0, - byElement = elementMatchers.length > 0, - superMatcher = function( seed, context, xml, results, outermost ) { - var elem, j, matcher, - matchedCount = 0, - i = "0", - unmatched = seed && [], - setMatched = [], - contextBackup = outermostContext, - - // We must always have either seed elements or outermost context - elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ), - - // Use integer dirruns iff this is the outermost matcher - dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), - len = elems.length; - - if ( outermost ) { - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - outermostContext = context == document || context || outermost; - } - - // Add elements passing elementMatchers directly to results - // Support: IE<9, Safari - // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id - for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { - if ( byElement && elem ) { - j = 0; - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( !context && elem.ownerDocument != document ) { - setDocument( elem ); - xml = !documentIsHTML; - } - while ( ( matcher = elementMatchers[ j++ ] ) ) { - if ( matcher( elem, context || document, xml ) ) { - results.push( elem ); - break; - } - } - if ( outermost ) { - dirruns = dirrunsUnique; - } - } - - // Track unmatched elements for set filters - if ( bySet ) { - - // They will have gone through all possible matchers - if ( ( elem = !matcher && elem ) ) { - matchedCount--; - } - - // Lengthen the array for every element, matched or not - if ( seed ) { - unmatched.push( elem ); - } - } - } - - // `i` is now the count of elements visited above, and adding it to `matchedCount` - // makes the latter nonnegative. - matchedCount += i; - - // Apply set filters to unmatched elements - // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` - // equals `i`), unless we didn't visit _any_ elements in the above loop because we have - // no element matchers and no seed. - // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that - // case, which will result in a "00" `matchedCount` that differs from `i` but is also - // numerically zero. - if ( bySet && i !== matchedCount ) { - j = 0; - while ( ( matcher = setMatchers[ j++ ] ) ) { - matcher( unmatched, setMatched, context, xml ); - } - - if ( seed ) { - - // Reintegrate element matches to eliminate the need for sorting - if ( matchedCount > 0 ) { - while ( i-- ) { - if ( !( unmatched[ i ] || setMatched[ i ] ) ) { - setMatched[ i ] = pop.call( results ); - } - } - } - - // Discard index placeholder values to get only actual matches - setMatched = condense( setMatched ); - } - - // Add matches to results - push.apply( results, setMatched ); - - // Seedless set matches succeeding multiple successful matchers stipulate sorting - if ( outermost && !seed && setMatched.length > 0 && - ( matchedCount + setMatchers.length ) > 1 ) { - - Sizzle.uniqueSort( results ); - } - } - - // Override manipulation of globals by nested matchers - if ( outermost ) { - dirruns = dirrunsUnique; - outermostContext = contextBackup; - } - - return unmatched; - }; - - return bySet ? - markFunction( superMatcher ) : - superMatcher; -} - -compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { - var i, - setMatchers = [], - elementMatchers = [], - cached = compilerCache[ selector + " " ]; - - if ( !cached ) { - - // Generate a function of recursive functions that can be used to check each element - if ( !match ) { - match = tokenize( selector ); - } - i = match.length; - while ( i-- ) { - cached = matcherFromTokens( match[ i ] ); - if ( cached[ expando ] ) { - setMatchers.push( cached ); - } else { - elementMatchers.push( cached ); - } - } - - // Cache the compiled function - cached = compilerCache( - selector, - matcherFromGroupMatchers( elementMatchers, setMatchers ) - ); - - // Save selector and tokenization - cached.selector = selector; - } - return cached; -}; - -/** - * A low-level selection function that works with Sizzle's compiled - * selector functions - * @param {String|Function} selector A selector or a pre-compiled - * selector function built with Sizzle.compile - * @param {Element} context - * @param {Array} [results] - * @param {Array} [seed] A set of elements to match against - */ -select = Sizzle.select = function( selector, context, results, seed ) { - var i, tokens, token, type, find, - compiled = typeof selector === "function" && selector, - match = !seed && tokenize( ( selector = compiled.selector || selector ) ); - - results = results || []; - - // Try to minimize operations if there is only one selector in the list and no seed - // (the latter of which guarantees us context) - if ( match.length === 1 ) { - - // Reduce context if the leading compound selector is an ID - tokens = match[ 0 ] = match[ 0 ].slice( 0 ); - if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && - context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { - - context = ( Expr.find[ "ID" ]( token.matches[ 0 ] - .replace( runescape, funescape ), context ) || [] )[ 0 ]; - if ( !context ) { - return results; - - // Precompiled matchers will still verify ancestry, so step up a level - } else if ( compiled ) { - context = context.parentNode; - } - - selector = selector.slice( tokens.shift().value.length ); - } - - // Fetch a seed set for right-to-left matching - i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length; - while ( i-- ) { - token = tokens[ i ]; - - // Abort if we hit a combinator - if ( Expr.relative[ ( type = token.type ) ] ) { - break; - } - if ( ( find = Expr.find[ type ] ) ) { - - // Search, expanding context for leading sibling combinators - if ( ( seed = find( - token.matches[ 0 ].replace( runescape, funescape ), - rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) || - context - ) ) ) { - - // If seed is empty or no tokens remain, we can return early - tokens.splice( i, 1 ); - selector = seed.length && toSelector( tokens ); - if ( !selector ) { - push.apply( results, seed ); - return results; - } - - break; - } - } - } - } - - // Compile and execute a filtering function if one is not provided - // Provide `match` to avoid retokenization if we modified the selector above - ( compiled || compile( selector, match ) )( - seed, - context, - !documentIsHTML, - results, - !context || rsibling.test( selector ) && testContext( context.parentNode ) || context - ); - return results; -}; - -// One-time assignments - -// Sort stability -support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; - -// Support: Chrome 14-35+ -// Always assume duplicates if they aren't passed to the comparison function -support.detectDuplicates = !!hasDuplicate; - -// Initialize against the default document -setDocument(); - -// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) -// Detached nodes confoundingly follow *each other* -support.sortDetached = assert( function( el ) { - - // Should return 1, but returns 4 (following) - return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; -} ); - -// Support: IE<8 -// Prevent attribute/property "interpolation" -// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx -if ( !assert( function( el ) { - el.innerHTML = ""; - return el.firstChild.getAttribute( "href" ) === "#"; -} ) ) { - addHandle( "type|href|height|width", function( elem, name, isXML ) { - if ( !isXML ) { - return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); - } - } ); -} - -// Support: IE<9 -// Use defaultValue in place of getAttribute("value") -if ( !support.attributes || !assert( function( el ) { - el.innerHTML = ""; - el.firstChild.setAttribute( "value", "" ); - return el.firstChild.getAttribute( "value" ) === ""; -} ) ) { - addHandle( "value", function( elem, _name, isXML ) { - if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { - return elem.defaultValue; - } - } ); -} - -// Support: IE<9 -// Use getAttributeNode to fetch booleans when getAttribute lies -if ( !assert( function( el ) { - return el.getAttribute( "disabled" ) == null; -} ) ) { - addHandle( booleans, function( elem, name, isXML ) { - var val; - if ( !isXML ) { - return elem[ name ] === true ? name.toLowerCase() : - ( val = elem.getAttributeNode( name ) ) && val.specified ? - val.value : - null; - } - } ); -} - -return Sizzle; - -} )( window ); - - - -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; - -// Deprecated -jQuery.expr[ ":" ] = jQuery.expr.pseudos; -jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; -jQuery.escapeSelector = Sizzle.escape; - - - - -var dir = function( elem, dir, until ) { - var matched = [], - truncate = until !== undefined; - - while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { - if ( elem.nodeType === 1 ) { - if ( truncate && jQuery( elem ).is( until ) ) { - break; - } - matched.push( elem ); - } - } - return matched; -}; - - -var siblings = function( n, elem ) { - var matched = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - matched.push( n ); - } - } - - return matched; -}; - - -var rneedsContext = jQuery.expr.match.needsContext; - - - -function nodeName( elem, name ) { - - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - -}; -var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); - - - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, not ) { - if ( isFunction( qualifier ) ) { - return jQuery.grep( elements, function( elem, i ) { - return !!qualifier.call( elem, i, elem ) !== not; - } ); - } - - // Single element - if ( qualifier.nodeType ) { - return jQuery.grep( elements, function( elem ) { - return ( elem === qualifier ) !== not; - } ); - } - - // Arraylike of elements (jQuery, arguments, Array) - if ( typeof qualifier !== "string" ) { - return jQuery.grep( elements, function( elem ) { - return ( indexOf.call( qualifier, elem ) > -1 ) !== not; - } ); - } - - // Filtered directly for both simple and complex selectors - return jQuery.filter( qualifier, elements, not ); -} - -jQuery.filter = function( expr, elems, not ) { - var elem = elems[ 0 ]; - - if ( not ) { - expr = ":not(" + expr + ")"; - } - - if ( elems.length === 1 && elem.nodeType === 1 ) { - return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; - } - - return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { - return elem.nodeType === 1; - } ) ); -}; - -jQuery.fn.extend( { - find: function( selector ) { - var i, ret, - len = this.length, - self = this; - - if ( typeof selector !== "string" ) { - return this.pushStack( jQuery( selector ).filter( function() { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - } ) ); - } - - ret = this.pushStack( [] ); - - for ( i = 0; i < len; i++ ) { - jQuery.find( selector, self[ i ], ret ); - } - - return len > 1 ? jQuery.uniqueSort( ret ) : ret; - }, - filter: function( selector ) { - return this.pushStack( winnow( this, selector || [], false ) ); - }, - not: function( selector ) { - return this.pushStack( winnow( this, selector || [], true ) ); - }, - is: function( selector ) { - return !!winnow( - this, - - // If this is a positional/relative selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - typeof selector === "string" && rneedsContext.test( selector ) ? - jQuery( selector ) : - selector || [], - false - ).length; - } -} ); - - -// Initialize a jQuery object - - -// A central reference to the root jQuery(document) -var rootjQuery, - - // A simple way to check for HTML strings - // Prioritize #id over to avoid XSS via location.hash (#9521) - // Strict HTML recognition (#11290: must start with <) - // Shortcut simple #id case for speed - rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, - - init = jQuery.fn.init = function( selector, context, root ) { - var match, elem; - - // HANDLE: $(""), $(null), $(undefined), $(false) - if ( !selector ) { - return this; - } - - // Method init() accepts an alternate rootjQuery - // so migrate can support jQuery.sub (gh-2101) - root = root || rootjQuery; - - // Handle HTML strings - if ( typeof selector === "string" ) { - if ( selector[ 0 ] === "<" && - selector[ selector.length - 1 ] === ">" && - selector.length >= 3 ) { - - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = rquickExpr.exec( selector ); - } - - // Match html or make sure no context is specified for #id - if ( match && ( match[ 1 ] || !context ) ) { - - // HANDLE: $(html) -> $(array) - if ( match[ 1 ] ) { - context = context instanceof jQuery ? context[ 0 ] : context; - - // Option to run scripts is true for back-compat - // Intentionally let the error be thrown if parseHTML is not present - jQuery.merge( this, jQuery.parseHTML( - match[ 1 ], - context && context.nodeType ? context.ownerDocument || context : document, - true - ) ); - - // HANDLE: $(html, props) - if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { - for ( match in context ) { - - // Properties of context are called as methods if possible - if ( isFunction( this[ match ] ) ) { - this[ match ]( context[ match ] ); - - // ...and otherwise set as attributes - } else { - this.attr( match, context[ match ] ); - } - } - } - - return this; - - // HANDLE: $(#id) - } else { - elem = document.getElementById( match[ 2 ] ); - - if ( elem ) { - - // Inject the element directly into the jQuery object - this[ 0 ] = elem; - this.length = 1; - } - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return ( context || root ).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(DOMElement) - } else if ( selector.nodeType ) { - this[ 0 ] = selector; - this.length = 1; - return this; - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( isFunction( selector ) ) { - return root.ready !== undefined ? - root.ready( selector ) : - - // Execute immediately if ready is not present - selector( jQuery ); - } - - return jQuery.makeArray( selector, this ); - }; - -// Give the init function the jQuery prototype for later instantiation -init.prototype = jQuery.fn; - -// Initialize central reference -rootjQuery = jQuery( document ); - - -var rparentsprev = /^(?:parents|prev(?:Until|All))/, - - // Methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - -jQuery.fn.extend( { - has: function( target ) { - var targets = jQuery( target, this ), - l = targets.length; - - return this.filter( function() { - var i = 0; - for ( ; i < l; i++ ) { - if ( jQuery.contains( this, targets[ i ] ) ) { - return true; - } - } - } ); - }, - - closest: function( selectors, context ) { - var cur, - i = 0, - l = this.length, - matched = [], - targets = typeof selectors !== "string" && jQuery( selectors ); - - // Positional selectors never match, since there's no _selection_ context - if ( !rneedsContext.test( selectors ) ) { - for ( ; i < l; i++ ) { - for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { - - // Always skip document fragments - if ( cur.nodeType < 11 && ( targets ? - targets.index( cur ) > -1 : - - // Don't pass non-elements to Sizzle - cur.nodeType === 1 && - jQuery.find.matchesSelector( cur, selectors ) ) ) { - - matched.push( cur ); - break; - } - } - } - } - - return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); - }, - - // Determine the position of an element within the set - index: function( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; - } - - // Index in selector - if ( typeof elem === "string" ) { - return indexOf.call( jQuery( elem ), this[ 0 ] ); - } - - // Locate the position of the desired element - return indexOf.call( this, - - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[ 0 ] : elem - ); - }, - - add: function( selector, context ) { - return this.pushStack( - jQuery.uniqueSort( - jQuery.merge( this.get(), jQuery( selector, context ) ) - ) - ); - }, - - addBack: function( selector ) { - return this.add( selector == null ? - this.prevObject : this.prevObject.filter( selector ) - ); - } -} ); - -function sibling( cur, dir ) { - while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} - return cur; -} - -jQuery.each( { - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, _i, until ) { - return dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return sibling( elem, "nextSibling" ); - }, - prev: function( elem ) { - return sibling( elem, "previousSibling" ); - }, - nextAll: function( elem ) { - return dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, _i, until ) { - return dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, _i, until ) { - return dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return siblings( ( elem.parentNode || {} ).firstChild, elem ); - }, - children: function( elem ) { - return siblings( elem.firstChild ); - }, - contents: function( elem ) { - if ( elem.contentDocument != null && - - // Support: IE 11+ - // elements with no `data` attribute has an object - // `contentDocument` with a `null` prototype. - getProto( elem.contentDocument ) ) { - - return elem.contentDocument; - } - - // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only - // Treat the template element as a regular one in browsers that - // don't support it. - if ( nodeName( elem, "template" ) ) { - elem = elem.content || elem; - } - - return jQuery.merge( [], elem.childNodes ); - } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var matched = jQuery.map( this, fn, until ); - - if ( name.slice( -5 ) !== "Until" ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - matched = jQuery.filter( selector, matched ); - } - - if ( this.length > 1 ) { - - // Remove duplicates - if ( !guaranteedUnique[ name ] ) { - jQuery.uniqueSort( matched ); - } - - // Reverse order for parents* and prev-derivatives - if ( rparentsprev.test( name ) ) { - matched.reverse(); - } - } - - return this.pushStack( matched ); - }; -} ); -var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); - - - -// Convert String-formatted options into Object-formatted ones -function createOptions( options ) { - var object = {}; - jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { - object[ flag ] = true; - } ); - return object; -} - -/* - * Create a callback list using the following parameters: - * - * options: an optional list of space-separated options that will change how - * the callback list behaves or a more traditional option object - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible options: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ -jQuery.Callbacks = function( options ) { - - // Convert options from String-formatted to Object-formatted if needed - // (we check in cache first) - options = typeof options === "string" ? - createOptions( options ) : - jQuery.extend( {}, options ); - - var // Flag to know if list is currently firing - firing, - - // Last fire value for non-forgettable lists - memory, - - // Flag to know if list was already fired - fired, - - // Flag to prevent firing - locked, - - // Actual callback list - list = [], - - // Queue of execution data for repeatable lists - queue = [], - - // Index of currently firing callback (modified by add/remove as needed) - firingIndex = -1, - - // Fire callbacks - fire = function() { - - // Enforce single-firing - locked = locked || options.once; - - // Execute callbacks for all pending executions, - // respecting firingIndex overrides and runtime changes - fired = firing = true; - for ( ; queue.length; firingIndex = -1 ) { - memory = queue.shift(); - while ( ++firingIndex < list.length ) { - - // Run callback and check for early termination - if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && - options.stopOnFalse ) { - - // Jump to end and forget the data so .add doesn't re-fire - firingIndex = list.length; - memory = false; - } - } - } - - // Forget the data if we're done with it - if ( !options.memory ) { - memory = false; - } - - firing = false; - - // Clean up if we're done firing for good - if ( locked ) { - - // Keep an empty list if we have data for future add calls - if ( memory ) { - list = []; - - // Otherwise, this object is spent - } else { - list = ""; - } - } - }, - - // Actual Callbacks object - self = { - - // Add a callback or a collection of callbacks to the list - add: function() { - if ( list ) { - - // If we have memory from a past run, we should fire after adding - if ( memory && !firing ) { - firingIndex = list.length - 1; - queue.push( memory ); - } - - ( function add( args ) { - jQuery.each( args, function( _, arg ) { - if ( isFunction( arg ) ) { - if ( !options.unique || !self.has( arg ) ) { - list.push( arg ); - } - } else if ( arg && arg.length && toType( arg ) !== "string" ) { - - // Inspect recursively - add( arg ); - } - } ); - } )( arguments ); - - if ( memory && !firing ) { - fire(); - } - } - return this; - }, - - // Remove a callback from the list - remove: function() { - jQuery.each( arguments, function( _, arg ) { - var index; - while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { - list.splice( index, 1 ); - - // Handle firing indexes - if ( index <= firingIndex ) { - firingIndex--; - } - } - } ); - return this; - }, - - // Check if a given callback is in the list. - // If no argument is given, return whether or not list has callbacks attached. - has: function( fn ) { - return fn ? - jQuery.inArray( fn, list ) > -1 : - list.length > 0; - }, - - // Remove all callbacks from the list - empty: function() { - if ( list ) { - list = []; - } - return this; - }, - - // Disable .fire and .add - // Abort any current/pending executions - // Clear all callbacks and values - disable: function() { - locked = queue = []; - list = memory = ""; - return this; - }, - disabled: function() { - return !list; - }, - - // Disable .fire - // Also disable .add unless we have memory (since it would have no effect) - // Abort any pending executions - lock: function() { - locked = queue = []; - if ( !memory && !firing ) { - list = memory = ""; - } - return this; - }, - locked: function() { - return !!locked; - }, - - // Call all callbacks with the given context and arguments - fireWith: function( context, args ) { - if ( !locked ) { - args = args || []; - args = [ context, args.slice ? args.slice() : args ]; - queue.push( args ); - if ( !firing ) { - fire(); - } - } - return this; - }, - - // Call all the callbacks with the given arguments - fire: function() { - self.fireWith( this, arguments ); - return this; - }, - - // To know if the callbacks have already been called at least once - fired: function() { - return !!fired; - } - }; - - return self; -}; - - -function Identity( v ) { - return v; -} -function Thrower( ex ) { - throw ex; -} - -function adoptValue( value, resolve, reject, noValue ) { - var method; - - try { - - // Check for promise aspect first to privilege synchronous behavior - if ( value && isFunction( ( method = value.promise ) ) ) { - method.call( value ).done( resolve ).fail( reject ); - - // Other thenables - } else if ( value && isFunction( ( method = value.then ) ) ) { - method.call( value, resolve, reject ); - - // Other non-thenables - } else { - - // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: - // * false: [ value ].slice( 0 ) => resolve( value ) - // * true: [ value ].slice( 1 ) => resolve() - resolve.apply( undefined, [ value ].slice( noValue ) ); - } - - // For Promises/A+, convert exceptions into rejections - // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in - // Deferred#then to conditionally suppress rejection. - } catch ( value ) { - - // Support: Android 4.0 only - // Strict mode functions invoked without .call/.apply get global-object context - reject.apply( undefined, [ value ] ); - } -} - -jQuery.extend( { - - Deferred: function( func ) { - var tuples = [ - - // action, add listener, callbacks, - // ... .then handlers, argument index, [final state] - [ "notify", "progress", jQuery.Callbacks( "memory" ), - jQuery.Callbacks( "memory" ), 2 ], - [ "resolve", "done", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 0, "resolved" ], - [ "reject", "fail", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 1, "rejected" ] - ], - state = "pending", - promise = { - state: function() { - return state; - }, - always: function() { - deferred.done( arguments ).fail( arguments ); - return this; - }, - "catch": function( fn ) { - return promise.then( null, fn ); - }, - - // Keep pipe for back-compat - pipe: function( /* fnDone, fnFail, fnProgress */ ) { - var fns = arguments; - - return jQuery.Deferred( function( newDefer ) { - jQuery.each( tuples, function( _i, tuple ) { - - // Map tuples (progress, done, fail) to arguments (done, fail, progress) - var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; - - // deferred.progress(function() { bind to newDefer or newDefer.notify }) - // deferred.done(function() { bind to newDefer or newDefer.resolve }) - // deferred.fail(function() { bind to newDefer or newDefer.reject }) - deferred[ tuple[ 1 ] ]( function() { - var returned = fn && fn.apply( this, arguments ); - if ( returned && isFunction( returned.promise ) ) { - returned.promise() - .progress( newDefer.notify ) - .done( newDefer.resolve ) - .fail( newDefer.reject ); - } else { - newDefer[ tuple[ 0 ] + "With" ]( - this, - fn ? [ returned ] : arguments - ); - } - } ); - } ); - fns = null; - } ).promise(); - }, - then: function( onFulfilled, onRejected, onProgress ) { - var maxDepth = 0; - function resolve( depth, deferred, handler, special ) { - return function() { - var that = this, - args = arguments, - mightThrow = function() { - var returned, then; - - // Support: Promises/A+ section 2.3.3.3.3 - // https://promisesaplus.com/#point-59 - // Ignore double-resolution attempts - if ( depth < maxDepth ) { - return; - } - - returned = handler.apply( that, args ); - - // Support: Promises/A+ section 2.3.1 - // https://promisesaplus.com/#point-48 - if ( returned === deferred.promise() ) { - throw new TypeError( "Thenable self-resolution" ); - } - - // Support: Promises/A+ sections 2.3.3.1, 3.5 - // https://promisesaplus.com/#point-54 - // https://promisesaplus.com/#point-75 - // Retrieve `then` only once - then = returned && - - // Support: Promises/A+ section 2.3.4 - // https://promisesaplus.com/#point-64 - // Only check objects and functions for thenability - ( typeof returned === "object" || - typeof returned === "function" ) && - returned.then; - - // Handle a returned thenable - if ( isFunction( then ) ) { - - // Special processors (notify) just wait for resolution - if ( special ) { - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ) - ); - - // Normal processors (resolve) also hook into progress - } else { - - // ...and disregard older resolution values - maxDepth++; - - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ), - resolve( maxDepth, deferred, Identity, - deferred.notifyWith ) - ); - } - - // Handle all other returned values - } else { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Identity ) { - that = undefined; - args = [ returned ]; - } - - // Process the value(s) - // Default process is resolve - ( special || deferred.resolveWith )( that, args ); - } - }, - - // Only normal processors (resolve) catch and reject exceptions - process = special ? - mightThrow : - function() { - try { - mightThrow(); - } catch ( e ) { - - if ( jQuery.Deferred.exceptionHook ) { - jQuery.Deferred.exceptionHook( e, - process.stackTrace ); - } - - // Support: Promises/A+ section 2.3.3.3.4.1 - // https://promisesaplus.com/#point-61 - // Ignore post-resolution exceptions - if ( depth + 1 >= maxDepth ) { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Thrower ) { - that = undefined; - args = [ e ]; - } - - deferred.rejectWith( that, args ); - } - } - }; - - // Support: Promises/A+ section 2.3.3.3.1 - // https://promisesaplus.com/#point-57 - // Re-resolve promises immediately to dodge false rejection from - // subsequent errors - if ( depth ) { - process(); - } else { - - // Call an optional hook to record the stack, in case of exception - // since it's otherwise lost when execution goes async - if ( jQuery.Deferred.getStackHook ) { - process.stackTrace = jQuery.Deferred.getStackHook(); - } - window.setTimeout( process ); - } - }; - } - - return jQuery.Deferred( function( newDefer ) { - - // progress_handlers.add( ... ) - tuples[ 0 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onProgress ) ? - onProgress : - Identity, - newDefer.notifyWith - ) - ); - - // fulfilled_handlers.add( ... ) - tuples[ 1 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onFulfilled ) ? - onFulfilled : - Identity - ) - ); - - // rejected_handlers.add( ... ) - tuples[ 2 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onRejected ) ? - onRejected : - Thrower - ) - ); - } ).promise(); - }, - - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - return obj != null ? jQuery.extend( obj, promise ) : promise; - } - }, - deferred = {}; - - // Add list-specific methods - jQuery.each( tuples, function( i, tuple ) { - var list = tuple[ 2 ], - stateString = tuple[ 5 ]; - - // promise.progress = list.add - // promise.done = list.add - // promise.fail = list.add - promise[ tuple[ 1 ] ] = list.add; - - // Handle state - if ( stateString ) { - list.add( - function() { - - // state = "resolved" (i.e., fulfilled) - // state = "rejected" - state = stateString; - }, - - // rejected_callbacks.disable - // fulfilled_callbacks.disable - tuples[ 3 - i ][ 2 ].disable, - - // rejected_handlers.disable - // fulfilled_handlers.disable - tuples[ 3 - i ][ 3 ].disable, - - // progress_callbacks.lock - tuples[ 0 ][ 2 ].lock, - - // progress_handlers.lock - tuples[ 0 ][ 3 ].lock - ); - } - - // progress_handlers.fire - // fulfilled_handlers.fire - // rejected_handlers.fire - list.add( tuple[ 3 ].fire ); - - // deferred.notify = function() { deferred.notifyWith(...) } - // deferred.resolve = function() { deferred.resolveWith(...) } - // deferred.reject = function() { deferred.rejectWith(...) } - deferred[ tuple[ 0 ] ] = function() { - deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); - return this; - }; - - // deferred.notifyWith = list.fireWith - // deferred.resolveWith = list.fireWith - // deferred.rejectWith = list.fireWith - deferred[ tuple[ 0 ] + "With" ] = list.fireWith; - } ); - - // Make the deferred a promise - promise.promise( deferred ); - - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function( singleValue ) { - var - - // count of uncompleted subordinates - remaining = arguments.length, - - // count of unprocessed arguments - i = remaining, - - // subordinate fulfillment data - resolveContexts = Array( i ), - resolveValues = slice.call( arguments ), - - // the master Deferred - master = jQuery.Deferred(), - - // subordinate callback factory - updateFunc = function( i ) { - return function( value ) { - resolveContexts[ i ] = this; - resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; - if ( !( --remaining ) ) { - master.resolveWith( resolveContexts, resolveValues ); - } - }; - }; - - // Single- and empty arguments are adopted like Promise.resolve - if ( remaining <= 1 ) { - adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, - !remaining ); - - // Use .then() to unwrap secondary thenables (cf. gh-3000) - if ( master.state() === "pending" || - isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { - - return master.then(); - } - } - - // Multiple arguments are aggregated like Promise.all array elements - while ( i-- ) { - adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); - } - - return master.promise(); - } -} ); - - -// These usually indicate a programmer mistake during development, -// warn about them ASAP rather than swallowing them by default. -var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; - -jQuery.Deferred.exceptionHook = function( error, stack ) { - - // Support: IE 8 - 9 only - // Console exists when dev tools are open, which can happen at any time - if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { - window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); - } -}; - - - - -jQuery.readyException = function( error ) { - window.setTimeout( function() { - throw error; - } ); -}; - - - - -// The deferred used on DOM ready -var readyList = jQuery.Deferred(); - -jQuery.fn.ready = function( fn ) { - - readyList - .then( fn ) - - // Wrap jQuery.readyException in a function so that the lookup - // happens at the time of error handling instead of callback - // registration. - .catch( function( error ) { - jQuery.readyException( error ); - } ); - - return this; -}; - -jQuery.extend( { - - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Handle when the DOM is ready - ready: function( wait ) { - - // Abort if there are pending holds or we're already ready - if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { - return; - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith( document, [ jQuery ] ); - } -} ); - -jQuery.ready.then = readyList.then; - -// The ready event handler and self cleanup method -function completed() { - document.removeEventListener( "DOMContentLoaded", completed ); - window.removeEventListener( "load", completed ); - jQuery.ready(); -} - -// Catch cases where $(document).ready() is called -// after the browser event has already occurred. -// Support: IE <=9 - 10 only -// Older IE sometimes signals "interactive" too soon -if ( document.readyState === "complete" || - ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { - - // Handle it asynchronously to allow scripts the opportunity to delay ready - window.setTimeout( jQuery.ready ); - -} else { - - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", completed ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", completed ); -} - - - - -// Multifunctional method to get and set values of a collection -// The value/s can optionally be executed if it's a function -var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { - var i = 0, - len = elems.length, - bulk = key == null; - - // Sets many values - if ( toType( key ) === "object" ) { - chainable = true; - for ( i in key ) { - access( elems, fn, i, key[ i ], true, emptyGet, raw ); - } - - // Sets one value - } else if ( value !== undefined ) { - chainable = true; - - if ( !isFunction( value ) ) { - raw = true; - } - - if ( bulk ) { - - // Bulk operations run against the entire set - if ( raw ) { - fn.call( elems, value ); - fn = null; - - // ...except when executing function values - } else { - bulk = fn; - fn = function( elem, _key, value ) { - return bulk.call( jQuery( elem ), value ); - }; - } - } - - if ( fn ) { - for ( ; i < len; i++ ) { - fn( - elems[ i ], key, raw ? - value : - value.call( elems[ i ], i, fn( elems[ i ], key ) ) - ); - } - } - } - - if ( chainable ) { - return elems; - } - - // Gets - if ( bulk ) { - return fn.call( elems ); - } - - return len ? fn( elems[ 0 ], key ) : emptyGet; -}; - - -// Matches dashed string for camelizing -var rmsPrefix = /^-ms-/, - rdashAlpha = /-([a-z])/g; - -// Used by camelCase as callback to replace() -function fcamelCase( _all, letter ) { - return letter.toUpperCase(); -} - -// Convert dashed to camelCase; used by the css and data modules -// Support: IE <=9 - 11, Edge 12 - 15 -// Microsoft forgot to hump their vendor prefix (#9572) -function camelCase( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); -} -var acceptData = function( owner ) { - - // Accepts only: - // - Node - // - Node.ELEMENT_NODE - // - Node.DOCUMENT_NODE - // - Object - // - Any - return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); -}; - - - - -function Data() { - this.expando = jQuery.expando + Data.uid++; -} - -Data.uid = 1; - -Data.prototype = { - - cache: function( owner ) { - - // Check if the owner object already has a cache - var value = owner[ this.expando ]; - - // If not, create one - if ( !value ) { - value = {}; - - // We can accept data for non-element nodes in modern browsers, - // but we should not, see #8335. - // Always return an empty object. - if ( acceptData( owner ) ) { - - // If it is a node unlikely to be stringify-ed or looped over - // use plain assignment - if ( owner.nodeType ) { - owner[ this.expando ] = value; - - // Otherwise secure it in a non-enumerable property - // configurable must be true to allow the property to be - // deleted when data is removed - } else { - Object.defineProperty( owner, this.expando, { - value: value, - configurable: true - } ); - } - } - } - - return value; - }, - set: function( owner, data, value ) { - var prop, - cache = this.cache( owner ); - - // Handle: [ owner, key, value ] args - // Always use camelCase key (gh-2257) - if ( typeof data === "string" ) { - cache[ camelCase( data ) ] = value; - - // Handle: [ owner, { properties } ] args - } else { - - // Copy the properties one-by-one to the cache object - for ( prop in data ) { - cache[ camelCase( prop ) ] = data[ prop ]; - } - } - return cache; - }, - get: function( owner, key ) { - return key === undefined ? - this.cache( owner ) : - - // Always use camelCase key (gh-2257) - owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; - }, - access: function( owner, key, value ) { - - // In cases where either: - // - // 1. No key was specified - // 2. A string key was specified, but no value provided - // - // Take the "read" path and allow the get method to determine - // which value to return, respectively either: - // - // 1. The entire cache object - // 2. The data stored at the key - // - if ( key === undefined || - ( ( key && typeof key === "string" ) && value === undefined ) ) { - - return this.get( owner, key ); - } - - // When the key is not a string, or both a key and value - // are specified, set or extend (existing objects) with either: - // - // 1. An object of properties - // 2. A key and value - // - this.set( owner, key, value ); - - // Since the "set" path can have two possible entry points - // return the expected data based on which path was taken[*] - return value !== undefined ? value : key; - }, - remove: function( owner, key ) { - var i, - cache = owner[ this.expando ]; - - if ( cache === undefined ) { - return; - } - - if ( key !== undefined ) { - - // Support array or space separated string of keys - if ( Array.isArray( key ) ) { - - // If key is an array of keys... - // We always set camelCase keys, so remove that. - key = key.map( camelCase ); - } else { - key = camelCase( key ); - - // If a key with the spaces exists, use it. - // Otherwise, create an array by matching non-whitespace - key = key in cache ? - [ key ] : - ( key.match( rnothtmlwhite ) || [] ); - } - - i = key.length; - - while ( i-- ) { - delete cache[ key[ i ] ]; - } - } - - // Remove the expando if there's no more data - if ( key === undefined || jQuery.isEmptyObject( cache ) ) { - - // Support: Chrome <=35 - 45 - // Webkit & Blink performance suffers when deleting properties - // from DOM nodes, so set to undefined instead - // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) - if ( owner.nodeType ) { - owner[ this.expando ] = undefined; - } else { - delete owner[ this.expando ]; - } - } - }, - hasData: function( owner ) { - var cache = owner[ this.expando ]; - return cache !== undefined && !jQuery.isEmptyObject( cache ); - } -}; -var dataPriv = new Data(); - -var dataUser = new Data(); - - - -// Implementation Summary -// -// 1. Enforce API surface and semantic compatibility with 1.9.x branch -// 2. Improve the module's maintainability by reducing the storage -// paths to a single mechanism. -// 3. Use the same single mechanism to support "private" and "user" data. -// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) -// 5. Avoid exposing implementation details on user objects (eg. expando properties) -// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 - -var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, - rmultiDash = /[A-Z]/g; - -function getData( data ) { - if ( data === "true" ) { - return true; - } - - if ( data === "false" ) { - return false; - } - - if ( data === "null" ) { - return null; - } - - // Only convert to a number if it doesn't change the string - if ( data === +data + "" ) { - return +data; - } - - if ( rbrace.test( data ) ) { - return JSON.parse( data ); - } - - return data; -} - -function dataAttr( elem, key, data ) { - var name; - - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = getData( data ); - } catch ( e ) {} - - // Make sure we set the data so it isn't changed later - dataUser.set( elem, key, data ); - } else { - data = undefined; - } - } - return data; -} - -jQuery.extend( { - hasData: function( elem ) { - return dataUser.hasData( elem ) || dataPriv.hasData( elem ); - }, - - data: function( elem, name, data ) { - return dataUser.access( elem, name, data ); - }, - - removeData: function( elem, name ) { - dataUser.remove( elem, name ); - }, - - // TODO: Now that all calls to _data and _removeData have been replaced - // with direct calls to dataPriv methods, these can be deprecated. - _data: function( elem, name, data ) { - return dataPriv.access( elem, name, data ); - }, - - _removeData: function( elem, name ) { - dataPriv.remove( elem, name ); - } -} ); - -jQuery.fn.extend( { - data: function( key, value ) { - var i, name, data, - elem = this[ 0 ], - attrs = elem && elem.attributes; - - // Gets all values - if ( key === undefined ) { - if ( this.length ) { - data = dataUser.get( elem ); - - if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { - i = attrs.length; - while ( i-- ) { - - // Support: IE 11 only - // The attrs elements can be null (#14894) - if ( attrs[ i ] ) { - name = attrs[ i ].name; - if ( name.indexOf( "data-" ) === 0 ) { - name = camelCase( name.slice( 5 ) ); - dataAttr( elem, name, data[ name ] ); - } - } - } - dataPriv.set( elem, "hasDataAttrs", true ); - } - } - - return data; - } - - // Sets multiple values - if ( typeof key === "object" ) { - return this.each( function() { - dataUser.set( this, key ); - } ); - } - - return access( this, function( value ) { - var data; - - // The calling jQuery object (element matches) is not empty - // (and therefore has an element appears at this[ 0 ]) and the - // `value` parameter was not undefined. An empty jQuery object - // will result in `undefined` for elem = this[ 0 ] which will - // throw an exception if an attempt to read a data cache is made. - if ( elem && value === undefined ) { - - // Attempt to get data from the cache - // The key will always be camelCased in Data - data = dataUser.get( elem, key ); - if ( data !== undefined ) { - return data; - } - - // Attempt to "discover" the data in - // HTML5 custom data-* attrs - data = dataAttr( elem, key ); - if ( data !== undefined ) { - return data; - } - - // We tried really hard, but the data doesn't exist. - return; - } - - // Set the data... - this.each( function() { - - // We always store the camelCased key - dataUser.set( this, key, value ); - } ); - }, null, value, arguments.length > 1, null, true ); - }, - - removeData: function( key ) { - return this.each( function() { - dataUser.remove( this, key ); - } ); - } -} ); - - -jQuery.extend( { - queue: function( elem, type, data ) { - var queue; - - if ( elem ) { - type = ( type || "fx" ) + "queue"; - queue = dataPriv.get( elem, type ); - - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !queue || Array.isArray( data ) ) { - queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); - } else { - queue.push( data ); - } - } - return queue || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - startLength = queue.length, - fn = queue.shift(), - hooks = jQuery._queueHooks( elem, type ), - next = function() { - jQuery.dequeue( elem, type ); - }; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - startLength--; - } - - if ( fn ) { - - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift( "inprogress" ); - } - - // Clear up the last queue stop function - delete hooks.stop; - fn.call( elem, next, hooks ); - } - - if ( !startLength && hooks ) { - hooks.empty.fire(); - } - }, - - // Not public - generate a queueHooks object, or return the current one - _queueHooks: function( elem, type ) { - var key = type + "queueHooks"; - return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { - empty: jQuery.Callbacks( "once memory" ).add( function() { - dataPriv.remove( elem, [ type + "queue", key ] ); - } ) - } ); - } -} ); - -jQuery.fn.extend( { - queue: function( type, data ) { - var setter = 2; - - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - setter--; - } - - if ( arguments.length < setter ) { - return jQuery.queue( this[ 0 ], type ); - } - - return data === undefined ? - this : - this.each( function() { - var queue = jQuery.queue( this, type, data ); - - // Ensure a hooks for this queue - jQuery._queueHooks( this, type ); - - if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - } ); - }, - dequeue: function( type ) { - return this.each( function() { - jQuery.dequeue( this, type ); - } ); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, obj ) { - var tmp, - count = 1, - defer = jQuery.Deferred(), - elements = this, - i = this.length, - resolve = function() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - }; - - if ( typeof type !== "string" ) { - obj = type; - type = undefined; - } - type = type || "fx"; - - while ( i-- ) { - tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); - if ( tmp && tmp.empty ) { - count++; - tmp.empty.add( resolve ); - } - } - resolve(); - return defer.promise( obj ); - } -} ); -var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; - -var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); - - -var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; - -var documentElement = document.documentElement; - - - - var isAttached = function( elem ) { - return jQuery.contains( elem.ownerDocument, elem ); - }, - composed = { composed: true }; - - // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only - // Check attachment across shadow DOM boundaries when possible (gh-3504) - // Support: iOS 10.0-10.2 only - // Early iOS 10 versions support `attachShadow` but not `getRootNode`, - // leading to errors. We need to check for `getRootNode`. - if ( documentElement.getRootNode ) { - isAttached = function( elem ) { - return jQuery.contains( elem.ownerDocument, elem ) || - elem.getRootNode( composed ) === elem.ownerDocument; - }; - } -var isHiddenWithinTree = function( elem, el ) { - - // isHiddenWithinTree might be called from jQuery#filter function; - // in that case, element will be second argument - elem = el || elem; - - // Inline style trumps all - return elem.style.display === "none" || - elem.style.display === "" && - - // Otherwise, check computed style - // Support: Firefox <=43 - 45 - // Disconnected elements can have computed display: none, so first confirm that elem is - // in the document. - isAttached( elem ) && - - jQuery.css( elem, "display" ) === "none"; - }; - - - -function adjustCSS( elem, prop, valueParts, tween ) { - var adjusted, scale, - maxIterations = 20, - currentValue = tween ? - function() { - return tween.cur(); - } : - function() { - return jQuery.css( elem, prop, "" ); - }, - initial = currentValue(), - unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), - - // Starting value computation is required for potential unit mismatches - initialInUnit = elem.nodeType && - ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && - rcssNum.exec( jQuery.css( elem, prop ) ); - - if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { - - // Support: Firefox <=54 - // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) - initial = initial / 2; - - // Trust units reported by jQuery.css - unit = unit || initialInUnit[ 3 ]; - - // Iteratively approximate from a nonzero starting point - initialInUnit = +initial || 1; - - while ( maxIterations-- ) { - - // Evaluate and update our best guess (doubling guesses that zero out). - // Finish if the scale equals or crosses 1 (making the old*new product non-positive). - jQuery.style( elem, prop, initialInUnit + unit ); - if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { - maxIterations = 0; - } - initialInUnit = initialInUnit / scale; - - } - - initialInUnit = initialInUnit * 2; - jQuery.style( elem, prop, initialInUnit + unit ); - - // Make sure we update the tween properties later on - valueParts = valueParts || []; - } - - if ( valueParts ) { - initialInUnit = +initialInUnit || +initial || 0; - - // Apply relative offset (+=/-=) if specified - adjusted = valueParts[ 1 ] ? - initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : - +valueParts[ 2 ]; - if ( tween ) { - tween.unit = unit; - tween.start = initialInUnit; - tween.end = adjusted; - } - } - return adjusted; -} - - -var defaultDisplayMap = {}; - -function getDefaultDisplay( elem ) { - var temp, - doc = elem.ownerDocument, - nodeName = elem.nodeName, - display = defaultDisplayMap[ nodeName ]; - - if ( display ) { - return display; - } - - temp = doc.body.appendChild( doc.createElement( nodeName ) ); - display = jQuery.css( temp, "display" ); - - temp.parentNode.removeChild( temp ); - - if ( display === "none" ) { - display = "block"; - } - defaultDisplayMap[ nodeName ] = display; - - return display; -} - -function showHide( elements, show ) { - var display, elem, - values = [], - index = 0, - length = elements.length; - - // Determine new display value for elements that need to change - for ( ; index < length; index++ ) { - elem = elements[ index ]; - if ( !elem.style ) { - continue; - } - - display = elem.style.display; - if ( show ) { - - // Since we force visibility upon cascade-hidden elements, an immediate (and slow) - // check is required in this first loop unless we have a nonempty display value (either - // inline or about-to-be-restored) - if ( display === "none" ) { - values[ index ] = dataPriv.get( elem, "display" ) || null; - if ( !values[ index ] ) { - elem.style.display = ""; - } - } - if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { - values[ index ] = getDefaultDisplay( elem ); - } - } else { - if ( display !== "none" ) { - values[ index ] = "none"; - - // Remember what we're overwriting - dataPriv.set( elem, "display", display ); - } - } - } - - // Set the display of the elements in a second loop to avoid constant reflow - for ( index = 0; index < length; index++ ) { - if ( values[ index ] != null ) { - elements[ index ].style.display = values[ index ]; - } - } - - return elements; -} - -jQuery.fn.extend( { - show: function() { - return showHide( this, true ); - }, - hide: function() { - return showHide( this ); - }, - toggle: function( state ) { - if ( typeof state === "boolean" ) { - return state ? this.show() : this.hide(); - } - - return this.each( function() { - if ( isHiddenWithinTree( this ) ) { - jQuery( this ).show(); - } else { - jQuery( this ).hide(); - } - } ); - } -} ); -var rcheckableType = ( /^(?:checkbox|radio)$/i ); - -var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); - -var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); - - - -( function() { - var fragment = document.createDocumentFragment(), - div = fragment.appendChild( document.createElement( "div" ) ), - input = document.createElement( "input" ); - - // Support: Android 4.0 - 4.3 only - // Check state lost if the name is set (#11217) - // Support: Windows Web Apps (WWA) - // `name` and `type` must use .setAttribute for WWA (#14901) - input.setAttribute( "type", "radio" ); - input.setAttribute( "checked", "checked" ); - input.setAttribute( "name", "t" ); - - div.appendChild( input ); - - // Support: Android <=4.1 only - // Older WebKit doesn't clone checked state correctly in fragments - support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Support: IE <=11 only - // Make sure textarea (and checkbox) defaultValue is properly cloned - div.innerHTML = ""; - support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; - - // Support: IE <=9 only - // IE <=9 replaces "; - support.option = !!div.lastChild; -} )(); - - -// We have to close these tags to support XHTML (#13200) -var wrapMap = { - - // XHTML parsers do not magically insert elements in the - // same way that tag soup parsers do. So we cannot shorten - // this by omitting or other required elements. - thead: [ 1, "", "
" ], - col: [ 2, "", "
" ], - tr: [ 2, "", "
" ], - td: [ 3, "", "
" ], - - _default: [ 0, "", "" ] -}; - -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - -// Support: IE <=9 only -if ( !support.option ) { - wrapMap.optgroup = wrapMap.option = [ 1, "" ]; -} - - -function getAll( context, tag ) { - - // Support: IE <=9 - 11 only - // Use typeof to avoid zero-argument method invocation on host objects (#15151) - var ret; - - if ( typeof context.getElementsByTagName !== "undefined" ) { - ret = context.getElementsByTagName( tag || "*" ); - - } else if ( typeof context.querySelectorAll !== "undefined" ) { - ret = context.querySelectorAll( tag || "*" ); - - } else { - ret = []; - } - - if ( tag === undefined || tag && nodeName( context, tag ) ) { - return jQuery.merge( [ context ], ret ); - } - - return ret; -} - - -// Mark scripts as having already been evaluated -function setGlobalEval( elems, refElements ) { - var i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - dataPriv.set( - elems[ i ], - "globalEval", - !refElements || dataPriv.get( refElements[ i ], "globalEval" ) - ); - } -} - - -var rhtml = /<|&#?\w+;/; - -function buildFragment( elems, context, scripts, selection, ignored ) { - var elem, tmp, tag, wrap, attached, j, - fragment = context.createDocumentFragment(), - nodes = [], - i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - elem = elems[ i ]; - - if ( elem || elem === 0 ) { - - // Add nodes directly - if ( toType( elem ) === "object" ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); - - // Convert non-html into a text node - } else if ( !rhtml.test( elem ) ) { - nodes.push( context.createTextNode( elem ) ); - - // Convert html into DOM nodes - } else { - tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); - - // Deserialize a standard representation - tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); - wrap = wrapMap[ tag ] || wrapMap._default; - tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; - - // Descend through wrappers to the right content - j = wrap[ 0 ]; - while ( j-- ) { - tmp = tmp.lastChild; - } - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, tmp.childNodes ); - - // Remember the top-level container - tmp = fragment.firstChild; - - // Ensure the created nodes are orphaned (#12392) - tmp.textContent = ""; - } - } - } - - // Remove wrapper from fragment - fragment.textContent = ""; - - i = 0; - while ( ( elem = nodes[ i++ ] ) ) { - - // Skip elements already in the context collection (trac-4087) - if ( selection && jQuery.inArray( elem, selection ) > -1 ) { - if ( ignored ) { - ignored.push( elem ); - } - continue; - } - - attached = isAttached( elem ); - - // Append to fragment - tmp = getAll( fragment.appendChild( elem ), "script" ); - - // Preserve script evaluation history - if ( attached ) { - setGlobalEval( tmp ); - } - - // Capture executables - if ( scripts ) { - j = 0; - while ( ( elem = tmp[ j++ ] ) ) { - if ( rscriptType.test( elem.type || "" ) ) { - scripts.push( elem ); - } - } - } - } - - return fragment; -} - - -var - rkeyEvent = /^key/, - rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, - rtypenamespace = /^([^.]*)(?:\.(.+)|)/; - -function returnTrue() { - return true; -} - -function returnFalse() { - return false; -} - -// Support: IE <=9 - 11+ -// focus() and blur() are asynchronous, except when they are no-op. -// So expect focus to be synchronous when the element is already active, -// and blur to be synchronous when the element is not already active. -// (focus and blur are always synchronous in other supported browsers, -// this just defines when we can count on it). -function expectSync( elem, type ) { - return ( elem === safeActiveElement() ) === ( type === "focus" ); -} - -// Support: IE <=9 only -// Accessing document.activeElement can throw unexpectedly -// https://bugs.jquery.com/ticket/13393 -function safeActiveElement() { - try { - return document.activeElement; - } catch ( err ) { } -} - -function on( elem, types, selector, data, fn, one ) { - var origFn, type; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { - - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for ( type in types ) { - on( elem, type, selector, data, types[ type ], one ); - } - return elem; - } - - if ( data == null && fn == null ) { - - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return elem; - } - - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return elem.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - } ); -} - -/* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ -jQuery.event = { - - global: {}, - - add: function( elem, types, handler, data, selector ) { - - var handleObjIn, eventHandle, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.get( elem ); - - // Only attach events to objects that accept data - if ( !acceptData( elem ) ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Ensure that invalid selectors throw exceptions at attach time - // Evaluate against documentElement in case elem is a non-element node (e.g., document) - if ( selector ) { - jQuery.find.matchesSelector( documentElement, selector ); - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - if ( !( events = elemData.events ) ) { - events = elemData.events = Object.create( null ); - } - if ( !( eventHandle = elemData.handle ) ) { - eventHandle = elemData.handle = function( e ) { - - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? - jQuery.event.dispatch.apply( elem, arguments ) : undefined; - }; - } - - // Handle multiple events separated by a space - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // There *must* be a type, no attaching namespace-only handlers - if ( !type ) { - continue; - } - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; - - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend( { - type: type, - origType: origType, - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - needsContext: selector && jQuery.expr.match.needsContext.test( selector ), - namespace: namespaces.join( "." ) - }, handleObjIn ); - - // Init the event handler queue if we're the first - if ( !( handlers = events[ type ] ) ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; - - // Only use addEventListener if the special events handler returns false - if ( !special.setup || - special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - }, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, selector, mappedTypes ) { - - var j, origCount, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); - - if ( !elemData || !( events = elemData.events ) ) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); - } - continue; - } - - special = jQuery.event.special[ type ] || {}; - type = ( selector ? special.delegateType : special.bindType ) || type; - handlers = events[ type ] || []; - tmp = tmp[ 2 ] && - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); - - // Remove matching events - origCount = j = handlers.length; - while ( j-- ) { - handleObj = handlers[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !tmp || tmp.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || - selector === "**" && handleObj.selector ) ) { - handlers.splice( j, 1 ); - - if ( handleObj.selector ) { - handlers.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( origCount && !handlers.length ) { - if ( !special.teardown || - special.teardown.call( elem, namespaces, elemData.handle ) === false ) { - - jQuery.removeEvent( elem, type, elemData.handle ); - } - - delete events[ type ]; - } - } - - // Remove data and the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - dataPriv.remove( elem, "handle events" ); - } - }, - - dispatch: function( nativeEvent ) { - - var i, j, ret, matched, handleObj, handlerQueue, - args = new Array( arguments.length ), - - // Make a writable jQuery.Event from the native event object - event = jQuery.event.fix( nativeEvent ), - - handlers = ( - dataPriv.get( this, "events" ) || Object.create( null ) - )[ event.type ] || [], - special = jQuery.event.special[ event.type ] || {}; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[ 0 ] = event; - - for ( i = 1; i < arguments.length; i++ ) { - args[ i ] = arguments[ i ]; - } - - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { - return; - } - - // Determine handlers - handlerQueue = jQuery.event.handlers.call( this, event, handlers ); - - // Run delegates first; they may want to stop propagation beneath us - i = 0; - while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { - event.currentTarget = matched.elem; - - j = 0; - while ( ( handleObj = matched.handlers[ j++ ] ) && - !event.isImmediatePropagationStopped() ) { - - // If the event is namespaced, then each handler is only invoked if it is - // specially universal or its namespaces are a superset of the event's. - if ( !event.rnamespace || handleObj.namespace === false || - event.rnamespace.test( handleObj.namespace ) ) { - - event.handleObj = handleObj; - event.data = handleObj.data; - - ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || - handleObj.handler ).apply( matched.elem, args ); - - if ( ret !== undefined ) { - if ( ( event.result = ret ) === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if ( special.postDispatch ) { - special.postDispatch.call( this, event ); - } - - return event.result; - }, - - handlers: function( event, handlers ) { - var i, handleObj, sel, matchedHandlers, matchedSelectors, - handlerQueue = [], - delegateCount = handlers.delegateCount, - cur = event.target; - - // Find delegate handlers - if ( delegateCount && - - // Support: IE <=9 - // Black-hole SVG instance trees (trac-13180) - cur.nodeType && - - // Support: Firefox <=42 - // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) - // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click - // Support: IE 11 only - // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) - !( event.type === "click" && event.button >= 1 ) ) { - - for ( ; cur !== this; cur = cur.parentNode || this ) { - - // Don't check non-elements (#13208) - // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) - if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { - matchedHandlers = []; - matchedSelectors = {}; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - - // Don't conflict with Object.prototype properties (#13203) - sel = handleObj.selector + " "; - - if ( matchedSelectors[ sel ] === undefined ) { - matchedSelectors[ sel ] = handleObj.needsContext ? - jQuery( sel, this ).index( cur ) > -1 : - jQuery.find( sel, this, null, [ cur ] ).length; - } - if ( matchedSelectors[ sel ] ) { - matchedHandlers.push( handleObj ); - } - } - if ( matchedHandlers.length ) { - handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); - } - } - } - } - - // Add the remaining (directly-bound) handlers - cur = this; - if ( delegateCount < handlers.length ) { - handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); - } - - return handlerQueue; - }, - - addProp: function( name, hook ) { - Object.defineProperty( jQuery.Event.prototype, name, { - enumerable: true, - configurable: true, - - get: isFunction( hook ) ? - function() { - if ( this.originalEvent ) { - return hook( this.originalEvent ); - } - } : - function() { - if ( this.originalEvent ) { - return this.originalEvent[ name ]; - } - }, - - set: function( value ) { - Object.defineProperty( this, name, { - enumerable: true, - configurable: true, - writable: true, - value: value - } ); - } - } ); - }, - - fix: function( originalEvent ) { - return originalEvent[ jQuery.expando ] ? - originalEvent : - new jQuery.Event( originalEvent ); - }, - - special: { - load: { - - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - click: { - - // Utilize native event to ensure correct state for checkable inputs - setup: function( data ) { - - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Claim the first handler - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, "input" ) ) { - - // dataPriv.set( el, "click", ... ) - leverageNative( el, "click", returnTrue ); - } - - // Return false to allow normal processing in the caller - return false; - }, - trigger: function( data ) { - - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Force setup before triggering a click - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, "input" ) ) { - - leverageNative( el, "click" ); - } - - // Return non-false to allow normal event-path propagation - return true; - }, - - // For cross-browser consistency, suppress native .click() on links - // Also prevent it if we're currently inside a leveraged native-event stack - _default: function( event ) { - var target = event.target; - return rcheckableType.test( target.type ) && - target.click && nodeName( target, "input" ) && - dataPriv.get( target, "click" ) || - nodeName( target, "a" ); - } - }, - - beforeunload: { - postDispatch: function( event ) { - - // Support: Firefox 20+ - // Firefox doesn't alert if the returnValue field is not set. - if ( event.result !== undefined && event.originalEvent ) { - event.originalEvent.returnValue = event.result; - } - } - } - } -}; - -// Ensure the presence of an event listener that handles manually-triggered -// synthetic events by interrupting progress until reinvoked in response to -// *native* events that it fires directly, ensuring that state changes have -// already occurred before other listeners are invoked. -function leverageNative( el, type, expectSync ) { - - // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add - if ( !expectSync ) { - if ( dataPriv.get( el, type ) === undefined ) { - jQuery.event.add( el, type, returnTrue ); - } - return; - } - - // Register the controller as a special universal handler for all event namespaces - dataPriv.set( el, type, false ); - jQuery.event.add( el, type, { - namespace: false, - handler: function( event ) { - var notAsync, result, - saved = dataPriv.get( this, type ); - - if ( ( event.isTrigger & 1 ) && this[ type ] ) { - - // Interrupt processing of the outer synthetic .trigger()ed event - // Saved data should be false in such cases, but might be a leftover capture object - // from an async native handler (gh-4350) - if ( !saved.length ) { - - // Store arguments for use when handling the inner native event - // There will always be at least one argument (an event object), so this array - // will not be confused with a leftover capture object. - saved = slice.call( arguments ); - dataPriv.set( this, type, saved ); - - // Trigger the native event and capture its result - // Support: IE <=9 - 11+ - // focus() and blur() are asynchronous - notAsync = expectSync( this, type ); - this[ type ](); - result = dataPriv.get( this, type ); - if ( saved !== result || notAsync ) { - dataPriv.set( this, type, false ); - } else { - result = {}; - } - if ( saved !== result ) { - - // Cancel the outer synthetic event - event.stopImmediatePropagation(); - event.preventDefault(); - return result.value; - } - - // If this is an inner synthetic event for an event with a bubbling surrogate - // (focus or blur), assume that the surrogate already propagated from triggering the - // native event and prevent that from happening again here. - // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the - // bubbling surrogate propagates *after* the non-bubbling base), but that seems - // less bad than duplication. - } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { - event.stopPropagation(); - } - - // If this is a native event triggered above, everything is now in order - // Fire an inner synthetic event with the original arguments - } else if ( saved.length ) { - - // ...and capture the result - dataPriv.set( this, type, { - value: jQuery.event.trigger( - - // Support: IE <=9 - 11+ - // Extend with the prototype to reset the above stopImmediatePropagation() - jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), - saved.slice( 1 ), - this - ) - } ); - - // Abort handling of the native event - event.stopImmediatePropagation(); - } - } - } ); -} - -jQuery.removeEvent = function( elem, type, handle ) { - - // This "if" is needed for plain objects - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle ); - } -}; - -jQuery.Event = function( src, props ) { - - // Allow instantiation without the 'new' keyword - if ( !( this instanceof jQuery.Event ) ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = src.defaultPrevented || - src.defaultPrevented === undefined && - - // Support: Android <=2.3 only - src.returnValue === false ? - returnTrue : - returnFalse; - - // Create target properties - // Support: Safari <=6 - 7 only - // Target should not be a text node (#504, #13143) - this.target = ( src.target && src.target.nodeType === 3 ) ? - src.target.parentNode : - src.target; - - this.currentTarget = src.currentTarget; - this.relatedTarget = src.relatedTarget; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || Date.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - constructor: jQuery.Event, - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse, - isSimulated: false, - - preventDefault: function() { - var e = this.originalEvent; - - this.isDefaultPrevented = returnTrue; - - if ( e && !this.isSimulated ) { - e.preventDefault(); - } - }, - stopPropagation: function() { - var e = this.originalEvent; - - this.isPropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopPropagation(); - } - }, - stopImmediatePropagation: function() { - var e = this.originalEvent; - - this.isImmediatePropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopImmediatePropagation(); - } - - this.stopPropagation(); - } -}; - -// Includes all common event props including KeyEvent and MouseEvent specific props -jQuery.each( { - altKey: true, - bubbles: true, - cancelable: true, - changedTouches: true, - ctrlKey: true, - detail: true, - eventPhase: true, - metaKey: true, - pageX: true, - pageY: true, - shiftKey: true, - view: true, - "char": true, - code: true, - charCode: true, - key: true, - keyCode: true, - button: true, - buttons: true, - clientX: true, - clientY: true, - offsetX: true, - offsetY: true, - pointerId: true, - pointerType: true, - screenX: true, - screenY: true, - targetTouches: true, - toElement: true, - touches: true, - - which: function( event ) { - var button = event.button; - - // Add which for key events - if ( event.which == null && rkeyEvent.test( event.type ) ) { - return event.charCode != null ? event.charCode : event.keyCode; - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { - if ( button & 1 ) { - return 1; - } - - if ( button & 2 ) { - return 3; - } - - if ( button & 4 ) { - return 2; - } - - return 0; - } - - return event.which; - } -}, jQuery.event.addProp ); - -jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { - jQuery.event.special[ type ] = { - - // Utilize native event if possible so blur/focus sequence is correct - setup: function() { - - // Claim the first handler - // dataPriv.set( this, "focus", ... ) - // dataPriv.set( this, "blur", ... ) - leverageNative( this, type, expectSync ); - - // Return false to allow normal processing in the caller - return false; - }, - trigger: function() { - - // Force setup before trigger - leverageNative( this, type ); - - // Return non-false to allow normal event-path propagation - return true; - }, - - delegateType: delegateType - }; -} ); - -// Create mouseenter/leave events using mouseover/out and event-time checks -// so that event delegation works in jQuery. -// Do the same for pointerenter/pointerleave and pointerover/pointerout -// -// Support: Safari 7 only -// Safari sends mouseenter too often; see: -// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 -// for the description of the bug (it existed in older Chrome versions as well). -jQuery.each( { - mouseenter: "mouseover", - mouseleave: "mouseout", - pointerenter: "pointerover", - pointerleave: "pointerout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function( event ) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - - // For mouseenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; -} ); - -jQuery.fn.extend( { - - on: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn ); - }, - one: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn, 1 ); - }, - off: function( types, selector, fn ) { - var handleObj, type; - if ( types && types.preventDefault && types.handleObj ) { - - // ( event ) dispatched jQuery.Event - handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace ? - handleObj.origType + "." + handleObj.namespace : - handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - - // ( types-object [, selector] ) - for ( type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { - - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each( function() { - jQuery.event.remove( this, types, fn, selector ); - } ); - } -} ); - - -var - - // Support: IE <=10 - 11, Edge 12 - 13 only - // In IE/Edge using regex groups here causes severe slowdowns. - // See https://connect.microsoft.com/IE/feedback/details/1736512/ - rnoInnerhtml = /\s*$/g; - -// Prefer a tbody over its parent table for containing new rows -function manipulationTarget( elem, content ) { - if ( nodeName( elem, "table" ) && - nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { - - return jQuery( elem ).children( "tbody" )[ 0 ] || elem; - } - - return elem; -} - -// Replace/restore the type attribute of script elements for safe DOM manipulation -function disableScript( elem ) { - elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; - return elem; -} -function restoreScript( elem ) { - if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { - elem.type = elem.type.slice( 5 ); - } else { - elem.removeAttribute( "type" ); - } - - return elem; -} - -function cloneCopyEvent( src, dest ) { - var i, l, type, pdataOld, udataOld, udataCur, events; - - if ( dest.nodeType !== 1 ) { - return; - } - - // 1. Copy private data: events, handlers, etc. - if ( dataPriv.hasData( src ) ) { - pdataOld = dataPriv.get( src ); - events = pdataOld.events; - - if ( events ) { - dataPriv.remove( dest, "handle events" ); - - for ( type in events ) { - for ( i = 0, l = events[ type ].length; i < l; i++ ) { - jQuery.event.add( dest, type, events[ type ][ i ] ); - } - } - } - } - - // 2. Copy user data - if ( dataUser.hasData( src ) ) { - udataOld = dataUser.access( src ); - udataCur = jQuery.extend( {}, udataOld ); - - dataUser.set( dest, udataCur ); - } -} - -// Fix IE bugs, see support tests -function fixInput( src, dest ) { - var nodeName = dest.nodeName.toLowerCase(); - - // Fails to persist the checked state of a cloned checkbox or radio button. - if ( nodeName === "input" && rcheckableType.test( src.type ) ) { - dest.checked = src.checked; - - // Fails to return the selected option to the default selected state when cloning options - } else if ( nodeName === "input" || nodeName === "textarea" ) { - dest.defaultValue = src.defaultValue; - } -} - -function domManip( collection, args, callback, ignored ) { - - // Flatten any nested arrays - args = flat( args ); - - var fragment, first, scripts, hasScripts, node, doc, - i = 0, - l = collection.length, - iNoClone = l - 1, - value = args[ 0 ], - valueIsFunction = isFunction( value ); - - // We can't cloneNode fragments that contain checked, in WebKit - if ( valueIsFunction || - ( l > 1 && typeof value === "string" && - !support.checkClone && rchecked.test( value ) ) ) { - return collection.each( function( index ) { - var self = collection.eq( index ); - if ( valueIsFunction ) { - args[ 0 ] = value.call( this, index, self.html() ); - } - domManip( self, args, callback, ignored ); - } ); - } - - if ( l ) { - fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); - first = fragment.firstChild; - - if ( fragment.childNodes.length === 1 ) { - fragment = first; - } - - // Require either new content or an interest in ignored elements to invoke the callback - if ( first || ignored ) { - scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); - hasScripts = scripts.length; - - // Use the original fragment for the last item - // instead of the first because it can end up - // being emptied incorrectly in certain situations (#8070). - for ( ; i < l; i++ ) { - node = fragment; - - if ( i !== iNoClone ) { - node = jQuery.clone( node, true, true ); - - // Keep references to cloned scripts for later restoration - if ( hasScripts ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( scripts, getAll( node, "script" ) ); - } - } - - callback.call( collection[ i ], node, i ); - } - - if ( hasScripts ) { - doc = scripts[ scripts.length - 1 ].ownerDocument; - - // Reenable scripts - jQuery.map( scripts, restoreScript ); - - // Evaluate executable scripts on first document insertion - for ( i = 0; i < hasScripts; i++ ) { - node = scripts[ i ]; - if ( rscriptType.test( node.type || "" ) && - !dataPriv.access( node, "globalEval" ) && - jQuery.contains( doc, node ) ) { - - if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { - - // Optional AJAX dependency, but won't run scripts if not present - if ( jQuery._evalUrl && !node.noModule ) { - jQuery._evalUrl( node.src, { - nonce: node.nonce || node.getAttribute( "nonce" ) - }, doc ); - } - } else { - DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); - } - } - } - } - } - } - - return collection; -} - -function remove( elem, selector, keepData ) { - var node, - nodes = selector ? jQuery.filter( selector, elem ) : elem, - i = 0; - - for ( ; ( node = nodes[ i ] ) != null; i++ ) { - if ( !keepData && node.nodeType === 1 ) { - jQuery.cleanData( getAll( node ) ); - } - - if ( node.parentNode ) { - if ( keepData && isAttached( node ) ) { - setGlobalEval( getAll( node, "script" ) ); - } - node.parentNode.removeChild( node ); - } - } - - return elem; -} - -jQuery.extend( { - htmlPrefilter: function( html ) { - return html; - }, - - clone: function( elem, dataAndEvents, deepDataAndEvents ) { - var i, l, srcElements, destElements, - clone = elem.cloneNode( true ), - inPage = isAttached( elem ); - - // Fix IE cloning issues - if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && - !jQuery.isXMLDoc( elem ) ) { - - // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 - destElements = getAll( clone ); - srcElements = getAll( elem ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - fixInput( srcElements[ i ], destElements[ i ] ); - } - } - - // Copy the events from the original to the clone - if ( dataAndEvents ) { - if ( deepDataAndEvents ) { - srcElements = srcElements || getAll( elem ); - destElements = destElements || getAll( clone ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - cloneCopyEvent( srcElements[ i ], destElements[ i ] ); - } - } else { - cloneCopyEvent( elem, clone ); - } - } - - // Preserve script evaluation history - destElements = getAll( clone, "script" ); - if ( destElements.length > 0 ) { - setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); - } - - // Return the cloned set - return clone; - }, - - cleanData: function( elems ) { - var data, elem, type, - special = jQuery.event.special, - i = 0; - - for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { - if ( acceptData( elem ) ) { - if ( ( data = elem[ dataPriv.expando ] ) ) { - if ( data.events ) { - for ( type in data.events ) { - if ( special[ type ] ) { - jQuery.event.remove( elem, type ); - - // This is a shortcut to avoid jQuery.event.remove's overhead - } else { - jQuery.removeEvent( elem, type, data.handle ); - } - } - } - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataPriv.expando ] = undefined; - } - if ( elem[ dataUser.expando ] ) { - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataUser.expando ] = undefined; - } - } - } - } -} ); - -jQuery.fn.extend( { - detach: function( selector ) { - return remove( this, selector, true ); - }, - - remove: function( selector ) { - return remove( this, selector ); - }, - - text: function( value ) { - return access( this, function( value ) { - return value === undefined ? - jQuery.text( this ) : - this.empty().each( function() { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - this.textContent = value; - } - } ); - }, null, value, arguments.length ); - }, - - append: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.appendChild( elem ); - } - } ); - }, - - prepend: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.insertBefore( elem, target.firstChild ); - } - } ); - }, - - before: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this ); - } - } ); - }, - - after: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this.nextSibling ); - } - } ); - }, - - empty: function() { - var elem, - i = 0; - - for ( ; ( elem = this[ i ] ) != null; i++ ) { - if ( elem.nodeType === 1 ) { - - // Prevent memory leaks - jQuery.cleanData( getAll( elem, false ) ); - - // Remove any remaining nodes - elem.textContent = ""; - } - } - - return this; - }, - - clone: function( dataAndEvents, deepDataAndEvents ) { - dataAndEvents = dataAndEvents == null ? false : dataAndEvents; - deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - - return this.map( function() { - return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); - } ); - }, - - html: function( value ) { - return access( this, function( value ) { - var elem = this[ 0 ] || {}, - i = 0, - l = this.length; - - if ( value === undefined && elem.nodeType === 1 ) { - return elem.innerHTML; - } - - // See if we can take a shortcut and just use innerHTML - if ( typeof value === "string" && !rnoInnerhtml.test( value ) && - !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { - - value = jQuery.htmlPrefilter( value ); - - try { - for ( ; i < l; i++ ) { - elem = this[ i ] || {}; - - // Remove element nodes and prevent memory leaks - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - elem.innerHTML = value; - } - } - - elem = 0; - - // If using innerHTML throws an exception, use the fallback method - } catch ( e ) {} - } - - if ( elem ) { - this.empty().append( value ); - } - }, null, value, arguments.length ); - }, - - replaceWith: function() { - var ignored = []; - - // Make the changes, replacing each non-ignored context element with the new content - return domManip( this, arguments, function( elem ) { - var parent = this.parentNode; - - if ( jQuery.inArray( this, ignored ) < 0 ) { - jQuery.cleanData( getAll( this ) ); - if ( parent ) { - parent.replaceChild( elem, this ); - } - } - - // Force callback invocation - }, ignored ); - } -} ); - -jQuery.each( { - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" -}, function( name, original ) { - jQuery.fn[ name ] = function( selector ) { - var elems, - ret = [], - insert = jQuery( selector ), - last = insert.length - 1, - i = 0; - - for ( ; i <= last; i++ ) { - elems = i === last ? this : this.clone( true ); - jQuery( insert[ i ] )[ original ]( elems ); - - // Support: Android <=4.0 only, PhantomJS 1 only - // .get() because push.apply(_, arraylike) throws on ancient WebKit - push.apply( ret, elems.get() ); - } - - return this.pushStack( ret ); - }; -} ); -var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); - -var getStyles = function( elem ) { - - // Support: IE <=11 only, Firefox <=30 (#15098, #14150) - // IE throws on elements created in popups - // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" - var view = elem.ownerDocument.defaultView; - - if ( !view || !view.opener ) { - view = window; - } - - return view.getComputedStyle( elem ); - }; - -var swap = function( elem, options, callback ) { - var ret, name, - old = {}; - - // Remember the old values, and insert the new ones - for ( name in options ) { - old[ name ] = elem.style[ name ]; - elem.style[ name ] = options[ name ]; - } - - ret = callback.call( elem ); - - // Revert the old values - for ( name in options ) { - elem.style[ name ] = old[ name ]; - } - - return ret; -}; - - -var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); - - - -( function() { - - // Executing both pixelPosition & boxSizingReliable tests require only one layout - // so they're executed at the same time to save the second computation. - function computeStyleTests() { - - // This is a singleton, we need to execute it only once - if ( !div ) { - return; - } - - container.style.cssText = "position:absolute;left:-11111px;width:60px;" + - "margin-top:1px;padding:0;border:0"; - div.style.cssText = - "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + - "margin:auto;border:1px;padding:1px;" + - "width:60%;top:1%"; - documentElement.appendChild( container ).appendChild( div ); - - var divStyle = window.getComputedStyle( div ); - pixelPositionVal = divStyle.top !== "1%"; - - // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 - reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; - - // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 - // Some styles come back with percentage values, even though they shouldn't - div.style.right = "60%"; - pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; - - // Support: IE 9 - 11 only - // Detect misreporting of content dimensions for box-sizing:border-box elements - boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; - - // Support: IE 9 only - // Detect overflow:scroll screwiness (gh-3699) - // Support: Chrome <=64 - // Don't get tricked when zoom affects offsetWidth (gh-4029) - div.style.position = "absolute"; - scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; - - documentElement.removeChild( container ); - - // Nullify the div so it wouldn't be stored in the memory and - // it will also be a sign that checks already performed - div = null; - } - - function roundPixelMeasures( measure ) { - return Math.round( parseFloat( measure ) ); - } - - var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, - reliableTrDimensionsVal, reliableMarginLeftVal, - container = document.createElement( "div" ), - div = document.createElement( "div" ); - - // Finish early in limited (non-browser) environments - if ( !div.style ) { - return; - } - - // Support: IE <=9 - 11 only - // Style of cloned element affects source element cloned (#8908) - div.style.backgroundClip = "content-box"; - div.cloneNode( true ).style.backgroundClip = ""; - support.clearCloneStyle = div.style.backgroundClip === "content-box"; - - jQuery.extend( support, { - boxSizingReliable: function() { - computeStyleTests(); - return boxSizingReliableVal; - }, - pixelBoxStyles: function() { - computeStyleTests(); - return pixelBoxStylesVal; - }, - pixelPosition: function() { - computeStyleTests(); - return pixelPositionVal; - }, - reliableMarginLeft: function() { - computeStyleTests(); - return reliableMarginLeftVal; - }, - scrollboxSize: function() { - computeStyleTests(); - return scrollboxSizeVal; - }, - - // Support: IE 9 - 11+, Edge 15 - 18+ - // IE/Edge misreport `getComputedStyle` of table rows with width/height - // set in CSS while `offset*` properties report correct values. - // Behavior in IE 9 is more subtle than in newer versions & it passes - // some versions of this test; make sure not to make it pass there! - reliableTrDimensions: function() { - var table, tr, trChild, trStyle; - if ( reliableTrDimensionsVal == null ) { - table = document.createElement( "table" ); - tr = document.createElement( "tr" ); - trChild = document.createElement( "div" ); - - table.style.cssText = "position:absolute;left:-11111px"; - tr.style.height = "1px"; - trChild.style.height = "9px"; - - documentElement - .appendChild( table ) - .appendChild( tr ) - .appendChild( trChild ); - - trStyle = window.getComputedStyle( tr ); - reliableTrDimensionsVal = parseInt( trStyle.height ) > 3; - - documentElement.removeChild( table ); - } - return reliableTrDimensionsVal; - } - } ); -} )(); - - -function curCSS( elem, name, computed ) { - var width, minWidth, maxWidth, ret, - - // Support: Firefox 51+ - // Retrieving style before computed somehow - // fixes an issue with getting wrong values - // on detached elements - style = elem.style; - - computed = computed || getStyles( elem ); - - // getPropertyValue is needed for: - // .css('filter') (IE 9 only, #12537) - // .css('--customProperty) (#3144) - if ( computed ) { - ret = computed.getPropertyValue( name ) || computed[ name ]; - - if ( ret === "" && !isAttached( elem ) ) { - ret = jQuery.style( elem, name ); - } - - // A tribute to the "awesome hack by Dean Edwards" - // Android Browser returns percentage for some values, - // but width seems to be reliably pixels. - // This is against the CSSOM draft spec: - // https://drafts.csswg.org/cssom/#resolved-values - if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { - - // Remember the original values - width = style.width; - minWidth = style.minWidth; - maxWidth = style.maxWidth; - - // Put in the new values to get a computed value out - style.minWidth = style.maxWidth = style.width = ret; - ret = computed.width; - - // Revert the changed values - style.width = width; - style.minWidth = minWidth; - style.maxWidth = maxWidth; - } - } - - return ret !== undefined ? - - // Support: IE <=9 - 11 only - // IE returns zIndex value as an integer. - ret + "" : - ret; -} - - -function addGetHookIf( conditionFn, hookFn ) { - - // Define the hook, we'll check on the first run if it's really needed. - return { - get: function() { - if ( conditionFn() ) { - - // Hook not needed (or it's not possible to use it due - // to missing dependency), remove it. - delete this.get; - return; - } - - // Hook needed; redefine it so that the support test is not executed again. - return ( this.get = hookFn ).apply( this, arguments ); - } - }; -} - - -var cssPrefixes = [ "Webkit", "Moz", "ms" ], - emptyStyle = document.createElement( "div" ).style, - vendorProps = {}; - -// Return a vendor-prefixed property or undefined -function vendorPropName( name ) { - - // Check for vendor prefixed names - var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), - i = cssPrefixes.length; - - while ( i-- ) { - name = cssPrefixes[ i ] + capName; - if ( name in emptyStyle ) { - return name; - } - } -} - -// Return a potentially-mapped jQuery.cssProps or vendor prefixed property -function finalPropName( name ) { - var final = jQuery.cssProps[ name ] || vendorProps[ name ]; - - if ( final ) { - return final; - } - if ( name in emptyStyle ) { - return name; - } - return vendorProps[ name ] = vendorPropName( name ) || name; -} - - -var - - // Swappable if display is none or starts with table - // except "table", "table-cell", or "table-caption" - // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display - rdisplayswap = /^(none|table(?!-c[ea]).+)/, - rcustomProp = /^--/, - cssShow = { position: "absolute", visibility: "hidden", display: "block" }, - cssNormalTransform = { - letterSpacing: "0", - fontWeight: "400" - }; - -function setPositiveNumber( _elem, value, subtract ) { - - // Any relative (+/-) values have already been - // normalized at this point - var matches = rcssNum.exec( value ); - return matches ? - - // Guard against undefined "subtract", e.g., when used as in cssHooks - Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : - value; -} - -function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { - var i = dimension === "width" ? 1 : 0, - extra = 0, - delta = 0; - - // Adjustment may not be necessary - if ( box === ( isBorderBox ? "border" : "content" ) ) { - return 0; - } - - for ( ; i < 4; i += 2 ) { - - // Both box models exclude margin - if ( box === "margin" ) { - delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); - } - - // If we get here with a content-box, we're seeking "padding" or "border" or "margin" - if ( !isBorderBox ) { - - // Add padding - delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - - // For "border" or "margin", add border - if ( box !== "padding" ) { - delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - - // But still keep track of it otherwise - } else { - extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - - // If we get here with a border-box (content + padding + border), we're seeking "content" or - // "padding" or "margin" - } else { - - // For "content", subtract padding - if ( box === "content" ) { - delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - } - - // For "content" or "padding", subtract border - if ( box !== "margin" ) { - delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } - } - - // Account for positive content-box scroll gutter when requested by providing computedVal - if ( !isBorderBox && computedVal >= 0 ) { - - // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border - // Assuming integer scroll gutter, subtract the rest and round down - delta += Math.max( 0, Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - computedVal - - delta - - extra - - 0.5 - - // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter - // Use an explicit zero to avoid NaN (gh-3964) - ) ) || 0; - } - - return delta; -} - -function getWidthOrHeight( elem, dimension, extra ) { - - // Start with computed style - var styles = getStyles( elem ), - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). - // Fake content-box until we know it's needed to know the true value. - boxSizingNeeded = !support.boxSizingReliable() || extra, - isBorderBox = boxSizingNeeded && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - valueIsBorderBox = isBorderBox, - - val = curCSS( elem, dimension, styles ), - offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); - - // Support: Firefox <=54 - // Return a confounding non-pixel value or feign ignorance, as appropriate. - if ( rnumnonpx.test( val ) ) { - if ( !extra ) { - return val; - } - val = "auto"; - } - - - // Support: IE 9 - 11 only - // Use offsetWidth/offsetHeight for when box sizing is unreliable. - // In those cases, the computed value can be trusted to be border-box. - if ( ( !support.boxSizingReliable() && isBorderBox || - - // Support: IE 10 - 11+, Edge 15 - 18+ - // IE/Edge misreport `getComputedStyle` of table rows with width/height - // set in CSS while `offset*` properties report correct values. - // Interestingly, in some cases IE 9 doesn't suffer from this issue. - !support.reliableTrDimensions() && nodeName( elem, "tr" ) || - - // Fall back to offsetWidth/offsetHeight when value is "auto" - // This happens for inline elements with no explicit setting (gh-3571) - val === "auto" || - - // Support: Android <=4.1 - 4.3 only - // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) - !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && - - // Make sure the element is visible & connected - elem.getClientRects().length ) { - - isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; - - // Where available, offsetWidth/offsetHeight approximate border box dimensions. - // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the - // retrieved value as a content box dimension. - valueIsBorderBox = offsetProp in elem; - if ( valueIsBorderBox ) { - val = elem[ offsetProp ]; - } - } - - // Normalize "" and auto - val = parseFloat( val ) || 0; - - // Adjust for the element's box model - return ( val + - boxModelAdjustment( - elem, - dimension, - extra || ( isBorderBox ? "border" : "content" ), - valueIsBorderBox, - styles, - - // Provide the current computed size to request scroll gutter calculation (gh-3589) - val - ) - ) + "px"; -} - -jQuery.extend( { - - // Add in style property hooks for overriding the default - // behavior of getting and setting a style property - cssHooks: { - opacity: { - get: function( elem, computed ) { - if ( computed ) { - - // We should always get a number back from opacity - var ret = curCSS( elem, "opacity" ); - return ret === "" ? "1" : ret; - } - } - } - }, - - // Don't automatically add "px" to these possibly-unitless properties - cssNumber: { - "animationIterationCount": true, - "columnCount": true, - "fillOpacity": true, - "flexGrow": true, - "flexShrink": true, - "fontWeight": true, - "gridArea": true, - "gridColumn": true, - "gridColumnEnd": true, - "gridColumnStart": true, - "gridRow": true, - "gridRowEnd": true, - "gridRowStart": true, - "lineHeight": true, - "opacity": true, - "order": true, - "orphans": true, - "widows": true, - "zIndex": true, - "zoom": true - }, - - // Add in properties whose names you wish to fix before - // setting or getting the value - cssProps: {}, - - // Get and set the style property on a DOM Node - style: function( elem, name, value, extra ) { - - // Don't set styles on text and comment nodes - if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { - return; - } - - // Make sure that we're working with the right name - var ret, type, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ), - style = elem.style; - - // Make sure that we're working with the right name. We don't - // want to query the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Gets hook for the prefixed version, then unprefixed version - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // Check if we're setting a value - if ( value !== undefined ) { - type = typeof value; - - // Convert "+=" or "-=" to relative numbers (#7345) - if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { - value = adjustCSS( elem, name, ret ); - - // Fixes bug #9237 - type = "number"; - } - - // Make sure that null and NaN values aren't set (#7116) - if ( value == null || value !== value ) { - return; - } - - // If a number was passed in, add the unit (except for certain CSS properties) - // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append - // "px" to a few hardcoded values. - if ( type === "number" && !isCustomProp ) { - value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); - } - - // background-* props affect original clone's values - if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { - style[ name ] = "inherit"; - } - - // If a hook was provided, use that value, otherwise just set the specified value - if ( !hooks || !( "set" in hooks ) || - ( value = hooks.set( elem, value, extra ) ) !== undefined ) { - - if ( isCustomProp ) { - style.setProperty( name, value ); - } else { - style[ name ] = value; - } - } - - } else { - - // If a hook was provided get the non-computed value from there - if ( hooks && "get" in hooks && - ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { - - return ret; - } - - // Otherwise just get the value from the style object - return style[ name ]; - } - }, - - css: function( elem, name, extra, styles ) { - var val, num, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ); - - // Make sure that we're working with the right name. We don't - // want to modify the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Try prefixed name followed by the unprefixed name - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // If a hook was provided get the computed value from there - if ( hooks && "get" in hooks ) { - val = hooks.get( elem, true, extra ); - } - - // Otherwise, if a way to get the computed value exists, use that - if ( val === undefined ) { - val = curCSS( elem, name, styles ); - } - - // Convert "normal" to computed value - if ( val === "normal" && name in cssNormalTransform ) { - val = cssNormalTransform[ name ]; - } - - // Make numeric if forced or a qualifier was provided and val looks numeric - if ( extra === "" || extra ) { - num = parseFloat( val ); - return extra === true || isFinite( num ) ? num || 0 : val; - } - - return val; - } -} ); - -jQuery.each( [ "height", "width" ], function( _i, dimension ) { - jQuery.cssHooks[ dimension ] = { - get: function( elem, computed, extra ) { - if ( computed ) { - - // Certain elements can have dimension info if we invisibly show them - // but it must have a current display style that would benefit - return rdisplayswap.test( jQuery.css( elem, "display" ) ) && - - // Support: Safari 8+ - // Table columns in Safari have non-zero offsetWidth & zero - // getBoundingClientRect().width unless display is changed. - // Support: IE <=11 only - // Running getBoundingClientRect on a disconnected node - // in IE throws an error. - ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? - swap( elem, cssShow, function() { - return getWidthOrHeight( elem, dimension, extra ); - } ) : - getWidthOrHeight( elem, dimension, extra ); - } - }, - - set: function( elem, value, extra ) { - var matches, - styles = getStyles( elem ), - - // Only read styles.position if the test has a chance to fail - // to avoid forcing a reflow. - scrollboxSizeBuggy = !support.scrollboxSize() && - styles.position === "absolute", - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) - boxSizingNeeded = scrollboxSizeBuggy || extra, - isBorderBox = boxSizingNeeded && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - subtract = extra ? - boxModelAdjustment( - elem, - dimension, - extra, - isBorderBox, - styles - ) : - 0; - - // Account for unreliable border-box dimensions by comparing offset* to computed and - // faking a content-box to get border and padding (gh-3699) - if ( isBorderBox && scrollboxSizeBuggy ) { - subtract -= Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - parseFloat( styles[ dimension ] ) - - boxModelAdjustment( elem, dimension, "border", false, styles ) - - 0.5 - ); - } - - // Convert to pixels if value adjustment is needed - if ( subtract && ( matches = rcssNum.exec( value ) ) && - ( matches[ 3 ] || "px" ) !== "px" ) { - - elem.style[ dimension ] = value; - value = jQuery.css( elem, dimension ); - } - - return setPositiveNumber( elem, value, subtract ); - } - }; -} ); - -jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, - function( elem, computed ) { - if ( computed ) { - return ( parseFloat( curCSS( elem, "marginLeft" ) ) || - elem.getBoundingClientRect().left - - swap( elem, { marginLeft: 0 }, function() { - return elem.getBoundingClientRect().left; - } ) - ) + "px"; - } - } -); - -// These hooks are used by animate to expand properties -jQuery.each( { - margin: "", - padding: "", - border: "Width" -}, function( prefix, suffix ) { - jQuery.cssHooks[ prefix + suffix ] = { - expand: function( value ) { - var i = 0, - expanded = {}, - - // Assumes a single number if not a string - parts = typeof value === "string" ? value.split( " " ) : [ value ]; - - for ( ; i < 4; i++ ) { - expanded[ prefix + cssExpand[ i ] + suffix ] = - parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; - } - - return expanded; - } - }; - - if ( prefix !== "margin" ) { - jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; - } -} ); - -jQuery.fn.extend( { - css: function( name, value ) { - return access( this, function( elem, name, value ) { - var styles, len, - map = {}, - i = 0; - - if ( Array.isArray( name ) ) { - styles = getStyles( elem ); - len = name.length; - - for ( ; i < len; i++ ) { - map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); - } - - return map; - } - - return value !== undefined ? - jQuery.style( elem, name, value ) : - jQuery.css( elem, name ); - }, name, value, arguments.length > 1 ); - } -} ); - - -function Tween( elem, options, prop, end, easing ) { - return new Tween.prototype.init( elem, options, prop, end, easing ); -} -jQuery.Tween = Tween; - -Tween.prototype = { - constructor: Tween, - init: function( elem, options, prop, end, easing, unit ) { - this.elem = elem; - this.prop = prop; - this.easing = easing || jQuery.easing._default; - this.options = options; - this.start = this.now = this.cur(); - this.end = end; - this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); - }, - cur: function() { - var hooks = Tween.propHooks[ this.prop ]; - - return hooks && hooks.get ? - hooks.get( this ) : - Tween.propHooks._default.get( this ); - }, - run: function( percent ) { - var eased, - hooks = Tween.propHooks[ this.prop ]; - - if ( this.options.duration ) { - this.pos = eased = jQuery.easing[ this.easing ]( - percent, this.options.duration * percent, 0, 1, this.options.duration - ); - } else { - this.pos = eased = percent; - } - this.now = ( this.end - this.start ) * eased + this.start; - - if ( this.options.step ) { - this.options.step.call( this.elem, this.now, this ); - } - - if ( hooks && hooks.set ) { - hooks.set( this ); - } else { - Tween.propHooks._default.set( this ); - } - return this; - } -}; - -Tween.prototype.init.prototype = Tween.prototype; - -Tween.propHooks = { - _default: { - get: function( tween ) { - var result; - - // Use a property on the element directly when it is not a DOM element, - // or when there is no matching style property that exists. - if ( tween.elem.nodeType !== 1 || - tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { - return tween.elem[ tween.prop ]; - } - - // Passing an empty string as a 3rd parameter to .css will automatically - // attempt a parseFloat and fallback to a string if the parse fails. - // Simple values such as "10px" are parsed to Float; - // complex values such as "rotate(1rad)" are returned as-is. - result = jQuery.css( tween.elem, tween.prop, "" ); - - // Empty strings, null, undefined and "auto" are converted to 0. - return !result || result === "auto" ? 0 : result; - }, - set: function( tween ) { - - // Use step hook for back compat. - // Use cssHook if its there. - // Use .style if available and use plain properties where available. - if ( jQuery.fx.step[ tween.prop ] ) { - jQuery.fx.step[ tween.prop ]( tween ); - } else if ( tween.elem.nodeType === 1 && ( - jQuery.cssHooks[ tween.prop ] || - tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { - jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); - } else { - tween.elem[ tween.prop ] = tween.now; - } - } - } -}; - -// Support: IE <=9 only -// Panic based approach to setting things on disconnected nodes -Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { - set: function( tween ) { - if ( tween.elem.nodeType && tween.elem.parentNode ) { - tween.elem[ tween.prop ] = tween.now; - } - } -}; - -jQuery.easing = { - linear: function( p ) { - return p; - }, - swing: function( p ) { - return 0.5 - Math.cos( p * Math.PI ) / 2; - }, - _default: "swing" -}; - -jQuery.fx = Tween.prototype.init; - -// Back compat <1.8 extension point -jQuery.fx.step = {}; - - - - -var - fxNow, inProgress, - rfxtypes = /^(?:toggle|show|hide)$/, - rrun = /queueHooks$/; - -function schedule() { - if ( inProgress ) { - if ( document.hidden === false && window.requestAnimationFrame ) { - window.requestAnimationFrame( schedule ); - } else { - window.setTimeout( schedule, jQuery.fx.interval ); - } - - jQuery.fx.tick(); - } -} - -// Animations created synchronously will run synchronously -function createFxNow() { - window.setTimeout( function() { - fxNow = undefined; - } ); - return ( fxNow = Date.now() ); -} - -// Generate parameters to create a standard animation -function genFx( type, includeWidth ) { - var which, - i = 0, - attrs = { height: type }; - - // If we include width, step value is 1 to do all cssExpand values, - // otherwise step value is 2 to skip over Left and Right - includeWidth = includeWidth ? 1 : 0; - for ( ; i < 4; i += 2 - includeWidth ) { - which = cssExpand[ i ]; - attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; - } - - if ( includeWidth ) { - attrs.opacity = attrs.width = type; - } - - return attrs; -} - -function createTween( value, prop, animation ) { - var tween, - collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), - index = 0, - length = collection.length; - for ( ; index < length; index++ ) { - if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { - - // We're done with this property - return tween; - } - } -} - -function defaultPrefilter( elem, props, opts ) { - var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, - isBox = "width" in props || "height" in props, - anim = this, - orig = {}, - style = elem.style, - hidden = elem.nodeType && isHiddenWithinTree( elem ), - dataShow = dataPriv.get( elem, "fxshow" ); - - // Queue-skipping animations hijack the fx hooks - if ( !opts.queue ) { - hooks = jQuery._queueHooks( elem, "fx" ); - if ( hooks.unqueued == null ) { - hooks.unqueued = 0; - oldfire = hooks.empty.fire; - hooks.empty.fire = function() { - if ( !hooks.unqueued ) { - oldfire(); - } - }; - } - hooks.unqueued++; - - anim.always( function() { - - // Ensure the complete handler is called before this completes - anim.always( function() { - hooks.unqueued--; - if ( !jQuery.queue( elem, "fx" ).length ) { - hooks.empty.fire(); - } - } ); - } ); - } - - // Detect show/hide animations - for ( prop in props ) { - value = props[ prop ]; - if ( rfxtypes.test( value ) ) { - delete props[ prop ]; - toggle = toggle || value === "toggle"; - if ( value === ( hidden ? "hide" : "show" ) ) { - - // Pretend to be hidden if this is a "show" and - // there is still data from a stopped show/hide - if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { - hidden = true; - - // Ignore all other no-op show/hide data - } else { - continue; - } - } - orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); - } - } - - // Bail out if this is a no-op like .hide().hide() - propTween = !jQuery.isEmptyObject( props ); - if ( !propTween && jQuery.isEmptyObject( orig ) ) { - return; - } - - // Restrict "overflow" and "display" styles during box animations - if ( isBox && elem.nodeType === 1 ) { - - // Support: IE <=9 - 11, Edge 12 - 15 - // Record all 3 overflow attributes because IE does not infer the shorthand - // from identically-valued overflowX and overflowY and Edge just mirrors - // the overflowX value there. - opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; - - // Identify a display type, preferring old show/hide data over the CSS cascade - restoreDisplay = dataShow && dataShow.display; - if ( restoreDisplay == null ) { - restoreDisplay = dataPriv.get( elem, "display" ); - } - display = jQuery.css( elem, "display" ); - if ( display === "none" ) { - if ( restoreDisplay ) { - display = restoreDisplay; - } else { - - // Get nonempty value(s) by temporarily forcing visibility - showHide( [ elem ], true ); - restoreDisplay = elem.style.display || restoreDisplay; - display = jQuery.css( elem, "display" ); - showHide( [ elem ] ); - } - } - - // Animate inline elements as inline-block - if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { - if ( jQuery.css( elem, "float" ) === "none" ) { - - // Restore the original display value at the end of pure show/hide animations - if ( !propTween ) { - anim.done( function() { - style.display = restoreDisplay; - } ); - if ( restoreDisplay == null ) { - display = style.display; - restoreDisplay = display === "none" ? "" : display; - } - } - style.display = "inline-block"; - } - } - } - - if ( opts.overflow ) { - style.overflow = "hidden"; - anim.always( function() { - style.overflow = opts.overflow[ 0 ]; - style.overflowX = opts.overflow[ 1 ]; - style.overflowY = opts.overflow[ 2 ]; - } ); - } - - // Implement show/hide animations - propTween = false; - for ( prop in orig ) { - - // General show/hide setup for this element animation - if ( !propTween ) { - if ( dataShow ) { - if ( "hidden" in dataShow ) { - hidden = dataShow.hidden; - } - } else { - dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); - } - - // Store hidden/visible for toggle so `.stop().toggle()` "reverses" - if ( toggle ) { - dataShow.hidden = !hidden; - } - - // Show elements before animating them - if ( hidden ) { - showHide( [ elem ], true ); - } - - /* eslint-disable no-loop-func */ - - anim.done( function() { - - /* eslint-enable no-loop-func */ - - // The final step of a "hide" animation is actually hiding the element - if ( !hidden ) { - showHide( [ elem ] ); - } - dataPriv.remove( elem, "fxshow" ); - for ( prop in orig ) { - jQuery.style( elem, prop, orig[ prop ] ); - } - } ); - } - - // Per-property setup - propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); - if ( !( prop in dataShow ) ) { - dataShow[ prop ] = propTween.start; - if ( hidden ) { - propTween.end = propTween.start; - propTween.start = 0; - } - } - } -} - -function propFilter( props, specialEasing ) { - var index, name, easing, value, hooks; - - // camelCase, specialEasing and expand cssHook pass - for ( index in props ) { - name = camelCase( index ); - easing = specialEasing[ name ]; - value = props[ index ]; - if ( Array.isArray( value ) ) { - easing = value[ 1 ]; - value = props[ index ] = value[ 0 ]; - } - - if ( index !== name ) { - props[ name ] = value; - delete props[ index ]; - } - - hooks = jQuery.cssHooks[ name ]; - if ( hooks && "expand" in hooks ) { - value = hooks.expand( value ); - delete props[ name ]; - - // Not quite $.extend, this won't overwrite existing keys. - // Reusing 'index' because we have the correct "name" - for ( index in value ) { - if ( !( index in props ) ) { - props[ index ] = value[ index ]; - specialEasing[ index ] = easing; - } - } - } else { - specialEasing[ name ] = easing; - } - } -} - -function Animation( elem, properties, options ) { - var result, - stopped, - index = 0, - length = Animation.prefilters.length, - deferred = jQuery.Deferred().always( function() { - - // Don't match elem in the :animated selector - delete tick.elem; - } ), - tick = function() { - if ( stopped ) { - return false; - } - var currentTime = fxNow || createFxNow(), - remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), - - // Support: Android 2.3 only - // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) - temp = remaining / animation.duration || 0, - percent = 1 - temp, - index = 0, - length = animation.tweens.length; - - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( percent ); - } - - deferred.notifyWith( elem, [ animation, percent, remaining ] ); - - // If there's more to do, yield - if ( percent < 1 && length ) { - return remaining; - } - - // If this was an empty animation, synthesize a final progress notification - if ( !length ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - } - - // Resolve the animation and report its conclusion - deferred.resolveWith( elem, [ animation ] ); - return false; - }, - animation = deferred.promise( { - elem: elem, - props: jQuery.extend( {}, properties ), - opts: jQuery.extend( true, { - specialEasing: {}, - easing: jQuery.easing._default - }, options ), - originalProperties: properties, - originalOptions: options, - startTime: fxNow || createFxNow(), - duration: options.duration, - tweens: [], - createTween: function( prop, end ) { - var tween = jQuery.Tween( elem, animation.opts, prop, end, - animation.opts.specialEasing[ prop ] || animation.opts.easing ); - animation.tweens.push( tween ); - return tween; - }, - stop: function( gotoEnd ) { - var index = 0, - - // If we are going to the end, we want to run all the tweens - // otherwise we skip this part - length = gotoEnd ? animation.tweens.length : 0; - if ( stopped ) { - return this; - } - stopped = true; - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( 1 ); - } - - // Resolve when we played the last frame; otherwise, reject - if ( gotoEnd ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - deferred.resolveWith( elem, [ animation, gotoEnd ] ); - } else { - deferred.rejectWith( elem, [ animation, gotoEnd ] ); - } - return this; - } - } ), - props = animation.props; - - propFilter( props, animation.opts.specialEasing ); - - for ( ; index < length; index++ ) { - result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); - if ( result ) { - if ( isFunction( result.stop ) ) { - jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = - result.stop.bind( result ); - } - return result; - } - } - - jQuery.map( props, createTween, animation ); - - if ( isFunction( animation.opts.start ) ) { - animation.opts.start.call( elem, animation ); - } - - // Attach callbacks from options - animation - .progress( animation.opts.progress ) - .done( animation.opts.done, animation.opts.complete ) - .fail( animation.opts.fail ) - .always( animation.opts.always ); - - jQuery.fx.timer( - jQuery.extend( tick, { - elem: elem, - anim: animation, - queue: animation.opts.queue - } ) - ); - - return animation; -} - -jQuery.Animation = jQuery.extend( Animation, { - - tweeners: { - "*": [ function( prop, value ) { - var tween = this.createTween( prop, value ); - adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); - return tween; - } ] - }, - - tweener: function( props, callback ) { - if ( isFunction( props ) ) { - callback = props; - props = [ "*" ]; - } else { - props = props.match( rnothtmlwhite ); - } - - var prop, - index = 0, - length = props.length; - - for ( ; index < length; index++ ) { - prop = props[ index ]; - Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; - Animation.tweeners[ prop ].unshift( callback ); - } - }, - - prefilters: [ defaultPrefilter ], - - prefilter: function( callback, prepend ) { - if ( prepend ) { - Animation.prefilters.unshift( callback ); - } else { - Animation.prefilters.push( callback ); - } - } -} ); - -jQuery.speed = function( speed, easing, fn ) { - var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { - complete: fn || !fn && easing || - isFunction( speed ) && speed, - duration: speed, - easing: fn && easing || easing && !isFunction( easing ) && easing - }; - - // Go to the end state if fx are off - if ( jQuery.fx.off ) { - opt.duration = 0; - - } else { - if ( typeof opt.duration !== "number" ) { - if ( opt.duration in jQuery.fx.speeds ) { - opt.duration = jQuery.fx.speeds[ opt.duration ]; - - } else { - opt.duration = jQuery.fx.speeds._default; - } - } - } - - // Normalize opt.queue - true/undefined/null -> "fx" - if ( opt.queue == null || opt.queue === true ) { - opt.queue = "fx"; - } - - // Queueing - opt.old = opt.complete; - - opt.complete = function() { - if ( isFunction( opt.old ) ) { - opt.old.call( this ); - } - - if ( opt.queue ) { - jQuery.dequeue( this, opt.queue ); - } - }; - - return opt; -}; - -jQuery.fn.extend( { - fadeTo: function( speed, to, easing, callback ) { - - // Show any hidden elements after setting opacity to 0 - return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() - - // Animate to the value specified - .end().animate( { opacity: to }, speed, easing, callback ); - }, - animate: function( prop, speed, easing, callback ) { - var empty = jQuery.isEmptyObject( prop ), - optall = jQuery.speed( speed, easing, callback ), - doAnimation = function() { - - // Operate on a copy of prop so per-property easing won't be lost - var anim = Animation( this, jQuery.extend( {}, prop ), optall ); - - // Empty animations, or finishing resolves immediately - if ( empty || dataPriv.get( this, "finish" ) ) { - anim.stop( true ); - } - }; - doAnimation.finish = doAnimation; - - return empty || optall.queue === false ? - this.each( doAnimation ) : - this.queue( optall.queue, doAnimation ); - }, - stop: function( type, clearQueue, gotoEnd ) { - var stopQueue = function( hooks ) { - var stop = hooks.stop; - delete hooks.stop; - stop( gotoEnd ); - }; - - if ( typeof type !== "string" ) { - gotoEnd = clearQueue; - clearQueue = type; - type = undefined; - } - if ( clearQueue ) { - this.queue( type || "fx", [] ); - } - - return this.each( function() { - var dequeue = true, - index = type != null && type + "queueHooks", - timers = jQuery.timers, - data = dataPriv.get( this ); - - if ( index ) { - if ( data[ index ] && data[ index ].stop ) { - stopQueue( data[ index ] ); - } - } else { - for ( index in data ) { - if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { - stopQueue( data[ index ] ); - } - } - } - - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && - ( type == null || timers[ index ].queue === type ) ) { - - timers[ index ].anim.stop( gotoEnd ); - dequeue = false; - timers.splice( index, 1 ); - } - } - - // Start the next in the queue if the last step wasn't forced. - // Timers currently will call their complete callbacks, which - // will dequeue but only if they were gotoEnd. - if ( dequeue || !gotoEnd ) { - jQuery.dequeue( this, type ); - } - } ); - }, - finish: function( type ) { - if ( type !== false ) { - type = type || "fx"; - } - return this.each( function() { - var index, - data = dataPriv.get( this ), - queue = data[ type + "queue" ], - hooks = data[ type + "queueHooks" ], - timers = jQuery.timers, - length = queue ? queue.length : 0; - - // Enable finishing flag on private data - data.finish = true; - - // Empty the queue first - jQuery.queue( this, type, [] ); - - if ( hooks && hooks.stop ) { - hooks.stop.call( this, true ); - } - - // Look for any active animations, and finish them - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && timers[ index ].queue === type ) { - timers[ index ].anim.stop( true ); - timers.splice( index, 1 ); - } - } - - // Look for any animations in the old queue and finish them - for ( index = 0; index < length; index++ ) { - if ( queue[ index ] && queue[ index ].finish ) { - queue[ index ].finish.call( this ); - } - } - - // Turn off finishing flag - delete data.finish; - } ); - } -} ); - -jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) { - var cssFn = jQuery.fn[ name ]; - jQuery.fn[ name ] = function( speed, easing, callback ) { - return speed == null || typeof speed === "boolean" ? - cssFn.apply( this, arguments ) : - this.animate( genFx( name, true ), speed, easing, callback ); - }; -} ); - -// Generate shortcuts for custom animations -jQuery.each( { - slideDown: genFx( "show" ), - slideUp: genFx( "hide" ), - slideToggle: genFx( "toggle" ), - fadeIn: { opacity: "show" }, - fadeOut: { opacity: "hide" }, - fadeToggle: { opacity: "toggle" } -}, function( name, props ) { - jQuery.fn[ name ] = function( speed, easing, callback ) { - return this.animate( props, speed, easing, callback ); - }; -} ); - -jQuery.timers = []; -jQuery.fx.tick = function() { - var timer, - i = 0, - timers = jQuery.timers; - - fxNow = Date.now(); - - for ( ; i < timers.length; i++ ) { - timer = timers[ i ]; - - // Run the timer and safely remove it when done (allowing for external removal) - if ( !timer() && timers[ i ] === timer ) { - timers.splice( i--, 1 ); - } - } - - if ( !timers.length ) { - jQuery.fx.stop(); - } - fxNow = undefined; -}; - -jQuery.fx.timer = function( timer ) { - jQuery.timers.push( timer ); - jQuery.fx.start(); -}; - -jQuery.fx.interval = 13; -jQuery.fx.start = function() { - if ( inProgress ) { - return; - } - - inProgress = true; - schedule(); -}; - -jQuery.fx.stop = function() { - inProgress = null; -}; - -jQuery.fx.speeds = { - slow: 600, - fast: 200, - - // Default speed - _default: 400 -}; - - -// Based off of the plugin by Clint Helfers, with permission. -// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ -jQuery.fn.delay = function( time, type ) { - time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; - type = type || "fx"; - - return this.queue( type, function( next, hooks ) { - var timeout = window.setTimeout( next, time ); - hooks.stop = function() { - window.clearTimeout( timeout ); - }; - } ); -}; - - -( function() { - var input = document.createElement( "input" ), - select = document.createElement( "select" ), - opt = select.appendChild( document.createElement( "option" ) ); - - input.type = "checkbox"; - - // Support: Android <=4.3 only - // Default value for a checkbox should be "on" - support.checkOn = input.value !== ""; - - // Support: IE <=11 only - // Must access selectedIndex to make default options select - support.optSelected = opt.selected; - - // Support: IE <=11 only - // An input loses its value after becoming a radio - input = document.createElement( "input" ); - input.value = "t"; - input.type = "radio"; - support.radioValue = input.value === "t"; -} )(); - - -var boolHook, - attrHandle = jQuery.expr.attrHandle; - -jQuery.fn.extend( { - attr: function( name, value ) { - return access( this, jQuery.attr, name, value, arguments.length > 1 ); - }, - - removeAttr: function( name ) { - return this.each( function() { - jQuery.removeAttr( this, name ); - } ); - } -} ); - -jQuery.extend( { - attr: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set attributes on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - // Fallback to prop when attributes are not supported - if ( typeof elem.getAttribute === "undefined" ) { - return jQuery.prop( elem, name, value ); - } - - // Attribute hooks are determined by the lowercase version - // Grab necessary hook if one is defined - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - hooks = jQuery.attrHooks[ name.toLowerCase() ] || - ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); - } - - if ( value !== undefined ) { - if ( value === null ) { - jQuery.removeAttr( elem, name ); - return; - } - - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - elem.setAttribute( name, value + "" ); - return value; - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - ret = jQuery.find.attr( elem, name ); - - // Non-existent attributes return null, we normalize to undefined - return ret == null ? undefined : ret; - }, - - attrHooks: { - type: { - set: function( elem, value ) { - if ( !support.radioValue && value === "radio" && - nodeName( elem, "input" ) ) { - var val = elem.value; - elem.setAttribute( "type", value ); - if ( val ) { - elem.value = val; - } - return value; - } - } - } - }, - - removeAttr: function( elem, value ) { - var name, - i = 0, - - // Attribute names can contain non-HTML whitespace characters - // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 - attrNames = value && value.match( rnothtmlwhite ); - - if ( attrNames && elem.nodeType === 1 ) { - while ( ( name = attrNames[ i++ ] ) ) { - elem.removeAttribute( name ); - } - } - } -} ); - -// Hooks for boolean attributes -boolHook = { - set: function( elem, value, name ) { - if ( value === false ) { - - // Remove boolean attributes when set to false - jQuery.removeAttr( elem, name ); - } else { - elem.setAttribute( name, name ); - } - return name; - } -}; - -jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) { - var getter = attrHandle[ name ] || jQuery.find.attr; - - attrHandle[ name ] = function( elem, name, isXML ) { - var ret, handle, - lowercaseName = name.toLowerCase(); - - if ( !isXML ) { - - // Avoid an infinite loop by temporarily removing this function from the getter - handle = attrHandle[ lowercaseName ]; - attrHandle[ lowercaseName ] = ret; - ret = getter( elem, name, isXML ) != null ? - lowercaseName : - null; - attrHandle[ lowercaseName ] = handle; - } - return ret; - }; -} ); - - - - -var rfocusable = /^(?:input|select|textarea|button)$/i, - rclickable = /^(?:a|area)$/i; - -jQuery.fn.extend( { - prop: function( name, value ) { - return access( this, jQuery.prop, name, value, arguments.length > 1 ); - }, - - removeProp: function( name ) { - return this.each( function() { - delete this[ jQuery.propFix[ name ] || name ]; - } ); - } -} ); - -jQuery.extend( { - prop: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set properties on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - - // Fix name and attach hooks - name = jQuery.propFix[ name ] || name; - hooks = jQuery.propHooks[ name ]; - } - - if ( value !== undefined ) { - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - return ( elem[ name ] = value ); - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - return elem[ name ]; - }, - - propHooks: { - tabIndex: { - get: function( elem ) { - - // Support: IE <=9 - 11 only - // elem.tabIndex doesn't always return the - // correct value when it hasn't been explicitly set - // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ - // Use proper attribute retrieval(#12072) - var tabindex = jQuery.find.attr( elem, "tabindex" ); - - if ( tabindex ) { - return parseInt( tabindex, 10 ); - } - - if ( - rfocusable.test( elem.nodeName ) || - rclickable.test( elem.nodeName ) && - elem.href - ) { - return 0; - } - - return -1; - } - } - }, - - propFix: { - "for": "htmlFor", - "class": "className" - } -} ); - -// Support: IE <=11 only -// Accessing the selectedIndex property -// forces the browser to respect setting selected -// on the option -// The getter ensures a default option is selected -// when in an optgroup -// eslint rule "no-unused-expressions" is disabled for this code -// since it considers such accessions noop -if ( !support.optSelected ) { - jQuery.propHooks.selected = { - get: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent && parent.parentNode ) { - parent.parentNode.selectedIndex; - } - return null; - }, - set: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent ) { - parent.selectedIndex; - - if ( parent.parentNode ) { - parent.parentNode.selectedIndex; - } - } - } - }; -} - -jQuery.each( [ - "tabIndex", - "readOnly", - "maxLength", - "cellSpacing", - "cellPadding", - "rowSpan", - "colSpan", - "useMap", - "frameBorder", - "contentEditable" -], function() { - jQuery.propFix[ this.toLowerCase() ] = this; -} ); - - - - - // Strip and collapse whitespace according to HTML spec - // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace - function stripAndCollapse( value ) { - var tokens = value.match( rnothtmlwhite ) || []; - return tokens.join( " " ); - } - - -function getClass( elem ) { - return elem.getAttribute && elem.getAttribute( "class" ) || ""; -} - -function classesToArray( value ) { - if ( Array.isArray( value ) ) { - return value; - } - if ( typeof value === "string" ) { - return value.match( rnothtmlwhite ) || []; - } - return []; -} - -jQuery.fn.extend( { - addClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - classes = classesToArray( value ); - - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - if ( cur.indexOf( " " + clazz + " " ) < 0 ) { - cur += clazz + " "; - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - removeClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - if ( !arguments.length ) { - return this.attr( "class", "" ); - } - - classes = classesToArray( value ); - - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - - // This expression is here for better compressibility (see addClass) - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - - // Remove *all* instances - while ( cur.indexOf( " " + clazz + " " ) > -1 ) { - cur = cur.replace( " " + clazz + " ", " " ); - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - toggleClass: function( value, stateVal ) { - var type = typeof value, - isValidValue = type === "string" || Array.isArray( value ); - - if ( typeof stateVal === "boolean" && isValidValue ) { - return stateVal ? this.addClass( value ) : this.removeClass( value ); - } - - if ( isFunction( value ) ) { - return this.each( function( i ) { - jQuery( this ).toggleClass( - value.call( this, i, getClass( this ), stateVal ), - stateVal - ); - } ); - } - - return this.each( function() { - var className, i, self, classNames; - - if ( isValidValue ) { - - // Toggle individual class names - i = 0; - self = jQuery( this ); - classNames = classesToArray( value ); - - while ( ( className = classNames[ i++ ] ) ) { - - // Check each className given, space separated list - if ( self.hasClass( className ) ) { - self.removeClass( className ); - } else { - self.addClass( className ); - } - } - - // Toggle whole class name - } else if ( value === undefined || type === "boolean" ) { - className = getClass( this ); - if ( className ) { - - // Store className if set - dataPriv.set( this, "__className__", className ); - } - - // If the element has a class name or if we're passed `false`, - // then remove the whole classname (if there was one, the above saved it). - // Otherwise bring back whatever was previously saved (if anything), - // falling back to the empty string if nothing was stored. - if ( this.setAttribute ) { - this.setAttribute( "class", - className || value === false ? - "" : - dataPriv.get( this, "__className__" ) || "" - ); - } - } - } ); - }, - - hasClass: function( selector ) { - var className, elem, - i = 0; - - className = " " + selector + " "; - while ( ( elem = this[ i++ ] ) ) { - if ( elem.nodeType === 1 && - ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { - return true; - } - } - - return false; - } -} ); - - - - -var rreturn = /\r/g; - -jQuery.fn.extend( { - val: function( value ) { - var hooks, ret, valueIsFunction, - elem = this[ 0 ]; - - if ( !arguments.length ) { - if ( elem ) { - hooks = jQuery.valHooks[ elem.type ] || - jQuery.valHooks[ elem.nodeName.toLowerCase() ]; - - if ( hooks && - "get" in hooks && - ( ret = hooks.get( elem, "value" ) ) !== undefined - ) { - return ret; - } - - ret = elem.value; - - // Handle most common string cases - if ( typeof ret === "string" ) { - return ret.replace( rreturn, "" ); - } - - // Handle cases where value is null/undef or number - return ret == null ? "" : ret; - } - - return; - } - - valueIsFunction = isFunction( value ); - - return this.each( function( i ) { - var val; - - if ( this.nodeType !== 1 ) { - return; - } - - if ( valueIsFunction ) { - val = value.call( this, i, jQuery( this ).val() ); - } else { - val = value; - } - - // Treat null/undefined as ""; convert numbers to string - if ( val == null ) { - val = ""; - - } else if ( typeof val === "number" ) { - val += ""; - - } else if ( Array.isArray( val ) ) { - val = jQuery.map( val, function( value ) { - return value == null ? "" : value + ""; - } ); - } - - hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; - - // If set returns undefined, fall back to normal setting - if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { - this.value = val; - } - } ); - } -} ); - -jQuery.extend( { - valHooks: { - option: { - get: function( elem ) { - - var val = jQuery.find.attr( elem, "value" ); - return val != null ? - val : - - // Support: IE <=10 - 11 only - // option.text throws exceptions (#14686, #14858) - // Strip and collapse whitespace - // https://html.spec.whatwg.org/#strip-and-collapse-whitespace - stripAndCollapse( jQuery.text( elem ) ); - } - }, - select: { - get: function( elem ) { - var value, option, i, - options = elem.options, - index = elem.selectedIndex, - one = elem.type === "select-one", - values = one ? null : [], - max = one ? index + 1 : options.length; - - if ( index < 0 ) { - i = max; - - } else { - i = one ? index : 0; - } - - // Loop through all the selected options - for ( ; i < max; i++ ) { - option = options[ i ]; - - // Support: IE <=9 only - // IE8-9 doesn't update selected after form reset (#2551) - if ( ( option.selected || i === index ) && - - // Don't return options that are disabled or in a disabled optgroup - !option.disabled && - ( !option.parentNode.disabled || - !nodeName( option.parentNode, "optgroup" ) ) ) { - - // Get the specific value for the option - value = jQuery( option ).val(); - - // We don't need an array for one selects - if ( one ) { - return value; - } - - // Multi-Selects return an array - values.push( value ); - } - } - - return values; - }, - - set: function( elem, value ) { - var optionSet, option, - options = elem.options, - values = jQuery.makeArray( value ), - i = options.length; - - while ( i-- ) { - option = options[ i ]; - - /* eslint-disable no-cond-assign */ - - if ( option.selected = - jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 - ) { - optionSet = true; - } - - /* eslint-enable no-cond-assign */ - } - - // Force browsers to behave consistently when non-matching value is set - if ( !optionSet ) { - elem.selectedIndex = -1; - } - return values; - } - } - } -} ); - -// Radios and checkboxes getter/setter -jQuery.each( [ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = { - set: function( elem, value ) { - if ( Array.isArray( value ) ) { - return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); - } - } - }; - if ( !support.checkOn ) { - jQuery.valHooks[ this ].get = function( elem ) { - return elem.getAttribute( "value" ) === null ? "on" : elem.value; - }; - } -} ); - - - - -// Return jQuery for attributes-only inclusion - - -support.focusin = "onfocusin" in window; - - -var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, - stopPropagationCallback = function( e ) { - e.stopPropagation(); - }; - -jQuery.extend( jQuery.event, { - - trigger: function( event, data, elem, onlyHandlers ) { - - var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, - eventPath = [ elem || document ], - type = hasOwn.call( event, "type" ) ? event.type : event, - namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; - - cur = lastElement = tmp = elem = elem || document; - - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } - - if ( type.indexOf( "." ) > -1 ) { - - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split( "." ); - type = namespaces.shift(); - namespaces.sort(); - } - ontype = type.indexOf( ":" ) < 0 && "on" + type; - - // Caller can pass in a jQuery.Event object, Object, or just an event type string - event = event[ jQuery.expando ] ? - event : - new jQuery.Event( type, typeof event === "object" && event ); - - // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) - event.isTrigger = onlyHandlers ? 2 : 3; - event.namespace = namespaces.join( "." ); - event.rnamespace = event.namespace ? - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : - null; - - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data == null ? - [ event ] : - jQuery.makeArray( data, [ event ] ); - - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { - - bubbleType = special.delegateType || type; - if ( !rfocusMorph.test( bubbleType + type ) ) { - cur = cur.parentNode; - } - for ( ; cur; cur = cur.parentNode ) { - eventPath.push( cur ); - tmp = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( tmp === ( elem.ownerDocument || document ) ) { - eventPath.push( tmp.defaultView || tmp.parentWindow || window ); - } - } - - // Fire handlers on the event path - i = 0; - while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { - lastElement = cur; - event.type = i > 1 ? - bubbleType : - special.bindType || type; - - // jQuery handler - handle = ( - dataPriv.get( cur, "events" ) || Object.create( null ) - )[ event.type ] && - dataPriv.get( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - - // Native handler - handle = ontype && cur[ ontype ]; - if ( handle && handle.apply && acceptData( cur ) ) { - event.result = handle.apply( cur, data ); - if ( event.result === false ) { - event.preventDefault(); - } - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( ( !special._default || - special._default.apply( eventPath.pop(), data ) === false ) && - acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name as the event. - // Don't do default actions on window, that's where global variables be (#6170) - if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - tmp = elem[ ontype ]; - - if ( tmp ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - - if ( event.isPropagationStopped() ) { - lastElement.addEventListener( type, stopPropagationCallback ); - } - - elem[ type ](); - - if ( event.isPropagationStopped() ) { - lastElement.removeEventListener( type, stopPropagationCallback ); - } - - jQuery.event.triggered = undefined; - - if ( tmp ) { - elem[ ontype ] = tmp; - } - } - } - } - - return event.result; - }, - - // Piggyback on a donor event to simulate a different one - // Used only for `focus(in | out)` events - simulate: function( type, elem, event ) { - var e = jQuery.extend( - new jQuery.Event(), - event, - { - type: type, - isSimulated: true - } - ); - - jQuery.event.trigger( e, null, elem ); - } - -} ); - -jQuery.fn.extend( { - - trigger: function( type, data ) { - return this.each( function() { - jQuery.event.trigger( type, data, this ); - } ); - }, - triggerHandler: function( type, data ) { - var elem = this[ 0 ]; - if ( elem ) { - return jQuery.event.trigger( type, data, elem, true ); - } - } -} ); - - -// Support: Firefox <=44 -// Firefox doesn't have focus(in | out) events -// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 -// -// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 -// focus(in | out) events fire after focus & blur events, -// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order -// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 -if ( !support.focusin ) { - jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler on the document while someone wants focusin/focusout - var handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); - }; - - jQuery.event.special[ fix ] = { - setup: function() { - - // Handle: regular nodes (via `this.ownerDocument`), window - // (via `this.document`) & document (via `this`). - var doc = this.ownerDocument || this.document || this, - attaches = dataPriv.access( doc, fix ); - - if ( !attaches ) { - doc.addEventListener( orig, handler, true ); - } - dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); - }, - teardown: function() { - var doc = this.ownerDocument || this.document || this, - attaches = dataPriv.access( doc, fix ) - 1; - - if ( !attaches ) { - doc.removeEventListener( orig, handler, true ); - dataPriv.remove( doc, fix ); - - } else { - dataPriv.access( doc, fix, attaches ); - } - } - }; - } ); -} -var location = window.location; - -var nonce = { guid: Date.now() }; - -var rquery = ( /\?/ ); - - - -// Cross-browser xml parsing -jQuery.parseXML = function( data ) { - var xml; - if ( !data || typeof data !== "string" ) { - return null; - } - - // Support: IE 9 - 11 only - // IE throws on parseFromString with invalid input. - try { - xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); - } catch ( e ) { - xml = undefined; - } - - if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { - jQuery.error( "Invalid XML: " + data ); - } - return xml; -}; - - -var - rbracket = /\[\]$/, - rCRLF = /\r?\n/g, - rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, - rsubmittable = /^(?:input|select|textarea|keygen)/i; - -function buildParams( prefix, obj, traditional, add ) { - var name; - - if ( Array.isArray( obj ) ) { - - // Serialize array item. - jQuery.each( obj, function( i, v ) { - if ( traditional || rbracket.test( prefix ) ) { - - // Treat each array item as a scalar. - add( prefix, v ); - - } else { - - // Item is non-scalar (array or object), encode its numeric index. - buildParams( - prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", - v, - traditional, - add - ); - } - } ); - - } else if ( !traditional && toType( obj ) === "object" ) { - - // Serialize object item. - for ( name in obj ) { - buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); - } - - } else { - - // Serialize scalar item. - add( prefix, obj ); - } -} - -// Serialize an array of form elements or a set of -// key/values into a query string -jQuery.param = function( a, traditional ) { - var prefix, - s = [], - add = function( key, valueOrFunction ) { - - // If value is a function, invoke it and use its return value - var value = isFunction( valueOrFunction ) ? - valueOrFunction() : - valueOrFunction; - - s[ s.length ] = encodeURIComponent( key ) + "=" + - encodeURIComponent( value == null ? "" : value ); - }; - - if ( a == null ) { - return ""; - } - - // If an array was passed in, assume that it is an array of form elements. - if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { - - // Serialize the form elements - jQuery.each( a, function() { - add( this.name, this.value ); - } ); - - } else { - - // If traditional, encode the "old" way (the way 1.3.2 or older - // did it), otherwise encode params recursively. - for ( prefix in a ) { - buildParams( prefix, a[ prefix ], traditional, add ); - } - } - - // Return the resulting serialization - return s.join( "&" ); -}; - -jQuery.fn.extend( { - serialize: function() { - return jQuery.param( this.serializeArray() ); - }, - serializeArray: function() { - return this.map( function() { - - // Can add propHook for "elements" to filter or add form elements - var elements = jQuery.prop( this, "elements" ); - return elements ? jQuery.makeArray( elements ) : this; - } ) - .filter( function() { - var type = this.type; - - // Use .is( ":disabled" ) so that fieldset[disabled] works - return this.name && !jQuery( this ).is( ":disabled" ) && - rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && - ( this.checked || !rcheckableType.test( type ) ); - } ) - .map( function( _i, elem ) { - var val = jQuery( this ).val(); - - if ( val == null ) { - return null; - } - - if ( Array.isArray( val ) ) { - return jQuery.map( val, function( val ) { - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ); - } - - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ).get(); - } -} ); - - -var - r20 = /%20/g, - rhash = /#.*$/, - rantiCache = /([?&])_=[^&]*/, - rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, - - // #7653, #8125, #8152: local protocol detection - rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, - rnoContent = /^(?:GET|HEAD)$/, - rprotocol = /^\/\//, - - /* Prefilters - * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) - * 2) These are called: - * - BEFORE asking for a transport - * - AFTER param serialization (s.data is a string if s.processData is true) - * 3) key is the dataType - * 4) the catchall symbol "*" can be used - * 5) execution will start with transport dataType and THEN continue down to "*" if needed - */ - prefilters = {}, - - /* Transports bindings - * 1) key is the dataType - * 2) the catchall symbol "*" can be used - * 3) selection will start with transport dataType and THEN go to "*" if needed - */ - transports = {}, - - // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression - allTypes = "*/".concat( "*" ), - - // Anchor tag for parsing the document origin - originAnchor = document.createElement( "a" ); - originAnchor.href = location.href; - -// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport -function addToPrefiltersOrTransports( structure ) { - - // dataTypeExpression is optional and defaults to "*" - return function( dataTypeExpression, func ) { - - if ( typeof dataTypeExpression !== "string" ) { - func = dataTypeExpression; - dataTypeExpression = "*"; - } - - var dataType, - i = 0, - dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; - - if ( isFunction( func ) ) { - - // For each dataType in the dataTypeExpression - while ( ( dataType = dataTypes[ i++ ] ) ) { - - // Prepend if requested - if ( dataType[ 0 ] === "+" ) { - dataType = dataType.slice( 1 ) || "*"; - ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); - - // Otherwise append - } else { - ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); - } - } - } - }; -} - -// Base inspection function for prefilters and transports -function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { - - var inspected = {}, - seekingTransport = ( structure === transports ); - - function inspect( dataType ) { - var selected; - inspected[ dataType ] = true; - jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { - var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); - if ( typeof dataTypeOrTransport === "string" && - !seekingTransport && !inspected[ dataTypeOrTransport ] ) { - - options.dataTypes.unshift( dataTypeOrTransport ); - inspect( dataTypeOrTransport ); - return false; - } else if ( seekingTransport ) { - return !( selected = dataTypeOrTransport ); - } - } ); - return selected; - } - - return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); -} - -// A special extend for ajax options -// that takes "flat" options (not to be deep extended) -// Fixes #9887 -function ajaxExtend( target, src ) { - var key, deep, - flatOptions = jQuery.ajaxSettings.flatOptions || {}; - - for ( key in src ) { - if ( src[ key ] !== undefined ) { - ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; - } - } - if ( deep ) { - jQuery.extend( true, target, deep ); - } - - return target; -} - -/* Handles responses to an ajax request: - * - finds the right dataType (mediates between content-type and expected dataType) - * - returns the corresponding response - */ -function ajaxHandleResponses( s, jqXHR, responses ) { - - var ct, type, finalDataType, firstDataType, - contents = s.contents, - dataTypes = s.dataTypes; - - // Remove auto dataType and get content-type in the process - while ( dataTypes[ 0 ] === "*" ) { - dataTypes.shift(); - if ( ct === undefined ) { - ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); - } - } - - // Check if we're dealing with a known content-type - if ( ct ) { - for ( type in contents ) { - if ( contents[ type ] && contents[ type ].test( ct ) ) { - dataTypes.unshift( type ); - break; - } - } - } - - // Check to see if we have a response for the expected dataType - if ( dataTypes[ 0 ] in responses ) { - finalDataType = dataTypes[ 0 ]; - } else { - - // Try convertible dataTypes - for ( type in responses ) { - if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { - finalDataType = type; - break; - } - if ( !firstDataType ) { - firstDataType = type; - } - } - - // Or just use first one - finalDataType = finalDataType || firstDataType; - } - - // If we found a dataType - // We add the dataType to the list if needed - // and return the corresponding response - if ( finalDataType ) { - if ( finalDataType !== dataTypes[ 0 ] ) { - dataTypes.unshift( finalDataType ); - } - return responses[ finalDataType ]; - } -} - -/* Chain conversions given the request and the original response - * Also sets the responseXXX fields on the jqXHR instance - */ -function ajaxConvert( s, response, jqXHR, isSuccess ) { - var conv2, current, conv, tmp, prev, - converters = {}, - - // Work with a copy of dataTypes in case we need to modify it for conversion - dataTypes = s.dataTypes.slice(); - - // Create converters map with lowercased keys - if ( dataTypes[ 1 ] ) { - for ( conv in s.converters ) { - converters[ conv.toLowerCase() ] = s.converters[ conv ]; - } - } - - current = dataTypes.shift(); - - // Convert to each sequential dataType - while ( current ) { - - if ( s.responseFields[ current ] ) { - jqXHR[ s.responseFields[ current ] ] = response; - } - - // Apply the dataFilter if provided - if ( !prev && isSuccess && s.dataFilter ) { - response = s.dataFilter( response, s.dataType ); - } - - prev = current; - current = dataTypes.shift(); - - if ( current ) { - - // There's only work to do if current dataType is non-auto - if ( current === "*" ) { - - current = prev; - - // Convert response if prev dataType is non-auto and differs from current - } else if ( prev !== "*" && prev !== current ) { - - // Seek a direct converter - conv = converters[ prev + " " + current ] || converters[ "* " + current ]; - - // If none found, seek a pair - if ( !conv ) { - for ( conv2 in converters ) { - - // If conv2 outputs current - tmp = conv2.split( " " ); - if ( tmp[ 1 ] === current ) { - - // If prev can be converted to accepted input - conv = converters[ prev + " " + tmp[ 0 ] ] || - converters[ "* " + tmp[ 0 ] ]; - if ( conv ) { - - // Condense equivalence converters - if ( conv === true ) { - conv = converters[ conv2 ]; - - // Otherwise, insert the intermediate dataType - } else if ( converters[ conv2 ] !== true ) { - current = tmp[ 0 ]; - dataTypes.unshift( tmp[ 1 ] ); - } - break; - } - } - } - } - - // Apply converter (if not an equivalence) - if ( conv !== true ) { - - // Unless errors are allowed to bubble, catch and return them - if ( conv && s.throws ) { - response = conv( response ); - } else { - try { - response = conv( response ); - } catch ( e ) { - return { - state: "parsererror", - error: conv ? e : "No conversion from " + prev + " to " + current - }; - } - } - } - } - } - } - - return { state: "success", data: response }; -} - -jQuery.extend( { - - // Counter for holding the number of active queries - active: 0, - - // Last-Modified header cache for next request - lastModified: {}, - etag: {}, - - ajaxSettings: { - url: location.href, - type: "GET", - isLocal: rlocalProtocol.test( location.protocol ), - global: true, - processData: true, - async: true, - contentType: "application/x-www-form-urlencoded; charset=UTF-8", - - /* - timeout: 0, - data: null, - dataType: null, - username: null, - password: null, - cache: null, - throws: false, - traditional: false, - headers: {}, - */ - - accepts: { - "*": allTypes, - text: "text/plain", - html: "text/html", - xml: "application/xml, text/xml", - json: "application/json, text/javascript" - }, - - contents: { - xml: /\bxml\b/, - html: /\bhtml/, - json: /\bjson\b/ - }, - - responseFields: { - xml: "responseXML", - text: "responseText", - json: "responseJSON" - }, - - // Data converters - // Keys separate source (or catchall "*") and destination types with a single space - converters: { - - // Convert anything to text - "* text": String, - - // Text to html (true = no transformation) - "text html": true, - - // Evaluate text as a json expression - "text json": JSON.parse, - - // Parse text as xml - "text xml": jQuery.parseXML - }, - - // For options that shouldn't be deep extended: - // you can add your own custom options here if - // and when you create one that shouldn't be - // deep extended (see ajaxExtend) - flatOptions: { - url: true, - context: true - } - }, - - // Creates a full fledged settings object into target - // with both ajaxSettings and settings fields. - // If target is omitted, writes into ajaxSettings. - ajaxSetup: function( target, settings ) { - return settings ? - - // Building a settings object - ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : - - // Extending ajaxSettings - ajaxExtend( jQuery.ajaxSettings, target ); - }, - - ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), - ajaxTransport: addToPrefiltersOrTransports( transports ), - - // Main method - ajax: function( url, options ) { - - // If url is an object, simulate pre-1.5 signature - if ( typeof url === "object" ) { - options = url; - url = undefined; - } - - // Force options to be an object - options = options || {}; - - var transport, - - // URL without anti-cache param - cacheURL, - - // Response headers - responseHeadersString, - responseHeaders, - - // timeout handle - timeoutTimer, - - // Url cleanup var - urlAnchor, - - // Request state (becomes false upon send and true upon completion) - completed, - - // To know if global events are to be dispatched - fireGlobals, - - // Loop variable - i, - - // uncached part of the url - uncached, - - // Create the final options object - s = jQuery.ajaxSetup( {}, options ), - - // Callbacks context - callbackContext = s.context || s, - - // Context for global events is callbackContext if it is a DOM node or jQuery collection - globalEventContext = s.context && - ( callbackContext.nodeType || callbackContext.jquery ) ? - jQuery( callbackContext ) : - jQuery.event, - - // Deferreds - deferred = jQuery.Deferred(), - completeDeferred = jQuery.Callbacks( "once memory" ), - - // Status-dependent callbacks - statusCode = s.statusCode || {}, - - // Headers (they are sent all at once) - requestHeaders = {}, - requestHeadersNames = {}, - - // Default abort message - strAbort = "canceled", - - // Fake xhr - jqXHR = { - readyState: 0, - - // Builds headers hashtable if needed - getResponseHeader: function( key ) { - var match; - if ( completed ) { - if ( !responseHeaders ) { - responseHeaders = {}; - while ( ( match = rheaders.exec( responseHeadersString ) ) ) { - responseHeaders[ match[ 1 ].toLowerCase() + " " ] = - ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) - .concat( match[ 2 ] ); - } - } - match = responseHeaders[ key.toLowerCase() + " " ]; - } - return match == null ? null : match.join( ", " ); - }, - - // Raw string - getAllResponseHeaders: function() { - return completed ? responseHeadersString : null; - }, - - // Caches the header - setRequestHeader: function( name, value ) { - if ( completed == null ) { - name = requestHeadersNames[ name.toLowerCase() ] = - requestHeadersNames[ name.toLowerCase() ] || name; - requestHeaders[ name ] = value; - } - return this; - }, - - // Overrides response content-type header - overrideMimeType: function( type ) { - if ( completed == null ) { - s.mimeType = type; - } - return this; - }, - - // Status-dependent callbacks - statusCode: function( map ) { - var code; - if ( map ) { - if ( completed ) { - - // Execute the appropriate callbacks - jqXHR.always( map[ jqXHR.status ] ); - } else { - - // Lazy-add the new callbacks in a way that preserves old ones - for ( code in map ) { - statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; - } - } - } - return this; - }, - - // Cancel the request - abort: function( statusText ) { - var finalText = statusText || strAbort; - if ( transport ) { - transport.abort( finalText ); - } - done( 0, finalText ); - return this; - } - }; - - // Attach deferreds - deferred.promise( jqXHR ); - - // Add protocol if not provided (prefilters might expect it) - // Handle falsy url in the settings object (#10093: consistency with old signature) - // We also use the url parameter if available - s.url = ( ( url || s.url || location.href ) + "" ) - .replace( rprotocol, location.protocol + "//" ); - - // Alias method option to type as per ticket #12004 - s.type = options.method || options.type || s.method || s.type; - - // Extract dataTypes list - s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; - - // A cross-domain request is in order when the origin doesn't match the current origin. - if ( s.crossDomain == null ) { - urlAnchor = document.createElement( "a" ); - - // Support: IE <=8 - 11, Edge 12 - 15 - // IE throws exception on accessing the href property if url is malformed, - // e.g. http://example.com:80x/ - try { - urlAnchor.href = s.url; - - // Support: IE <=8 - 11 only - // Anchor's host property isn't correctly set when s.url is relative - urlAnchor.href = urlAnchor.href; - s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== - urlAnchor.protocol + "//" + urlAnchor.host; - } catch ( e ) { - - // If there is an error parsing the URL, assume it is crossDomain, - // it can be rejected by the transport if it is invalid - s.crossDomain = true; - } - } - - // Convert data if not already a string - if ( s.data && s.processData && typeof s.data !== "string" ) { - s.data = jQuery.param( s.data, s.traditional ); - } - - // Apply prefilters - inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); - - // If request was aborted inside a prefilter, stop there - if ( completed ) { - return jqXHR; - } - - // We can fire global events as of now if asked to - // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) - fireGlobals = jQuery.event && s.global; - - // Watch for a new set of requests - if ( fireGlobals && jQuery.active++ === 0 ) { - jQuery.event.trigger( "ajaxStart" ); - } - - // Uppercase the type - s.type = s.type.toUpperCase(); - - // Determine if request has content - s.hasContent = !rnoContent.test( s.type ); - - // Save the URL in case we're toying with the If-Modified-Since - // and/or If-None-Match header later on - // Remove hash to simplify url manipulation - cacheURL = s.url.replace( rhash, "" ); - - // More options handling for requests with no content - if ( !s.hasContent ) { - - // Remember the hash so we can put it back - uncached = s.url.slice( cacheURL.length ); - - // If data is available and should be processed, append data to url - if ( s.data && ( s.processData || typeof s.data === "string" ) ) { - cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; - - // #9682: remove data so that it's not used in an eventual retry - delete s.data; - } - - // Add or update anti-cache param if needed - if ( s.cache === false ) { - cacheURL = cacheURL.replace( rantiCache, "$1" ); - uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) + - uncached; - } - - // Put hash and anti-cache on the URL that will be requested (gh-1732) - s.url = cacheURL + uncached; - - // Change '%20' to '+' if this is encoded form body content (gh-2658) - } else if ( s.data && s.processData && - ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { - s.data = s.data.replace( r20, "+" ); - } - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - if ( jQuery.lastModified[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); - } - if ( jQuery.etag[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); - } - } - - // Set the correct header, if data is being sent - if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { - jqXHR.setRequestHeader( "Content-Type", s.contentType ); - } - - // Set the Accepts header for the server, depending on the dataType - jqXHR.setRequestHeader( - "Accept", - s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? - s.accepts[ s.dataTypes[ 0 ] ] + - ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : - s.accepts[ "*" ] - ); - - // Check for headers option - for ( i in s.headers ) { - jqXHR.setRequestHeader( i, s.headers[ i ] ); - } - - // Allow custom headers/mimetypes and early abort - if ( s.beforeSend && - ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { - - // Abort if not done already and return - return jqXHR.abort(); - } - - // Aborting is no longer a cancellation - strAbort = "abort"; - - // Install callbacks on deferreds - completeDeferred.add( s.complete ); - jqXHR.done( s.success ); - jqXHR.fail( s.error ); - - // Get transport - transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); - - // If no transport, we auto-abort - if ( !transport ) { - done( -1, "No Transport" ); - } else { - jqXHR.readyState = 1; - - // Send global event - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); - } - - // If request was aborted inside ajaxSend, stop there - if ( completed ) { - return jqXHR; - } - - // Timeout - if ( s.async && s.timeout > 0 ) { - timeoutTimer = window.setTimeout( function() { - jqXHR.abort( "timeout" ); - }, s.timeout ); - } - - try { - completed = false; - transport.send( requestHeaders, done ); - } catch ( e ) { - - // Rethrow post-completion exceptions - if ( completed ) { - throw e; - } - - // Propagate others as results - done( -1, e ); - } - } - - // Callback for when everything is done - function done( status, nativeStatusText, responses, headers ) { - var isSuccess, success, error, response, modified, - statusText = nativeStatusText; - - // Ignore repeat invocations - if ( completed ) { - return; - } - - completed = true; - - // Clear timeout if it exists - if ( timeoutTimer ) { - window.clearTimeout( timeoutTimer ); - } - - // Dereference transport for early garbage collection - // (no matter how long the jqXHR object will be used) - transport = undefined; - - // Cache response headers - responseHeadersString = headers || ""; - - // Set readyState - jqXHR.readyState = status > 0 ? 4 : 0; - - // Determine if successful - isSuccess = status >= 200 && status < 300 || status === 304; - - // Get response data - if ( responses ) { - response = ajaxHandleResponses( s, jqXHR, responses ); - } - - // Use a noop converter for missing script - if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) { - s.converters[ "text script" ] = function() {}; - } - - // Convert no matter what (that way responseXXX fields are always set) - response = ajaxConvert( s, response, jqXHR, isSuccess ); - - // If successful, handle type chaining - if ( isSuccess ) { - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - modified = jqXHR.getResponseHeader( "Last-Modified" ); - if ( modified ) { - jQuery.lastModified[ cacheURL ] = modified; - } - modified = jqXHR.getResponseHeader( "etag" ); - if ( modified ) { - jQuery.etag[ cacheURL ] = modified; - } - } - - // if no content - if ( status === 204 || s.type === "HEAD" ) { - statusText = "nocontent"; - - // if not modified - } else if ( status === 304 ) { - statusText = "notmodified"; - - // If we have data, let's convert it - } else { - statusText = response.state; - success = response.data; - error = response.error; - isSuccess = !error; - } - } else { - - // Extract error from statusText and normalize for non-aborts - error = statusText; - if ( status || !statusText ) { - statusText = "error"; - if ( status < 0 ) { - status = 0; - } - } - } - - // Set data for the fake xhr object - jqXHR.status = status; - jqXHR.statusText = ( nativeStatusText || statusText ) + ""; - - // Success/Error - if ( isSuccess ) { - deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); - } else { - deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); - } - - // Status-dependent callbacks - jqXHR.statusCode( statusCode ); - statusCode = undefined; - - if ( fireGlobals ) { - globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", - [ jqXHR, s, isSuccess ? success : error ] ); - } - - // Complete - completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); - - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); - - // Handle the global AJAX counter - if ( !( --jQuery.active ) ) { - jQuery.event.trigger( "ajaxStop" ); - } - } - } - - return jqXHR; - }, - - getJSON: function( url, data, callback ) { - return jQuery.get( url, data, callback, "json" ); - }, - - getScript: function( url, callback ) { - return jQuery.get( url, undefined, callback, "script" ); - } -} ); - -jQuery.each( [ "get", "post" ], function( _i, method ) { - jQuery[ method ] = function( url, data, callback, type ) { - - // Shift arguments if data argument was omitted - if ( isFunction( data ) ) { - type = type || callback; - callback = data; - data = undefined; - } - - // The url can be an options object (which then must have .url) - return jQuery.ajax( jQuery.extend( { - url: url, - type: method, - dataType: type, - data: data, - success: callback - }, jQuery.isPlainObject( url ) && url ) ); - }; -} ); - -jQuery.ajaxPrefilter( function( s ) { - var i; - for ( i in s.headers ) { - if ( i.toLowerCase() === "content-type" ) { - s.contentType = s.headers[ i ] || ""; - } - } -} ); - - -jQuery._evalUrl = function( url, options, doc ) { - return jQuery.ajax( { - url: url, - - // Make this explicit, since user can override this through ajaxSetup (#11264) - type: "GET", - dataType: "script", - cache: true, - async: false, - global: false, - - // Only evaluate the response if it is successful (gh-4126) - // dataFilter is not invoked for failure responses, so using it instead - // of the default converter is kludgy but it works. - converters: { - "text script": function() {} - }, - dataFilter: function( response ) { - jQuery.globalEval( response, options, doc ); - } - } ); -}; - - -jQuery.fn.extend( { - wrapAll: function( html ) { - var wrap; - - if ( this[ 0 ] ) { - if ( isFunction( html ) ) { - html = html.call( this[ 0 ] ); - } - - // The elements to wrap the target around - wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); - - if ( this[ 0 ].parentNode ) { - wrap.insertBefore( this[ 0 ] ); - } - - wrap.map( function() { - var elem = this; - - while ( elem.firstElementChild ) { - elem = elem.firstElementChild; - } - - return elem; - } ).append( this ); - } - - return this; - }, - - wrapInner: function( html ) { - if ( isFunction( html ) ) { - return this.each( function( i ) { - jQuery( this ).wrapInner( html.call( this, i ) ); - } ); - } - - return this.each( function() { - var self = jQuery( this ), - contents = self.contents(); - - if ( contents.length ) { - contents.wrapAll( html ); - - } else { - self.append( html ); - } - } ); - }, - - wrap: function( html ) { - var htmlIsFunction = isFunction( html ); - - return this.each( function( i ) { - jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); - } ); - }, - - unwrap: function( selector ) { - this.parent( selector ).not( "body" ).each( function() { - jQuery( this ).replaceWith( this.childNodes ); - } ); - return this; - } -} ); - - -jQuery.expr.pseudos.hidden = function( elem ) { - return !jQuery.expr.pseudos.visible( elem ); -}; -jQuery.expr.pseudos.visible = function( elem ) { - return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); -}; - - - - -jQuery.ajaxSettings.xhr = function() { - try { - return new window.XMLHttpRequest(); - } catch ( e ) {} -}; - -var xhrSuccessStatus = { - - // File protocol always yields status code 0, assume 200 - 0: 200, - - // Support: IE <=9 only - // #1450: sometimes IE returns 1223 when it should be 204 - 1223: 204 - }, - xhrSupported = jQuery.ajaxSettings.xhr(); - -support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); -support.ajax = xhrSupported = !!xhrSupported; - -jQuery.ajaxTransport( function( options ) { - var callback, errorCallback; - - // Cross domain only allowed if supported through XMLHttpRequest - if ( support.cors || xhrSupported && !options.crossDomain ) { - return { - send: function( headers, complete ) { - var i, - xhr = options.xhr(); - - xhr.open( - options.type, - options.url, - options.async, - options.username, - options.password - ); - - // Apply custom fields if provided - if ( options.xhrFields ) { - for ( i in options.xhrFields ) { - xhr[ i ] = options.xhrFields[ i ]; - } - } - - // Override mime type if needed - if ( options.mimeType && xhr.overrideMimeType ) { - xhr.overrideMimeType( options.mimeType ); - } - - // X-Requested-With header - // For cross-domain requests, seeing as conditions for a preflight are - // akin to a jigsaw puzzle, we simply never set it to be sure. - // (it can always be set on a per-request basis or even using ajaxSetup) - // For same-domain requests, won't change header if already provided. - if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { - headers[ "X-Requested-With" ] = "XMLHttpRequest"; - } - - // Set headers - for ( i in headers ) { - xhr.setRequestHeader( i, headers[ i ] ); - } - - // Callback - callback = function( type ) { - return function() { - if ( callback ) { - callback = errorCallback = xhr.onload = - xhr.onerror = xhr.onabort = xhr.ontimeout = - xhr.onreadystatechange = null; - - if ( type === "abort" ) { - xhr.abort(); - } else if ( type === "error" ) { - - // Support: IE <=9 only - // On a manual native abort, IE9 throws - // errors on any property access that is not readyState - if ( typeof xhr.status !== "number" ) { - complete( 0, "error" ); - } else { - complete( - - // File: protocol always yields status 0; see #8605, #14207 - xhr.status, - xhr.statusText - ); - } - } else { - complete( - xhrSuccessStatus[ xhr.status ] || xhr.status, - xhr.statusText, - - // Support: IE <=9 only - // IE9 has no XHR2 but throws on binary (trac-11426) - // For XHR2 non-text, let the caller handle it (gh-2498) - ( xhr.responseType || "text" ) !== "text" || - typeof xhr.responseText !== "string" ? - { binary: xhr.response } : - { text: xhr.responseText }, - xhr.getAllResponseHeaders() - ); - } - } - }; - }; - - // Listen to events - xhr.onload = callback(); - errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); - - // Support: IE 9 only - // Use onreadystatechange to replace onabort - // to handle uncaught aborts - if ( xhr.onabort !== undefined ) { - xhr.onabort = errorCallback; - } else { - xhr.onreadystatechange = function() { - - // Check readyState before timeout as it changes - if ( xhr.readyState === 4 ) { - - // Allow onerror to be called first, - // but that will not handle a native abort - // Also, save errorCallback to a variable - // as xhr.onerror cannot be accessed - window.setTimeout( function() { - if ( callback ) { - errorCallback(); - } - } ); - } - }; - } - - // Create the abort callback - callback = callback( "abort" ); - - try { - - // Do send the request (this may raise an exception) - xhr.send( options.hasContent && options.data || null ); - } catch ( e ) { - - // #14683: Only rethrow if this hasn't been notified as an error yet - if ( callback ) { - throw e; - } - } - }, - - abort: function() { - if ( callback ) { - callback(); - } - } - }; - } -} ); - - - - -// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) -jQuery.ajaxPrefilter( function( s ) { - if ( s.crossDomain ) { - s.contents.script = false; - } -} ); - -// Install script dataType -jQuery.ajaxSetup( { - accepts: { - script: "text/javascript, application/javascript, " + - "application/ecmascript, application/x-ecmascript" - }, - contents: { - script: /\b(?:java|ecma)script\b/ - }, - converters: { - "text script": function( text ) { - jQuery.globalEval( text ); - return text; - } - } -} ); - -// Handle cache's special case and crossDomain -jQuery.ajaxPrefilter( "script", function( s ) { - if ( s.cache === undefined ) { - s.cache = false; - } - if ( s.crossDomain ) { - s.type = "GET"; - } -} ); - -// Bind script tag hack transport -jQuery.ajaxTransport( "script", function( s ) { - - // This transport only deals with cross domain or forced-by-attrs requests - if ( s.crossDomain || s.scriptAttrs ) { - var script, callback; - return { - send: function( _, complete ) { - script = jQuery( " - - - - - - - - - - - - - - - - - - -
- - -
- -
-
-
- -
-
-
-
- - -

Index

- -
- E - -
-

E

- - - -
- - - -
-
- -
-
-
-
- - - - - \ No newline at end of file diff --git a/esp_websocket_client/index.html b/esp_websocket_client/index.html deleted file mode 100644 index f76f86243..000000000 --- a/esp_websocket_client/index.html +++ /dev/null @@ -1,1070 +0,0 @@ - - - - - - - ESP WebSocket Client - ESP32 - — ESP-Protocols latest documentation - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
- -
-
-
- -
-
-
-
- -
-

ESP WebSocket Client

-
-

Overview

-

The ESP WebSocket client is an implementation of WebSocket protocol client for ESP32

-
-
-

Features

-
-
    -
  • Supports WebSocket over TCP, TLS with mbedtls

  • -
  • Easy to setup with URI

  • -
  • Multiple instances (Multiple clients in one application)

  • -
-
-
-
-

Configuration

-
-

URI

-
    -
  • Supports ws, wss schemes

  • -
  • WebSocket samples:

    -
      -
    • ws://echo.websocket.org: WebSocket over TCP, default port 80

    • -
    • wss://echo.websocket.org: WebSocket over SSL, default port 443

    • -
    -
  • -
-

Minimal configurations:

-
const esp_websocket_client_config_t ws_cfg = {
-    .uri = "ws://echo.websocket.org",
-};
-
-
-

The WebSocket client supports the use of both path and query in the URI. Sample:

-
const esp_websocket_client_config_t ws_cfg = {
-    .uri = "ws://echo.websocket.org/connectionhandler?id=104",
-};
-
-
-

If there are any options related to the URI in -esp_websocket_client_config_t, the option defined by the URI will be -overridden. Sample:

-
const esp_websocket_client_config_t ws_cfg = {
-    .uri = "ws://echo.websocket.org:123",
-    .port = 4567,
-};
-//WebSocket client will connect to websocket.org using port 4567
-
-
-
-
-

TLS

-

Configuration:

-
const esp_websocket_client_config_t ws_cfg = {
-    .uri = "wss://echo.websocket.org",
-    .cert_pem = (const char *)websocket_org_pem_start,
-};
-
-
-
-

Note

-

If you want to verify the server, then you need to provide a certificate in PEM format, and provide to cert_pem in websocket_client_config_t. If no certficate is provided then the TLS connection will default to not requiring verification.

-
-

PEM certificate for this example could be extracted from an openssl s_client command connecting to websocket.org. -In case a host operating system has openssl and sed packages installed, one could execute the following command to download and save the root or intermediate root certificate to a file (Note for Windows users: Both Linux like environment or Windows native packages may be used). -` -echo "" | openssl s_client -showcerts -connect websocket.org:443 | sed -n "1,/Root/d; /BEGIN/,/END/p" | openssl x509 -outform PEM >websocket_org.pem -`

-

This command will extract the second certificate in the chain and save it as a pem-file.

-
-
-

Subprotocol

-

The subprotocol field in the config struct can be used to request a subprotocol

-
const esp_websocket_client_config_t ws_cfg = {
-    .uri = "ws://websocket.org",
-    .subprotocol = "soap",
-};
-
-
-
-

Note

-

The client is indifferent to the subprotocol field in the server response and will accept the connection no matter what the server replies.

-
-

For more options on esp_websocket_client_config_t, please refer to API reference below

-
-
-
-

Events

-
    -
  • WEBSOCKET_EVENT_CONNECTED: The client has successfully established a connection to the server. The client is now ready to send and receive data. Contains no event data.

  • -
  • WEBSOCKET_EVENT_DISCONNECTED: The client has aborted the connection due to the transport layer failing to read data, e.g. because the server is unavailable. Contains no event data.

  • -
  • WEBSOCKET_EVENT_DATA: The client has successfully received and parsed a WebSocket frame. The event data contains a pointer to the payload data, the length of the payload data as well as the opcode of the received frame. A message may be fragmented into multiple events if the length exceeds the buffer size. This event will also be posted for non-payload frames, e.g. pong or connection close frames.

  • -
  • WEBSOCKET_EVENT_ERROR: Not used in the current implementation of the client.

  • -
-

If the client handle is needed in the event handler it can be accessed through the pointer passed to the event handler:

-
esp_websocket_client_handle_t client = (esp_websocket_client_handle_t)handler_args;
-
-
-
-
-

Limitations and Known Issues

-
    -
  • The client is able to request the use of a subprotocol from the server during the handshake, but does not do any subprotocol related checks on the response from the server.

  • -
-
-
-

Application Example

-

A simple WebSocket example that uses esp_websocket_client to establish a websocket connection and send/receive data with the websocket.org server can be found here: example .

-
-

Sending Text Data

-

The WebSocket client supports sending data as a text data frame, which informs the application layer that the payload data is text data encoded as UTF-8. Example:

-
esp_websocket_client_send_text(client, data, len, portMAX_DELAY);
-
-
-
-
-
-

API Reference

-
-

Header File

- -
-
-

Functions

-
-
-esp_websocket_client_handle_t esp_websocket_client_init(const esp_websocket_client_config_t *config)
-

Start a Websocket session This function must be the first function to call, and it returns a esp_websocket_client_handle_t that you must use as input to other functions in the interface. This call MUST have a corresponding call to esp_websocket_client_destroy when the operation is complete.

-
-
Parameters
-

config[in] The configuration

-
-
Returns
-

    -
  • esp_websocket_client_handle_t

  • -
  • NULL if any errors

  • -
-

-
-
-
- -
-
-esp_err_t esp_websocket_client_set_uri(esp_websocket_client_handle_t client, const char *uri)
-

Set URL for client, when performing this behavior, the options in the URL will replace the old ones Must stop the WebSocket client before set URI if the client has been connected.

-
-
Parameters
-
    -
  • client[in] The client

  • -
  • uri[in] The uri

  • -
-
-
Returns
-

esp_err_t

-
-
-
- -
-
-esp_err_t esp_websocket_client_set_headers(esp_websocket_client_handle_t client, const char *headers)
-

Set additional websocket headers for the client, when performing this behavior, the headers will replace the old ones.

-
-
Parameters
-
    -
  • client[in] The client

  • -
  • headers – additional header strings each terminated with \r

  • -
-
-
Pre
-

Must stop the WebSocket client before set headers if the client has been connected

-
-
Returns
-

esp_err_t

-
-
-
- -
-
-esp_err_t esp_websocket_client_start(esp_websocket_client_handle_t client)
-

Open the WebSocket connection.

-
-
Parameters
-

client[in] The client

-
-
Returns
-

esp_err_t

-
-
-
- -
-
-esp_err_t esp_websocket_client_stop(esp_websocket_client_handle_t client)
-

Stops the WebSocket connection without websocket closing handshake.

-

This API stops ws client and closes TCP connection directly without sending close frames. It is a good practice to close the connection in a clean way using esp_websocket_client_close().

-

Notes:

    -
  • Cannot be called from the websocket event handler

  • -
-

-
-
Parameters
-

client[in] The client

-
-
Returns
-

esp_err_t

-
-
-
- -
-
-esp_err_t esp_websocket_client_destroy(esp_websocket_client_handle_t client)
-

Destroy the WebSocket connection and free all resources. This function must be the last function to call for an session. It is the opposite of the esp_websocket_client_init function and must be called with the same handle as input that a esp_websocket_client_init call returned. This might close all connections this handle has used.

-

Notes:

    -
  • Cannot be called from the websocket event handler

  • -
-

-
-
Parameters
-

client[in] The client

-
-
Returns
-

esp_err_t

-
-
-
- -
-
-esp_err_t esp_websocket_client_destroy_on_exit(esp_websocket_client_handle_t client)
-

If this API called, WebSocket client will destroy and free all resources at the end of event loop.

-

Notes:

    -
  • After event loop finished, client handle would be dangling and should never be used

  • -
-

-
-
Parameters
-

client[in] The client

-
-
Returns
-

esp_err_t

-
-
-
- -
-
-int esp_websocket_client_send_bin(esp_websocket_client_handle_t client, const char *data, int len, TickType_t timeout)
-

Write binary data to the WebSocket connection (data send with WS OPCODE=02, i.e. binary)

-
-
Parameters
-
    -
  • client[in] The client

  • -
  • data[in] The data

  • -
  • len[in] The length

  • -
  • timeout[in] Write data timeout in RTOS ticks

  • -
-
-
Returns
-

    -
  • Number of data was sent

  • -
  • (-1) if any errors

  • -
-

-
-
-
- -
-
-int esp_websocket_client_send_text(esp_websocket_client_handle_t client, const char *data, int len, TickType_t timeout)
-

Write textual data to the WebSocket connection (data send with WS OPCODE=01, i.e. text)

-
-
Parameters
-
    -
  • client[in] The client

  • -
  • data[in] The data

  • -
  • len[in] The length

  • -
  • timeout[in] Write data timeout in RTOS ticks

  • -
-
-
Returns
-

    -
  • Number of data was sent

  • -
  • (-1) if any errors

  • -
-

-
-
-
- -
-
-int esp_websocket_client_send_with_opcode(esp_websocket_client_handle_t client, ws_transport_opcodes_t opcode, const uint8_t *data, int len, TickType_t timeout)
-

Write opcode data to the WebSocket connection.

-
-
Parameters
-
    -
  • client[in] The client

  • -
  • opcode[in] The opcode

  • -
  • data[in] The data

  • -
  • len[in] The length

  • -
  • timeout[in] Write data timeout in RTOS ticks

  • -
-
-
Returns
-

    -
  • Number of data was sent

  • -
  • (-1) if any errors

  • -
-

-
-
-
- -
-
-esp_err_t esp_websocket_client_close(esp_websocket_client_handle_t client, TickType_t timeout)
-

Close the WebSocket connection in a clean way.

-

Sequence of clean close initiated by client:

    -
  • Client sends CLOSE frame

  • -
  • Client waits until server echos the CLOSE frame

  • -
  • Client waits until server closes the connection

  • -
  • Client is stopped the same way as by the esp_websocket_client_stop()

    -

    Notes:

      -
    • Cannot be called from the websocket event handler

    • -
    -

    -
  • -
-

-
-
Parameters
-
    -
  • client[in] The client

  • -
  • timeout[in] Timeout in RTOS ticks for waiting

  • -
-
-
Returns
-

esp_err_t

-
-
-
- -
-
-esp_err_t esp_websocket_client_close_with_code(esp_websocket_client_handle_t client, int code, const char *data, int len, TickType_t timeout)
-

Close the WebSocket connection in a clean way with custom code/data Closing sequence is the same as for esp_websocket_client_close()

-

Notes:

    -
  • Cannot be called from the websocket event handler

  • -
-

-
-
Parameters
-
    -
  • client[in] The client

  • -
  • code[in] Close status code as defined in RFC6455 section-7.4

  • -
  • data[in] Additional data to closing message

  • -
  • len[in] The length of the additional data

  • -
  • timeout[in] Timeout in RTOS ticks for waiting

  • -
-
-
Returns
-

esp_err_t

-
-
-
- -
-
-bool esp_websocket_client_is_connected(esp_websocket_client_handle_t client)
-

Check the WebSocket client connection state.

-
-
Parameters
-

client[in] The client handle

-
-
Returns
-

    -
  • true

  • -
  • false

  • -
-

-
-
-
- -
-
-size_t esp_websocket_client_get_ping_interval_sec(esp_websocket_client_handle_t client)
-

Get the ping interval sec for client.

-
-
Parameters
-

client[in] The client

-
-
Returns
-

The ping interval in sec

-
-
-
- -
-
-esp_err_t esp_websocket_client_set_ping_interval_sec(esp_websocket_client_handle_t client, size_t ping_interval_sec)
-

Set new ping interval sec for client.

-
-
Parameters
-
    -
  • client[in] The client

  • -
  • ping_interval_sec[in] The new interval

  • -
-
-
Returns
-

esp_err_t

-
-
-
- -
-
-esp_err_t esp_websocket_register_events(esp_websocket_client_handle_t client, esp_websocket_event_id_t event, esp_event_handler_t event_handler, void *event_handler_arg)
-

Register the Websocket Events.

-
-
Parameters
-
    -
  • client – The client handle

  • -
  • event – The event id

  • -
  • event_handler – The callback function

  • -
  • event_handler_arg – User context

  • -
-
-
Returns
-

esp_err_t

-
-
-
- -
-
-

Structures

-
-
-struct esp_websocket_error_codes_t
-

Websocket error code structure to be passed as a contextual information into ERROR event.

-
-

Public Members

-
-
-esp_err_t esp_tls_last_esp_err
-

last esp_err code reported from esp-tls component

-
- -
-
-int esp_tls_stack_err
-

tls specific error code reported from underlying tls stack

-
- -
-
-int esp_tls_cert_verify_flags
-

tls flags reported from underlying tls stack during certificate verification

-
- -
-
-int esp_ws_handshake_status_code
-

http status code of the websocket upgrade handshake

-
- -
-
-int esp_transport_sock_errno
-

errno from the underlying socket

-
- -
-
- -
-
-struct esp_websocket_event_data_t
-

Websocket event data.

-
-

Public Members

-
-
-const char *data_ptr
-

Data pointer

-
- -
-
-int data_len
-

Data length

-
- -
-
-bool fin
-

Fin flag

-
- -
-
-uint8_t op_code
-

Received opcode

-
- -
-
-esp_websocket_client_handle_t client
-

esp_websocket_client_handle_t context

-
- -
-
-void *user_context
-

user_data context, from esp_websocket_client_config_t user_data

-
- -
-
-int payload_len
-

Total payload length, payloads exceeding buffer will be posted through multiple events

-
- -
-
-int payload_offset
-

Actual offset for the data associated with this event

-
- -
-
-esp_websocket_error_codes_t error_handle
-

esp-websocket error handle including esp-tls errors as well as internal websocket errors

-
- -
-
- -
-
-struct esp_websocket_client_config_t
-

Websocket client setup configuration.

-
-

Public Members

-
-
-const char *uri
-

Websocket URI, the information on the URI can be overrides the other fields below, if any

-
- -
-
-const char *host
-

Domain or IP as string

-
- -
-
-int port
-

Port to connect, default depend on esp_websocket_transport_t (80 or 443)

-
- -
-
-const char *username
-

Using for Http authentication, only support basic auth now

-
- -
-
-const char *password
-

Using for Http authentication

-
- -
-
-const char *path
-

HTTP Path, if not set, default is /

-
- -
-
-bool disable_auto_reconnect
-

Disable the automatic reconnect function when disconnected

-
- -
-
-void *user_context
-

HTTP user data context

-
- -
-
-int task_prio
-

Websocket task priority

-
- -
-
-const char *task_name
-

Websocket task name

-
- -
-
-int task_stack
-

Websocket task stack

-
- -
-
-int buffer_size
-

Websocket buffer size

-
- -
-
-const char *cert_pem
-

Pointer to certificate data in PEM or DER format for server verify (with SSL), default is NULL, not required to verify the server. PEM-format must have a terminating NULL-character. DER-format requires the length to be passed in cert_len.

-
- -
-
-size_t cert_len
-

Length of the buffer pointed to by cert_pem. May be 0 for null-terminated pem

-
- -
-
-const char *client_cert
-

Pointer to certificate data in PEM or DER format for SSL mutual authentication, default is NULL, not required if mutual authentication is not needed. If it is not NULL, also client_key has to be provided. PEM-format must have a terminating NULL-character. DER-format requires the length to be passed in client_cert_len.

-
- -
-
-size_t client_cert_len
-

Length of the buffer pointed to by client_cert. May be 0 for null-terminated pem

-
- -
-
-const char *client_key
-

Pointer to private key data in PEM or DER format for SSL mutual authentication, default is NULL, not required if mutual authentication is not needed. If it is not NULL, also client_cert has to be provided. PEM-format must have a terminating NULL-character. DER-format requires the length to be passed in client_key_len

-
- -
-
-size_t client_key_len
-

Length of the buffer pointed to by client_key_pem. May be 0 for null-terminated pem

-
- -
-
-esp_websocket_transport_t transport
-

Websocket transport type, see `esp_websocket_transport_t

-
- -
-
-const char *subprotocol
-

Websocket subprotocol

-
- -
-
-const char *user_agent
-

Websocket user-agent

-
- -
-
-const char *headers
-

Websocket additional headers

-
- -
-
-int pingpong_timeout_sec
-

Period before connection is aborted due to no PONGs received

-
- -
-
-bool disable_pingpong_discon
-

Disable auto-disconnect due to no PONG received within pingpong_timeout_sec

-
- -
-
-bool use_global_ca_store
-

Use a global ca_store for all the connections in which this bool is set.

-
- -
-
-esp_err_t (*crt_bundle_attach)(void *conf)
-

Function pointer to esp_crt_bundle_attach. Enables the use of certification bundle for server verification, MBEDTLS_CERTIFICATE_BUNDLE must be enabled in menuconfig. Include esp_crt_bundle.h, and use esp_crt_bundle_attach here to include bundled CA certificates.

-
- -
-
-bool skip_cert_common_name_check
-

Skip any validation of server certificate CN field

-
- -
-
-bool keep_alive_enable
-

Enable keep-alive timeout

-
- -
-
-int keep_alive_idle
-

Keep-alive idle time. Default is 5 (second)

-
- -
-
-int keep_alive_interval
-

Keep-alive interval time. Default is 5 (second)

-
- -
-
-int keep_alive_count
-

Keep-alive packet retry send count. Default is 3 counts

-
- -
-
-int reconnect_timeout_ms
-

Reconnect after this value in miliseconds if disable_auto_reconnect is not enabled (defaults to 10s)

-
- -
-
-int network_timeout_ms
-

Abort network operation if it is not completed after this value, in milliseconds (defaults to 10s)

-
- -
-
-size_t ping_interval_sec
-

Websocket ping interval, defaults to 10 seconds if not set

-
- -
-
-struct ifreq *if_name
-

The name of interface for data to go through. Use the default interface without setting

-
- -
-
- -
-
-

Type Definitions

-
-
-typedef struct esp_websocket_client *esp_websocket_client_handle_t
-
- -
-
-

Enumerations

-
-
-enum esp_websocket_event_id_t
-

Websocket Client events id.

-

Values:

-
-
-enumerator WEBSOCKET_EVENT_ANY
-
- -
-
-enumerator WEBSOCKET_EVENT_ERROR
-

This event occurs when there are any errors during execution

-
- -
-
-enumerator WEBSOCKET_EVENT_CONNECTED
-

Once the Websocket has been connected to the server, no data exchange has been performed

-
- -
-
-enumerator WEBSOCKET_EVENT_DISCONNECTED
-

The connection has been disconnected

-
- -
-
-enumerator WEBSOCKET_EVENT_DATA
-

When receiving data from the server, possibly multiple portions of the packet

-
- -
-
-enumerator WEBSOCKET_EVENT_CLOSED
-

The connection has been closed cleanly

-
- -
-
-enumerator WEBSOCKET_EVENT_BEFORE_CONNECT
-

The event occurs before connecting

-
- -
-
-enumerator WEBSOCKET_EVENT_MAX
-
- -
- -
-
-enum esp_websocket_error_type_t
-

Websocket connection error codes propagated via ERROR event.

-

Values:

-
-
-enumerator WEBSOCKET_ERROR_TYPE_NONE
-
- -
-
-enumerator WEBSOCKET_ERROR_TYPE_TCP_TRANSPORT
-
- -
-
-enumerator WEBSOCKET_ERROR_TYPE_PONG_TIMEOUT
-
- -
-
-enumerator WEBSOCKET_ERROR_TYPE_HANDSHAKE
-
- -
- -
-
-enum esp_websocket_transport_t
-

Websocket Client transport.

-

Values:

-
-
-enumerator WEBSOCKET_TRANSPORT_UNKNOWN
-

Transport unknown

-
- -
-
-enumerator WEBSOCKET_TRANSPORT_OVER_TCP
-

Transport over tcp

-
- -
-
-enumerator WEBSOCKET_TRANSPORT_OVER_SSL
-

Transport over ssl

-
- -
- -
-
-
- - -
-
- -
-
-
-
- - - - - diff --git a/esp_websocket_client/objects.inv b/esp_websocket_client/objects.inv deleted file mode 100644 index d681213a2..000000000 Binary files a/esp_websocket_client/objects.inv and /dev/null differ diff --git a/esp_websocket_client/search.html b/esp_websocket_client/search.html deleted file mode 100644 index 2d41b3b5e..000000000 --- a/esp_websocket_client/search.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - Search - ESP32 - — ESP-Protocols latest documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
- -
-
-
-
    -
  • »
  • -
  • Search
  • -
  • -
  • -
-
-
-
-
- - - - -
- -
- -
-
- -
-
-
-
- - - - - - - - - - \ No newline at end of file diff --git a/esp_websocket_client/searchindex.js b/esp_websocket_client/searchindex.js deleted file mode 100644 index 9d071e312..000000000 --- a/esp_websocket_client/searchindex.js +++ /dev/null @@ -1 +0,0 @@ -Search.setIndex({docnames:["index"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":5,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":3,"sphinx.domains.rst":2,"sphinx.domains.std":2,"sphinx.ext.todo":2,sphinx:56},filenames:["index.rst"],objects:{"":[[0,0,1,"_CPPv4N26esp_websocket_error_type_t30WEBSOCKET_ERROR_TYPE_HANDSHAKEE","WEBSOCKET_ERROR_TYPE_HANDSHAKE"],[0,0,1,"_CPPv4N26esp_websocket_error_type_t25WEBSOCKET_ERROR_TYPE_NONEE","WEBSOCKET_ERROR_TYPE_NONE"],[0,0,1,"_CPPv4N26esp_websocket_error_type_t33WEBSOCKET_ERROR_TYPE_PONG_TIMEOUTE","WEBSOCKET_ERROR_TYPE_PONG_TIMEOUT"],[0,0,1,"_CPPv4N26esp_websocket_error_type_t34WEBSOCKET_ERROR_TYPE_TCP_TRANSPORTE","WEBSOCKET_ERROR_TYPE_TCP_TRANSPORT"],[0,0,1,"_CPPv4N24esp_websocket_event_id_t19WEBSOCKET_EVENT_ANYE","WEBSOCKET_EVENT_ANY"],[0,0,1,"_CPPv4N24esp_websocket_event_id_t30WEBSOCKET_EVENT_BEFORE_CONNECTE","WEBSOCKET_EVENT_BEFORE_CONNECT"],[0,0,1,"_CPPv4N24esp_websocket_event_id_t22WEBSOCKET_EVENT_CLOSEDE","WEBSOCKET_EVENT_CLOSED"],[0,0,1,"_CPPv4N24esp_websocket_event_id_t25WEBSOCKET_EVENT_CONNECTEDE","WEBSOCKET_EVENT_CONNECTED"],[0,0,1,"_CPPv4N24esp_websocket_event_id_t20WEBSOCKET_EVENT_DATAE","WEBSOCKET_EVENT_DATA"],[0,0,1,"_CPPv4N24esp_websocket_event_id_t28WEBSOCKET_EVENT_DISCONNECTEDE","WEBSOCKET_EVENT_DISCONNECTED"],[0,0,1,"_CPPv4N24esp_websocket_event_id_t21WEBSOCKET_EVENT_ERRORE","WEBSOCKET_EVENT_ERROR"],[0,0,1,"_CPPv4N24esp_websocket_event_id_t19WEBSOCKET_EVENT_MAXE","WEBSOCKET_EVENT_MAX"],[0,0,1,"_CPPv4N25esp_websocket_transport_t28WEBSOCKET_TRANSPORT_OVER_SSLE","WEBSOCKET_TRANSPORT_OVER_SSL"],[0,0,1,"_CPPv4N25esp_websocket_transport_t28WEBSOCKET_TRANSPORT_OVER_TCPE","WEBSOCKET_TRANSPORT_OVER_TCP"],[0,0,1,"_CPPv4N25esp_websocket_transport_t27WEBSOCKET_TRANSPORT_UNKNOWNE","WEBSOCKET_TRANSPORT_UNKNOWN"],[0,1,1,"_CPPv426esp_websocket_client_close29esp_websocket_client_handle_t10TickType_t","esp_websocket_client_close"],[0,2,1,"_CPPv426esp_websocket_client_close29esp_websocket_client_handle_t10TickType_t","esp_websocket_client_close::client"],[0,2,1,"_CPPv426esp_websocket_client_close29esp_websocket_client_handle_t10TickType_t","esp_websocket_client_close::timeout"],[0,1,1,"_CPPv436esp_websocket_client_close_with_code29esp_websocket_client_handle_tiPKci10TickType_t","esp_websocket_client_close_with_code"],[0,2,1,"_CPPv436esp_websocket_client_close_with_code29esp_websocket_client_handle_tiPKci10TickType_t","esp_websocket_client_close_with_code::client"],[0,2,1,"_CPPv436esp_websocket_client_close_with_code29esp_websocket_client_handle_tiPKci10TickType_t","esp_websocket_client_close_with_code::code"],[0,2,1,"_CPPv436esp_websocket_client_close_with_code29esp_websocket_client_handle_tiPKci10TickType_t","esp_websocket_client_close_with_code::data"],[0,2,1,"_CPPv436esp_websocket_client_close_with_code29esp_websocket_client_handle_tiPKci10TickType_t","esp_websocket_client_close_with_code::len"],[0,2,1,"_CPPv436esp_websocket_client_close_with_code29esp_websocket_client_handle_tiPKci10TickType_t","esp_websocket_client_close_with_code::timeout"],[0,3,1,"_CPPv429esp_websocket_client_config_t","esp_websocket_client_config_t"],[0,4,1,"_CPPv4N29esp_websocket_client_config_t11buffer_sizeE","esp_websocket_client_config_t::buffer_size"],[0,4,1,"_CPPv4N29esp_websocket_client_config_t8cert_lenE","esp_websocket_client_config_t::cert_len"],[0,4,1,"_CPPv4N29esp_websocket_client_config_t8cert_pemE","esp_websocket_client_config_t::cert_pem"],[0,4,1,"_CPPv4N29esp_websocket_client_config_t11client_certE","esp_websocket_client_config_t::client_cert"],[0,4,1,"_CPPv4N29esp_websocket_client_config_t15client_cert_lenE","esp_websocket_client_config_t::client_cert_len"],[0,4,1,"_CPPv4N29esp_websocket_client_config_t10client_keyE","esp_websocket_client_config_t::client_key"],[0,4,1,"_CPPv4N29esp_websocket_client_config_t14client_key_lenE","esp_websocket_client_config_t::client_key_len"],[0,4,1,"_CPPv4N29esp_websocket_client_config_t17crt_bundle_attachE","esp_websocket_client_config_t::crt_bundle_attach"],[0,4,1,"_CPPv4N29esp_websocket_client_config_t22disable_auto_reconnectE","esp_websocket_client_config_t::disable_auto_reconnect"],[0,4,1,"_CPPv4N29esp_websocket_client_config_t23disable_pingpong_disconE","esp_websocket_client_config_t::disable_pingpong_discon"],[0,4,1,"_CPPv4N29esp_websocket_client_config_t7headersE","esp_websocket_client_config_t::headers"],[0,4,1,"_CPPv4N29esp_websocket_client_config_t4hostE","esp_websocket_client_config_t::host"],[0,4,1,"_CPPv4N29esp_websocket_client_config_t7if_nameE","esp_websocket_client_config_t::if_name"],[0,4,1,"_CPPv4N29esp_websocket_client_config_t16keep_alive_countE","esp_websocket_client_config_t::keep_alive_count"],[0,4,1,"_CPPv4N29esp_websocket_client_config_t17keep_alive_enableE","esp_websocket_client_config_t::keep_alive_enable"],[0,4,1,"_CPPv4N29esp_websocket_client_config_t15keep_alive_idleE","esp_websocket_client_config_t::keep_alive_idle"],[0,4,1,"_CPPv4N29esp_websocket_client_config_t19keep_alive_intervalE","esp_websocket_client_config_t::keep_alive_interval"],[0,4,1,"_CPPv4N29esp_websocket_client_config_t18network_timeout_msE","esp_websocket_client_config_t::network_timeout_ms"],[0,4,1,"_CPPv4N29esp_websocket_client_config_t8passwordE","esp_websocket_client_config_t::password"],[0,4,1,"_CPPv4N29esp_websocket_client_config_t4pathE","esp_websocket_client_config_t::path"],[0,4,1,"_CPPv4N29esp_websocket_client_config_t17ping_interval_secE","esp_websocket_client_config_t::ping_interval_sec"],[0,4,1,"_CPPv4N29esp_websocket_client_config_t20pingpong_timeout_secE","esp_websocket_client_config_t::pingpong_timeout_sec"],[0,4,1,"_CPPv4N29esp_websocket_client_config_t4portE","esp_websocket_client_config_t::port"],[0,4,1,"_CPPv4N29esp_websocket_client_config_t20reconnect_timeout_msE","esp_websocket_client_config_t::reconnect_timeout_ms"],[0,4,1,"_CPPv4N29esp_websocket_client_config_t27skip_cert_common_name_checkE","esp_websocket_client_config_t::skip_cert_common_name_check"],[0,4,1,"_CPPv4N29esp_websocket_client_config_t11subprotocolE","esp_websocket_client_config_t::subprotocol"],[0,4,1,"_CPPv4N29esp_websocket_client_config_t9task_nameE","esp_websocket_client_config_t::task_name"],[0,4,1,"_CPPv4N29esp_websocket_client_config_t9task_prioE","esp_websocket_client_config_t::task_prio"],[0,4,1,"_CPPv4N29esp_websocket_client_config_t10task_stackE","esp_websocket_client_config_t::task_stack"],[0,4,1,"_CPPv4N29esp_websocket_client_config_t9transportE","esp_websocket_client_config_t::transport"],[0,4,1,"_CPPv4N29esp_websocket_client_config_t3uriE","esp_websocket_client_config_t::uri"],[0,4,1,"_CPPv4N29esp_websocket_client_config_t19use_global_ca_storeE","esp_websocket_client_config_t::use_global_ca_store"],[0,4,1,"_CPPv4N29esp_websocket_client_config_t10user_agentE","esp_websocket_client_config_t::user_agent"],[0,4,1,"_CPPv4N29esp_websocket_client_config_t12user_contextE","esp_websocket_client_config_t::user_context"],[0,4,1,"_CPPv4N29esp_websocket_client_config_t8usernameE","esp_websocket_client_config_t::username"],[0,1,1,"_CPPv428esp_websocket_client_destroy29esp_websocket_client_handle_t","esp_websocket_client_destroy"],[0,2,1,"_CPPv428esp_websocket_client_destroy29esp_websocket_client_handle_t","esp_websocket_client_destroy::client"],[0,1,1,"_CPPv436esp_websocket_client_destroy_on_exit29esp_websocket_client_handle_t","esp_websocket_client_destroy_on_exit"],[0,2,1,"_CPPv436esp_websocket_client_destroy_on_exit29esp_websocket_client_handle_t","esp_websocket_client_destroy_on_exit::client"],[0,1,1,"_CPPv442esp_websocket_client_get_ping_interval_sec29esp_websocket_client_handle_t","esp_websocket_client_get_ping_interval_sec"],[0,2,1,"_CPPv442esp_websocket_client_get_ping_interval_sec29esp_websocket_client_handle_t","esp_websocket_client_get_ping_interval_sec::client"],[0,5,1,"_CPPv429esp_websocket_client_handle_t","esp_websocket_client_handle_t"],[0,1,1,"_CPPv425esp_websocket_client_initPK29esp_websocket_client_config_t","esp_websocket_client_init"],[0,2,1,"_CPPv425esp_websocket_client_initPK29esp_websocket_client_config_t","esp_websocket_client_init::config"],[0,1,1,"_CPPv433esp_websocket_client_is_connected29esp_websocket_client_handle_t","esp_websocket_client_is_connected"],[0,2,1,"_CPPv433esp_websocket_client_is_connected29esp_websocket_client_handle_t","esp_websocket_client_is_connected::client"],[0,1,1,"_CPPv429esp_websocket_client_send_bin29esp_websocket_client_handle_tPKci10TickType_t","esp_websocket_client_send_bin"],[0,2,1,"_CPPv429esp_websocket_client_send_bin29esp_websocket_client_handle_tPKci10TickType_t","esp_websocket_client_send_bin::client"],[0,2,1,"_CPPv429esp_websocket_client_send_bin29esp_websocket_client_handle_tPKci10TickType_t","esp_websocket_client_send_bin::data"],[0,2,1,"_CPPv429esp_websocket_client_send_bin29esp_websocket_client_handle_tPKci10TickType_t","esp_websocket_client_send_bin::len"],[0,2,1,"_CPPv429esp_websocket_client_send_bin29esp_websocket_client_handle_tPKci10TickType_t","esp_websocket_client_send_bin::timeout"],[0,1,1,"_CPPv430esp_websocket_client_send_text29esp_websocket_client_handle_tPKci10TickType_t","esp_websocket_client_send_text"],[0,2,1,"_CPPv430esp_websocket_client_send_text29esp_websocket_client_handle_tPKci10TickType_t","esp_websocket_client_send_text::client"],[0,2,1,"_CPPv430esp_websocket_client_send_text29esp_websocket_client_handle_tPKci10TickType_t","esp_websocket_client_send_text::data"],[0,2,1,"_CPPv430esp_websocket_client_send_text29esp_websocket_client_handle_tPKci10TickType_t","esp_websocket_client_send_text::len"],[0,2,1,"_CPPv430esp_websocket_client_send_text29esp_websocket_client_handle_tPKci10TickType_t","esp_websocket_client_send_text::timeout"],[0,1,1,"_CPPv437esp_websocket_client_send_with_opcode29esp_websocket_client_handle_t22ws_transport_opcodes_tPK7uint8_ti10TickType_t","esp_websocket_client_send_with_opcode"],[0,2,1,"_CPPv437esp_websocket_client_send_with_opcode29esp_websocket_client_handle_t22ws_transport_opcodes_tPK7uint8_ti10TickType_t","esp_websocket_client_send_with_opcode::client"],[0,2,1,"_CPPv437esp_websocket_client_send_with_opcode29esp_websocket_client_handle_t22ws_transport_opcodes_tPK7uint8_ti10TickType_t","esp_websocket_client_send_with_opcode::data"],[0,2,1,"_CPPv437esp_websocket_client_send_with_opcode29esp_websocket_client_handle_t22ws_transport_opcodes_tPK7uint8_ti10TickType_t","esp_websocket_client_send_with_opcode::len"],[0,2,1,"_CPPv437esp_websocket_client_send_with_opcode29esp_websocket_client_handle_t22ws_transport_opcodes_tPK7uint8_ti10TickType_t","esp_websocket_client_send_with_opcode::opcode"],[0,2,1,"_CPPv437esp_websocket_client_send_with_opcode29esp_websocket_client_handle_t22ws_transport_opcodes_tPK7uint8_ti10TickType_t","esp_websocket_client_send_with_opcode::timeout"],[0,1,1,"_CPPv432esp_websocket_client_set_headers29esp_websocket_client_handle_tPKc","esp_websocket_client_set_headers"],[0,2,1,"_CPPv432esp_websocket_client_set_headers29esp_websocket_client_handle_tPKc","esp_websocket_client_set_headers::client"],[0,2,1,"_CPPv432esp_websocket_client_set_headers29esp_websocket_client_handle_tPKc","esp_websocket_client_set_headers::headers"],[0,1,1,"_CPPv442esp_websocket_client_set_ping_interval_sec29esp_websocket_client_handle_t6size_t","esp_websocket_client_set_ping_interval_sec"],[0,2,1,"_CPPv442esp_websocket_client_set_ping_interval_sec29esp_websocket_client_handle_t6size_t","esp_websocket_client_set_ping_interval_sec::client"],[0,2,1,"_CPPv442esp_websocket_client_set_ping_interval_sec29esp_websocket_client_handle_t6size_t","esp_websocket_client_set_ping_interval_sec::ping_interval_sec"],[0,1,1,"_CPPv428esp_websocket_client_set_uri29esp_websocket_client_handle_tPKc","esp_websocket_client_set_uri"],[0,2,1,"_CPPv428esp_websocket_client_set_uri29esp_websocket_client_handle_tPKc","esp_websocket_client_set_uri::client"],[0,2,1,"_CPPv428esp_websocket_client_set_uri29esp_websocket_client_handle_tPKc","esp_websocket_client_set_uri::uri"],[0,1,1,"_CPPv426esp_websocket_client_start29esp_websocket_client_handle_t","esp_websocket_client_start"],[0,2,1,"_CPPv426esp_websocket_client_start29esp_websocket_client_handle_t","esp_websocket_client_start::client"],[0,1,1,"_CPPv425esp_websocket_client_stop29esp_websocket_client_handle_t","esp_websocket_client_stop"],[0,2,1,"_CPPv425esp_websocket_client_stop29esp_websocket_client_handle_t","esp_websocket_client_stop::client"],[0,3,1,"_CPPv427esp_websocket_error_codes_t","esp_websocket_error_codes_t"],[0,4,1,"_CPPv4N27esp_websocket_error_codes_t25esp_tls_cert_verify_flagsE","esp_websocket_error_codes_t::esp_tls_cert_verify_flags"],[0,4,1,"_CPPv4N27esp_websocket_error_codes_t20esp_tls_last_esp_errE","esp_websocket_error_codes_t::esp_tls_last_esp_err"],[0,4,1,"_CPPv4N27esp_websocket_error_codes_t17esp_tls_stack_errE","esp_websocket_error_codes_t::esp_tls_stack_err"],[0,4,1,"_CPPv4N27esp_websocket_error_codes_t24esp_transport_sock_errnoE","esp_websocket_error_codes_t::esp_transport_sock_errno"],[0,4,1,"_CPPv4N27esp_websocket_error_codes_t28esp_ws_handshake_status_codeE","esp_websocket_error_codes_t::esp_ws_handshake_status_code"],[0,6,1,"_CPPv426esp_websocket_error_type_t","esp_websocket_error_type_t"],[0,0,1,"_CPPv4N26esp_websocket_error_type_t30WEBSOCKET_ERROR_TYPE_HANDSHAKEE","esp_websocket_error_type_t::WEBSOCKET_ERROR_TYPE_HANDSHAKE"],[0,0,1,"_CPPv4N26esp_websocket_error_type_t25WEBSOCKET_ERROR_TYPE_NONEE","esp_websocket_error_type_t::WEBSOCKET_ERROR_TYPE_NONE"],[0,0,1,"_CPPv4N26esp_websocket_error_type_t33WEBSOCKET_ERROR_TYPE_PONG_TIMEOUTE","esp_websocket_error_type_t::WEBSOCKET_ERROR_TYPE_PONG_TIMEOUT"],[0,0,1,"_CPPv4N26esp_websocket_error_type_t34WEBSOCKET_ERROR_TYPE_TCP_TRANSPORTE","esp_websocket_error_type_t::WEBSOCKET_ERROR_TYPE_TCP_TRANSPORT"],[0,3,1,"_CPPv426esp_websocket_event_data_t","esp_websocket_event_data_t"],[0,4,1,"_CPPv4N26esp_websocket_event_data_t6clientE","esp_websocket_event_data_t::client"],[0,4,1,"_CPPv4N26esp_websocket_event_data_t8data_lenE","esp_websocket_event_data_t::data_len"],[0,4,1,"_CPPv4N26esp_websocket_event_data_t8data_ptrE","esp_websocket_event_data_t::data_ptr"],[0,4,1,"_CPPv4N26esp_websocket_event_data_t12error_handleE","esp_websocket_event_data_t::error_handle"],[0,4,1,"_CPPv4N26esp_websocket_event_data_t3finE","esp_websocket_event_data_t::fin"],[0,4,1,"_CPPv4N26esp_websocket_event_data_t7op_codeE","esp_websocket_event_data_t::op_code"],[0,4,1,"_CPPv4N26esp_websocket_event_data_t11payload_lenE","esp_websocket_event_data_t::payload_len"],[0,4,1,"_CPPv4N26esp_websocket_event_data_t14payload_offsetE","esp_websocket_event_data_t::payload_offset"],[0,4,1,"_CPPv4N26esp_websocket_event_data_t12user_contextE","esp_websocket_event_data_t::user_context"],[0,6,1,"_CPPv424esp_websocket_event_id_t","esp_websocket_event_id_t"],[0,0,1,"_CPPv4N24esp_websocket_event_id_t19WEBSOCKET_EVENT_ANYE","esp_websocket_event_id_t::WEBSOCKET_EVENT_ANY"],[0,0,1,"_CPPv4N24esp_websocket_event_id_t30WEBSOCKET_EVENT_BEFORE_CONNECTE","esp_websocket_event_id_t::WEBSOCKET_EVENT_BEFORE_CONNECT"],[0,0,1,"_CPPv4N24esp_websocket_event_id_t22WEBSOCKET_EVENT_CLOSEDE","esp_websocket_event_id_t::WEBSOCKET_EVENT_CLOSED"],[0,0,1,"_CPPv4N24esp_websocket_event_id_t25WEBSOCKET_EVENT_CONNECTEDE","esp_websocket_event_id_t::WEBSOCKET_EVENT_CONNECTED"],[0,0,1,"_CPPv4N24esp_websocket_event_id_t20WEBSOCKET_EVENT_DATAE","esp_websocket_event_id_t::WEBSOCKET_EVENT_DATA"],[0,0,1,"_CPPv4N24esp_websocket_event_id_t28WEBSOCKET_EVENT_DISCONNECTEDE","esp_websocket_event_id_t::WEBSOCKET_EVENT_DISCONNECTED"],[0,0,1,"_CPPv4N24esp_websocket_event_id_t21WEBSOCKET_EVENT_ERRORE","esp_websocket_event_id_t::WEBSOCKET_EVENT_ERROR"],[0,0,1,"_CPPv4N24esp_websocket_event_id_t19WEBSOCKET_EVENT_MAXE","esp_websocket_event_id_t::WEBSOCKET_EVENT_MAX"],[0,1,1,"_CPPv429esp_websocket_register_events29esp_websocket_client_handle_t24esp_websocket_event_id_t19esp_event_handler_tPv","esp_websocket_register_events"],[0,2,1,"_CPPv429esp_websocket_register_events29esp_websocket_client_handle_t24esp_websocket_event_id_t19esp_event_handler_tPv","esp_websocket_register_events::client"],[0,2,1,"_CPPv429esp_websocket_register_events29esp_websocket_client_handle_t24esp_websocket_event_id_t19esp_event_handler_tPv","esp_websocket_register_events::event"],[0,2,1,"_CPPv429esp_websocket_register_events29esp_websocket_client_handle_t24esp_websocket_event_id_t19esp_event_handler_tPv","esp_websocket_register_events::event_handler"],[0,2,1,"_CPPv429esp_websocket_register_events29esp_websocket_client_handle_t24esp_websocket_event_id_t19esp_event_handler_tPv","esp_websocket_register_events::event_handler_arg"],[0,6,1,"_CPPv425esp_websocket_transport_t","esp_websocket_transport_t"],[0,0,1,"_CPPv4N25esp_websocket_transport_t28WEBSOCKET_TRANSPORT_OVER_SSLE","esp_websocket_transport_t::WEBSOCKET_TRANSPORT_OVER_SSL"],[0,0,1,"_CPPv4N25esp_websocket_transport_t28WEBSOCKET_TRANSPORT_OVER_TCPE","esp_websocket_transport_t::WEBSOCKET_TRANSPORT_OVER_TCP"],[0,0,1,"_CPPv4N25esp_websocket_transport_t27WEBSOCKET_TRANSPORT_UNKNOWNE","esp_websocket_transport_t::WEBSOCKET_TRANSPORT_UNKNOWN"]]},objnames:{"0":["cpp","enumerator","C++ enumerator"],"1":["cpp","function","C++ function"],"2":["cpp","functionParam","C++ function parameter"],"3":["cpp","class","C++ class"],"4":["cpp","member","C++ member"],"5":["cpp","type","C++ type"],"6":["cpp","enum","C++ enum"]},objtypes:{"0":"cpp:enumerator","1":"cpp:function","2":"cpp:functionParam","3":"cpp:class","4":"cpp:member","5":"cpp:type","6":"cpp:enum"},terms:{"0":0,"01":0,"02":0,"1":0,"10":0,"104":0,"123":0,"3":0,"4":0,"443":0,"4567":0,"5":0,"7":0,"8":0,"80":0,"case":0,"char":0,"const":0,"default":0,"do":0,"enum":0,"int":0,"new":0,"null":0,"public":0,"return":0,"true":0,"void":0,A:0,For:0,If:0,In:0,It:0,Not:0,The:0,abl:0,abort:0,accept:0,access:0,actual:0,addit:0,after:0,agent:0,aliv:0,all:0,also:0,an:0,ani:0,ar:0,associ:0,auth:0,authent:0,auto:0,automat:0,basic:0,becaus:0,been:0,befor:0,begin:0,behavior:0,below:0,binari:0,bool:0,both:0,buffer:0,buffer_s:0,bundl:0,ca:0,ca_stor:0,call:0,callback:0,can:0,cannot:0,cert_len:0,cert_pem:0,certfic:0,certif:0,chain:0,charact:0,check:0,clean:0,cleanli:0,client_cert:0,client_cert_len:0,client_kei:0,client_key_len:0,client_key_pem:0,close:0,cn:0,code:0,command:0,complet:0,compon:0,conf:0,config:0,connect:0,connectionhandl:0,contain:0,context:0,contextu:0,correspond:0,could:0,count:0,crt_bundle_attach:0,current:0,custom:0,d:0,dangl:0,data_len:0,data_ptr:0,defin:0,depend:0,der:0,destroi:0,directli:0,disabl:0,disable_auto_reconnect:0,disable_pingpong_discon:0,disconnect:0,doe:0,domain:0,download:0,due:0,dure:0,e:0,each:0,easi:0,echo:0,enabl:0,encod:0,end:0,environ:0,errno:0,error:0,error_handl:0,esp32:0,esp_crt_bundl:0,esp_crt_bundle_attach:0,esp_err:0,esp_err_t:0,esp_event_handler_t:0,esp_tls_cert_verify_flag:0,esp_tls_last_esp_err:0,esp_tls_stack_err:0,esp_transport_sock_errno:0,esp_websocket_cli:0,esp_websocket_client_clos:0,esp_websocket_client_close_with_cod:0,esp_websocket_client_config_t:0,esp_websocket_client_destroi:0,esp_websocket_client_destroy_on_exit:0,esp_websocket_client_get_ping_interval_sec:0,esp_websocket_client_handle_t:0,esp_websocket_client_init:0,esp_websocket_client_is_connect:0,esp_websocket_client_send_bin:0,esp_websocket_client_send_text:0,esp_websocket_client_send_with_opcod:0,esp_websocket_client_set_head:0,esp_websocket_client_set_ping_interval_sec:0,esp_websocket_client_set_uri:0,esp_websocket_client_start:0,esp_websocket_client_stop:0,esp_websocket_error_codes_t:0,esp_websocket_error_type_t:0,esp_websocket_event_data_t:0,esp_websocket_event_id_t:0,esp_websocket_register_ev:0,esp_websocket_transport_t:0,esp_ws_handshake_status_cod:0,establish:0,event_handl:0,event_handler_arg:0,exce:0,exceed:0,exchang:0,execut:0,extract:0,fail:0,fals:0,field:0,fin:0,finish:0,first:0,flag:0,follow:0,format:0,found:0,fragment:0,frame:0,free:0,from:0,g:0,get:0,global:0,go:0,good:0,h:0,ha:0,handl:0,handler:0,handler_arg:0,handshak:0,have:0,here:0,host:0,http:0,i:0,id:0,idl:0,if_nam:0,ifreq:0,implement:0,includ:0,indiffer:0,inform:0,initi:0,input:0,instal:0,instanc:0,interfac:0,intermedi:0,intern:0,interv:0,ip:0,keep:0,keep_alive_count:0,keep_alive_en:0,keep_alive_idl:0,keep_alive_interv:0,kei:0,last:0,layer:0,len:0,length:0,like:0,linux:0,loop:0,mai:0,matter:0,mbedtl:0,mbedtls_certificate_bundl:0,member:0,menuconfig:0,messag:0,might:0,milisecond:0,millisecond:0,minim:0,more:0,multipl:0,must:0,mutual:0,n:0,name:0,nativ:0,need:0,network:0,network_timeout_m:0,never:0,non:0,note:0,now:0,number:0,occur:0,offset:0,old:0,onc:0,one:0,ones:0,onli:0,op_cod:0,opcod:0,open:0,openssl:0,oper:0,opposit:0,option:0,org:0,other:0,outform:0,over:0,overrid:0,overridden:0,p:0,packag:0,packet:0,paramet:0,pars:0,pass:0,password:0,path:0,payload:0,payload_len:0,payload_offset:0,pem:0,perform:0,period:0,ping:0,ping_interval_sec:0,pingpong_timeout_sec:0,pleas:0,point:0,pointer:0,pong:0,port:0,portion:0,portmax_delai:0,possibl:0,post:0,practic:0,pre:0,prioriti:0,privat:0,propag:0,protocol:0,provid:0,queri:0,r:0,read:0,readi:0,receiv:0,reconnect:0,reconnect_timeout_m:0,regist:0,relat:0,replac:0,repli:0,report:0,request:0,requir:0,resourc:0,respons:0,retri:0,rfc6455:0,root:0,rto:0,s_client:0,same:0,sampl:0,save:0,scheme:0,sec:0,second:0,section:0,sed:0,see:0,sent:0,sequenc:0,server:0,session:0,set:0,setup:0,should:0,showcert:0,simpl:0,size:0,size_t:0,skip:0,skip_cert_common_name_check:0,soap:0,socket:0,specif:0,ssl:0,stack:0,start:0,state:0,statu:0,stop:0,string:0,struct:0,successfulli:0,support:0,system:0,task:0,task_nam:0,task_prio:0,task_stack:0,tcp:0,termin:0,textual:0,thi:0,through:0,tick:0,ticktype_t:0,time:0,timeout:0,total:0,transport:0,typedef:0,uint8_t:0,unavail:0,underli:0,unknown:0,until:0,upgrad:0,url:0,us:0,use_global_ca_stor:0,user:0,user_ag:0,user_context:0,user_data:0,usernam:0,utf:0,valid:0,valu:0,verif:0,verifi:0,via:0,wa:0,wai:0,wait:0,want:0,websocket_client_config_t:0,websocket_error_type_handshak:0,websocket_error_type_non:0,websocket_error_type_pong_timeout:0,websocket_error_type_tcp_transport:0,websocket_event_ani:0,websocket_event_before_connect:0,websocket_event_clos:0,websocket_event_connect:0,websocket_event_data:0,websocket_event_disconnect:0,websocket_event_error:0,websocket_event_max:0,websocket_org:0,websocket_org_pem_start:0,websocket_transport_over_ssl:0,websocket_transport_over_tcp:0,websocket_transport_unknown:0,well:0,what:0,when:0,which:0,window:0,within:0,without:0,would:0,write:0,ws:0,ws_cfg:0,ws_transport_opcodes_t:0,wss:0,x509:0,you:0},titles:["ESP WebSocket Client"],titleterms:{"function":0,api:0,applic:0,client:0,configur:0,data:0,definit:0,enumer:0,esp:0,event:0,exampl:0,featur:0,file:0,header:0,issu:0,known:0,limit:0,overview:0,refer:0,send:0,structur:0,subprotocol:0,text:0,tl:0,type:0,uri:0,websocket:0}}) \ No newline at end of file diff --git a/index.html b/index.html index 9ca6076a3..dc88f38d1 100644 --- a/index.html +++ b/index.html @@ -1,5 +1,785 @@ -esp-modem
-esp-websocket-client
-ASIO
-mDNS_en
-mDNS_zh_CN
+ + + + + + GCC Code Coverage Report + + + + + +

GCC Code Coverage Report

+ +
+ +
+
+ + + + + + + + + + + + + +
Directory:src/
Date:2023-05-29 17:55:57
Legend: + low: >= 0% + medium: >= 75.0% + high: >= 90.0% +
+
+ +
+ + + + + + + + + + + + + + + + + + + +
ExecTotalCoverage
Lines:518116644.4%
Branches:00-%
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileLinesBranches
+ esp_modem_api.cpp + + 41.2 + 41.2%7 / 17-%0 / 0
+ esp_modem_c_api.cpp + + 0.0 + 0.0%0 / 192-%0 / 0
+ esp_modem_cmux.cpp + + 84.7 + 84.7%199 / 235-%0 / 0
+ esp_modem_command_library.cpp + + 52.9 + 52.9%157 / 297-%0 / 0
+ esp_modem_dce.cpp + + 55.0 + 55.0%44 / 80-%0 / 0
+ esp_modem_dte.cpp + + 50.7 + 50.7%69 / 136-%0 / 0
+ esp_modem_factory.cpp + + 0.0 + 0.0%0 / 9-%0 / 0
+ esp_modem_modules.cpp + + 26.3 + 26.3%5 / 19-%0 / 0
+ esp_modem_netif_linux.cpp + + 56.0 + 56.0%14 / 25-%0 / 0
+ esp_modem_primitives_linux.cpp + + 63.9 + 63.9%23 / 36-%0 / 0
+ esp_modem_term_fs.cpp + + 0.0 + 0.0%0 / 52-%0 / 0
+ esp_modem_uart_linux.cpp + + 0.0 + 0.0%0 / 23-%0 / 0
+ esp_modem_vfs_socket_creator.cpp + + 0.0 + 0.0%0 / 36-%0 / 0
+ esp_modem_vfs_uart_creator.cpp + + 0.0 + 0.0%0 / 9-%0 / 0
+ +
+ + + + diff --git a/mdns/en/.buildinfo b/mdns/en/.buildinfo deleted file mode 100644 index 2d494240b..000000000 --- a/mdns/en/.buildinfo +++ /dev/null @@ -1,4 +0,0 @@ -# Sphinx build info version 1 -# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: be268656851d7dba858382a5bd9a954d -tags: 549b3d6d0415232fb7e35403b330ff49 diff --git a/mdns/en/_sources/index.rst.txt b/mdns/en/_sources/index.rst.txt deleted file mode 100644 index 64f1b04bc..000000000 --- a/mdns/en/_sources/index.rst.txt +++ /dev/null @@ -1,203 +0,0 @@ -mDNS Service -============ -`zh_CN:[中文] `_ - -Overview --------- - -mDNS is a multicast UDP service that is used to provide local network service and host discovery. - -mDNS is installed by default on most operating systems or is available as separate package. On ``Mac OS`` it is installed by default and is called ``Bonjour``. Apple releases an installer for ``Windows`` that can be found `on Apple's support page `_. On ``Linux``, mDNS is provided by `avahi `_ and is usually installed by default. - -mDNS Properties -^^^^^^^^^^^^^^^ - - * ``hostname``: the hostname that the device will respond to. If not set, the ``hostname`` will be read from the interface. Example: ``my-{IDF_TARGET_PATH_NAME}`` will resolve to ``my-{IDF_TARGET_PATH_NAME}.local`` - * ``default_instance``: friendly name for your device, like ``Jhon's {IDF_TARGET_NAME} Thing``. If not set, ``hostname`` will be used. - -Example method to start mDNS for the STA interface and set ``hostname`` and ``default_instance``: - -.. highlight:: c - -:: - - void start_mdns_service() - { - //initialize mDNS service - esp_err_t err = mdns_init(); - if (err) { - printf("MDNS Init failed: %d\n", err); - return; - } - - //set hostname - mdns_hostname_set("my-{IDF_TARGET_PATH_NAME}"); - //set default instance - mdns_instance_name_set("Jhon's {IDF_TARGET_NAME} Thing"); - } - -mDNS Services -^^^^^^^^^^^^^ - -mDNS can advertise information about network services that your device offers. Each service is defined by a few properties. - - * ``instance_name``: friendly name for your service, like ``Jhon's E{IDF_TARGET_NAME} Web Server``. If not defined, ``default_instance`` will be used. - * ``service_type``: (required) service type, prepended with underscore. Some common types can be found `here `_. - * ``proto``: (required) protocol that the service runs on, prepended with underscore. Example: ``_tcp`` or ``_udp`` - * ``port``: (required) network port that the service runs on - * ``txt``: ``{var, val}`` array of strings, used to define properties for your service - -Example method to add a few services and different properties:: - - void add_mdns_services() - { - //add our services - mdns_service_add(NULL, "_http", "_tcp", 80, NULL, 0); - mdns_service_add(NULL, "_arduino", "_tcp", 3232, NULL, 0); - mdns_service_add(NULL, "_myservice", "_udp", 1234, NULL, 0); - - //NOTE: services must be added before their properties can be set - //use custom instance for the web server - mdns_service_instance_name_set("_http", "_tcp", "Jhon's {IDF_TARGET_NAME} Web Server"); - - mdns_txt_item_t serviceTxtData[3] = { - {"board","{{IDF_TARGET_PATH_NAME}}"}, - {"u","user"}, - {"p","password"} - }; - //set txt data for service (will free and replace current data) - mdns_service_txt_set("_http", "_tcp", serviceTxtData, 3); - - //change service port - mdns_service_port_set("_myservice", "_udp", 4321); - } - -mDNS Query -^^^^^^^^^^ - -mDNS provides methods for browsing for services and resolving host's IP/IPv6 addresses. - -Results for services are returned as a linked list of ``mdns_result_t`` objects. - -Example method to resolve host IPs:: - - void resolve_mdns_host(const char * host_name) - { - printf("Query A: %s.local", host_name); - - struct ip4_addr addr; - addr.addr = 0; - - esp_err_t err = mdns_query_a(host_name, 2000, &addr); - if(err){ - if(err == ESP_ERR_NOT_FOUND){ - printf("Host was not found!"); - return; - } - printf("Query Failed"); - return; - } - - printf(IPSTR, IP2STR(&addr)); - } - -Example method to resolve local services:: - - static const char * if_str[] = {"STA", "AP", "ETH", "MAX"}; - static const char * ip_protocol_str[] = {"V4", "V6", "MAX"}; - - void mdns_print_results(mdns_result_t * results){ - mdns_result_t * r = results; - mdns_ip_addr_t * a = NULL; - int i = 1, t; - while(r){ - printf("%d: Interface: %s, Type: %s\n", i++, if_str[r->tcpip_if], ip_protocol_str[r->ip_protocol]); - if(r->instance_name){ - printf(" PTR : %s\n", r->instance_name); - } - if(r->hostname){ - printf(" SRV : %s.local:%u\n", r->hostname, r->port); - } - if(r->txt_count){ - printf(" TXT : [%u] ", r->txt_count); - for(t=0; ttxt_count; t++){ - printf("%s=%s; ", r->txt[t].key, r->txt[t].value); - } - printf("\n"); - } - a = r->addr; - while(a){ - if(a->addr.type == IPADDR_TYPE_V6){ - printf(" AAAA: " IPV6STR "\n", IPV62STR(a->addr.u_addr.ip6)); - } else { - printf(" A : " IPSTR "\n", IP2STR(&(a->addr.u_addr.ip4))); - } - a = a->next; - } - r = r->next; - } - - } - - void find_mdns_service(const char * service_name, const char * proto) - { - ESP_LOGI(TAG, "Query PTR: %s.%s.local", service_name, proto); - - mdns_result_t * results = NULL; - esp_err_t err = mdns_query_ptr(service_name, proto, 3000, 20, &results); - if(err){ - ESP_LOGE(TAG, "Query Failed"); - return; - } - if(!results){ - ESP_LOGW(TAG, "No results found!"); - return; - } - - mdns_print_results(results); - mdns_query_results_free(results); - } - -Example of using the methods above:: - - void my_app_some_method(){ - //search for {IDF_TARGET_PATH_NAME}-mdns.local - resolve_mdns_host("{IDF_TARGET_PATH_NAME}-mdns"); - - //search for HTTP servers - find_mdns_service("_http", "_tcp"); - //or file servers - find_mdns_service("_smb", "_tcp"); //windows sharing - find_mdns_service("_afpovertcp", "_tcp"); //apple sharing - find_mdns_service("_nfs", "_tcp"); //NFS server - find_mdns_service("_ftp", "_tcp"); //FTP server - //or networked printer - find_mdns_service("_printer", "_tcp"); - find_mdns_service("_ipp", "_tcp"); - } - - -Performance Optimization -^^^^^^^^^^^^^^^^^^^^^^^^ - -Execution Speed -^^^^^^^^^^^^^^^ - - - mDNS creates a task with default low priority 1 ``CONFIG_MDNS_TASK_PRIORITY`` (If ``CONFIG_FREERTOS_UNICORE`` enabeled it pinned to CPU0 (``CONFIG_MDNS_TASK_AFFINITY``). - Please check `Maximizing Execution Speed `_ for more details. - -Minimizing RAM Usage -^^^^^^^^^^^^^^^^^^^^ - -- mDNS creates a tasks with stack sizes configured by ``CONFIG_MDNS_TASK_STACK_SIZE``. -Please check `Minimizing RAM Usage `_ for more details. - -Application Example -------------------- - -mDNS server/scanner example: :example:`<../examples>`. - -API Reference -------------- - -.. include-build-file:: inc/mdns.inc diff --git a/mdns/en/_static/DejaVuSans.ttf b/mdns/en/_static/DejaVuSans.ttf deleted file mode 100644 index 19ed0b468..000000000 Binary files a/mdns/en/_static/DejaVuSans.ttf and /dev/null differ diff --git a/mdns/en/_static/NotoSansSC-Regular.otf b/mdns/en/_static/NotoSansSC-Regular.otf deleted file mode 100644 index 7cd0b77ae..000000000 Binary files a/mdns/en/_static/NotoSansSC-Regular.otf and /dev/null differ diff --git a/mdns/en/_static/basic.css b/mdns/en/_static/basic.css deleted file mode 100644 index bf18350b6..000000000 --- a/mdns/en/_static/basic.css +++ /dev/null @@ -1,906 +0,0 @@ -/* - * basic.css - * ~~~~~~~~~ - * - * Sphinx stylesheet -- basic theme. - * - * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -/* -- main layout ----------------------------------------------------------- */ - -div.clearer { - clear: both; -} - -div.section::after { - display: block; - content: ''; - clear: left; -} - -/* -- relbar ---------------------------------------------------------------- */ - -div.related { - width: 100%; - font-size: 90%; -} - -div.related h3 { - display: none; -} - -div.related ul { - margin: 0; - padding: 0 0 0 10px; - list-style: none; -} - -div.related li { - display: inline; -} - -div.related li.right { - float: right; - margin-right: 5px; -} - -/* -- sidebar --------------------------------------------------------------- */ - -div.sphinxsidebarwrapper { - padding: 10px 5px 0 10px; -} - -div.sphinxsidebar { - float: left; - width: 230px; - margin-left: -100%; - font-size: 90%; - word-wrap: break-word; - overflow-wrap : break-word; -} - -div.sphinxsidebar ul { - list-style: none; -} - -div.sphinxsidebar ul ul, -div.sphinxsidebar ul.want-points { - margin-left: 20px; - list-style: square; -} - -div.sphinxsidebar ul ul { - margin-top: 0; - margin-bottom: 0; -} - -div.sphinxsidebar form { - margin-top: 10px; -} - -div.sphinxsidebar input { - border: 1px solid #98dbcc; - font-family: sans-serif; - font-size: 1em; -} - -div.sphinxsidebar #searchbox form.search { - overflow: hidden; -} - -div.sphinxsidebar #searchbox input[type="text"] { - float: left; - width: 80%; - padding: 0.25em; - box-sizing: border-box; -} - -div.sphinxsidebar #searchbox input[type="submit"] { - float: left; - width: 20%; - border-left: none; - padding: 0.25em; - box-sizing: border-box; -} - - -img { - border: 0; - max-width: 100%; -} - -/* -- search page ----------------------------------------------------------- */ - -ul.search { - margin: 10px 0 0 20px; - padding: 0; -} - -ul.search li { - padding: 5px 0 5px 20px; - background-image: url(file.png); - background-repeat: no-repeat; - background-position: 0 7px; -} - -ul.search li a { - font-weight: bold; -} - -ul.search li p.context { - color: #888; - margin: 2px 0 0 30px; - text-align: left; -} - -ul.keywordmatches li.goodmatch a { - font-weight: bold; -} - -/* -- index page ------------------------------------------------------------ */ - -table.contentstable { - width: 90%; - margin-left: auto; - margin-right: auto; -} - -table.contentstable p.biglink { - line-height: 150%; -} - -a.biglink { - font-size: 1.3em; -} - -span.linkdescr { - font-style: italic; - padding-top: 5px; - font-size: 90%; -} - -/* -- general index --------------------------------------------------------- */ - -table.indextable { - width: 100%; -} - -table.indextable td { - text-align: left; - vertical-align: top; -} - -table.indextable ul { - margin-top: 0; - margin-bottom: 0; - list-style-type: none; -} - -table.indextable > tbody > tr > td > ul { - padding-left: 0em; -} - -table.indextable tr.pcap { - height: 10px; -} - -table.indextable tr.cap { - margin-top: 10px; - background-color: #f2f2f2; -} - -img.toggler { - margin-right: 3px; - margin-top: 3px; - cursor: pointer; -} - -div.modindex-jumpbox { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - margin: 1em 0 1em 0; - padding: 0.4em; -} - -div.genindex-jumpbox { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - margin: 1em 0 1em 0; - padding: 0.4em; -} - -/* -- domain module index --------------------------------------------------- */ - -table.modindextable td { - padding: 2px; - border-collapse: collapse; -} - -/* -- general body styles --------------------------------------------------- */ - -div.body { - min-width: 450px; - max-width: 800px; -} - -div.body p, div.body dd, div.body li, div.body blockquote { - -moz-hyphens: auto; - -ms-hyphens: auto; - -webkit-hyphens: auto; - hyphens: auto; -} - -a.headerlink { - visibility: hidden; -} - -a.brackets:before, -span.brackets > a:before{ - content: "["; -} - -a.brackets:after, -span.brackets > a:after { - content: "]"; -} - -h1:hover > a.headerlink, -h2:hover > a.headerlink, -h3:hover > a.headerlink, -h4:hover > a.headerlink, -h5:hover > a.headerlink, -h6:hover > a.headerlink, -dt:hover > a.headerlink, -caption:hover > a.headerlink, -p.caption:hover > a.headerlink, -div.code-block-caption:hover > a.headerlink { - visibility: visible; -} - -div.body p.caption { - text-align: inherit; -} - -div.body td { - text-align: left; -} - -.first { - margin-top: 0 !important; -} - -p.rubric { - margin-top: 30px; - font-weight: bold; -} - -img.align-left, figure.align-left, .figure.align-left, object.align-left { - clear: left; - float: left; - margin-right: 1em; -} - -img.align-right, figure.align-right, .figure.align-right, object.align-right { - clear: right; - float: right; - margin-left: 1em; -} - -img.align-center, figure.align-center, .figure.align-center, object.align-center { - display: block; - margin-left: auto; - margin-right: auto; -} - -img.align-default, figure.align-default, .figure.align-default { - display: block; - margin-left: auto; - margin-right: auto; -} - -.align-left { - text-align: left; -} - -.align-center { - text-align: center; -} - -.align-default { - text-align: center; -} - -.align-right { - text-align: right; -} - -/* -- sidebars -------------------------------------------------------------- */ - -div.sidebar, -aside.sidebar { - margin: 0 0 0.5em 1em; - border: 1px solid #ddb; - padding: 7px; - background-color: #ffe; - width: 40%; - float: right; - clear: right; - overflow-x: auto; -} - -p.sidebar-title { - font-weight: bold; -} - -div.admonition, div.topic, blockquote { - clear: left; -} - -/* -- topics ---------------------------------------------------------------- */ - -div.topic { - border: 1px solid #ccc; - padding: 7px; - margin: 10px 0 10px 0; -} - -p.topic-title { - font-size: 1.1em; - font-weight: bold; - margin-top: 10px; -} - -/* -- admonitions ----------------------------------------------------------- */ - -div.admonition { - margin-top: 10px; - margin-bottom: 10px; - padding: 7px; -} - -div.admonition dt { - font-weight: bold; -} - -p.admonition-title { - margin: 0px 10px 5px 0px; - font-weight: bold; -} - -div.body p.centered { - text-align: center; - margin-top: 25px; -} - -/* -- content of sidebars/topics/admonitions -------------------------------- */ - -div.sidebar > :last-child, -aside.sidebar > :last-child, -div.topic > :last-child, -div.admonition > :last-child { - margin-bottom: 0; -} - -div.sidebar::after, -aside.sidebar::after, -div.topic::after, -div.admonition::after, -blockquote::after { - display: block; - content: ''; - clear: both; -} - -/* -- tables ---------------------------------------------------------------- */ - -table.docutils { - margin-top: 10px; - margin-bottom: 10px; - border: 0; - border-collapse: collapse; -} - -table.align-center { - margin-left: auto; - margin-right: auto; -} - -table.align-default { - margin-left: auto; - margin-right: auto; -} - -table caption span.caption-number { - font-style: italic; -} - -table caption span.caption-text { -} - -table.docutils td, table.docutils th { - padding: 1px 8px 1px 5px; - border-top: 0; - border-left: 0; - border-right: 0; - border-bottom: 1px solid #aaa; -} - -table.footnote td, table.footnote th { - border: 0 !important; -} - -th { - text-align: left; - padding-right: 5px; -} - -table.citation { - border-left: solid 1px gray; - margin-left: 1px; -} - -table.citation td { - border-bottom: none; -} - -th > :first-child, -td > :first-child { - margin-top: 0px; -} - -th > :last-child, -td > :last-child { - margin-bottom: 0px; -} - -/* -- figures --------------------------------------------------------------- */ - -div.figure, figure { - margin: 0.5em; - padding: 0.5em; -} - -div.figure p.caption, figcaption { - padding: 0.3em; -} - -div.figure p.caption span.caption-number, -figcaption span.caption-number { - font-style: italic; -} - -div.figure p.caption span.caption-text, -figcaption span.caption-text { -} - -/* -- field list styles ----------------------------------------------------- */ - -table.field-list td, table.field-list th { - border: 0 !important; -} - -.field-list ul { - margin: 0; - padding-left: 1em; -} - -.field-list p { - margin: 0; -} - -.field-name { - -moz-hyphens: manual; - -ms-hyphens: manual; - -webkit-hyphens: manual; - hyphens: manual; -} - -/* -- hlist styles ---------------------------------------------------------- */ - -table.hlist { - margin: 1em 0; -} - -table.hlist td { - vertical-align: top; -} - -/* -- object description styles --------------------------------------------- */ - -.sig { - font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; -} - -.sig-name, code.descname { - background-color: transparent; - font-weight: bold; -} - -.sig-name { - font-size: 1.1em; -} - -code.descname { - font-size: 1.2em; -} - -.sig-prename, code.descclassname { - background-color: transparent; -} - -.optional { - font-size: 1.3em; -} - -.sig-paren { - font-size: larger; -} - -.sig-param.n { - font-style: italic; -} - -/* C++ specific styling */ - -.sig-inline.c-texpr, -.sig-inline.cpp-texpr { - font-family: unset; -} - -.sig.c .k, .sig.c .kt, -.sig.cpp .k, .sig.cpp .kt { - color: #0033B3; -} - -.sig.c .m, -.sig.cpp .m { - color: #1750EB; -} - -.sig.c .s, .sig.c .sc, -.sig.cpp .s, .sig.cpp .sc { - color: #067D17; -} - - -/* -- other body styles ----------------------------------------------------- */ - -ol.arabic { - list-style: decimal; -} - -ol.loweralpha { - list-style: lower-alpha; -} - -ol.upperalpha { - list-style: upper-alpha; -} - -ol.lowerroman { - list-style: lower-roman; -} - -ol.upperroman { - list-style: upper-roman; -} - -:not(li) > ol > li:first-child > :first-child, -:not(li) > ul > li:first-child > :first-child { - margin-top: 0px; -} - -:not(li) > ol > li:last-child > :last-child, -:not(li) > ul > li:last-child > :last-child { - margin-bottom: 0px; -} - -ol.simple ol p, -ol.simple ul p, -ul.simple ol p, -ul.simple ul p { - margin-top: 0; -} - -ol.simple > li:not(:first-child) > p, -ul.simple > li:not(:first-child) > p { - margin-top: 0; -} - -ol.simple p, -ul.simple p { - margin-bottom: 0; -} - -dl.footnote > dt, -dl.citation > dt { - float: left; - margin-right: 0.5em; -} - -dl.footnote > dd, -dl.citation > dd { - margin-bottom: 0em; -} - -dl.footnote > dd:after, -dl.citation > dd:after { - content: ""; - clear: both; -} - -dl.field-list { - display: grid; - grid-template-columns: fit-content(30%) auto; -} - -dl.field-list > dt { - font-weight: bold; - word-break: break-word; - padding-left: 0.5em; - padding-right: 5px; -} - -dl.field-list > dt:after { - content: ":"; -} - -dl.field-list > dd { - padding-left: 0.5em; - margin-top: 0em; - margin-left: 0em; - margin-bottom: 0em; -} - -dl { - margin-bottom: 15px; -} - -dd > :first-child { - margin-top: 0px; -} - -dd ul, dd table { - margin-bottom: 10px; -} - -dd { - margin-top: 3px; - margin-bottom: 10px; - margin-left: 30px; -} - -dl > dd:last-child, -dl > dd:last-child > :last-child { - margin-bottom: 0; -} - -dt:target, span.highlighted { - background-color: #fbe54e; -} - -rect.highlighted { - fill: #fbe54e; -} - -dl.glossary dt { - font-weight: bold; - font-size: 1.1em; -} - -.versionmodified { - font-style: italic; -} - -.system-message { - background-color: #fda; - padding: 5px; - border: 3px solid red; -} - -.footnote:target { - background-color: #ffa; -} - -.line-block { - display: block; - margin-top: 1em; - margin-bottom: 1em; -} - -.line-block .line-block { - margin-top: 0; - margin-bottom: 0; - margin-left: 1.5em; -} - -.guilabel, .menuselection { - font-family: sans-serif; -} - -.accelerator { - text-decoration: underline; -} - -.classifier { - font-style: oblique; -} - -.classifier:before { - font-style: normal; - margin: 0 0.5em; - content: ":"; - display: inline-block; -} - -abbr, acronym { - border-bottom: dotted 1px; - cursor: help; -} - -/* -- code displays --------------------------------------------------------- */ - -pre { - overflow: auto; - overflow-y: hidden; /* fixes display issues on Chrome browsers */ -} - -pre, div[class*="highlight-"] { - clear: both; -} - -span.pre { - -moz-hyphens: none; - -ms-hyphens: none; - -webkit-hyphens: none; - hyphens: none; - white-space: nowrap; -} - -div[class*="highlight-"] { - margin: 1em 0; -} - -td.linenos pre { - border: 0; - background-color: transparent; - color: #aaa; -} - -table.highlighttable { - display: block; -} - -table.highlighttable tbody { - display: block; -} - -table.highlighttable tr { - display: flex; -} - -table.highlighttable td { - margin: 0; - padding: 0; -} - -table.highlighttable td.linenos { - padding-right: 0.5em; -} - -table.highlighttable td.code { - flex: 1; - overflow: hidden; -} - -.highlight .hll { - display: block; -} - -div.highlight pre, -table.highlighttable pre { - margin: 0; -} - -div.code-block-caption + div { - margin-top: 0; -} - -div.code-block-caption { - margin-top: 1em; - padding: 2px 5px; - font-size: small; -} - -div.code-block-caption code { - background-color: transparent; -} - -table.highlighttable td.linenos, -span.linenos, -div.highlight span.gp { /* gp: Generic.Prompt */ - user-select: none; - -webkit-user-select: text; /* Safari fallback only */ - -webkit-user-select: none; /* Chrome/Safari */ - -moz-user-select: none; /* Firefox */ - -ms-user-select: none; /* IE10+ */ -} - -div.code-block-caption span.caption-number { - padding: 0.1em 0.3em; - font-style: italic; -} - -div.code-block-caption span.caption-text { -} - -div.literal-block-wrapper { - margin: 1em 0; -} - -code.xref, a code { - background-color: transparent; - font-weight: bold; -} - -h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { - background-color: transparent; -} - -.viewcode-link { - float: right; -} - -.viewcode-back { - float: right; - font-family: sans-serif; -} - -div.viewcode-block:target { - margin: -1px -10px; - padding: 0 10px; -} - -/* -- math display ---------------------------------------------------------- */ - -img.math { - vertical-align: middle; -} - -div.body div.math p { - text-align: center; -} - -span.eqno { - float: right; -} - -span.eqno a.headerlink { - position: absolute; - z-index: 1; -} - -div.math:hover a.headerlink { - visibility: visible; -} - -/* -- printout stylesheet --------------------------------------------------- */ - -@media print { - div.document, - div.documentwrapper, - div.bodywrapper { - margin: 0 !important; - width: 100%; - } - - div.sphinxsidebar, - div.related, - div.footer, - #top-link { - display: none; - } -} \ No newline at end of file diff --git a/mdns/en/_static/check-solid.svg b/mdns/en/_static/check-solid.svg deleted file mode 100644 index 92fad4b5c..000000000 --- a/mdns/en/_static/check-solid.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/mdns/en/_static/clipboard.min.js b/mdns/en/_static/clipboard.min.js deleted file mode 100644 index 54b3c4638..000000000 --- a/mdns/en/_static/clipboard.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * clipboard.js v2.0.8 - * https://clipboardjs.com/ - * - * Licensed MIT © Zeno Rocha - */ -!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 - - - - diff --git a/mdns/en/_static/copybutton.css b/mdns/en/_static/copybutton.css deleted file mode 100644 index 40eafe5fc..000000000 --- a/mdns/en/_static/copybutton.css +++ /dev/null @@ -1,93 +0,0 @@ -/* Copy buttons */ -button.copybtn { - position: absolute; - display: flex; - top: .3em; - right: .3em; - width: 1.7em; - height: 1.7em; - opacity: 0; - transition: opacity 0.3s, border .3s, background-color .3s; - user-select: none; - padding: 0; - border: none; - outline: none; - border-radius: 0.4em; - /* The colors that GitHub uses */ - border: #1b1f2426 1px solid; - background-color: #f6f8fa; - color: #57606a; -} - -button.copybtn.success { - border-color: #22863a; - color: #22863a; -} - -button.copybtn svg { - stroke: currentColor; - width: 1.5em; - height: 1.5em; - padding: 0.1em; -} - -div.highlight { - position: relative; -} - -.highlight:hover button.copybtn { - opacity: 1; -} - -.highlight button.copybtn:hover { - background-color: rgb(235, 235, 235); -} - -.highlight button.copybtn:active { - background-color: rgb(187, 187, 187); -} - -/** - * A minimal CSS-only tooltip copied from: - * https://codepen.io/mildrenben/pen/rVBrpK - * - * To use, write HTML like the following: - * - *

Short

- */ - .o-tooltip--left { - position: relative; - } - - .o-tooltip--left:after { - opacity: 0; - visibility: hidden; - position: absolute; - content: attr(data-tooltip); - padding: .2em; - font-size: .8em; - left: -.2em; - background: grey; - color: white; - white-space: nowrap; - z-index: 2; - border-radius: 2px; - transform: translateX(-102%) translateY(0); - transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); -} - -.o-tooltip--left:hover:after { - display: block; - opacity: 1; - visibility: visible; - transform: translateX(-100%) translateY(0); - transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); - transition-delay: .5s; -} - -/* By default the copy button shouldn't show up when printing a page */ -@media print { - button.copybtn { - display: none; - } -} diff --git a/mdns/en/_static/copybutton.js b/mdns/en/_static/copybutton.js deleted file mode 100644 index 40ac33108..000000000 --- a/mdns/en/_static/copybutton.js +++ /dev/null @@ -1,220 +0,0 @@ -// Localization support -const messages = { - 'en': { - 'copy': 'Copy', - 'copy_to_clipboard': 'Copy to clipboard', - 'copy_success': 'Copied!', - 'copy_failure': 'Failed to copy', - }, - 'es' : { - 'copy': 'Copiar', - 'copy_to_clipboard': 'Copiar al portapapeles', - 'copy_success': '¡Copiado!', - 'copy_failure': 'Error al copiar', - }, - 'de' : { - 'copy': 'Kopieren', - 'copy_to_clipboard': 'In die Zwischenablage kopieren', - 'copy_success': 'Kopiert!', - 'copy_failure': 'Fehler beim Kopieren', - }, - 'fr' : { - 'copy': 'Copier', - 'copy_to_clipboard': 'Copié dans le presse-papier', - 'copy_success': 'Copié !', - 'copy_failure': 'Échec de la copie', - }, - 'ru': { - 'copy': 'Скопировать', - 'copy_to_clipboard': 'Скопировать в буфер', - 'copy_success': 'Скопировано!', - 'copy_failure': 'Не удалось скопировать', - }, - 'zh-CN': { - 'copy': '复制', - 'copy_to_clipboard': '复制到剪贴板', - 'copy_success': '复制成功!', - 'copy_failure': '复制失败', - }, - 'it' : { - 'copy': 'Copiare', - 'copy_to_clipboard': 'Copiato negli appunti', - 'copy_success': 'Copiato!', - 'copy_failure': 'Errore durante la copia', - } -} - -let locale = 'en' -if( document.documentElement.lang !== undefined - && messages[document.documentElement.lang] !== undefined ) { - locale = document.documentElement.lang -} - -let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; -if (doc_url_root == '#') { - doc_url_root = ''; -} - -/** - * SVG files for our copy buttons - */ -let iconCheck = ` - ${messages[locale]['copy_success']} - - -` - -// If the user specified their own SVG use that, otherwise use the default -let iconCopy = ``; -if (!iconCopy) { - iconCopy = ` - ${messages[locale]['copy_to_clipboard']} - - - -` -} - -/** - * Set up copy/paste for code blocks - */ - -const runWhenDOMLoaded = cb => { - if (document.readyState != 'loading') { - cb() - } else if (document.addEventListener) { - document.addEventListener('DOMContentLoaded', cb) - } else { - document.attachEvent('onreadystatechange', function() { - if (document.readyState == 'complete') cb() - }) - } -} - -const codeCellId = index => `codecell${index}` - -// Clears selected text since ClipboardJS will select the text when copying -const clearSelection = () => { - if (window.getSelection) { - window.getSelection().removeAllRanges() - } else if (document.selection) { - document.selection.empty() - } -} - -// Changes tooltip text for two seconds, then changes it back -const temporarilyChangeTooltip = (el, oldText, newText) => { - el.setAttribute('data-tooltip', newText) - el.classList.add('success') - setTimeout(() => el.setAttribute('data-tooltip', oldText), 2000) - setTimeout(() => el.classList.remove('success'), 2000) -} - -// Changes the copy button icon for two seconds, then changes it back -const temporarilyChangeIcon = (el) => { - el.innerHTML = iconCheck; - setTimeout(() => {el.innerHTML = iconCopy}, 2000) -} - -const addCopyButtonToCodeCells = () => { - // If ClipboardJS hasn't loaded, wait a bit and try again. This - // happens because we load ClipboardJS asynchronously. - if (window.ClipboardJS === undefined) { - setTimeout(addCopyButtonToCodeCells, 250) - return - } - - // Add copybuttons to all of our code cells - const codeCells = document.querySelectorAll('div.highlight pre') - codeCells.forEach((codeCell, index) => { - const id = codeCellId(index) - codeCell.setAttribute('id', id) - - const clipboardButton = id => - `` - codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) - }) - -function escapeRegExp(string) { - return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string -} - -// Callback when a copy button is clicked. Will be passed the node that was clicked -// should then grab the text and replace pieces of text that shouldn't be used in output -function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { - - var regexp; - var match; - - // Do we check for line continuation characters and "HERE-documents"? - var useLineCont = !!lineContinuationChar - var useHereDoc = !!hereDocDelim - - // create regexp to capture prompt and remaining line - if (isRegexp) { - regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') - } else { - regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') - } - - const outputLines = []; - var promptFound = false; - var gotLineCont = false; - var gotHereDoc = false; - const lineGotPrompt = []; - for (const line of textContent.split('\n')) { - match = line.match(regexp) - if (match || gotLineCont || gotHereDoc) { - promptFound = regexp.test(line) - lineGotPrompt.push(promptFound) - if (removePrompts && promptFound) { - outputLines.push(match[2]) - } else { - outputLines.push(line) - } - gotLineCont = line.endsWith(lineContinuationChar) & useLineCont - if (line.includes(hereDocDelim) & useHereDoc) - gotHereDoc = !gotHereDoc - } else if (!onlyCopyPromptLines) { - outputLines.push(line) - } else if (copyEmptyLines && line.trim() === '') { - outputLines.push(line) - } - } - - // If no lines with the prompt were found then just use original lines - if (lineGotPrompt.some(v => v === true)) { - textContent = outputLines.join('\n'); - } - - // Remove a trailing newline to avoid auto-running when pasting - if (textContent.endsWith("\n")) { - textContent = textContent.slice(0, -1) - } - return textContent -} - - -var copyTargetText = (trigger) => { - var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); - return formatCopyText(target.innerText, '', false, true, true, true, '', '') -} - - // Initialize with a callback so we can modify the text before copy - const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) - - // Update UI with error/success messages - clipboard.on('success', event => { - clearSelection() - temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) - temporarilyChangeIcon(event.trigger) - }) - - clipboard.on('error', event => { - temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) - }) -} - -runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/mdns/en/_static/copybutton_funcs.js b/mdns/en/_static/copybutton_funcs.js deleted file mode 100644 index b9168c556..000000000 --- a/mdns/en/_static/copybutton_funcs.js +++ /dev/null @@ -1,58 +0,0 @@ -function escapeRegExp(string) { - return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string -} - -// Callback when a copy button is clicked. Will be passed the node that was clicked -// should then grab the text and replace pieces of text that shouldn't be used in output -export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { - - var regexp; - var match; - - // Do we check for line continuation characters and "HERE-documents"? - var useLineCont = !!lineContinuationChar - var useHereDoc = !!hereDocDelim - - // create regexp to capture prompt and remaining line - if (isRegexp) { - regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') - } else { - regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') - } - - const outputLines = []; - var promptFound = false; - var gotLineCont = false; - var gotHereDoc = false; - const lineGotPrompt = []; - for (const line of textContent.split('\n')) { - match = line.match(regexp) - if (match || gotLineCont || gotHereDoc) { - promptFound = regexp.test(line) - lineGotPrompt.push(promptFound) - if (removePrompts && promptFound) { - outputLines.push(match[2]) - } else { - outputLines.push(line) - } - gotLineCont = line.endsWith(lineContinuationChar) & useLineCont - if (line.includes(hereDocDelim) & useHereDoc) - gotHereDoc = !gotHereDoc - } else if (!onlyCopyPromptLines) { - outputLines.push(line) - } else if (copyEmptyLines && line.trim() === '') { - outputLines.push(line) - } - } - - // If no lines with the prompt were found then just use original lines - if (lineGotPrompt.some(v => v === true)) { - textContent = outputLines.join('\n'); - } - - // Remove a trailing newline to avoid auto-running when pasting - if (textContent.endsWith("\n")) { - textContent = textContent.slice(0, -1) - } - return textContent -} diff --git a/mdns/en/_static/css/badge_only.css b/mdns/en/_static/css/badge_only.css deleted file mode 100644 index e380325bc..000000000 --- a/mdns/en/_static/css/badge_only.css +++ /dev/null @@ -1 +0,0 @@ -.fa:before{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} \ No newline at end of file diff --git a/mdns/en/_static/css/fonts/Roboto-Slab-Bold.woff b/mdns/en/_static/css/fonts/Roboto-Slab-Bold.woff deleted file mode 100644 index 6cb600001..000000000 Binary files a/mdns/en/_static/css/fonts/Roboto-Slab-Bold.woff and /dev/null differ diff --git a/mdns/en/_static/css/fonts/Roboto-Slab-Bold.woff2 b/mdns/en/_static/css/fonts/Roboto-Slab-Bold.woff2 deleted file mode 100644 index 7059e2314..000000000 Binary files a/mdns/en/_static/css/fonts/Roboto-Slab-Bold.woff2 and /dev/null differ diff --git a/mdns/en/_static/css/fonts/Roboto-Slab-Regular.woff b/mdns/en/_static/css/fonts/Roboto-Slab-Regular.woff deleted file mode 100644 index f815f63f9..000000000 Binary files a/mdns/en/_static/css/fonts/Roboto-Slab-Regular.woff and /dev/null differ diff --git a/mdns/en/_static/css/fonts/Roboto-Slab-Regular.woff2 b/mdns/en/_static/css/fonts/Roboto-Slab-Regular.woff2 deleted file mode 100644 index f2c76e5bd..000000000 Binary files a/mdns/en/_static/css/fonts/Roboto-Slab-Regular.woff2 and /dev/null differ diff --git a/mdns/en/_static/css/fonts/fontawesome-webfont.eot b/mdns/en/_static/css/fonts/fontawesome-webfont.eot deleted file mode 100644 index e9f60ca95..000000000 Binary files a/mdns/en/_static/css/fonts/fontawesome-webfont.eot and /dev/null differ diff --git a/mdns/en/_static/css/fonts/fontawesome-webfont.svg b/mdns/en/_static/css/fonts/fontawesome-webfont.svg deleted file mode 100644 index 855c845e5..000000000 --- a/mdns/en/_static/css/fonts/fontawesome-webfont.svg +++ /dev/null @@ -1,2671 +0,0 @@ - - - - -Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 - By ,,, -Copyright Dave Gandy 2016. All rights reserved. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/mdns/en/_static/css/fonts/fontawesome-webfont.ttf b/mdns/en/_static/css/fonts/fontawesome-webfont.ttf deleted file mode 100644 index 35acda2fa..000000000 Binary files a/mdns/en/_static/css/fonts/fontawesome-webfont.ttf and /dev/null differ diff --git a/mdns/en/_static/css/fonts/fontawesome-webfont.woff b/mdns/en/_static/css/fonts/fontawesome-webfont.woff deleted file mode 100644 index 400014a4b..000000000 Binary files a/mdns/en/_static/css/fonts/fontawesome-webfont.woff and /dev/null differ diff --git a/mdns/en/_static/css/fonts/fontawesome-webfont.woff2 b/mdns/en/_static/css/fonts/fontawesome-webfont.woff2 deleted file mode 100644 index 4d13fc604..000000000 Binary files a/mdns/en/_static/css/fonts/fontawesome-webfont.woff2 and /dev/null differ diff --git a/mdns/en/_static/css/fonts/lato-bold-italic.woff b/mdns/en/_static/css/fonts/lato-bold-italic.woff deleted file mode 100644 index 88ad05b9f..000000000 Binary files a/mdns/en/_static/css/fonts/lato-bold-italic.woff and /dev/null differ diff --git a/mdns/en/_static/css/fonts/lato-bold-italic.woff2 b/mdns/en/_static/css/fonts/lato-bold-italic.woff2 deleted file mode 100644 index c4e3d804b..000000000 Binary files a/mdns/en/_static/css/fonts/lato-bold-italic.woff2 and /dev/null differ diff --git a/mdns/en/_static/css/fonts/lato-bold.woff b/mdns/en/_static/css/fonts/lato-bold.woff deleted file mode 100644 index c6dff51f0..000000000 Binary files a/mdns/en/_static/css/fonts/lato-bold.woff and /dev/null differ diff --git a/mdns/en/_static/css/fonts/lato-bold.woff2 b/mdns/en/_static/css/fonts/lato-bold.woff2 deleted file mode 100644 index bb195043c..000000000 Binary files a/mdns/en/_static/css/fonts/lato-bold.woff2 and /dev/null differ diff --git a/mdns/en/_static/css/fonts/lato-normal-italic.woff b/mdns/en/_static/css/fonts/lato-normal-italic.woff deleted file mode 100644 index 76114bc03..000000000 Binary files a/mdns/en/_static/css/fonts/lato-normal-italic.woff and /dev/null differ diff --git a/mdns/en/_static/css/fonts/lato-normal-italic.woff2 b/mdns/en/_static/css/fonts/lato-normal-italic.woff2 deleted file mode 100644 index 3404f37e2..000000000 Binary files a/mdns/en/_static/css/fonts/lato-normal-italic.woff2 and /dev/null differ diff --git a/mdns/en/_static/css/fonts/lato-normal.woff b/mdns/en/_static/css/fonts/lato-normal.woff deleted file mode 100644 index ae1307ff5..000000000 Binary files a/mdns/en/_static/css/fonts/lato-normal.woff and /dev/null differ diff --git a/mdns/en/_static/css/fonts/lato-normal.woff2 b/mdns/en/_static/css/fonts/lato-normal.woff2 deleted file mode 100644 index 3bf984332..000000000 Binary files a/mdns/en/_static/css/fonts/lato-normal.woff2 and /dev/null differ diff --git a/mdns/en/_static/css/theme.css b/mdns/en/_static/css/theme.css deleted file mode 100644 index ba75bdc2e..000000000 --- a/mdns/en/_static/css/theme.css +++ /dev/null @@ -1,4 +0,0 @@ -html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,.wy-nav-top a,.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! - * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome - * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs li{display:inline-block}.wy-breadcrumbs li.wy-breadcrumbs-aside{float:right}.wy-breadcrumbs li a{display:inline-block;padding:5px}.wy-breadcrumbs li a:first-child{padding-left:0}.rst-content .wy-breadcrumbs li tt,.wy-breadcrumbs li .rst-content tt,.wy-breadcrumbs li code{padding:5px;border:none;background:none}.rst-content .wy-breadcrumbs li tt.literal,.wy-breadcrumbs li .rst-content tt.literal,.wy-breadcrumbs li code.literal{color:#404040}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.selectors{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;font-size:110%;line-height:1.6em;color:hsla(0,0%,100%,.3)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}footer .footer li{display:inline-block}footer .footer li.footer-aside{float:right;display:inline-block}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.field-list>dt:after,html.writer-html5 .rst-content dl.footnote>dt:after{content:":"}html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.footnote>dt>span.brackets{margin-right:.5rem}html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{font-style:italic}html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.footnote>dd p,html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{font-size:inherit;line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.field-list)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dl:not(.field-list)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.field-list)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dl:not(.field-list)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel{border:1px solid #7fbbe3;background:#e7f2fa;font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/mdns/en/_static/doctools.js b/mdns/en/_static/doctools.js deleted file mode 100644 index e1bfd708b..000000000 --- a/mdns/en/_static/doctools.js +++ /dev/null @@ -1,358 +0,0 @@ -/* - * doctools.js - * ~~~~~~~~~~~ - * - * Sphinx JavaScript utilities for all documentation. - * - * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -/** - * select a different prefix for underscore - */ -$u = _.noConflict(); - -/** - * make the code below compatible with browsers without - * an installed firebug like debugger -if (!window.console || !console.firebug) { - var names = ["log", "debug", "info", "warn", "error", "assert", "dir", - "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", - "profile", "profileEnd"]; - window.console = {}; - for (var i = 0; i < names.length; ++i) - window.console[names[i]] = function() {}; -} - */ - -/** - * small helper function to urldecode strings - * - * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL - */ -jQuery.urldecode = function(x) { - if (!x) { - return x - } - return decodeURIComponent(x.replace(/\+/g, ' ')); -}; - -/** - * small helper function to urlencode strings - */ -jQuery.urlencode = encodeURIComponent; - -/** - * This function returns the parsed url parameters of the - * current request. Multiple values per key are supported, - * it will always return arrays of strings for the value parts. - */ -jQuery.getQueryParameters = function(s) { - if (typeof s === 'undefined') - s = document.location.search; - var parts = s.substr(s.indexOf('?') + 1).split('&'); - var result = {}; - for (var i = 0; i < parts.length; i++) { - var tmp = parts[i].split('=', 2); - var key = jQuery.urldecode(tmp[0]); - var value = jQuery.urldecode(tmp[1]); - if (key in result) - result[key].push(value); - else - result[key] = [value]; - } - return result; -}; - -/** - * highlight a given string on a jquery object by wrapping it in - * span elements with the given class name. - */ -jQuery.fn.highlightText = function(text, className) { - function highlight(node, addItems) { - if (node.nodeType === 3) { - var val = node.nodeValue; - var pos = val.toLowerCase().indexOf(text); - if (pos >= 0 && - !jQuery(node.parentNode).hasClass(className) && - !jQuery(node.parentNode).hasClass("nohighlight")) { - var span; - var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); - if (isInSVG) { - span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); - } else { - span = document.createElement("span"); - span.className = className; - } - span.appendChild(document.createTextNode(val.substr(pos, text.length))); - node.parentNode.insertBefore(span, node.parentNode.insertBefore( - document.createTextNode(val.substr(pos + text.length)), - node.nextSibling)); - node.nodeValue = val.substr(0, pos); - if (isInSVG) { - var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); - var bbox = node.parentElement.getBBox(); - rect.x.baseVal.value = bbox.x; - rect.y.baseVal.value = bbox.y; - rect.width.baseVal.value = bbox.width; - rect.height.baseVal.value = bbox.height; - rect.setAttribute('class', className); - addItems.push({ - "parent": node.parentNode, - "target": rect}); - } - } - } - else if (!jQuery(node).is("button, select, textarea")) { - jQuery.each(node.childNodes, function() { - highlight(this, addItems); - }); - } - } - var addItems = []; - var result = this.each(function() { - highlight(this, addItems); - }); - for (var i = 0; i < addItems.length; ++i) { - jQuery(addItems[i].parent).before(addItems[i].target); - } - return result; -}; - -/* - * backward compatibility for jQuery.browser - * This will be supported until firefox bug is fixed. - */ -if (!jQuery.browser) { - jQuery.uaMatch = function(ua) { - ua = ua.toLowerCase(); - - var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || - /(webkit)[ \/]([\w.]+)/.exec(ua) || - /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || - /(msie) ([\w.]+)/.exec(ua) || - ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || - []; - - return { - browser: match[ 1 ] || "", - version: match[ 2 ] || "0" - }; - }; - jQuery.browser = {}; - jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; -} - -/** - * Small JavaScript module for the documentation. - */ -var Documentation = { - - init : function() { - this.fixFirefoxAnchorBug(); - this.highlightSearchWords(); - this.initIndexTable(); - this.initOnKeyListeners(); - }, - - /** - * i18n support - */ - TRANSLATIONS : {}, - PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; }, - LOCALE : 'unknown', - - // gettext and ngettext don't access this so that the functions - // can safely bound to a different name (_ = Documentation.gettext) - gettext : function(string) { - var translated = Documentation.TRANSLATIONS[string]; - if (typeof translated === 'undefined') - return string; - return (typeof translated === 'string') ? translated : translated[0]; - }, - - ngettext : function(singular, plural, n) { - var translated = Documentation.TRANSLATIONS[singular]; - if (typeof translated === 'undefined') - return (n == 1) ? singular : plural; - return translated[Documentation.PLURALEXPR(n)]; - }, - - addTranslations : function(catalog) { - for (var key in catalog.messages) - this.TRANSLATIONS[key] = catalog.messages[key]; - this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); - this.LOCALE = catalog.locale; - }, - - /** - * add context elements like header anchor links - */ - addContextElements : function() { - $('div[id] > :header:first').each(function() { - $('\u00B6'). - attr('href', '#' + this.id). - attr('title', _('Permalink to this headline')). - appendTo(this); - }); - $('dt[id]').each(function() { - $('\u00B6'). - attr('href', '#' + this.id). - attr('title', _('Permalink to this definition')). - appendTo(this); - }); - }, - - /** - * workaround a firefox stupidity - * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075 - */ - fixFirefoxAnchorBug : function() { - if (document.location.hash && $.browser.mozilla) - window.setTimeout(function() { - document.location.href += ''; - }, 10); - }, - - /** - * highlight the search words provided in the url in the text - */ - highlightSearchWords : function() { - var params = $.getQueryParameters(); - var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; - if (terms.length) { - var body = $('div.body'); - if (!body.length) { - body = $('body'); - } - window.setTimeout(function() { - $.each(terms, function() { - body.highlightText(this.toLowerCase(), 'highlighted'); - }); - }, 10); - $('') - .appendTo($('#searchbox')); - } - }, - - /** - * init the domain index toggle buttons - */ - initIndexTable : function() { - var togglers = $('img.toggler').click(function() { - var src = $(this).attr('src'); - var idnum = $(this).attr('id').substr(7); - $('tr.cg-' + idnum).toggle(); - if (src.substr(-9) === 'minus.png') - $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); - else - $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); - }).css('display', ''); - if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { - togglers.click(); - } - }, - - /** - * helper function to hide the search marks again - */ - hideSearchWords : function() { - $('#searchbox .highlight-link').fadeOut(300); - $('span.highlighted').removeClass('highlighted'); - var url = new URL(window.location); - url.searchParams.delete('highlight'); - window.history.replaceState({}, '', url); - }, - - /** - * helper function to focus on search bar - */ - focusSearchBar : function() { - $('input[name=q]').first().focus(); - }, - - /** - * make the url absolute - */ - makeURL : function(relativeURL) { - return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; - }, - - /** - * get the current relative url - */ - getCurrentURL : function() { - var path = document.location.pathname; - var parts = path.split(/\//); - $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { - if (this === '..') - parts.pop(); - }); - var url = parts.join('/'); - return path.substring(url.lastIndexOf('/') + 1, path.length - 1); - }, - - initOnKeyListeners: function() { - // only install a listener if it is really needed - if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && - !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) - return; - - $(document).keydown(function(event) { - var activeElementType = document.activeElement.tagName; - // don't navigate when in search box, textarea, dropdown or button - if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT' - && activeElementType !== 'BUTTON') { - if (event.altKey || event.ctrlKey || event.metaKey) - return; - - if (!event.shiftKey) { - switch (event.key) { - case 'ArrowLeft': - if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) - break; - var prevHref = $('link[rel="prev"]').prop('href'); - if (prevHref) { - window.location.href = prevHref; - return false; - } - break; - case 'ArrowRight': - if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) - break; - var nextHref = $('link[rel="next"]').prop('href'); - if (nextHref) { - window.location.href = nextHref; - return false; - } - break; - case 'Escape': - if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) - break; - Documentation.hideSearchWords(); - return false; - } - } - - // some keyboard layouts may need Shift to get / - switch (event.key) { - case '/': - if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) - break; - Documentation.focusSearchBar(); - return false; - } - } - }); - } -}; - -// quick alias for translations -_ = Documentation.gettext; - -$(document).ready(function() { - Documentation.init(); -}); diff --git a/mdns/en/_static/documentation_options.js b/mdns/en/_static/documentation_options.js deleted file mode 100644 index f8d32270a..000000000 --- a/mdns/en/_static/documentation_options.js +++ /dev/null @@ -1,14 +0,0 @@ -var DOCUMENTATION_OPTIONS = { - URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), - VERSION: 'latest', - LANGUAGE: 'en', - COLLAPSE_INDEX: false, - BUILDER: 'html', - FILE_SUFFIX: '.html', - LINK_SUFFIX: '.html', - HAS_SOURCE: true, - SOURCELINK_SUFFIX: '.txt', - NAVIGATION_WITH_KEYS: false, - SHOW_SEARCH_SUMMARY: true, - ENABLE_SEARCH_SHORTCUTS: true, -}; \ No newline at end of file diff --git a/mdns/en/_static/espressif-logo.svg b/mdns/en/_static/espressif-logo.svg deleted file mode 100644 index 1725310bf..000000000 --- a/mdns/en/_static/espressif-logo.svg +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/mdns/en/_static/espressif2.pdf b/mdns/en/_static/espressif2.pdf deleted file mode 100644 index 05d20ec86..000000000 --- a/mdns/en/_static/espressif2.pdf +++ /dev/null @@ -1,785 +0,0 @@ -%PDF-1.5 % -1 0 obj <>/OCGs[5 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream - - - - - Adobe Illustrator CC 2015 (Macintosh) - 2018-07-17T18:09:55+08:00 - 2018-07-17T18:09:55+08:00 - 2018-07-17T18:09:55+08:00 - - - - 256 - 256 - JPEG - /9j/4AAQSkZJRgABAgEAkACQAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAAkAAAAAEA AQCQAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq8Q/Pz8+Na8h6zp+i+X4bOe8lgNzftdq8nBWbjCqiOSOhP BieVdqYCWUY28r/6G5/M/wD5ZNJ/6R5/+q+DiZcARFl/zl/+Yccym70vSriDfmiR3ETnbaj+s4G/ +SceJeBk+lf85lW7ShdW8sPHFTeW0uhI1a/77kjjHT/Lx4kcDP8Ay5/zkz+VGstHHNfy6RcSEgRa hEY1BHjLGZYVG37TjDbHhL0vTNW0vVbRLzTLyG+tHFUnt5FljPyZCRhQisVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVSfzR5w8s+VdOOo+YNQi0+1rRWkJLO1CeMca1d2oOign FWI6b/zkP+T9/snmGOB6043MM8Peg+J4wm/XrgtNFmek+Z/LWsAHSNWs9RqK/wCi3EU2w6/YZsKE zxV2KvMPzL/5x+8neetQl1e4mudP1uVFRryF/Ujb0wFXnDJVaBR+wV8cBCRKnz151/5xl/Mby6sl xYQpr9gm/qWIPrgVI+K3b46/6nLBTMSeSyxSwyNFKjRyoeLo4KsCOxB6ZFktxV2KphonmHXdCvFv dG1C40+6Ug+rbSNGTQ1o3EjkPY7YVp7d5F/5y18y6eY7XzdZrrFoKA3tuFgu1G9SyikUnbb4PmcP EwMX0f5L/MPyh5zsjdeXtRjuuABntj8FxFUkD1Imo61INDSh7HJMSGR4odirsVdirsVdirsVdirs VdirsVdirsVdiqC1rWdM0XSrrVdUuFtdPs0MtxO/RVHy3JJ2AG5O2Kvn3y7/AM5ZW9z5+uLfVrYW vk+6ZYbC44/v7fiaCaahPJZK/EB9nalaGotlwvoyGaGeGOeCRZYZVDxSoQysrCqsrDYgjocLFfir w/8ANz/nJfRvLLTaP5WEWra4pKTXJPK0tmHWpX+9cHbiDQdz2wEshG3yl5i8z+YPMmpPqWu38uoX snWWZq0H8qKKKi/5KgDIswEswJXRySRuHjYo6mqspIIPsRirM/Ln50fmf5e4Lp/mG6aBBRba6YXU QHgEnEnH/Y0w2jhD1ryp/wA5hahFwh81aIlwgADXmnMY326kwyllYn2dRh4mJg9r8m/nN+XPm4pF pWrxpev00+6/0e4rXoqvQOf9QtkrYkM2xQwvz/8AlB5E88pz1qx4agF4x6pakQ3SgEbF6MsgoKAS KwG9KYKSDT5g/Mn/AJxs86+Ullv9Mrr+ixjk9xbIVuIlABJltwXNBv8AEhYUFW44CGYk8iyLJ2Ku xVF6Tq+qaPqEOo6XdS2V9btyhuIWKOp+Y7HuO+FX05+Un/OUlrfmHRvPbJaXdFSHXFASCVun+kKA BE3+WPg8QuSBazF9EI6uodCGVgCrA1BB6EHCxbxV2KuxV2KuxV2KuxV2KuxV2KuxVpmVVLMQqqKs x2AA7nFXxj/zkF+c0nnTVzoujzH/AAvp0n7tl2F1MuxmbxQb+mPp+USWyIY9+Tv5Sap+YevGEM1r olnRtTvwK0B6RR12Mj9vAbnsCAFJp9yaPo+m6NpdrpWmQLbWFnGIreBOiovz3J8SeuTa3hf/ADlZ +YXmTQbPTPL2kT/VLfWIp3v7iOomZEKqIlb9lW5HlTc9NhWoJZRD5PyDY7FXYq7FXYq7FXAkGo64 q9K8if8AOQP5i+UjFAt7+ldLjoPqF+WlAUVFI5a+olK7UNPbDbExfS35d/8AOQ3kPziY7SSb9C6y 9ALC8ZQrse0M+yP8jxb/ACckCwIp6hhQ8o/NP/nHjyl50E+o2Cro3mN+Tm8hX9zPITX/AEmIbEk1 q60bep5dMBCRKnyP528heaPJertpmv2bW8pqbedfignQH7cMg2Ybj3HcA7ZEhsBtj2BLsVdir2j8 kf8AnIO/8nyQ6H5ieS88sMQkUm7y2dSByTqWiHdO37PgZAsTF9hWN9Z39nBe2U6XNpcostvcRMGR 0YVVlYbEEZJrVsVdirsVdirsVdirsVdirsVdirwL/nKP81n0bS18maRNw1LU4+eqTIfiitTsIxTo 03f/ACf9bASyiHzR5J8n6t5w8y2WgaWtbm7ejSt9iKMbySvT9lF3/Ab5EMyaffHknydo3k/y3aaD pMfG2tl+OQgc5ZT9uWQjqzH+nQZNqTzFXzF/zmbbxrc+UrgV9SRL+NvCkZtyP+ThyMmcHzZkWbsV dirsVdirsVdirsVdir138sP+cj/N/lForDVmfXNBWi/V5n/0iFdh+5mapooGyNt4cckCxMX1l5K8 ++VvOmlDUtAvVuYxQTwH4ZoWIrwljO6n8D2JyTWQjPM/lXy/5o0iXSNeskvrCUhvTeoKuKgPG60Z HFTRlNcVfHP5xfkJr3kOaXU7HnqXlVnAjvQKy24c0VLoKABueIkA4safZJC5AhsEreVYGTsVdir2 j/nHz87ZPJ9+nl7XJi3li9k/dyuSfqczn7YqdomP2x2+141kCxkH2Ojq6h0IZWAKsDUEHoQck1t4 q7FXYq7FXYq7FXYq7FUn84eaNP8AK3lnUfMGoH/RtPhMpQGhd+kcanxdyFHzxV+fPmTzBqXmLXb7 W9Tk9W+v5WmmbsK9FXwVVoqjsBkG0B9e/wDONv5Xr5T8prreoQ8de1xFlk5D4obU/FFFuKgt9t/e g/ZyQDCRt7DhYuxV5x+cP5M235lfoj19VfTP0T9Y48IRN6n1n0utXSnH0fxwEJBp5nP/AM4ZWxA9 DzY6HevqWIcHw6XCUwcLLjSK8/5w683oD9S13T5z2Eyzwj/hVmx4V42Iax/zjV+b2mq0i6Sl/EnV rOeKQ/QjFJD9C40niDz/AFny35h0Sb0dZ0y606WtAl1DJCT8uYWv0YE2l2BLsVdirsVdirsVTXyz 5p1/yxq0WraHeyWV7CdnQ/Cy1qUkU/C6HurCmFBD7D/Jz8/dE89RppepCPTPM6rva8qQ3PEbtblj WvcxncDxFTkgWsinqlxb29zby21zEk1vMjRzQyKHR0cUZWU1BBBoQcKHyT+ev/OPNx5ba48yeVIX n8vUaW9sgeUlmK7sv7Tw7+5Uddt8iQzjJ4TkWbsVdir6n/5xb/Ns31qvkTWZh9btELaHM7fFLCgq 1vv+1EBVP8io/ZyYLXIPonCxdirsVdirsVdirsVdir5g/wCcu/PbSXWneSrST93CBf6oAertVYIz /qrycj/KXwyJZxDzj8gPy+HnLz/bLdRepo+lUvdRqKqwQ/uoj/xkfqP5QcACZF9zZNrdirsVQN9r 2h2BIvtRtbQjqJ5o4zv0+0RiqBh89+SJpDFD5h0ySRTxZEvLdmB8CA/XFU5gngniWWCRZYmrxkQh lNDQ0I264qvxVSurS1u7d7e6hS4t5BSSGVQ6MAa7qwIOKvNPNn/OOH5W+YfUlj046PePU/WNOb0V 5HpWEhoaV8FHzwUkSLwzzv8A84qeeNFEt1oEsfmCxSrCKMejdhev90xKvT/Ick/y4KZiTxi8sryy uZLW9gktrmI8ZYJkaORT4MrAEZFko4q7FXYq7FV8M00EyTQSNFNGweORCVZWBqCrDcEYq+sPyH/5 yGTXzb+V/Nsyx62fgsNTaipdeEcnQLN4Ho/+t9qYLXKL31lVlKsAVIoQdwQcLF8jf85D/kUfLc83 mzy1AB5fncG+sYlP+hyP+0oHSFm/4EmnSlIkM4yeEZFm7FUZo+r6jo+qWuqabM1vfWUqzW8y9VdD UfMeI7jCr9Afy886WXnPyhp3mG1AT61HS5gBJ9K4T4ZY6kAni4NDTcUOTaiGR4odirsVdirsVdiq ld3dvZ2k13cuIra3jaWaQ1oqICzMaeAGKvzt85+ZLnzN5q1TX7n+81G4eYL/ACoTSNN67IgCj5ZA toD67/5xk8lDy9+XEOozJx1DzAwvZiRQiAVW3X5cKuP9bJBhI7vXMLF47+an/OSPlnyhNNpWjout 6/ESkqI1La3cbESyCvJlPVE+RKnASyEbfNPm386vzK80yudQ1qaC1atLGyY20AB/ZKxkFx/rljkb ZiIYOSSancnqcCXYqr2l/fWUnqWdzLbSfzwu0Z291I8cKsx0P87fzV0Z0Np5kvJUTYRXbi7Tj4Uu BJt8sbRwh6Z5Z/5zB8x23CLzHo1vqEY2a4tGa2l+ZVvVRj8uOHiYmD2byd/zkB+WXmgxww6mNNvn oBZ6iBbsSR0VyTExrtQPX2w2xIL0YEEVG4PQ4UMY87/lr5N862f1fX9PSeRRSG9T93cxdfsSr8VN 68TVfEYpBfLH5o/841+avKay6lopbXNCSrM8a/6VAoFayxL9pR/On0hciQzEnjuRZOxV2KuxVtWZ WDKSGBqCNiCMVfWX/OPH58HX0h8peaLiuuRrx0y/f/j6RRX05D/v5QNj+2P8r7UwWuUXvNzbW91b y21zEk9vOjRzQyKHR0ccWVlaoZWBoQcLF8Ufn3+Ts3kPXvr2mRO3lXUnJspN3FvKasbV2NTsATGW 3Ze5KscgQ2RNvKsDJ2Kvfv8AnErz0dP8y3nlG6kpaawpuLIE7LdwLVlAp/uyIb7/ALA8clFhIPrL JMHYq7FXYq7FXYq8w/5yQ8yNof5T6oI2KT6q0emxEGm09TKNvGFHGApjzfGnlLQJvMPmjStDh2fU bqK3LD9lXcBm/wBitTkQ2Ev0VtbW3tLWG1t0EdvbosUMY6KiAKqivgBk2p8/f85IfnjcaQZfJflm 4MepOlNY1CM/FAjiogiYHaRlNWb9kHb4vsgllEPlUkk1O5PU5BsdirsVdirsVdirsVdirPfIP52+ f/JTpFp98bvS1I5aXeVlgp4R1IeL/YEe4OEFBi+oPyz/AOchvJfnRorC4b9C69JRVsLlgY5XPaCa iq5/yWCt4A5IFrMaep4UPFfzg/5xv0TzUk+seWlj0rzFu7xAcba6buHUbRuf51G/7Q7gEMhKnyPr eh6toeqXGlatayWd/atwmt5RxYHsfcEbgjYjcZFstA4FdirsVXwTTQTRzwu0c0TB4pEJDKymqsCO hBxV9q/kF+ccfnrRDpuqOq+Z9MjX60Nl+sxCii4UeNdpANgfYgZMFqIp6H5q8saR5o8v3uhavEZb C+ThIFNHUg8kdCQaOjAMpp1wofAvn3yTq/kvzReaBqa1ktzyguACEngbeOZPZh18DUdRkCG0G2PY Eph5e1u80LXdP1myYrdafcR3MVCRUxsG4mnZqUPthUv0W0nU7TVdLs9Ts3D2l9DHcQOO8cqh1P3H JtKKxV2KuxV2KuxV8y/85ka3WTy3oaHoJ72YfMrFF+p8jJnBhv8AzipoA1L80Vv3UGLR7Oa5BO49 SSkCD50lYj5YhMn1R+ZHm+Pyh5I1fzCy85LKH/R0IqGnlYRQg/5PqOvL2yTAB+fN9e3d9eT3t5K0 93cyNNcTOas8jkszE+JJyttUcVdirsVdirsVdirsVdirsVcCQajrir3L8of+cltZ8uGDRvNbSapo QokV4avdWyjYbn+9jH8p+Idj2yQLAxfWWj6zpetaZb6ppV1HeafdIHguIjyVgf1EHYg7g7HfJMGH fmx+UOgfmFpPp3AFrrVsjfo7U1HxITvwkA+3GT1HbqMBCQafEXmryrrnlbXLnRdatjbX1saEHdXU /Zkjb9pG7HItgKU4EuxV2Kpt5V8z6t5X8wWWu6TL6V7ZSB068XXo8bgdUdaqw8MKCH315C866V50 8rWWv6aaR3K0ngJBaGZdpInp3U/eKHvk2ohhH/OQ/wCVg86eUWvtOg5+YtGVprIIpLzxdZbfbckg ckFPtCg+0cBCYmnxNkG12Kvtv/nGbzG2s/lRYQySGS40iWXT5SRQhUIkiHQbLFKi19vHJhqlzeq4 UOxV2KuxV2KvjH/nKzUZLr815LdmqthY20CL4BuUx/GXIybI8md/84a6WgtfM2qstXd7a1jbfYKJ JHHhvyXGKJsg/wCcvNUltvy906wjcqL/AFFPWUU+KOGKR+J/2fA/RhKI83yFkGx2KuxVOvK3kvzV 5rvHs/L2mzajPEoaYRABUB6F3Yqi1ptU74aQSyuf/nHr844Fq/luUilf3c9rIfHokrY0jiDFdX8j +c9GSSTVtCv7GKIkPNPbTRxihpX1GXgRXuDjSbSTAl2KuxV2KuxV2Ks+/Kf84PMH5e6rztybzRLh q3+lM1FftzjJB4SDx79DhBQRb7a8p+bNC816Fb63olwLixuB8njcfajkX9l17j+FDk2pjX5vflPp H5haAbeQLba1agtpeo8alG6+m9NzG/cduowEJBp8Na5omqaFq11pGq27WuoWchiuIX6hh3B6FT1B GxG4yLaEDgV2KuxV67/zjh+Z58o+bl0q/l46DrjpDOWPww3H2YZtyAoqeLnw3/ZyQLGQfaeSa3xZ /wA5KflsvlPzqdUsIhHouvl7m3VaBYrhSDcRAA7Crh12Ao3EfZyJDZEvIsiyfTn/ADhrq0rW/mbS GI9KN7a7iHflIJI5K/RGmSiwm+lMkwdirsVdirsVfCP/ADkDdNc/nF5lkahKzRRfD0pFbxxj6aLv kC2R5Pfv+cRLRIvy2v7ig9S41WYlh14pBCoB+RqfpyQYy5sV/wCczZW9XylFU8Qt+5HapNuP4YJJ g+acizdirsVfZ3/OKqaSPyqiaz4fXGvLj9Jlac/VDfAH/wCePCmTDXLm9iwsXEAih6YqxLzR+U/5 d+Zw51jQrWWd6Vu4l9C426fvoeDn5E40kF4f53/5xCnjWW68m6p6wAqumahQOTUkhLhAF9gGQe7Z HhZCb5/8xeWPMHlvUX03XbCbT71N/SmWnJa05I26uv8AlKSMDIFLMCXYq7FXYqz78nvzY1T8vfMI uE5T6JeFU1WwH7aCoEkdekiV28ehwgoIt9zaNrGm6zpdrqumXC3VheRiW3nQ7MrfiCOhB3B2OTan kP8Azkh+UEfmnQ38y6RAP8RaVGTKiD4rq1TdkPi8YqyeO6+FAQyiafHOQbHYq7FXYq+4P+cefzEP nHyHFHeS+prOjFbO/LGrOoX9zMf9dBQ+LKcmC1EUnv5v+QI/PXkW+0VeI1BKXWlyNWi3UIPCu4FH VmjJNaBq02xKg0+BJYpIZXilUpLGxR0OxDKaEH5HINr3P/nEC9mj/MPVLQN+4uNKkd0oN3iuIeBr 12Dt9+Sixm+u8k1uxV2KuxV2Kvgb87v/ACbPmj/mOf8AUMgWyPJ9Jf8AOJnH/lVklAQf0lccqmtT 6cXTbwyQYy5sa/5zJ0ieTSfLWsKP3FrPc2kpp+1cIkke/wD0btgkmD5byLN2KuxVkXk38wvOPk26 kuPLmpSWRnoLiKiyQycenOKQMhI7GlR2OG0EW9Fg/wCcsvzUjcs6abMK14PbuB8vglQ/jh4kcAZf oP8AzmRLyij1/wAuKVp++ubCYg8qdVhlB2J7GXHiRwPWvJv57/ln5rMcNnqq2V/JxAsL8C3l5vWi KWPpyNt0R2w2xIegYUJP5p8oeW/NWmNpuv2EV/atUoJB8cbEEc4nFGRqH7SkHFXyV+cP/OO2t+TB NrOiM+qeWV+KRiK3NqO/rKoAZB/vxf8AZAdTEhsEnjmRZOxV2KuxV7l/zjT+bx8uayvlTWZ6aFqk gFnK5ottdMaDc9El6N4Gh8ckCwkH19kmD4x/5yU/K9fKfmoa1psXDQ9cZpERQAsN0N5YgB0Vq81+ kfs5EhsiXjuRZOxV2KvSv+cffPR8pfmNZGeThpmrUsL+pooErD0pD/qSU38K4QxkH3Nk2t8V/wDO TfkkeXfzGm1C3j4WGvqb2KnQT143C9OvP4/9lkS2RKY/84jf+TPu/wDtk3H/ACfgxis+T7DyTW7F XYq7FXYq+FP+chrR7X84vMaPvzlglU0oCJbaJx93KmQLZHk95/5xCvVl/LnUbUn95barKaUP2JII Spr/AKwbJBjLm9G/NTyWvnPyJquggD61NF6lg5IAW5iPOLc9AzDi3sThKAX5/wBzbXFrcy21zG0N xA7RzROKMjoeLKwPQgimVtqnirsVdirsVdirsVekflx+fXnnyS0dsk51XREoDpd27MqIABSCTdoq AbAVX/JwgsTF9bflx+a3lPz9pxuNInMd7EAbzTJqLcQnxp0dPB12+R2ydsCKZkyqylWAKkUIO4IO KHyt/wA5A/8AOPyaSlx5u8o24XS1Bk1XSoxQW4G7TQqP91fzL+x1Hw/ZiQzjJ88ZFm7FXYq4Eg1H XFX27/zjz+ZjedfJawX8vPXtG421+WNWljI/czn3dVIb/KUnvkwWqQpln5leSLPzr5N1DQLiiyTp zspj/uq5j+KJ++3LZv8AJJGFQX5+Xtnc2V5PZXUZiubaR4Z4m6rJGxVlPyIyttUcVdirgSDUdcVf ff5NecT5u/LnSNVlfnerH9Vvz3+sW/wMx93AD/7LLA1EJN/zkD+Wt/568mw2+kRLLrdhcpNZq7rG GR/3cycmIUDiwf8A2O2AhQaY9+Q/5B6z5D1qbzBrWoQS3k9m1othbBmVPUeOQs0zcKkenSgWm/XE BMpW9vwsXYq7FXYq7FXxr/zlhpj2n5pC6IHDUNPt5wRXqheEg+/7oZGTZBmf/OGuqLTzPpTfa/0W 6i6dP3kb/wDGmMUTfS+SYPm//nJP8jp7yWfzv5ZtzJcFeWt2EQJZ+I/3pjUdTQfvB3+115ZEhlGT 5fyLY7FXYq7FXYq7FXYqjtF1vVtD1S31XSLqSy1C1YPBcRGjAjsezKehU7EbHbCr7Q/JL87dN8/6 aLK9KWnmi0St3aDZZ1GxngB7fzL+z8qHJAtRFPUmVWUqwBUihB3BBwofGP8AzkT+Tw8ma2ut6NDx 8s6o54Rr0tbk1ZofZGHxR/SOwrEhsiXjuRZOxV2Ks+/JHz8/krz/AGN/LIV0u8P1PVFrt6EpA5n/ AIxvR/kCO+EFEg+8gQRUbg9Dk2p8ef8AOVfkhdF88w6/axcLLzBGZJSo+EXcNFl6fzqUf3JbIlsi XiWRZOxV2Kvo/wD5w881enf635VmcBLhF1G0UmnxxkRTADuWVkPyXJRYTD6hyTB2KuxV2KuxV2Ku xV82f85kaGTbeXNdQGkbz2M57fGFli/4hJkZM4PPv+cXdfGl/mtbWrvwh1e2msmr0L0E0f0loaD5 4hMuT7UyTW7FXh/5q/8AOMeheZZptX8sSR6NrMhLzW7Aiznc7klVBaJj3Kgj/JrvgIZCT5o82/ld 598pyONb0a4ggQn/AE1F9W2IHcTR8k360JB9sjTMEMWwJdirsVdirsVdiqN0TWtU0PVrXVtLuGtd QspBLbzoaEMPHxUjZgdiNjthV94/lR+Y+n+fvKUGsQARX0Z9DU7QdYrhRvT/ACHHxIfD3ByYaiKT rzf5W0zzV5bv9A1Na2l/EYy4ALRv1SRKgjkjAMPfFD8+/M/l3UfLfmC/0LUl43unzNDLSvFqfZda 0PF1IZfY5BtBSvAl2KuxV91fkB5xPmj8stMmmk9S+04fo68JILc7cAIx92iKE175MNRG6G/5yO8p DzD+VuoyRpzvNHK6lbkCp4w1Ewr1p6LMfoGJWJ3fD2QbXYq7FWbfkt5i/wAP/mh5e1Bn4QvdLa3B PQRXQMDE/wCr6nL6MIRLk++sm1OxV2KuxV2KuxV2KvOv+cgvLDeYPyq1mGJDJdWCrqFsF3PK2PKT bv8AuS42wFI5viTy7rVzoev6drNsSLjTrmK5jp3MThqb+NKZFsL9F9N1C11LTrXUbR/UtL2GO4t3 /mjlUOh+lTk2pE4q7FXYqkd/5E8j6jL6uoeXtMvJdz6lxZ28rb9d3QntitsZ1j8gPyj1SJkk8vQ2 rtustmz27KfECNgn0FSMFJsvG/P3/OI+o2cUt75LvjqCL8X6LvCiT08I5hxjc+zBfmcBDISfPl/Y X2n3s1jf28lreW7mOe3mUpIjjqrK1CDgZqGBXYq7FXpP5CfmQ3kjzzA91Jw0TVSlpqgY0RFZv3c5 qQP3TGpP8pbCCxkH3Pk2t8x/85feSFjm0vznaxgCb/cfqbDqXAL27kAfyh1JJ7KMjJnAvmvIs3Yq 7FX0J/zh95mNv5j1ny5K9I7+3W8t1P8Av22biwHuyS1/2OSiwmH1PdWsF3azWtwnqW9wjRTRmoDI 4KsNt9wckwfnL5k0abQ/MOp6NNUy6bdTWrE9zDIUr9NK5BtCXYEuxVdHI8ciyRsVdCGRh1BBqDir 9HPLGrDWPLelauCCNRs4Lrbb++iV/wDjbLGlMsVdirsVdirsVdiq2WKKaJ4pVDxSKUkRhUMrChBH uMVfnn+YnlObyn511fQJAQlncMLZmBHOB/jhfev2o2GQLaC+pf8AnFfzsuteQm0K4k5X+gSekFNK m1lJeFv9ieSfQMkGEhu9pwsXYq7FXYq7FXYq80/Ob8mNH8/aRJcW8aW3me3T/Qb/AOz6nHpDMQPi Q9j1U+1QQQkGnxFqGn3unX1xYX0LW95ayNDcQSCjJIh4spHiCMi2ofArsVdir7w/Ijzi3mv8s9Kv JpPUv7NTYX5Lc29W2ooZyf2pI+Dn/WyYaiE0/Nfyuvmf8u9d0cJznltXltFrT/SIP30O/vIgB9sJ UF+feVtrsVdirOPyR1xtF/NXy3dh+CS3a2kpPThdgwHl7fvK4QiXJ98ZNqfEH/OS2jrpv5vasyLx jv44LxR7vEFc/TIjHIlsjyeXZFk7FXYq+6v+cedS/SH5P+XpDXnBHLbMCD/uieSNdz1+ADpkw1Hm 9GwodirsVdirsVdirsVfN3/OXfkQy22n+dbOKrW9LHVWUD7DGtvI1PBiUJPioyJZxLxz8lPzAPkj z7ZalM5XSrr/AETVVHT0JSPjp/xW4D/QR3wAspC33mjo6K6MGRgGVlNQQdwQRk2pvFXz5+cX/OTi 6Hf3Hl/yakV1f27GO81WUc4YpFNGSFOkjL0LH4QexwEshF4FqP5xfmnqE5nn81akjmppbXElsm/+ RAY0/DI2zoMn8nf85LfmZoF1H9fvP09p4P721vaeoR34XAHqKf8AW5D2w2gxD60/L/8AMDy/558v x6zo0h4V9O6tZKCWCUCpjkAr41BGxGSYEMlxQ+Wf+cuPIMVnqNj50souKagRZ6px6euiVhkPu8al T/qjxyJZxL51yLN2KuxV9Lf84b683qeY/L8ko4lYL+2gqK1BMU7gde8QOSiwm+mskwfnV550ePRv OmvaTFGYobHULm3gRgQfSjmZY+vYoARkC2hJMCXYqr2F29lfW15HvJbSpMg6bxsGH6sKv0mgning jniblFKoeNqEVVhUGh36ZNpfKX/OYtkqeb9BvafFPp7Qk+0MzMP+T2Rkzg+f8izdiqZ+WPLupeZP MFhoWmp6l7qEqwxDsK7s7f5KKCzewwoJfoL5O8r6d5V8s6d5f08f6Lp8QjDkAM7n4pJGpQcnclj8 8m1JxirsVdirsVdirsVdiqX+YNC07X9EvdG1GP1bK/haCde9GHUeDKdwfHFX59edfKWp+UvM9/5f 1Ff9IspCqyAELJGd45Ur+y6kHIFtBt9Rf84v/mkuveXv8JanNXV9GjH1JnPxTWQ2UCvUw14f6vH3 yQLCQZl+fPnG58qflnqd9ZSGHULrhY2UoNCr3BozKezLEHZfcYlAG74QyDa7FXYq9X/5xp843Ogf mZZWJkI0/Xv9Buo6/CZCCbdqfzCT4R7MckGMhs+2ck1vPfz/ANHi1T8o/MMbrye1hW8iYdVa3dZC R/sAwPscBSOb4RyDa7FXYq9n/wCcTbkw/mo8Y6XOm3ER+QeKT/mXkosZ8n2Tkmt8Kf8AOQ0KQ/nJ 5kRBQGWBzQU3ktYnP4tkC2R5POsDJ2KuxV+jHk2b1/KGhzUp6un2r0O5+KBTljS8E/5zNgBtvKc9 d0e+jpTqHFuevtwyMmcHzFkWbsVfX/8AzjR+UbeWtGPmnWISmuatEBawuKNb2jUYAg7h5di3gKDx yYDXI29xwsXYq7FXYq7FXYq7FXYq7FXi3/OSv5Tt5q8vjzFpMPPXtGjPONftXFoKs6Ad3jJLL47j ckYCGUTT5K8ueYdV8ua5Z63pMxg1CxkEsEnUeBVh3VlJVh3GRbCH0X+dXnPT/wAxvyFsvMGlUR7D U7aTVrMmr28hilgKt/kl51Kt3B+dCeTAbF8xZFm7FXYqy/8AJ/T7i/8AzS8qwQCrpqdtcEf5FtIJ 5D9CRnCEHk/QHJtTEvzcvI7T8rvNcsgqraVdwj/WmhaJfxfEpHN+fmVtrsVdir2H/nFQE/mzCQKg WNyT7CijJRYz5Ps/JNb4Z/5yONfzo8xmlN7Qbe1lAMgWyPJ5rgZOxV2Kv0U8iAjyP5eB6/oyz/6h 0yxpYp+c35Pf8rKttKg/S/6J/RjzPy+r/WfU9YIKf3sPGnD3wEJBp5Tcf84ZXKx1t/NqSSV+zJYG MU+YuJP1YOFlxp7+Xv8AzinZ6D5kg1fzDqcWsW9p+8t7BICiNMD8LSlmbkq9eNNz12FCQEGT6Aws XYq7FXYq7FXYq7FXYq7FXYq7FXyT/wA5I/kq2g30vnDy/b00O8flqVrGNrWdz9tQOkUhPyVtuhAy JDOJeQ+VvNVzocl5Aym40jVYTa6tp5bis0R+yw6hZIm+ON6fC3tUEAsiEu1DT2tWSSN/Xsp6m1ug OIcLSoIqeLrUclrt7gglUFCYEuxV9V/84x/k7f6Jy85+YIDb31zEYtJs5BSSKKT7czg7qzj4VHXj XxyYDXIvoXCxeLf85W+a49K/LpdFSSl3r1wkXAdfq9uRNK3/AAQjX6cBZRG744yDY7FXYq95/wCc P9Kmn89atqdB9XstOMLHeokuJkKU2p9mF++Siwm+t8kwfAn51aoup/mt5ouVBAS/kthXv9Vpb16n r6VcgW2PJhWBLsVdir9I9DtJLPRdPs5BSS2toYXGx+KOMKem3bLGlG4q7FUHq+saXo2mz6nqt1HZ 2FsvKe5mbiiitOvudgO+KomGaGeGOeCRZYZVDxSoQysrCqsrDYgjocVX4q7FXYq7FXYq7FXYq7FX Yq7FVK8tLW9tJrS7iWe1uEaKeGQBkdHHFlYHqCDir4z/AD0/Iu88kXjazoyvc+Vbl9juz2jsdo5D 3Q/sP9B36xIbIyeeeVvND6HdMLizh1XSLgr9f0m6FYplXurfailUE8ZE+JfkSCAUkPoDyZ+Sn5Df mLp/6V8v32p2DKALvSI7mIyWzn9lhNFM5H8rciD864aDGyHqPk38g/yy8qXEd5Z6ab3UIiDHe37f WHVhuGVSFiVh/MqA4aYkl6HhQoX19Z2FnPe3syW9pbI0txPIeKIiCrMxPYDFXwh+c35kS+ffOlxq cfJNJth9W0mF9isCmvNh2aRqsfoHbIEtsRTBcCXYq7FX15/ziP5ZOn+RL3XZUAl1u7IicGvK3tKx r8v3rS5MNcub2nVtSttL0q81O6YJbWMElzO56BIkLsfuGFi/OG/vrm/vrm+um53N3K8870pWSRiz Gg8Scg3KGBXYqnnkbSX1fznoWloKm8v7aE+AVpVDE+wWpwhB5P0UybU7FUj84+dfLfk/R5NW167W 2tl2jTrLK9NkiTqzH/b2xV8V/m3+cWu/mHqgaYGz0S1Y/UNMViQO3qSn9uQjv0HQdyYEtgFPYP8A nE3zF5+ube50me3a68n2ob0L+Zipt59j6MJNfUVq1K/s9aitDIMZPpDCxdirsVdirsVdirsVdirs VdirsVUruztL21ltLuFLi1nUxzQSqHR0YUKsrVBBxV8nfnV/zjdfaC1x5g8nxPeaHvJdaatXntR1 LJ1aSIf8Eo61FTkSGYk8X8veY9c8uarDq2iXkljqEB/dzxHseqsDVWU91YUOBmQ+q/yt/wCcoPL2 vLDpnm309G1c0Rb2tLKZum7H+5J/yvh/yu2SBazF7kjo6K6MGRgGVlNQQdwQRhYrbi3guIJLe4jW aCVSksUihkZWFCrKaggjtir5P/PL/nHO40L6x5l8oQtPogrLe6YtWktAN2eOu7xDuOq+46RIZiTw LIs3Yqj9A0PUNe1ux0bTo/UvtQmS3gXenJzTk1AaKvVj2G+FS/RDy5oVnoGgafollX6rp1vHbRFv tMI1C8mp+03U++TaWM/nPovmrXPy71TRvLESzalfhIWVpViPocg0oVn+El1XhQkbHriUh8N+YPKv mTy7d/VNc02406f9lbiNkDe6MfhYe6nIU2ApVgSybyp+WvnvzWy/oHRbm7hatLvj6dvs3E/v5OEV Qe3KuGkEvoz8nv8AnGa48ra9Y+ZvMWoxz6hZFnt9OtVJhWRlZFZ5n4luIatAo+LuR1kAwMre/YWL x780P+ckvKflNZtP0Rk1zXlqvpxNW1hbcfvZV+0Qf2E38SuAlkI2+TPOHnbzL5w1ZtU1+9e7uT8M SnaOJOvCKMfCi/L5nfI2zAp6L+TP/OPur+dJIdY1oSad5XryWT7M10B+zCD0Q95KfL2ICDJ9haNo ulaLplvpelWqWen2q8ILeIUVR1+ZJO5J3J65JrRuKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KvFvzY /wCcavL/AJqabVvLpj0bXn+KRKUtLhu5dEBMbn+ZRv3BJrgIZCVPlPzb5L8z+UtTbTvMFhJZXG5j LCscig05RSCquvyORpmDbIfy+/Ovz55IZIdOvfrWlKatpV3WWCnfhuGj/wBgR7g4gqY2+ivJP/OV PkLWljt9dWTQL9qBmlrLak07TIKrv/OoHvkrYGJew6fqem6lapd6ddw3tpJ9i4t5Fljb5OhZThYs b8yflL+W/mMyvq3l+0luJyDLdRJ6FwxFKEzQmOQ9O7e3TGk2891b/nEf8uLqUyWN5qOnAinopLHL GPcerGz/APD4KTxFM/yq/wCceNG8g+ZLnXTqTatOYzFpyyQCI24evqMWDvzdlotQFoK+OICmVvXM LF2KobUNN07UrV7TUbWG9tJPt29xGssbfNHBU4qxjSPyf/LDSLtruw8t2SXLP6okkj9Yo4AAMfrF /T6fsUxpNsquLmzsbVpriWO1tYQOcsjLHGg6CrGijFDynzr/AM5N/lx5eV4dOmbzBqC1AhsjSAEf zXDDhT/UDYLZCJfOv5g/n/5/85erbPc/orR5Kr+jrIsgZT2lk+3J7jZfbIkshFg/l/y3r3mLUo9M 0Sxlv76X7MMK1oP5mP2VUd2YgDFJL6g/Kj/nFzS9GeHV/ObR6lqS0eLS0+K1ibr+8J/vmHh9n/Wy QDAye+qqqoVQFVRRVGwAHYYWLeKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kpfrvl7RNf06TTt asob+yk+1BOoYV8V7qw7Eb4q+fvPn/OItrKZbzyVqH1djVhpd8SydK8Y5wCw8AHB92yNMxJ4F5s/ Lzzr5TmMev6RcWSVKrclecD0NPgmTlG3X+bBTIFLdG8w69odyLrR9RudOuAa+pbSvETtTfiRXY98 Vp6ZoH/OUX5raWES6urbV4U243sA5Ef8ZITCxPuScNo4QzzS/wDnMr4OOq+WKv8A79tbqg6f77kj /wCN8eJHAyay/wCcvfy5lUC607VbaTetIoJE9txMG/4XDaOEor/obP8AKziT6ep1BA4/V46mtd/7 3tja8JQ93/zl3+W0SH6vYarcSUqoEMCLXwJaao+gHG14SxzVP+cyrYIy6V5YdnP2Jbq6Cgb9Skcb V2/y8HEngYLr/wDzlX+aOpBksGs9HiIoDaw+pJQ+L3BlFfcKMbTwvMtf82+Z/MM3ra5qt1qL/s/W JXdVp/KpPFfoGC0gL/LfkzzX5mufq2gaVcajJWjGFCUXp9uQ0RBv+0RjSkvePIn/ADiJdyNHd+dd REMezHS7A8nPtJOw4r8kVv8AWGHhYmT6H8r+T/LPlbTxYeX9Oh0+225iIfG5HRpJDV3PuxOSYJxi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdiq2aGKaJ4pkWSKQFXjcBlZTsQQdiMVee eZ/+cffyq8ws8s2jLYXUhqbnTmNs1T1Ppr+5PjumCk2XmOuf84b2xJfQvMboK/DBfQBzT3liZP8A k3g4WXGwjU/+cT/zTtHpanT9RSlQ0FwUPXoROkW+PCnjY9d/848/nHauEfy5K9a0aKe2lBA90lan 04KXiCB/5Ul+bH/Ur33/AAA/rjS8QRdr/wA4/fnFcsFj8tTqSOX72W3iFPnJIgr7Y0vEGQad/wA4 p/mvdSKtxHY2Cnq89yGAp7QLMcPCvEGaaJ/zhvKaPrnmRV6Vhsrcn5/vZWH/ACbx4Ucb0zy1/wA4 3/lPobJIdLbVbhKES6lJ64NPGIBID9MeGmPEXpNpZ2lnbpbWcEdtbRCkcEKqiKCa/CqgAb4UKuKu xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV//2Q== - - - - 1 - False - False - - 56.333333 - 57.333333 - Pixels - - - - Black - - - - - - 默认色板组 - 0 - - - - application/pdf - - - 黑鱼白底 - - - proof:pdf - xmp.did:279a03ea-f3e7-40a3-ae53-771dd64b883e - uuid:c3a85fc4-4db4-b943-8504-bfeab2b33386 - uuid:f45c532c-a658-3748-b74d-0cf5e658e16a - - uuid:28112cc2-f74a-0b45-b4e8-5de3f55b3424 - uuid:f45c532c-a658-3748-b74d-0cf5e658e16a - uuid:f45c532c-a658-3748-b74d-0cf5e658e16a - proof:pdf - - - - - saved - xmp.iid:279a03ea-f3e7-40a3-ae53-771dd64b883e - 2018-07-17T18:09:54+08:00 - Adobe Illustrator CC 2015 (Macintosh) - / - - - - Adobe PDF library 15.00 - - - - - - - - - - - - - - - - - - - - - - - - - endstream endobj 3 0 obj <> endobj 7 0 obj <>/Resources<>/Properties<>>>/Thumb 11 0 R/TrimBox[0.0 0.0 56.3333 57.3333]/Type/Page>> endobj 8 0 obj <>stream -HDWˮ\W|olׁ 'q$RS>70Ul滿}x_?(_?}oo|r0櫵~oI10nGaո4U;Q@?[`nɅqN&`TяPۋpFSS'F(5k s*GO݂1ã_*8Cu5b  -!u6G:.N5Gf'l! ES@]C`we,ÍWSpn=v*mua7jSh kO Ɓy{(Axflt-8utɈQ7& އ`fΆfDQ5x%YK7]b~ۿX@w_GƆ&a!z:>鏻hXzli*jϫF#\{<؋Bz^Bp6jÃlʫAlTf};E;Uj~vצt8$nrpGg ثHJ?3q񘻙hqDD&:U.#m0I5LY#v Ql؆5Pf1_r}3za%GFĊ$H58>>D-ZA"ч EWϘС$!Gĩ93zab_MA <GkIuNID"R2Iti_4d9G3y餲M,'&8imsԥ${KD0|%G=DԜ{J0pM% T@,I3zG86ANq0ݧ6lBc561OK%D%E B9%g83ᄖF9fe_&*U碌)x v<|%@n-;mA-7PWirWkԢg!(#oƷ-םJt8jvoX'Whλj7}o=|{.0wf+A:˓!S0ad[Y|0PM8]eS+U0?ո {TUQ* ϣ);C|;6K8tMp{$̗sF6| d^˅GZ3^S{2; W("ym!*LV~HIX9dǵYjN 9!sՏ:*>SYn 0gu>5 1L7|Qtw\MW\+>{oW@z'2Ǖȁߧ c|H~hˌuʋF9ޒ-$nߔAa3ە#ߡ3xIRzzyUtO:P0cP& -uifu^0$)>'+^%F{[갡f)S|K]lkqG9a~vwG*Caֳ?J 꽤=R+Z %&| kf xencB }{C1V^_O!Z}]4)Y:5TP)ҭ}͎l:vhAf^A b|\"QWdy|ʌLClН84LẓoEVcτeq|DK!xNh_y|O#'7s%ᓌxYytG'CI̾=Ѵwf1!էK,Cg8v{xyO|zߘ2 h۵Lgh3 gT92n/Ȧ,1foZ|- -#EL0D]gH`qy38!Яm _unO-B&2oJ:° =r+|QPf;Z&]vFX$K`&d|%(J:e+ݢ/p_Skm~]#EoE\,17]CasXocSMp2 U $Oso˒& E"_jeɍs#y0*[ʯ\t'#_](3Eu G71C2Ssv9[6; ̾<g¢M\fx_FL`i%iS!v)DOAMr5o(A'aQTg/OR0|p{@\DM{[E*>tp*=˫wyS/. `wמojr؏nU'Z~*!dIGxPPQ6ߑ F -|_~:s4T]%^L?Fp ξNNBсŠxޥ@Tix2't1~CG[9S=Hxy2d8b0QV}^n$/SDwfi28GzqoT'n9yп)R  }5}T4KVB q5<] -Ď!O5ĵ踯4(,*TF,jXqj=uOnXz' - 4S ΆL̬*p;-) -djUQ3)5W酜LMFhF!]zD4!@-jb)=ߖaBrǨ0SJ4sTY))HIuAVxc2kSP?y  Ty#Sx~ҝgvȏ r=?uu6"H -CEcӐAһFHkְxa -l?Wx_LW]t K,Zp1*ZM: -1x^#jQd`'1j]!Yô1~eD 2#07ܻFQg80i&yӁ3h"Gt% -8N5 -^i͜ P -mSU<ÀכO(ÁaYvqAES%GѪWBDWH=*R+%$^4tU)$].%2J4tFTl?]#N}kĹ^UB:hxDWP1Ѻ},M *P1p=3OW|u>&i3j %p:_{VNywl6r*E)L)5 ݁>f - )`vr`]H L nvK"Nb.02sNWr[LQ{FtggƼ -ص0Á4!@Y5b-Jܡ9e=*<(;k&lBf#݇T & -tBTkk1!F%0X][VkӜLO]t ;&c`]Id3`~(]v&LV~Y\t0]KD!OJӺ/s.-{u7*ֵ6㗮)]bg3V {F]k]Tsˠr{b1Y.I2xzՌy-! k@ڮphQcm{lPb$)Z᎝cWbh<,!sAVFԢ|%e={ikHJ{^t 4T"롣/Wr9Kn^p'vPK} );\|e44>h6rDZW -m7Mp:5xY )\het[#7z7`3-6p -/Mܚ>Sv=4>F5֖ZEIU"t$Yp?yػ -ek|ex?pȒ~/UsS*]bD|w޳ddub#gj2V°-M'O [ӍaU8T' ]' Ku=]&'ю*Fw -8\ַE)}U9 h*\Q/*<+j<4|Q$4ܗ==7>!Yg#ql%bJVF%hP>%*ov L6z!LE"eo}8M΍Uuܶ[ʂT>hN -~\`@jّP _}b| __|~ݼ~t?/|AW5/m??φhbi߃_B {.vx,!RFBE0'aR&a*Ec?/M(~(8Hu6>\Zic uA:2<4_ 〉QڅuҰn4tJ5:KȰvຕ;T7PA?x]^FNVYS65~?ݰgbHdb٢0\^cןX,#r/jJ^RR4?u,T)8VZh U oAvMcwHEaOВ< Op8}~Ij|KNd)a/5QC1EAYɏ>99uIeuD ;:ͩH7vƱHJ.!b7>OɚNƤ8ᤘdlq”l*}x@<6{(ك}>&D'osQ_`FW1!Fi+@Q%pթ5g$ˎ)"rhD+5yz2X>OFf؍&P !X$aHb0t05<t7#T XCh<3H{f@&A׌km%RjCDzQ#i+/bneڦz\?{' \20PvJV7ӳ6o,:vE:^ɓ^AKE}H]b3o!B' -Ig{(Ecң"R5e2MS$>Բ[)Fӳ 9vt`}`OHCVL E ձt%{rttJrG\k* -`QVe^IlS#g5S)T]a;N}aTUv]²Z)񀪲-E|. :g1: N6yDgwGE0:5ˈN& 0:?k.?Q=l38viV'kV țANQs˲&uc6 7^e"΍ոBv5$$D`ՃZ NPJ\ڀ7l3|xh\}lXvx#$󈖽#͵r76RX mL9JFQް3:@!oUvN9M}_q[- |Xa¤Vx%-mCZ<;_Š)bu8ʟ%] RRMH٪:zZ̤0(ov{ǑG@MH:#plύ х es|I^1܅*, ,O8.Yx$D|Ҵ2H|ھr$nݔ7rO:vR w4])7~sm( 6!"sCZHOX"}zLF80F#5Zwpn1)αlS3[]W6r@uid uI{d7:Ih_ߑ ;G#\!9{v -eաCGB}f8aSP *enl|#3e4Q  ʆ'Z9nOCl<aWGBW zAHFBh8KV3Vj)حXkFbG n̛VjLCNHpIRyI2^|$mu<- ,eؙ]$Sm=cCVUndO {)Tpm- =Q]ʃn-hbN%5O{&kLafS8-ie?} -Y=nGSy+^2bFt6D\p< {ēÁ+"64b1p$%;qxjp+ap n|IGfEՔ -Bw]Uh '1Qjč0xpTt ^:Fl4;3#|KjC]G.qŢc&©i-x8nFDk*{C 8*;6&p*/,(ٳ^Jl6Id*lcrFMJָ(!׉)A푥 Gvp0nIVwa,1$Ds:IYrxձÑwC-FAS)3t+T\yN!<ŖcX3o ;IptMpDLDUk\F3XO˰qޢ'oK5 rEI)cfG cֈ~byʹ׍=[Ȍ ->i.c7]+4ł]װhk [Ƕ,HCrmzP 5W3I/1MM' Acx"Lr8WJ<bBFlzPuחaPF$6xUxdήMNbn{U/eeUw+S!%P4_P$;囹Ј"m&]吝WSJ'>BgՈ\OI7Hj=6nTӑdQ@FtKZ\B2]IKW3rNjwz?[ cT;[7%M2+Y7N*m~ԯ,M:hǕ:l(SVj X*+AӺ:W8,)JQk4"5&rǖ> }%@> -,}51UpχgYk -S1=%ev2n(&6rw=T:" -3Vp$p}p!b`|y^yI4zԯ?. SE01[٠h)'yᢚcu:)"PkRWXh`NV%x0sA7k _M=qw`2k[5m;b<gh)eyOLZ{|wePnz>$}TT&ȷY5ct ƗpL#,,M=kj.B=hpk"@ k#UϼO4Z/$bq[] dֈmxno3"aLOB[uf=>72cZ[~Ī&Z -=2xOuopZK?_c9pX#hb8j`G>!ֶ#& {Yu -sr* jEl9t]%;[v)٥4+{J)xX0_LRAw;4*w)j~)"LB<9u{A:RApߦcVF#cJ˖|DgHe3d 9 ۭQB~w?ؕ]>mi ;6g?}{Xp=eўYF(NK]{;BO@ 7sݝUl$g`#f)Hmj6c7=r@pڀ=B]. tKPq;I~DyDq&wJ;,o)NjҚ unv}\x_#?HiؑZH0s%xZ|^#^zIqG ݲ;t7;̾25՝.m*FtI=ovyM5w֧]"^$S<P_,``OdM֙2)Z_)~dc_z8MҏP!kg\߭@&s9*vw=K𻚒 ij T>Q5x" hm#FJ= f9 -`G+ ļ -@G#\ʺi 2ZL-ıG `}# ֔>C `Gy70M1zJsUuQbVi˂]V"S5e]ix; p^ב"cIp HA}gk1 -opyj%: '0׶dД -R!`>V,4 XGjѨ#jaNbz-GZ -%e9:ؖFN } uUMAU<&p4k" wlf4#0HC"kx;X-|\!MӗU|4嵀 -&XOk<%@8rrDt"+iA2S! 8lK}udkWoTBO!Zőzʓ C6=nȚ5eo$DUk<(2kks.qeAS|d֧ ,DsՈ~Xoz:(tB8MJyGߚ2ȑ]{e⼣m,Hrm`ݭ+l_mЌXMv6MRDe:Hl(ؓ -u۫h]#&^|j_n.,A DVBJ@q/N?iI<wMS/5GQEb*eMO[N YN|9$Ϊ)Noz26mp$#%Ⱥp"$mU#ԅd5Nfl6zvpҥ-*ǨvoK &dhWbnT(5)ͩ_oY7Vu$+unQUW uu`yfIWB|&p,-Y2Sƕߣh(E^k6M8-}$@$7e*<`J/#,!A& AH:/ҩ^ #Tҧx4 -G$9od1F̜27KҎvl7nИi#wTKLU(UXV6ڙ9"ѣ1/XCb|$ -=3+O涋E3CJ[dvt"Ff,_M rR"O; "NѫM3٪)ME%$ߙ83 oPڪ\бKiTO '˪}AF0b=S+ֶc -cH5ԚhDJ35`zA55 ͻa˿]#\ *F$TS^-fӍ^@OcDQ,؟L`nѰ+!?t LtS6AY5##HљFX/7a.|i{{9(p rH>. -{=x7>Z6NkuH:$F4l@<wӼ[۴}ЈylODGz}d)mm-O*Uђhg`{ze #?:=NֱsI ϱ?h,@lBO>EpHGI(zhCu -=x* ' -v'JvB4उ6=Ed_LR4};4BSuZSA=IH3)Ha҆(@IH(ٚM[7 "i"$M$PUSiBB?C}g=ͩǟOXl?6OO0 i!i_~Ǔ2rן_@ -C~~$ʮGtu桷!ߚ\oHD'}Qj֧[߫斿g;n^y˚OVxVi: C$#B!ɻ~i\s!\ NA%@TU#iS"4 c5HYlMȟ\nmj!O VyLSE$aUḢjW&ZCXvzr:|Svv~k2'3^l;wؓߞ/~v~`Ylx8<ʱH$9z 6+*K]yx C!O634%Azǚay>_~DI@HIa-Y3 -qkzD /ɳf^{JjE '3kRb'y7Rb9_r#x~8y7[ө$P=⵩`s{I ;P}dfl1x #Dϱm K鐝;9 L֠?_ZsI"9 1|)M3IЈrhgVl @n`(/cD-^ w;t$\~"68MqeM{&Q>謏Zt,j4wMРrus_ JH v1 şPaO - KfIIC;^I \$Y[)8ZOnxd j$M"u}t g9p^SТg:m[S-HAw#A[8p$B<Ǟعţ# ]d gU67(b >T[pL't08V - 8Ͼ[gl)<8d]e g8e4P)G GP= 8"@6qy&VSHYra+kG,- -vu'|M{>HT)8qlp߬جtџ͹5=R/qB#FVGд@:7|\F ɑB@c-2ԭo^kl3NcLte4:(Yv}XvMN Mfvt0NtxMh˱8֔ŪFhf셼d xy# 0iFA0)Ү78Z^AɦĘ5jR488I1h!ǎrx\{b2sM7Ǹp?!7vx[3FX{9p`(c;mEl٣iZQ, < -XL!.bhD=8qR\leVt#rj<嘫fԈnD)>A㗃4h$QH]490I4w1y8B*l}#CV@۾,ftSg?9R/^[FԒ}׌ѥAӀ޲NM3)S "rL eeR1uF7p7v^ZEvSBDCJn}#ZJ7SBSʹ6 GiԍkUǕL8`˖9tX+Gwx$lz+]LoLWM$ )3-#g ,rMH7xCS]DOoT(.7 gK8<ݶ~g@p&x2jfki&>byGژbk\n:b&>STwpo<r't"$2mynMR۱/W=ouGIM^+ĭ* 6E4.G bpy$̈́4dr`;J2Vr4UgH9UDjz8ES,2dթHLIL'*cJ!MΓlo.Z-x1o TV%]zqRᨾfc#M$ ':~ELVx{Qܶߟ'*>ESR߹2J?}߿(eU'=?_B ߨZK>gY?왕7*mP2WI?,U98>P9Ѯh[mC }=kwczOw|T B+&E?E*KQl1|O1 0lϯׯ}fGL>m[X=2ݏ&E,-^8P+Gȇp8~y "kOcEuq zkcCGe-ZϮ[: Jetxp)vsLͮ2;8pdh(sg)H{_)Ng/@ɝU s -ZGyx@Wx|+yf}^&3S~Q&݌q>˼F>}}Q.$Zao~2Ӟl״kspq5/3Z)ffaڨc8QeC໖SUb2X8Ç8NBui) S4%t+GrW2$X:j -׶I)9mv\Q*+B'l44#zQtԷscx=&On|h[~x)M!PN 'm餟)v!`4OyCVt$i=h3eKߴa!;U]fn?$4iBGaOƶZ -]#&k/BFW`M!;su>q* wKtcG:FeOꜘ71x`IÎv$WZY[`㓟+ pnn6L6̮L.MJ&K9AruٺPWu^ɩ`o1b;l  $㴥$W 2minˁq4IӳnxyԼ$b+='ENfrSUztM#I'E}mrӂe ޏk(M -*pcc= C` -\y<RCVg]=Sֆ8 -_ Rm!0=`Tvl _|%1pu5kϘ6P)l2MVmfq8Zq`cz \Ք#L+k$G,-6 ut 4E1SC59U -މScfzXӉ#GN@Z!pFDV`iŘ@VY7<\PD–ZZ^%V Z67sL};VM4̲S7£02oa o͉\ZPN30Μ#so$mF|4h)">}Z6:ޘp2yF4t. xNќ+p[L}Xuch}T/%K;R3*0ިV/kyw%^ L=XJ=)pH65ޮW6QUw5ÁrAy@+ӘM|$MBmS.n~Ct( -v$%iI8DU`Y_kOJfi|SzcgP^ -U߼#m6sO3"=XkTc{\cE,4`Q* >oaKk>Q>)MZZ2+ZQ`9<+&j`vW\5=ԃ_ rOM(Ѳt#vɀsnCI֐ o_1Cd+W ZtՍ/luJ@%BaNMw]9 h?ia-vzYM*fѡtf&\Wst7F% ,j۩2bg }ɭ[xRifw•6?4bMJ8|dR`|XvqK2$bUQMӻ.'ިP]n$ϖ.PIeZ=rc_4p{A;2V>[%U6l4Vi\6-6lI i -`-JcWwPdhw϶r2 ,pNYfSeLǫSn=O4T0I$C^' \ 77ZbP`7J 5>7?Q}'FH Ou: -m1@M?OT}jW!~seV!7v>}5uQVc ʪ?Ւ+˭潊lg[B dOII8I %;pUozJ gV\gT el=L "?X=Bh ڒyrc߁zY^T'H]fa]) -ҽh)Lx8PBƼtAh)A+""=2C>|{C,tݸP$A 2 Mek(k%D^ ?'FXu]AgOp]/v~WGf3H$YlvIA1n>= %a u *`ӠF'f )_؀\1o/F1ٟ\Cpi0z4K﹄`,{.>?gXbK:Xs>``g=V7F:4? rD{ӯ·UC-B͍GrmvEs#R^L'ufJaP," 3gYVeD Q.`˃B-r>5-يP<r%i6];~`+zޕ qB^C?{q`K>!ͧ_t̎^ = #XrCvgpC+#YsgDX*ۘG>LOfLi'NҬ+_ޕ|-ΔtO(O 0ق]tog&7JC|Lw{XA7\{(-,=dM&7XR!Mk65X٣܅^Pn\6tT9m Ya)GK.R;uTp퐵,dHpr~.(\{UߍkV4ĖΓ'%e;7Xг]"~.-j9ž{ -g ||~'Gģ : 뇺f>cTU'LVaYQeIo8u|z c9|{ߔf q[6˘QS˯y8h ߦ1Ƨö4Nmg/}l¸Xt,0w|"1m g.x<_\),#.]-E_)Vx%s+34$ -w#, xI, 4$%qb(i{kH[a$Yӏynm%r®Xw񅅻\^8ZB.g@c0")ϸS3NSg2ԁG˙"Y 8amXrqR@1K8?7ÛoKLUL]f8COHu*mȪ'!XvW*9Q_}HQc}7C!}^lA^);=e -N B 98(\e@fq^jE㡪"lIa;SyXVocThl)ξ&81R&=KM FV!e"1,`C:HY -\o085X]wH rX +hL5eEXfY5 QB܇<0+mL -ёI=V\ c2h2r1*zJ8&'+V̳XsC"*ɕ,:E^f182_F2"YwR J.ws@$zoCƘL.R翸=>}L2m']%IGo6Xqw/QN:DKL <&pDN1/ !}@rw9N LؕXkx(NYT|ݤ5O=u ^otJs?|ԝ6-8kX9P-}}'+vG WWM_|#%ssS -~K]ZIJ4Nd/}m59e8ib3T,L -6?wKxX -L>._ͶέBҠ4<`W "KM!Jߐb+}0GUa=0xT% iw -Dt~փg Jf7zh(%kCkl[vtSVxTûnpއ 6Pep/rҨؾӪe*(z O7lXh <f =lX5Gt㚢"P`:< NcCe]15{yC,"k{XVmɆQoH†zd4vGּհrnޫ0Yjօl5GmzhjT j+ c{@╹|Q4S؍ݗ+89_L{*>wY$Q0sb0`=k&&)iHJoM_r.yȣ=ioӆqduyDNVk;Yvv Vź[/,ryv|S΀t+x6")xR3nSfe3EӍͩ1 rrR%cGn7rx3R,bmz%Gϡ6ܩ:.@X_6 |x;?G%MđCFjr!`=s؂3*0%,Fka|XLU[Ce9ʋYaanAΗ1n9r]6"WfQs7S0d fo#-9]4LKxVn.GտvEwVXqUjqs71qa۬isƌn6X7uy .;xUtÒ*tY>,:! }NH<S#1W83'C#a.o_a>rK.*GaMg{?J9xLB;0JF=|+jX}* e -7C!\zezx)%S, -]m@*'6+TQ?T(b$[4+ZD-.`^yC2'SB*&~d'ع[zlX~|(AD`\Y#J߯I3K5qpVb%7ṫO+!TM]kSˡڷ -j_oϯ}BPПȰ_1n5]U3?HKTⴴٙB+t -' -I@Y]X&R)Ho )qOK!Ҁ{c{!&ץ-b)p%vC JY"_mdmvNJAe xnGѽR@8-xT@ӒxfCpn^ -7 tT`4&[pu<"6TL=̅aMe[$ -|wMf.M@cQCokP+6>Uۢ+po -+t8@\모Fif-$TxVd=8 - #Z]7O>kd*VBN - y+{nŘQ zĩs=e(Ƕ#A1V sݴ'^~v,k‡g s(xrQr̃p_²ĦOͥ^Ň'(VL] pc +LK, 0mf~o;R`IuB?CSһ2(.)SS?[®E%z)|6R[_bxbw^ؾfJ|iyZd^΄]jsޖ!qIu~C%:~P/ oTK |;Ù4iWsMeΰ%.qx>ڛrN73_4¤Km%B~Fƛ i&+!S;j!H0+&1s;tZt^1osVirR0m7WBa}U`9Vd+kJN"k]׬=WQe^᱊*#5(Q(L=s,L;- -x 7t%w@GG+0GMO= y( :@. z>-݅;&C ͸z^R?V=&jx=h@B-54,@a@ -\iRVihϳ: n-<mkCu1'Y|mkW4 - sXj&Jt2Ws,.6qEF8_n~Vz --4A;Z (MuT"a0-*EtCuH\-eܑΝ=J$fZyhw=,P4yG7yq0XGOg۬cL Ӄ wyeSyt=lᅸ,b]aER ϷK;x -~{WuL䎦>kGz -ڡ{jz:w^r/g7QGl.5gVkiuO'&ݟXU1ƗI*1_~G*&j%?)XiN.8>.v4!ڕj/Denix- &E P)5Na'bG ly#5ɏm9`zMӔB;09YjK7_8ÚZTQcBPt`Ш5ʝctaqt5b0XNSb394ZI 3kI;,KȘXIf%[IlbJnNϯ߿ڷ~?9x?5Kq*e^^!&g1zzGP(c7W|NRƇXP'|z5(xNꗟ\l_2HI?8}XOMD;PД PQ!ߔE j 8s:@)75_:a ̄RG,6a ;\aD^aXdU]V%;b^`ˡE&C>AG`[L.̑}tB߆ iЄ0!y$)Lٽb,4Ű弻HWe6.<I>):yևjW+|9&|K%{ú]د{1IyTǼ;z)\584 ;̷ ܳw 6_ վy92 -~QkY}T^Te}Ґ]v|p-j?z/n9Qp<8\DMbC򀃗y$NOo1?\Ti%XUx?At7nH'"2) -oCCfx,1dIu# =X̮UE=1N I[ĮI+EZv~HĮ3)6vzC3=ysS.v9 !qUIu6LwyRJqTwygヵw/{p;>xֿ]~D;i ɾ*"'J7KM {&3;ss-vIo -wU69Ѕi;+M؇ݑ EzyY10iX{WU筛<]~x|V&+0޾*0qf3W k 6ܮy) ?_Yuj -ǪV9>Ze3 _ w༢kH]eAOQc It0Q}\s~K~y-%9zw?U(R~L?ʛ(֜z=NIv -wK'Kq56wrbYV!RG z+(؇t0wAhB%_sB$ڝ(j#KV5Q0VGdhK/ |`lY^ry{JYjFH5%*Wlncڐ] jti.i8<5ELh3L器VeɻGa`_^ cueZ3]PtoSoǶ5hG3u4tw!g8hC-E,>צb"tccwQ,+`%ѳ̉~@G-ϳ$C^PUܼŏY:zeftoY8qOL-Ҿ3Vb#tv֟}lqKlF>PJx>/ -vFiskh~{A:aO䊦 -_aQYov(M5]^CF/og5R+TM\`F8&ee-KL "OtMLx@e $_|F1Am_稽 -D'S=Å?lO]uv RKtK©HQ$Gq@վ lbܪ-RV䠸9y8WQQM)-(rsr˚YͱaiS^ skIR'QoG2]6-cKշS:?r.Bt&\?qɷՐQ1YS%ݡgZylVu HȘb9[ `hO?㿟!VNo"GGT3>ME4 w9-^ Hv;{G ;#oaaK G~Ox #]c?Rw3Mpŭ._^6.6Bz۝,sD%Hu&2C|A"jj;!=EJ n?9<5B=ټS+yo|;>;ҧ9m= ':J5="H9EoZd/wPQv{q^ -ohSauqo$":ph+Ƿp#,܈$ȕ[>'$t^ bwaϩ^{2ɚL?7iZj9t;CFRo+!cG1{=mI| XW-B?*+mH𴏸8w.ot[𤚕mYnxCh͡'BjjҼU!D8@k:ZC JLHfȚ"ɫO"ݲ9JGQb^&)Y2 D[hrslh E.h['{t홬3"_T/6 ,:&4`h CKWJИM<,atMh׋e܊{ =rU^t_Pm|0G4\Rr:ܲpF:w@g0+ںӝ1P*0Pe@F Mkrࣜ`DߓInC]:P1>T]e/G0) XQCo@zm>)\4R>g9IlA2nD5K!ST2HnU@1$œ+M.poz}l?/Jہ5G"ྋ38!)98ThЄ(Os>Uch3iĶFCM "V[2i]ߛ{1fh.WCK/|o1LĔFS-X>&$=”ⲇi3ir 6c2r^J*gC=[ܣ0 f^t_Lo]*ÇJYm`xNmF cՃ@A0HC}pn]`cԃ;ék)Þ6h7Ž. `YSz pEhM#\rum<8ߏed dOO>W˶DT3:T={6:]ra)pQ`o]\8:㊞:r0oAj/̷ =@X8JbQܞ^wv{wEjbFmK] i:-"~o.`">D?{g F]+=/cU2ԁUz0^',Մ , Nho7LT\5BD PWx;M}g9S)i܆`K"w߂tA,,;aAZ)>kKA[HC~Sj!ߦEJsl:Dս4y:z箒I-iN7PU3uތǰZVZh40RW4Y%W3lOi׆K:6M4Y:<5~.Խ"Se#׋닯Ohx*X^ma$S="NSdVng ԇ{QUV gH+Xum"3D2zT -kIw㕑P 6O81VSBQSs(gC*DAB4 KVnθ.2Lg~5;*x#~Q!>OJJ0(SJ4ӂ֎ Cbbw+ISF34_5a _ueb[E(¨3ª {@,s]mKX*g*\&M,_)V%쨰pI -RtyRB;_΄1;{ѭ-P ne -uɉcJP`N3 ~O@PԙගIPϿ~OՃASb5?\2/]Gܠnr7y)\yҥF/ȵ>k;7_fږHj%:οE%=,68Q.kM>T?oB"^e(4V<ӨGOwn8m v'} ݩaZ~} ~ȶEv;ǯJ¤ƣD=vMR_8%W"TDy(94 abAI^719d`hAgsf,nb|ČXG5B<b=ƖOS8 s3 4Litف4eڇ-{hNUl g(R%pz$p*fg_#MЖ lAUn'q6t#Yamډw%"|ZᖈTfRH5#FaA ݇hN8ڱ_(]V|{>G腵{#j[Y>Da9}d -++?i{!b ?^-'XxD -L޴;i)&ܖ:MYmf維 B$]#ٲ19A`$=x\D}i;~jV. {>^ƪPY$|p- iaVIѽO`Y AX"}>n3K2aM9u7zʊx;dYrS DmuڴY[.@ȥ޼d$İLGPNy9Z9!I$2OL^O<}9h9L (Tx>ۚ`w-ЇZ=goܻhTn';&XC*)0AB6z"7`jcS>P1yko .̤CPLMD3,8>%\Q!xH ꋷw5(USrMc{Bk#Y*1bm55$`#%6/jq,OQ^TEvF7s;b'ɞAB+ŤђL/+%,S1myI+D95uݺ)CٕЋb-\ S.CD.fSF!jDfndwIswL'ScUX#ɂS J)Pi_Iفr .7nC -H5P4=ٱ SAO[T׶_Kr(H1TC ˡ,ľˑyNWʩRuVPxJ4 1J&M9 >h,4ԯ(#=[/i;&fH6(["&$v$x0@ݗl8U^qP-> ("crC㮊A21[h[w%&^kE`8Pި3,y@ZSphmFLU94E -,#~(:xOaPN5+L X[6B^v# i=14 l-j_lq!bY {iz76fGW-ya/T<(! -1*Uzu:%)HaNC AFAJc>h{*{Kp+Iǁql2/j&VD$&m5M`R֨7h lJh'Gӟg 4 e@ʤֿ?RM7-dUS)Vh`Lg5Аli)^ J8[hߩÏXϣvh\ïMt_wcS**1A&-X;XI -w@Y6bHGk-XX6,ƙSQ!zaL[h6gxO4(ev \ FX;uE LD$LǵZ!$|~_0]Dnى%HT{U]D bc,+n9LXQM`'nzet2@rbHN~T=H!JEL?Ty .'=H"SJ񄋅Ī&X pM -R;b]¯k'Kalnc99(b_QŦ;X{ɩn2nOS F1$}Rܲվ)JĤok9p jx. %P6@a E-#*%`E+,Q!_/`°ozjmxsH]̧ |]h4r -EY ։ HQ{o3"Yא4i%㹩Lɏ Eډ;D4R?JLxzX<4k 0ƅct"xSN \TcfaysA:7|Ȕe҉gabSN4D&HDk҉Zeb։DJ̘F$ -0 -1DupLHDbǬ ڬ>D(u@:8^2>&P&Z'DЎ_^?` aֹ0}vAL;[ έyӼs+n޹wb޹f޹j޹7s[üs'xvyyOm`m ;&;$&;E&;f"̡N玺b炅碉⑉ià:\5\<6\6\D7\7\F0\0\N1\ 1^3-R,) *?GNED6jӇh oDZ@HT3N޺1O n$G1XrCK"Qbp&syi..މCht̮5[A)8ҐMy!Qt!b؁Ou⹅9U'.n g4$-2Q鼲A yኑH H \!؟#ts"q Sֈ۷in)ge+O& /w3Z* $ZF['<{T$rO1@S 2ނfOJNOHskFyH x񙳴@hh5/]HA~ -4H|1 @\;"9} IQ},)F)p 93tNH1k1`>a!J :36߀y?+X=S5VO|ss{lB%+WvT%ϡ$^I\4G5l$uIu+o=+~7 sZc6ƻj+WT~֐;<c5L(g %-C8ESiB؆1c}.)%[ &V](m~iҬ#|us6L!22 9ȂB# >Gn J}K[?9V)15r>-igǶw` }h/1ƸZπP{}(8:[+ -M ;vAHЗS-'~ Z9CBx x/ki\aJ2+]IPߛO1+A t0_8W .9۷jhpYdXp2YgW> ۅ_WINb+6|z ϗLͷ43i>eĊ_n\S+i1i TQkcԔ&|PC&*fFed U%n@h:TqW_l@pR 5884_ICAGl@HJ=&WM k 2\ըPB ׷'3j+xQo1j;P&bb͚&6̬-5kΞ5q(FMQj5FM$QeD5'AE_&2ܬ0kH (u&D5QbMX.ք5bMxXf#ք5aWbMX'؄# -6aMxhs:˕m.&m 6CE Dٴy߿~ן I endstream endobj 11 0 obj <>stream -8;S=C0`_7S%"\noO8`:`1K?(.gkjkgO>Z(g[7.,"GQA!K)E&9'~> endstream endobj 12 0 obj [/Indexed/DeviceRGB 255 13 0 R] endobj 13 0 obj <>stream -8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 -b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` -E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn -6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( -l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 5 0 obj <> endobj 14 0 obj [/View/Design] endobj 15 0 obj <>>> endobj 10 0 obj <> endobj 9 0 obj <> endobj 16 0 obj <> endobj 17 0 obj <>stream -%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 17.0 %%AI8_CreatorVersion: 19.0.0 %%For: (Graphics) () %%Title: (黑鱼白底.ai) %%CreationDate: 2018/7/17 下午6:09 %%Canvassize: 16383 %%BoundingBox: 512 14 580 82 %%HiResBoundingBox: 512.519474100296 14.5993985160931 579.268412090863 81.3483365066604 %%DocumentProcessColors: Black %AI5_FileFormat 13.0 %AI12_BuildNumber: 44 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%CMYKProcessColor: 1 1 1 1 ([套版色]) %AI3_Cropmarks: 516.333333333334 18 572.666666666666 75.3333333333339 %AI3_TemplateBox: 297.5 420.5 297.5 420.5 %AI3_TileBox: 265 -333.333333333332 824 449.666666666667 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 6 %AI9_ColorModel: 2 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI17_Begin_Content_if_version_gt:17 1 %AI9_OpenToView: 504 120 6 1448 814 26 0 0 67 38 0 0 0 1 1 0 1 1 0 1 %AI17_Alternate_Content %AI9_OpenToView: 504 120 6 1448 814 26 0 0 67 38 0 0 0 1 1 0 1 1 0 1 %AI17_End_Versioned_Content %AI5_OpenViewLayers: 7 %%PageOrigin:0 0 %AI7_GridSettings: 72 8 72 8 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 18 0 obj <>stream -%%BoundingBox: 512 14 580 82 %%HiResBoundingBox: 512.519474100296 14.5993985160931 579.268412090863 81.3483365066604 %AI7_Thumbnail: 128 128 8 %%BeginData: 17418 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDD6FF7D7D527D527D %527D7DA8A8FD74FFA827F8272027F8272027F8272052527DA8FD6FFF7DF8 %26F827F826F827F826F827F826F827F8527DFD6CFF272720272027202720 %272027202720272027202720527DFD6AFF7D52F827F826F827F826F827F8 %26F827F826F827F826207DA8FD69FFA852272027F8272027F8272027F827 %2027F8272027F82752FD52FF7D27F82727527DA8A8FD0FFFA87D2726F827 %F826F827F826F827F826F827F826F827F87DA8FD4EFF5227202720272027 %2027277D7DFD0FFF7D4B2027202720272027202720272027202720272027 %7DFD3DFF52A8FD0CFF7DF826F827F826F827F826F827F826F82752A8A8FD %0CFFA82726F827F826F827F826F827F826F827F827F82727A8FD3AFF7D20 %27A8FD09FFA852F8272027F8272027F8272027F8272027F827202752A8FD %0CFF7D27F8272027F8272027F8272027F8272027F827207DFD38FF52F827 %F827A8FD07FF7D27F826F827F826F827F826F827F826F827F826F827F826 %F8277DA8FD0AFFA852F827F826F827F826F827F826F827F826F827F852A8 %FD35FF7D20272027207DFD06FF5227202720272027202720272027202720 %2720272027202720272027207DA8FD0BFF27272027202720272027202720 %27202720272052A8FD33FFA8F826F827F852FD06FF5226F827F826F827F8 %26F827F826F827F826F827F826F827F826F827F826F82727A8FD0AFF7D26 %F827F826F827F826F827F826F827F827F827A8FD32FFF8272027F852FD06 %FFA8272027F8272027F8272027F8272027F8272027F8272027F8272027F8 %272027F82720527DFD09FFA852F8272027F8272027F8272027F8272027F8 %27A8FD30FF2726F827F827A8FD06FFA8F827F826F827F826F827F826F827 %F826F827F826F827F826F827F826F827F826F827F82627A8FD09FF7DF827 %F826F827F826F827F826F827F826F8277DFD2EFF522720272027A8FD07FF %A82720272027202720272027202720272027202720272027202720272027 %2027202720272027207DA8FD09FF27272027202720272027202720272027 %20277DFD2CFF7D27F826F8277DFD09FFF827F826F827F826F827F826F827 %F826F827F826F827F826F827F826F827F826F827F826F827F8267DFD09FF %5226F827F826F827F826F827F826F827F826A8FD2BFF27F827202752FD0A %FF27F8272027F8272027F8272027F8272027F8272027F8272027F8272027 %F8272027F8272027F827202727FD09FF7D27F8272027F8272027F8272027 %F8272027A8FD29FF7DF826F82727FD0BFF2026F827F826F827F826F827F8 %26F827F826F827F826F827F826F827F826F827F826F827F826F827F826F8 %7DFD08FF7D26F827F826F827F826F827F826F827F827A8FD27FFA9202720 %2720A8FD0BFF272027202720272027202720272027202720272027202720 %272027202720272027202720272027202720272052A8FD07FFA827202720 %27202720272027202720272052FD27FF2727F826F87DFD0CFF2727275227 %27F827F826F827F826F827F826F827F826F827F826F827F826F827F826F8 %27F826F827F826F827F8277DFD07FFA827F826F827F826F827F826F827F8 %26F87DFD25FF7D27F8272027FD13FFA8A8A87D7D27272027F8272027F827 %2027F8272027F8272027F8272027F8272027F8272027F82720277DFD07FF %A8522027F8272027F8272027F8272027F8FD24FFA827F826F8277DFD19FF %A8A87D522627F826F827F826F827F826F827F826F827F826F827F826F827 %F826F827F82652FD07FFA852F826F827F826F827F826F827F82627FD23FF %A82027202752FD1FFFA87D27272027202720272027202720272027202720 %272027202720272027202727FD08FF522027202720272027202720272027 %7DFD22FF2727F826F8A8FD22FFA87D2726F827F826F827F826F827F826F8 %27F826F827F826F827F826F82720A8FD07FF27F827F826F827F826F827F8 %26F827A8FD20FFA827F8272052FD26FFA852F8272027F8272027F8272027 %F8272027F8272027F8272027F82720A8FD07FF27F8272027F8272027F827 %2027F87DFD20FF52F826F827A8FD0DFFA8A87EA87D7D7DA8A8FD12FFA852 %27F826F827F826F827F826F827F826F827F826F827F826F827F8A8FD06FF %A827F827F826F827F826F827F826F8A8FD1FFF2027202727FD0BFFA87D52 %2720272027202720272752527D7DA8FD0EFFA87D20272027202720272027 %202720272027202720272027202720A9FD06FFA827202720272027202720 %27202752FD1EFF5227F826F8A8FD09FFA85227F826F827F826F827F826F8 %27F826F827F82752A8A8FD0CFFA82727F827F827F826F827F826F827F826 %F827F826F827F826F8A8FD06FF7D27F826F827F826F827F826F827A8FD1D %FF27F8272027AFFD07FFA87D2027F8272027F8272027F8272027F8272027 %F8272027F827277DA8FD0BFF7D272027F8272027F8272027F8272027F827 %2027F8272027F8FD07FF7D272027F8272027F8272027F87DFD1CFFA8F826 %F82752FD07FFA827F827F826F827F826F827F826F827F826F827F826F827 %F826F827F82627A8FD0AFFA852F826F827F826F827F826F827F826F827F8 %26F827F826F8FD07FF5227F826F827F826F827F826F8FD1CFF7D27202720 %A8FD06FF7D27202720272027202720272027202720272027202720272027 %202720272027204B7DFD0AFFA82727202720272027202720272027202720 %272027202727FD07FF2727202720272027202720277DFD1BFF27F826F827 %FD06FF7D27F827F827F826F827F826F827F826F827F826F827F826F827F8 %26F827F826F827F826277DFD0AFF4B27F827F827F826F827F826F827F826 %F827F826F82752FD06FFA8F826F827F826F827F826F852FD1AFFA8F82720 %2752FD05FFA827F8272027F8272027F8272027F8272027F8272027F82720 %27F8272027F8272027F8272027F8277DFD09FF7D272027F8272027F82720 %27F8272027F8272027F8277DFD06FF7D2027F8272027F8272027F8FD1AFF %7D26F827F8A8FD04FFA827F826F827F826F827F826F827F826F827F826F8 %27F826F827F826F827F826F827F826F827F826F82727A8FD08FF7D27F826 %F827F826F827F826F827F826F827F826F8277DFD06FF52F826F827F826F8 %27F8267DFD19FF5220272027A8FD04FF7D20272027202720272027202720 %272027202720272027202720272027202720272027202720272027202720 %7DFD08FFA8272027202720272027202720272027202720272027A8FD05FF %A8272027202720272027207DFD19FF2726F82727FD04FFA8F827F826F827 %F826F827F826F827F826F827F826F827F826F827F826F827F826F827F826 %F827F826F827F826F852A8FD07FFA827F827F826F827F826F827F826F827 %F826F827F852FD06FF7D26F827F826F827F826F8FD18FFA8272027F87DFD %04FF5227F8272027F8272027F8272027F8272027F8272027F8272027F827 %2027F8272027F8272027F8272027F8272027F8277DFD08FF4BF8272027F8 %272027F8272027F8272027F827207DFD06FF2727F8272027F8272027A8FD %17FFA8F827F8267DFFFFFFA827F826F827F826F827F826F827F826F827F8 %26F827F826F827F826F827F826F827F826F827F826F827F826F827F826F8 %2752FD07FFA827F827F826F827F826F827F826F827F826F827F8A8FD05FF %A8F826F827F826F827F87DFD17FF7D27202720FD04FFA820272027202720 %272027202720272027202720272027202720272027202720272027202720 %2720272027202720272027202752FD07FFA8522027202720272027202720 %2720272027202727FD06FF7D202720272027202752FD17FF52F827F827A8 %FFFFFF7D27F826F827F826F827F826F827F826F827F826F827F826F827F8 %26F827F826F827F826F827F826F827F826F827F826F827F82627FD07FFA8 %27F827F827F826F827F826F827F826F827F8267DFD05FFA827F827F826F8 %27F827FD17FF5227F82727FD04FF7DF8272027F8272027F8272027F82720 %27F8272727F8272027F8272027F8272027F8272027F8272027F8272027F8 %272027F827202726FD07FFA8272027F8272027F8272027F8272027F82720 %27A8FD05FF7D27F8272027F82720FD16FFA84BF826F852FD04FF5226F827 %F826F827F826F827F826F8277DFFA8FFA8A87D7D5227F827F826F827F826 %F827F826F827F826F827F826F827F826F827F826F8FD07FF7D27F826F827 %F826F827F826F827F826F827F852FD06FF2726F827F826F827A8FD16FF27 %27202752FD04FF2720272027202720272027202720277DFD0BFF7D522027 %20272027202720272027202720272027202720272027202727FD07FF7D27 %2027202720272027202720272027202720A8FD05FFA820272027202720A8 %FD15FFA827F826F87DFD04FF2026F827F826F827F826F827F826F8FD0FFF %7D52F826F827F826F827F826F827F826F827F826F827F826F82727FD07FF %5226F827F826F827F826F827F826F827F82627FD06FF27F827F826F8277D %FD15FFA8F82720277DFFFFFFA8272027F8272027F8272027F8272027A8FD %10FFA85227F8272027F8272027F8272027F8272027F8272027F82752FD07 %FF2727F8272027F8272027F8272027F82720277DFD05FF7D27F8272027F8 %7DFD15FFA826F827F8A8FD04FFF827F826F827F826F827F826F827F87DFD %12FFA852F827F826F827F826F827F826F827F826F827F826F82752FD06FF %A8F826F827F826F827F826F827F826F827F852FD06FF2726F827F82652FD %15FFA8202720277DFFFFFFA827202720272027202720272027202720A8FD %13FFA8272720272027202720272027202720272027202720277DFD06FF7D %2027202720272027202720272027202720A8FD05FFA820272027207DFD15 %FFA826F827F8A8FD04FFF827F826F827F826F827F826F827F826F8275252 %527D7DA8A8FD0DFF5226F827F826F827F826F827F826F827F826F827F826 %A8FD05FFA827F827F826F827F826F827F826F827F82627FD05FFA827F827 %F82652FD15FFA82027F8277DFD04FF52F8272027F8272027F8272027F827 %2027F8272027F827202752A8FD0CFFA827F8272027F8272027F8272027F8 %272027F8272052FD06FF7D27F8272027F8272027F8272027F8272027A8FD %05FF7D27F827207DFD15FF7D27F826F8A8FD04FF7D26F827F826F827F826 %F827F826F827F826F827F826F827F826F82752A8FD0AFFA827F827F826F8 %27F826F827F826F827F826F827F87DFD06FF2726F827F826F827F826F827 %F826F827F852FD05FFA8F826F82752FD16FF202720277DFD05FF20272027 %2027202720272027202720272027202720272027202720272052A8FD0AFF %5220272027202720272027202720272027202720FD06FFA8202720272027 %2027202720272027202720FD06FF522027207DFD15FFA827F826F8A8FD05 %FF52F827F826F827F826F827F826F827F826F827F826F827F826F827F826 %F82727A8FD09FF52F826F827F826F827F826F827F826F827F82627FD06FF %52F827F826F827F826F827F826F827F82659FD05FF7D26F8277DFD16FF20 %2720277DFD05FFA827F8272027F8272027F8272027F8272027F8272027F8 %272027F8272027F827207DFD09FF7D2027F8272027F8272027F8272027F8 %2720277DFD05FFA827F8272027F8272027F8272027F827204BFD06FF277D %A8FD17FF27F827F852FD06FF2726F827F826F827F826F827F826F827F826 %F827F826F827F826F827F826F827F827A8FD08FF52F826F827F826F827F8 %26F827F826F827F827A8FD05FF5226F827F826F827F826F827F826F827F8 %A8FD1FFF2727202752FD07FF202720272027202720272027202720272027 %20272027202720272027202720272027A8FD08FF52202720272027202720 %2720272027202720A8FD05FFA82027202720272027202720272027202752 %FD1FFF52F827F827FD07FF84F827F826F827F826F827F826F827F826F827 %F826F827F826F827F826F827F827F8277DFD07FFA827F827F826F827F826 %F827F826F827F82627FD06FF52F827F826F827F826F827F826F827F827A8 %FD1EFF7D27F82727FD08FF7DF8272027F8272027F8272027F8272027F827 %2027F8272027F8272027F8272027F8277DFD07FFA827F8272027F8272027 %F8272027F82720277DFD05FFA827F8272027F8272027F8272027F82720A8 %FD1EFFA8F826F827A8FD08FF7DF827F826F827F826F827F826F827F826F8 %27F826F827F826F827F826F827F826F8277DFD07FF5226F827F826F827F8 %26F827F826F827F827A8FD05FF2726F827F826F827F826F827F826F82752 %FD1EFFA827202720A8FD09FFA82027202720272027202720272027202720 %2720272027202720272027202720272027A8FD07FF272720272027202720 %2720272027202720A8FD05FF7D20272027202720272027202720272052FD %1FFFF826F82752FD0AFFA82726F827F826F827F826F827F826F827F826F8 %27F826F827F826F827F826F827F826A8FD06FFA8F827F826F827F826F827 %F826F827F82652FD05FFA826F827F826F827F826F827F826F827F8A8FD1E %FF522027F852FD0CFF7D4BF8272027F8272027F8272027F8272027F82720 %27F8272027F8272027F8272052FD07FF52F8272027F8272027F8272027F8 %272027A8FD05FF2727F8272027F8272027F8272027F8277DFD1EFF5227F8 %26F8A8FD0DFFA85227F826F827F826F827F826F827F826F827F826F827F8 %26F827F826F827F87DFD06FFA826F827F826F827F826F827F826F827F87D %FD05FF7DF826F827F826F827F826F827F826F852FD1EFFA8202720277DFD %11FF7DA87D7D525220272027202720272027202720272027202720272027 %20FD07FF5227202720272027202720272027202727FD05FFA82720272027 %2027202720272027202727FD1EFFA827F826F852FD17FFA87D27F827F826 %F827F826F827F826F827F826F827F82627FD06FFA8F827F826F827F826F8 %27F826F827F826A8FD05FF2726F827F826F827F826F827F826F827A8FD1E %FF2727202720FD1AFFA827272027F8272027F8272027F8272027F8272027 %7DFD06FF52F8272027F8272027F8272027F82720A8FD05FF7D2027F82720 %27F8272027F8272027F8A8FD1EFF7DF827F8267DFD1BFF5227F826F827F8 %26F827F826F827F826F827F84BFD06FF7D26F827F826F827F826F827F826 %F82752FD05FF7D27F826F827F826F827F826F827F8267DFD1EFFA8272027 %2052FD1CFF7D272027202720272027202720272027202720A8FD06FF2027 %202720272027202720272027204BFD05FFA9202720272027202720272027 %2027207DFD1FFF2727F826F8A9FD1CFFA826F827F826F827F826F827F826 %F827F82652FD06FF52F827F826F827F826F827F826F827F8A8FD04FFA827 %F826F827F826F827F826F827F82627FD1FFFA8F827202752FD1DFF7D27F8 %272027F8272027F8272027F8272027A8FD05FF7D27F8272027F8272027F8 %272027F8277DFD05FF27272027F8272027F8272027F8272027FD1FFFA827 %F827F827A8FD1DFF5226F827F826F827F826F827F826F827F87DFD06FFF8 %26F827F826F827F826F827F826F87DFD05FF52F827F826F827F826F827F8 %26F827F8A8FD1FFF5227202720A8FD0EFF7DA87DA8A8FD0BFF2727202720 %272027202720272027202752FD06FF272027202720272027202720272027 %52FD05FF7D27202720272027202720272027204BFD20FFA8F827F82627FD %0BFFA852F826F827F82627A8FD09FFA8F827F826F827F826F827F826F827 %F827A8FD05FF5226F827F826F827F826F827F826F852FD05FFA8F827F826 %F827F826F827F826F8277DFD21FF52F82720277DFD09FF7D27F8272027F8 %272027F87DFD09FF4BF8272027F8272027F8272027F82720FD06FF7D2027 %F8272027F8272027F827202727FD05FFA827F8272027F8272027F8272027 %4BFD22FFA826F827F827A8FD07FF7D27F826F827F826F827F826F87DFD08 %FF7D26F827F826F827F826F827F826F8277DFD05FF7D27F826F827F826F8 %27F826F827F826A8FD04FFA8F826F827F826F827F826F827F8A8FD23FF52 %272027207DFD06FFA82720272027202720272027202720A8FD08FF202720 %2720272027202720272027207DFD06FF2027202720272027202720272027 %20A8FD05FF2720272027202720272027207DFD24FFA8F827F826F8A8FD05 %FF52F827F826F827F826F827F826F82752FD08FF27F827F826F827F826F8 %27F826F82752FD05FFA827F826F827F826F827F826F827F8267DFD05FF27 %26F827F826F827F827F852FD26FF7DF827202727FD05FF2027F8272027F8 %272027F8272027F827A8FD07FF5227F8272027F8272027F8272027F876FD %06FF20272027F8272027F8272027F82720A8FD05FF522027F8272027F827 %2027A8FD26FFA827F827F8267DFFFFFF7D27F826F827F826F827F826F827 %F826F8A8FD07FF7DF826F827F826F827F826F827F82627FD05FFA827F827 %F826F827F826F827F826F8277DFD05FF2727F826F827F826F8277DFD28FF %7D2720272027A8FFFFA8202720272027202720272027202720277DFD07FF %7D272027202720272027202720272052FD06FF2727202720272027202720 %27202720A8FD05FF5220272027202720277DFD2AFF5227F827F827FFFF7D %27F826F827F826F827F826F827F826F87DFD07FF7DF826F827F826F827F8 %26F827F82652FD06FF27F827F826F827F826F827F826F8277DFD05FF2727 %2627F827F82652FD2CFF20272027F87DFFA8F8272027F8272027F8272027 %F82720277DFD07FF52272027F8272027F8272027F8272052FD06FF2727F8 %272027F8272027F8272027F8A8FD0AFFA8FFA8FD2DFFA8F827F826F87DA8 %26F827F826F827F826F827F826F827F8A8FD07FF52F827F826F827F826F8 %27F826F82752FD05FFA827F826F827F826F827F826F827F8267DFD3BFF7D %2027202720A852272027202720272027202720272052FD08FF2727202720 %272027202720272027207DFD06FF262720272027202720272027202720A8 %FD3CFF52F827F827207DF827F826F827F826F827F827F827A8FD07FFA826 %F827F826F827F826F827F826F8277DFD05FFA827F826F827F826F827F826 %F827F8267DFD3CFFA8272027F8272752F8272027F8272027F82720277DFD %08FF7D2027F8272027F8272027F8272027F8A8FD05FFA8F8272027F82720 %27F8272027F82720A8FD3DFFA827F826F8272052F827F826F827F826F827 %7DFD09FF2727F826F827F826F827F826F827F826A8FD05FF7D26F827F826 %F827F826F827F826F827A8FD0DFFA87DA8FD2EFFA82720272027277D5227 %202720272052A8FD09FF7D27202720272027202720272027202727FD06FF %7D202720272027202720272027202727FD0EFF522027A8FD2EFF7D26F827 %F82620A8A8A87D7D7DA8FD0BFF27F827F826F827F826F827F826F827F852 %FD06FF2726F827F826F827F826F827F826F852FD0CFFA852F827F827A8FD %2EFF8427F8272027F8A8FD0FFF7D2027F8272027F8272027F8272027F827 %7DFD05FFA8272027F8272027F8272027F82720277DFD0BFFA8272027F827 %2052FD2FFF7D26F827F826F852A8FD0CFF7DF827F826F827F826F827F826 %F827F826F8FD06FF7DF827F826F827F826F827F826F827F8A8FD0AFF7D26 %F827F826F852FD31FFA82720272027204BA8FD0BFFA82720272027202720 %27202720272027207DFD06FF52272027202720272027202720272027A8FD %09FF762720272027207DFD33FFA827F826F827F8267DFD0BFFA84BF826F8 %27F826F827F826F827F826A8FD05FFA826F827F826F827F826F827F826F8 %2752FD08FFA82727F827F827F87DFD35FFA8522027F827202727FD0CFF52 %2027F8272027F8272027F82727FD06FFA82727F8272027F8272027F82727 %7DA8FD08FF7D2027F8272027F8A8FD38FF7DF826F827F826F87DA8FD0AFF %7DF826F827F826F827F826F8A8FD08FF8452F827F826F827F8527DFD09FF %7D27F827F826F82727A8FD3AFFA820272027202720277DFD0BFF7D7D2727 %202720272052FD0CFF7D52277DA8FD0AFFA8522720272027202752FD3EFF %5227F826F827F826277DA8FD0BFFA87D527D2727A8FD19FFA852F827F826 %F827F8277DFD40FF7D272027F8272027F8277DFD28FFA827272027F82720 %27F87DFD43FFA87DF826F827F826F827F8527DFD22FFA85227F826F827F8 %26F82727A8FD47FF5227202720272027202727527DFD1BFFA8A8524B2027 %20272027202720527DFD4AFFA852F826F827F826F827F826F84B527D7DFD %12FFA87D7D2727F827F826F827F826F827277DFD4FFF7D27F8272027F827 %2027F8272027205252767DA87DA87DA87DA87D84525227272027F8272027 %F8272027F82720527DFD52FFA87D2727F826F827F826F827F826F827F826 %F827F826F827F826F827F826F827F826F827F826F827F82752A8FD57FFA8 %845227202720272027202720272027202720272027202720272027202720 %27202720527DA8FD5DFFA8A85252F827F826F827F826F827F826F827F826 %F827F826F827F82627527DA8FD65FFA8A87D52FD0427F8272027F8272027 %275252527DA8A8FD6EFFA8FFA8A87DA87DA87EA8A8FFA8FDFCFFFDFCFFFD %FCFFFDFCFFFD46FFFF %%EndData endstream endobj 19 0 obj <>stream -HWn X)l`=y+Y'n|,H=C\SC3C`E/ -h{ѻ@{U4-2My4>H$aIC~G|`#b&O8D -}Eegw g?8l ƤgŠ= -o;i^Ω| PXq[Ĕz'|O? >#Ag:jpʯXK`$Cv<<+~8V!VqcwB}qUqM0e"gNy4 GvPrϨL~w)$9K@t'=C$Jʯ%郃m\C"+l; XmF -3P5\ndil@ Pz]Un(_B2q1*z"!(%JfgG>ad39\"F5'h_:1>vCˇׅw s֡m9 8ށo}TJ•l(/O_/Hvq20av`_R#U@$Яs6*.!onzz,8c{ :mî ߰R/kP'gg4Z:fm^s1sE'[(mQ.Gt@׌'0ðZ;puO{NKŞgN~;G e6YV#~,NڨWW;[CwiZHV9zZap{fhEZ]޵B5!q$2舶q+Dhusg8ȓ8˜f$vcyg1MZX/ơafcios#Q ;2tbm_܄Bǒ=u:biF8ĆqaV}L9AFT Ӏ*TEͲ^<v[달͚7P64Lc"p4JXgU5A9Ы1>؂><t|*zf:jr3e**f|"${%'Nњ~]LߣIXzȒIBXʎ~.=ŤTΚ><_&VmC$ڡzвQ`cDw -fRϴvΩ,Z$ kYLm46L,с5;Nf--t'UK܈-u$>Bz]ಶ\'IzZʜt"T&$gi6Q/#iFe]{ANEd.EG&1h~lc@@HR@&g En"$CIIL3)Niz5ץ$%= Ri^cEW7g6CF#Ƴj)w{{[=J?Uua5 SQ@H+`vRj Sn#ijw{v[۸ninn23$I8?胫g%]`㼟[5ǍxG+ XY/"".:2e0wVЇ2iH$R˔-V{Pr4p0*ߙAkUA< X#?/D#yJCYsW  y-%!g,"XdsХ܊(Ȟ؛MH2Cܨ!\S&tpzuAq w SV= .Z>'!zӛVq k04 "[&Ꙃ,i&;PI F3T"bqx[p3Tg`Q4uI"~8I\d |!w+? 9&(}FЧN" - WA,9A8tBu`)e4w =s.饁nUAq+[Q9,tع >5!{'/CF DH5 J[z֯e5 9#r;(VOO"-,+SIdC4kq`)Ʊ9wR%h jbz8PR 5pF iKH_ؚu0x~qqg~Nդ[zؘ0hP0p Uj$Vl(ʢ[ј.5#VTSc4Z@.85h0/T_:_- I6BPa=oHod$8<&bF%@,uMuJ>9|U FY|f/Qdߨ ,DO&#(:c \|zS(ygQ Db XI10ʡuE쾰ңȣl B$ȮFFl.+FF#h*yGaYs1#e35=F:LkU쪡8X7 -[ڐ8DL0#J z-*Pm9GԂlr- E:l "#p4 ,>N 6$]@@US茌[ь&4M*d`!;gGzOƜ%FHUb"08צ[P1ÒA:!T!*W֖J[,L.zk |_t& =,vF=h?Cz&nA<}M/E.],r\% ^ӗ\S -T"b1)F>@J>{eVmY8uQY V1w% ظ( -&CCZ+ l.l8ȓmIwI@kFۅP+5Dz%pH 7@+txW$6 !~K9ne:)[*VU7Lِ4Sa)Z^iigp~`n^䳜;% Gn`2 P `P -MuCgo9ӧ,˦E|U")4JHC58h ;w}.fVxyѦ{2V$ȘVk<] H*A'arKwB ;'ŒFbH -^I5<X"΀W L,,"@]0('Ȓ *2w8`Yg3靳'cVy~)\,HZL ەl}Y$"w-߆ыc+4l@%JنwYq j\^[TO'ܨdg&7'4HJR~;UK ->8~(`M$65&u5V{iޫ|2™9LL~B~Ż~ 9p#:-cs[) Pӳsw2俙9h?"tCg97^@! n5 `A S[(Z,؜z9$dqy|[Ace!ھۣb='Ov@a@6{+;`r`"&XP I -q+BPuVO85*Q{B4ȋ>->ecĀFǁ3 -BG -k =h4h u hzh,TJ @',4tҩwL.TQƈߐjXpÀmz[I@ | 3o"zyu&YhvΩ /G/ƔC^º@ݥSC{c~o Byn$ZH,00-cm>aKA -@^5vhR~Q$+|kkِ/g>J#۹X -P$}1|&K4h%!ؕXu 9 oH~S}HqłɖۊM}D᪗Y=<eЙihg{4]҃ڏl AcǷREqVJ 6x2Lwi-~:hZ vZ [,{{ FoXA(wEjⷰnDk \͉ۗqTZvoj50 gXy*k >Dkd;KD nϊ-q_T&IΞPA&Z'(dZW>Z[p:Ke#?g;kqVJ.5V-QE.I8뛕;k dKQNj+駘>]o8eO^İ*2kMk6L{]ifN,78͸BN[H/gdi7]9 #M<{mGO|ŋ+- Y-XPQ@ɻ.^g7ߘj{ˠ0vjwXu'Oy&6.cpl ;MϝpZgzGb[)i&AR{gljˊCD"D/k>h,)?< - -ҏ.z^.2hj6q3׆;)&/'gׅIXAe)HR|4d!ZG -X74(݊LPBk"R ϩH9>t0VY?fEϟMeORQ۾A Puc+ʙ(v}^?,F*~üw zռ<~P\b9Ƚٟ }e -R9O=밠/iF@O7ג] y?<$W'5N]7\:%]Ykt%E]No mIn?Y|}aXk_"c؏σ1!cȘ~=^-4q&W)!ZCo)(orAsjB^~}Sߺ29CJ -Hd6"I2QdKPf7RVc- ء+#fO<#W\3L9ӖN[N.CFW<~l$Xу&4|.IKUk>(A )ܓ]lpZ–k(a#~hbՇ'pUS`l!?ʜPQB:M#GPX[o*x%!zd nzW^oq=~7xQmp0-qg Gg-+W%fDcQMQ}w --ѨWZ2ڨM$zĵ:kLJ_˘!K -ȸS69% =/>N>u|N;ASSģ4lҠ&˽%QLhTw%JؗlhlEXGaɸ/ц7tWuKƽw? r-~d$d~H~ѡNY$;-{otL3sDL1?a^iP &LЬPHڐ!Bax+ɛ$$Y6QQ,3gT=<O;%%;l0`g~d "E@ɢ^EUyqE2kOޔkmFQq~sUo˝`P8Kk*ZBE#QE _,-}([aX47,Gl" -dG*dpxd͚6Q4. 1'*Zh*hPfWJAm|M}P5Irlhp6W4P4X8kaMƢ9v ~iߐGծ|u;mgϙdžn*3̧ƃY |)Y0$e bY.$( =Πj`eEc'g 7Q9zaN%'4,Y4_|_Yo|ßbϚp{E,(xקxM1X5Y/bgsP0C8BBqOᄟ܂! -4,YӰ6C#(BP䊪Kq| ;d'܎`/ԓ$:BIE4!WJ &:|^IaV`/3 -A'){Vח+~]q}炕ߺgᛘ,c|Tr :}V(-GIv;Yţ/7fZ,Lo,v9iF,twʍkӦxfL_Ք^:+'';q@|jo> YU7nܬV2pZ,ipˁw_5 ֝xcz̿K./r/Y{i^kg$v5vs:/URVb:mBJgՋ4;^ -{h,~p.K$^{ΥKA,ˍK3}AL/RY{ŸN~oNzo+WoK|7@-ec& _/ֈj"?|biJxr=LI=w> @Ov[F,u߻:9:eoyC+?U?[0MyX ?_Ň4y-p}w$~"9GܤK< 9%Q5.bHRZ}J5lb};il<Җb˕ֵ2CLYxHi2w_Vd7HY-wAjUUI{ӜIGϘgD? e&hl㭪V?mkY:EV\?ɂO>I +bΣ ޣNI{~Dgn[A~MO~/ -.&3meڍ2F*Zm4:a ` 6~^ISr 2z5 `gفx0xjC--qb>X/ìNJg^*B&6uc!֒;C٩4y:\'A5OSC`'Qp7eKxdM1Av?0Q5.bqFG(0vrBvHgk7=ց#E:4j|'/C dEO8r:WBt=Rh84x'iܺx *mGsɠY*^",ti(/%˟pz'1%&Q.QpNcMd,o,wiyPft%B5Ka>E %j *84%Qhe؟J -<%UءD܀uQ@0"qݍ*FnӲJ tDbAM2;OV(rWF}z1Hί\%׹yԙZWh5/jFNF[(|۹}ڹ=1ஙx)TgPqO^xXT v#fMJšxJ'$,pV[nA(Se%vqS9H `Z] Ś2ߧ{;Ŷ$ {U{Kx8`\R[lS[Ҧ6:ێ\_TM5VN PsŘ2D^t= Y4k!,> )[pAEBLCh1. GiaX5~⩤D"zDʐb8fYI=+r9%|-lVC_:*39XCjQ^eJK1nlCÕ怌lhs:Sb' {E~}Bٗ;;5n -Cb"G)GX0NE_z㯇9`( O^\ -R,_I>=e-VTZpCF`}Oxo[k`dA˧ 32n` -u\ 8cMo{%=>p*သm4I[R5dÚ_35`@kHv$2D0pB -!N%c5=`-Zk/A"mØQ<<51o]ʂqdF%.o/0n:p ƃ߂k'|7xϫFǏuj_X'խꋿ;ؾ;J+s:;"ncSN'KpIn /x3RUwgF`"Pʃ׹xwEGyJ[, 'fӆ˩SҐJz IT8b;O}wlj;vKOpngSh -45g'&?/ʠ?.C%JGUIA)uȔ rz{s;oo |wє *B3:qbst -6#&۩e|1ՌvL + .9 BBAJ}]$ay1ng%^G jn+xXmוEF:J\U`\Xwy qo Ɯ".sAۏ_V8M0@SHLfȪ ҂_\za -,]U}ȧ94(AC m U_-Dn^-2aDÍh q!ِ2=AhB$`@=DNB`P<3=\u)ͰAW7HStȌqW%"bE=I~FD,hpT{5q)m,vdhɪ_7'g`slb'"Cf[M}ZF4ۄ),;*^zTLϏJS{?"|_\R#*p@ˈ g\PB OI$0,l s -bTҹ_cĭ=VagvET;sws \Vԕ -oF,XTx[yO1کժ _jIF'C -# deuz!yj(}Bќߖ[CnoKLC9y; =K/hbl:s Zňy|B_gm~y -sO60`F?w 7Oŵ "$5rytvj'ijDےϼ*OTs#[kЄR%d% -oe{V0_OB 9d`~yB)˥¡S0wJNFMURbS_D0?r"MxVd ɑ'DKXΊFJ»%91C.K6ߜZˇtf~4>Cd,"ˌ1By# +$%$"%5>stream -HW^L}<@H $Vh HE,?dyofa&Lk6A-uYXZvbֹ`a{|h)T.Fe9jUrѾ&eI6MZe59YzeP +rŊiPsƽ*]fWqS֡,O&jNgQJku޵ןVdl E$f|e)>9Н{T= -XyN\|k< n'] d ov"m}|UƱ"dIJ1>%*%"Eg7\;Pg^^ZyOI2/e\WAott̎&ӆ%5$m5a5!JV^\Z{3\ckE%ơȉ٣|2]xIGO&ʒ ԂH* -J+aB'J:'R ȥɏҜfw!;rɳB^l8T}\l&<+dKwQ٩e-nbQ Bn'&{ࣀI%dLx0Syyhdپy"0Ur{ ۚ$3eKs>r^2z!X?a론8¶~Ycu<ϬZhU]]Gڑ$wcN9;9+{۟SSVG:YFpNzG!F[Sr0KSL㤿Y. ~6et,Q4kFQ*j>GǽR'σ IvЖ R's3͖ ɐ_xI:(aAGHy cp޹_ 艟]k2qH2J+Z=UZ4kN^xv'iǤ V$\/ZǹIt$Z ƙ?4" G< |y›c<%kh!.:"T\b4-?S!Kܽ -.)ןL^+ora,bw.Y-ڹrI%QxBҊNAzxR6 '?6v{z؂~sCd*8^hjph3f}>U҉] Tzy:Y$ֆ\ANRU1{abVC,aB]IR+kmZv;U-g1,#.cii+tdRr x OhmRt W(lqrc Pآm(}1KӁ5N(MD̑@)͋J*N'`q K-7dەVW1FVvY~A}'RcmVE1x<[ح1 -JWNxRс,GqI>łyA`  -(]%+O=MvNm͂rR$rYm.zeiNߦi!*eK+^KPífZXϔ4ox@+;o(+ #X#(O)`~}Q^> TkE._p}e3BPwGqBG1W\;{j sx+|6t(4jB -mH"jB4-`&DVm>ֆעqW\D8CX#7L5pLnr=ʢ&L4^R.6o^?Li|h 2*Xbslo9DcXm$"s$C9WRސQ ɜE͞fwå"X>ޠi qJ=^Vesq{=Y5urX}7/maa!WFiÒjrې#v72e@@9aΊgF!T^^ZEms>X X*j̀cu3Jˬ|(g>oY!Y^Y!1hiXf .dgO >GP9WH2o.TWQoHL@䪃XϘ5dBIWzJ}bQc&K{TM100{v[k> ёPĮnȁ5{zhD#?5 Xb,H/p+z|ƶx-l@i*Fp=]Ɉ|tjg)LSwA`p4|g$Z:_@*Ex:ecT- R:p ;`@_>4ˢ];Ja;n QqZH[t"!&8gF=0:*RmK֢1-s:#[+(kUy;87Z?Q V9C}uyqai'a\Qo/U $҃ĩq;j>9}_ã}hԩplAWÓb}-&Ppm_Ĝ_>E]qu贾3?OqܢP,|, pI`Omg.CzZ7ۍ4YGjBLlBN{ѻ [i턨6GN'ł2Vɞ 6q5Ft("_f!7 -g!/BHz[܋Vߣ4sܨv |ycNӔĆtwBxkd7ڂ 1ŏN7UmsGRGՙ^zѷQ>K.=ϺX.;X[% l춾{rNօypr^Uk8?SX0ۥ?j{4V'c271 R~ kg(lUsqɰRI;:BtC._%0+#$D 8Ԥ3w(? !JL_hxWNM~}۫MmSmСBN{\7=p?UȾ Y?ǾN^B`x99Mˇ,b{j=Н- JbǶXU6{͝,u׷i낼$RqOK;l"ЕN)ޘ Zk8'p j5\ DрڃKˉ{eiDOSU͗쉺TU)5&k!n:Q22}WmE E[ $u G1% K-Dg)a;yO:uw9aT:%6Q at!cPP{ʞK !nv6փxo4hfBCi7+AGy&N+!rgOu2 Bg+SVPy:rτtևN{RZm %ilTv'0>$.X߈e64eH ʅ䖃]9d s{?-g^epEqN&7=vr;ؘE"Z6]r6_󄏥kz@u'2!u/%4t3};0CRD-QjJWC Rh@hҵpy'$3*s&z"pߙhMu`Y9E{svq, 9Hʳ꾆gOhPYSm; -Ǐ+7Z3d8>ꮍv7TEPr<ө -`=@モY"T9`6Pc7-#LBLmggKA:!=_c駾[phyhɖ"TR4 ŚWo*ʛ_DV뷽*ًA hv@]I3Q?F\;#I \6KDa:˱Cw9H?Q7mO^mWD0Z$<,tuiݒE}mкv Lt(ٯ*iNC* ??.nno#̿1Ώ -9=ZxA{2kI> `$Kn5 YnY'*H!_qRh6$bvk̢+;<9A K@K +-,zw eUxBѻr[=\xPf]B{jJaQ`) |]Ci5F&^Ki&OgPUwEDUӀ8za^bӘEDՊpH3J{rqdXH!0^2Iк(kJLبOľ G%e lBݪa" FX8ހ_nۙPOhcxoؗ5y3Pɿn|u|-?T,FxJ=~>@ǬrPJj<)-Uzx8&GGJ)f<\I! r_JX[O;$HQHgN! ?YI&=of*ȧrvհz Jهta՝ˡ'O%=`S3|֊_l0L\''vԹC{Mɻ5 W|l)PFqS8/E~);מ(L|@q1\Tj1>vvbHɎuct+8}9gT>s!q:QQGP vy)x8o'yx〱9v -%E徍9RI kJb'b2ս)jj \dU;hoU{:P;Ѥ-q;&#OӰuQh=䶩1tYoVݕ2ZWK ;;a9+݅-oco^{<˥hoo:'O,f%\iG `)pW)`hyGgßP斊*,̱ygܕ^r2u-wSLɻ"-\-[e%r3"'Bsx-c jf34b|hfޗ-u_䳟~@ 0f䳌rA"ȰV'Y[+񾈌&ގYJ46Xpi3/<[@G+Q(ȚƷ\ˈ!f@3l4-LQϮL?c4dz5 B3If~3dhA { @5?BFf}g8H=kB2 !-?o lA"|e;MyG cNnjcXZU ->ZmT!6dH*LUVIx FUnFΕv/oqx`AZm+>(0 kQ{GȿAɆWYkّYaHj8:.7u *{^GDcFrjR ^c/@ LAƞ"X]K"`5AvE&~DŎ놪t0'PtY3 @;^0܈LRgR7W}S< *TMUKe:-#VSDa̰S2"޺0v̵+e@Qmxw --> R*,BV* (Ŝ Sg= -_+FSjL/z3uhd5Cݼ\V/$n) aM6'd"gN˸_HE@WѺO"pyrkX[MYۑއ%3ۻKN(h5կrzȿzSݗ *˄=7K1\Au_ʘMp}o(k~li;n}3L-q=%Cg7U>x2\Y"^I$e䫐AkZ+/H-/u2JjdV{ͼxb/-YLG?QJr& -ѫ[ \I U^!NSytg6< MA$Etܩ Apwhq= -czakbHZFKet,oA: CH[%3T9z_F㡿f +3{ 1O<[^g`(,t? %D(/Yi>:aڨ7f~/u]|G_'!UQ..B9u̢B@s%#t,u'[K/A/b#nIe&VIuJo9I0]^@UY%KJٗ2+kYW-xb<_F'5QY؀ =IY_ZKF/1l *MN\I'f f1&l`m fs9\`n1bn BQYY_f~ 4 &2/(P:˸aW A_RY -$whax2GSN -3?C3&fBSXjoiMZzx>|ɕ.A^ Az0X>I PZ)2?fq])pWȘb=^+k -.g-MA]Ll-wiC8Y8`I|>F"%vXޛFWbqfxz(uKi -^ÚGEÛppg胍(;G#/W"QJ9jf5c'iLo.F{%S7kx+ɪ#0QotQ3gא[}*)Aŕdֱ{Z+PQ:[bݧ2g=ZIN#y`^N> ytk.ƪ|~GlvGxtPpO!@Y"`Rm *&'S2X]Q3|n;ߩ C-3]D&+g煇nMdrvDgmylխoU3:^\Ѷ0rd3?*;aR -x0ϒr1Y= -Tpk])3a{AFwL[j])hɛ,b.IHf}ZA,=:v̴ 5O_셴H8ZKƽ6>_+It)7)pL8׎+ b 7:T}ɴ#FA>OWxJݡ­*PBTWYwkJ#FLvF솽SVA$gyL7HpImH)|s5;᩾}eNאּA8Sɍu}BQF&iCcj2$Il0ۇlCA4^_:AC=iqN_neL+wh=Ga`~iAsB)!u#EA@k68D>Nɦk=@] 2:n?TCg,*eBG.ƎB&)DUyQ_d9Vs3©@pG6P>} N_ҙ5 - .hՑ}T1ȉ`'6TgW{W Q8o -ZRmp "›R"An{JTp wѭ;-e)b{OYdeVcί IJ QBRjoo^O3ƎQ:ӪlW7OlةE[iɀLgZ 'Aud9bGH?"i⚞~u"COR$S4X%qObvV-<^B{}JW=ka(ùQq> L)45s;ˈ<¢0FȌjӘٖ'jg/ASX5 -)ʁ͖Xk>a ku ud BDbL,Q4S|Cd\ȖU N-A)_C%LkS&2>B#"s1!@b2&ăSf1VM@W_'u0-#KoBv9tq7E)g͕ݪ1#QSO{0NSuUNgkCMjs11ha{օP -D{h&x?/f7̓nG*Zo-ސٗvwX)zN2 !'-A7x? &L:4^Ke&/dd5W3]@G#.HO@R{eDC e]S2Ehl>`7Ƹ/,/]JZnwx) } J j,lGZV5.iOLoCzoG<$ 5E}\Ը+;p5'U&K˒YrI;='Oo$ J -sy -g4W$/🶈<@#P 60" - -7%bĆ&9BAz!Uoj2*'ur{%H2!cFkD -;d/W])sRU@CMa IֳzuzX׺a`v6Al/K:1~"OHrD%Չ+}"'5bN/>MxI -:jeUOpޡ6.yWZ B5:3?*+322u~CPp;]ǟ_?G;/Σޮ?]{?~xivGm15f{2ͣóƯW*W{}|Iȏ$ۏgnwkY[2`ެoֽ2 i*=={Z~Yx[`{aP;[![zŲ=|Mo@zkz6Z :@okxi¸wѬj1oDI[3Zu*n}U kbXv̘Z]Vw>+CrFta=f!x\vE:9TC@%>FH-g{хsH]Tt3ACuNC - -$)DLgњa@#ސ`QH B 3u$9է0$Ci;VD6 -<$uCQr09G, 9v=`XwTgY&{v L ;1y&m #iE|4 2 &|$e/&IF4}-uy`rOcuXIc`qE 9g`fVu0 ̄|K`3 ybC4XH:8xAɴ_߅yR<ЗQ2EaBm`4=MB45sX(2z0HcBc1LT)K -:,#:@"Qa0Q(? HJ)aT]&1 ABR=6d7A6rn qҸT&b>0v*σAa;Rv4)/(|0fF3.;ͻ*B"_DݧN(f' *e\A)sqj()廾GoLC-t, &e6FZLjF1) ,%S{1QJrL-^1  jqS3 -huAFkŢ%j:G)` 4bCä2d09EmR#+\qp^yC<ڜ0p쥋Chbh9yjapg.OAh !bAI(^!&e:rEi*+<$~JǑ4 T^|!#hmLMCx|M:TAVSR Rln[Ţd~3 0HzYo e ,+kȏ0`UXGÍI&|Pu:F -EH{Jͧ{&(9t؍M(^"͐XgH3b!A5 KY8UQמR=Ӝ|YFkrV4Jy*xI+dAe93A# -l5"֙=uV7bTMj@hV`fvSZo䕕{?}G $ك~0w,SrXAaAL 0oi:+6Bx10U`.>aYp*r!xTWt*#r#AY˃A(g28ힰ'0Zn|#~>{-yav0C;7U#`0᥉Tyca!FIWd KQKMօ_8od0>|4(TALNSE?0[w[bDi -;#1l'ƍ;1qeWuA-1FcN1 }\KZPeZ;h-Y\Vjx7Cb458`UH:ϥ~u<]Ƀۼ@ G]΅MLsQA!M ߉beVrհCy -]>=6ԾPt -kR!<" x3\!dhq$൴հ k8;jڪj&%84uwq -f4]5 a.X^?hJ5GÆ2)Ewԩ0;9KS|j?70 }<Eϑt[&vpc} N֥]LwLչQs CF]@C!soio[H~`na}~_`!8e8Gu2SҷMοqC!`# -I .b7N` Ӣzmaȱܶb054^H-h -QB˭k$ -f,XclSUW$?4)8֎Ruw,]TϤJk|r.{_uXbX:-1ֆtù;{X;èH{^(wS"SjȈ3!8Mi7)7ͬI8JF?M:38eW.M>]'zd80]v W``:O[M16wi -@L_ -Yуc(E9iL,*,ʖb)hSt$yuyWU~!J3,FŮZ^!Oy8blbEFxųt&[f*55+[ "ƿE9}/DQ]}b&@QIͻ n?S`ac*؞pVa, -Iև`>'`%{m134?dF cN ^3-[}.&Meyb? c[ˑ[~W- ,W ނ -!-]h11}Gq#j6Cvszj6ca~z^ƋZ& bPȄ 2¿G3Pf}P=ƿaL̀e99"&\C,#r\p|:{4qLޚ:a -d0* V(X2BnFu -!J؉lPwʦ쑚/oa"Q? -_i ^1:fCpF_$gW0s,1ƗqZL-J<4M<RMC qgi<0(#Ϩpzf)) a; -ybbL&USc_K-3KMo$j_r11G.:^r#tW%1'72a= -{~m`W$1EK̕<=ʿ!/DcG>0틢ßP5dGD yԪ 6R [Wi=3P /b̀'hf(>T縫j@\=_  -(&@fbToXT0EC=9]YXR9OB^GT-DQdZ8 ND0Vy%r@Q_85-\'`Z ( ';ƕ)/% &L'C!۪U0Es; -8l'N(o濳igӺ5d?!EĦꋙe!(a%'0 aobU׭[\U A: KP3[*f*̜jh D|@2 MŽP5Ab\hgcIJ>+¡&] >u c`h@ab%ȄbR+|*=` `zNb`փa?N GIǠ-bܾٚzQYx3\b !2א{bx:]!!HN ;`u㈁옃ֵRKN9*! JvͿc -ܽ Q땆x" )a@<2j2^ul)e!b*-~lckb=}>›xzQzi/NbA"Ђ -MC[J5ũu.3bs}lPxK-01(y X ͆'ِ7:F!bnf,O(u_ 7 zJ(] &KmAdO!pM+-ϴ3vK=WxL95!WΘ&@Y_+TU~\d#Oxq2Bg|t -zE2|d`Hd_Bf CR ^dzĬ5 sq-O0Ou6!5 Ђj ÝAy1=>—qDoal_\t{YDIU}ߊɺ8 @dg3ro0hB0G*)f!pxHU^ $ATȬ,c]bPL rl1s>UW>гqaVI 3x'AHU3) O J|Ijݵ[aeFk)4+#} -YKWr --T6BWuߧ} Q[`d( _ /myЄ&}L .c1,@wFD t C@xI}4b'%/`5}}9)1ɏʍ񦕄%Y1 'yesŷH11䉷q6IctznS"py_瘵Þ0}zɬ,95JkwVQ.Fݘ'Z30M[Er Ѫa0 eWs',zs[a,+׎g`4^^f)S">WԳkbPBcy;P}&*=ɛU? -e0L5IU"KDFU'/afIp9Ycbn<XJA 6b3 *FcxfFCOZ*v -^LxT^׍*։è*:0t*PfxPP -9{~3Pc,l},pXӺ1o^x5x,4#)Faұ{ƜnDQ=H oEFOJjHi ?X:M-Oa?EHk6FlNLX1 >´DؓXQdXV U3>Ql91WZ;:݁8et8EXX04дn Gʫ80)]1v Ưt~ʥkbm|o-5B={//@l8e"eJ<7 -Q|T(ו9+k7 " ݩ #ְSVriqЗ=0?~w~?ߎ_Guri{*+e[D)c0bq^B`9@W"K#qbh(Kpao l.;ロ-1s%ID(,*@#g%a-D -7gYʨX02d^YYsè5y<~+J+ Q;X73 '"{9S uwG,2g ,m>ܘƫ& .WaÙ -_!l<(ئK:pYd1Lm;96~_u0q|HJ20P:qɅb]$Υ4%#VϚɮNz: ZrmR1Eq :oވx׏I<:ogJcۂ$pN'*h/Xm8c%Fҭi~t cArD\[f a,!68[cOʾ.ɦ\gQWFM9ya"@M'diw~5k0x(ߔJ:S,yUJa0ù)f616nM["3;,mC543v9݊%o1)0IVN2!sÒޙdRrI;'=*leDG2D`3q׾2 +E7)^qQVl$V׏8xsu8:jϓ~{O8Ò[ Ay"}VQ|jO*5@usdqcʎ9*s| eqɥ FzrǮ3BcOF&11 8~%3 - -0H]O7*0 -?.%'[J`IQ>'fnRnlB&0y:+gKтSG9)*sǹH<!ϲ07fLR\>zCQ[ֿ.H(Ie2&ŵ0"ODI.w&=0Z"uaZ4Bd -[0TEW6PS kT]x`;}aF! 9UslN55(@V;'uNVaSNӏ^z1ag1LM%w.{$$C7>QXatԹxCFGنv%8x Ty{@d -+ {uԻ9#1X2q7s0/5D+E Ϣ]V=%LOw@dCʰJˀj:b$ v՘bNBMMKxv}vj8dȋ(b@s)}s4VT瀏ygMlrt[~:[?ztU*\H)V~rj53:56հVS3il7_1{EdoyLjrR\zLHM˶X$~o;zTYXW Z>X52v: (.{Y& $W5L|%0 mn(J$|RnmBNO[i@4J5"\53~`̆?DqRoF9σ_kM-߭2Cy=L1PIisX_(&YHړJO(`5{/;"LP_{3-]LK~`z"!\^i(9w.ru9]pB| }%EF7&5~\ pqIhG]Xb&2vj<@;/ZN>HΛ%⊃sB2?5ϡ|NZuc2e1s/Yr}WOVj{zfb7 JFc"RN% qSUj@CzA*_e9 endstream endobj 21 0 obj <>stream -HDݑe)-Xʂ~|ZKLLtW!R߶5}E<ǜsjbGHwf0?ձE06l07l\6;WZ.}7_W̱jq%LU͝O bHADVnkV]L$'$_$wrU^UmE|5|X Cfq?O߳g㕼W?kinjLcA0_LԊ 3+axhB^bfMF07EBnoyyj.q!ZkZׂMj> y!foqܼ)SU_47" %H0vbt+J*A'Rs*%Ȩ SQD 6ـoFﱮ.ŏ~mNs!Ra3?QZ_vFhb&TZn/ūIX~_XJNT[UavY %&5u! t/ߝCRHCu( I Bpu3AӔ@u] rMFC\߳JVH&n[ |S z)m3*$Դ(r1dg%G1bP!t oeՐ{s`) m70ǧ]Hë}T(&hf\}i8Dգ @ #nS`6mDc]KF).V04^/HI|RWJ 1=! nTDDe-^Bd<(97ƐފߣLMD -?Dk A#99xGQK `؅ ycYQw -IɽtfX0^& @絜؇]49n⼫[s7_ba`DI'd)s+.,0L ,a {8gdKOOZK0+8K` d@gS Y:0xU}!-31J0{R}9Ys4I$T%C!k $΄~!tPA-aA̦,fje'm0EsETY2[^Cn8*A,8E]~j -Cv]%>s0Wrgd+ESj2)WY]-+;吒cxt,gG+V jl0HYo>B./?ɘn||xBqr-!艺Ta0iI0-|trahC.Sұz;.tZW(.JsLa0  /im^ -DP'L of Gգ. U1=e!seh'VS]zΛE(UPaeG4ynK`ZE7I!7ADsƖ(*M[Ő>FD}>C}f #MZMQ @[Ԕt#DZ.PL|S{א8m pJEÊH8-Kbю:!{B6yzLV:8IU :"48 w\+ʥ`\},Qdz3ed "mM yi`%PD7l.|g -lr.ftK5/w&K;C>v\V@j6IX|o ;iF$ a>U`2B~YO{K.&j_DCclp0%ef|1kC8gH<Bq1ķ,aߠ#AӴVaaj]CA }L{"]/Tp/`x2 ZKYC4TeP1/t:Ydv;>kNZJe7p=#C\( Y8SVE~5ߢ|U!O`(V㞝%!1ؖS1=Ҍk CşOs|99 %RRJ)-`UæG|&鱁u9#dzb Px DOZO¢˕^v=|JWۘB33aFO8]zT!%vbaMwɊ&gz߰ LgFz^:wDiS&,-#,1~":0x4;t l9O#~yI;)Y򌒌دYҤd[2 c.4:NL56fF=7&fx-W07.̝SV0Nuw13`HCi>~M+Pq\ D]^'On6.WXoaƓUhju%/*`* m!o )IG`Fi^zZɐ~,\3 ϻ3E=sx,;\Œl}F| OA$͎1.u.#]6rOq-OؼҕY}a]{L\P -,lsH`FҊ(ތ c(7[ƾT -sJZˀqT®$/AE$rl0n1dy\u6q ';آTb)K%˖0*W<˦@0Bi -bl D4 '%`}la0+$ Ӣ"7oSP h @TwD彐 0'kwaQ`b0UpLt / s$(R[īOup{!DP/;; - - nSkaP ) q܅A:$ gWFqD|12X=vlxӝUd'T ~%Z.+B9#6d?,SjP` #b# 눳JĬ\j*f )x< Fw^L̍Fn~Hb9bM -+'ӓa:.MZ}ٌ;:jBtWG$!ô]j3θ= o)vy0-3xfg18nǼC^ԬBQJ0 @ydLX,!R#! eDˤ+W@;A fQK2-$6v'_]YE3AmJ11Y{Zzy]܎ʷ8ӟ2 -&)NS_Kk~0?|cO4:X2w$=1v#h[0Nz J5?tyŔ+j"Xgd4^=-$&ω25G0z_`Qg5{'9(II~LsG%&FN--wlL nȥZqs%7M4Q;QU<c0YKLWRq,0AFkYcE2l=(f\oړ( r?ʜ!9# ZXɯtFnwsyxzcu8b 13'bIaf0ka$4"q4zU%OXuzCPہ@\`٩ƥeG3K5*ƥ,k`L>}Ӑ&;6!ͧԭT-"g2wcHƘ%6֓& UZa=J{?JA[&ܾ~|L>ĎԽȰ9!#X][@$176o6$e,_1B+FU%uy(sAo JfbŒyZ;̦@<o[0ФC$o.6 IjM -*Rq*>W /<DBK sDlǽD f :d!R-&ȅq'J4(ՅQ$*EP&2DU Fdr[jdr, 1s?,HIŻ -UֵQ$~ϣ L -~[@24R%Bs8Uy,ٖxO&`NmKcmyWuaȊ:E1Q$iǷENr@0u4a3Zr1({fE y" -Y"hxZɁ=LMpM̘ 59>bAL:Q܎u.`FDDiD3r }CPS/Z[m`{&E- !)$ \s rhl; WYVF- y&F-0u4פ3Dezr/B9V\4@^Ȕ!1W3Տ]^R&KÜM A\6@(S,waLgks, N)O\&ZL o> "YxE4%Ls0‰qdB3Lh]åA+}(j +a|YmEka9kI$: r9$wF\+&Һ:rObӫ5ȴ)zc ~̨ѥ')XhX잡5J4 -|U_ -}xsAwLx]s6F?01jR=MQOa `O#~8.tv2mqS x7TCd -zýƯP#W:bAeGf*~/>陮:q,Kp

%{!pî_U{2\>͓Qź]PJP)u\7A -y-cw;wByX>DK( : CfhT?2ű[EYg+Vg~:&9J0HьmJVsF gWЈkB% F b9n۶YR|ĆRHc[ `zmD;}Jh*4xJ@se9y+LSFG'AIT}-LcZmUmw5"8!VyOǽI@0;}̸oGv|ԓu,syPumhC:v&޾ 3*&56D1? nn{=1OR-T;'<ǽnB3I<؊ROXg;T$m7|:-nk`,QΜC)Tk]+W g&슛h>=L?80U{aUa>o0D9>}/kdzev0eC APPŢP>~.++0Te'>=mHUBٲ -b({a蘊*c,b8:"=KôHĸX40>B!& -kQ7$޽0FZ0(!֫m̠TNhJv0JYHzbt`ZhƁ`fAB_}hC/9XȘ {GAB$|P:1ݷ 'ӚcE 6i6@ DN@-sI$)i2{ 9% FREy_\ `b[f@m/l$U|Pv]vƭbĘ[q'x6v-1> 7T# õ2ee,hZգkrQ+*iz0 V^'A01 Fļt8MyT!uk-l5B7{/Kž( ]ѷ~F\c(|[G6\wJHH -Nggش'[LzZǥ`f&)pu8=0#p~=R`zjfrj"0J1>[pYO~<G xI7ALv=,݂qdgcI%L&t2]VP ѷo%q4YkHf#–q'~WќsaZ=}cՖO-YRGtt3щ #ow![ M_|ЉUtUIs{Cx9+[펛Jzq!+3y{c)pRX8Fj}G_R(mDt{W0.q[Rm0{I'{|-vb𐨩Mt` &xXJi5c0O3XKr6}9Io>'P={yq >"F/ y!I3+B!17&E$+sλ1j?b{D̼k ފ(0)Ĭi0ULǻ@gRMWѢ<тpyc^V=;(?Aⴭ}֑ B&@Aߪ]uơiHS껬K -K(\{mgu\wn,TT7Ɣƛ=QZ0:;w$G CKxQۊ#0T.~ö~vґw Yh1z!RF>X 31>mc249$gaj &:*sG>:#ʒy*7Bs:\mXc>6L杂pR;151gѕh-Xkg62J BU9|ӧ-dqOҐs,DuL'&Қ4]|w,Vԝ1{g”DM>^ rR<=GXp- [ӓqޥOlD쯷٩qT4yæ0$x焗G4hzw0-.Kt1_I3`i & ?ckaFb}0LL Y ucDu91q' *#9 :F*3=?L&'\Fx+X$}pU׺J" zTL)+ҔT: -P-Iט^Q7. $w.0;B~C9EQ4ze+rH|1@+׼龈@9s4oă gq|6>wq-LE0rXӢG>[b "_nj0Lq^+bt * v -kcI؀q]hm, Hz12bƙCh^Ս7O83 > >,3oz*t3*Eʞ!!jkaN SΤ(6-d~Ӓ( )JQ`(p;:ERKGİ^k+qsoP7&Q2Ns0{-*tZ`T3뜻'Y*~׸=5ĎPS3Wl3_;F< !jn\Nv<)C Y3rm|O2G$ʚs A5&<k!\϶sE!,O|49cA w2f*J="wU* zJ@ɔň3L3&`2ukP1)jK=Kq0D qY'5vr`h4ƶDMt Ƌ8 'h0yF>p[u~pEH`MHYs/e4L-K} mBʌ7F_jbNNV¢hHM @h+ -qyZXbb0ΎlL=AϹ1#E'\Icݘ$!#gc &iѕ -ka؀ 2ZΜ-uƖݣia$iOXOg!D;lmA 8HᙕJ#V=>Gg$QFչ$D`@$31mc7 o 1*k˯X$Ɠ+SaEȐƌzϕo f 9a\>x5Shf錹p! 3+#kx_wqH&76YFĭU5$g2wcӈύ1KdM53úl߬~N;;+UTu5f≊}yuj í2K- -:0;+!7Z eR׷BI{ß&-'gù5q/4l ps]-cjPݘMNZδb`DUT>9Q9gI&zc+7sZ)Ujͦc GڀM&n'ȕI5,E% ?U[Yӓ`WxaQKw?qzvBHu>+SK2?u7.Ko\SG Ew I=GUc)S 2\P qÁܜ>!LGgYT Dvϱbi'؛sM -13lk^ю4WO0:k X{!V={aC'JB)$g~Ƽ1̱` =QB;V4R#*ǀQ8s,S\WdF}k2]Ex`"E\s{0jBe[Egxxabya60oHۿTvIr0!!;]af[WGsjS?|~H蟩2YLVxIxҢ,N]&;\1r0KN;]lӨV6$apD?4˝<8p=<\Y_C6wxOz$ m}5줍ZCaϽ~^awa>c<Ԥ{">ddx9|#>Fq\8e8'poD=1RBo\-$, *sr!j00FgıRJ_/8.B*h |/LS@ՙ)f W(_ ov^Nfp]4wFoWC)AqŖxr=\T8i-cyW-4t. USWkSnnٓМ %/$p Yt^Fۿtj7NRr,=a`41=܂i)91^ I[g҄Zl=CNH[5Lhb;U:'3f#;Kc`Mx]]uf2ousaB Өc8Ѧ͝de)k0g`^|y&TrLH`.6͓ŔY{/\EM{X繓\K:Qu)BUkN9Čۍ`8br=^z ,5w\b*UZ&g>զG(9:Yuns{@ΘUSb޺[Xfbj"9H84434w%uD1za`,ٷ -8R#695p X׷}@*wҧB4^=}#LoamiqDrɤ:6V_1vW#Ut0D 8 -njnY'ȎzgF>G^=6^6:T$4l̡f `fOG^w̓T # qm@g~1]-Y< d 5׷NZa`0(gNڊd1<"*8ĕ`pe}2}vM4\~7` G^@$_27颜m',qe~0eC}eϡ!xs"Ǣ> SP~.++0Te'>}HUBٲ -b(ka蘊*c,b8:"=KHqǸX40>m -kQ7$$,{/da`ɣX[ߘAeP7Zsa0{#ҁ9Z[hƁ`fAB_}h|C/9XȘ {GAB$|P:1ݷ 'ӚcE <6i6@ DN@-sI$)7թd&X!>9% FREy_\ `b[f@m/l$U5;W[OcboŝnB <3 P$ ˔ᗱ0i]=^QOCplu`Dw3ƹ0lʭ wKka{AX* DqfEsY7Onap9k+ !)S;=<;Ʀ%d<7X.{ɤu\ fFmr ^ 3 3A./ $]V8@LN-òRFI7rm G[ǃ0ψ/f0Ty;}-K`8YřXRɞ^~ -&c:c.+4T04E&BC[d yM5rW^T aK޸~UќsaZ=}c՞O(Ҭ!UF!9UO F#Ō(sEx%U'R"b!20@a*z}G?޹o-)O+15qL+^|bf.*8vbbN#apC-W B a1ef=fJ\!Q0%^C)ۛp"y/DpDJc!LAbf# 6<3>2.Í ggO*pּ;~bs FRm_C ȸL.FJs1]V1kD ^9o^Lw{JLgOJ ixi!xx;0*/<M]{_7?>COS?cNi8F'i,q`SVу7c)#NaAcuI?^sŐ0@MI[<֋'1g1J.;4C;1j`欄n6#k~F scM̊"s},Qa$5ybZlAt ģ/&OC\dDȱO*U!:gGTwhp>|Hʜ^ZCu}.7HI($S󕻚_Ieb];tUkl ǎ 4HU|W W` -I=: L+pfRσYͲAc>s<7iv1}:)SX).B]"aЮO/(OS"tESqZs$f4`JspX -t#H-@HK[1:m]e5Sqծ\=H3ɠIBrx֎<+_q]C{$|oc2abW*J^Qq@W1I4ˀ9yk0)K#V>%+(ٴeh& Gkjr4ͷM:鈁8"dž3c4 - -E `q; ,}bh oU8De{!CnԝВ~guLv(W>_d V)0;sa1ABGt` sLQ#V/CW3aGΎs @Ũ#0zzF68D#f,5*'Zi~#@("2gAW[Y4RTGxU1:,$LTSՈadF8:÷dbJYm`4Zby6Ũn9>'ť~,מ]9Evfc{+H~bx? \;-fQĐNlZYH 4 ]@%CL v%f ũ1MGp#f=8G*~gyEhFW10auYB1c;WG8+1}G0kRr;m$A*qe?El -⊙L6`xbE= &͎`Ob8 1CoE;B󎠌H3}Մ!b40r#1;VѸS?(@Q1h6:AȲ•OHNLRo)Kƃuyd423P"U>,FW:2Aߏ`=:,2;YntM @? Ƣ) md= |.<56[ ǰ ;}H̲J|-cp>̊%~OaB31.FM-J/wx׺ĆofbMUȶ!*=11X= Q1`ޡ祈'pagk vao.%0=cʀY^b -Sb|x3P:䆴.m;;#{!zsi' ȗz0uq\6捁bQaj8 ck}@ HZR/Zq FøeoTXƑ*Ɔ_˔HYLJ5qbmYH׍Yf2\jy:'P̖<3%B{PL;nƬIEPKe`)]V3F (r {&f:tWYX:jWW|O^pcύu82 ->)/-cAhRx (᭎ቑKtrm}? HҦ@GG kKϣC06<HJbl =tI=mĨv~ୢ,T ^7=@sdii;Vq+1\8$q06#40TX&j[b3:"CMa{L+l *g5j^Sӎacyg'/ CY+> K 20ʉY؉ 0D] ۨ((`v3{ttE`'@ig -q;X5~iMB; otbx;hIs&{6^)MZKK G3daU !u3&;`LX*J@tzS TUutL<1`\]$w?+ &RhrW&CADC#+yk` ;!d+ 2 (|0Kb "cww`*Y`]sV(Ksyg;XwߓWQu"-8P<8;cEݧ৑f|aB|T6W|r RM IET#--Mzz*DxFF=*1M s2w7ođ1v><!sc11@shG:8a|3^wgYLlߝMd79/^K}tДa.b}Ś54PeraN0f0ocE)iA+x:> |f H:_9=UT -fg';)pfPr-N2$ -5H~c&W\:3M~v a0VF*``0׬;XDݡ ǁ4ew%"V?0qS#_҃kܹ($séxh?KzsF~λ8.iֈw } [A2i;a1^lfI5 R=?ep_ꀐv0s%s`;;aXt /-j GwW k/1ܥ2HgJT"Hח^2<seyX.BJ 5PU#TM녂&5Ix.rZ?Ԁpr+ -Pk| -Pa(>LS??1¬LaxfY 4 %0MO^nf$XLdA_ cf"'w:[0Q'/.-3bap|^0;$fޯ&f 1sT@z݅90v6EuaSda0LEg'>I =:$ - b -(>G Y`VaG4-k _/pqm(\utZsAJ)^0ǘXuCby;+k.6 NLԗAu( !:Lnq.L<opS|) MIIcXQt0W4'ZMmu_qOEx@z.TLg)7HkbX3^>$Ԥ㢙B8φ1cV-O^Z!Q/3/~בJ)Xz1szlaSc#C|\a0=Y>_Ә5'w(F7hcbhLˆng A(ފA +=\҃1l1f0}4tga$(|B+ KdI= SCUQE0Eٰ0a$S cDY c*`#@;>ұ'fT -VªVE3FHña:`X6s-LIu0T ^W."[SLa͆ )BFN5?Ydu \̭AH6ň]nMɖ"]?' бo1H1 ّQ%3܄Vp4(HT,=")Eha xc3j[(@ BI|DʉR+8f[NXI W>$1heD~)gÕSuY5~1N7g05:c7ƒfKBV)+KHgYt*Į?#n &&d%Vx3]t~M%pR027_u2Gʇ!q <2m,zIVvg1:K^GøcrX0zL3mm|Q]IE,N2M0gޘ'J]\YT~!EjW_.gb$'6JS3NEEjM2 -cNJ„@ ~:{B+i%yZ˼6gc2.#MVKl;^Œ^tD탱d&h%ڭ/ -sԚ2I_ 6Ng*1]1!|>8oMVտ+b]7s8_0l,<ƪey21F'sי0x}6Li NOe2s0Z鱿*QĶ0l/Sأ`zDpЪOs:T30gtUQԹf?#8m yFPC*+gLl 42#LH ^>=g1=QeD`8~&nLr0%౾#'c T ]gzěn-;Bgi$+0|NQ9=ox,*`08L'c'fa, Sgc=lcI"X*P awFdv7#5ɒa(۵&n^5uPodXGeE[_$ߞ^W:T'&Ci~>4 -3 KgL{ A:p_@숾'U P߷I{z04osssdzQz|x4&Lq~şϯ7?s~,.j9+?ԜMsbzHZ00u-/4]5#t d\>dN`2 QKU8wQ|~ƆK#h6=~ - gajzmͮ}cg&X(_O*Q#6瞋Jgc)6]|vЕ=PQ†/L;`]'u;](剧IFm34#e üqDSW34)sO|9Ҙgܜ+) -ݟ瞺qsWymOQG&cC]pC8NxcQ+97w}8;B0Ӿ)R9Fڞ702%Jܿe`69H>͸xי'9%I7&y6њl̝pP\}z.F@{º>@Y+}|#8F3<=MGXw]$4d+6CP@ܼE1s p]ɳ&q"-NY[jE5I)fkp#B1X?<))`dcGMٳ :ǜ{[IE\mYDZ,kL3=s?C!=cA$.,+^<1WU>M{[mKٟJB㴑xJr,R }x^AV0\b BO_f.Jab]fmۀQv"1F*@QLی=,cz~Z$tigA:V'ぅ\N8C #;qBFCvoHI&u|F9M]T:RrC0>ar!'e.|S{;0 @\}¯mcu[""Ư<&t0GWUȐ[OǿcAW ͡/tEGwX=ijhR -Q;kW3)Sz+35_4#JԾ%%C?o\pXMS) -?zi;xCNǺsvK@AԲ#(H->aݢy>!TşhiDk ?cb{Jƒ"_̘u&gT7m}_mٚJW| kj?@Ig{ st1%>&QwRk)Z>P盭b}㯳dQ; 0:{|Y( d&Rׄ&وVL)L -ճFc"o> Z|rO\_2}&Ynyr FMg>oѕ>߹CpO0W\?0Y7лu֥?"%h] e|CM^s˩Tz6!|ĜPy¤$oאַ+nP˝gw"B\)f$ax>R%UB> %ێ`qV(̑R%ٙ!2&v90涮 -&PY;-fiUaU3(da{)db(îhc<Ǩ8ͦ"afu9gV2rK&&a]>B*1K{PM>$gy6Q8B~ƾɾ TvG 0Ǒ2XٚUt;1)S=[G8C4~CG rN(IN>jW* ϖx51[! ;kĘC|1x~kd-q¨ :tNLєzv /wy6zVafeR_UEk00N K1Q&qd( GN_%YV90Fv}colnwE/15=AufobSa]?uC7TjU\&1vcޙE$UN KðǺ4.7f R0pA kРkb({̗qȅ/oӠǸvoQ]*a*c9#Snۖn`Τ*5_$o8t5W:a3 4, e_ w8TqVRٛvEyH= 3ۈXe܇2XJ~߱+p-S4aQt{N2W,&w޵c[X7(r؎VPKu: yI׀׋T^[ oT-&9+=Ajּ)oYe_G0v$<>0bҕYbK|x&.cTw$j'e#0VV,8J9mYe 5R åP61gs7:"aINVZ-Tp暚/맦;f\wWHĠ%F@LrRA H{> !]$pVyt5>?#] zzv&T(aٮ4+07yx+'6W+ 3e΂+M:<-6z&TcUaH]fg@@`;*Rm~LZZSwa'f{X%^]5!jE,ja 術 ,<w -DU{Bd74,2:LLAh.Xe;_׸1qP\cωE{# ">)ÕOR߉^eoWq'ޟoi2n쓡 -#13!yo̻Qoh|!5cS)1g -;Nt8 \qf_s^rLo:ot+=ya߯[lk{TT s1'+^0AzQF}) 4ɠ9kaqy0 ~.(jS%VJ0+znTN{D s_+#QԴ ka=4e7/wѵjygkXݦW`{Dxc4?%4Bs<{M7"UQEaz&AbHN%K5Q -L;11D" kBdF14l%IE!&ޑXHXH 1 0҈g5ƔU͌85FdW;IojQ/Sy%j^γTY9;5nfsPSAK_ңKZY&IA6wy*Z $d]$ ,-Ŕ@8x /A9Μq[:J7ʺ;9*i]^tc֌n -j!LM*o3:y`q 'S(ҰÇo-7T=sٙ!âs<yh UM\/p?ŜP(bm].鋤|,R$>ٮ9!ӘwseqiZ~!1pxDRLLEgN`xnV(0 Qj 9jgspE\~&NXhV ,*f&4CX|X.B85Pi"|v<"l -ⓩ=$)גSx!zPj@xs -J1 Pa(.oʟfaV&Sz]6C~a18~``I bStdOnfF0`m,+OUZL`&&Y#DB5ZQ6@ߌV*{y d{u敆0``n I-;N*y{X5pa췕3 -l)GwGnhSJ0rY*J`TW斤}wI j5Ii1QiH[9ԡgob D7]bV@JWCw(kat Csh3:ɰu= ڙ!2b0LEMI.bl˦]nAXtj6Tfߐ<e( U U`M|԰Ch5M=@p6(Xuzr }̡bdA4{N;h6h@I1 D-r0z ̛xSiDIð(tt0CMb %F~hӅ>zf!8b8*T0Dn`Tg`Uh5b*QH& Lv!ԎK$f2F <`GkdXxJ*D7םXOc"vLh@72if1pJ~$L?N'8PtfMc% sIa3~1U) -t3'\itMW2躍LJC3;9 SC9c9Fz+$Hr R.tBMm !t1 -;D`kJ6i^CO%j KL=S*BLjc) ^F3TB8fL}Q(TZ p,(-dQ DJ+b6iH'!  -s`ExjCwdKLGAx _A`(2$H#"b5쑘!tXTcuBQ垇-~+S{R#4N< /DPCTF_qA7Lu0(ZˋuSSb wT@X_b*#H{^sdX rჀ:Gx[|Y{$q_OSY7|4Rbb'0$LSY sasxG@A%`<3D:RSKJt`fw@ܝbݷI] Hp[SwLmXϞcC50} /=4FD,`C`pK:pwS\8ϾŠ|$rE}w= 14*jLRkߏ?O?;|O~~~rzˮH%qbSqX]!(%3US `I73 '_3KkaJGwu 3,je"6쫩j<ZaYS~d~=%7S$IT$_ݧ(Kؒ/Rl\N_q0 -҃JDQz2S5}4]DכKY-z\E\G@Cli_=_:Gl\9 #A%89]]#ȯ0Ry ‚/NxI϶W,JOgaMwr3g>0s*^֒sbQ!!b,4)+Jram^h4P8 B)I UQ -"Mؕ }NL7[ ʻc6 ^H -FM8ckA9dyw˰BEP)MNۣ=6Ku ^v%)p`BMڒ2:8EDiiw6S0JpDhʡ)׻ (F 02AE]~Z>̚Kָ8./`D)&ѻu ]NFJR&p.6n d(혰DR}?3=*tlŶ]sd\Wj endstream endobj 22 0 obj <>stream -HLc7 #p@E$oǧڵ[i{gϜs,o\3V_L(U{1b"X$2Wxm֎5Ŭme¤uW|1wF)k[񕕵bd0sG{9j,Lj_ճj^. Uq{E^Lw[- m6A^̴ms݂tof׸G 2nd;6t̜/f{6 zo>N2` rfOb*wE}0aكܓ)Pk0.ATT*F8.#L׏&Ni?rjP_P)8;P; ^ޓN~m2FZתE&'hL:TynS0179{74FYS_Sgd]XS3_> ˧v/L _ǩ6Tk/f6?n26`=p{ ?:Ks0L&5O*8p043AzWŀ3 `)6CÜ*96ý[ck2%R:(tM]KH\߁ЉbP_Jε㐊R͕r)F)Q<1֔)j閯BHIHiJ"6ue(+,F ƫ?gu Y0lpT=B(LAHm H_Y9®iF>qq Fr78 Lpa~ !2>؈-a0AT#b ZV 1EN!W0g3sDHγRpK_3Ec/Hy>s8abtN08t*n i -o0XgI7q1vd20R,݋; bL2Uc| '$jK؇biKFԆU×$_H;Q>czbO%~lǽAɤҶ`3zZ_u@q*Vc1)L S&3)͠ -p.8{KR &TE}9H 1ot^+mѕOma7*ZWBI԰5\%&Ä-N\z֝?Zxb& ˹9@oK,7&I5\?kn T|7x.LNZ_Q'Iڗ%85(Ԙ 6sW gr}GɜY.~^N;_c-롨a܆\g<ڣC68{$R l!%5-;dLYaal}-^` )1?LBQRB曱]~Dl ܨoCg]9 0n3uueOfC$:*j/}Si(:(:}J܍¨Qo0#jR7a.J S"k|`% N0N1 #nFکWVo%We%+-繂Y2Ӈi .<ϲΊ5YܸNgۄ1=ܣW{M0FC{R5yםЖ{ExW´8厶޸(ajY}׷0z):6q֞QzHE`32?-(y_DUuX0/3u)sKnci\Ϊq9eIºޕAZ"CgMY,i% _+J1mό?R] | "0, 3})C.-oX;U[ھF@P( cB܇MI8_RRf ,>g>`MaBP;*17ajڠ`?uWcK뢣`LUvVFoKBztDŽ#WHTۂZcJ>$J8#@ ҅$aN\Q3|[+X, fZ =Y -0(ݹB lcTrʁXEJfXR /!MIaa;E0H\m YB+Gj[ūp%EW$.#ۧkC -S; -Ȇ{curI(0#oP0fYV,.mcTfHZ2HS݅wdoL:~2\[U`UL_/>D}aujx9eY7m%6\y?zCfV𒑐Dd ԛ8 IP"FAG|Iw#k^*}wo0$ MK>v_<0vE:[IrGSZhJEz!l[`<\x2# -2%J'/nd,l Zgg嚼ɥӤv7*018]`f -*Yf;^2+`2Ky\Vè_}$_;f_Ĉvo>Djzc2: #1h!^6u{6.^7r wH8X@\",j.o0XAMcb.X3+f,Ag{s>`( Ǝ##;qK3WԸ2- \xŷ|K sN0O.(9PUrEL7FLLF`J:=GK95'`YrXi}EvYIE۝ú/im޲tmCPg$Oף+Tc#lk -iruZ}6&c`z? a21 -\T:2}ZBI0f3==(_<)pv9&mCT񇡃I(q*JS;EIO0'=6DIw-W_߉7a8`FT6svCh y0='{z g\)Ru a5Gyfl0y2,O!G3EB\}CM(t!)A Iz״zY%ĩf.:Ap  -M~UYxVXaZj i(͔oYΖmo<08cU0.;wۏpxM#ifSU$YsHY`&Բ\o/OQ0Eo}vIY)Ӆ_uL^lTA[vKZ 4mo۵>1TB |YgT\ȇ7%ǿ4I 3a\#xјhм՗b# 9àϙ{Xiu1wJKbtu~K)&L֢+9=Oͥ. -W{$ųC*[H4jXDy#ͪ-Iif0q˔WSUsbQlguݓ|L<0D:LYrdddY*٫* ؊8sR- zK:ߜ^I @&5}5o:zNx\PܟwbJbS1* -Nq/j d`$=lJ(GlL!vDtiM{x,@X*lXorkFm׉j輭Oɉ[\"6KNjua`dQń#ƾ%rsa1dD,$2ᑭumz|#.b<#]e}Pi]ؼ#!-J=Si2;n凟?ӏҏ~O퓘[OVKD UJ4~|×<(cXN+K -Q-V5U?}#&rLl$w,gď -?Ldz'G^4Zo%ّ:]&}'l 昢R2/w`PaHi3ջƷ[ 3VZ''a&&"ev\#c]c+12f l0W_\`Qt,03OK$W ɉvjcD -[i-OI`eOE#9d&EII0F#IǐiJEɭ5LM2]+// f'D?pWm3-S.ycZ̖nrXv s$TlXxNG/ y8;aF֡2T}}V$5c؍j!+gP)@g [/= `rf/5HL!%ȳ |f g0 .KF( zr*Dy `I!1Yd yur6vmk{lW,*$lgMЛX0_gzM-!^ɤ/Փ=AƠ~X빼Z9z0OL || Q:9$)|ɼ?㍁F˅e7n^Q aXu>qM%]T}C.yNf~|:e2#K~j A4N߉ᑾN/֧階O hoD fR=Y:'<H1`d[/7?1#Q+QmO`!|>$jƇ |{t bC]H`lZV垅h0٢HCxՑu,ZߊXO(R&1l&HncU:NLm3dH׌9%q Ts%$F]f1&# @'=^.[ <`8{cD`Jzi-=dP)CdYqhk'kbcCκ*ZַVfېZBЄȂРL6\3Z'erQ<޼fzrFۆA!:&!Uc!a[lZB]1WvuR~`0t%ٍ#A݊V\LPIN iDy7eJ)1g%= 1h0-c_{J=%b-V7!fQ6G|hPΕL ﲮ eEWTլdg=ٵA$b<bWpM^AH;yM1qF?It-!ff2^~Z=7`%c0:߬/^A5,A+AGe Gt%:FLRQ=;Lmھsd_ a --Qsd>_-"| -)*"DxdCzu)Eo -ue"d1q3x9rTvpL X&9,ML!}0o:k:Cv211Q[Jψ7:erCZSo+_d$o/)O9=% Ču9˜Ww1i)?.래u"9ƉgG-݃ӅuYYl^bo|8Z$ͽ<c}:19yލp+:\Ͷ&HI2@Iq'80R?GS1*~e*ҹCTzVA'FbKӬgz7^B#a%=NW!a'c@xKwxWݪu. doϛ _wՇ8L1p>1{Ϲ^Aboya`̫ȉ珷:GG~Pa蚁lĘ !Z4p$>ʱ FeWb_݂q[ooTم4Nmv>t}tAXs8[3sa4r=bŔe&7T=TDNK<cp<_lZ>ٟ 2ot+M*)%׾QuyK()h50c]B'Y;\͸֯W<jpB 7ي%)ƅkͺf[28~]9>r=&'KaMŶ7Kth \3z\'ƃ[r[ɜ _ ΆwS٦mfux(jbؼӰc/Kc:/*>lS J̲VCjS< -a=֚EZ^`Xgb_LPen7c; {?513[kӗQ 8rc ͨ&4eOfB`כϳd 2^"} -˶~lFa#jSxY'f\*̒{]|̠V= CxsJkBq7 -ުZ7҈oJ㯴8s2哛{{e)G}w8Nsmh퓛縶ф!7h='[jgpV1Ww=0[No)m8.JakjcﱖVPakQE?{ר0Z_+h~MGǙs7'İA )S{52fP9\Ƚٸie,RrDkE 0`sbVÐ/.Z,Һo9ޙ21…m(O /Zだc w6rnJ s|IɚM P{x|ƃx9ݷa -qM:laey<B:k CGCˆ0 "oƽ'ly/SA92{_kI2aO/.;3ꄩ8TJ_ 2J(Lێ0(_d5 2Kpigƈ":P4B]Ee q$'cs#UiƮE^68 -SNczS6Sa׷He\ -naLFv_$6iQa.Kag ٺ)l1?6"L. -XTuQ@+;pP <w #m1-~!Q^]d&N~3۠aJX,^+3s[~!=ܹ+ -y19a61ZJ91!XR /!˛¬ fz*Fb@>u8Raxǽz^B+"k~Sūp%EgW۫kS фob1 :?;ƾXVb27ξߤ}0Ey`zۨfu=K6;T{z#h=+xHHwb,Œx^C=őg?1_N$\hc6:j;H>c=)̡Bѿ2]}P1i g31+ʵc=P4e6QVZI]g0-%q(՟DQz F{K玌 -yF~Y^ uTXgR:Ph =H$`zj;?xFJ -%霌, MwnZ@-W[:RzT-u6}[veFjM (܃}kř|vqk Kܰә0jtxQ=uϑ.4oi1 YhkgJr]): a #{tcsF@;zb)I,CelBB}'N=;@aΗ\.J(vddħX qL2OTtqm9(2X]&7[E82=TN'L](2g2m{mUJNJ;{:y=IoJI @ϾL7I-fY'}{%m9n%wJW#d[lUVfkj\p.=GlrZ}kcB ǢsKkb!i^TDZl[L?Ǫi}mDކc8,wJ'@N񃐅IG\3Lca2 n Y#Nry3DumۺC&Gk[;!, -{bD"W>'#YR~?Ͽo|[?>7?l> Œ4c}r3i;{P)ӣXaʯ-a[z F*e\Nnޓ8ѐL׹NȢSwbfOp(I0HC2n ʮALx޽Ԇj>s|q=$ʹYe(FDTo=W"!qWǍу,QaZzPniVt4XuxE> CΠܐns'< GtߘK$IE*$ tq_<&(^Lj đZ+Ǹ#_֦ة4K>+^ACVZhP. ˳Sm>r .˾06Q[XF!OzxUFX Im8!%a\NcO~s!%r( q)-o=n5:wAI*yf( 81(M1IhU:>+ȗǦr_2>U={<{rfc"k?F\{ $BU1_#WY>-P -Vgד4^t6VӧyNB.imnDM'W['LyC*rc 93 FT9Oiܵt[iea$jnM u\1NJL"iw< ks8fu:apLgߵ/{=EZ &ĉZ#jɓ"ub"ijZ'F$҄k~3uKQ/LZQ P# uވX0gy]bÝ0jo<px0̩٦o(gX,&:gյRq#(=1*@=b _9jl -"OA(h -T($/ic+\qٟu)[BD.*6_imvkQ(>{{Q -|IȣϟChRz*~m:ON`bTklA{pU->Xgi-&_ykޢp8"c̎p)oٯLVS:<ԙQ -B=(YHvaoAuM<60i흈RAoNֵ[ Jƭ=3ܾc[f|&]q>; >>0|ʛzx?K:aO_}*Fe2$.|'Kj:?=&QSZ$Xo!)VƐJ 鞈)Y$zz, c5T0ƥTnZ"dRXcyZ\2%@X71΄(( k/$f:MVH: :6;}`z? -x'g`gJh^i%t7b}0{Yi8丷`<)_CsY|I.}9L$c=O/W CKΈ;,:}ڦ)"eFȽ#]gٕ@@%cWA1wT~gz7y\O`B~ٳf.Nv(\5-#bּ8KFA1\v94wG%D ސ1zǾamOW0ʉ~q { kk. u EV?[T όbGc#wz)oPxS o$FK)N &K&E+Z}D{2S[_2GB0WQtcwab4i0"EL5覡|~NCV9F鯑j~g7!wv$+\` 6s.(k<ƅ_c􂚱;ns;,;:BE̵0w3cq41l˕^DYU5;%V^;tF]  oNM,!u#K=_{a#xO9y`">=Tc1~%f`U_1Kɕ6*k׳ZQ$h\ =oυ&7Xvsas)eEe+Džї|{_[\!YȌ?ŝ>`.CŽ8JKCS->h[p_C"A5/ 3Kp01 E;Y iéas -'M]4hxLbgFT\ -hS?´"22wAuT%!76-7\LiBr`|9r\}`ݾeLT{BĸY2~FQX+j^ XVH7"Y'~w_/l_T_laZ,L|OG< oczl^k(!93u:!q:9gQ+h}}y ̸|wY8ogcyd5;YuXδ~FaBUFW0W M.  \߳XLjj%ҘQW=~υ%e\NZS -cl#Pqm R&jd -M呚a懹Bg0ϑOe+̋;0d%s,qVKQҞY1 -_Sl'ama~J?1\q:QC7>L}`T;XeN8sЕNé Qj ǘOy¤" <佶F!h a, y.l֌1,x$r*^a8HS>uW)5濿8%Ų;g$h({υ$;ث_>k;fgD;GzXCG}TUf<##'`#j;8;FḴd␬vY|iZeokfO]qJI B*8n-BG7Rs:t1DiǻN%,@ݱn0M}(0eϗN`8WhYXf ėrD#חI>O?ً -TDezVnoQt5\gd)oeFhK^!;]eGLab`rmH™H%qJfUҝ%f[? 5z){{A%Duo3.߸GۇтY0_n?m>096scD9\ E9 ;-E-2M}ěr' -rbo3?[}SOV"r2 -{& u8퉫PeTqut;ZXOg<7ߘڬsLH5R}ejp*Yȼ^lDuglom'Ru{f^}1Xu7(XL}{z[ -5Y=U3{|!X~?XvPQcRK c8"t᜞յdcNndTVK[ y!% ;>όgu$|1<[GfFHXc E+ >6:whԃh`Ha_ ",wΤM_ݳFG7r(kg.9~М)Wrp7/ƃff yJ> ct1S {`azI$/F=_ꙶH<p++]Wwl/۩@:Z-DgޡCPaB")&B\8cD}֚Hg5 @E>@ Q↉/y+*& ;_{K{YAJ8ڮg#=՜؋F_t9{AX;9 'θuąJcEh5=)~ -X!C&: -v+KE ԕqJ]-*['d^Ӯ0ڴMxxgPLxS$50u3M CQ,zai&-9רqHLp.Fozh}ۏq)ka~<|=*K ύq~}Dzqa6/9xc x>艼U(^1"}ܐ ` *n(@k@4ba]8k28z=*OĢ;g-Mڼލ8XsCd`A'*M!F.uPLuv -T'1EBdupQb2Qq$JobsQm/@ -3CL0t`ˎ ;| -!gi0(IS,:LK)G`;Y$1^+~yt)sH~¼4-?Љ ) k鑊I ۜFŠv/05ֱf668 iC鐳r#Oi6m*:yl-U("CBc;WbO35z}!=9 OjMv3h4`_ҥ~Zf38O`[U -U̮\DQ<~U! MƲ&^Td?@4~OXBTxU`פjZr/IaB፧$iEFƃacJl阅wσW$n=֔/``oYit}#LLӢg}i}ECYx_4/q"Qnj=4p2XkjC|34Js,% :ρ/x g/ʆb:w1Nq)F3"o2ΌӃRP -xlddQʬ/YK*ϵ@-&6&PZ KJ4/Fꃢg -~N t6MP*@~]96$fu6\}Bsq0l2nX mX~NÕa RF0L MZNl1<; V'pP{2= -FFM4mo7KELbuƲ*}3Dɵ1yi\uiGO .gL)ď%$I4scS6d`f؂Їrirdy,3Bň_wT>3jV%V^;tFnLWi 7&zH"Ϻ%ՖW6tnUjS7 &csKu`#ïDBW+f)ZZWvzvK+{"4ƕ1DJS`˟Ю6f>gRf\l1ҿ8^6pzH 2#ϡtq'cQ l1(v5 (/ M -ԯ>:n]Hl̽3P\PgMOw0̷ch9nzŒFS1-Ɋ)hDť6nLM!"351 -M!JBd3o0l+Zn{c2 =-Gp}Qwn-ezM?.'͒qF3jl26M?`ظ9pbY-#gc[YMOz Qu[a'0y6&>[gG< `z½QC's0gṍu:!q:9gQ+}}y qVp_:'jɞ+jvw:7fi 47x`l#-N0t[:7j욅}wŘ{a\~bϷWodL>U -kC'.bZY0!TA#\qjPT0oȁ㢬 -V ^\1452[p}b25J1+$ K4ʸ4ZS -cl#P_`X52iĠBge]=v`$n JX8VKQҞ٣1 -_S%$]O{~bbt67>>0 ,2 -R69@'ԍfcLkcR S]LkqLޫ{Pimaȳwaga1#SJ9Jƌ70C=zM1؋I6[hc|f}}\e1))]9#DCyo &i^kۘ=Nbr?EuZe6uCȒ<^w11.1^CG_m%̗VU&6SW\GRGκe_XjN?CSH=xTB? ԌMvaoC$Œ>_:?B#ĒVh # -9mLcXLZ~żA+{T_ua/daZ/78vƲspU[{q?DK -jc,;sCg}+If8RB:WiofvӂZ!דgqbw>TzWφ#xdLQA[r^^6c8Y)ta̰08/pU|WJwΗno]r~jSoxkn"&K { %N3.߸%hA?l0_n?ҭ>`axv&rsyf^<~H+7|s[iRL?$6?b9G3>H*FA"}2rfGlY<5(Hxka8Y) 30!Ä}|S#eUA$Y$U>çcǫ] yawQ/]-zM5==(VI{S>N`4YC2aN~+ΐ>Ͻޅdl>?],x9_ďg1ֶ9sc Djp;s -z8|ƳxqӴ+o޸&xL沞hȀ F'5>(>`xim2_#N\$VNuDŞ+ >4G#52Uz;&d㊂J8vec#zkKY/:-Wg<7_keutgO5Rudjfy9oڔrQ'jMf߄:0Y#Pg0ޖЭ&s싆 ĈM DAMv MQK#R͠ lU<޹e`c}v*;JǤ|y  qD*9-yPg<&&Ŋ%Œ^GR=h}u["3sIGݰCjJ Ki"Z%ŒT/[T03@SQoϤ[28z5#1=w.u|2jM:#_Rߘ$}b |W̿Va !Y s-=r"maGPK AM gi\:aƸv: 6A[3/ ˮ{bTw'Fhwy{B%=PaKmF>CA? ; 0g:3 5%XEx L`y($A=Fҗsa&`bR{@0fGeL:N{bC̱{Dy'^u ൐7cL 7E:nLLCU_L`ұ:֑lszL%Q·®0$P! /iŦ~@*J0#0VZC a83̰ -\/3I# -9(A ?2SԒ+тE-V!&cANa+/ؐFU?GU]ūQvY[qeKoa'1F0#Ŵc`?Chus X RVWFra~zf鄳1*ԠmuBìGʩqPIFf]iNj y0Tޫ˩z%LzxN n? Br- gyӴ׶DӐ̙Cb̑d`Nj)n]ԓ6-sF3l,SHƴ['UuVΐuLw#!-uǷk0UfA\\G=$^^vٌ Q#u<>i_DH㭠aϏZ w-v8FNp ;CsI!T_$\gGxiO(jxRm9!:װW9:=9I2奞V"A0/h_I{!zꘖat6D^`fVs9)k$ -W$u\p*Wvg-\E'co|1\^ӿ(֮61<8:T333T{/ -qB}1fDz"7Fm|lj -$22~Gj0)8̑P^E,ݱ̩Ҥ={#k柉 gJ# -سR0=޹h0 ߅;!S05EZg6\8Rg}ə獎7HR4fr.նx -CZ n7qcxk)\k~<<ݶuNފya+&[ĉTck#C `+A D;#z  e yL"}aj&+u>:+5׻60*-_2=A:̈́[8'"3niSR`%bf|0nhd=#:?>yn[ Qҋ -+A-:̟2sսb<j\>Kj Hb˄m $ah%6O|,`6ambF;ɘϡ)<RX{MڵIf i&/R-sx LoWclΑ޺1~-KORJDŽ`@cO1KcYǧ~gʾ_У+>h~' c(!+]gM MI7h {E'DD؈yu' {.%y4,0=IxŃ=E cK+3#/A&'Co6bZ{̒˞5\FDzXyJHtV4švW {'f1P)_aSхټLoz"R Cxo1 4r;7GX_m:t2p TIGmE$ U`]E y=J9ЪOy0Xf7ЂVOaǴ`xHV] ѽ:O8!wQklѹcרG>wLnv={ -oB~G]*c[ܝIhyE G7sTJar#,jvx%D){RhxFn$Ĥ-5'UV8RNB}5M>!j1]0)A 9V{aZ-ugez`0/ &R@2yM a{ X:~,W%hbd &ybUO;3rP [ȚzbrTNQOdUM`=bD -:2걹% l@I -hKx?tQM=; Q3vcΧkmVf>2sv5ny%6ų/q»;E4Plik1h?ύ1~{֧2u>BTFm}3Zsu:O 5?Lv;YV0Ϊ[ғI$(L =nmM?Mk`|ܛ -Ĩ)sV짏Z̝{= -j|KS|@Ju&GD-om-;A-wQZ|[4;3 *chLh=C&ڷ $$:>ِ5lġ_6ٵ+k`ʱ3Y=ʕ(x{0b׻ǔ$ we܅cQ7 ->ރ0Y;fć!ԙ`̹, @. NZ4X%BǞc3JdƲ1bA7!J~<+'܇zJ@5` }J;aTˆϊFIQ@6`ƕlHq< R| w͍#̕1YOdF/m31^7&D7RE ;clSrm20-buknI ){O -X{`Mo*f~(j&.H K;[Duwhb䖍16/<Y`%F8mN< D5y~= )ď;x?SUgM;G[1 Dj¼1BL2zGR1ad(2L2x{V>+:ƴ+$0(qqı-T»E 3$Px[0L[?r0}R|V|Bi+o D&ce)ƠMڬ"o26bMdtDŽ-I |MR-, VMf}$-#o cRތU- WzSiq qٸQx[/#0,8Y; 1lSffcѸw]]X"cctm6̻l|l -lL[a辯Fc}p~F% ]Zύ dQ<0X%}a -*$RbA a|{&OqOۘd{>x+ &j+37(zWE<6*_W -E쏜RFXkAJ${ 0v3C$#= --նզFHT{,ZQ fk: ' ~}淞4muº8(UFɠyh-R0}Ey.C*$jWv0l9<7i 1y7L$)%ٮoL^S'j0)ƷƄ|_IJ0FV>`//̝'1᧐$;E>e.&ouELz: ?sąښyIK"9%Z^k-f kˣِju,&kŸsdYՇ^B#wU\UBDy\3D$[7&#žːs'\OGc.2h19&-6/ğWA߲b2=lx./)['@^ʻU=d: ^GV1kQ#n`ؐ4S$ -gKdzrz>gp^Qao -:eU?繎 A^Ukg}Qo !WE?DfĖҥI_'ƲX1k ߺp`_~nwZLNtw\Q=#Ѯ?XP,smXzTWwզo=+ƔnX=zR:)@Lm'LGo[O`9 endstream endobj 23 0 obj <>stream -HD۵e'#89zӟ~ݫkJlQ>/20su19m:=n0Z2sV8bVV7l9*ﬖŜ5Yw/3w;3„6^/DHdp*qqP\HwnAf5cwLG) Ԫ bVE(),&i9-rƼV.bUcbaxu1` j1OU0R\Rv-O\vM0F$%#ofoAja:r{ ;zub,.@HQe{DY afwQE(,TR 銹=>ؤ60 Q\̞Q<'&0zPXJOQNB -dS)' TfBZ0t19܉SpRb*WaI*f]vxyb6]9~ؿA<$MG &\~tHbҐ<*gHb5)x>1S@d@ "\>/H sa3,dS}圃' -11ҼC XN/ǾeDc\BC׊p TrΉ{`ѩ%L1wHBGl17C -aHOŬsΠlʛ=Lcޘo ރ'a3a.q##q\~)|-Q b&c>V6ޛƫ EaăR/PT-Jɧ=h$$. ~Q%ل&L&NlEѿE8Tօ9ME(a#Da(6 -2q0#æIl~>sUQ;c[rTFE[X= C0~ h0N \>bwhCZ"(&1 %E?rG|o4$ iÔSJQ18xok.=ĥ1Dq̍ &s qa|9yq|W&Y5q9T$opOh<,2>NQIڇas a1wܖV6]?LB %^UJ=U!h3cIӯw9Q5ص(Y"q،4b3L] -9S<3mKm_'3\F6bLV=kt)Gu9HdAb9F{xks`nt:iD8֙ڲ!3>J-~],(GYzs8V8aIwJ)ra}h`Ȗ܅.3?`DlSc+VːWIaLEr6&1d%T^j`UǽӞvW0N4z 1Ug bd&7TL9UW15h‰|k8HM F)I`Y`!T|?F ;fv@% -w1j@0 x=zx40_Y-"°`a#Ab_}aR<$!DZ]9b1 ȵȎJ'e |?lC5 -M&A=5sd\xj0=#h"4{? ͇A!]8}T\O>zAj0gtK sC?K`ĿF9̻η`Jƪ&5~Uy3ń`B3EY{DEn;R~D0:'9[~kƨa,[H1N>"IaZ)ՄG[ofhFD9n-Rk[SL`kbE\)vmX:iU7KvJ]gDqt79Cey€P޼Ynywzn/ơ(dQ(b -%qU6m^^׬1p ǘˀar]@HIfǘPaR-* V|A@IywN0I<:l,f&n̝,=# qK+c,W7&q:Ǚw1lOr퉶8xIэ].0 &qOw5 E\nIDz^u1/C[>9;CtufdFH4SO@°-F9i^=Ls00-ĨCkRs ۏXQdbf@ s$iU]X5bX'$Z -3ŷW;B:;)uM >2gF5+ԞG-׋Ajgou.Ln *Of9"%!`8l}s33]F&Ӧp.,JN uZϚ{'"`0-]8Sfu MCeI㮮jR:ILњ2j`ݐB [q<1<$R){uKq"B5&T:g&"Ø5*EĶ$S aZf{ -oB~G]*ѱPKF 6G푾ar4ـۘ ZFj[q(ecbG:ǫ\xҏG -I`:D-F3!:-~0yU-ذLk %D -Hz0Ē^64\9_ H|'Z:^"J@L*Ū;+LAnE"k>Q9E>ߑU56suĈI[S[͍ .3yFp9w\t'|Ĝw&W?bی:ͼe$ e,Jl(gr kmwy@ Ι4O}=7X[%iDZB!*#F:rtim_]a w]BMN$e E3tg ']CϺ[zj:{]1ӥ0OJcs+MA{)*_{r3v:L&,a23+>q<g "Jo&yt׃Ce!X g}C&&ZT|y/TS`PxJo#cic&ƋcGgQʕ(sLa45V'M!iw!*$ -6oA }͈cCӽsYwt1f[jbZsJ{ QJ 33 b TOs\O>Sx6D?`.o9[] }6HxLHyZybhc 8W0Os$I[C/ Ax$='xy&nag1ӑ쥦„q04V6m\CBXZt>OL/u17$]Ez̹Z0m.|SǕ@3j }8vA]FTᎧ"=.X̙ܲ0ŘG p" 죤Elu%cZ9rB>K+y~i`ǝ$z'#|adՉ1£IE}aeׅ9}k``~m<`=י[&ID#'}|g1"nfY(E5Efk>)L6UQ2ua&m"߃˳ #3&3{x/K<¸bS}+[72_YrUl}KTY Kw1;NĨDB4T¼iX4n{'H0^m֪ + sW:#q1 ->JNژ .œy Q+& * L .<;Ih-u1f\{'2Lgp^a樰7`X2=h{ir\7uԉ0g -\q+smgpP_~LtbDh i*%IILE;25mCAk̚eOEMocᷭ=DS`(:crʹU=s) IKDR8?y#?qWqV#>xc'˳MBiԴq3D3Q {d/3q sDUY^B/{^×}HXKC~oEN1X^/签_1h;KBx5u}?{'i{ h=IJm<8Y}_VhrG^Tih{^~yzs4\ SehK!>UJuyٙu}%? Gӣ4Ll,&gcғxP&@;a~o3PAQ1H\WS0yYb24vL"ATia -֑{U~؉@˼2\@l;ic#u i&H?1:Wk L\pEw gwZw\v<c?l,}1bUrq_) m<ܷ <*:$ {i싩Mߘ>U\d4G&w'x)Mƶ+cRɑ{ D\ޅAW2#]CD6XzywZL f$Taߘw0$'$E'~SǸqҟLgW01e,Ŏ037LWX*jy9QypQw9lC%h|kaXW1r0і CPGR~۬.`*xF}fh  -H\GmՉLW]+2jX4o<((wjQ%*[}p QsoY@zk{Js~9ż91f - g$N{F{rMLX'{cHL.TBozm?Chr𔇠'wa~` 2co/ُ=n+-K?Vˆ&JeCٚVqmוmV1 -9KkOΡ(:Jc7hۯħXHuO(oSV^Ox:~vrڠe@dӗ]!R#syN?L/Yu'?uYRYM8?pxSZ'?dŗwȍkN+ +w"lhķw"2KE Mw2" X@Ї>V?mnxiqut)qu^ϧn.kJ &WylyH$g0g Q=/{a`ν[ϳ?DQ[`NIkz !Q'jNѤ% >TGQt8RdY+'ȯA߃a:T>e1jsT ~Hx0c4Ěfف`֣Ԟ9mpa& CcMD>|$(.j|;lw~=kZ?[sGh1pAGN( -2acL1 6\Lk6q0S@{-K@M1(:x>~QPc(s!τdxyqJI ˝NY'0$`JT?==p]3[n;qtq\]ܞ(_p=1'ɜ3 _vRaHpbD$i'0QxA~S -_Ĭ0Zu/,~, }f4"7;CiX - &S˗jyBh| 05W,[=sۂ˨CAO@;QQc c8:ׄ`+T?Z1ײ.S"7&9͒i Zu~0+3dޔ+nAV 06DWYboB1Dds++fڍQ -'ˍYa] 3YFXܿ'-;O{:vd6 `+5~[N"Ǯɱz~տ??/~?¯~//fY.e[~ ok9/Q6*AO!:Lx%ƄE)>{瘌jRTHs#aoXtL+#M/L%|uOeBD&/sXFG'Yƞ`>d}rH -OCm'w͙Ǽ`\&SBz\n?FZzy/7W}jr61%.a_kks^9C?ʇ1"g|ך||ۗ?~b4>"bOi&rr^e`ɆV/RP"ʳ 5꿍WsXg$c9b<&Ffc=OSB5qWĜi'qz[;7d٢kX.q1Li*(a3T?u? z0{ wq>'D>je6V;n; AyRnA7Yq`VEp5v%J UU&1`92 eޘ4)et<( -[7e'٥cW(\g+-TlEO($&"e4dV{֕x}u M%,Y@T>c=b U7]S {FEj R`غ$in<V˟3e%rӯߚHs17CG\XQ[2ꃱWB}렃 X0(fYR n2]ej#a5k,j'}BFgo Ѡzj>v?Z]o#"u6[^FcpGYPE4or~Wn־`ҹn4Tc6h<\Nje/ra>ca_l&]5ܲݫ\X'O/So U65rKD 4l΀\_iuPXM3ǎg,}Qga6SQόl$a{=o` wa>TlmL9ڍ@q 8Ѵ$LfHal1Tod,cr@G -J3( OZs˂8o `!=lJxkh":Xp!jfTYƘ'8 d4&k`n(?QM4gd7ߘ45 -6d{ӆ  IѮtC$*Id%ŏdqT΀]q=Iki똌vl'#k Wn>1ۺaeh0"vTĠj!"@ӧ&ao(t UFv=R~cөa4s0h(h<[8sVu93sV&=rG#:$i'-T*`07uNE9YfF.l s9&|ꨢ{5k#acL~Uy%1F%ޘLJw;n#f@8gᐾܤWӡ& -:H؟?{43\{e.vֿ #~T#<Ħ0Mh@oF -'JQNX 1E91CNq+ׅPs4ى#\j|?NN)ig! EoT[(~摖{l(9 kOd d_7R#LMmGN&ԉwĪ ._VQb_/NogFݩSzs. @vƂafUr >i$l#KRшChM*D&3ҵd_ 픑Oߣ<gtq.Vk%6\#f*{^E.R8mi˞KEkOii99k#%V:C(!٘5]׵.+gL_=j"e&KqMȜoVd$)t1,'Nn^vZfaVQaqA -%q| P\iy?(BhO!U*W|rV6Zt,c.]Ņjl/@"kG[q7&Ԧ?[uF;??-(#(pŪqM=׻H)mޞ}=X@Ae5לpY -=ڜ*f^2rw&YaFM{#^H_.jLޚW;K[Ns>kVވ)Dua8cM{Tb>#⌢pWL*mw m0Y}K&+5 䨁oZISCsiT`7B+e=+Ucwf4ܑH&5X<ڌ|npChFM6 -z49lYҽIyYjhb|a)2Tl\--:*WR%㛷8߬lAڒmD3KbOx*\E'^7޸(65:ofbWt'qi!.Ba5H2լJB̘(Ǭ\/nndwr}pݻqjZcnBV$rZ"?..w j^Y*y?Gf#2*Ov8kB].,&>b2T䂛Xg{R `Aݬ\WS,Q쳎<]bĄYZbp)]?ҕnyW}Y% -7:fKJ/I`&{:v<#9T&ܯ[R-ˎ=k.X-:u -ndN΍y6kӬIS'Pm_g C-,t$G&Gרop,BǬ\Q -o0jbs0Y^wi㔍;ҶUaI{~Wr% &꾶?G_ܹ.l~SWEYS+%g@k72 qf_b|$pQ 9tt`BW3z a0g8:+X¶;J~OA{vSz9)L@X}0%O-gi͎6}VcR~3mm6淽oRZF:ϬiKB9bj30W -"S =@kc]˱hcş2P.qqX~m2( t#bf61A,-r*:\\1 ڑ+rNykZ͚ *~&K8 sn9J^۾ç i|eDMos?T&jub Ù'Yp<\Q钟 J3B,79W\!IW[\phpBwrlRUle=x~4fI?\b0s3[^kgƥoO0êL"2rk .s)).f)PAmGgFl޸'HlUУQf{*5HBX1gK\ ;ʠ{0Vy6tV@J/7׬y\+ti_hRDMk PzOxϼf5~I gsvDr,a\MwEBiJ̚Oh8F b qh@Lt.@<(aGB.:|Y PgƩ@>j; CҊj> #հt45f -Xtpg=5R:/<h= a[GǗ%4W|.Q #lQbKBue"H%oͯI+5PZiF m5Vj\_/IxrTQ鵻KGA"A! }~85d{_}=&9LCiiYϡHY#8Y,C"zeY'ɂftQi Nu[4F5:l%9k -eo⨨p{pT @q]f% -nv"@Ԅ=*_vo&r[x5SM"ծpK moߓ1lVL:\5=p?y?4CFbLZin R3!YCp=_O5#6nNw%u;xƈ/[5;LOnщZ]#➅"^,R\,Jkac$sՅ;sC)0V/x^0>glu z=k܇spڑf&,D<Lh@2J($"{i*byu -!hs+G]-S8=[h2aq;k֒x5#4@uEN?]5Z!L3c7&`W8 L75Ĉ+g=(&4 %=cH|)kNTٍRkaO=qL37gru织W{R㈡3v SEfR̐RfW Z|LL% -\+4s]:ʵR Sa8h ѧ&K6N9o Vɦ{ -'Ơ{IdA&YEbhf}!G蓜P=Խh.n4;Zb]◁g?DqFt$]n9 ?^0L68wMgvEA1!Kh׾kķ?OR9Ԥa^䎒֙$k9D ){LwVێ;kozXއe-a;U3ԛ=DT]@` 11MGI"AiXlCk}kDT Uj\'9|O1vCPjs #o+ꤑn|@Y+9j?"ubvk5a+$i -ml#Jl"}U H D8=*)# @,xUԤ0 H6cSW5-f1nLDr/rw٠̖#X~L3!/0>E@[݋TH]ѵK(eSVSFm$-$` $skfr:|v&*P]`2?o #8,USuK<4rcl~dCYzr3yrF@0d艽&< dI6QܪzWf?ĥ+~Q85}%7y|^5jlN"$(s\(1}ᅭV-'% "}aHL oϧ#fެŞ?RpdgK;ٔ} -8twpVƵdw2S&=GmVW =S05iWueXsI4ߘ͔h(0jGaXy,/}J쯝t -5f&C{7\K|cOM>(F̠I\#!Z(wjxL/xc1L2dan+RNvM]!c`m]a߉ h?bQXiv)dgS -xq/4tOOSs/zi;I35A[GV ٌҔh@5ҧ_I1[""hƵkrq=#~J hghs#Z5.ayA'v-UjS#B|`Nf (!ΐUPLEXKU"_C;!09U?w<>IԸΠC-1{0]=K %6 CCJٙ3c%ڮДMيo y)Qc0 Sbt$C׮ n{$e:VlǴ8 - xB0@6^9k7?ˏ?o?;?|;?V>??^&+B1 1%yV`WA4Dkq2k./:dlH+ϵ0BcWjhTޝu֌nhlgy'yQ"SCɺ}5 ϮI|DyhKHHq0•+=ٌ& n M9lC y)[tE)9-LIXw߻X|'15$^ڻ XZR3aIlf芩 -|lmYX>ܬ5RS%TP275uңםIdog-KChQw|olJڂ(B/q &?:tXN K6K7of8X`fz\tx-zYia~`e:&XXkf`6t<"ް&a7sgEVvJSgTqw6ϭ%%*PZ5oKT"e~Nq2j6]&%Jt Yn@J`Bcs.E=1w5J ڌ]#p'FJcX%+;@p%{{5vG5"3NVu1GM;fjhI:y_r$۔d V,{--[Gjy$\7`˴2?[ɇx-1Otƞjm< -e -[5my P=!*.u \R2Xl7ON26&@dthU @qw!}IC-M|5^uԑX0Ls]Y60*:/3` Ma Hf4cyIWH*L$*{T,1M;•ta{A+T<3mu-ƪf)( -讉rcީ.Q_NWtuRO1M > q^(y"l(ο\H=6'Hwiw1/}EHQb05:P'%&ݫk~[F|4;kϢ>S$3s#D]:+lq(4/+[}L+)5<IZ_FnЖ㳚M7*D&3ҵd__ 픑O?溬gtq.Vk%6#3=p&s7)gδeOץߢ5~h'4\eVﺎC(!٘5]׵x ʝ<3i/52ݥ8&V]fdN7e$)t1,o'DBo-~ɰr+QaqA -%q| P\iy?(BhO!U*W|rV6Zt,c.]Ņjl/@"kG[q7&Ԧ?[uE;?v–w^~bոUTҞ] +mޞ}3X@Ae5לpY -=ڜ>*f^2rw&Y~aFM{#^H_.jLޚW;K[Ns>kVވ)Duc8cM{Tb>#⌢$1ls} T\ X`A2Faf1"&+Y 7w$I/-6#v1QMg[lR^F5mX - /+5wpK DʕTfb-7)$[Pd)̒S5 -W/t׍7. -4 ƞ6YM۬Y[P$9-`vw1q8dMh4=9޷PF ұzL5k﷼3918˨[3;ꮜs5\)c\V)Xۇe\경}!!p~~h~|?+yj6+i7j3,b1]S\+l/Z!,Ȼk5~jb%&O<|X)1a\iJ׏t%[U_|ox~fw $0[jh;~#9T&<[R-ˎ3k=kb8ܪ .^ -+YYƭī6EY d)Vɇy! W:#}v#kԷH8YZcg+ڸ<\2LVWSy8ecGŶmgX^2\C H5?>m+'w8"ȖZ7uE[4l5R Vr-.'Lj1M,W uȾN@ &zy:3GsV%lO~V2(`OβrJ/'?3DYf?~^I)_P6[snx+s%oPΠ&r -؃'L/va  還=Odݯt~2#x _SADr3cl40qq,*ePsVz^wX;T!vF`ztD.Li._(gjFb{8-qnAjݘJ=%߇+sVC?$.#NM¡Amނ0v- C1*HVp'_bGqGٱ+FBD6m.JWRc졆h\ ;A{Vjyڹ P6h җn߱j^e^A͑uOO׈wUT -$Kd#@ɣՈ{1 Oj`8%|x1"cѥt+)MK^s0AUBe-@!) Zr;ŰKC=zV160(AjW TGjKFgVwpB(,M^, ZF6F㩡4KnLw a jS+^#& \s\ ārͪyKiDG1VԜQ>&I'BzW161&9̅v2C=2q,!}>4Լ'ɂZ^bTQ\ YN= - is[[r4~CW* - ']34zh5. o]}ՔH&p^IFLP&1:-T{c@yHaVP%\s7NNW%y:x'Oùlּ?A˜DtbgȟxdHW+[[j @ixFxĝ!GӒf.='}]V1 z]5>8NMX0y. 0Ѐd-ΕPHD351<8RC9ÙΎWc;S8=7uwdW||Q)j=Кgj:|:kYZ!t3b7$]תy'Fp/F65b6kkUhdПU"x,IM+U?',A0}sdO;z~򐠛b(7ܫ -J"PTH-_LΙto)1B(u:*'\+頎vNTC> bXm!ԤyWwzajDy߯dRB#cP5R$S Wj"14ڳ 3p#IN4a7@A 1a*e {O5Q7Ul9 ?^i0L68VMm+CZBBA`Q ܹ\BN=~=jEA!KLkjķ?OR{qPBy3JqZG>wrlR 7\{6tzzLDՑ}kbj‚F7?ߒcD1Dt~d/(E&ՏFD=_T p4ϏQ3 -X@~33|| tce|MԑwՄ5쒜 RhF 7vU$^oHG[FxC6Ζ -ĄS)JM:d36uUsW3¬~ fDSN7Oj"1l{ JoقWK7SK iljбs -6R0#:W %lho=6t D`ntΠ*1֫e:&|0>Ȣ\%9إ>/Iyp˳}Rn̐f wgS#{ƑiV# ]Xj܉&< dK6Qܪzת/q錁rv$঑ Mᅁ_{FMéVdyc%'^Jcu'ĺ 2*fl- gL]V6ͮ'Yyce[6lNʸ -YKĺ盳+ua"tD>p]$R2obJ 4Q h 5G0WJr mAX5k&BҼ =kꃢj\)qvT'čp -+5B<ӱ&LsӟUlwQ5XpkcG8V"B`1ڭ,2m4. 4yjB>^$ 75\^#t+D )}##lFbiJ\@+}WRו.\59p iھb0W%gfƖ'dk9ң~Ss'WbdY5wBѰ7~lƔ3bT7ij4y uNQu@朗'%1ܔnv;@c=,a: aդ)J_rjDJA DO>p7 ^WdNQy8X%Z dWX5y,N8ΠCo.a:*=CZ(lԻ CCJ#c%UC)2_i 8w2RF Q&3 0\O!r-b?WMpM-&)P[}"8PhܦƋ+5\ٰGGӯ~~ok/~۾};nǾi@ti'\"RuRbӽU{s3^oIvZ@tJ*|\u*k6I2`yOIפ 眚ui]l'-W,zm3'j:tPףla$m\oӆ06ӌ9L-⊈۹ ,L,,1[K]ua{yJ GӺ}D2)@ jql?WFu>Zkbj\]zqXIkL=ML+ba>M%38Fɰ:s8pywt)dZDr |@RQSfp =c;$;%2fb0EBO -@+ -\RdO JSt*!R10n UB>?YwU9b#hYL_ vXvZM QX -&c-sH߉q`~0^CD -FP3e42s^ ?<0w`̥t6[cf'FJ)0'B0s e17 Wz"T֋J栾kǃ0ɵ1ʇζ?aᜆu{-a>>oh+֪*~o$$l#&p;W650v38N0F2i2lRTs0-Erl,w; -vQvØ-ƀjOR?W*vlP?.>-05NQ[JYJ^#fO{{,k,/w|tgnFo`o˚ԭnbwW2@OOuUZ!cu=?x0heČX{kWjVrmm c\It{jѤ-47a _^u5s0FŻ'\ٷv~?qƽ[;^&RSַ`Ҽsk/o%ݍ%UmH*|$ @Xdƾ% Ez\ƛ"[ݷ)i&&"l&l%hIvi6MpAp(?#W{!.m2cudduSzO3_t3}7?-mcEב́{/9тhƕ.xSLUjyEcEl&mv* C N.i0XlD0?.uA“+)DdNh}ylYzK4fD+͂c($k`Bv 0 ;wq:U h>̑rd5Q;O*oh10`ἡ0'ռ0t0k aRrs:#S 骆 G=-qD/ A5BZb Yg (۽ Vv:iA0:"K)qw?y~hf"Jt(y <%OQ"ߨ3gCwԙcdc;ϙ`$gpf~>J -\@ (} 3.Ys[g<ÆiZcaP\$ҬzW־ H" h0H2V 畟Wi3[3l0V3XR SS݊틉Z pX%6pVw[dc8l]sϢ.kBo1V3/,LY/i)+z݇9p -3c7Shh1!ŝ~#S %sI_yHv8rVmd*za6qR>3t?g-0-BMa!X4Dd7[n?+Vbs5 +گsw+g)^쀉Bt6Y 񌲫3Lo֗|^w_\s$<ܕMբvSx-粕iO1|Qi5b]ʼnO݀SȱnaO2όx씂=ώzȔJ#; -nwg?/*+jCnjzk9?/b?G7Pa|/c'ט-'[ˎ7-[V [I/b+:߸D`ʾc<`I٤#gX/{@N|~.}<{/kh%\{TX[2Y',SmXg4y/~nyWBH9noP=seO.PΠ qcqV07Kb廻zk+}1Ym.Xe+sUDa\~HJ\|vb35Bju5"jdz_js<3ݷѯ/~amsj TOXTRETB0d&–A1àyaKxFI{ Ӱ+Je\GT_ +u]upfOF¦zFCrsؙ\'aGա_E/2F h0&9OO"yޔ(anq-aٲobYht ҝg sHVd%Xވ#Kq$xM_Z+ʂv3dSlcY.F<~M_䤭AkE&>:Kvb(^A(N7e`bf7e,;eA1.^*QWweBz=9>^wBJ w9CH5nyqqS|*+? yP1b4|=R2 k lI_,>_gMS:ln_hD]{%=v<ȧ=\ z%c"/{vC!9v;bJso:;FޝgtO>ews >KI "Au-uw%4;GY sIO9s_s=>y켞h 9rHřWwd…8V4Y3G9M&*gf 휫l}-Nn-Y Z@иHs'iPS(rWNƊОc_F=_- Io!qLփΗ<ݫ ld}ʗ ҴkeY_3mY<ؕYVܶ-'bP/soY7e0 -NP'e†BD|VEŒ4zWWC]bglL5l{X%qf(}wF)^"jU2ȟ|A4neI)$RTa{{/j1oo/mXk'ULekY m?DYx`KiF}oiɼe/NnKpoXK|e.jiZn?|m5U96WƲڎhDg4ƻڲhDעvΩ<ַ'aq8:chpH{}fx=72R5>v%qc}J(Yc"g^,)#h3|M  7 < "%J$ZEӥ*E0@h۽m4HU;щ(Ys dQ(޼bnP -7EvÛec5z4=Ҍa18G,A4wX! $"dPgהVS7hz"_+M08öIă-Mۥ1Y -[֑zBMy-%fQMu̘oIÄ^*Rk~ +H$z2J'q#^:B4;jpT"wVErfϣ0ܫw%.l$ h̔`1 %}QrW\å{5˥bra$\"O}g+jrPaD#Lک ^n1P]=Zr{ߚa8У1ΣA5' 룉O;a:tOh6eݮH/gy We`K)Ҟ#W{' \){i"I]+[K4]}4-)3?^s_3Hܷꭎ8H^ 0׷}M%M=U}-ؗU2ި׏eh#`Tmž :L3ޕǹ/wk"+lx:)T.=w,b/)# u` q=^iq1*^4.0"8pK3 g)k@je4]:AZ;6VwFPt4A82եgMv+C;ȢYU`}]3UXFh c_F1 Lft2;HCh+. Y,cKє as.1el<&s,q&NV4"Ύ%}3y׻˒PjTIwUJiٔX7lư^;L4w/7 Sw`f&~ endstream endobj 24 0 obj <>stream -Hʥ9axMU% 7 "#:0 s>+ow{vϪU+ezx++ӺGX+`ódKV2k^󕖫blxG[mYo\|WσIY=F/+aՖ}ԁT8nܘ|{F1˹>`;궦0@**19g`Rk^m~/?~ן^竽['s_ҍ_˛ןB rhO8Ǡgi;x:݅ K1j|3) -"$]fZH䵄Ib|灘 u i[,? S3D kM*1""Tr\Ud@TO}pcU9jCh3x91 B]I9V $`xH^aNkv ()>H3#MdLtn$[nncPXp`1I'fҌ8Ϩ?l~6neXhxaRjFvw5Q9ccarqZ-3占HGdY~q!7C- g{.! ]KQFLz7JHvZ]D2mW΃A֙}ڗ߹;0WBya$f/#c(R}ڻf'IbWZYV``\`ȒtI}scH^~Bf608]dszF}0)Tk,SCc'Ck!T 76CfA2RUEH -j;ZcTJ3S˜̄|Q:aYAAgIZ@P1SAYqaI|0P2ɆL5bG9aL  f8B[)z'Ub 1  sOeKr95v+dQK?6~Maah߈aMmNR;ug=3䆴B8t%6b&xV[)ɸ1~Gvcu{Zl(ڪwa5Vܫ:juqVYcP\ *);CPaI>~e!T/fW6wCYAIE:`XHpuɚN5o3 -D˚D|u-ˮDHSL:_ L Uu(TU -` -y^%5&[MAp"U[E u`moP2<eފֱepB3!R־p>C;kZ[Xz,OȢ^lddFy+z}*WcV=2hsRv7a@pju5s`,$WONje[ְyT?|!.r`JS)Hjyq9oC\A -Ыw>(,"Cl"y{A_h]yWSJCՙWbhXc o&NG CE^`vQ[U&M^W`Щ9D_kU07s]=!,.LEZZ`&u^h8 )LJ*YD՟xiB UN2鴓`y#@@FWlHf.bQLN"^z%!RzHVX] x4+Ì$0ĕB0wNZRj9|0Ms4+d4FcΆԶۺ4NiA/ineؑŞgMLWt:gk9 :( "j~ W -nF Ol FT!Pl@#idTh!fe,&oV|f̒9֒C9 -_:^ LLaDDܘe:X>E xw=OL`l^T!g (}G^ -(8asf[ՃY4cG=R+Fӊ\Ex>t+#Qf#51 bh}]ElWo f@BJhSFߚv^dc:|(no)#Z°,8dc4b5I2‰2 -a~ Xrذ;?X+ 5AQ/RpyY &~sI7p\M̌6j -YC;x.[f 1wcegJٹX N|zYhN!U='RF\R9W.GT\QX,6Ce/*? -b5j9^17j2_~_8PJ&yRKl}Mˎ;V'͖R%0-rEWeg'SKa%eV#>gǃ؃oM'Z.}@pڴv1Slc,z#._䤭]7r O4r:eA3.pUloEBnwuctŸLvH䵃H:.m*<>J7q즒[}BHE -uyRm❉p{u_>WrE,tC:C!=+e ߈~'0ywD\x0n*;n9rb.bOv#bXc3{ -xU ;\˼3^s04Lw?k -$ lz;=_q6!`M; A}A\Q&ob &U(P{9-oLv.`s/*g׻ᮀG԰<iF=hn9Te?—` 8+ Fdc]i;NGŦFC uJq/L4)ߺ5"Jj 2#DWL͠:gV\gcgb-z C*ZV8rU{zխ&Z/Ceh_1X3hw[@2 3y,18-n^Ֆғ+< g6~:&.l-Vy {QbؗKs5y}Kl3*ZsI-o#"eNX%74XѕHq.]Soi渝dD7{U._]vQؐhӽl.ٖHj8A.}ir"y5:y-:c7`SG@B2:% tu[@JxyqC,B̘hH fJPdFXLE8+M=UBC\R*9GVOٜ4(@2q*Uw34dS$v*SC\'^VQX/UTFC}bRpo UA&L(Sh;ndK#yG!4#^4T45{gAD}K.\cR{լ7oH|>sܥt, -iQ<_wïf?4-OsåуK]Uzp `Ѿ>YB#~O!NQ2]S yv[~K'ߡkLbva( O۽Lc-xϷ˶,?e]we^uQݗ*S<:bU -q|{;`- endstream endobj 6 0 obj [5 0 R] endobj 25 0 obj <> endobj xref 0 26 0000000000 65535 f -0000000016 00000 n -0000000144 00000 n -0000025173 00000 n -0000000000 00000 f -0000065496 00000 n -0000216446 00000 n -0000025224 00000 n -0000025562 00000 n -0000065799 00000 n -0000065686 00000 n -0000064745 00000 n -0000064935 00000 n -0000064983 00000 n -0000065570 00000 n -0000065601 00000 n -0000065872 00000 n -0000066155 00000 n -0000067473 00000 n -0000085125 00000 n -0000098214 00000 n -0000119906 00000 n -0000150354 00000 n -0000180599 00000 n -0000210222 00000 n -0000216469 00000 n -trailer <<636425E0298441309A895498F62E903C>]>> startxref 216662 %%EOF \ No newline at end of file diff --git a/mdns/en/_static/file.png b/mdns/en/_static/file.png deleted file mode 100644 index a858a410e..000000000 Binary files a/mdns/en/_static/file.png and /dev/null differ diff --git a/mdns/en/_static/jquery-3.5.1.js b/mdns/en/_static/jquery-3.5.1.js deleted file mode 100644 index 50937333b..000000000 --- a/mdns/en/_static/jquery-3.5.1.js +++ /dev/null @@ -1,10872 +0,0 @@ -/*! - * jQuery JavaScript Library v3.5.1 - * https://jquery.com/ - * - * Includes Sizzle.js - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors - * Released under the MIT license - * https://jquery.org/license - * - * Date: 2020-05-04T22:49Z - */ -( function( global, factory ) { - - "use strict"; - - if ( typeof module === "object" && typeof module.exports === "object" ) { - - // For CommonJS and CommonJS-like environments where a proper `window` - // is present, execute the factory and get jQuery. - // For environments that do not have a `window` with a `document` - // (such as Node.js), expose a factory as module.exports. - // This accentuates the need for the creation of a real `window`. - // e.g. var jQuery = require("jquery")(window); - // See ticket #14549 for more info. - module.exports = global.document ? - factory( global, true ) : - function( w ) { - if ( !w.document ) { - throw new Error( "jQuery requires a window with a document" ); - } - return factory( w ); - }; - } else { - factory( global ); - } - -// Pass this if window is not defined yet -} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { - -// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 -// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode -// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common -// enough that all such attempts are guarded in a try block. -"use strict"; - -var arr = []; - -var getProto = Object.getPrototypeOf; - -var slice = arr.slice; - -var flat = arr.flat ? function( array ) { - return arr.flat.call( array ); -} : function( array ) { - return arr.concat.apply( [], array ); -}; - - -var push = arr.push; - -var indexOf = arr.indexOf; - -var class2type = {}; - -var toString = class2type.toString; - -var hasOwn = class2type.hasOwnProperty; - -var fnToString = hasOwn.toString; - -var ObjectFunctionString = fnToString.call( Object ); - -var support = {}; - -var isFunction = function isFunction( obj ) { - - // Support: Chrome <=57, Firefox <=52 - // In some browsers, typeof returns "function" for HTML elements - // (i.e., `typeof document.createElement( "object" ) === "function"`). - // We don't want to classify *any* DOM node as a function. - return typeof obj === "function" && typeof obj.nodeType !== "number"; - }; - - -var isWindow = function isWindow( obj ) { - return obj != null && obj === obj.window; - }; - - -var document = window.document; - - - - var preservedScriptAttributes = { - type: true, - src: true, - nonce: true, - noModule: true - }; - - function DOMEval( code, node, doc ) { - doc = doc || document; - - var i, val, - script = doc.createElement( "script" ); - - script.text = code; - if ( node ) { - for ( i in preservedScriptAttributes ) { - - // Support: Firefox 64+, Edge 18+ - // Some browsers don't support the "nonce" property on scripts. - // On the other hand, just using `getAttribute` is not enough as - // the `nonce` attribute is reset to an empty string whenever it - // becomes browsing-context connected. - // See https://github.com/whatwg/html/issues/2369 - // See https://html.spec.whatwg.org/#nonce-attributes - // The `node.getAttribute` check was added for the sake of - // `jQuery.globalEval` so that it can fake a nonce-containing node - // via an object. - val = node[ i ] || node.getAttribute && node.getAttribute( i ); - if ( val ) { - script.setAttribute( i, val ); - } - } - } - doc.head.appendChild( script ).parentNode.removeChild( script ); - } - - -function toType( obj ) { - if ( obj == null ) { - return obj + ""; - } - - // Support: Android <=2.3 only (functionish RegExp) - return typeof obj === "object" || typeof obj === "function" ? - class2type[ toString.call( obj ) ] || "object" : - typeof obj; -} -/* global Symbol */ -// Defining this global in .eslintrc.json would create a danger of using the global -// unguarded in another place, it seems safer to define global only for this module - - - -var - version = "3.5.1", - - // Define a local copy of jQuery - jQuery = function( selector, context ) { - - // The jQuery object is actually just the init constructor 'enhanced' - // Need init if jQuery is called (just allow error to be thrown if not included) - return new jQuery.fn.init( selector, context ); - }; - -jQuery.fn = jQuery.prototype = { - - // The current version of jQuery being used - jquery: version, - - constructor: jQuery, - - // The default length of a jQuery object is 0 - length: 0, - - toArray: function() { - return slice.call( this ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - - // Return all the elements in a clean array - if ( num == null ) { - return slice.call( this ); - } - - // Return just the one element from the set - return num < 0 ? this[ num + this.length ] : this[ num ]; - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems ) { - - // Build a new jQuery matched element set - var ret = jQuery.merge( this.constructor(), elems ); - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - each: function( callback ) { - return jQuery.each( this, callback ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map( this, function( elem, i ) { - return callback.call( elem, i, elem ); - } ) ); - }, - - slice: function() { - return this.pushStack( slice.apply( this, arguments ) ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - even: function() { - return this.pushStack( jQuery.grep( this, function( _elem, i ) { - return ( i + 1 ) % 2; - } ) ); - }, - - odd: function() { - return this.pushStack( jQuery.grep( this, function( _elem, i ) { - return i % 2; - } ) ); - }, - - eq: function( i ) { - var len = this.length, - j = +i + ( i < 0 ? len : 0 ); - return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); - }, - - end: function() { - return this.prevObject || this.constructor(); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: arr.sort, - splice: arr.splice -}; - -jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, - target = arguments[ 0 ] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - - // Skip the boolean and the target - target = arguments[ i ] || {}; - i++; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !isFunction( target ) ) { - target = {}; - } - - // Extend jQuery itself if only one argument is passed - if ( i === length ) { - target = this; - i--; - } - - for ( ; i < length; i++ ) { - - // Only deal with non-null/undefined values - if ( ( options = arguments[ i ] ) != null ) { - - // Extend the base object - for ( name in options ) { - copy = options[ name ]; - - // Prevent Object.prototype pollution - // Prevent never-ending loop - if ( name === "__proto__" || target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject( copy ) || - ( copyIsArray = Array.isArray( copy ) ) ) ) { - src = target[ name ]; - - // Ensure proper type for the source value - if ( copyIsArray && !Array.isArray( src ) ) { - clone = []; - } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { - clone = {}; - } else { - clone = src; - } - copyIsArray = false; - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend( { - - // Unique for each copy of jQuery on the page - expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), - - // Assume jQuery is ready without the ready module - isReady: true, - - error: function( msg ) { - throw new Error( msg ); - }, - - noop: function() {}, - - isPlainObject: function( obj ) { - var proto, Ctor; - - // Detect obvious negatives - // Use toString instead of jQuery.type to catch host objects - if ( !obj || toString.call( obj ) !== "[object Object]" ) { - return false; - } - - proto = getProto( obj ); - - // Objects with no prototype (e.g., `Object.create( null )`) are plain - if ( !proto ) { - return true; - } - - // Objects with prototype are plain iff they were constructed by a global Object function - Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; - return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; - }, - - isEmptyObject: function( obj ) { - var name; - - for ( name in obj ) { - return false; - } - return true; - }, - - // Evaluates a script in a provided context; falls back to the global one - // if not specified. - globalEval: function( code, options, doc ) { - DOMEval( code, { nonce: options && options.nonce }, doc ); - }, - - each: function( obj, callback ) { - var length, i = 0; - - if ( isArrayLike( obj ) ) { - length = obj.length; - for ( ; i < length; i++ ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } else { - for ( i in obj ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } - - return obj; - }, - - // results is for internal usage only - makeArray: function( arr, results ) { - var ret = results || []; - - if ( arr != null ) { - if ( isArrayLike( Object( arr ) ) ) { - jQuery.merge( ret, - typeof arr === "string" ? - [ arr ] : arr - ); - } else { - push.call( ret, arr ); - } - } - - return ret; - }, - - inArray: function( elem, arr, i ) { - return arr == null ? -1 : indexOf.call( arr, elem, i ); - }, - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - merge: function( first, second ) { - var len = +second.length, - j = 0, - i = first.length; - - for ( ; j < len; j++ ) { - first[ i++ ] = second[ j ]; - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, invert ) { - var callbackInverse, - matches = [], - i = 0, - length = elems.length, - callbackExpect = !invert; - - // Go through the array, only saving the items - // that pass the validator function - for ( ; i < length; i++ ) { - callbackInverse = !callback( elems[ i ], i ); - if ( callbackInverse !== callbackExpect ) { - matches.push( elems[ i ] ); - } - } - - return matches; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var length, value, - i = 0, - ret = []; - - // Go through the array, translating each of the items to their new values - if ( isArrayLike( elems ) ) { - length = elems.length; - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - - // Go through every key on the object, - } else { - for ( i in elems ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - } - - // Flatten any nested arrays - return flat( ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // jQuery.support is not used in Core but other projects attach their - // properties to it so it needs to exist. - support: support -} ); - -if ( typeof Symbol === "function" ) { - jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; -} - -// Populate the class2type map -jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), -function( _i, name ) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -} ); - -function isArrayLike( obj ) { - - // Support: real iOS 8.2 only (not reproducible in simulator) - // `in` check used to prevent JIT error (gh-2145) - // hasOwn isn't used here due to false negatives - // regarding Nodelist length in IE - var length = !!obj && "length" in obj && obj.length, - type = toType( obj ); - - if ( isFunction( obj ) || isWindow( obj ) ) { - return false; - } - - return type === "array" || length === 0 || - typeof length === "number" && length > 0 && ( length - 1 ) in obj; -} -var Sizzle = -/*! - * Sizzle CSS Selector Engine v2.3.5 - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors - * Released under the MIT license - * https://js.foundation/ - * - * Date: 2020-03-14 - */ -( function( window ) { -var i, - support, - Expr, - getText, - isXML, - tokenize, - compile, - select, - outermostContext, - sortInput, - hasDuplicate, - - // Local document vars - setDocument, - document, - docElem, - documentIsHTML, - rbuggyQSA, - rbuggyMatches, - matches, - contains, - - // Instance-specific data - expando = "sizzle" + 1 * new Date(), - preferredDoc = window.document, - dirruns = 0, - done = 0, - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - nonnativeSelectorCache = createCache(), - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - } - return 0; - }, - - // Instance methods - hasOwn = ( {} ).hasOwnProperty, - arr = [], - pop = arr.pop, - pushNative = arr.push, - push = arr.push, - slice = arr.slice, - - // Use a stripped-down indexOf as it's faster than native - // https://jsperf.com/thor-indexof-vs-for/5 - indexOf = function( list, elem ) { - var i = 0, - len = list.length; - for ( ; i < len; i++ ) { - if ( list[ i ] === elem ) { - return i; - } - } - return -1; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" + - "ismap|loop|multiple|open|readonly|required|scoped", - - // Regular expressions - - // http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - - // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram - identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + - "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", - - // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + - - // Operator (capture 2) - "*([*^$|!~]?=)" + whitespace + - - // "Attribute values must be CSS identifiers [capture 5] - // or strings [capture 3 or capture 4]" - "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + - whitespace + "*\\]", - - pseudos = ":(" + identifier + ")(?:\\((" + - - // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: - // 1. quoted (capture 3; capture 4 or capture 5) - "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + - - // 2. simple (capture 6) - "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + - - // 3. anything else (capture 2) - ".*" + - ")\\)|)", - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rwhitespace = new RegExp( whitespace + "+", "g" ), - rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + - whitespace + "+$", "g" ), - - rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + - "*" ), - rdescend = new RegExp( whitespace + "|>" ), - - rpseudo = new RegExp( pseudos ), - ridentifier = new RegExp( "^" + identifier + "$" ), - - matchExpr = { - "ID": new RegExp( "^#(" + identifier + ")" ), - "CLASS": new RegExp( "^\\.(" + identifier + ")" ), - "TAG": new RegExp( "^(" + identifier + "|[*])" ), - "ATTR": new RegExp( "^" + attributes ), - "PSEUDO": new RegExp( "^" + pseudos ), - "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + - whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + - whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), - - // For use in libraries implementing .is() - // We use this for POS matching in `select` - "needsContext": new RegExp( "^" + whitespace + - "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + - "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) - }, - - rhtml = /HTML$/i, - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - - rnative = /^[^{]+\{\s*\[native \w/, - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - - rsibling = /[+~]/, - - // CSS escapes - // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ), - funescape = function( escape, nonHex ) { - var high = "0x" + escape.slice( 1 ) - 0x10000; - - return nonHex ? - - // Strip the backslash prefix from a non-hex escape sequence - nonHex : - - // Replace a hexadecimal escape sequence with the encoded Unicode code point - // Support: IE <=11+ - // For values outside the Basic Multilingual Plane (BMP), manually construct a - // surrogate pair - high < 0 ? - String.fromCharCode( high + 0x10000 ) : - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }, - - // CSS string/identifier serialization - // https://drafts.csswg.org/cssom/#common-serializing-idioms - rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, - fcssescape = function( ch, asCodePoint ) { - if ( asCodePoint ) { - - // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER - if ( ch === "\0" ) { - return "\uFFFD"; - } - - // Control characters and (dependent upon position) numbers get escaped as code points - return ch.slice( 0, -1 ) + "\\" + - ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; - } - - // Other potentially-special ASCII characters get backslash-escaped - return "\\" + ch; - }, - - // Used for iframes - // See setDocument() - // Removing the function wrapper causes a "Permission Denied" - // error in IE - unloadHandler = function() { - setDocument(); - }, - - inDisabledFieldset = addCombinator( - function( elem ) { - return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; - }, - { dir: "parentNode", next: "legend" } - ); - -// Optimize for push.apply( _, NodeList ) -try { - push.apply( - ( arr = slice.call( preferredDoc.childNodes ) ), - preferredDoc.childNodes - ); - - // Support: Android<4.0 - // Detect silently failing push.apply - // eslint-disable-next-line no-unused-expressions - arr[ preferredDoc.childNodes.length ].nodeType; -} catch ( e ) { - push = { apply: arr.length ? - - // Leverage slice if possible - function( target, els ) { - pushNative.apply( target, slice.call( els ) ); - } : - - // Support: IE<9 - // Otherwise append directly - function( target, els ) { - var j = target.length, - i = 0; - - // Can't trust NodeList.length - while ( ( target[ j++ ] = els[ i++ ] ) ) {} - target.length = j - 1; - } - }; -} - -function Sizzle( selector, context, results, seed ) { - var m, i, elem, nid, match, groups, newSelector, - newContext = context && context.ownerDocument, - - // nodeType defaults to 9, since context defaults to document - nodeType = context ? context.nodeType : 9; - - results = results || []; - - // Return early from calls with invalid selector or context - if ( typeof selector !== "string" || !selector || - nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { - - return results; - } - - // Try to shortcut find operations (as opposed to filters) in HTML documents - if ( !seed ) { - setDocument( context ); - context = context || document; - - if ( documentIsHTML ) { - - // If the selector is sufficiently simple, try using a "get*By*" DOM method - // (excepting DocumentFragment context, where the methods don't exist) - if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { - - // ID selector - if ( ( m = match[ 1 ] ) ) { - - // Document context - if ( nodeType === 9 ) { - if ( ( elem = context.getElementById( m ) ) ) { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( elem.id === m ) { - results.push( elem ); - return results; - } - } else { - return results; - } - - // Element context - } else { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( newContext && ( elem = newContext.getElementById( m ) ) && - contains( context, elem ) && - elem.id === m ) { - - results.push( elem ); - return results; - } - } - - // Type selector - } else if ( match[ 2 ] ) { - push.apply( results, context.getElementsByTagName( selector ) ); - return results; - - // Class selector - } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName && - context.getElementsByClassName ) { - - push.apply( results, context.getElementsByClassName( m ) ); - return results; - } - } - - // Take advantage of querySelectorAll - if ( support.qsa && - !nonnativeSelectorCache[ selector + " " ] && - ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) && - - // Support: IE 8 only - // Exclude object elements - ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) { - - newSelector = selector; - newContext = context; - - // qSA considers elements outside a scoping root when evaluating child or - // descendant combinators, which is not what we want. - // In such cases, we work around the behavior by prefixing every selector in the - // list with an ID selector referencing the scope context. - // The technique has to be used as well when a leading combinator is used - // as such selectors are not recognized by querySelectorAll. - // Thanks to Andrew Dupont for this technique. - if ( nodeType === 1 && - ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) { - - // Expand context for sibling selectors - newContext = rsibling.test( selector ) && testContext( context.parentNode ) || - context; - - // We can use :scope instead of the ID hack if the browser - // supports it & if we're not changing the context. - if ( newContext !== context || !support.scope ) { - - // Capture the context ID, setting it first if necessary - if ( ( nid = context.getAttribute( "id" ) ) ) { - nid = nid.replace( rcssescape, fcssescape ); - } else { - context.setAttribute( "id", ( nid = expando ) ); - } - } - - // Prefix every selector in the list - groups = tokenize( selector ); - i = groups.length; - while ( i-- ) { - groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + - toSelector( groups[ i ] ); - } - newSelector = groups.join( "," ); - } - - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch ( qsaError ) { - nonnativeSelectorCache( selector, true ); - } finally { - if ( nid === expando ) { - context.removeAttribute( "id" ); - } - } - } - } - } - - // All others - return select( selector.replace( rtrim, "$1" ), context, results, seed ); -} - -/** - * Create key-value caches of limited size - * @returns {function(string, object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ -function createCache() { - var keys = []; - - function cache( key, value ) { - - // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) - if ( keys.push( key + " " ) > Expr.cacheLength ) { - - // Only keep the most recent entries - delete cache[ keys.shift() ]; - } - return ( cache[ key + " " ] = value ); - } - return cache; -} - -/** - * Mark a function for special use by Sizzle - * @param {Function} fn The function to mark - */ -function markFunction( fn ) { - fn[ expando ] = true; - return fn; -} - -/** - * Support testing using an element - * @param {Function} fn Passed the created element and returns a boolean result - */ -function assert( fn ) { - var el = document.createElement( "fieldset" ); - - try { - return !!fn( el ); - } catch ( e ) { - return false; - } finally { - - // Remove from its parent by default - if ( el.parentNode ) { - el.parentNode.removeChild( el ); - } - - // release memory in IE - el = null; - } -} - -/** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ -function addHandle( attrs, handler ) { - var arr = attrs.split( "|" ), - i = arr.length; - - while ( i-- ) { - Expr.attrHandle[ arr[ i ] ] = handler; - } -} - -/** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ -function siblingCheck( a, b ) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && - a.sourceIndex - b.sourceIndex; - - // Use IE sourceIndex if available on both nodes - if ( diff ) { - return diff; - } - - // Check if b follows a - if ( cur ) { - while ( ( cur = cur.nextSibling ) ) { - if ( cur === b ) { - return -1; - } - } - } - - return a ? 1 : -1; -} - -/** - * Returns a function to use in pseudos for input types - * @param {String} type - */ -function createInputPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ -function createButtonPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return ( name === "input" || name === "button" ) && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for :enabled/:disabled - * @param {Boolean} disabled true for :disabled; false for :enabled - */ -function createDisabledPseudo( disabled ) { - - // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable - return function( elem ) { - - // Only certain elements can match :enabled or :disabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled - if ( "form" in elem ) { - - // Check for inherited disabledness on relevant non-disabled elements: - // * listed form-associated elements in a disabled fieldset - // https://html.spec.whatwg.org/multipage/forms.html#category-listed - // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled - // * option elements in a disabled optgroup - // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled - // All such elements have a "form" property. - if ( elem.parentNode && elem.disabled === false ) { - - // Option elements defer to a parent optgroup if present - if ( "label" in elem ) { - if ( "label" in elem.parentNode ) { - return elem.parentNode.disabled === disabled; - } else { - return elem.disabled === disabled; - } - } - - // Support: IE 6 - 11 - // Use the isDisabled shortcut property to check for disabled fieldset ancestors - return elem.isDisabled === disabled || - - // Where there is no isDisabled, check manually - /* jshint -W018 */ - elem.isDisabled !== !disabled && - inDisabledFieldset( elem ) === disabled; - } - - return elem.disabled === disabled; - - // Try to winnow out elements that can't be disabled before trusting the disabled property. - // Some victims get caught in our net (label, legend, menu, track), but it shouldn't - // even exist on them, let alone have a boolean value. - } else if ( "label" in elem ) { - return elem.disabled === disabled; - } - - // Remaining elements are neither :enabled nor :disabled - return false; - }; -} - -/** - * Returns a function to use in pseudos for positionals - * @param {Function} fn - */ -function createPositionalPseudo( fn ) { - return markFunction( function( argument ) { - argument = +argument; - return markFunction( function( seed, matches ) { - var j, - matchIndexes = fn( [], seed.length, argument ), - i = matchIndexes.length; - - // Match elements found at the specified indexes - while ( i-- ) { - if ( seed[ ( j = matchIndexes[ i ] ) ] ) { - seed[ j ] = !( matches[ j ] = seed[ j ] ); - } - } - } ); - } ); -} - -/** - * Checks a node for validity as a Sizzle context - * @param {Element|Object=} context - * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value - */ -function testContext( context ) { - return context && typeof context.getElementsByTagName !== "undefined" && context; -} - -// Expose support vars for convenience -support = Sizzle.support = {}; - -/** - * Detects XML nodes - * @param {Element|Object} elem An element or a document - * @returns {Boolean} True iff elem is a non-HTML XML node - */ -isXML = Sizzle.isXML = function( elem ) { - var namespace = elem.namespaceURI, - docElem = ( elem.ownerDocument || elem ).documentElement; - - // Support: IE <=8 - // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes - // https://bugs.jquery.com/ticket/4833 - return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); -}; - -/** - * Sets document-related variables once based on the current document - * @param {Element|Object} [doc] An element or document object to use to set the document - * @returns {Object} Returns the current document - */ -setDocument = Sizzle.setDocument = function( node ) { - var hasCompare, subWindow, - doc = node ? node.ownerDocument || node : preferredDoc; - - // Return early if doc is invalid or already selected - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { - return document; - } - - // Update global variables - document = doc; - docElem = document.documentElement; - documentIsHTML = !isXML( document ); - - // Support: IE 9 - 11+, Edge 12 - 18+ - // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( preferredDoc != document && - ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { - - // Support: IE 11, Edge - if ( subWindow.addEventListener ) { - subWindow.addEventListener( "unload", unloadHandler, false ); - - // Support: IE 9 - 10 only - } else if ( subWindow.attachEvent ) { - subWindow.attachEvent( "onunload", unloadHandler ); - } - } - - // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only, - // Safari 4 - 5 only, Opera <=11.6 - 12.x only - // IE/Edge & older browsers don't support the :scope pseudo-class. - // Support: Safari 6.0 only - // Safari 6.0 supports :scope but it's an alias of :root there. - support.scope = assert( function( el ) { - docElem.appendChild( el ).appendChild( document.createElement( "div" ) ); - return typeof el.querySelectorAll !== "undefined" && - !el.querySelectorAll( ":scope fieldset div" ).length; - } ); - - /* Attributes - ---------------------------------------------------------------------- */ - - // Support: IE<8 - // Verify that getAttribute really returns attributes and not properties - // (excepting IE8 booleans) - support.attributes = assert( function( el ) { - el.className = "i"; - return !el.getAttribute( "className" ); - } ); - - /* getElement(s)By* - ---------------------------------------------------------------------- */ - - // Check if getElementsByTagName("*") returns only elements - support.getElementsByTagName = assert( function( el ) { - el.appendChild( document.createComment( "" ) ); - return !el.getElementsByTagName( "*" ).length; - } ); - - // Support: IE<9 - support.getElementsByClassName = rnative.test( document.getElementsByClassName ); - - // Support: IE<10 - // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programmatically-set names, - // so use a roundabout getElementsByName test - support.getById = assert( function( el ) { - docElem.appendChild( el ).id = expando; - return !document.getElementsByName || !document.getElementsByName( expando ).length; - } ); - - // ID filter and find - if ( support.getById ) { - Expr.filter[ "ID" ] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - return elem.getAttribute( "id" ) === attrId; - }; - }; - Expr.find[ "ID" ] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var elem = context.getElementById( id ); - return elem ? [ elem ] : []; - } - }; - } else { - Expr.filter[ "ID" ] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - var node = typeof elem.getAttributeNode !== "undefined" && - elem.getAttributeNode( "id" ); - return node && node.value === attrId; - }; - }; - - // Support: IE 6 - 7 only - // getElementById is not reliable as a find shortcut - Expr.find[ "ID" ] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var node, i, elems, - elem = context.getElementById( id ); - - if ( elem ) { - - // Verify the id attribute - node = elem.getAttributeNode( "id" ); - if ( node && node.value === id ) { - return [ elem ]; - } - - // Fall back on getElementsByName - elems = context.getElementsByName( id ); - i = 0; - while ( ( elem = elems[ i++ ] ) ) { - node = elem.getAttributeNode( "id" ); - if ( node && node.value === id ) { - return [ elem ]; - } - } - } - - return []; - } - }; - } - - // Tag - Expr.find[ "TAG" ] = support.getElementsByTagName ? - function( tag, context ) { - if ( typeof context.getElementsByTagName !== "undefined" ) { - return context.getElementsByTagName( tag ); - - // DocumentFragment nodes don't have gEBTN - } else if ( support.qsa ) { - return context.querySelectorAll( tag ); - } - } : - - function( tag, context ) { - var elem, - tmp = [], - i = 0, - - // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too - results = context.getElementsByTagName( tag ); - - // Filter out possible comments - if ( tag === "*" ) { - while ( ( elem = results[ i++ ] ) ) { - if ( elem.nodeType === 1 ) { - tmp.push( elem ); - } - } - - return tmp; - } - return results; - }; - - // Class - Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) { - if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { - return context.getElementsByClassName( className ); - } - }; - - /* QSA/matchesSelector - ---------------------------------------------------------------------- */ - - // QSA and matchesSelector support - - // matchesSelector(:active) reports false when true (IE9/Opera 11.5) - rbuggyMatches = []; - - // qSa(:focus) reports false when true (Chrome 21) - // We allow this because of a bug in IE8/9 that throws an error - // whenever `document.activeElement` is accessed on an iframe - // So, we allow :focus to pass through QSA all the time to avoid the IE error - // See https://bugs.jquery.com/ticket/13378 - rbuggyQSA = []; - - if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) { - - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert( function( el ) { - - var input; - - // Select is set to empty string on purpose - // This is to test IE's treatment of not explicitly - // setting a boolean content attribute, - // since its presence should be enough - // https://bugs.jquery.com/ticket/12359 - docElem.appendChild( el ).innerHTML = "" + - ""; - - // Support: IE8, Opera 11-12.16 - // Nothing should be selected when empty strings follow ^= or $= or *= - // The test attribute must be unknown in Opera but "safe" for WinRT - // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section - if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) { - rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); - } - - // Support: IE8 - // Boolean attributes and "value" are not treated correctly - if ( !el.querySelectorAll( "[selected]" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); - } - - // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ - if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { - rbuggyQSA.push( "~=" ); - } - - // Support: IE 11+, Edge 15 - 18+ - // IE 11/Edge don't find elements on a `[name='']` query in some cases. - // Adding a temporary attribute to the document before the selection works - // around the issue. - // Interestingly, IE 10 & older don't seem to have the issue. - input = document.createElement( "input" ); - input.setAttribute( "name", "" ); - el.appendChild( input ); - if ( !el.querySelectorAll( "[name='']" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + - whitespace + "*(?:''|\"\")" ); - } - - // Webkit/Opera - :checked should return selected option elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - // IE8 throws error here and will not see later tests - if ( !el.querySelectorAll( ":checked" ).length ) { - rbuggyQSA.push( ":checked" ); - } - - // Support: Safari 8+, iOS 8+ - // https://bugs.webkit.org/show_bug.cgi?id=136851 - // In-page `selector#id sibling-combinator selector` fails - if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { - rbuggyQSA.push( ".#.+[+~]" ); - } - - // Support: Firefox <=3.6 - 5 only - // Old Firefox doesn't throw on a badly-escaped identifier. - el.querySelectorAll( "\\\f" ); - rbuggyQSA.push( "[\\r\\n\\f]" ); - } ); - - assert( function( el ) { - el.innerHTML = "" + - ""; - - // Support: Windows 8 Native Apps - // The type and name attributes are restricted during .innerHTML assignment - var input = document.createElement( "input" ); - input.setAttribute( "type", "hidden" ); - el.appendChild( input ).setAttribute( "name", "D" ); - - // Support: IE8 - // Enforce case-sensitivity of name attribute - if ( el.querySelectorAll( "[name=d]" ).length ) { - rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); - } - - // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) - // IE8 throws error here and will not see later tests - if ( el.querySelectorAll( ":enabled" ).length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: IE9-11+ - // IE's :disabled selector does not pick up the children of disabled fieldsets - docElem.appendChild( el ).disabled = true; - if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: Opera 10 - 11 only - // Opera 10-11 does not throw on post-comma invalid pseudos - el.querySelectorAll( "*,:x" ); - rbuggyQSA.push( ",.*:" ); - } ); - } - - if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches || - docElem.webkitMatchesSelector || - docElem.mozMatchesSelector || - docElem.oMatchesSelector || - docElem.msMatchesSelector ) ) ) ) { - - assert( function( el ) { - - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call( el, "*" ); - - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( el, "[s!='']:x" ); - rbuggyMatches.push( "!=", pseudos ); - } ); - } - - rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); - rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) ); - - /* Contains - ---------------------------------------------------------------------- */ - hasCompare = rnative.test( docElem.compareDocumentPosition ); - - // Element contains another - // Purposefully self-exclusive - // As in, an element does not contain itself - contains = hasCompare || rnative.test( docElem.contains ) ? - function( a, b ) { - var adown = a.nodeType === 9 ? a.documentElement : a, - bup = b && b.parentNode; - return a === bup || !!( bup && bup.nodeType === 1 && ( - adown.contains ? - adown.contains( bup ) : - a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 - ) ); - } : - function( a, b ) { - if ( b ) { - while ( ( b = b.parentNode ) ) { - if ( b === a ) { - return true; - } - } - } - return false; - }; - - /* Sorting - ---------------------------------------------------------------------- */ - - // Document order sorting - sortOrder = hasCompare ? - function( a, b ) { - - // Flag for duplicate removal - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - // Sort on method existence if only one input has compareDocumentPosition - var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; - if ( compare ) { - return compare; - } - - // Calculate position if both inputs belong to the same document - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? - a.compareDocumentPosition( b ) : - - // Otherwise we know they are disconnected - 1; - - // Disconnected nodes - if ( compare & 1 || - ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { - - // Choose the first element that is related to our preferred document - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( a == document || a.ownerDocument == preferredDoc && - contains( preferredDoc, a ) ) { - return -1; - } - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( b == document || b.ownerDocument == preferredDoc && - contains( preferredDoc, b ) ) { - return 1; - } - - // Maintain original order - return sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - } - - return compare & 4 ? -1 : 1; - } : - function( a, b ) { - - // Exit early if the nodes are identical - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - var cur, - i = 0, - aup = a.parentNode, - bup = b.parentNode, - ap = [ a ], - bp = [ b ]; - - // Parentless nodes are either documents or disconnected - if ( !aup || !bup ) { - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - /* eslint-disable eqeqeq */ - return a == document ? -1 : - b == document ? 1 : - /* eslint-enable eqeqeq */ - aup ? -1 : - bup ? 1 : - sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - - // If the nodes are siblings, we can do a quick check - } else if ( aup === bup ) { - return siblingCheck( a, b ); - } - - // Otherwise we need full lists of their ancestors for comparison - cur = a; - while ( ( cur = cur.parentNode ) ) { - ap.unshift( cur ); - } - cur = b; - while ( ( cur = cur.parentNode ) ) { - bp.unshift( cur ); - } - - // Walk down the tree looking for a discrepancy - while ( ap[ i ] === bp[ i ] ) { - i++; - } - - return i ? - - // Do a sibling check if the nodes have a common ancestor - siblingCheck( ap[ i ], bp[ i ] ) : - - // Otherwise nodes in our document sort first - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - /* eslint-disable eqeqeq */ - ap[ i ] == preferredDoc ? -1 : - bp[ i ] == preferredDoc ? 1 : - /* eslint-enable eqeqeq */ - 0; - }; - - return document; -}; - -Sizzle.matches = function( expr, elements ) { - return Sizzle( expr, null, null, elements ); -}; - -Sizzle.matchesSelector = function( elem, expr ) { - setDocument( elem ); - - if ( support.matchesSelector && documentIsHTML && - !nonnativeSelectorCache[ expr + " " ] && - ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && - ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { - - try { - var ret = matches.call( elem, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || support.disconnectedMatch || - - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11 ) { - return ret; - } - } catch ( e ) { - nonnativeSelectorCache( expr, true ); - } - } - - return Sizzle( expr, document, null, [ elem ] ).length > 0; -}; - -Sizzle.contains = function( context, elem ) { - - // Set document vars if needed - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( ( context.ownerDocument || context ) != document ) { - setDocument( context ); - } - return contains( context, elem ); -}; - -Sizzle.attr = function( elem, name ) { - - // Set document vars if needed - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( ( elem.ownerDocument || elem ) != document ) { - setDocument( elem ); - } - - var fn = Expr.attrHandle[ name.toLowerCase() ], - - // Don't get fooled by Object.prototype properties (jQuery #13807) - val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? - fn( elem, name, !documentIsHTML ) : - undefined; - - return val !== undefined ? - val : - support.attributes || !documentIsHTML ? - elem.getAttribute( name ) : - ( val = elem.getAttributeNode( name ) ) && val.specified ? - val.value : - null; -}; - -Sizzle.escape = function( sel ) { - return ( sel + "" ).replace( rcssescape, fcssescape ); -}; - -Sizzle.error = function( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); -}; - -/** - * Document sorting and removing duplicates - * @param {ArrayLike} results - */ -Sizzle.uniqueSort = function( results ) { - var elem, - duplicates = [], - j = 0, - i = 0; - - // Unless we *know* we can detect duplicates, assume their presence - hasDuplicate = !support.detectDuplicates; - sortInput = !support.sortStable && results.slice( 0 ); - results.sort( sortOrder ); - - if ( hasDuplicate ) { - while ( ( elem = results[ i++ ] ) ) { - if ( elem === results[ i ] ) { - j = duplicates.push( i ); - } - } - while ( j-- ) { - results.splice( duplicates[ j ], 1 ); - } - } - - // Clear input after sorting to release objects - // See https://github.com/jquery/sizzle/pull/225 - sortInput = null; - - return results; -}; - -/** - * Utility function for retrieving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ -getText = Sizzle.getText = function( elem ) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if ( !nodeType ) { - - // If no nodeType, this is expected to be an array - while ( ( node = elem[ i++ ] ) ) { - - // Do not traverse comment nodes - ret += getText( node ); - } - } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { - - // Use textContent for elements - // innerText usage removed for consistency of new lines (jQuery #11153) - if ( typeof elem.textContent === "string" ) { - return elem.textContent; - } else { - - // Traverse its children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - ret += getText( elem ); - } - } - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - - // Do not include comment or processing instruction nodes - - return ret; -}; - -Expr = Sizzle.selectors = { - - // Can be adjusted by the user - cacheLength: 50, - - createPseudo: markFunction, - - match: matchExpr, - - attrHandle: {}, - - find: {}, - - relative: { - ">": { dir: "parentNode", first: true }, - " ": { dir: "parentNode" }, - "+": { dir: "previousSibling", first: true }, - "~": { dir: "previousSibling" } - }, - - preFilter: { - "ATTR": function( match ) { - match[ 1 ] = match[ 1 ].replace( runescape, funescape ); - - // Move the given value to match[3] whether quoted or unquoted - match[ 3 ] = ( match[ 3 ] || match[ 4 ] || - match[ 5 ] || "" ).replace( runescape, funescape ); - - if ( match[ 2 ] === "~=" ) { - match[ 3 ] = " " + match[ 3 ] + " "; - } - - return match.slice( 0, 4 ); - }, - - "CHILD": function( match ) { - - /* matches from matchExpr["CHILD"] - 1 type (only|nth|...) - 2 what (child|of-type) - 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) - 4 xn-component of xn+y argument ([+-]?\d*n|) - 5 sign of xn-component - 6 x of xn-component - 7 sign of y-component - 8 y of y-component - */ - match[ 1 ] = match[ 1 ].toLowerCase(); - - if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { - - // nth-* requires argument - if ( !match[ 3 ] ) { - Sizzle.error( match[ 0 ] ); - } - - // numeric x and y parameters for Expr.filter.CHILD - // remember that false/true cast respectively to 0/1 - match[ 4 ] = +( match[ 4 ] ? - match[ 5 ] + ( match[ 6 ] || 1 ) : - 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) ); - match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); - - // other types prohibit arguments - } else if ( match[ 3 ] ) { - Sizzle.error( match[ 0 ] ); - } - - return match; - }, - - "PSEUDO": function( match ) { - var excess, - unquoted = !match[ 6 ] && match[ 2 ]; - - if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) { - return null; - } - - // Accept quoted arguments as-is - if ( match[ 3 ] ) { - match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; - - // Strip excess characters from unquoted arguments - } else if ( unquoted && rpseudo.test( unquoted ) && - - // Get excess from tokenize (recursively) - ( excess = tokenize( unquoted, true ) ) && - - // advance to the next closing parenthesis - ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { - - // excess is a negative index - match[ 0 ] = match[ 0 ].slice( 0, excess ); - match[ 2 ] = unquoted.slice( 0, excess ); - } - - // Return only captures needed by the pseudo filter method (type and argument) - return match.slice( 0, 3 ); - } - }, - - filter: { - - "TAG": function( nodeNameSelector ) { - var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); - return nodeNameSelector === "*" ? - function() { - return true; - } : - function( elem ) { - return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; - }; - }, - - "CLASS": function( className ) { - var pattern = classCache[ className + " " ]; - - return pattern || - ( pattern = new RegExp( "(^|" + whitespace + - ")" + className + "(" + whitespace + "|$)" ) ) && classCache( - className, function( elem ) { - return pattern.test( - typeof elem.className === "string" && elem.className || - typeof elem.getAttribute !== "undefined" && - elem.getAttribute( "class" ) || - "" - ); - } ); - }, - - "ATTR": function( name, operator, check ) { - return function( elem ) { - var result = Sizzle.attr( elem, name ); - - if ( result == null ) { - return operator === "!="; - } - if ( !operator ) { - return true; - } - - result += ""; - - /* eslint-disable max-len */ - - return operator === "=" ? result === check : - operator === "!=" ? result !== check : - operator === "^=" ? check && result.indexOf( check ) === 0 : - operator === "*=" ? check && result.indexOf( check ) > -1 : - operator === "$=" ? check && result.slice( -check.length ) === check : - operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : - operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : - false; - /* eslint-enable max-len */ - - }; - }, - - "CHILD": function( type, what, _argument, first, last ) { - var simple = type.slice( 0, 3 ) !== "nth", - forward = type.slice( -4 ) !== "last", - ofType = what === "of-type"; - - return first === 1 && last === 0 ? - - // Shortcut for :nth-*(n) - function( elem ) { - return !!elem.parentNode; - } : - - function( elem, _context, xml ) { - var cache, uniqueCache, outerCache, node, nodeIndex, start, - dir = simple !== forward ? "nextSibling" : "previousSibling", - parent = elem.parentNode, - name = ofType && elem.nodeName.toLowerCase(), - useCache = !xml && !ofType, - diff = false; - - if ( parent ) { - - // :(first|last|only)-(child|of-type) - if ( simple ) { - while ( dir ) { - node = elem; - while ( ( node = node[ dir ] ) ) { - if ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) { - - return false; - } - } - - // Reverse direction for :only-* (if we haven't yet done so) - start = dir = type === "only" && !start && "nextSibling"; - } - return true; - } - - start = [ forward ? parent.firstChild : parent.lastChild ]; - - // non-xml :nth-child(...) stores cache data on `parent` - if ( forward && useCache ) { - - // Seek `elem` from a previously-cached index - - // ...in a gzip-friendly way - node = parent; - outerCache = node[ expando ] || ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex && cache[ 2 ]; - node = nodeIndex && parent.childNodes[ nodeIndex ]; - - while ( ( node = ++nodeIndex && node && node[ dir ] || - - // Fallback to seeking `elem` from the start - ( diff = nodeIndex = 0 ) || start.pop() ) ) { - - // When found, cache indexes on `parent` and break - if ( node.nodeType === 1 && ++diff && node === elem ) { - uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; - break; - } - } - - } else { - - // Use previously-cached element index if available - if ( useCache ) { - - // ...in a gzip-friendly way - node = elem; - outerCache = node[ expando ] || ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex; - } - - // xml :nth-child(...) - // or :nth-last-child(...) or :nth(-last)?-of-type(...) - if ( diff === false ) { - - // Use the same loop as above to seek `elem` from the start - while ( ( node = ++nodeIndex && node && node[ dir ] || - ( diff = nodeIndex = 0 ) || start.pop() ) ) { - - if ( ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) && - ++diff ) { - - // Cache the index of each encountered element - if ( useCache ) { - outerCache = node[ expando ] || - ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - uniqueCache[ type ] = [ dirruns, diff ]; - } - - if ( node === elem ) { - break; - } - } - } - } - } - - // Incorporate the offset, then check against cycle size - diff -= last; - return diff === first || ( diff % first === 0 && diff / first >= 0 ); - } - }; - }, - - "PSEUDO": function( pseudo, argument ) { - - // pseudo-class names are case-insensitive - // http://www.w3.org/TR/selectors/#pseudo-classes - // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters - // Remember that setFilters inherits from pseudos - var args, - fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || - Sizzle.error( "unsupported pseudo: " + pseudo ); - - // The user may use createPseudo to indicate that - // arguments are needed to create the filter function - // just as Sizzle does - if ( fn[ expando ] ) { - return fn( argument ); - } - - // But maintain support for old signatures - if ( fn.length > 1 ) { - args = [ pseudo, pseudo, "", argument ]; - return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? - markFunction( function( seed, matches ) { - var idx, - matched = fn( seed, argument ), - i = matched.length; - while ( i-- ) { - idx = indexOf( seed, matched[ i ] ); - seed[ idx ] = !( matches[ idx ] = matched[ i ] ); - } - } ) : - function( elem ) { - return fn( elem, 0, args ); - }; - } - - return fn; - } - }, - - pseudos: { - - // Potentially complex pseudos - "not": markFunction( function( selector ) { - - // Trim the selector passed to compile - // to avoid treating leading and trailing - // spaces as combinators - var input = [], - results = [], - matcher = compile( selector.replace( rtrim, "$1" ) ); - - return matcher[ expando ] ? - markFunction( function( seed, matches, _context, xml ) { - var elem, - unmatched = matcher( seed, null, xml, [] ), - i = seed.length; - - // Match elements unmatched by `matcher` - while ( i-- ) { - if ( ( elem = unmatched[ i ] ) ) { - seed[ i ] = !( matches[ i ] = elem ); - } - } - } ) : - function( elem, _context, xml ) { - input[ 0 ] = elem; - matcher( input, null, xml, results ); - - // Don't keep the element (issue #299) - input[ 0 ] = null; - return !results.pop(); - }; - } ), - - "has": markFunction( function( selector ) { - return function( elem ) { - return Sizzle( selector, elem ).length > 0; - }; - } ), - - "contains": markFunction( function( text ) { - text = text.replace( runescape, funescape ); - return function( elem ) { - return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1; - }; - } ), - - // "Whether an element is represented by a :lang() selector - // is based solely on the element's language value - // being equal to the identifier C, - // or beginning with the identifier C immediately followed by "-". - // The matching of C against the element's language value is performed case-insensitively. - // The identifier C does not have to be a valid language name." - // http://www.w3.org/TR/selectors/#lang-pseudo - "lang": markFunction( function( lang ) { - - // lang value must be a valid identifier - if ( !ridentifier.test( lang || "" ) ) { - Sizzle.error( "unsupported lang: " + lang ); - } - lang = lang.replace( runescape, funescape ).toLowerCase(); - return function( elem ) { - var elemLang; - do { - if ( ( elemLang = documentIsHTML ? - elem.lang : - elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { - - elemLang = elemLang.toLowerCase(); - return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; - } - } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); - return false; - }; - } ), - - // Miscellaneous - "target": function( elem ) { - var hash = window.location && window.location.hash; - return hash && hash.slice( 1 ) === elem.id; - }, - - "root": function( elem ) { - return elem === docElem; - }, - - "focus": function( elem ) { - return elem === document.activeElement && - ( !document.hasFocus || document.hasFocus() ) && - !!( elem.type || elem.href || ~elem.tabIndex ); - }, - - // Boolean properties - "enabled": createDisabledPseudo( false ), - "disabled": createDisabledPseudo( true ), - - "checked": function( elem ) { - - // In CSS3, :checked should return both checked and selected elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - var nodeName = elem.nodeName.toLowerCase(); - return ( nodeName === "input" && !!elem.checked ) || - ( nodeName === "option" && !!elem.selected ); - }, - - "selected": function( elem ) { - - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - // eslint-disable-next-line no-unused-expressions - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - // Contents - "empty": function( elem ) { - - // http://www.w3.org/TR/selectors/#empty-pseudo - // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), - // but not by others (comment: 8; processing instruction: 7; etc.) - // nodeType < 6 works because attributes (2) do not appear as children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - if ( elem.nodeType < 6 ) { - return false; - } - } - return true; - }, - - "parent": function( elem ) { - return !Expr.pseudos[ "empty" ]( elem ); - }, - - // Element/input types - "header": function( elem ) { - return rheader.test( elem.nodeName ); - }, - - "input": function( elem ) { - return rinputs.test( elem.nodeName ); - }, - - "button": function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === "button" || name === "button"; - }, - - "text": function( elem ) { - var attr; - return elem.nodeName.toLowerCase() === "input" && - elem.type === "text" && - - // Support: IE<8 - // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" - ( ( attr = elem.getAttribute( "type" ) ) == null || - attr.toLowerCase() === "text" ); - }, - - // Position-in-collection - "first": createPositionalPseudo( function() { - return [ 0 ]; - } ), - - "last": createPositionalPseudo( function( _matchIndexes, length ) { - return [ length - 1 ]; - } ), - - "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) { - return [ argument < 0 ? argument + length : argument ]; - } ), - - "even": createPositionalPseudo( function( matchIndexes, length ) { - var i = 0; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "odd": createPositionalPseudo( function( matchIndexes, length ) { - var i = 1; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "lt": createPositionalPseudo( function( matchIndexes, length, argument ) { - var i = argument < 0 ? - argument + length : - argument > length ? - length : - argument; - for ( ; --i >= 0; ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "gt": createPositionalPseudo( function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; ++i < length; ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ) - } -}; - -Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ]; - -// Add button/input type pseudos -for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { - Expr.pseudos[ i ] = createInputPseudo( i ); -} -for ( i in { submit: true, reset: true } ) { - Expr.pseudos[ i ] = createButtonPseudo( i ); -} - -// Easy API for creating new setFilters -function setFilters() {} -setFilters.prototype = Expr.filters = Expr.pseudos; -Expr.setFilters = new setFilters(); - -tokenize = Sizzle.tokenize = function( selector, parseOnly ) { - var matched, match, tokens, type, - soFar, groups, preFilters, - cached = tokenCache[ selector + " " ]; - - if ( cached ) { - return parseOnly ? 0 : cached.slice( 0 ); - } - - soFar = selector; - groups = []; - preFilters = Expr.preFilter; - - while ( soFar ) { - - // Comma and first run - if ( !matched || ( match = rcomma.exec( soFar ) ) ) { - if ( match ) { - - // Don't consume trailing commas as valid - soFar = soFar.slice( match[ 0 ].length ) || soFar; - } - groups.push( ( tokens = [] ) ); - } - - matched = false; - - // Combinators - if ( ( match = rcombinators.exec( soFar ) ) ) { - matched = match.shift(); - tokens.push( { - value: matched, - - // Cast descendant combinators to space - type: match[ 0 ].replace( rtrim, " " ) - } ); - soFar = soFar.slice( matched.length ); - } - - // Filters - for ( type in Expr.filter ) { - if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || - ( match = preFilters[ type ]( match ) ) ) ) { - matched = match.shift(); - tokens.push( { - value: matched, - type: type, - matches: match - } ); - soFar = soFar.slice( matched.length ); - } - } - - if ( !matched ) { - break; - } - } - - // Return the length of the invalid excess - // if we're just parsing - // Otherwise, throw an error or return tokens - return parseOnly ? - soFar.length : - soFar ? - Sizzle.error( selector ) : - - // Cache the tokens - tokenCache( selector, groups ).slice( 0 ); -}; - -function toSelector( tokens ) { - var i = 0, - len = tokens.length, - selector = ""; - for ( ; i < len; i++ ) { - selector += tokens[ i ].value; - } - return selector; -} - -function addCombinator( matcher, combinator, base ) { - var dir = combinator.dir, - skip = combinator.next, - key = skip || dir, - checkNonElements = base && key === "parentNode", - doneName = done++; - - return combinator.first ? - - // Check against closest ancestor/preceding element - function( elem, context, xml ) { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - return matcher( elem, context, xml ); - } - } - return false; - } : - - // Check against all ancestor/preceding elements - function( elem, context, xml ) { - var oldCache, uniqueCache, outerCache, - newCache = [ dirruns, doneName ]; - - // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching - if ( xml ) { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - if ( matcher( elem, context, xml ) ) { - return true; - } - } - } - } else { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - outerCache = elem[ expando ] || ( elem[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ elem.uniqueID ] || - ( outerCache[ elem.uniqueID ] = {} ); - - if ( skip && skip === elem.nodeName.toLowerCase() ) { - elem = elem[ dir ] || elem; - } else if ( ( oldCache = uniqueCache[ key ] ) && - oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { - - // Assign to newCache so results back-propagate to previous elements - return ( newCache[ 2 ] = oldCache[ 2 ] ); - } else { - - // Reuse newcache so results back-propagate to previous elements - uniqueCache[ key ] = newCache; - - // A match means we're done; a fail means we have to keep checking - if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { - return true; - } - } - } - } - } - return false; - }; -} - -function elementMatcher( matchers ) { - return matchers.length > 1 ? - function( elem, context, xml ) { - var i = matchers.length; - while ( i-- ) { - if ( !matchers[ i ]( elem, context, xml ) ) { - return false; - } - } - return true; - } : - matchers[ 0 ]; -} - -function multipleContexts( selector, contexts, results ) { - var i = 0, - len = contexts.length; - for ( ; i < len; i++ ) { - Sizzle( selector, contexts[ i ], results ); - } - return results; -} - -function condense( unmatched, map, filter, context, xml ) { - var elem, - newUnmatched = [], - i = 0, - len = unmatched.length, - mapped = map != null; - - for ( ; i < len; i++ ) { - if ( ( elem = unmatched[ i ] ) ) { - if ( !filter || filter( elem, context, xml ) ) { - newUnmatched.push( elem ); - if ( mapped ) { - map.push( i ); - } - } - } - } - - return newUnmatched; -} - -function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { - if ( postFilter && !postFilter[ expando ] ) { - postFilter = setMatcher( postFilter ); - } - if ( postFinder && !postFinder[ expando ] ) { - postFinder = setMatcher( postFinder, postSelector ); - } - return markFunction( function( seed, results, context, xml ) { - var temp, i, elem, - preMap = [], - postMap = [], - preexisting = results.length, - - // Get initial elements from seed or context - elems = seed || multipleContexts( - selector || "*", - context.nodeType ? [ context ] : context, - [] - ), - - // Prefilter to get matcher input, preserving a map for seed-results synchronization - matcherIn = preFilter && ( seed || !selector ) ? - condense( elems, preMap, preFilter, context, xml ) : - elems, - - matcherOut = matcher ? - - // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, - postFinder || ( seed ? preFilter : preexisting || postFilter ) ? - - // ...intermediate processing is necessary - [] : - - // ...otherwise use results directly - results : - matcherIn; - - // Find primary matches - if ( matcher ) { - matcher( matcherIn, matcherOut, context, xml ); - } - - // Apply postFilter - if ( postFilter ) { - temp = condense( matcherOut, postMap ); - postFilter( temp, [], context, xml ); - - // Un-match failing elements by moving them back to matcherIn - i = temp.length; - while ( i-- ) { - if ( ( elem = temp[ i ] ) ) { - matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); - } - } - } - - if ( seed ) { - if ( postFinder || preFilter ) { - if ( postFinder ) { - - // Get the final matcherOut by condensing this intermediate into postFinder contexts - temp = []; - i = matcherOut.length; - while ( i-- ) { - if ( ( elem = matcherOut[ i ] ) ) { - - // Restore matcherIn since elem is not yet a final match - temp.push( ( matcherIn[ i ] = elem ) ); - } - } - postFinder( null, ( matcherOut = [] ), temp, xml ); - } - - // Move matched elements from seed to results to keep them synchronized - i = matcherOut.length; - while ( i-- ) { - if ( ( elem = matcherOut[ i ] ) && - ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) { - - seed[ temp ] = !( results[ temp ] = elem ); - } - } - } - - // Add elements to results, through postFinder if defined - } else { - matcherOut = condense( - matcherOut === results ? - matcherOut.splice( preexisting, matcherOut.length ) : - matcherOut - ); - if ( postFinder ) { - postFinder( null, results, matcherOut, xml ); - } else { - push.apply( results, matcherOut ); - } - } - } ); -} - -function matcherFromTokens( tokens ) { - var checkContext, matcher, j, - len = tokens.length, - leadingRelative = Expr.relative[ tokens[ 0 ].type ], - implicitRelative = leadingRelative || Expr.relative[ " " ], - i = leadingRelative ? 1 : 0, - - // The foundational matcher ensures that elements are reachable from top-level context(s) - matchContext = addCombinator( function( elem ) { - return elem === checkContext; - }, implicitRelative, true ), - matchAnyContext = addCombinator( function( elem ) { - return indexOf( checkContext, elem ) > -1; - }, implicitRelative, true ), - matchers = [ function( elem, context, xml ) { - var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( - ( checkContext = context ).nodeType ? - matchContext( elem, context, xml ) : - matchAnyContext( elem, context, xml ) ); - - // Avoid hanging onto element (issue #299) - checkContext = null; - return ret; - } ]; - - for ( ; i < len; i++ ) { - if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { - matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; - } else { - matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); - - // Return special upon seeing a positional matcher - if ( matcher[ expando ] ) { - - // Find the next relative operator (if any) for proper handling - j = ++i; - for ( ; j < len; j++ ) { - if ( Expr.relative[ tokens[ j ].type ] ) { - break; - } - } - return setMatcher( - i > 1 && elementMatcher( matchers ), - i > 1 && toSelector( - - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens - .slice( 0, i - 1 ) - .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) - ).replace( rtrim, "$1" ), - matcher, - i < j && matcherFromTokens( tokens.slice( i, j ) ), - j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), - j < len && toSelector( tokens ) - ); - } - matchers.push( matcher ); - } - } - - return elementMatcher( matchers ); -} - -function matcherFromGroupMatchers( elementMatchers, setMatchers ) { - var bySet = setMatchers.length > 0, - byElement = elementMatchers.length > 0, - superMatcher = function( seed, context, xml, results, outermost ) { - var elem, j, matcher, - matchedCount = 0, - i = "0", - unmatched = seed && [], - setMatched = [], - contextBackup = outermostContext, - - // We must always have either seed elements or outermost context - elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ), - - // Use integer dirruns iff this is the outermost matcher - dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), - len = elems.length; - - if ( outermost ) { - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - outermostContext = context == document || context || outermost; - } - - // Add elements passing elementMatchers directly to results - // Support: IE<9, Safari - // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id - for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { - if ( byElement && elem ) { - j = 0; - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( !context && elem.ownerDocument != document ) { - setDocument( elem ); - xml = !documentIsHTML; - } - while ( ( matcher = elementMatchers[ j++ ] ) ) { - if ( matcher( elem, context || document, xml ) ) { - results.push( elem ); - break; - } - } - if ( outermost ) { - dirruns = dirrunsUnique; - } - } - - // Track unmatched elements for set filters - if ( bySet ) { - - // They will have gone through all possible matchers - if ( ( elem = !matcher && elem ) ) { - matchedCount--; - } - - // Lengthen the array for every element, matched or not - if ( seed ) { - unmatched.push( elem ); - } - } - } - - // `i` is now the count of elements visited above, and adding it to `matchedCount` - // makes the latter nonnegative. - matchedCount += i; - - // Apply set filters to unmatched elements - // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` - // equals `i`), unless we didn't visit _any_ elements in the above loop because we have - // no element matchers and no seed. - // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that - // case, which will result in a "00" `matchedCount` that differs from `i` but is also - // numerically zero. - if ( bySet && i !== matchedCount ) { - j = 0; - while ( ( matcher = setMatchers[ j++ ] ) ) { - matcher( unmatched, setMatched, context, xml ); - } - - if ( seed ) { - - // Reintegrate element matches to eliminate the need for sorting - if ( matchedCount > 0 ) { - while ( i-- ) { - if ( !( unmatched[ i ] || setMatched[ i ] ) ) { - setMatched[ i ] = pop.call( results ); - } - } - } - - // Discard index placeholder values to get only actual matches - setMatched = condense( setMatched ); - } - - // Add matches to results - push.apply( results, setMatched ); - - // Seedless set matches succeeding multiple successful matchers stipulate sorting - if ( outermost && !seed && setMatched.length > 0 && - ( matchedCount + setMatchers.length ) > 1 ) { - - Sizzle.uniqueSort( results ); - } - } - - // Override manipulation of globals by nested matchers - if ( outermost ) { - dirruns = dirrunsUnique; - outermostContext = contextBackup; - } - - return unmatched; - }; - - return bySet ? - markFunction( superMatcher ) : - superMatcher; -} - -compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { - var i, - setMatchers = [], - elementMatchers = [], - cached = compilerCache[ selector + " " ]; - - if ( !cached ) { - - // Generate a function of recursive functions that can be used to check each element - if ( !match ) { - match = tokenize( selector ); - } - i = match.length; - while ( i-- ) { - cached = matcherFromTokens( match[ i ] ); - if ( cached[ expando ] ) { - setMatchers.push( cached ); - } else { - elementMatchers.push( cached ); - } - } - - // Cache the compiled function - cached = compilerCache( - selector, - matcherFromGroupMatchers( elementMatchers, setMatchers ) - ); - - // Save selector and tokenization - cached.selector = selector; - } - return cached; -}; - -/** - * A low-level selection function that works with Sizzle's compiled - * selector functions - * @param {String|Function} selector A selector or a pre-compiled - * selector function built with Sizzle.compile - * @param {Element} context - * @param {Array} [results] - * @param {Array} [seed] A set of elements to match against - */ -select = Sizzle.select = function( selector, context, results, seed ) { - var i, tokens, token, type, find, - compiled = typeof selector === "function" && selector, - match = !seed && tokenize( ( selector = compiled.selector || selector ) ); - - results = results || []; - - // Try to minimize operations if there is only one selector in the list and no seed - // (the latter of which guarantees us context) - if ( match.length === 1 ) { - - // Reduce context if the leading compound selector is an ID - tokens = match[ 0 ] = match[ 0 ].slice( 0 ); - if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && - context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { - - context = ( Expr.find[ "ID" ]( token.matches[ 0 ] - .replace( runescape, funescape ), context ) || [] )[ 0 ]; - if ( !context ) { - return results; - - // Precompiled matchers will still verify ancestry, so step up a level - } else if ( compiled ) { - context = context.parentNode; - } - - selector = selector.slice( tokens.shift().value.length ); - } - - // Fetch a seed set for right-to-left matching - i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length; - while ( i-- ) { - token = tokens[ i ]; - - // Abort if we hit a combinator - if ( Expr.relative[ ( type = token.type ) ] ) { - break; - } - if ( ( find = Expr.find[ type ] ) ) { - - // Search, expanding context for leading sibling combinators - if ( ( seed = find( - token.matches[ 0 ].replace( runescape, funescape ), - rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) || - context - ) ) ) { - - // If seed is empty or no tokens remain, we can return early - tokens.splice( i, 1 ); - selector = seed.length && toSelector( tokens ); - if ( !selector ) { - push.apply( results, seed ); - return results; - } - - break; - } - } - } - } - - // Compile and execute a filtering function if one is not provided - // Provide `match` to avoid retokenization if we modified the selector above - ( compiled || compile( selector, match ) )( - seed, - context, - !documentIsHTML, - results, - !context || rsibling.test( selector ) && testContext( context.parentNode ) || context - ); - return results; -}; - -// One-time assignments - -// Sort stability -support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; - -// Support: Chrome 14-35+ -// Always assume duplicates if they aren't passed to the comparison function -support.detectDuplicates = !!hasDuplicate; - -// Initialize against the default document -setDocument(); - -// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) -// Detached nodes confoundingly follow *each other* -support.sortDetached = assert( function( el ) { - - // Should return 1, but returns 4 (following) - return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; -} ); - -// Support: IE<8 -// Prevent attribute/property "interpolation" -// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx -if ( !assert( function( el ) { - el.innerHTML = ""; - return el.firstChild.getAttribute( "href" ) === "#"; -} ) ) { - addHandle( "type|href|height|width", function( elem, name, isXML ) { - if ( !isXML ) { - return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); - } - } ); -} - -// Support: IE<9 -// Use defaultValue in place of getAttribute("value") -if ( !support.attributes || !assert( function( el ) { - el.innerHTML = ""; - el.firstChild.setAttribute( "value", "" ); - return el.firstChild.getAttribute( "value" ) === ""; -} ) ) { - addHandle( "value", function( elem, _name, isXML ) { - if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { - return elem.defaultValue; - } - } ); -} - -// Support: IE<9 -// Use getAttributeNode to fetch booleans when getAttribute lies -if ( !assert( function( el ) { - return el.getAttribute( "disabled" ) == null; -} ) ) { - addHandle( booleans, function( elem, name, isXML ) { - var val; - if ( !isXML ) { - return elem[ name ] === true ? name.toLowerCase() : - ( val = elem.getAttributeNode( name ) ) && val.specified ? - val.value : - null; - } - } ); -} - -return Sizzle; - -} )( window ); - - - -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; - -// Deprecated -jQuery.expr[ ":" ] = jQuery.expr.pseudos; -jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; -jQuery.escapeSelector = Sizzle.escape; - - - - -var dir = function( elem, dir, until ) { - var matched = [], - truncate = until !== undefined; - - while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { - if ( elem.nodeType === 1 ) { - if ( truncate && jQuery( elem ).is( until ) ) { - break; - } - matched.push( elem ); - } - } - return matched; -}; - - -var siblings = function( n, elem ) { - var matched = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - matched.push( n ); - } - } - - return matched; -}; - - -var rneedsContext = jQuery.expr.match.needsContext; - - - -function nodeName( elem, name ) { - - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - -}; -var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); - - - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, not ) { - if ( isFunction( qualifier ) ) { - return jQuery.grep( elements, function( elem, i ) { - return !!qualifier.call( elem, i, elem ) !== not; - } ); - } - - // Single element - if ( qualifier.nodeType ) { - return jQuery.grep( elements, function( elem ) { - return ( elem === qualifier ) !== not; - } ); - } - - // Arraylike of elements (jQuery, arguments, Array) - if ( typeof qualifier !== "string" ) { - return jQuery.grep( elements, function( elem ) { - return ( indexOf.call( qualifier, elem ) > -1 ) !== not; - } ); - } - - // Filtered directly for both simple and complex selectors - return jQuery.filter( qualifier, elements, not ); -} - -jQuery.filter = function( expr, elems, not ) { - var elem = elems[ 0 ]; - - if ( not ) { - expr = ":not(" + expr + ")"; - } - - if ( elems.length === 1 && elem.nodeType === 1 ) { - return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; - } - - return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { - return elem.nodeType === 1; - } ) ); -}; - -jQuery.fn.extend( { - find: function( selector ) { - var i, ret, - len = this.length, - self = this; - - if ( typeof selector !== "string" ) { - return this.pushStack( jQuery( selector ).filter( function() { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - } ) ); - } - - ret = this.pushStack( [] ); - - for ( i = 0; i < len; i++ ) { - jQuery.find( selector, self[ i ], ret ); - } - - return len > 1 ? jQuery.uniqueSort( ret ) : ret; - }, - filter: function( selector ) { - return this.pushStack( winnow( this, selector || [], false ) ); - }, - not: function( selector ) { - return this.pushStack( winnow( this, selector || [], true ) ); - }, - is: function( selector ) { - return !!winnow( - this, - - // If this is a positional/relative selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - typeof selector === "string" && rneedsContext.test( selector ) ? - jQuery( selector ) : - selector || [], - false - ).length; - } -} ); - - -// Initialize a jQuery object - - -// A central reference to the root jQuery(document) -var rootjQuery, - - // A simple way to check for HTML strings - // Prioritize #id over to avoid XSS via location.hash (#9521) - // Strict HTML recognition (#11290: must start with <) - // Shortcut simple #id case for speed - rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, - - init = jQuery.fn.init = function( selector, context, root ) { - var match, elem; - - // HANDLE: $(""), $(null), $(undefined), $(false) - if ( !selector ) { - return this; - } - - // Method init() accepts an alternate rootjQuery - // so migrate can support jQuery.sub (gh-2101) - root = root || rootjQuery; - - // Handle HTML strings - if ( typeof selector === "string" ) { - if ( selector[ 0 ] === "<" && - selector[ selector.length - 1 ] === ">" && - selector.length >= 3 ) { - - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = rquickExpr.exec( selector ); - } - - // Match html or make sure no context is specified for #id - if ( match && ( match[ 1 ] || !context ) ) { - - // HANDLE: $(html) -> $(array) - if ( match[ 1 ] ) { - context = context instanceof jQuery ? context[ 0 ] : context; - - // Option to run scripts is true for back-compat - // Intentionally let the error be thrown if parseHTML is not present - jQuery.merge( this, jQuery.parseHTML( - match[ 1 ], - context && context.nodeType ? context.ownerDocument || context : document, - true - ) ); - - // HANDLE: $(html, props) - if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { - for ( match in context ) { - - // Properties of context are called as methods if possible - if ( isFunction( this[ match ] ) ) { - this[ match ]( context[ match ] ); - - // ...and otherwise set as attributes - } else { - this.attr( match, context[ match ] ); - } - } - } - - return this; - - // HANDLE: $(#id) - } else { - elem = document.getElementById( match[ 2 ] ); - - if ( elem ) { - - // Inject the element directly into the jQuery object - this[ 0 ] = elem; - this.length = 1; - } - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return ( context || root ).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(DOMElement) - } else if ( selector.nodeType ) { - this[ 0 ] = selector; - this.length = 1; - return this; - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( isFunction( selector ) ) { - return root.ready !== undefined ? - root.ready( selector ) : - - // Execute immediately if ready is not present - selector( jQuery ); - } - - return jQuery.makeArray( selector, this ); - }; - -// Give the init function the jQuery prototype for later instantiation -init.prototype = jQuery.fn; - -// Initialize central reference -rootjQuery = jQuery( document ); - - -var rparentsprev = /^(?:parents|prev(?:Until|All))/, - - // Methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - -jQuery.fn.extend( { - has: function( target ) { - var targets = jQuery( target, this ), - l = targets.length; - - return this.filter( function() { - var i = 0; - for ( ; i < l; i++ ) { - if ( jQuery.contains( this, targets[ i ] ) ) { - return true; - } - } - } ); - }, - - closest: function( selectors, context ) { - var cur, - i = 0, - l = this.length, - matched = [], - targets = typeof selectors !== "string" && jQuery( selectors ); - - // Positional selectors never match, since there's no _selection_ context - if ( !rneedsContext.test( selectors ) ) { - for ( ; i < l; i++ ) { - for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { - - // Always skip document fragments - if ( cur.nodeType < 11 && ( targets ? - targets.index( cur ) > -1 : - - // Don't pass non-elements to Sizzle - cur.nodeType === 1 && - jQuery.find.matchesSelector( cur, selectors ) ) ) { - - matched.push( cur ); - break; - } - } - } - } - - return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); - }, - - // Determine the position of an element within the set - index: function( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; - } - - // Index in selector - if ( typeof elem === "string" ) { - return indexOf.call( jQuery( elem ), this[ 0 ] ); - } - - // Locate the position of the desired element - return indexOf.call( this, - - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[ 0 ] : elem - ); - }, - - add: function( selector, context ) { - return this.pushStack( - jQuery.uniqueSort( - jQuery.merge( this.get(), jQuery( selector, context ) ) - ) - ); - }, - - addBack: function( selector ) { - return this.add( selector == null ? - this.prevObject : this.prevObject.filter( selector ) - ); - } -} ); - -function sibling( cur, dir ) { - while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} - return cur; -} - -jQuery.each( { - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, _i, until ) { - return dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return sibling( elem, "nextSibling" ); - }, - prev: function( elem ) { - return sibling( elem, "previousSibling" ); - }, - nextAll: function( elem ) { - return dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, _i, until ) { - return dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, _i, until ) { - return dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return siblings( ( elem.parentNode || {} ).firstChild, elem ); - }, - children: function( elem ) { - return siblings( elem.firstChild ); - }, - contents: function( elem ) { - if ( elem.contentDocument != null && - - // Support: IE 11+ - // elements with no `data` attribute has an object - // `contentDocument` with a `null` prototype. - getProto( elem.contentDocument ) ) { - - return elem.contentDocument; - } - - // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only - // Treat the template element as a regular one in browsers that - // don't support it. - if ( nodeName( elem, "template" ) ) { - elem = elem.content || elem; - } - - return jQuery.merge( [], elem.childNodes ); - } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var matched = jQuery.map( this, fn, until ); - - if ( name.slice( -5 ) !== "Until" ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - matched = jQuery.filter( selector, matched ); - } - - if ( this.length > 1 ) { - - // Remove duplicates - if ( !guaranteedUnique[ name ] ) { - jQuery.uniqueSort( matched ); - } - - // Reverse order for parents* and prev-derivatives - if ( rparentsprev.test( name ) ) { - matched.reverse(); - } - } - - return this.pushStack( matched ); - }; -} ); -var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); - - - -// Convert String-formatted options into Object-formatted ones -function createOptions( options ) { - var object = {}; - jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { - object[ flag ] = true; - } ); - return object; -} - -/* - * Create a callback list using the following parameters: - * - * options: an optional list of space-separated options that will change how - * the callback list behaves or a more traditional option object - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible options: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ -jQuery.Callbacks = function( options ) { - - // Convert options from String-formatted to Object-formatted if needed - // (we check in cache first) - options = typeof options === "string" ? - createOptions( options ) : - jQuery.extend( {}, options ); - - var // Flag to know if list is currently firing - firing, - - // Last fire value for non-forgettable lists - memory, - - // Flag to know if list was already fired - fired, - - // Flag to prevent firing - locked, - - // Actual callback list - list = [], - - // Queue of execution data for repeatable lists - queue = [], - - // Index of currently firing callback (modified by add/remove as needed) - firingIndex = -1, - - // Fire callbacks - fire = function() { - - // Enforce single-firing - locked = locked || options.once; - - // Execute callbacks for all pending executions, - // respecting firingIndex overrides and runtime changes - fired = firing = true; - for ( ; queue.length; firingIndex = -1 ) { - memory = queue.shift(); - while ( ++firingIndex < list.length ) { - - // Run callback and check for early termination - if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && - options.stopOnFalse ) { - - // Jump to end and forget the data so .add doesn't re-fire - firingIndex = list.length; - memory = false; - } - } - } - - // Forget the data if we're done with it - if ( !options.memory ) { - memory = false; - } - - firing = false; - - // Clean up if we're done firing for good - if ( locked ) { - - // Keep an empty list if we have data for future add calls - if ( memory ) { - list = []; - - // Otherwise, this object is spent - } else { - list = ""; - } - } - }, - - // Actual Callbacks object - self = { - - // Add a callback or a collection of callbacks to the list - add: function() { - if ( list ) { - - // If we have memory from a past run, we should fire after adding - if ( memory && !firing ) { - firingIndex = list.length - 1; - queue.push( memory ); - } - - ( function add( args ) { - jQuery.each( args, function( _, arg ) { - if ( isFunction( arg ) ) { - if ( !options.unique || !self.has( arg ) ) { - list.push( arg ); - } - } else if ( arg && arg.length && toType( arg ) !== "string" ) { - - // Inspect recursively - add( arg ); - } - } ); - } )( arguments ); - - if ( memory && !firing ) { - fire(); - } - } - return this; - }, - - // Remove a callback from the list - remove: function() { - jQuery.each( arguments, function( _, arg ) { - var index; - while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { - list.splice( index, 1 ); - - // Handle firing indexes - if ( index <= firingIndex ) { - firingIndex--; - } - } - } ); - return this; - }, - - // Check if a given callback is in the list. - // If no argument is given, return whether or not list has callbacks attached. - has: function( fn ) { - return fn ? - jQuery.inArray( fn, list ) > -1 : - list.length > 0; - }, - - // Remove all callbacks from the list - empty: function() { - if ( list ) { - list = []; - } - return this; - }, - - // Disable .fire and .add - // Abort any current/pending executions - // Clear all callbacks and values - disable: function() { - locked = queue = []; - list = memory = ""; - return this; - }, - disabled: function() { - return !list; - }, - - // Disable .fire - // Also disable .add unless we have memory (since it would have no effect) - // Abort any pending executions - lock: function() { - locked = queue = []; - if ( !memory && !firing ) { - list = memory = ""; - } - return this; - }, - locked: function() { - return !!locked; - }, - - // Call all callbacks with the given context and arguments - fireWith: function( context, args ) { - if ( !locked ) { - args = args || []; - args = [ context, args.slice ? args.slice() : args ]; - queue.push( args ); - if ( !firing ) { - fire(); - } - } - return this; - }, - - // Call all the callbacks with the given arguments - fire: function() { - self.fireWith( this, arguments ); - return this; - }, - - // To know if the callbacks have already been called at least once - fired: function() { - return !!fired; - } - }; - - return self; -}; - - -function Identity( v ) { - return v; -} -function Thrower( ex ) { - throw ex; -} - -function adoptValue( value, resolve, reject, noValue ) { - var method; - - try { - - // Check for promise aspect first to privilege synchronous behavior - if ( value && isFunction( ( method = value.promise ) ) ) { - method.call( value ).done( resolve ).fail( reject ); - - // Other thenables - } else if ( value && isFunction( ( method = value.then ) ) ) { - method.call( value, resolve, reject ); - - // Other non-thenables - } else { - - // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: - // * false: [ value ].slice( 0 ) => resolve( value ) - // * true: [ value ].slice( 1 ) => resolve() - resolve.apply( undefined, [ value ].slice( noValue ) ); - } - - // For Promises/A+, convert exceptions into rejections - // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in - // Deferred#then to conditionally suppress rejection. - } catch ( value ) { - - // Support: Android 4.0 only - // Strict mode functions invoked without .call/.apply get global-object context - reject.apply( undefined, [ value ] ); - } -} - -jQuery.extend( { - - Deferred: function( func ) { - var tuples = [ - - // action, add listener, callbacks, - // ... .then handlers, argument index, [final state] - [ "notify", "progress", jQuery.Callbacks( "memory" ), - jQuery.Callbacks( "memory" ), 2 ], - [ "resolve", "done", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 0, "resolved" ], - [ "reject", "fail", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 1, "rejected" ] - ], - state = "pending", - promise = { - state: function() { - return state; - }, - always: function() { - deferred.done( arguments ).fail( arguments ); - return this; - }, - "catch": function( fn ) { - return promise.then( null, fn ); - }, - - // Keep pipe for back-compat - pipe: function( /* fnDone, fnFail, fnProgress */ ) { - var fns = arguments; - - return jQuery.Deferred( function( newDefer ) { - jQuery.each( tuples, function( _i, tuple ) { - - // Map tuples (progress, done, fail) to arguments (done, fail, progress) - var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; - - // deferred.progress(function() { bind to newDefer or newDefer.notify }) - // deferred.done(function() { bind to newDefer or newDefer.resolve }) - // deferred.fail(function() { bind to newDefer or newDefer.reject }) - deferred[ tuple[ 1 ] ]( function() { - var returned = fn && fn.apply( this, arguments ); - if ( returned && isFunction( returned.promise ) ) { - returned.promise() - .progress( newDefer.notify ) - .done( newDefer.resolve ) - .fail( newDefer.reject ); - } else { - newDefer[ tuple[ 0 ] + "With" ]( - this, - fn ? [ returned ] : arguments - ); - } - } ); - } ); - fns = null; - } ).promise(); - }, - then: function( onFulfilled, onRejected, onProgress ) { - var maxDepth = 0; - function resolve( depth, deferred, handler, special ) { - return function() { - var that = this, - args = arguments, - mightThrow = function() { - var returned, then; - - // Support: Promises/A+ section 2.3.3.3.3 - // https://promisesaplus.com/#point-59 - // Ignore double-resolution attempts - if ( depth < maxDepth ) { - return; - } - - returned = handler.apply( that, args ); - - // Support: Promises/A+ section 2.3.1 - // https://promisesaplus.com/#point-48 - if ( returned === deferred.promise() ) { - throw new TypeError( "Thenable self-resolution" ); - } - - // Support: Promises/A+ sections 2.3.3.1, 3.5 - // https://promisesaplus.com/#point-54 - // https://promisesaplus.com/#point-75 - // Retrieve `then` only once - then = returned && - - // Support: Promises/A+ section 2.3.4 - // https://promisesaplus.com/#point-64 - // Only check objects and functions for thenability - ( typeof returned === "object" || - typeof returned === "function" ) && - returned.then; - - // Handle a returned thenable - if ( isFunction( then ) ) { - - // Special processors (notify) just wait for resolution - if ( special ) { - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ) - ); - - // Normal processors (resolve) also hook into progress - } else { - - // ...and disregard older resolution values - maxDepth++; - - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ), - resolve( maxDepth, deferred, Identity, - deferred.notifyWith ) - ); - } - - // Handle all other returned values - } else { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Identity ) { - that = undefined; - args = [ returned ]; - } - - // Process the value(s) - // Default process is resolve - ( special || deferred.resolveWith )( that, args ); - } - }, - - // Only normal processors (resolve) catch and reject exceptions - process = special ? - mightThrow : - function() { - try { - mightThrow(); - } catch ( e ) { - - if ( jQuery.Deferred.exceptionHook ) { - jQuery.Deferred.exceptionHook( e, - process.stackTrace ); - } - - // Support: Promises/A+ section 2.3.3.3.4.1 - // https://promisesaplus.com/#point-61 - // Ignore post-resolution exceptions - if ( depth + 1 >= maxDepth ) { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Thrower ) { - that = undefined; - args = [ e ]; - } - - deferred.rejectWith( that, args ); - } - } - }; - - // Support: Promises/A+ section 2.3.3.3.1 - // https://promisesaplus.com/#point-57 - // Re-resolve promises immediately to dodge false rejection from - // subsequent errors - if ( depth ) { - process(); - } else { - - // Call an optional hook to record the stack, in case of exception - // since it's otherwise lost when execution goes async - if ( jQuery.Deferred.getStackHook ) { - process.stackTrace = jQuery.Deferred.getStackHook(); - } - window.setTimeout( process ); - } - }; - } - - return jQuery.Deferred( function( newDefer ) { - - // progress_handlers.add( ... ) - tuples[ 0 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onProgress ) ? - onProgress : - Identity, - newDefer.notifyWith - ) - ); - - // fulfilled_handlers.add( ... ) - tuples[ 1 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onFulfilled ) ? - onFulfilled : - Identity - ) - ); - - // rejected_handlers.add( ... ) - tuples[ 2 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onRejected ) ? - onRejected : - Thrower - ) - ); - } ).promise(); - }, - - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - return obj != null ? jQuery.extend( obj, promise ) : promise; - } - }, - deferred = {}; - - // Add list-specific methods - jQuery.each( tuples, function( i, tuple ) { - var list = tuple[ 2 ], - stateString = tuple[ 5 ]; - - // promise.progress = list.add - // promise.done = list.add - // promise.fail = list.add - promise[ tuple[ 1 ] ] = list.add; - - // Handle state - if ( stateString ) { - list.add( - function() { - - // state = "resolved" (i.e., fulfilled) - // state = "rejected" - state = stateString; - }, - - // rejected_callbacks.disable - // fulfilled_callbacks.disable - tuples[ 3 - i ][ 2 ].disable, - - // rejected_handlers.disable - // fulfilled_handlers.disable - tuples[ 3 - i ][ 3 ].disable, - - // progress_callbacks.lock - tuples[ 0 ][ 2 ].lock, - - // progress_handlers.lock - tuples[ 0 ][ 3 ].lock - ); - } - - // progress_handlers.fire - // fulfilled_handlers.fire - // rejected_handlers.fire - list.add( tuple[ 3 ].fire ); - - // deferred.notify = function() { deferred.notifyWith(...) } - // deferred.resolve = function() { deferred.resolveWith(...) } - // deferred.reject = function() { deferred.rejectWith(...) } - deferred[ tuple[ 0 ] ] = function() { - deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); - return this; - }; - - // deferred.notifyWith = list.fireWith - // deferred.resolveWith = list.fireWith - // deferred.rejectWith = list.fireWith - deferred[ tuple[ 0 ] + "With" ] = list.fireWith; - } ); - - // Make the deferred a promise - promise.promise( deferred ); - - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function( singleValue ) { - var - - // count of uncompleted subordinates - remaining = arguments.length, - - // count of unprocessed arguments - i = remaining, - - // subordinate fulfillment data - resolveContexts = Array( i ), - resolveValues = slice.call( arguments ), - - // the master Deferred - master = jQuery.Deferred(), - - // subordinate callback factory - updateFunc = function( i ) { - return function( value ) { - resolveContexts[ i ] = this; - resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; - if ( !( --remaining ) ) { - master.resolveWith( resolveContexts, resolveValues ); - } - }; - }; - - // Single- and empty arguments are adopted like Promise.resolve - if ( remaining <= 1 ) { - adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, - !remaining ); - - // Use .then() to unwrap secondary thenables (cf. gh-3000) - if ( master.state() === "pending" || - isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { - - return master.then(); - } - } - - // Multiple arguments are aggregated like Promise.all array elements - while ( i-- ) { - adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); - } - - return master.promise(); - } -} ); - - -// These usually indicate a programmer mistake during development, -// warn about them ASAP rather than swallowing them by default. -var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; - -jQuery.Deferred.exceptionHook = function( error, stack ) { - - // Support: IE 8 - 9 only - // Console exists when dev tools are open, which can happen at any time - if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { - window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); - } -}; - - - - -jQuery.readyException = function( error ) { - window.setTimeout( function() { - throw error; - } ); -}; - - - - -// The deferred used on DOM ready -var readyList = jQuery.Deferred(); - -jQuery.fn.ready = function( fn ) { - - readyList - .then( fn ) - - // Wrap jQuery.readyException in a function so that the lookup - // happens at the time of error handling instead of callback - // registration. - .catch( function( error ) { - jQuery.readyException( error ); - } ); - - return this; -}; - -jQuery.extend( { - - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Handle when the DOM is ready - ready: function( wait ) { - - // Abort if there are pending holds or we're already ready - if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { - return; - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith( document, [ jQuery ] ); - } -} ); - -jQuery.ready.then = readyList.then; - -// The ready event handler and self cleanup method -function completed() { - document.removeEventListener( "DOMContentLoaded", completed ); - window.removeEventListener( "load", completed ); - jQuery.ready(); -} - -// Catch cases where $(document).ready() is called -// after the browser event has already occurred. -// Support: IE <=9 - 10 only -// Older IE sometimes signals "interactive" too soon -if ( document.readyState === "complete" || - ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { - - // Handle it asynchronously to allow scripts the opportunity to delay ready - window.setTimeout( jQuery.ready ); - -} else { - - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", completed ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", completed ); -} - - - - -// Multifunctional method to get and set values of a collection -// The value/s can optionally be executed if it's a function -var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { - var i = 0, - len = elems.length, - bulk = key == null; - - // Sets many values - if ( toType( key ) === "object" ) { - chainable = true; - for ( i in key ) { - access( elems, fn, i, key[ i ], true, emptyGet, raw ); - } - - // Sets one value - } else if ( value !== undefined ) { - chainable = true; - - if ( !isFunction( value ) ) { - raw = true; - } - - if ( bulk ) { - - // Bulk operations run against the entire set - if ( raw ) { - fn.call( elems, value ); - fn = null; - - // ...except when executing function values - } else { - bulk = fn; - fn = function( elem, _key, value ) { - return bulk.call( jQuery( elem ), value ); - }; - } - } - - if ( fn ) { - for ( ; i < len; i++ ) { - fn( - elems[ i ], key, raw ? - value : - value.call( elems[ i ], i, fn( elems[ i ], key ) ) - ); - } - } - } - - if ( chainable ) { - return elems; - } - - // Gets - if ( bulk ) { - return fn.call( elems ); - } - - return len ? fn( elems[ 0 ], key ) : emptyGet; -}; - - -// Matches dashed string for camelizing -var rmsPrefix = /^-ms-/, - rdashAlpha = /-([a-z])/g; - -// Used by camelCase as callback to replace() -function fcamelCase( _all, letter ) { - return letter.toUpperCase(); -} - -// Convert dashed to camelCase; used by the css and data modules -// Support: IE <=9 - 11, Edge 12 - 15 -// Microsoft forgot to hump their vendor prefix (#9572) -function camelCase( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); -} -var acceptData = function( owner ) { - - // Accepts only: - // - Node - // - Node.ELEMENT_NODE - // - Node.DOCUMENT_NODE - // - Object - // - Any - return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); -}; - - - - -function Data() { - this.expando = jQuery.expando + Data.uid++; -} - -Data.uid = 1; - -Data.prototype = { - - cache: function( owner ) { - - // Check if the owner object already has a cache - var value = owner[ this.expando ]; - - // If not, create one - if ( !value ) { - value = {}; - - // We can accept data for non-element nodes in modern browsers, - // but we should not, see #8335. - // Always return an empty object. - if ( acceptData( owner ) ) { - - // If it is a node unlikely to be stringify-ed or looped over - // use plain assignment - if ( owner.nodeType ) { - owner[ this.expando ] = value; - - // Otherwise secure it in a non-enumerable property - // configurable must be true to allow the property to be - // deleted when data is removed - } else { - Object.defineProperty( owner, this.expando, { - value: value, - configurable: true - } ); - } - } - } - - return value; - }, - set: function( owner, data, value ) { - var prop, - cache = this.cache( owner ); - - // Handle: [ owner, key, value ] args - // Always use camelCase key (gh-2257) - if ( typeof data === "string" ) { - cache[ camelCase( data ) ] = value; - - // Handle: [ owner, { properties } ] args - } else { - - // Copy the properties one-by-one to the cache object - for ( prop in data ) { - cache[ camelCase( prop ) ] = data[ prop ]; - } - } - return cache; - }, - get: function( owner, key ) { - return key === undefined ? - this.cache( owner ) : - - // Always use camelCase key (gh-2257) - owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; - }, - access: function( owner, key, value ) { - - // In cases where either: - // - // 1. No key was specified - // 2. A string key was specified, but no value provided - // - // Take the "read" path and allow the get method to determine - // which value to return, respectively either: - // - // 1. The entire cache object - // 2. The data stored at the key - // - if ( key === undefined || - ( ( key && typeof key === "string" ) && value === undefined ) ) { - - return this.get( owner, key ); - } - - // When the key is not a string, or both a key and value - // are specified, set or extend (existing objects) with either: - // - // 1. An object of properties - // 2. A key and value - // - this.set( owner, key, value ); - - // Since the "set" path can have two possible entry points - // return the expected data based on which path was taken[*] - return value !== undefined ? value : key; - }, - remove: function( owner, key ) { - var i, - cache = owner[ this.expando ]; - - if ( cache === undefined ) { - return; - } - - if ( key !== undefined ) { - - // Support array or space separated string of keys - if ( Array.isArray( key ) ) { - - // If key is an array of keys... - // We always set camelCase keys, so remove that. - key = key.map( camelCase ); - } else { - key = camelCase( key ); - - // If a key with the spaces exists, use it. - // Otherwise, create an array by matching non-whitespace - key = key in cache ? - [ key ] : - ( key.match( rnothtmlwhite ) || [] ); - } - - i = key.length; - - while ( i-- ) { - delete cache[ key[ i ] ]; - } - } - - // Remove the expando if there's no more data - if ( key === undefined || jQuery.isEmptyObject( cache ) ) { - - // Support: Chrome <=35 - 45 - // Webkit & Blink performance suffers when deleting properties - // from DOM nodes, so set to undefined instead - // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) - if ( owner.nodeType ) { - owner[ this.expando ] = undefined; - } else { - delete owner[ this.expando ]; - } - } - }, - hasData: function( owner ) { - var cache = owner[ this.expando ]; - return cache !== undefined && !jQuery.isEmptyObject( cache ); - } -}; -var dataPriv = new Data(); - -var dataUser = new Data(); - - - -// Implementation Summary -// -// 1. Enforce API surface and semantic compatibility with 1.9.x branch -// 2. Improve the module's maintainability by reducing the storage -// paths to a single mechanism. -// 3. Use the same single mechanism to support "private" and "user" data. -// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) -// 5. Avoid exposing implementation details on user objects (eg. expando properties) -// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 - -var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, - rmultiDash = /[A-Z]/g; - -function getData( data ) { - if ( data === "true" ) { - return true; - } - - if ( data === "false" ) { - return false; - } - - if ( data === "null" ) { - return null; - } - - // Only convert to a number if it doesn't change the string - if ( data === +data + "" ) { - return +data; - } - - if ( rbrace.test( data ) ) { - return JSON.parse( data ); - } - - return data; -} - -function dataAttr( elem, key, data ) { - var name; - - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = getData( data ); - } catch ( e ) {} - - // Make sure we set the data so it isn't changed later - dataUser.set( elem, key, data ); - } else { - data = undefined; - } - } - return data; -} - -jQuery.extend( { - hasData: function( elem ) { - return dataUser.hasData( elem ) || dataPriv.hasData( elem ); - }, - - data: function( elem, name, data ) { - return dataUser.access( elem, name, data ); - }, - - removeData: function( elem, name ) { - dataUser.remove( elem, name ); - }, - - // TODO: Now that all calls to _data and _removeData have been replaced - // with direct calls to dataPriv methods, these can be deprecated. - _data: function( elem, name, data ) { - return dataPriv.access( elem, name, data ); - }, - - _removeData: function( elem, name ) { - dataPriv.remove( elem, name ); - } -} ); - -jQuery.fn.extend( { - data: function( key, value ) { - var i, name, data, - elem = this[ 0 ], - attrs = elem && elem.attributes; - - // Gets all values - if ( key === undefined ) { - if ( this.length ) { - data = dataUser.get( elem ); - - if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { - i = attrs.length; - while ( i-- ) { - - // Support: IE 11 only - // The attrs elements can be null (#14894) - if ( attrs[ i ] ) { - name = attrs[ i ].name; - if ( name.indexOf( "data-" ) === 0 ) { - name = camelCase( name.slice( 5 ) ); - dataAttr( elem, name, data[ name ] ); - } - } - } - dataPriv.set( elem, "hasDataAttrs", true ); - } - } - - return data; - } - - // Sets multiple values - if ( typeof key === "object" ) { - return this.each( function() { - dataUser.set( this, key ); - } ); - } - - return access( this, function( value ) { - var data; - - // The calling jQuery object (element matches) is not empty - // (and therefore has an element appears at this[ 0 ]) and the - // `value` parameter was not undefined. An empty jQuery object - // will result in `undefined` for elem = this[ 0 ] which will - // throw an exception if an attempt to read a data cache is made. - if ( elem && value === undefined ) { - - // Attempt to get data from the cache - // The key will always be camelCased in Data - data = dataUser.get( elem, key ); - if ( data !== undefined ) { - return data; - } - - // Attempt to "discover" the data in - // HTML5 custom data-* attrs - data = dataAttr( elem, key ); - if ( data !== undefined ) { - return data; - } - - // We tried really hard, but the data doesn't exist. - return; - } - - // Set the data... - this.each( function() { - - // We always store the camelCased key - dataUser.set( this, key, value ); - } ); - }, null, value, arguments.length > 1, null, true ); - }, - - removeData: function( key ) { - return this.each( function() { - dataUser.remove( this, key ); - } ); - } -} ); - - -jQuery.extend( { - queue: function( elem, type, data ) { - var queue; - - if ( elem ) { - type = ( type || "fx" ) + "queue"; - queue = dataPriv.get( elem, type ); - - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !queue || Array.isArray( data ) ) { - queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); - } else { - queue.push( data ); - } - } - return queue || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - startLength = queue.length, - fn = queue.shift(), - hooks = jQuery._queueHooks( elem, type ), - next = function() { - jQuery.dequeue( elem, type ); - }; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - startLength--; - } - - if ( fn ) { - - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift( "inprogress" ); - } - - // Clear up the last queue stop function - delete hooks.stop; - fn.call( elem, next, hooks ); - } - - if ( !startLength && hooks ) { - hooks.empty.fire(); - } - }, - - // Not public - generate a queueHooks object, or return the current one - _queueHooks: function( elem, type ) { - var key = type + "queueHooks"; - return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { - empty: jQuery.Callbacks( "once memory" ).add( function() { - dataPriv.remove( elem, [ type + "queue", key ] ); - } ) - } ); - } -} ); - -jQuery.fn.extend( { - queue: function( type, data ) { - var setter = 2; - - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - setter--; - } - - if ( arguments.length < setter ) { - return jQuery.queue( this[ 0 ], type ); - } - - return data === undefined ? - this : - this.each( function() { - var queue = jQuery.queue( this, type, data ); - - // Ensure a hooks for this queue - jQuery._queueHooks( this, type ); - - if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - } ); - }, - dequeue: function( type ) { - return this.each( function() { - jQuery.dequeue( this, type ); - } ); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, obj ) { - var tmp, - count = 1, - defer = jQuery.Deferred(), - elements = this, - i = this.length, - resolve = function() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - }; - - if ( typeof type !== "string" ) { - obj = type; - type = undefined; - } - type = type || "fx"; - - while ( i-- ) { - tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); - if ( tmp && tmp.empty ) { - count++; - tmp.empty.add( resolve ); - } - } - resolve(); - return defer.promise( obj ); - } -} ); -var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; - -var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); - - -var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; - -var documentElement = document.documentElement; - - - - var isAttached = function( elem ) { - return jQuery.contains( elem.ownerDocument, elem ); - }, - composed = { composed: true }; - - // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only - // Check attachment across shadow DOM boundaries when possible (gh-3504) - // Support: iOS 10.0-10.2 only - // Early iOS 10 versions support `attachShadow` but not `getRootNode`, - // leading to errors. We need to check for `getRootNode`. - if ( documentElement.getRootNode ) { - isAttached = function( elem ) { - return jQuery.contains( elem.ownerDocument, elem ) || - elem.getRootNode( composed ) === elem.ownerDocument; - }; - } -var isHiddenWithinTree = function( elem, el ) { - - // isHiddenWithinTree might be called from jQuery#filter function; - // in that case, element will be second argument - elem = el || elem; - - // Inline style trumps all - return elem.style.display === "none" || - elem.style.display === "" && - - // Otherwise, check computed style - // Support: Firefox <=43 - 45 - // Disconnected elements can have computed display: none, so first confirm that elem is - // in the document. - isAttached( elem ) && - - jQuery.css( elem, "display" ) === "none"; - }; - - - -function adjustCSS( elem, prop, valueParts, tween ) { - var adjusted, scale, - maxIterations = 20, - currentValue = tween ? - function() { - return tween.cur(); - } : - function() { - return jQuery.css( elem, prop, "" ); - }, - initial = currentValue(), - unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), - - // Starting value computation is required for potential unit mismatches - initialInUnit = elem.nodeType && - ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && - rcssNum.exec( jQuery.css( elem, prop ) ); - - if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { - - // Support: Firefox <=54 - // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) - initial = initial / 2; - - // Trust units reported by jQuery.css - unit = unit || initialInUnit[ 3 ]; - - // Iteratively approximate from a nonzero starting point - initialInUnit = +initial || 1; - - while ( maxIterations-- ) { - - // Evaluate and update our best guess (doubling guesses that zero out). - // Finish if the scale equals or crosses 1 (making the old*new product non-positive). - jQuery.style( elem, prop, initialInUnit + unit ); - if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { - maxIterations = 0; - } - initialInUnit = initialInUnit / scale; - - } - - initialInUnit = initialInUnit * 2; - jQuery.style( elem, prop, initialInUnit + unit ); - - // Make sure we update the tween properties later on - valueParts = valueParts || []; - } - - if ( valueParts ) { - initialInUnit = +initialInUnit || +initial || 0; - - // Apply relative offset (+=/-=) if specified - adjusted = valueParts[ 1 ] ? - initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : - +valueParts[ 2 ]; - if ( tween ) { - tween.unit = unit; - tween.start = initialInUnit; - tween.end = adjusted; - } - } - return adjusted; -} - - -var defaultDisplayMap = {}; - -function getDefaultDisplay( elem ) { - var temp, - doc = elem.ownerDocument, - nodeName = elem.nodeName, - display = defaultDisplayMap[ nodeName ]; - - if ( display ) { - return display; - } - - temp = doc.body.appendChild( doc.createElement( nodeName ) ); - display = jQuery.css( temp, "display" ); - - temp.parentNode.removeChild( temp ); - - if ( display === "none" ) { - display = "block"; - } - defaultDisplayMap[ nodeName ] = display; - - return display; -} - -function showHide( elements, show ) { - var display, elem, - values = [], - index = 0, - length = elements.length; - - // Determine new display value for elements that need to change - for ( ; index < length; index++ ) { - elem = elements[ index ]; - if ( !elem.style ) { - continue; - } - - display = elem.style.display; - if ( show ) { - - // Since we force visibility upon cascade-hidden elements, an immediate (and slow) - // check is required in this first loop unless we have a nonempty display value (either - // inline or about-to-be-restored) - if ( display === "none" ) { - values[ index ] = dataPriv.get( elem, "display" ) || null; - if ( !values[ index ] ) { - elem.style.display = ""; - } - } - if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { - values[ index ] = getDefaultDisplay( elem ); - } - } else { - if ( display !== "none" ) { - values[ index ] = "none"; - - // Remember what we're overwriting - dataPriv.set( elem, "display", display ); - } - } - } - - // Set the display of the elements in a second loop to avoid constant reflow - for ( index = 0; index < length; index++ ) { - if ( values[ index ] != null ) { - elements[ index ].style.display = values[ index ]; - } - } - - return elements; -} - -jQuery.fn.extend( { - show: function() { - return showHide( this, true ); - }, - hide: function() { - return showHide( this ); - }, - toggle: function( state ) { - if ( typeof state === "boolean" ) { - return state ? this.show() : this.hide(); - } - - return this.each( function() { - if ( isHiddenWithinTree( this ) ) { - jQuery( this ).show(); - } else { - jQuery( this ).hide(); - } - } ); - } -} ); -var rcheckableType = ( /^(?:checkbox|radio)$/i ); - -var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); - -var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); - - - -( function() { - var fragment = document.createDocumentFragment(), - div = fragment.appendChild( document.createElement( "div" ) ), - input = document.createElement( "input" ); - - // Support: Android 4.0 - 4.3 only - // Check state lost if the name is set (#11217) - // Support: Windows Web Apps (WWA) - // `name` and `type` must use .setAttribute for WWA (#14901) - input.setAttribute( "type", "radio" ); - input.setAttribute( "checked", "checked" ); - input.setAttribute( "name", "t" ); - - div.appendChild( input ); - - // Support: Android <=4.1 only - // Older WebKit doesn't clone checked state correctly in fragments - support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Support: IE <=11 only - // Make sure textarea (and checkbox) defaultValue is properly cloned - div.innerHTML = ""; - support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; - - // Support: IE <=9 only - // IE <=9 replaces "; - support.option = !!div.lastChild; -} )(); - - -// We have to close these tags to support XHTML (#13200) -var wrapMap = { - - // XHTML parsers do not magically insert elements in the - // same way that tag soup parsers do. So we cannot shorten - // this by omitting or other required elements. - thead: [ 1, "", "
" ], - col: [ 2, "", "
" ], - tr: [ 2, "", "
" ], - td: [ 3, "", "
" ], - - _default: [ 0, "", "" ] -}; - -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - -// Support: IE <=9 only -if ( !support.option ) { - wrapMap.optgroup = wrapMap.option = [ 1, "" ]; -} - - -function getAll( context, tag ) { - - // Support: IE <=9 - 11 only - // Use typeof to avoid zero-argument method invocation on host objects (#15151) - var ret; - - if ( typeof context.getElementsByTagName !== "undefined" ) { - ret = context.getElementsByTagName( tag || "*" ); - - } else if ( typeof context.querySelectorAll !== "undefined" ) { - ret = context.querySelectorAll( tag || "*" ); - - } else { - ret = []; - } - - if ( tag === undefined || tag && nodeName( context, tag ) ) { - return jQuery.merge( [ context ], ret ); - } - - return ret; -} - - -// Mark scripts as having already been evaluated -function setGlobalEval( elems, refElements ) { - var i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - dataPriv.set( - elems[ i ], - "globalEval", - !refElements || dataPriv.get( refElements[ i ], "globalEval" ) - ); - } -} - - -var rhtml = /<|&#?\w+;/; - -function buildFragment( elems, context, scripts, selection, ignored ) { - var elem, tmp, tag, wrap, attached, j, - fragment = context.createDocumentFragment(), - nodes = [], - i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - elem = elems[ i ]; - - if ( elem || elem === 0 ) { - - // Add nodes directly - if ( toType( elem ) === "object" ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); - - // Convert non-html into a text node - } else if ( !rhtml.test( elem ) ) { - nodes.push( context.createTextNode( elem ) ); - - // Convert html into DOM nodes - } else { - tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); - - // Deserialize a standard representation - tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); - wrap = wrapMap[ tag ] || wrapMap._default; - tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; - - // Descend through wrappers to the right content - j = wrap[ 0 ]; - while ( j-- ) { - tmp = tmp.lastChild; - } - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, tmp.childNodes ); - - // Remember the top-level container - tmp = fragment.firstChild; - - // Ensure the created nodes are orphaned (#12392) - tmp.textContent = ""; - } - } - } - - // Remove wrapper from fragment - fragment.textContent = ""; - - i = 0; - while ( ( elem = nodes[ i++ ] ) ) { - - // Skip elements already in the context collection (trac-4087) - if ( selection && jQuery.inArray( elem, selection ) > -1 ) { - if ( ignored ) { - ignored.push( elem ); - } - continue; - } - - attached = isAttached( elem ); - - // Append to fragment - tmp = getAll( fragment.appendChild( elem ), "script" ); - - // Preserve script evaluation history - if ( attached ) { - setGlobalEval( tmp ); - } - - // Capture executables - if ( scripts ) { - j = 0; - while ( ( elem = tmp[ j++ ] ) ) { - if ( rscriptType.test( elem.type || "" ) ) { - scripts.push( elem ); - } - } - } - } - - return fragment; -} - - -var - rkeyEvent = /^key/, - rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, - rtypenamespace = /^([^.]*)(?:\.(.+)|)/; - -function returnTrue() { - return true; -} - -function returnFalse() { - return false; -} - -// Support: IE <=9 - 11+ -// focus() and blur() are asynchronous, except when they are no-op. -// So expect focus to be synchronous when the element is already active, -// and blur to be synchronous when the element is not already active. -// (focus and blur are always synchronous in other supported browsers, -// this just defines when we can count on it). -function expectSync( elem, type ) { - return ( elem === safeActiveElement() ) === ( type === "focus" ); -} - -// Support: IE <=9 only -// Accessing document.activeElement can throw unexpectedly -// https://bugs.jquery.com/ticket/13393 -function safeActiveElement() { - try { - return document.activeElement; - } catch ( err ) { } -} - -function on( elem, types, selector, data, fn, one ) { - var origFn, type; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { - - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for ( type in types ) { - on( elem, type, selector, data, types[ type ], one ); - } - return elem; - } - - if ( data == null && fn == null ) { - - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return elem; - } - - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return elem.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - } ); -} - -/* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ -jQuery.event = { - - global: {}, - - add: function( elem, types, handler, data, selector ) { - - var handleObjIn, eventHandle, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.get( elem ); - - // Only attach events to objects that accept data - if ( !acceptData( elem ) ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Ensure that invalid selectors throw exceptions at attach time - // Evaluate against documentElement in case elem is a non-element node (e.g., document) - if ( selector ) { - jQuery.find.matchesSelector( documentElement, selector ); - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - if ( !( events = elemData.events ) ) { - events = elemData.events = Object.create( null ); - } - if ( !( eventHandle = elemData.handle ) ) { - eventHandle = elemData.handle = function( e ) { - - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? - jQuery.event.dispatch.apply( elem, arguments ) : undefined; - }; - } - - // Handle multiple events separated by a space - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // There *must* be a type, no attaching namespace-only handlers - if ( !type ) { - continue; - } - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; - - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend( { - type: type, - origType: origType, - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - needsContext: selector && jQuery.expr.match.needsContext.test( selector ), - namespace: namespaces.join( "." ) - }, handleObjIn ); - - // Init the event handler queue if we're the first - if ( !( handlers = events[ type ] ) ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; - - // Only use addEventListener if the special events handler returns false - if ( !special.setup || - special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - }, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, selector, mappedTypes ) { - - var j, origCount, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); - - if ( !elemData || !( events = elemData.events ) ) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); - } - continue; - } - - special = jQuery.event.special[ type ] || {}; - type = ( selector ? special.delegateType : special.bindType ) || type; - handlers = events[ type ] || []; - tmp = tmp[ 2 ] && - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); - - // Remove matching events - origCount = j = handlers.length; - while ( j-- ) { - handleObj = handlers[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !tmp || tmp.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || - selector === "**" && handleObj.selector ) ) { - handlers.splice( j, 1 ); - - if ( handleObj.selector ) { - handlers.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( origCount && !handlers.length ) { - if ( !special.teardown || - special.teardown.call( elem, namespaces, elemData.handle ) === false ) { - - jQuery.removeEvent( elem, type, elemData.handle ); - } - - delete events[ type ]; - } - } - - // Remove data and the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - dataPriv.remove( elem, "handle events" ); - } - }, - - dispatch: function( nativeEvent ) { - - var i, j, ret, matched, handleObj, handlerQueue, - args = new Array( arguments.length ), - - // Make a writable jQuery.Event from the native event object - event = jQuery.event.fix( nativeEvent ), - - handlers = ( - dataPriv.get( this, "events" ) || Object.create( null ) - )[ event.type ] || [], - special = jQuery.event.special[ event.type ] || {}; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[ 0 ] = event; - - for ( i = 1; i < arguments.length; i++ ) { - args[ i ] = arguments[ i ]; - } - - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { - return; - } - - // Determine handlers - handlerQueue = jQuery.event.handlers.call( this, event, handlers ); - - // Run delegates first; they may want to stop propagation beneath us - i = 0; - while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { - event.currentTarget = matched.elem; - - j = 0; - while ( ( handleObj = matched.handlers[ j++ ] ) && - !event.isImmediatePropagationStopped() ) { - - // If the event is namespaced, then each handler is only invoked if it is - // specially universal or its namespaces are a superset of the event's. - if ( !event.rnamespace || handleObj.namespace === false || - event.rnamespace.test( handleObj.namespace ) ) { - - event.handleObj = handleObj; - event.data = handleObj.data; - - ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || - handleObj.handler ).apply( matched.elem, args ); - - if ( ret !== undefined ) { - if ( ( event.result = ret ) === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if ( special.postDispatch ) { - special.postDispatch.call( this, event ); - } - - return event.result; - }, - - handlers: function( event, handlers ) { - var i, handleObj, sel, matchedHandlers, matchedSelectors, - handlerQueue = [], - delegateCount = handlers.delegateCount, - cur = event.target; - - // Find delegate handlers - if ( delegateCount && - - // Support: IE <=9 - // Black-hole SVG instance trees (trac-13180) - cur.nodeType && - - // Support: Firefox <=42 - // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) - // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click - // Support: IE 11 only - // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) - !( event.type === "click" && event.button >= 1 ) ) { - - for ( ; cur !== this; cur = cur.parentNode || this ) { - - // Don't check non-elements (#13208) - // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) - if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { - matchedHandlers = []; - matchedSelectors = {}; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - - // Don't conflict with Object.prototype properties (#13203) - sel = handleObj.selector + " "; - - if ( matchedSelectors[ sel ] === undefined ) { - matchedSelectors[ sel ] = handleObj.needsContext ? - jQuery( sel, this ).index( cur ) > -1 : - jQuery.find( sel, this, null, [ cur ] ).length; - } - if ( matchedSelectors[ sel ] ) { - matchedHandlers.push( handleObj ); - } - } - if ( matchedHandlers.length ) { - handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); - } - } - } - } - - // Add the remaining (directly-bound) handlers - cur = this; - if ( delegateCount < handlers.length ) { - handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); - } - - return handlerQueue; - }, - - addProp: function( name, hook ) { - Object.defineProperty( jQuery.Event.prototype, name, { - enumerable: true, - configurable: true, - - get: isFunction( hook ) ? - function() { - if ( this.originalEvent ) { - return hook( this.originalEvent ); - } - } : - function() { - if ( this.originalEvent ) { - return this.originalEvent[ name ]; - } - }, - - set: function( value ) { - Object.defineProperty( this, name, { - enumerable: true, - configurable: true, - writable: true, - value: value - } ); - } - } ); - }, - - fix: function( originalEvent ) { - return originalEvent[ jQuery.expando ] ? - originalEvent : - new jQuery.Event( originalEvent ); - }, - - special: { - load: { - - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - click: { - - // Utilize native event to ensure correct state for checkable inputs - setup: function( data ) { - - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Claim the first handler - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, "input" ) ) { - - // dataPriv.set( el, "click", ... ) - leverageNative( el, "click", returnTrue ); - } - - // Return false to allow normal processing in the caller - return false; - }, - trigger: function( data ) { - - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Force setup before triggering a click - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, "input" ) ) { - - leverageNative( el, "click" ); - } - - // Return non-false to allow normal event-path propagation - return true; - }, - - // For cross-browser consistency, suppress native .click() on links - // Also prevent it if we're currently inside a leveraged native-event stack - _default: function( event ) { - var target = event.target; - return rcheckableType.test( target.type ) && - target.click && nodeName( target, "input" ) && - dataPriv.get( target, "click" ) || - nodeName( target, "a" ); - } - }, - - beforeunload: { - postDispatch: function( event ) { - - // Support: Firefox 20+ - // Firefox doesn't alert if the returnValue field is not set. - if ( event.result !== undefined && event.originalEvent ) { - event.originalEvent.returnValue = event.result; - } - } - } - } -}; - -// Ensure the presence of an event listener that handles manually-triggered -// synthetic events by interrupting progress until reinvoked in response to -// *native* events that it fires directly, ensuring that state changes have -// already occurred before other listeners are invoked. -function leverageNative( el, type, expectSync ) { - - // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add - if ( !expectSync ) { - if ( dataPriv.get( el, type ) === undefined ) { - jQuery.event.add( el, type, returnTrue ); - } - return; - } - - // Register the controller as a special universal handler for all event namespaces - dataPriv.set( el, type, false ); - jQuery.event.add( el, type, { - namespace: false, - handler: function( event ) { - var notAsync, result, - saved = dataPriv.get( this, type ); - - if ( ( event.isTrigger & 1 ) && this[ type ] ) { - - // Interrupt processing of the outer synthetic .trigger()ed event - // Saved data should be false in such cases, but might be a leftover capture object - // from an async native handler (gh-4350) - if ( !saved.length ) { - - // Store arguments for use when handling the inner native event - // There will always be at least one argument (an event object), so this array - // will not be confused with a leftover capture object. - saved = slice.call( arguments ); - dataPriv.set( this, type, saved ); - - // Trigger the native event and capture its result - // Support: IE <=9 - 11+ - // focus() and blur() are asynchronous - notAsync = expectSync( this, type ); - this[ type ](); - result = dataPriv.get( this, type ); - if ( saved !== result || notAsync ) { - dataPriv.set( this, type, false ); - } else { - result = {}; - } - if ( saved !== result ) { - - // Cancel the outer synthetic event - event.stopImmediatePropagation(); - event.preventDefault(); - return result.value; - } - - // If this is an inner synthetic event for an event with a bubbling surrogate - // (focus or blur), assume that the surrogate already propagated from triggering the - // native event and prevent that from happening again here. - // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the - // bubbling surrogate propagates *after* the non-bubbling base), but that seems - // less bad than duplication. - } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { - event.stopPropagation(); - } - - // If this is a native event triggered above, everything is now in order - // Fire an inner synthetic event with the original arguments - } else if ( saved.length ) { - - // ...and capture the result - dataPriv.set( this, type, { - value: jQuery.event.trigger( - - // Support: IE <=9 - 11+ - // Extend with the prototype to reset the above stopImmediatePropagation() - jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), - saved.slice( 1 ), - this - ) - } ); - - // Abort handling of the native event - event.stopImmediatePropagation(); - } - } - } ); -} - -jQuery.removeEvent = function( elem, type, handle ) { - - // This "if" is needed for plain objects - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle ); - } -}; - -jQuery.Event = function( src, props ) { - - // Allow instantiation without the 'new' keyword - if ( !( this instanceof jQuery.Event ) ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = src.defaultPrevented || - src.defaultPrevented === undefined && - - // Support: Android <=2.3 only - src.returnValue === false ? - returnTrue : - returnFalse; - - // Create target properties - // Support: Safari <=6 - 7 only - // Target should not be a text node (#504, #13143) - this.target = ( src.target && src.target.nodeType === 3 ) ? - src.target.parentNode : - src.target; - - this.currentTarget = src.currentTarget; - this.relatedTarget = src.relatedTarget; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || Date.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - constructor: jQuery.Event, - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse, - isSimulated: false, - - preventDefault: function() { - var e = this.originalEvent; - - this.isDefaultPrevented = returnTrue; - - if ( e && !this.isSimulated ) { - e.preventDefault(); - } - }, - stopPropagation: function() { - var e = this.originalEvent; - - this.isPropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopPropagation(); - } - }, - stopImmediatePropagation: function() { - var e = this.originalEvent; - - this.isImmediatePropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopImmediatePropagation(); - } - - this.stopPropagation(); - } -}; - -// Includes all common event props including KeyEvent and MouseEvent specific props -jQuery.each( { - altKey: true, - bubbles: true, - cancelable: true, - changedTouches: true, - ctrlKey: true, - detail: true, - eventPhase: true, - metaKey: true, - pageX: true, - pageY: true, - shiftKey: true, - view: true, - "char": true, - code: true, - charCode: true, - key: true, - keyCode: true, - button: true, - buttons: true, - clientX: true, - clientY: true, - offsetX: true, - offsetY: true, - pointerId: true, - pointerType: true, - screenX: true, - screenY: true, - targetTouches: true, - toElement: true, - touches: true, - - which: function( event ) { - var button = event.button; - - // Add which for key events - if ( event.which == null && rkeyEvent.test( event.type ) ) { - return event.charCode != null ? event.charCode : event.keyCode; - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { - if ( button & 1 ) { - return 1; - } - - if ( button & 2 ) { - return 3; - } - - if ( button & 4 ) { - return 2; - } - - return 0; - } - - return event.which; - } -}, jQuery.event.addProp ); - -jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { - jQuery.event.special[ type ] = { - - // Utilize native event if possible so blur/focus sequence is correct - setup: function() { - - // Claim the first handler - // dataPriv.set( this, "focus", ... ) - // dataPriv.set( this, "blur", ... ) - leverageNative( this, type, expectSync ); - - // Return false to allow normal processing in the caller - return false; - }, - trigger: function() { - - // Force setup before trigger - leverageNative( this, type ); - - // Return non-false to allow normal event-path propagation - return true; - }, - - delegateType: delegateType - }; -} ); - -// Create mouseenter/leave events using mouseover/out and event-time checks -// so that event delegation works in jQuery. -// Do the same for pointerenter/pointerleave and pointerover/pointerout -// -// Support: Safari 7 only -// Safari sends mouseenter too often; see: -// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 -// for the description of the bug (it existed in older Chrome versions as well). -jQuery.each( { - mouseenter: "mouseover", - mouseleave: "mouseout", - pointerenter: "pointerover", - pointerleave: "pointerout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function( event ) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - - // For mouseenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; -} ); - -jQuery.fn.extend( { - - on: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn ); - }, - one: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn, 1 ); - }, - off: function( types, selector, fn ) { - var handleObj, type; - if ( types && types.preventDefault && types.handleObj ) { - - // ( event ) dispatched jQuery.Event - handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace ? - handleObj.origType + "." + handleObj.namespace : - handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - - // ( types-object [, selector] ) - for ( type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { - - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each( function() { - jQuery.event.remove( this, types, fn, selector ); - } ); - } -} ); - - -var - - // Support: IE <=10 - 11, Edge 12 - 13 only - // In IE/Edge using regex groups here causes severe slowdowns. - // See https://connect.microsoft.com/IE/feedback/details/1736512/ - rnoInnerhtml = /\s*$/g; - -// Prefer a tbody over its parent table for containing new rows -function manipulationTarget( elem, content ) { - if ( nodeName( elem, "table" ) && - nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { - - return jQuery( elem ).children( "tbody" )[ 0 ] || elem; - } - - return elem; -} - -// Replace/restore the type attribute of script elements for safe DOM manipulation -function disableScript( elem ) { - elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; - return elem; -} -function restoreScript( elem ) { - if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { - elem.type = elem.type.slice( 5 ); - } else { - elem.removeAttribute( "type" ); - } - - return elem; -} - -function cloneCopyEvent( src, dest ) { - var i, l, type, pdataOld, udataOld, udataCur, events; - - if ( dest.nodeType !== 1 ) { - return; - } - - // 1. Copy private data: events, handlers, etc. - if ( dataPriv.hasData( src ) ) { - pdataOld = dataPriv.get( src ); - events = pdataOld.events; - - if ( events ) { - dataPriv.remove( dest, "handle events" ); - - for ( type in events ) { - for ( i = 0, l = events[ type ].length; i < l; i++ ) { - jQuery.event.add( dest, type, events[ type ][ i ] ); - } - } - } - } - - // 2. Copy user data - if ( dataUser.hasData( src ) ) { - udataOld = dataUser.access( src ); - udataCur = jQuery.extend( {}, udataOld ); - - dataUser.set( dest, udataCur ); - } -} - -// Fix IE bugs, see support tests -function fixInput( src, dest ) { - var nodeName = dest.nodeName.toLowerCase(); - - // Fails to persist the checked state of a cloned checkbox or radio button. - if ( nodeName === "input" && rcheckableType.test( src.type ) ) { - dest.checked = src.checked; - - // Fails to return the selected option to the default selected state when cloning options - } else if ( nodeName === "input" || nodeName === "textarea" ) { - dest.defaultValue = src.defaultValue; - } -} - -function domManip( collection, args, callback, ignored ) { - - // Flatten any nested arrays - args = flat( args ); - - var fragment, first, scripts, hasScripts, node, doc, - i = 0, - l = collection.length, - iNoClone = l - 1, - value = args[ 0 ], - valueIsFunction = isFunction( value ); - - // We can't cloneNode fragments that contain checked, in WebKit - if ( valueIsFunction || - ( l > 1 && typeof value === "string" && - !support.checkClone && rchecked.test( value ) ) ) { - return collection.each( function( index ) { - var self = collection.eq( index ); - if ( valueIsFunction ) { - args[ 0 ] = value.call( this, index, self.html() ); - } - domManip( self, args, callback, ignored ); - } ); - } - - if ( l ) { - fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); - first = fragment.firstChild; - - if ( fragment.childNodes.length === 1 ) { - fragment = first; - } - - // Require either new content or an interest in ignored elements to invoke the callback - if ( first || ignored ) { - scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); - hasScripts = scripts.length; - - // Use the original fragment for the last item - // instead of the first because it can end up - // being emptied incorrectly in certain situations (#8070). - for ( ; i < l; i++ ) { - node = fragment; - - if ( i !== iNoClone ) { - node = jQuery.clone( node, true, true ); - - // Keep references to cloned scripts for later restoration - if ( hasScripts ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( scripts, getAll( node, "script" ) ); - } - } - - callback.call( collection[ i ], node, i ); - } - - if ( hasScripts ) { - doc = scripts[ scripts.length - 1 ].ownerDocument; - - // Reenable scripts - jQuery.map( scripts, restoreScript ); - - // Evaluate executable scripts on first document insertion - for ( i = 0; i < hasScripts; i++ ) { - node = scripts[ i ]; - if ( rscriptType.test( node.type || "" ) && - !dataPriv.access( node, "globalEval" ) && - jQuery.contains( doc, node ) ) { - - if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { - - // Optional AJAX dependency, but won't run scripts if not present - if ( jQuery._evalUrl && !node.noModule ) { - jQuery._evalUrl( node.src, { - nonce: node.nonce || node.getAttribute( "nonce" ) - }, doc ); - } - } else { - DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); - } - } - } - } - } - } - - return collection; -} - -function remove( elem, selector, keepData ) { - var node, - nodes = selector ? jQuery.filter( selector, elem ) : elem, - i = 0; - - for ( ; ( node = nodes[ i ] ) != null; i++ ) { - if ( !keepData && node.nodeType === 1 ) { - jQuery.cleanData( getAll( node ) ); - } - - if ( node.parentNode ) { - if ( keepData && isAttached( node ) ) { - setGlobalEval( getAll( node, "script" ) ); - } - node.parentNode.removeChild( node ); - } - } - - return elem; -} - -jQuery.extend( { - htmlPrefilter: function( html ) { - return html; - }, - - clone: function( elem, dataAndEvents, deepDataAndEvents ) { - var i, l, srcElements, destElements, - clone = elem.cloneNode( true ), - inPage = isAttached( elem ); - - // Fix IE cloning issues - if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && - !jQuery.isXMLDoc( elem ) ) { - - // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 - destElements = getAll( clone ); - srcElements = getAll( elem ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - fixInput( srcElements[ i ], destElements[ i ] ); - } - } - - // Copy the events from the original to the clone - if ( dataAndEvents ) { - if ( deepDataAndEvents ) { - srcElements = srcElements || getAll( elem ); - destElements = destElements || getAll( clone ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - cloneCopyEvent( srcElements[ i ], destElements[ i ] ); - } - } else { - cloneCopyEvent( elem, clone ); - } - } - - // Preserve script evaluation history - destElements = getAll( clone, "script" ); - if ( destElements.length > 0 ) { - setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); - } - - // Return the cloned set - return clone; - }, - - cleanData: function( elems ) { - var data, elem, type, - special = jQuery.event.special, - i = 0; - - for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { - if ( acceptData( elem ) ) { - if ( ( data = elem[ dataPriv.expando ] ) ) { - if ( data.events ) { - for ( type in data.events ) { - if ( special[ type ] ) { - jQuery.event.remove( elem, type ); - - // This is a shortcut to avoid jQuery.event.remove's overhead - } else { - jQuery.removeEvent( elem, type, data.handle ); - } - } - } - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataPriv.expando ] = undefined; - } - if ( elem[ dataUser.expando ] ) { - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataUser.expando ] = undefined; - } - } - } - } -} ); - -jQuery.fn.extend( { - detach: function( selector ) { - return remove( this, selector, true ); - }, - - remove: function( selector ) { - return remove( this, selector ); - }, - - text: function( value ) { - return access( this, function( value ) { - return value === undefined ? - jQuery.text( this ) : - this.empty().each( function() { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - this.textContent = value; - } - } ); - }, null, value, arguments.length ); - }, - - append: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.appendChild( elem ); - } - } ); - }, - - prepend: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.insertBefore( elem, target.firstChild ); - } - } ); - }, - - before: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this ); - } - } ); - }, - - after: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this.nextSibling ); - } - } ); - }, - - empty: function() { - var elem, - i = 0; - - for ( ; ( elem = this[ i ] ) != null; i++ ) { - if ( elem.nodeType === 1 ) { - - // Prevent memory leaks - jQuery.cleanData( getAll( elem, false ) ); - - // Remove any remaining nodes - elem.textContent = ""; - } - } - - return this; - }, - - clone: function( dataAndEvents, deepDataAndEvents ) { - dataAndEvents = dataAndEvents == null ? false : dataAndEvents; - deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - - return this.map( function() { - return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); - } ); - }, - - html: function( value ) { - return access( this, function( value ) { - var elem = this[ 0 ] || {}, - i = 0, - l = this.length; - - if ( value === undefined && elem.nodeType === 1 ) { - return elem.innerHTML; - } - - // See if we can take a shortcut and just use innerHTML - if ( typeof value === "string" && !rnoInnerhtml.test( value ) && - !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { - - value = jQuery.htmlPrefilter( value ); - - try { - for ( ; i < l; i++ ) { - elem = this[ i ] || {}; - - // Remove element nodes and prevent memory leaks - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - elem.innerHTML = value; - } - } - - elem = 0; - - // If using innerHTML throws an exception, use the fallback method - } catch ( e ) {} - } - - if ( elem ) { - this.empty().append( value ); - } - }, null, value, arguments.length ); - }, - - replaceWith: function() { - var ignored = []; - - // Make the changes, replacing each non-ignored context element with the new content - return domManip( this, arguments, function( elem ) { - var parent = this.parentNode; - - if ( jQuery.inArray( this, ignored ) < 0 ) { - jQuery.cleanData( getAll( this ) ); - if ( parent ) { - parent.replaceChild( elem, this ); - } - } - - // Force callback invocation - }, ignored ); - } -} ); - -jQuery.each( { - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" -}, function( name, original ) { - jQuery.fn[ name ] = function( selector ) { - var elems, - ret = [], - insert = jQuery( selector ), - last = insert.length - 1, - i = 0; - - for ( ; i <= last; i++ ) { - elems = i === last ? this : this.clone( true ); - jQuery( insert[ i ] )[ original ]( elems ); - - // Support: Android <=4.0 only, PhantomJS 1 only - // .get() because push.apply(_, arraylike) throws on ancient WebKit - push.apply( ret, elems.get() ); - } - - return this.pushStack( ret ); - }; -} ); -var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); - -var getStyles = function( elem ) { - - // Support: IE <=11 only, Firefox <=30 (#15098, #14150) - // IE throws on elements created in popups - // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" - var view = elem.ownerDocument.defaultView; - - if ( !view || !view.opener ) { - view = window; - } - - return view.getComputedStyle( elem ); - }; - -var swap = function( elem, options, callback ) { - var ret, name, - old = {}; - - // Remember the old values, and insert the new ones - for ( name in options ) { - old[ name ] = elem.style[ name ]; - elem.style[ name ] = options[ name ]; - } - - ret = callback.call( elem ); - - // Revert the old values - for ( name in options ) { - elem.style[ name ] = old[ name ]; - } - - return ret; -}; - - -var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); - - - -( function() { - - // Executing both pixelPosition & boxSizingReliable tests require only one layout - // so they're executed at the same time to save the second computation. - function computeStyleTests() { - - // This is a singleton, we need to execute it only once - if ( !div ) { - return; - } - - container.style.cssText = "position:absolute;left:-11111px;width:60px;" + - "margin-top:1px;padding:0;border:0"; - div.style.cssText = - "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + - "margin:auto;border:1px;padding:1px;" + - "width:60%;top:1%"; - documentElement.appendChild( container ).appendChild( div ); - - var divStyle = window.getComputedStyle( div ); - pixelPositionVal = divStyle.top !== "1%"; - - // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 - reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; - - // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 - // Some styles come back with percentage values, even though they shouldn't - div.style.right = "60%"; - pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; - - // Support: IE 9 - 11 only - // Detect misreporting of content dimensions for box-sizing:border-box elements - boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; - - // Support: IE 9 only - // Detect overflow:scroll screwiness (gh-3699) - // Support: Chrome <=64 - // Don't get tricked when zoom affects offsetWidth (gh-4029) - div.style.position = "absolute"; - scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; - - documentElement.removeChild( container ); - - // Nullify the div so it wouldn't be stored in the memory and - // it will also be a sign that checks already performed - div = null; - } - - function roundPixelMeasures( measure ) { - return Math.round( parseFloat( measure ) ); - } - - var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, - reliableTrDimensionsVal, reliableMarginLeftVal, - container = document.createElement( "div" ), - div = document.createElement( "div" ); - - // Finish early in limited (non-browser) environments - if ( !div.style ) { - return; - } - - // Support: IE <=9 - 11 only - // Style of cloned element affects source element cloned (#8908) - div.style.backgroundClip = "content-box"; - div.cloneNode( true ).style.backgroundClip = ""; - support.clearCloneStyle = div.style.backgroundClip === "content-box"; - - jQuery.extend( support, { - boxSizingReliable: function() { - computeStyleTests(); - return boxSizingReliableVal; - }, - pixelBoxStyles: function() { - computeStyleTests(); - return pixelBoxStylesVal; - }, - pixelPosition: function() { - computeStyleTests(); - return pixelPositionVal; - }, - reliableMarginLeft: function() { - computeStyleTests(); - return reliableMarginLeftVal; - }, - scrollboxSize: function() { - computeStyleTests(); - return scrollboxSizeVal; - }, - - // Support: IE 9 - 11+, Edge 15 - 18+ - // IE/Edge misreport `getComputedStyle` of table rows with width/height - // set in CSS while `offset*` properties report correct values. - // Behavior in IE 9 is more subtle than in newer versions & it passes - // some versions of this test; make sure not to make it pass there! - reliableTrDimensions: function() { - var table, tr, trChild, trStyle; - if ( reliableTrDimensionsVal == null ) { - table = document.createElement( "table" ); - tr = document.createElement( "tr" ); - trChild = document.createElement( "div" ); - - table.style.cssText = "position:absolute;left:-11111px"; - tr.style.height = "1px"; - trChild.style.height = "9px"; - - documentElement - .appendChild( table ) - .appendChild( tr ) - .appendChild( trChild ); - - trStyle = window.getComputedStyle( tr ); - reliableTrDimensionsVal = parseInt( trStyle.height ) > 3; - - documentElement.removeChild( table ); - } - return reliableTrDimensionsVal; - } - } ); -} )(); - - -function curCSS( elem, name, computed ) { - var width, minWidth, maxWidth, ret, - - // Support: Firefox 51+ - // Retrieving style before computed somehow - // fixes an issue with getting wrong values - // on detached elements - style = elem.style; - - computed = computed || getStyles( elem ); - - // getPropertyValue is needed for: - // .css('filter') (IE 9 only, #12537) - // .css('--customProperty) (#3144) - if ( computed ) { - ret = computed.getPropertyValue( name ) || computed[ name ]; - - if ( ret === "" && !isAttached( elem ) ) { - ret = jQuery.style( elem, name ); - } - - // A tribute to the "awesome hack by Dean Edwards" - // Android Browser returns percentage for some values, - // but width seems to be reliably pixels. - // This is against the CSSOM draft spec: - // https://drafts.csswg.org/cssom/#resolved-values - if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { - - // Remember the original values - width = style.width; - minWidth = style.minWidth; - maxWidth = style.maxWidth; - - // Put in the new values to get a computed value out - style.minWidth = style.maxWidth = style.width = ret; - ret = computed.width; - - // Revert the changed values - style.width = width; - style.minWidth = minWidth; - style.maxWidth = maxWidth; - } - } - - return ret !== undefined ? - - // Support: IE <=9 - 11 only - // IE returns zIndex value as an integer. - ret + "" : - ret; -} - - -function addGetHookIf( conditionFn, hookFn ) { - - // Define the hook, we'll check on the first run if it's really needed. - return { - get: function() { - if ( conditionFn() ) { - - // Hook not needed (or it's not possible to use it due - // to missing dependency), remove it. - delete this.get; - return; - } - - // Hook needed; redefine it so that the support test is not executed again. - return ( this.get = hookFn ).apply( this, arguments ); - } - }; -} - - -var cssPrefixes = [ "Webkit", "Moz", "ms" ], - emptyStyle = document.createElement( "div" ).style, - vendorProps = {}; - -// Return a vendor-prefixed property or undefined -function vendorPropName( name ) { - - // Check for vendor prefixed names - var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), - i = cssPrefixes.length; - - while ( i-- ) { - name = cssPrefixes[ i ] + capName; - if ( name in emptyStyle ) { - return name; - } - } -} - -// Return a potentially-mapped jQuery.cssProps or vendor prefixed property -function finalPropName( name ) { - var final = jQuery.cssProps[ name ] || vendorProps[ name ]; - - if ( final ) { - return final; - } - if ( name in emptyStyle ) { - return name; - } - return vendorProps[ name ] = vendorPropName( name ) || name; -} - - -var - - // Swappable if display is none or starts with table - // except "table", "table-cell", or "table-caption" - // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display - rdisplayswap = /^(none|table(?!-c[ea]).+)/, - rcustomProp = /^--/, - cssShow = { position: "absolute", visibility: "hidden", display: "block" }, - cssNormalTransform = { - letterSpacing: "0", - fontWeight: "400" - }; - -function setPositiveNumber( _elem, value, subtract ) { - - // Any relative (+/-) values have already been - // normalized at this point - var matches = rcssNum.exec( value ); - return matches ? - - // Guard against undefined "subtract", e.g., when used as in cssHooks - Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : - value; -} - -function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { - var i = dimension === "width" ? 1 : 0, - extra = 0, - delta = 0; - - // Adjustment may not be necessary - if ( box === ( isBorderBox ? "border" : "content" ) ) { - return 0; - } - - for ( ; i < 4; i += 2 ) { - - // Both box models exclude margin - if ( box === "margin" ) { - delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); - } - - // If we get here with a content-box, we're seeking "padding" or "border" or "margin" - if ( !isBorderBox ) { - - // Add padding - delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - - // For "border" or "margin", add border - if ( box !== "padding" ) { - delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - - // But still keep track of it otherwise - } else { - extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - - // If we get here with a border-box (content + padding + border), we're seeking "content" or - // "padding" or "margin" - } else { - - // For "content", subtract padding - if ( box === "content" ) { - delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - } - - // For "content" or "padding", subtract border - if ( box !== "margin" ) { - delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } - } - - // Account for positive content-box scroll gutter when requested by providing computedVal - if ( !isBorderBox && computedVal >= 0 ) { - - // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border - // Assuming integer scroll gutter, subtract the rest and round down - delta += Math.max( 0, Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - computedVal - - delta - - extra - - 0.5 - - // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter - // Use an explicit zero to avoid NaN (gh-3964) - ) ) || 0; - } - - return delta; -} - -function getWidthOrHeight( elem, dimension, extra ) { - - // Start with computed style - var styles = getStyles( elem ), - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). - // Fake content-box until we know it's needed to know the true value. - boxSizingNeeded = !support.boxSizingReliable() || extra, - isBorderBox = boxSizingNeeded && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - valueIsBorderBox = isBorderBox, - - val = curCSS( elem, dimension, styles ), - offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); - - // Support: Firefox <=54 - // Return a confounding non-pixel value or feign ignorance, as appropriate. - if ( rnumnonpx.test( val ) ) { - if ( !extra ) { - return val; - } - val = "auto"; - } - - - // Support: IE 9 - 11 only - // Use offsetWidth/offsetHeight for when box sizing is unreliable. - // In those cases, the computed value can be trusted to be border-box. - if ( ( !support.boxSizingReliable() && isBorderBox || - - // Support: IE 10 - 11+, Edge 15 - 18+ - // IE/Edge misreport `getComputedStyle` of table rows with width/height - // set in CSS while `offset*` properties report correct values. - // Interestingly, in some cases IE 9 doesn't suffer from this issue. - !support.reliableTrDimensions() && nodeName( elem, "tr" ) || - - // Fall back to offsetWidth/offsetHeight when value is "auto" - // This happens for inline elements with no explicit setting (gh-3571) - val === "auto" || - - // Support: Android <=4.1 - 4.3 only - // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) - !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && - - // Make sure the element is visible & connected - elem.getClientRects().length ) { - - isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; - - // Where available, offsetWidth/offsetHeight approximate border box dimensions. - // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the - // retrieved value as a content box dimension. - valueIsBorderBox = offsetProp in elem; - if ( valueIsBorderBox ) { - val = elem[ offsetProp ]; - } - } - - // Normalize "" and auto - val = parseFloat( val ) || 0; - - // Adjust for the element's box model - return ( val + - boxModelAdjustment( - elem, - dimension, - extra || ( isBorderBox ? "border" : "content" ), - valueIsBorderBox, - styles, - - // Provide the current computed size to request scroll gutter calculation (gh-3589) - val - ) - ) + "px"; -} - -jQuery.extend( { - - // Add in style property hooks for overriding the default - // behavior of getting and setting a style property - cssHooks: { - opacity: { - get: function( elem, computed ) { - if ( computed ) { - - // We should always get a number back from opacity - var ret = curCSS( elem, "opacity" ); - return ret === "" ? "1" : ret; - } - } - } - }, - - // Don't automatically add "px" to these possibly-unitless properties - cssNumber: { - "animationIterationCount": true, - "columnCount": true, - "fillOpacity": true, - "flexGrow": true, - "flexShrink": true, - "fontWeight": true, - "gridArea": true, - "gridColumn": true, - "gridColumnEnd": true, - "gridColumnStart": true, - "gridRow": true, - "gridRowEnd": true, - "gridRowStart": true, - "lineHeight": true, - "opacity": true, - "order": true, - "orphans": true, - "widows": true, - "zIndex": true, - "zoom": true - }, - - // Add in properties whose names you wish to fix before - // setting or getting the value - cssProps: {}, - - // Get and set the style property on a DOM Node - style: function( elem, name, value, extra ) { - - // Don't set styles on text and comment nodes - if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { - return; - } - - // Make sure that we're working with the right name - var ret, type, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ), - style = elem.style; - - // Make sure that we're working with the right name. We don't - // want to query the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Gets hook for the prefixed version, then unprefixed version - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // Check if we're setting a value - if ( value !== undefined ) { - type = typeof value; - - // Convert "+=" or "-=" to relative numbers (#7345) - if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { - value = adjustCSS( elem, name, ret ); - - // Fixes bug #9237 - type = "number"; - } - - // Make sure that null and NaN values aren't set (#7116) - if ( value == null || value !== value ) { - return; - } - - // If a number was passed in, add the unit (except for certain CSS properties) - // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append - // "px" to a few hardcoded values. - if ( type === "number" && !isCustomProp ) { - value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); - } - - // background-* props affect original clone's values - if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { - style[ name ] = "inherit"; - } - - // If a hook was provided, use that value, otherwise just set the specified value - if ( !hooks || !( "set" in hooks ) || - ( value = hooks.set( elem, value, extra ) ) !== undefined ) { - - if ( isCustomProp ) { - style.setProperty( name, value ); - } else { - style[ name ] = value; - } - } - - } else { - - // If a hook was provided get the non-computed value from there - if ( hooks && "get" in hooks && - ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { - - return ret; - } - - // Otherwise just get the value from the style object - return style[ name ]; - } - }, - - css: function( elem, name, extra, styles ) { - var val, num, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ); - - // Make sure that we're working with the right name. We don't - // want to modify the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Try prefixed name followed by the unprefixed name - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // If a hook was provided get the computed value from there - if ( hooks && "get" in hooks ) { - val = hooks.get( elem, true, extra ); - } - - // Otherwise, if a way to get the computed value exists, use that - if ( val === undefined ) { - val = curCSS( elem, name, styles ); - } - - // Convert "normal" to computed value - if ( val === "normal" && name in cssNormalTransform ) { - val = cssNormalTransform[ name ]; - } - - // Make numeric if forced or a qualifier was provided and val looks numeric - if ( extra === "" || extra ) { - num = parseFloat( val ); - return extra === true || isFinite( num ) ? num || 0 : val; - } - - return val; - } -} ); - -jQuery.each( [ "height", "width" ], function( _i, dimension ) { - jQuery.cssHooks[ dimension ] = { - get: function( elem, computed, extra ) { - if ( computed ) { - - // Certain elements can have dimension info if we invisibly show them - // but it must have a current display style that would benefit - return rdisplayswap.test( jQuery.css( elem, "display" ) ) && - - // Support: Safari 8+ - // Table columns in Safari have non-zero offsetWidth & zero - // getBoundingClientRect().width unless display is changed. - // Support: IE <=11 only - // Running getBoundingClientRect on a disconnected node - // in IE throws an error. - ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? - swap( elem, cssShow, function() { - return getWidthOrHeight( elem, dimension, extra ); - } ) : - getWidthOrHeight( elem, dimension, extra ); - } - }, - - set: function( elem, value, extra ) { - var matches, - styles = getStyles( elem ), - - // Only read styles.position if the test has a chance to fail - // to avoid forcing a reflow. - scrollboxSizeBuggy = !support.scrollboxSize() && - styles.position === "absolute", - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) - boxSizingNeeded = scrollboxSizeBuggy || extra, - isBorderBox = boxSizingNeeded && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - subtract = extra ? - boxModelAdjustment( - elem, - dimension, - extra, - isBorderBox, - styles - ) : - 0; - - // Account for unreliable border-box dimensions by comparing offset* to computed and - // faking a content-box to get border and padding (gh-3699) - if ( isBorderBox && scrollboxSizeBuggy ) { - subtract -= Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - parseFloat( styles[ dimension ] ) - - boxModelAdjustment( elem, dimension, "border", false, styles ) - - 0.5 - ); - } - - // Convert to pixels if value adjustment is needed - if ( subtract && ( matches = rcssNum.exec( value ) ) && - ( matches[ 3 ] || "px" ) !== "px" ) { - - elem.style[ dimension ] = value; - value = jQuery.css( elem, dimension ); - } - - return setPositiveNumber( elem, value, subtract ); - } - }; -} ); - -jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, - function( elem, computed ) { - if ( computed ) { - return ( parseFloat( curCSS( elem, "marginLeft" ) ) || - elem.getBoundingClientRect().left - - swap( elem, { marginLeft: 0 }, function() { - return elem.getBoundingClientRect().left; - } ) - ) + "px"; - } - } -); - -// These hooks are used by animate to expand properties -jQuery.each( { - margin: "", - padding: "", - border: "Width" -}, function( prefix, suffix ) { - jQuery.cssHooks[ prefix + suffix ] = { - expand: function( value ) { - var i = 0, - expanded = {}, - - // Assumes a single number if not a string - parts = typeof value === "string" ? value.split( " " ) : [ value ]; - - for ( ; i < 4; i++ ) { - expanded[ prefix + cssExpand[ i ] + suffix ] = - parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; - } - - return expanded; - } - }; - - if ( prefix !== "margin" ) { - jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; - } -} ); - -jQuery.fn.extend( { - css: function( name, value ) { - return access( this, function( elem, name, value ) { - var styles, len, - map = {}, - i = 0; - - if ( Array.isArray( name ) ) { - styles = getStyles( elem ); - len = name.length; - - for ( ; i < len; i++ ) { - map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); - } - - return map; - } - - return value !== undefined ? - jQuery.style( elem, name, value ) : - jQuery.css( elem, name ); - }, name, value, arguments.length > 1 ); - } -} ); - - -function Tween( elem, options, prop, end, easing ) { - return new Tween.prototype.init( elem, options, prop, end, easing ); -} -jQuery.Tween = Tween; - -Tween.prototype = { - constructor: Tween, - init: function( elem, options, prop, end, easing, unit ) { - this.elem = elem; - this.prop = prop; - this.easing = easing || jQuery.easing._default; - this.options = options; - this.start = this.now = this.cur(); - this.end = end; - this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); - }, - cur: function() { - var hooks = Tween.propHooks[ this.prop ]; - - return hooks && hooks.get ? - hooks.get( this ) : - Tween.propHooks._default.get( this ); - }, - run: function( percent ) { - var eased, - hooks = Tween.propHooks[ this.prop ]; - - if ( this.options.duration ) { - this.pos = eased = jQuery.easing[ this.easing ]( - percent, this.options.duration * percent, 0, 1, this.options.duration - ); - } else { - this.pos = eased = percent; - } - this.now = ( this.end - this.start ) * eased + this.start; - - if ( this.options.step ) { - this.options.step.call( this.elem, this.now, this ); - } - - if ( hooks && hooks.set ) { - hooks.set( this ); - } else { - Tween.propHooks._default.set( this ); - } - return this; - } -}; - -Tween.prototype.init.prototype = Tween.prototype; - -Tween.propHooks = { - _default: { - get: function( tween ) { - var result; - - // Use a property on the element directly when it is not a DOM element, - // or when there is no matching style property that exists. - if ( tween.elem.nodeType !== 1 || - tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { - return tween.elem[ tween.prop ]; - } - - // Passing an empty string as a 3rd parameter to .css will automatically - // attempt a parseFloat and fallback to a string if the parse fails. - // Simple values such as "10px" are parsed to Float; - // complex values such as "rotate(1rad)" are returned as-is. - result = jQuery.css( tween.elem, tween.prop, "" ); - - // Empty strings, null, undefined and "auto" are converted to 0. - return !result || result === "auto" ? 0 : result; - }, - set: function( tween ) { - - // Use step hook for back compat. - // Use cssHook if its there. - // Use .style if available and use plain properties where available. - if ( jQuery.fx.step[ tween.prop ] ) { - jQuery.fx.step[ tween.prop ]( tween ); - } else if ( tween.elem.nodeType === 1 && ( - jQuery.cssHooks[ tween.prop ] || - tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { - jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); - } else { - tween.elem[ tween.prop ] = tween.now; - } - } - } -}; - -// Support: IE <=9 only -// Panic based approach to setting things on disconnected nodes -Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { - set: function( tween ) { - if ( tween.elem.nodeType && tween.elem.parentNode ) { - tween.elem[ tween.prop ] = tween.now; - } - } -}; - -jQuery.easing = { - linear: function( p ) { - return p; - }, - swing: function( p ) { - return 0.5 - Math.cos( p * Math.PI ) / 2; - }, - _default: "swing" -}; - -jQuery.fx = Tween.prototype.init; - -// Back compat <1.8 extension point -jQuery.fx.step = {}; - - - - -var - fxNow, inProgress, - rfxtypes = /^(?:toggle|show|hide)$/, - rrun = /queueHooks$/; - -function schedule() { - if ( inProgress ) { - if ( document.hidden === false && window.requestAnimationFrame ) { - window.requestAnimationFrame( schedule ); - } else { - window.setTimeout( schedule, jQuery.fx.interval ); - } - - jQuery.fx.tick(); - } -} - -// Animations created synchronously will run synchronously -function createFxNow() { - window.setTimeout( function() { - fxNow = undefined; - } ); - return ( fxNow = Date.now() ); -} - -// Generate parameters to create a standard animation -function genFx( type, includeWidth ) { - var which, - i = 0, - attrs = { height: type }; - - // If we include width, step value is 1 to do all cssExpand values, - // otherwise step value is 2 to skip over Left and Right - includeWidth = includeWidth ? 1 : 0; - for ( ; i < 4; i += 2 - includeWidth ) { - which = cssExpand[ i ]; - attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; - } - - if ( includeWidth ) { - attrs.opacity = attrs.width = type; - } - - return attrs; -} - -function createTween( value, prop, animation ) { - var tween, - collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), - index = 0, - length = collection.length; - for ( ; index < length; index++ ) { - if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { - - // We're done with this property - return tween; - } - } -} - -function defaultPrefilter( elem, props, opts ) { - var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, - isBox = "width" in props || "height" in props, - anim = this, - orig = {}, - style = elem.style, - hidden = elem.nodeType && isHiddenWithinTree( elem ), - dataShow = dataPriv.get( elem, "fxshow" ); - - // Queue-skipping animations hijack the fx hooks - if ( !opts.queue ) { - hooks = jQuery._queueHooks( elem, "fx" ); - if ( hooks.unqueued == null ) { - hooks.unqueued = 0; - oldfire = hooks.empty.fire; - hooks.empty.fire = function() { - if ( !hooks.unqueued ) { - oldfire(); - } - }; - } - hooks.unqueued++; - - anim.always( function() { - - // Ensure the complete handler is called before this completes - anim.always( function() { - hooks.unqueued--; - if ( !jQuery.queue( elem, "fx" ).length ) { - hooks.empty.fire(); - } - } ); - } ); - } - - // Detect show/hide animations - for ( prop in props ) { - value = props[ prop ]; - if ( rfxtypes.test( value ) ) { - delete props[ prop ]; - toggle = toggle || value === "toggle"; - if ( value === ( hidden ? "hide" : "show" ) ) { - - // Pretend to be hidden if this is a "show" and - // there is still data from a stopped show/hide - if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { - hidden = true; - - // Ignore all other no-op show/hide data - } else { - continue; - } - } - orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); - } - } - - // Bail out if this is a no-op like .hide().hide() - propTween = !jQuery.isEmptyObject( props ); - if ( !propTween && jQuery.isEmptyObject( orig ) ) { - return; - } - - // Restrict "overflow" and "display" styles during box animations - if ( isBox && elem.nodeType === 1 ) { - - // Support: IE <=9 - 11, Edge 12 - 15 - // Record all 3 overflow attributes because IE does not infer the shorthand - // from identically-valued overflowX and overflowY and Edge just mirrors - // the overflowX value there. - opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; - - // Identify a display type, preferring old show/hide data over the CSS cascade - restoreDisplay = dataShow && dataShow.display; - if ( restoreDisplay == null ) { - restoreDisplay = dataPriv.get( elem, "display" ); - } - display = jQuery.css( elem, "display" ); - if ( display === "none" ) { - if ( restoreDisplay ) { - display = restoreDisplay; - } else { - - // Get nonempty value(s) by temporarily forcing visibility - showHide( [ elem ], true ); - restoreDisplay = elem.style.display || restoreDisplay; - display = jQuery.css( elem, "display" ); - showHide( [ elem ] ); - } - } - - // Animate inline elements as inline-block - if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { - if ( jQuery.css( elem, "float" ) === "none" ) { - - // Restore the original display value at the end of pure show/hide animations - if ( !propTween ) { - anim.done( function() { - style.display = restoreDisplay; - } ); - if ( restoreDisplay == null ) { - display = style.display; - restoreDisplay = display === "none" ? "" : display; - } - } - style.display = "inline-block"; - } - } - } - - if ( opts.overflow ) { - style.overflow = "hidden"; - anim.always( function() { - style.overflow = opts.overflow[ 0 ]; - style.overflowX = opts.overflow[ 1 ]; - style.overflowY = opts.overflow[ 2 ]; - } ); - } - - // Implement show/hide animations - propTween = false; - for ( prop in orig ) { - - // General show/hide setup for this element animation - if ( !propTween ) { - if ( dataShow ) { - if ( "hidden" in dataShow ) { - hidden = dataShow.hidden; - } - } else { - dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); - } - - // Store hidden/visible for toggle so `.stop().toggle()` "reverses" - if ( toggle ) { - dataShow.hidden = !hidden; - } - - // Show elements before animating them - if ( hidden ) { - showHide( [ elem ], true ); - } - - /* eslint-disable no-loop-func */ - - anim.done( function() { - - /* eslint-enable no-loop-func */ - - // The final step of a "hide" animation is actually hiding the element - if ( !hidden ) { - showHide( [ elem ] ); - } - dataPriv.remove( elem, "fxshow" ); - for ( prop in orig ) { - jQuery.style( elem, prop, orig[ prop ] ); - } - } ); - } - - // Per-property setup - propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); - if ( !( prop in dataShow ) ) { - dataShow[ prop ] = propTween.start; - if ( hidden ) { - propTween.end = propTween.start; - propTween.start = 0; - } - } - } -} - -function propFilter( props, specialEasing ) { - var index, name, easing, value, hooks; - - // camelCase, specialEasing and expand cssHook pass - for ( index in props ) { - name = camelCase( index ); - easing = specialEasing[ name ]; - value = props[ index ]; - if ( Array.isArray( value ) ) { - easing = value[ 1 ]; - value = props[ index ] = value[ 0 ]; - } - - if ( index !== name ) { - props[ name ] = value; - delete props[ index ]; - } - - hooks = jQuery.cssHooks[ name ]; - if ( hooks && "expand" in hooks ) { - value = hooks.expand( value ); - delete props[ name ]; - - // Not quite $.extend, this won't overwrite existing keys. - // Reusing 'index' because we have the correct "name" - for ( index in value ) { - if ( !( index in props ) ) { - props[ index ] = value[ index ]; - specialEasing[ index ] = easing; - } - } - } else { - specialEasing[ name ] = easing; - } - } -} - -function Animation( elem, properties, options ) { - var result, - stopped, - index = 0, - length = Animation.prefilters.length, - deferred = jQuery.Deferred().always( function() { - - // Don't match elem in the :animated selector - delete tick.elem; - } ), - tick = function() { - if ( stopped ) { - return false; - } - var currentTime = fxNow || createFxNow(), - remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), - - // Support: Android 2.3 only - // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) - temp = remaining / animation.duration || 0, - percent = 1 - temp, - index = 0, - length = animation.tweens.length; - - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( percent ); - } - - deferred.notifyWith( elem, [ animation, percent, remaining ] ); - - // If there's more to do, yield - if ( percent < 1 && length ) { - return remaining; - } - - // If this was an empty animation, synthesize a final progress notification - if ( !length ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - } - - // Resolve the animation and report its conclusion - deferred.resolveWith( elem, [ animation ] ); - return false; - }, - animation = deferred.promise( { - elem: elem, - props: jQuery.extend( {}, properties ), - opts: jQuery.extend( true, { - specialEasing: {}, - easing: jQuery.easing._default - }, options ), - originalProperties: properties, - originalOptions: options, - startTime: fxNow || createFxNow(), - duration: options.duration, - tweens: [], - createTween: function( prop, end ) { - var tween = jQuery.Tween( elem, animation.opts, prop, end, - animation.opts.specialEasing[ prop ] || animation.opts.easing ); - animation.tweens.push( tween ); - return tween; - }, - stop: function( gotoEnd ) { - var index = 0, - - // If we are going to the end, we want to run all the tweens - // otherwise we skip this part - length = gotoEnd ? animation.tweens.length : 0; - if ( stopped ) { - return this; - } - stopped = true; - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( 1 ); - } - - // Resolve when we played the last frame; otherwise, reject - if ( gotoEnd ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - deferred.resolveWith( elem, [ animation, gotoEnd ] ); - } else { - deferred.rejectWith( elem, [ animation, gotoEnd ] ); - } - return this; - } - } ), - props = animation.props; - - propFilter( props, animation.opts.specialEasing ); - - for ( ; index < length; index++ ) { - result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); - if ( result ) { - if ( isFunction( result.stop ) ) { - jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = - result.stop.bind( result ); - } - return result; - } - } - - jQuery.map( props, createTween, animation ); - - if ( isFunction( animation.opts.start ) ) { - animation.opts.start.call( elem, animation ); - } - - // Attach callbacks from options - animation - .progress( animation.opts.progress ) - .done( animation.opts.done, animation.opts.complete ) - .fail( animation.opts.fail ) - .always( animation.opts.always ); - - jQuery.fx.timer( - jQuery.extend( tick, { - elem: elem, - anim: animation, - queue: animation.opts.queue - } ) - ); - - return animation; -} - -jQuery.Animation = jQuery.extend( Animation, { - - tweeners: { - "*": [ function( prop, value ) { - var tween = this.createTween( prop, value ); - adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); - return tween; - } ] - }, - - tweener: function( props, callback ) { - if ( isFunction( props ) ) { - callback = props; - props = [ "*" ]; - } else { - props = props.match( rnothtmlwhite ); - } - - var prop, - index = 0, - length = props.length; - - for ( ; index < length; index++ ) { - prop = props[ index ]; - Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; - Animation.tweeners[ prop ].unshift( callback ); - } - }, - - prefilters: [ defaultPrefilter ], - - prefilter: function( callback, prepend ) { - if ( prepend ) { - Animation.prefilters.unshift( callback ); - } else { - Animation.prefilters.push( callback ); - } - } -} ); - -jQuery.speed = function( speed, easing, fn ) { - var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { - complete: fn || !fn && easing || - isFunction( speed ) && speed, - duration: speed, - easing: fn && easing || easing && !isFunction( easing ) && easing - }; - - // Go to the end state if fx are off - if ( jQuery.fx.off ) { - opt.duration = 0; - - } else { - if ( typeof opt.duration !== "number" ) { - if ( opt.duration in jQuery.fx.speeds ) { - opt.duration = jQuery.fx.speeds[ opt.duration ]; - - } else { - opt.duration = jQuery.fx.speeds._default; - } - } - } - - // Normalize opt.queue - true/undefined/null -> "fx" - if ( opt.queue == null || opt.queue === true ) { - opt.queue = "fx"; - } - - // Queueing - opt.old = opt.complete; - - opt.complete = function() { - if ( isFunction( opt.old ) ) { - opt.old.call( this ); - } - - if ( opt.queue ) { - jQuery.dequeue( this, opt.queue ); - } - }; - - return opt; -}; - -jQuery.fn.extend( { - fadeTo: function( speed, to, easing, callback ) { - - // Show any hidden elements after setting opacity to 0 - return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() - - // Animate to the value specified - .end().animate( { opacity: to }, speed, easing, callback ); - }, - animate: function( prop, speed, easing, callback ) { - var empty = jQuery.isEmptyObject( prop ), - optall = jQuery.speed( speed, easing, callback ), - doAnimation = function() { - - // Operate on a copy of prop so per-property easing won't be lost - var anim = Animation( this, jQuery.extend( {}, prop ), optall ); - - // Empty animations, or finishing resolves immediately - if ( empty || dataPriv.get( this, "finish" ) ) { - anim.stop( true ); - } - }; - doAnimation.finish = doAnimation; - - return empty || optall.queue === false ? - this.each( doAnimation ) : - this.queue( optall.queue, doAnimation ); - }, - stop: function( type, clearQueue, gotoEnd ) { - var stopQueue = function( hooks ) { - var stop = hooks.stop; - delete hooks.stop; - stop( gotoEnd ); - }; - - if ( typeof type !== "string" ) { - gotoEnd = clearQueue; - clearQueue = type; - type = undefined; - } - if ( clearQueue ) { - this.queue( type || "fx", [] ); - } - - return this.each( function() { - var dequeue = true, - index = type != null && type + "queueHooks", - timers = jQuery.timers, - data = dataPriv.get( this ); - - if ( index ) { - if ( data[ index ] && data[ index ].stop ) { - stopQueue( data[ index ] ); - } - } else { - for ( index in data ) { - if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { - stopQueue( data[ index ] ); - } - } - } - - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && - ( type == null || timers[ index ].queue === type ) ) { - - timers[ index ].anim.stop( gotoEnd ); - dequeue = false; - timers.splice( index, 1 ); - } - } - - // Start the next in the queue if the last step wasn't forced. - // Timers currently will call their complete callbacks, which - // will dequeue but only if they were gotoEnd. - if ( dequeue || !gotoEnd ) { - jQuery.dequeue( this, type ); - } - } ); - }, - finish: function( type ) { - if ( type !== false ) { - type = type || "fx"; - } - return this.each( function() { - var index, - data = dataPriv.get( this ), - queue = data[ type + "queue" ], - hooks = data[ type + "queueHooks" ], - timers = jQuery.timers, - length = queue ? queue.length : 0; - - // Enable finishing flag on private data - data.finish = true; - - // Empty the queue first - jQuery.queue( this, type, [] ); - - if ( hooks && hooks.stop ) { - hooks.stop.call( this, true ); - } - - // Look for any active animations, and finish them - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && timers[ index ].queue === type ) { - timers[ index ].anim.stop( true ); - timers.splice( index, 1 ); - } - } - - // Look for any animations in the old queue and finish them - for ( index = 0; index < length; index++ ) { - if ( queue[ index ] && queue[ index ].finish ) { - queue[ index ].finish.call( this ); - } - } - - // Turn off finishing flag - delete data.finish; - } ); - } -} ); - -jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) { - var cssFn = jQuery.fn[ name ]; - jQuery.fn[ name ] = function( speed, easing, callback ) { - return speed == null || typeof speed === "boolean" ? - cssFn.apply( this, arguments ) : - this.animate( genFx( name, true ), speed, easing, callback ); - }; -} ); - -// Generate shortcuts for custom animations -jQuery.each( { - slideDown: genFx( "show" ), - slideUp: genFx( "hide" ), - slideToggle: genFx( "toggle" ), - fadeIn: { opacity: "show" }, - fadeOut: { opacity: "hide" }, - fadeToggle: { opacity: "toggle" } -}, function( name, props ) { - jQuery.fn[ name ] = function( speed, easing, callback ) { - return this.animate( props, speed, easing, callback ); - }; -} ); - -jQuery.timers = []; -jQuery.fx.tick = function() { - var timer, - i = 0, - timers = jQuery.timers; - - fxNow = Date.now(); - - for ( ; i < timers.length; i++ ) { - timer = timers[ i ]; - - // Run the timer and safely remove it when done (allowing for external removal) - if ( !timer() && timers[ i ] === timer ) { - timers.splice( i--, 1 ); - } - } - - if ( !timers.length ) { - jQuery.fx.stop(); - } - fxNow = undefined; -}; - -jQuery.fx.timer = function( timer ) { - jQuery.timers.push( timer ); - jQuery.fx.start(); -}; - -jQuery.fx.interval = 13; -jQuery.fx.start = function() { - if ( inProgress ) { - return; - } - - inProgress = true; - schedule(); -}; - -jQuery.fx.stop = function() { - inProgress = null; -}; - -jQuery.fx.speeds = { - slow: 600, - fast: 200, - - // Default speed - _default: 400 -}; - - -// Based off of the plugin by Clint Helfers, with permission. -// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ -jQuery.fn.delay = function( time, type ) { - time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; - type = type || "fx"; - - return this.queue( type, function( next, hooks ) { - var timeout = window.setTimeout( next, time ); - hooks.stop = function() { - window.clearTimeout( timeout ); - }; - } ); -}; - - -( function() { - var input = document.createElement( "input" ), - select = document.createElement( "select" ), - opt = select.appendChild( document.createElement( "option" ) ); - - input.type = "checkbox"; - - // Support: Android <=4.3 only - // Default value for a checkbox should be "on" - support.checkOn = input.value !== ""; - - // Support: IE <=11 only - // Must access selectedIndex to make default options select - support.optSelected = opt.selected; - - // Support: IE <=11 only - // An input loses its value after becoming a radio - input = document.createElement( "input" ); - input.value = "t"; - input.type = "radio"; - support.radioValue = input.value === "t"; -} )(); - - -var boolHook, - attrHandle = jQuery.expr.attrHandle; - -jQuery.fn.extend( { - attr: function( name, value ) { - return access( this, jQuery.attr, name, value, arguments.length > 1 ); - }, - - removeAttr: function( name ) { - return this.each( function() { - jQuery.removeAttr( this, name ); - } ); - } -} ); - -jQuery.extend( { - attr: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set attributes on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - // Fallback to prop when attributes are not supported - if ( typeof elem.getAttribute === "undefined" ) { - return jQuery.prop( elem, name, value ); - } - - // Attribute hooks are determined by the lowercase version - // Grab necessary hook if one is defined - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - hooks = jQuery.attrHooks[ name.toLowerCase() ] || - ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); - } - - if ( value !== undefined ) { - if ( value === null ) { - jQuery.removeAttr( elem, name ); - return; - } - - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - elem.setAttribute( name, value + "" ); - return value; - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - ret = jQuery.find.attr( elem, name ); - - // Non-existent attributes return null, we normalize to undefined - return ret == null ? undefined : ret; - }, - - attrHooks: { - type: { - set: function( elem, value ) { - if ( !support.radioValue && value === "radio" && - nodeName( elem, "input" ) ) { - var val = elem.value; - elem.setAttribute( "type", value ); - if ( val ) { - elem.value = val; - } - return value; - } - } - } - }, - - removeAttr: function( elem, value ) { - var name, - i = 0, - - // Attribute names can contain non-HTML whitespace characters - // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 - attrNames = value && value.match( rnothtmlwhite ); - - if ( attrNames && elem.nodeType === 1 ) { - while ( ( name = attrNames[ i++ ] ) ) { - elem.removeAttribute( name ); - } - } - } -} ); - -// Hooks for boolean attributes -boolHook = { - set: function( elem, value, name ) { - if ( value === false ) { - - // Remove boolean attributes when set to false - jQuery.removeAttr( elem, name ); - } else { - elem.setAttribute( name, name ); - } - return name; - } -}; - -jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) { - var getter = attrHandle[ name ] || jQuery.find.attr; - - attrHandle[ name ] = function( elem, name, isXML ) { - var ret, handle, - lowercaseName = name.toLowerCase(); - - if ( !isXML ) { - - // Avoid an infinite loop by temporarily removing this function from the getter - handle = attrHandle[ lowercaseName ]; - attrHandle[ lowercaseName ] = ret; - ret = getter( elem, name, isXML ) != null ? - lowercaseName : - null; - attrHandle[ lowercaseName ] = handle; - } - return ret; - }; -} ); - - - - -var rfocusable = /^(?:input|select|textarea|button)$/i, - rclickable = /^(?:a|area)$/i; - -jQuery.fn.extend( { - prop: function( name, value ) { - return access( this, jQuery.prop, name, value, arguments.length > 1 ); - }, - - removeProp: function( name ) { - return this.each( function() { - delete this[ jQuery.propFix[ name ] || name ]; - } ); - } -} ); - -jQuery.extend( { - prop: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set properties on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - - // Fix name and attach hooks - name = jQuery.propFix[ name ] || name; - hooks = jQuery.propHooks[ name ]; - } - - if ( value !== undefined ) { - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - return ( elem[ name ] = value ); - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - return elem[ name ]; - }, - - propHooks: { - tabIndex: { - get: function( elem ) { - - // Support: IE <=9 - 11 only - // elem.tabIndex doesn't always return the - // correct value when it hasn't been explicitly set - // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ - // Use proper attribute retrieval(#12072) - var tabindex = jQuery.find.attr( elem, "tabindex" ); - - if ( tabindex ) { - return parseInt( tabindex, 10 ); - } - - if ( - rfocusable.test( elem.nodeName ) || - rclickable.test( elem.nodeName ) && - elem.href - ) { - return 0; - } - - return -1; - } - } - }, - - propFix: { - "for": "htmlFor", - "class": "className" - } -} ); - -// Support: IE <=11 only -// Accessing the selectedIndex property -// forces the browser to respect setting selected -// on the option -// The getter ensures a default option is selected -// when in an optgroup -// eslint rule "no-unused-expressions" is disabled for this code -// since it considers such accessions noop -if ( !support.optSelected ) { - jQuery.propHooks.selected = { - get: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent && parent.parentNode ) { - parent.parentNode.selectedIndex; - } - return null; - }, - set: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent ) { - parent.selectedIndex; - - if ( parent.parentNode ) { - parent.parentNode.selectedIndex; - } - } - } - }; -} - -jQuery.each( [ - "tabIndex", - "readOnly", - "maxLength", - "cellSpacing", - "cellPadding", - "rowSpan", - "colSpan", - "useMap", - "frameBorder", - "contentEditable" -], function() { - jQuery.propFix[ this.toLowerCase() ] = this; -} ); - - - - - // Strip and collapse whitespace according to HTML spec - // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace - function stripAndCollapse( value ) { - var tokens = value.match( rnothtmlwhite ) || []; - return tokens.join( " " ); - } - - -function getClass( elem ) { - return elem.getAttribute && elem.getAttribute( "class" ) || ""; -} - -function classesToArray( value ) { - if ( Array.isArray( value ) ) { - return value; - } - if ( typeof value === "string" ) { - return value.match( rnothtmlwhite ) || []; - } - return []; -} - -jQuery.fn.extend( { - addClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - classes = classesToArray( value ); - - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - if ( cur.indexOf( " " + clazz + " " ) < 0 ) { - cur += clazz + " "; - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - removeClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - if ( !arguments.length ) { - return this.attr( "class", "" ); - } - - classes = classesToArray( value ); - - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - - // This expression is here for better compressibility (see addClass) - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - - // Remove *all* instances - while ( cur.indexOf( " " + clazz + " " ) > -1 ) { - cur = cur.replace( " " + clazz + " ", " " ); - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - toggleClass: function( value, stateVal ) { - var type = typeof value, - isValidValue = type === "string" || Array.isArray( value ); - - if ( typeof stateVal === "boolean" && isValidValue ) { - return stateVal ? this.addClass( value ) : this.removeClass( value ); - } - - if ( isFunction( value ) ) { - return this.each( function( i ) { - jQuery( this ).toggleClass( - value.call( this, i, getClass( this ), stateVal ), - stateVal - ); - } ); - } - - return this.each( function() { - var className, i, self, classNames; - - if ( isValidValue ) { - - // Toggle individual class names - i = 0; - self = jQuery( this ); - classNames = classesToArray( value ); - - while ( ( className = classNames[ i++ ] ) ) { - - // Check each className given, space separated list - if ( self.hasClass( className ) ) { - self.removeClass( className ); - } else { - self.addClass( className ); - } - } - - // Toggle whole class name - } else if ( value === undefined || type === "boolean" ) { - className = getClass( this ); - if ( className ) { - - // Store className if set - dataPriv.set( this, "__className__", className ); - } - - // If the element has a class name or if we're passed `false`, - // then remove the whole classname (if there was one, the above saved it). - // Otherwise bring back whatever was previously saved (if anything), - // falling back to the empty string if nothing was stored. - if ( this.setAttribute ) { - this.setAttribute( "class", - className || value === false ? - "" : - dataPriv.get( this, "__className__" ) || "" - ); - } - } - } ); - }, - - hasClass: function( selector ) { - var className, elem, - i = 0; - - className = " " + selector + " "; - while ( ( elem = this[ i++ ] ) ) { - if ( elem.nodeType === 1 && - ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { - return true; - } - } - - return false; - } -} ); - - - - -var rreturn = /\r/g; - -jQuery.fn.extend( { - val: function( value ) { - var hooks, ret, valueIsFunction, - elem = this[ 0 ]; - - if ( !arguments.length ) { - if ( elem ) { - hooks = jQuery.valHooks[ elem.type ] || - jQuery.valHooks[ elem.nodeName.toLowerCase() ]; - - if ( hooks && - "get" in hooks && - ( ret = hooks.get( elem, "value" ) ) !== undefined - ) { - return ret; - } - - ret = elem.value; - - // Handle most common string cases - if ( typeof ret === "string" ) { - return ret.replace( rreturn, "" ); - } - - // Handle cases where value is null/undef or number - return ret == null ? "" : ret; - } - - return; - } - - valueIsFunction = isFunction( value ); - - return this.each( function( i ) { - var val; - - if ( this.nodeType !== 1 ) { - return; - } - - if ( valueIsFunction ) { - val = value.call( this, i, jQuery( this ).val() ); - } else { - val = value; - } - - // Treat null/undefined as ""; convert numbers to string - if ( val == null ) { - val = ""; - - } else if ( typeof val === "number" ) { - val += ""; - - } else if ( Array.isArray( val ) ) { - val = jQuery.map( val, function( value ) { - return value == null ? "" : value + ""; - } ); - } - - hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; - - // If set returns undefined, fall back to normal setting - if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { - this.value = val; - } - } ); - } -} ); - -jQuery.extend( { - valHooks: { - option: { - get: function( elem ) { - - var val = jQuery.find.attr( elem, "value" ); - return val != null ? - val : - - // Support: IE <=10 - 11 only - // option.text throws exceptions (#14686, #14858) - // Strip and collapse whitespace - // https://html.spec.whatwg.org/#strip-and-collapse-whitespace - stripAndCollapse( jQuery.text( elem ) ); - } - }, - select: { - get: function( elem ) { - var value, option, i, - options = elem.options, - index = elem.selectedIndex, - one = elem.type === "select-one", - values = one ? null : [], - max = one ? index + 1 : options.length; - - if ( index < 0 ) { - i = max; - - } else { - i = one ? index : 0; - } - - // Loop through all the selected options - for ( ; i < max; i++ ) { - option = options[ i ]; - - // Support: IE <=9 only - // IE8-9 doesn't update selected after form reset (#2551) - if ( ( option.selected || i === index ) && - - // Don't return options that are disabled or in a disabled optgroup - !option.disabled && - ( !option.parentNode.disabled || - !nodeName( option.parentNode, "optgroup" ) ) ) { - - // Get the specific value for the option - value = jQuery( option ).val(); - - // We don't need an array for one selects - if ( one ) { - return value; - } - - // Multi-Selects return an array - values.push( value ); - } - } - - return values; - }, - - set: function( elem, value ) { - var optionSet, option, - options = elem.options, - values = jQuery.makeArray( value ), - i = options.length; - - while ( i-- ) { - option = options[ i ]; - - /* eslint-disable no-cond-assign */ - - if ( option.selected = - jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 - ) { - optionSet = true; - } - - /* eslint-enable no-cond-assign */ - } - - // Force browsers to behave consistently when non-matching value is set - if ( !optionSet ) { - elem.selectedIndex = -1; - } - return values; - } - } - } -} ); - -// Radios and checkboxes getter/setter -jQuery.each( [ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = { - set: function( elem, value ) { - if ( Array.isArray( value ) ) { - return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); - } - } - }; - if ( !support.checkOn ) { - jQuery.valHooks[ this ].get = function( elem ) { - return elem.getAttribute( "value" ) === null ? "on" : elem.value; - }; - } -} ); - - - - -// Return jQuery for attributes-only inclusion - - -support.focusin = "onfocusin" in window; - - -var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, - stopPropagationCallback = function( e ) { - e.stopPropagation(); - }; - -jQuery.extend( jQuery.event, { - - trigger: function( event, data, elem, onlyHandlers ) { - - var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, - eventPath = [ elem || document ], - type = hasOwn.call( event, "type" ) ? event.type : event, - namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; - - cur = lastElement = tmp = elem = elem || document; - - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } - - if ( type.indexOf( "." ) > -1 ) { - - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split( "." ); - type = namespaces.shift(); - namespaces.sort(); - } - ontype = type.indexOf( ":" ) < 0 && "on" + type; - - // Caller can pass in a jQuery.Event object, Object, or just an event type string - event = event[ jQuery.expando ] ? - event : - new jQuery.Event( type, typeof event === "object" && event ); - - // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) - event.isTrigger = onlyHandlers ? 2 : 3; - event.namespace = namespaces.join( "." ); - event.rnamespace = event.namespace ? - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : - null; - - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data == null ? - [ event ] : - jQuery.makeArray( data, [ event ] ); - - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { - - bubbleType = special.delegateType || type; - if ( !rfocusMorph.test( bubbleType + type ) ) { - cur = cur.parentNode; - } - for ( ; cur; cur = cur.parentNode ) { - eventPath.push( cur ); - tmp = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( tmp === ( elem.ownerDocument || document ) ) { - eventPath.push( tmp.defaultView || tmp.parentWindow || window ); - } - } - - // Fire handlers on the event path - i = 0; - while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { - lastElement = cur; - event.type = i > 1 ? - bubbleType : - special.bindType || type; - - // jQuery handler - handle = ( - dataPriv.get( cur, "events" ) || Object.create( null ) - )[ event.type ] && - dataPriv.get( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - - // Native handler - handle = ontype && cur[ ontype ]; - if ( handle && handle.apply && acceptData( cur ) ) { - event.result = handle.apply( cur, data ); - if ( event.result === false ) { - event.preventDefault(); - } - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( ( !special._default || - special._default.apply( eventPath.pop(), data ) === false ) && - acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name as the event. - // Don't do default actions on window, that's where global variables be (#6170) - if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - tmp = elem[ ontype ]; - - if ( tmp ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - - if ( event.isPropagationStopped() ) { - lastElement.addEventListener( type, stopPropagationCallback ); - } - - elem[ type ](); - - if ( event.isPropagationStopped() ) { - lastElement.removeEventListener( type, stopPropagationCallback ); - } - - jQuery.event.triggered = undefined; - - if ( tmp ) { - elem[ ontype ] = tmp; - } - } - } - } - - return event.result; - }, - - // Piggyback on a donor event to simulate a different one - // Used only for `focus(in | out)` events - simulate: function( type, elem, event ) { - var e = jQuery.extend( - new jQuery.Event(), - event, - { - type: type, - isSimulated: true - } - ); - - jQuery.event.trigger( e, null, elem ); - } - -} ); - -jQuery.fn.extend( { - - trigger: function( type, data ) { - return this.each( function() { - jQuery.event.trigger( type, data, this ); - } ); - }, - triggerHandler: function( type, data ) { - var elem = this[ 0 ]; - if ( elem ) { - return jQuery.event.trigger( type, data, elem, true ); - } - } -} ); - - -// Support: Firefox <=44 -// Firefox doesn't have focus(in | out) events -// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 -// -// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 -// focus(in | out) events fire after focus & blur events, -// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order -// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 -if ( !support.focusin ) { - jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler on the document while someone wants focusin/focusout - var handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); - }; - - jQuery.event.special[ fix ] = { - setup: function() { - - // Handle: regular nodes (via `this.ownerDocument`), window - // (via `this.document`) & document (via `this`). - var doc = this.ownerDocument || this.document || this, - attaches = dataPriv.access( doc, fix ); - - if ( !attaches ) { - doc.addEventListener( orig, handler, true ); - } - dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); - }, - teardown: function() { - var doc = this.ownerDocument || this.document || this, - attaches = dataPriv.access( doc, fix ) - 1; - - if ( !attaches ) { - doc.removeEventListener( orig, handler, true ); - dataPriv.remove( doc, fix ); - - } else { - dataPriv.access( doc, fix, attaches ); - } - } - }; - } ); -} -var location = window.location; - -var nonce = { guid: Date.now() }; - -var rquery = ( /\?/ ); - - - -// Cross-browser xml parsing -jQuery.parseXML = function( data ) { - var xml; - if ( !data || typeof data !== "string" ) { - return null; - } - - // Support: IE 9 - 11 only - // IE throws on parseFromString with invalid input. - try { - xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); - } catch ( e ) { - xml = undefined; - } - - if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { - jQuery.error( "Invalid XML: " + data ); - } - return xml; -}; - - -var - rbracket = /\[\]$/, - rCRLF = /\r?\n/g, - rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, - rsubmittable = /^(?:input|select|textarea|keygen)/i; - -function buildParams( prefix, obj, traditional, add ) { - var name; - - if ( Array.isArray( obj ) ) { - - // Serialize array item. - jQuery.each( obj, function( i, v ) { - if ( traditional || rbracket.test( prefix ) ) { - - // Treat each array item as a scalar. - add( prefix, v ); - - } else { - - // Item is non-scalar (array or object), encode its numeric index. - buildParams( - prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", - v, - traditional, - add - ); - } - } ); - - } else if ( !traditional && toType( obj ) === "object" ) { - - // Serialize object item. - for ( name in obj ) { - buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); - } - - } else { - - // Serialize scalar item. - add( prefix, obj ); - } -} - -// Serialize an array of form elements or a set of -// key/values into a query string -jQuery.param = function( a, traditional ) { - var prefix, - s = [], - add = function( key, valueOrFunction ) { - - // If value is a function, invoke it and use its return value - var value = isFunction( valueOrFunction ) ? - valueOrFunction() : - valueOrFunction; - - s[ s.length ] = encodeURIComponent( key ) + "=" + - encodeURIComponent( value == null ? "" : value ); - }; - - if ( a == null ) { - return ""; - } - - // If an array was passed in, assume that it is an array of form elements. - if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { - - // Serialize the form elements - jQuery.each( a, function() { - add( this.name, this.value ); - } ); - - } else { - - // If traditional, encode the "old" way (the way 1.3.2 or older - // did it), otherwise encode params recursively. - for ( prefix in a ) { - buildParams( prefix, a[ prefix ], traditional, add ); - } - } - - // Return the resulting serialization - return s.join( "&" ); -}; - -jQuery.fn.extend( { - serialize: function() { - return jQuery.param( this.serializeArray() ); - }, - serializeArray: function() { - return this.map( function() { - - // Can add propHook for "elements" to filter or add form elements - var elements = jQuery.prop( this, "elements" ); - return elements ? jQuery.makeArray( elements ) : this; - } ) - .filter( function() { - var type = this.type; - - // Use .is( ":disabled" ) so that fieldset[disabled] works - return this.name && !jQuery( this ).is( ":disabled" ) && - rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && - ( this.checked || !rcheckableType.test( type ) ); - } ) - .map( function( _i, elem ) { - var val = jQuery( this ).val(); - - if ( val == null ) { - return null; - } - - if ( Array.isArray( val ) ) { - return jQuery.map( val, function( val ) { - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ); - } - - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ).get(); - } -} ); - - -var - r20 = /%20/g, - rhash = /#.*$/, - rantiCache = /([?&])_=[^&]*/, - rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, - - // #7653, #8125, #8152: local protocol detection - rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, - rnoContent = /^(?:GET|HEAD)$/, - rprotocol = /^\/\//, - - /* Prefilters - * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) - * 2) These are called: - * - BEFORE asking for a transport - * - AFTER param serialization (s.data is a string if s.processData is true) - * 3) key is the dataType - * 4) the catchall symbol "*" can be used - * 5) execution will start with transport dataType and THEN continue down to "*" if needed - */ - prefilters = {}, - - /* Transports bindings - * 1) key is the dataType - * 2) the catchall symbol "*" can be used - * 3) selection will start with transport dataType and THEN go to "*" if needed - */ - transports = {}, - - // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression - allTypes = "*/".concat( "*" ), - - // Anchor tag for parsing the document origin - originAnchor = document.createElement( "a" ); - originAnchor.href = location.href; - -// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport -function addToPrefiltersOrTransports( structure ) { - - // dataTypeExpression is optional and defaults to "*" - return function( dataTypeExpression, func ) { - - if ( typeof dataTypeExpression !== "string" ) { - func = dataTypeExpression; - dataTypeExpression = "*"; - } - - var dataType, - i = 0, - dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; - - if ( isFunction( func ) ) { - - // For each dataType in the dataTypeExpression - while ( ( dataType = dataTypes[ i++ ] ) ) { - - // Prepend if requested - if ( dataType[ 0 ] === "+" ) { - dataType = dataType.slice( 1 ) || "*"; - ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); - - // Otherwise append - } else { - ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); - } - } - } - }; -} - -// Base inspection function for prefilters and transports -function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { - - var inspected = {}, - seekingTransport = ( structure === transports ); - - function inspect( dataType ) { - var selected; - inspected[ dataType ] = true; - jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { - var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); - if ( typeof dataTypeOrTransport === "string" && - !seekingTransport && !inspected[ dataTypeOrTransport ] ) { - - options.dataTypes.unshift( dataTypeOrTransport ); - inspect( dataTypeOrTransport ); - return false; - } else if ( seekingTransport ) { - return !( selected = dataTypeOrTransport ); - } - } ); - return selected; - } - - return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); -} - -// A special extend for ajax options -// that takes "flat" options (not to be deep extended) -// Fixes #9887 -function ajaxExtend( target, src ) { - var key, deep, - flatOptions = jQuery.ajaxSettings.flatOptions || {}; - - for ( key in src ) { - if ( src[ key ] !== undefined ) { - ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; - } - } - if ( deep ) { - jQuery.extend( true, target, deep ); - } - - return target; -} - -/* Handles responses to an ajax request: - * - finds the right dataType (mediates between content-type and expected dataType) - * - returns the corresponding response - */ -function ajaxHandleResponses( s, jqXHR, responses ) { - - var ct, type, finalDataType, firstDataType, - contents = s.contents, - dataTypes = s.dataTypes; - - // Remove auto dataType and get content-type in the process - while ( dataTypes[ 0 ] === "*" ) { - dataTypes.shift(); - if ( ct === undefined ) { - ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); - } - } - - // Check if we're dealing with a known content-type - if ( ct ) { - for ( type in contents ) { - if ( contents[ type ] && contents[ type ].test( ct ) ) { - dataTypes.unshift( type ); - break; - } - } - } - - // Check to see if we have a response for the expected dataType - if ( dataTypes[ 0 ] in responses ) { - finalDataType = dataTypes[ 0 ]; - } else { - - // Try convertible dataTypes - for ( type in responses ) { - if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { - finalDataType = type; - break; - } - if ( !firstDataType ) { - firstDataType = type; - } - } - - // Or just use first one - finalDataType = finalDataType || firstDataType; - } - - // If we found a dataType - // We add the dataType to the list if needed - // and return the corresponding response - if ( finalDataType ) { - if ( finalDataType !== dataTypes[ 0 ] ) { - dataTypes.unshift( finalDataType ); - } - return responses[ finalDataType ]; - } -} - -/* Chain conversions given the request and the original response - * Also sets the responseXXX fields on the jqXHR instance - */ -function ajaxConvert( s, response, jqXHR, isSuccess ) { - var conv2, current, conv, tmp, prev, - converters = {}, - - // Work with a copy of dataTypes in case we need to modify it for conversion - dataTypes = s.dataTypes.slice(); - - // Create converters map with lowercased keys - if ( dataTypes[ 1 ] ) { - for ( conv in s.converters ) { - converters[ conv.toLowerCase() ] = s.converters[ conv ]; - } - } - - current = dataTypes.shift(); - - // Convert to each sequential dataType - while ( current ) { - - if ( s.responseFields[ current ] ) { - jqXHR[ s.responseFields[ current ] ] = response; - } - - // Apply the dataFilter if provided - if ( !prev && isSuccess && s.dataFilter ) { - response = s.dataFilter( response, s.dataType ); - } - - prev = current; - current = dataTypes.shift(); - - if ( current ) { - - // There's only work to do if current dataType is non-auto - if ( current === "*" ) { - - current = prev; - - // Convert response if prev dataType is non-auto and differs from current - } else if ( prev !== "*" && prev !== current ) { - - // Seek a direct converter - conv = converters[ prev + " " + current ] || converters[ "* " + current ]; - - // If none found, seek a pair - if ( !conv ) { - for ( conv2 in converters ) { - - // If conv2 outputs current - tmp = conv2.split( " " ); - if ( tmp[ 1 ] === current ) { - - // If prev can be converted to accepted input - conv = converters[ prev + " " + tmp[ 0 ] ] || - converters[ "* " + tmp[ 0 ] ]; - if ( conv ) { - - // Condense equivalence converters - if ( conv === true ) { - conv = converters[ conv2 ]; - - // Otherwise, insert the intermediate dataType - } else if ( converters[ conv2 ] !== true ) { - current = tmp[ 0 ]; - dataTypes.unshift( tmp[ 1 ] ); - } - break; - } - } - } - } - - // Apply converter (if not an equivalence) - if ( conv !== true ) { - - // Unless errors are allowed to bubble, catch and return them - if ( conv && s.throws ) { - response = conv( response ); - } else { - try { - response = conv( response ); - } catch ( e ) { - return { - state: "parsererror", - error: conv ? e : "No conversion from " + prev + " to " + current - }; - } - } - } - } - } - } - - return { state: "success", data: response }; -} - -jQuery.extend( { - - // Counter for holding the number of active queries - active: 0, - - // Last-Modified header cache for next request - lastModified: {}, - etag: {}, - - ajaxSettings: { - url: location.href, - type: "GET", - isLocal: rlocalProtocol.test( location.protocol ), - global: true, - processData: true, - async: true, - contentType: "application/x-www-form-urlencoded; charset=UTF-8", - - /* - timeout: 0, - data: null, - dataType: null, - username: null, - password: null, - cache: null, - throws: false, - traditional: false, - headers: {}, - */ - - accepts: { - "*": allTypes, - text: "text/plain", - html: "text/html", - xml: "application/xml, text/xml", - json: "application/json, text/javascript" - }, - - contents: { - xml: /\bxml\b/, - html: /\bhtml/, - json: /\bjson\b/ - }, - - responseFields: { - xml: "responseXML", - text: "responseText", - json: "responseJSON" - }, - - // Data converters - // Keys separate source (or catchall "*") and destination types with a single space - converters: { - - // Convert anything to text - "* text": String, - - // Text to html (true = no transformation) - "text html": true, - - // Evaluate text as a json expression - "text json": JSON.parse, - - // Parse text as xml - "text xml": jQuery.parseXML - }, - - // For options that shouldn't be deep extended: - // you can add your own custom options here if - // and when you create one that shouldn't be - // deep extended (see ajaxExtend) - flatOptions: { - url: true, - context: true - } - }, - - // Creates a full fledged settings object into target - // with both ajaxSettings and settings fields. - // If target is omitted, writes into ajaxSettings. - ajaxSetup: function( target, settings ) { - return settings ? - - // Building a settings object - ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : - - // Extending ajaxSettings - ajaxExtend( jQuery.ajaxSettings, target ); - }, - - ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), - ajaxTransport: addToPrefiltersOrTransports( transports ), - - // Main method - ajax: function( url, options ) { - - // If url is an object, simulate pre-1.5 signature - if ( typeof url === "object" ) { - options = url; - url = undefined; - } - - // Force options to be an object - options = options || {}; - - var transport, - - // URL without anti-cache param - cacheURL, - - // Response headers - responseHeadersString, - responseHeaders, - - // timeout handle - timeoutTimer, - - // Url cleanup var - urlAnchor, - - // Request state (becomes false upon send and true upon completion) - completed, - - // To know if global events are to be dispatched - fireGlobals, - - // Loop variable - i, - - // uncached part of the url - uncached, - - // Create the final options object - s = jQuery.ajaxSetup( {}, options ), - - // Callbacks context - callbackContext = s.context || s, - - // Context for global events is callbackContext if it is a DOM node or jQuery collection - globalEventContext = s.context && - ( callbackContext.nodeType || callbackContext.jquery ) ? - jQuery( callbackContext ) : - jQuery.event, - - // Deferreds - deferred = jQuery.Deferred(), - completeDeferred = jQuery.Callbacks( "once memory" ), - - // Status-dependent callbacks - statusCode = s.statusCode || {}, - - // Headers (they are sent all at once) - requestHeaders = {}, - requestHeadersNames = {}, - - // Default abort message - strAbort = "canceled", - - // Fake xhr - jqXHR = { - readyState: 0, - - // Builds headers hashtable if needed - getResponseHeader: function( key ) { - var match; - if ( completed ) { - if ( !responseHeaders ) { - responseHeaders = {}; - while ( ( match = rheaders.exec( responseHeadersString ) ) ) { - responseHeaders[ match[ 1 ].toLowerCase() + " " ] = - ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) - .concat( match[ 2 ] ); - } - } - match = responseHeaders[ key.toLowerCase() + " " ]; - } - return match == null ? null : match.join( ", " ); - }, - - // Raw string - getAllResponseHeaders: function() { - return completed ? responseHeadersString : null; - }, - - // Caches the header - setRequestHeader: function( name, value ) { - if ( completed == null ) { - name = requestHeadersNames[ name.toLowerCase() ] = - requestHeadersNames[ name.toLowerCase() ] || name; - requestHeaders[ name ] = value; - } - return this; - }, - - // Overrides response content-type header - overrideMimeType: function( type ) { - if ( completed == null ) { - s.mimeType = type; - } - return this; - }, - - // Status-dependent callbacks - statusCode: function( map ) { - var code; - if ( map ) { - if ( completed ) { - - // Execute the appropriate callbacks - jqXHR.always( map[ jqXHR.status ] ); - } else { - - // Lazy-add the new callbacks in a way that preserves old ones - for ( code in map ) { - statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; - } - } - } - return this; - }, - - // Cancel the request - abort: function( statusText ) { - var finalText = statusText || strAbort; - if ( transport ) { - transport.abort( finalText ); - } - done( 0, finalText ); - return this; - } - }; - - // Attach deferreds - deferred.promise( jqXHR ); - - // Add protocol if not provided (prefilters might expect it) - // Handle falsy url in the settings object (#10093: consistency with old signature) - // We also use the url parameter if available - s.url = ( ( url || s.url || location.href ) + "" ) - .replace( rprotocol, location.protocol + "//" ); - - // Alias method option to type as per ticket #12004 - s.type = options.method || options.type || s.method || s.type; - - // Extract dataTypes list - s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; - - // A cross-domain request is in order when the origin doesn't match the current origin. - if ( s.crossDomain == null ) { - urlAnchor = document.createElement( "a" ); - - // Support: IE <=8 - 11, Edge 12 - 15 - // IE throws exception on accessing the href property if url is malformed, - // e.g. http://example.com:80x/ - try { - urlAnchor.href = s.url; - - // Support: IE <=8 - 11 only - // Anchor's host property isn't correctly set when s.url is relative - urlAnchor.href = urlAnchor.href; - s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== - urlAnchor.protocol + "//" + urlAnchor.host; - } catch ( e ) { - - // If there is an error parsing the URL, assume it is crossDomain, - // it can be rejected by the transport if it is invalid - s.crossDomain = true; - } - } - - // Convert data if not already a string - if ( s.data && s.processData && typeof s.data !== "string" ) { - s.data = jQuery.param( s.data, s.traditional ); - } - - // Apply prefilters - inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); - - // If request was aborted inside a prefilter, stop there - if ( completed ) { - return jqXHR; - } - - // We can fire global events as of now if asked to - // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) - fireGlobals = jQuery.event && s.global; - - // Watch for a new set of requests - if ( fireGlobals && jQuery.active++ === 0 ) { - jQuery.event.trigger( "ajaxStart" ); - } - - // Uppercase the type - s.type = s.type.toUpperCase(); - - // Determine if request has content - s.hasContent = !rnoContent.test( s.type ); - - // Save the URL in case we're toying with the If-Modified-Since - // and/or If-None-Match header later on - // Remove hash to simplify url manipulation - cacheURL = s.url.replace( rhash, "" ); - - // More options handling for requests with no content - if ( !s.hasContent ) { - - // Remember the hash so we can put it back - uncached = s.url.slice( cacheURL.length ); - - // If data is available and should be processed, append data to url - if ( s.data && ( s.processData || typeof s.data === "string" ) ) { - cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; - - // #9682: remove data so that it's not used in an eventual retry - delete s.data; - } - - // Add or update anti-cache param if needed - if ( s.cache === false ) { - cacheURL = cacheURL.replace( rantiCache, "$1" ); - uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) + - uncached; - } - - // Put hash and anti-cache on the URL that will be requested (gh-1732) - s.url = cacheURL + uncached; - - // Change '%20' to '+' if this is encoded form body content (gh-2658) - } else if ( s.data && s.processData && - ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { - s.data = s.data.replace( r20, "+" ); - } - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - if ( jQuery.lastModified[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); - } - if ( jQuery.etag[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); - } - } - - // Set the correct header, if data is being sent - if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { - jqXHR.setRequestHeader( "Content-Type", s.contentType ); - } - - // Set the Accepts header for the server, depending on the dataType - jqXHR.setRequestHeader( - "Accept", - s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? - s.accepts[ s.dataTypes[ 0 ] ] + - ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : - s.accepts[ "*" ] - ); - - // Check for headers option - for ( i in s.headers ) { - jqXHR.setRequestHeader( i, s.headers[ i ] ); - } - - // Allow custom headers/mimetypes and early abort - if ( s.beforeSend && - ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { - - // Abort if not done already and return - return jqXHR.abort(); - } - - // Aborting is no longer a cancellation - strAbort = "abort"; - - // Install callbacks on deferreds - completeDeferred.add( s.complete ); - jqXHR.done( s.success ); - jqXHR.fail( s.error ); - - // Get transport - transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); - - // If no transport, we auto-abort - if ( !transport ) { - done( -1, "No Transport" ); - } else { - jqXHR.readyState = 1; - - // Send global event - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); - } - - // If request was aborted inside ajaxSend, stop there - if ( completed ) { - return jqXHR; - } - - // Timeout - if ( s.async && s.timeout > 0 ) { - timeoutTimer = window.setTimeout( function() { - jqXHR.abort( "timeout" ); - }, s.timeout ); - } - - try { - completed = false; - transport.send( requestHeaders, done ); - } catch ( e ) { - - // Rethrow post-completion exceptions - if ( completed ) { - throw e; - } - - // Propagate others as results - done( -1, e ); - } - } - - // Callback for when everything is done - function done( status, nativeStatusText, responses, headers ) { - var isSuccess, success, error, response, modified, - statusText = nativeStatusText; - - // Ignore repeat invocations - if ( completed ) { - return; - } - - completed = true; - - // Clear timeout if it exists - if ( timeoutTimer ) { - window.clearTimeout( timeoutTimer ); - } - - // Dereference transport for early garbage collection - // (no matter how long the jqXHR object will be used) - transport = undefined; - - // Cache response headers - responseHeadersString = headers || ""; - - // Set readyState - jqXHR.readyState = status > 0 ? 4 : 0; - - // Determine if successful - isSuccess = status >= 200 && status < 300 || status === 304; - - // Get response data - if ( responses ) { - response = ajaxHandleResponses( s, jqXHR, responses ); - } - - // Use a noop converter for missing script - if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) { - s.converters[ "text script" ] = function() {}; - } - - // Convert no matter what (that way responseXXX fields are always set) - response = ajaxConvert( s, response, jqXHR, isSuccess ); - - // If successful, handle type chaining - if ( isSuccess ) { - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - modified = jqXHR.getResponseHeader( "Last-Modified" ); - if ( modified ) { - jQuery.lastModified[ cacheURL ] = modified; - } - modified = jqXHR.getResponseHeader( "etag" ); - if ( modified ) { - jQuery.etag[ cacheURL ] = modified; - } - } - - // if no content - if ( status === 204 || s.type === "HEAD" ) { - statusText = "nocontent"; - - // if not modified - } else if ( status === 304 ) { - statusText = "notmodified"; - - // If we have data, let's convert it - } else { - statusText = response.state; - success = response.data; - error = response.error; - isSuccess = !error; - } - } else { - - // Extract error from statusText and normalize for non-aborts - error = statusText; - if ( status || !statusText ) { - statusText = "error"; - if ( status < 0 ) { - status = 0; - } - } - } - - // Set data for the fake xhr object - jqXHR.status = status; - jqXHR.statusText = ( nativeStatusText || statusText ) + ""; - - // Success/Error - if ( isSuccess ) { - deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); - } else { - deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); - } - - // Status-dependent callbacks - jqXHR.statusCode( statusCode ); - statusCode = undefined; - - if ( fireGlobals ) { - globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", - [ jqXHR, s, isSuccess ? success : error ] ); - } - - // Complete - completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); - - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); - - // Handle the global AJAX counter - if ( !( --jQuery.active ) ) { - jQuery.event.trigger( "ajaxStop" ); - } - } - } - - return jqXHR; - }, - - getJSON: function( url, data, callback ) { - return jQuery.get( url, data, callback, "json" ); - }, - - getScript: function( url, callback ) { - return jQuery.get( url, undefined, callback, "script" ); - } -} ); - -jQuery.each( [ "get", "post" ], function( _i, method ) { - jQuery[ method ] = function( url, data, callback, type ) { - - // Shift arguments if data argument was omitted - if ( isFunction( data ) ) { - type = type || callback; - callback = data; - data = undefined; - } - - // The url can be an options object (which then must have .url) - return jQuery.ajax( jQuery.extend( { - url: url, - type: method, - dataType: type, - data: data, - success: callback - }, jQuery.isPlainObject( url ) && url ) ); - }; -} ); - -jQuery.ajaxPrefilter( function( s ) { - var i; - for ( i in s.headers ) { - if ( i.toLowerCase() === "content-type" ) { - s.contentType = s.headers[ i ] || ""; - } - } -} ); - - -jQuery._evalUrl = function( url, options, doc ) { - return jQuery.ajax( { - url: url, - - // Make this explicit, since user can override this through ajaxSetup (#11264) - type: "GET", - dataType: "script", - cache: true, - async: false, - global: false, - - // Only evaluate the response if it is successful (gh-4126) - // dataFilter is not invoked for failure responses, so using it instead - // of the default converter is kludgy but it works. - converters: { - "text script": function() {} - }, - dataFilter: function( response ) { - jQuery.globalEval( response, options, doc ); - } - } ); -}; - - -jQuery.fn.extend( { - wrapAll: function( html ) { - var wrap; - - if ( this[ 0 ] ) { - if ( isFunction( html ) ) { - html = html.call( this[ 0 ] ); - } - - // The elements to wrap the target around - wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); - - if ( this[ 0 ].parentNode ) { - wrap.insertBefore( this[ 0 ] ); - } - - wrap.map( function() { - var elem = this; - - while ( elem.firstElementChild ) { - elem = elem.firstElementChild; - } - - return elem; - } ).append( this ); - } - - return this; - }, - - wrapInner: function( html ) { - if ( isFunction( html ) ) { - return this.each( function( i ) { - jQuery( this ).wrapInner( html.call( this, i ) ); - } ); - } - - return this.each( function() { - var self = jQuery( this ), - contents = self.contents(); - - if ( contents.length ) { - contents.wrapAll( html ); - - } else { - self.append( html ); - } - } ); - }, - - wrap: function( html ) { - var htmlIsFunction = isFunction( html ); - - return this.each( function( i ) { - jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); - } ); - }, - - unwrap: function( selector ) { - this.parent( selector ).not( "body" ).each( function() { - jQuery( this ).replaceWith( this.childNodes ); - } ); - return this; - } -} ); - - -jQuery.expr.pseudos.hidden = function( elem ) { - return !jQuery.expr.pseudos.visible( elem ); -}; -jQuery.expr.pseudos.visible = function( elem ) { - return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); -}; - - - - -jQuery.ajaxSettings.xhr = function() { - try { - return new window.XMLHttpRequest(); - } catch ( e ) {} -}; - -var xhrSuccessStatus = { - - // File protocol always yields status code 0, assume 200 - 0: 200, - - // Support: IE <=9 only - // #1450: sometimes IE returns 1223 when it should be 204 - 1223: 204 - }, - xhrSupported = jQuery.ajaxSettings.xhr(); - -support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); -support.ajax = xhrSupported = !!xhrSupported; - -jQuery.ajaxTransport( function( options ) { - var callback, errorCallback; - - // Cross domain only allowed if supported through XMLHttpRequest - if ( support.cors || xhrSupported && !options.crossDomain ) { - return { - send: function( headers, complete ) { - var i, - xhr = options.xhr(); - - xhr.open( - options.type, - options.url, - options.async, - options.username, - options.password - ); - - // Apply custom fields if provided - if ( options.xhrFields ) { - for ( i in options.xhrFields ) { - xhr[ i ] = options.xhrFields[ i ]; - } - } - - // Override mime type if needed - if ( options.mimeType && xhr.overrideMimeType ) { - xhr.overrideMimeType( options.mimeType ); - } - - // X-Requested-With header - // For cross-domain requests, seeing as conditions for a preflight are - // akin to a jigsaw puzzle, we simply never set it to be sure. - // (it can always be set on a per-request basis or even using ajaxSetup) - // For same-domain requests, won't change header if already provided. - if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { - headers[ "X-Requested-With" ] = "XMLHttpRequest"; - } - - // Set headers - for ( i in headers ) { - xhr.setRequestHeader( i, headers[ i ] ); - } - - // Callback - callback = function( type ) { - return function() { - if ( callback ) { - callback = errorCallback = xhr.onload = - xhr.onerror = xhr.onabort = xhr.ontimeout = - xhr.onreadystatechange = null; - - if ( type === "abort" ) { - xhr.abort(); - } else if ( type === "error" ) { - - // Support: IE <=9 only - // On a manual native abort, IE9 throws - // errors on any property access that is not readyState - if ( typeof xhr.status !== "number" ) { - complete( 0, "error" ); - } else { - complete( - - // File: protocol always yields status 0; see #8605, #14207 - xhr.status, - xhr.statusText - ); - } - } else { - complete( - xhrSuccessStatus[ xhr.status ] || xhr.status, - xhr.statusText, - - // Support: IE <=9 only - // IE9 has no XHR2 but throws on binary (trac-11426) - // For XHR2 non-text, let the caller handle it (gh-2498) - ( xhr.responseType || "text" ) !== "text" || - typeof xhr.responseText !== "string" ? - { binary: xhr.response } : - { text: xhr.responseText }, - xhr.getAllResponseHeaders() - ); - } - } - }; - }; - - // Listen to events - xhr.onload = callback(); - errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); - - // Support: IE 9 only - // Use onreadystatechange to replace onabort - // to handle uncaught aborts - if ( xhr.onabort !== undefined ) { - xhr.onabort = errorCallback; - } else { - xhr.onreadystatechange = function() { - - // Check readyState before timeout as it changes - if ( xhr.readyState === 4 ) { - - // Allow onerror to be called first, - // but that will not handle a native abort - // Also, save errorCallback to a variable - // as xhr.onerror cannot be accessed - window.setTimeout( function() { - if ( callback ) { - errorCallback(); - } - } ); - } - }; - } - - // Create the abort callback - callback = callback( "abort" ); - - try { - - // Do send the request (this may raise an exception) - xhr.send( options.hasContent && options.data || null ); - } catch ( e ) { - - // #14683: Only rethrow if this hasn't been notified as an error yet - if ( callback ) { - throw e; - } - } - }, - - abort: function() { - if ( callback ) { - callback(); - } - } - }; - } -} ); - - - - -// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) -jQuery.ajaxPrefilter( function( s ) { - if ( s.crossDomain ) { - s.contents.script = false; - } -} ); - -// Install script dataType -jQuery.ajaxSetup( { - accepts: { - script: "text/javascript, application/javascript, " + - "application/ecmascript, application/x-ecmascript" - }, - contents: { - script: /\b(?:java|ecma)script\b/ - }, - converters: { - "text script": function( text ) { - jQuery.globalEval( text ); - return text; - } - } -} ); - -// Handle cache's special case and crossDomain -jQuery.ajaxPrefilter( "script", function( s ) { - if ( s.cache === undefined ) { - s.cache = false; - } - if ( s.crossDomain ) { - s.type = "GET"; - } -} ); - -// Bind script tag hack transport -jQuery.ajaxTransport( "script", function( s ) { - - // This transport only deals with cross domain or forced-by-attrs requests - if ( s.crossDomain || s.scriptAttrs ) { - var script, callback; - return { - send: function( _, complete ) { - script = jQuery( " - - - - - - - - - - - - - - - - - - -
- - -
- -
-
-
- -
-
-
-
- - -

Index

- -
- M - -
-

M

- - - -
- - - -
-
- -
-
-
-
- - - - - \ No newline at end of file diff --git a/mdns/en/index.html b/mdns/en/index.html deleted file mode 100644 index 1db2bc5e8..000000000 --- a/mdns/en/index.html +++ /dev/null @@ -1,1620 +0,0 @@ - - - - - - - mDNS Service - ESP32 - — ESP-Protocols latest documentation - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
- -
-
-
- -
-
-
-
- -
-

mDNS Service

-

zh_CN:[中文]

-
-

Overview

-

mDNS is a multicast UDP service that is used to provide local network service and host discovery.

-

mDNS is installed by default on most operating systems or is available as separate package. On Mac OS it is installed by default and is called Bonjour. Apple releases an installer for Windows that can be found on Apple’s support page. On Linux, mDNS is provided by avahi and is usually installed by default.

-
-

mDNS Properties

-
-
    -
  • hostname: the hostname that the device will respond to. If not set, the hostname will be read from the interface. Example: my-esp32 will resolve to my-esp32.local

  • -
  • default_instance: friendly name for your device, like Jhon's ESP32 Thing. If not set, hostname will be used.

  • -
-
-

Example method to start mDNS for the STA interface and set hostname and default_instance:

-
void start_mdns_service()
-{
-    //initialize mDNS service
-    esp_err_t err = mdns_init();
-    if (err) {
-        printf("MDNS Init failed: %d\n", err);
-        return;
-    }
-
-    //set hostname
-    mdns_hostname_set("my-esp32");
-    //set default instance
-    mdns_instance_name_set("Jhon's ESP32 Thing");
-}
-
-
-
-
-

mDNS Services

-

mDNS can advertise information about network services that your device offers. Each service is defined by a few properties.

-
-
    -
  • instance_name: friendly name for your service, like Jhon's EESP32 Web Server. If not defined, default_instance will be used.

  • -
  • service_type: (required) service type, prepended with underscore. Some common types can be found here.

  • -
  • proto: (required) protocol that the service runs on, prepended with underscore. Example: _tcp or _udp

  • -
  • port: (required) network port that the service runs on

  • -
  • txt: {var, val} array of strings, used to define properties for your service

  • -
-
-

Example method to add a few services and different properties:

-
void add_mdns_services()
-{
-    //add our services
-    mdns_service_add(NULL, "_http", "_tcp", 80, NULL, 0);
-    mdns_service_add(NULL, "_arduino", "_tcp", 3232, NULL, 0);
-    mdns_service_add(NULL, "_myservice", "_udp", 1234, NULL, 0);
-
-    //NOTE: services must be added before their properties can be set
-    //use custom instance for the web server
-    mdns_service_instance_name_set("_http", "_tcp", "Jhon's ESP32 Web Server");
-
-    mdns_txt_item_t serviceTxtData[3] = {
-        {"board","{esp32}"},
-        {"u","user"},
-        {"p","password"}
-    };
-    //set txt data for service (will free and replace current data)
-    mdns_service_txt_set("_http", "_tcp", serviceTxtData, 3);
-
-    //change service port
-    mdns_service_port_set("_myservice", "_udp", 4321);
-}
-
-
-
-
-

mDNS Query

-

mDNS provides methods for browsing for services and resolving host’s IP/IPv6 addresses.

-

Results for services are returned as a linked list of mdns_result_t objects.

-

Example method to resolve host IPs:

-
void resolve_mdns_host(const char * host_name)
-{
-    printf("Query A: %s.local", host_name);
-
-    struct ip4_addr addr;
-    addr.addr = 0;
-
-    esp_err_t err = mdns_query_a(host_name, 2000,  &addr);
-    if(err){
-        if(err == ESP_ERR_NOT_FOUND){
-            printf("Host was not found!");
-            return;
-        }
-        printf("Query Failed");
-        return;
-    }
-
-    printf(IPSTR, IP2STR(&addr));
-}
-
-
-

Example method to resolve local services:

-
static const char * if_str[] = {"STA", "AP", "ETH", "MAX"};
-static const char * ip_protocol_str[] = {"V4", "V6", "MAX"};
-
-void mdns_print_results(mdns_result_t * results){
-    mdns_result_t * r = results;
-    mdns_ip_addr_t * a = NULL;
-    int i = 1, t;
-    while(r){
-        printf("%d: Interface: %s, Type: %s\n", i++, if_str[r->tcpip_if], ip_protocol_str[r->ip_protocol]);
-        if(r->instance_name){
-            printf("  PTR : %s\n", r->instance_name);
-        }
-        if(r->hostname){
-            printf("  SRV : %s.local:%u\n", r->hostname, r->port);
-        }
-        if(r->txt_count){
-            printf("  TXT : [%u] ", r->txt_count);
-            for(t=0; t<r->txt_count; t++){
-                printf("%s=%s; ", r->txt[t].key, r->txt[t].value);
-            }
-            printf("\n");
-        }
-        a = r->addr;
-        while(a){
-            if(a->addr.type == IPADDR_TYPE_V6){
-                printf("  AAAA: " IPV6STR "\n", IPV62STR(a->addr.u_addr.ip6));
-            } else {
-                printf("  A   : " IPSTR "\n", IP2STR(&(a->addr.u_addr.ip4)));
-            }
-            a = a->next;
-        }
-        r = r->next;
-    }
-
-}
-
-void find_mdns_service(const char * service_name, const char * proto)
-{
-    ESP_LOGI(TAG, "Query PTR: %s.%s.local", service_name, proto);
-
-    mdns_result_t * results = NULL;
-    esp_err_t err = mdns_query_ptr(service_name, proto, 3000, 20,  &results);
-    if(err){
-        ESP_LOGE(TAG, "Query Failed");
-        return;
-    }
-    if(!results){
-        ESP_LOGW(TAG, "No results found!");
-        return;
-    }
-
-    mdns_print_results(results);
-    mdns_query_results_free(results);
-}
-
-
-

Example of using the methods above:

-
void my_app_some_method(){
-    //search for esp32-mdns.local
-    resolve_mdns_host("esp32-mdns");
-
-    //search for HTTP servers
-    find_mdns_service("_http", "_tcp");
-    //or file servers
-    find_mdns_service("_smb", "_tcp"); //windows sharing
-    find_mdns_service("_afpovertcp", "_tcp"); //apple sharing
-    find_mdns_service("_nfs", "_tcp"); //NFS server
-    find_mdns_service("_ftp", "_tcp"); //FTP server
-    //or networked printer
-    find_mdns_service("_printer", "_tcp");
-    find_mdns_service("_ipp", "_tcp");
-}
-
-
-
-
-

Performance Optimization

-
-
-

Execution Speed

-
-
    -
  • mDNS creates a task with default low priority 1 CONFIG_MDNS_TASK_PRIORITY (If CONFIG_FREERTOS_UNICORE enabeled it pinned to CPU0 (CONFIG_MDNS_TASK_AFFINITY).

  • -
-

Please check Maximizing Execution Speed for more details.

-
-
-
-

Minimizing RAM Usage

-
    -
  • mDNS creates a tasks with stack sizes configured by CONFIG_MDNS_TASK_STACK_SIZE.

  • -
-

Please check Minimizing RAM Usage for more details.

-
-
-
-

Application Example

-

mDNS server/scanner example: .

-
-
-

API Reference

-
-

Header File

- -
-
-

Functions

-
-
-esp_err_t mdns_init(void)
-

Initialize mDNS on given interface.

-
-
Returns
-

    -
  • ESP_OK on success

  • -
  • ESP_ERR_INVALID_STATE when failed to register event handler

  • -
  • ESP_ERR_NO_MEM on memory error

  • -
  • ESP_FAIL when failed to start mdns task

  • -
-

-
-
-
- -
-
-void mdns_free(void)
-

Stop and free mDNS server.

-
- -
-
-esp_err_t mdns_hostname_set(const char *hostname)
-

Set the hostname for mDNS server required if you want to advertise services.

-
-
Parameters
-

hostname – Hostname to set

-
-
Returns
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_ARG Parameter error

  • -
  • ESP_ERR_NO_MEM memory error

  • -
-

-
-
-
- -
-
-esp_err_t mdns_delegate_hostname_add(const char *hostname, const mdns_ip_addr_t *address_list)
-

Adds a hostname and address to be delegated A/AAAA queries will be replied for the hostname and services can be added to this host.

-
-
Parameters
-
    -
  • hostname – Hostname to add

  • -
  • address_list – The IP address list of the host

  • -
-
-
Returns
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_STATE mDNS is not running

  • -
  • ESP_ERR_INVALID_ARG Parameter error

  • -
  • ESP_ERR_NO_MEM memory error

  • -
-

-
-
-
- -
-
-esp_err_t mdns_delegate_hostname_remove(const char *hostname)
-

Remove a delegated hostname All the services added to this host will also be removed.

-
-
Parameters
-

hostname – Hostname to remove

-
-
Returns
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_STATE mDNS is not running

  • -
  • ESP_ERR_INVALID_ARG Parameter error

  • -
  • ESP_ERR_NO_MEM memory error

  • -
-

-
-
-
- -
-
-bool mdns_hostname_exists(const char *hostname)
-

Query whether a hostname has been added.

-
-
Parameters
-

hostname – Hostname to query

-
-
Returns
-

    -
  • true The hostname has been added.

  • -
  • false The hostname has not been added.

  • -
-

-
-
-
- -
-
-esp_err_t mdns_instance_name_set(const char *instance_name)
-

Set the default instance name for mDNS server.

-
-
Parameters
-

instance_name – Instance name to set

-
-
Returns
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_ARG Parameter error

  • -
  • ESP_ERR_NO_MEM memory error

  • -
-

-
-
-
- -
-
-esp_err_t mdns_service_add(const char *instance_name, const char *service_type, const char *proto, uint16_t port, mdns_txt_item_t txt[], size_t num_items)
-

Add service to mDNS server.

-
-

Note

-

The value length of txt items will be automatically decided by strlen

-
-
-
Parameters
-
    -
  • instance_name – instance name to set. If NULL, global instance name or hostname will be used. Note that MDNS_MULTIPLE_INSTANCE config option needs to be enabled for adding multiple instances with the same instance type.

  • -
  • service_type – service type (_http, _ftp, etc)

  • -
  • proto – service protocol (_tcp, _udp)

  • -
  • port – service port

  • -
  • txt – string array of TXT data (eg. {{“var”,”val”},{“other”,”2”}})

  • -
  • num_items – number of items in TXT data

  • -
-
-
Returns
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_ARG Parameter error

  • -
  • ESP_ERR_NO_MEM memory error

  • -
  • ESP_FAIL failed to add service

  • -
-

-
-
-
- -
-
-esp_err_t mdns_service_add_for_host(const char *instance_name, const char *service_type, const char *proto, const char *hostname, uint16_t port, mdns_txt_item_t txt[], size_t num_items)
-

Add service to mDNS server with a delegated hostname.

-
-

Note

-

The value length of txt items will be automatically decided by strlen

-
-
-
Parameters
-
    -
  • instance_name – instance name to set. If NULL, global instance name or hostname will be used Note that MDNS_MULTIPLE_INSTANCE config option needs to be enabled for adding multiple instances with the same instance type.

  • -
  • service_type – service type (_http, _ftp, etc)

  • -
  • proto – service protocol (_tcp, _udp)

  • -
  • hostname – service hostname. If NULL, local hostname will be used.

  • -
  • port – service port

  • -
  • txt – string array of TXT data (eg. {{“var”,”val”},{“other”,”2”}})

  • -
  • num_items – number of items in TXT data

  • -
-
-
Returns
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_ARG Parameter error

  • -
  • ESP_ERR_NO_MEM memory error

  • -
  • ESP_FAIL failed to add service

  • -
-

-
-
-
- -
-
-bool mdns_service_exists(const char *service_type, const char *proto, const char *hostname)
-

Check whether a service has been added.

-
-
Parameters
-
    -
  • service_type – service type (_http, _ftp, etc)

  • -
  • proto – service protocol (_tcp, _udp)

  • -
  • hostname – service hostname. If NULL, checks for the local hostname.

  • -
-
-
Returns
-

    -
  • true Correspondding service has been added.

  • -
  • false Service not found.

  • -
-

-
-
-
- -
-
-bool mdns_service_exists_with_instance(const char *instance, const char *service_type, const char *proto, const char *hostname)
-

Check whether a service has been added.

-
-
Parameters
-
    -
  • instance – instance name

  • -
  • service_type – service type (_http, _ftp, etc)

  • -
  • proto – service protocol (_tcp, _udp)

  • -
  • hostname – service hostname. If NULL, checks for the local hostname.

  • -
-
-
Returns
-

    -
  • true Correspondding service has been added.

  • -
  • false Service not found.

  • -
-

-
-
-
- -
-
-esp_err_t mdns_service_remove(const char *service_type, const char *proto)
-

Remove service from mDNS server.

-
-
Parameters
-
    -
  • service_type – service type (_http, _ftp, etc)

  • -
  • proto – service protocol (_tcp, _udp)

  • -
-
-
Returns
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_ARG Parameter error

  • -
  • ESP_ERR_NOT_FOUND Service not found

  • -
  • ESP_ERR_NO_MEM memory error

  • -
-

-
-
-
- -
-
-esp_err_t mdns_service_remove_for_host(const char *instance, const char *service_type, const char *proto, const char *hostname)
-

Remove service from mDNS server with hostname.

-
-
Parameters
-
    -
  • instance – instance name

  • -
  • service_type – service type (_http, _ftp, etc)

  • -
  • proto – service protocol (_tcp, _udp)

  • -
  • hostname – service hostname. If NULL, local hostname will be used.

  • -
-
-
Returns
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_ARG Parameter error

  • -
  • ESP_ERR_NOT_FOUND Service not found

  • -
  • ESP_ERR_NO_MEM memory error

  • -
-

-
-
-
- -
-
-esp_err_t mdns_service_instance_name_set(const char *service_type, const char *proto, const char *instance_name)
-

Set instance name for service.

-
-
Parameters
-
    -
  • service_type – service type (_http, _ftp, etc)

  • -
  • proto – service protocol (_tcp, _udp)

  • -
  • instance_name – instance name to set

  • -
-
-
Returns
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_ARG Parameter error

  • -
  • ESP_ERR_NOT_FOUND Service not found

  • -
  • ESP_ERR_NO_MEM memory error

  • -
-

-
-
-
- -
-
-esp_err_t mdns_service_instance_name_set_for_host(const char *instance_old, const char *service_type, const char *proto, const char *hostname, const char *instance_name)
-

Set instance name for service with hostname.

-
-
Parameters
-
    -
  • instance_old – original instance name

  • -
  • service_type – service type (_http, _ftp, etc)

  • -
  • proto – service protocol (_tcp, _udp)

  • -
  • hostname – service hostname. If NULL, local hostname will be used.

  • -
  • instance_name – instance name to set

  • -
-
-
Returns
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_ARG Parameter error

  • -
  • ESP_ERR_NOT_FOUND Service not found

  • -
  • ESP_ERR_NO_MEM memory error

  • -
-

-
-
-
- -
-
-esp_err_t mdns_service_port_set(const char *service_type, const char *proto, uint16_t port)
-

Set service port.

-
-
Parameters
-
    -
  • service_type – service type (_http, _ftp, etc)

  • -
  • proto – service protocol (_tcp, _udp)

  • -
  • port – service port

  • -
-
-
Returns
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_ARG Parameter error

  • -
  • ESP_ERR_NOT_FOUND Service not found

  • -
  • ESP_ERR_NO_MEM memory error

  • -
-

-
-
-
- -
-
-esp_err_t mdns_service_port_set_for_host(const char *instance, const char *service_type, const char *proto, const char *hostname, uint16_t port)
-

Set service port with hostname.

-
-
Parameters
-
    -
  • instance – instance name

  • -
  • service_type – service type (_http, _ftp, etc)

  • -
  • proto – service protocol (_tcp, _udp)

  • -
  • hostname – service hostname. If NULL, local hostname will be used.

  • -
  • port – service port

  • -
-
-
Returns
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_ARG Parameter error

  • -
  • ESP_ERR_NOT_FOUND Service not found

  • -
  • ESP_ERR_NO_MEM memory error

  • -
-

-
-
-
- -
-
-esp_err_t mdns_service_txt_set(const char *service_type, const char *proto, mdns_txt_item_t txt[], uint8_t num_items)
-

Replace all TXT items for service.

-
-

Note

-

The value length of txt items will be automatically decided by strlen

-
-
-
Parameters
-
    -
  • service_type – service type (_http, _ftp, etc)

  • -
  • proto – service protocol (_tcp, _udp)

  • -
  • txt – array of TXT data (eg. {{“var”,”val”},{“other”,”2”}})

  • -
  • num_items – number of items in TXT data

  • -
-
-
Returns
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_ARG Parameter error

  • -
  • ESP_ERR_NOT_FOUND Service not found

  • -
  • ESP_ERR_NO_MEM memory error

  • -
-

-
-
-
- -
-
-esp_err_t mdns_service_txt_set_for_host(const char *instance, const char *service_type, const char *proto, const char *hostname, mdns_txt_item_t txt[], uint8_t num_items)
-

Replace all TXT items for service with hostname.

-
-

Note

-

The value length of txt items will be automatically decided by strlen

-
-
-
Parameters
-
    -
  • instance – instance name

  • -
  • service_type – service type (_http, _ftp, etc)

  • -
  • proto – service protocol (_tcp, _udp)

  • -
  • hostname – service hostname. If NULL, local hostname will be used.

  • -
  • txt – array of TXT data (eg. {{“var”,”val”},{“other”,”2”}})

  • -
  • num_items – number of items in TXT data

  • -
-
-
Returns
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_ARG Parameter error

  • -
  • ESP_ERR_NOT_FOUND Service not found

  • -
  • ESP_ERR_NO_MEM memory error

  • -
-

-
-
-
- -
-
-esp_err_t mdns_service_txt_item_set(const char *service_type, const char *proto, const char *key, const char *value)
-

Set/Add TXT item for service TXT record.

-
-

Note

-

The value length will be automatically decided by strlen

-
-
-
Parameters
-
    -
  • service_type – service type (_http, _ftp, etc)

  • -
  • proto – service protocol (_tcp, _udp)

  • -
  • key – the key that you want to add/update

  • -
  • value – the new value of the key

  • -
-
-
Returns
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_ARG Parameter error

  • -
  • ESP_ERR_NOT_FOUND Service not found

  • -
  • ESP_ERR_NO_MEM memory error

  • -
-

-
-
-
- -
-
-esp_err_t mdns_service_txt_item_set_with_explicit_value_len(const char *service_type, const char *proto, const char *key, const char *value, uint8_t value_len)
-

Set/Add TXT item for service TXT record.

-
-
Parameters
-
    -
  • service_type – service type (_http, _ftp, etc)

  • -
  • proto – service protocol (_tcp, _udp)

  • -
  • key – the key that you want to add/update

  • -
  • value – the new value of the key

  • -
  • value_len – the length of the value

  • -
-
-
Returns
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_ARG Parameter error

  • -
  • ESP_ERR_NOT_FOUND Service not found

  • -
  • ESP_ERR_NO_MEM memory error

  • -
-

-
-
-
- -
-
-esp_err_t mdns_service_txt_item_set_for_host(const char *instance, const char *service_type, const char *proto, const char *hostname, const char *key, const char *value)
-

Set/Add TXT item for service TXT record with hostname.

-
-

Note

-

The value length will be automatically decided by strlen

-
-
-
Parameters
-
    -
  • instance – instance name

  • -
  • service_type – service type (_http, _ftp, etc)

  • -
  • proto – service protocol (_tcp, _udp)

  • -
  • hostname – service hostname. If NULL, local hostname will be used.

  • -
  • key – the key that you want to add/update

  • -
  • value – the new value of the key

  • -
-
-
Returns
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_ARG Parameter error

  • -
  • ESP_ERR_NOT_FOUND Service not found

  • -
  • ESP_ERR_NO_MEM memory error

  • -
-

-
-
-
- -
-
-esp_err_t mdns_service_txt_item_set_for_host_with_explicit_value_len(const char *instance, const char *service_type, const char *proto, const char *hostname, const char *key, const char *value, uint8_t value_len)
-

Set/Add TXT item for service TXT record with hostname and txt value length.

-
-
Parameters
-
    -
  • instance – instance name

  • -
  • service_type – service type (_http, _ftp, etc)

  • -
  • proto – service protocol (_tcp, _udp)

  • -
  • hostname – service hostname. If NULL, local hostname will be used.

  • -
  • key – the key that you want to add/update

  • -
  • value – the new value of the key

  • -
  • value_len – the length of the value

  • -
-
-
Returns
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_ARG Parameter error

  • -
  • ESP_ERR_NOT_FOUND Service not found

  • -
  • ESP_ERR_NO_MEM memory error

  • -
-

-
-
-
- -
-
-esp_err_t mdns_service_txt_item_remove(const char *service_type, const char *proto, const char *key)
-

Remove TXT item for service TXT record.

-
-
Parameters
-
    -
  • service_type – service type (_http, _ftp, etc)

  • -
  • proto – service protocol (_tcp, _udp)

  • -
  • key – the key that you want to remove

  • -
-
-
Returns
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_ARG Parameter error

  • -
  • ESP_ERR_NOT_FOUND Service not found

  • -
  • ESP_ERR_NO_MEM memory error

  • -
-

-
-
-
- -
-
-esp_err_t mdns_service_txt_item_remove_for_host(const char *instance, const char *service_type, const char *proto, const char *hostname, const char *key)
-

Remove TXT item for service TXT record with hostname.

-
-
Parameters
-
    -
  • instance – instance name

  • -
  • service_type – service type (_http, _ftp, etc)

  • -
  • proto – service protocol (_tcp, _udp)

  • -
  • hostname – service hostname. If NULL, local hostname will be used.

  • -
  • key – the key that you want to remove

  • -
-
-
Returns
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_ARG Parameter error

  • -
  • ESP_ERR_NOT_FOUND Service not found

  • -
  • ESP_ERR_NO_MEM memory error

  • -
-

-
-
-
- -
-
-esp_err_t mdns_service_subtype_add_for_host(const char *instance_name, const char *service_type, const char *proto, const char *hostname, const char *subtype)
-

Add subtype for service.

-
-
Parameters
-
    -
  • instance_name – instance name. If NULL, will find the first service with the same service type and protocol.

  • -
  • service_type – service type (_http, _ftp, etc)

  • -
  • proto – service protocol (_tcp, _udp)

  • -
  • hostname – service hostname. If NULL, local hostname will be used.

  • -
  • subtype – The subtype to add.

  • -
-
-
Returns
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_ARG Parameter error

  • -
  • ESP_ERR_NOT_FOUND Service not found

  • -
  • ESP_ERR_NO_MEM memory error

  • -
-

-
-
-
- -
-
-esp_err_t mdns_service_remove_all(void)
-

Remove and free all services from mDNS server.

-
-
Returns
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_ARG Parameter error

  • -
-

-
-
-
- -
-
-esp_err_t mdns_query_async_delete(mdns_search_once_t *search)
-

Deletes the finished query. Call this only after the search has ended!

-
-
Parameters
-

search – pointer to search object

-
-
Returns
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_STATE search has not finished

  • -
  • ESP_ERR_INVALID_ARG pointer to search object is NULL

  • -
-

-
-
-
- -
-
-bool mdns_query_async_get_results(mdns_search_once_t *search, uint32_t timeout, mdns_result_t **results, uint8_t *num_results)
-

Get results from search pointer. Results available as a pointer to the output parameter. Pointer to search object has to be deleted via mdns_query_async_delete once the query has finished. The results although have to be freed manually.

-
-
Parameters
-
    -
  • search – pointer to search object

  • -
  • timeout – time in milliseconds to wait for answers

  • -
  • results – pointer to the results of the query

  • -
  • num_results – pointer to the number of the actual result items (set to NULL to ignore this return value)

  • -
-
-
Returns
-

True if search has finished before or at timeout False if search timeout is over

-
-
-
- -
-
-mdns_search_once_t *mdns_query_async_new(const char *name, const char *service_type, const char *proto, uint16_t type, uint32_t timeout, size_t max_results, mdns_query_notify_t notifier)
-

Query mDNS for host or service asynchronousely. Search has to be tested for progress and deleted manually!

-
-
Parameters
-
    -
  • name – service instance or host name (NULL for PTR queries)

  • -
  • service_type – service type (_http, _arduino, _ftp etc.) (NULL for host queries)

  • -
  • proto – service protocol (_tcp, _udp, etc.) (NULL for host queries)

  • -
  • type – type of query (MDNS_TYPE_*)

  • -
  • timeout – time in milliseconds during which mDNS query is active

  • -
  • max_results – maximum results to be collected

  • -
  • notifier – Notification function to be called when the result is ready, can be NULL

  • -
-
-
Returns
-

mdns_search_once_s pointer to new search object if query initiated successfully. NULL otherwise.

-
-
-
- -
-
-esp_err_t mdns_query_generic(const char *name, const char *service_type, const char *proto, uint16_t type, mdns_query_transmission_type_t transmission_type, uint32_t timeout, size_t max_results, mdns_result_t **results)
-

Generic mDNS query All following query methods are derived from this one.

-
-
Parameters
-
    -
  • name – service instance or host name (NULL for PTR queries)

  • -
  • service_type – service type (_http, _arduino, _ftp etc.) (NULL for host queries)

  • -
  • proto – service protocol (_tcp, _udp, etc.) (NULL for host queries)

  • -
  • type – type of query (MDNS_TYPE_*)

  • -
  • transmission_type – either Unicast query, or Multicast query

  • -
  • timeout – time in milliseconds to wait for answers.

  • -
  • max_results – maximum results to be collected

  • -
  • results – pointer to the results of the query results must be freed using mdns_query_results_free below

  • -
-
-
Returns
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_STATE mDNS is not running

  • -
  • ESP_ERR_NO_MEM memory error

  • -
  • ESP_ERR_INVALID_ARG timeout was not given

  • -
-

-
-
-
- -
-
-esp_err_t mdns_query(const char *name, const char *service_type, const char *proto, uint16_t type, uint32_t timeout, size_t max_results, mdns_result_t **results)
-

Query mDNS for host or service.

-

Note that querying PTR types sends Multicast query, all other types send Unicast queries

-
-
Parameters
-
    -
  • name – service instance or host name (NULL for PTR queries)

  • -
  • service_type – service type (_http, _arduino, _ftp etc.) (NULL for host queries)

  • -
  • proto – service protocol (_tcp, _udp, etc.) (NULL for host queries)

  • -
  • type – type of query (MDNS_TYPE_*)

  • -
  • timeout – time in milliseconds to wait for answers.

  • -
  • max_results – maximum results to be collected

  • -
  • results – pointer to the results of the query results must be freed using mdns_query_results_free below

  • -
-
-
Returns
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_STATE mDNS is not running

  • -
  • ESP_ERR_NO_MEM memory error

  • -
  • ESP_ERR_INVALID_ARG timeout was not given

  • -
-

-
-
-
- -
-
-void mdns_query_results_free(mdns_result_t *results)
-

Free query results.

-
-
Parameters
-

results – linked list of results to be freed

-
-
-
- -
-
-esp_err_t mdns_query_ptr(const char *service_type, const char *proto, uint32_t timeout, size_t max_results, mdns_result_t **results)
-

Query mDNS for service.

-
-
Parameters
-
    -
  • service_type – service type (_http, _arduino, _ftp etc.)

  • -
  • proto – service protocol (_tcp, _udp, etc.)

  • -
  • timeout – time in milliseconds to wait for answer.

  • -
  • max_results – maximum results to be collected

  • -
  • results – pointer to the results of the query

  • -
-
-
Returns
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_STATE mDNS is not running

  • -
  • ESP_ERR_NO_MEM memory error

  • -
  • ESP_ERR_INVALID_ARG parameter error

  • -
-

-
-
-
- -
-
-esp_err_t mdns_query_srv(const char *instance_name, const char *service_type, const char *proto, uint32_t timeout, mdns_result_t **result)
-

Query mDNS for SRV record.

-
-
Parameters
-
    -
  • instance_name – service instance name

  • -
  • service_type – service type (_http, _arduino, _ftp etc.)

  • -
  • proto – service protocol (_tcp, _udp, etc.)

  • -
  • timeout – time in milliseconds to wait for answer.

  • -
  • result – pointer to the result of the query

  • -
-
-
Returns
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_STATE mDNS is not running

  • -
  • ESP_ERR_NO_MEM memory error

  • -
  • ESP_ERR_INVALID_ARG parameter error

  • -
-

-
-
-
- -
-
-esp_err_t mdns_query_txt(const char *instance_name, const char *service_type, const char *proto, uint32_t timeout, mdns_result_t **result)
-

Query mDNS for TXT record.

-
-
Parameters
-
    -
  • instance_name – service instance name

  • -
  • service_type – service type (_http, _arduino, _ftp etc.)

  • -
  • proto – service protocol (_tcp, _udp, etc.)

  • -
  • timeout – time in milliseconds to wait for answer.

  • -
  • result – pointer to the result of the query

  • -
-
-
Returns
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_STATE mDNS is not running

  • -
  • ESP_ERR_NO_MEM memory error

  • -
  • ESP_ERR_INVALID_ARG parameter error

  • -
-

-
-
-
- -
-
-esp_err_t mdns_query_a(const char *host_name, uint32_t timeout, esp_ip4_addr_t *addr)
-

Query mDNS for A record.

-
-
Parameters
-
    -
  • host_name – host name to look for

  • -
  • timeout – time in milliseconds to wait for answer.

  • -
  • addr – pointer to the resulting IP4 address

  • -
-
-
Returns
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_STATE mDNS is not running

  • -
  • ESP_ERR_NO_MEM memory error

  • -
  • ESP_ERR_INVALID_ARG parameter error

  • -
-

-
-
-
- -
-
-esp_err_t mdns_register_netif(esp_netif_t *esp_netif)
-

Register custom esp_netif with mDNS functionality mDNS service runs by default on preconfigured interfaces (STA, AP, ETH). This API enables running the service on any customized interface, either using standard WiFi or Ethernet driver or any kind of user defined driver.

-
-
Parameters
-

esp_netif – Pointer to esp-netif interface

-
-
Returns
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_STATE mDNS is not running or this netif is already registered

  • -
  • ESP_ERR_NO_MEM not enough memory for this in interface in the netif list (see CONFIG_MDNS_MAX_INTERFACES)

  • -
-

-
-
-
- -
-
-esp_err_t mdns_unregister_netif(esp_netif_t *esp_netif)
-

Unregister esp-netif already registered in mDNS service.

-
-
Parameters
-

esp_netif – Pointer to esp-netif interface

-
-
Returns
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_STATE mDNS is not running

  • -
  • ESP_ERR_NOT_FOUND this esp-netif was not registered in mDNS service

  • -
-

-
-
-
- -
-
-esp_err_t mdns_netif_action(esp_netif_t *esp_netif, mdns_event_actions_t event_action)
-

Set esp_netif to a desired state, or perform a desired action, such as enable/disable this interface or send announcement packets to this netif.

-

    -
  • This function is used to enable (probe, resolve conflicts and announce), announce, or disable (send bye) mDNS services on the specified network interface.

  • -
  • This function must be called if users registers a specific interface using mdns_register_netif() to enable mDNS services on that interface.

  • -
  • This function could be used in IP/connection event handlers to automatically enable/announce mDNS services when network properties change and/or disable them on disconnection.

  • -
-

-
-
Parameters
-
    -
  • esp_netif – Pointer to esp-netif interface

  • -
  • event_action – Disable/Enable/Announce on this interface over IPv4/IPv6 protocol. Actions enumerated in mdns_event_actions_t type.

  • -
-
-
Returns
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_STATE mDNS is not running or this netif is not registered

  • -
  • ESP_ERR_NO_MEM memory error

  • -
-

-
-
-
- -
-
-

Structures

-
-
-struct mdns_txt_item_t
-

mDNS basic text item structure Used in mdns_service_add()

-
-

Public Members

-
-
-const char *key
-

item key name

-
- -
-
-const char *value
-

item value string

-
- -
-
- -
-
-struct mdns_ip_addr_s
-

mDNS query linked list IP item

-
-

Public Members

-
-
-esp_ip_addr_t addr
-

IP address

-
- -
-
-struct mdns_ip_addr_s *next
-

next IP, or NULL for the last IP in the list

-
- -
-
- -
-
-struct mdns_result_s
-

mDNS query result structure

-
-

Public Members

-
-
-struct mdns_result_s *next
-

next result, or NULL for the last result in the list

-
- -
-
-esp_netif_t *esp_netif
-

ptr to corresponding esp-netif

-
- -
-
-uint32_t ttl
-

time to live

-
- -
-
-mdns_ip_protocol_t ip_protocol
-

ip_protocol type of the interface (v4/v6)

-
- -
-
-char *instance_name
-

instance name

-
- -
-
-char *service_type
-

service type

-
- -
-
-char *proto
-

srevice protocol

-
- -
-
-char *hostname
-

hostname

-
- -
-
-uint16_t port
-

service port

-
- -
-
-mdns_txt_item_t *txt
-

txt record

-
- -
-
-uint8_t *txt_value_len
-

array of txt value len of each record

-
- -
-
-size_t txt_count
-

number of txt items

-
- -
-
-mdns_ip_addr_t *addr
-

linked list of IP addresses found

-
- -
-
- -
-
-

Macros

-
-
-MDNS_TYPE_A
-
- -
-
-MDNS_TYPE_PTR
-
- -
-
-MDNS_TYPE_TXT
-
- -
-
-MDNS_TYPE_AAAA
-
- -
-
-MDNS_TYPE_SRV
-
- -
-
-MDNS_TYPE_OPT
-
- -
-
-MDNS_TYPE_NSEC
-
- -
-
-MDNS_TYPE_ANY
-
- -
-
-

Type Definitions

-
-
-typedef struct mdns_search_once_s mdns_search_once_t
-

Asynchronous query handle.

-
- -
-
-typedef struct mdns_ip_addr_s mdns_ip_addr_t
-

mDNS query linked list IP item

-
- -
-
-typedef struct mdns_result_s mdns_result_t
-

mDNS query result structure

-
- -
-
-typedef void (*mdns_query_notify_t)(mdns_search_once_t *search)
-
- -
-
-

Enumerations

-
-
-enum mdns_event_actions_t
-

Values:

-
-
-enumerator MDNS_EVENT_ENABLE_IP4
-
- -
-
-enumerator MDNS_EVENT_ENABLE_IP6
-
- -
-
-enumerator MDNS_EVENT_ANNOUNCE_IP4
-
- -
-
-enumerator MDNS_EVENT_ANNOUNCE_IP6
-
- -
-
-enumerator MDNS_EVENT_DISABLE_IP4
-
- -
-
-enumerator MDNS_EVENT_DISABLE_IP6
-
- -
-
-enumerator MDNS_EVENT_IP4_REVERSE_LOOKUP
-
- -
-
-enumerator MDNS_EVENT_IP6_REVERSE_LOOKUP
-
- -
- -
-
-enum mdns_ip_protocol_t
-

mDNS enum to specify the ip_protocol type

-

Values:

-
-
-enumerator MDNS_IP_PROTOCOL_V4
-
- -
-
-enumerator MDNS_IP_PROTOCOL_V6
-
- -
-
-enumerator MDNS_IP_PROTOCOL_MAX
-
- -
- -
-
-enum mdns_query_transmission_type_t
-

mDNS query type to be explicitly set to either Unicast or Multicast

-

Values:

-
-
-enumerator MDNS_QUERY_UNICAST
-
- -
-
-enumerator MDNS_QUERY_MULTICAST
-
- -
- -
-
-
- - -
-
- -
-
-
-
- - - - - diff --git a/mdns/en/objects.inv b/mdns/en/objects.inv deleted file mode 100644 index dca8b14cd..000000000 Binary files a/mdns/en/objects.inv and /dev/null differ diff --git a/mdns/en/search.html b/mdns/en/search.html deleted file mode 100644 index 7b9bb7832..000000000 --- a/mdns/en/search.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - Search - ESP32 - — ESP-Protocols latest documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
- -
-
-
-
    -
  • »
  • -
  • Search
  • -
  • -
  • -
-
-
-
-
- - - - -
- -
- -
-
- -
-
-
-
- - - - - - - - - - \ No newline at end of file diff --git a/mdns/en/searchindex.js b/mdns/en/searchindex.js deleted file mode 100644 index 63a378e1e..000000000 --- a/mdns/en/searchindex.js +++ /dev/null @@ -1 +0,0 @@ -Search.setIndex({docnames:["index"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":5,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":3,"sphinx.domains.rst":2,"sphinx.domains.std":2,"sphinx.ext.todo":2,sphinx:56},filenames:["index.rst"],objects:{"":[[0,0,1,"c.MDNS_TYPE_A","MDNS_TYPE_A"],[0,0,1,"c.MDNS_TYPE_AAAA","MDNS_TYPE_AAAA"],[0,0,1,"c.MDNS_TYPE_ANY","MDNS_TYPE_ANY"],[0,0,1,"c.MDNS_TYPE_NSEC","MDNS_TYPE_NSEC"],[0,0,1,"c.MDNS_TYPE_OPT","MDNS_TYPE_OPT"],[0,0,1,"c.MDNS_TYPE_PTR","MDNS_TYPE_PTR"],[0,0,1,"c.MDNS_TYPE_SRV","MDNS_TYPE_SRV"],[0,0,1,"c.MDNS_TYPE_TXT","MDNS_TYPE_TXT"],[0,1,1,"_CPPv4N20mdns_event_actions_t23MDNS_EVENT_ANNOUNCE_IP4E","MDNS_EVENT_ANNOUNCE_IP4"],[0,1,1,"_CPPv4N20mdns_event_actions_t23MDNS_EVENT_ANNOUNCE_IP6E","MDNS_EVENT_ANNOUNCE_IP6"],[0,1,1,"_CPPv4N20mdns_event_actions_t22MDNS_EVENT_DISABLE_IP4E","MDNS_EVENT_DISABLE_IP4"],[0,1,1,"_CPPv4N20mdns_event_actions_t22MDNS_EVENT_DISABLE_IP6E","MDNS_EVENT_DISABLE_IP6"],[0,1,1,"_CPPv4N20mdns_event_actions_t21MDNS_EVENT_ENABLE_IP4E","MDNS_EVENT_ENABLE_IP4"],[0,1,1,"_CPPv4N20mdns_event_actions_t21MDNS_EVENT_ENABLE_IP6E","MDNS_EVENT_ENABLE_IP6"],[0,1,1,"_CPPv4N20mdns_event_actions_t29MDNS_EVENT_IP4_REVERSE_LOOKUPE","MDNS_EVENT_IP4_REVERSE_LOOKUP"],[0,1,1,"_CPPv4N20mdns_event_actions_t29MDNS_EVENT_IP6_REVERSE_LOOKUPE","MDNS_EVENT_IP6_REVERSE_LOOKUP"],[0,1,1,"_CPPv4N18mdns_ip_protocol_t20MDNS_IP_PROTOCOL_MAXE","MDNS_IP_PROTOCOL_MAX"],[0,1,1,"_CPPv4N18mdns_ip_protocol_t19MDNS_IP_PROTOCOL_V4E","MDNS_IP_PROTOCOL_V4"],[0,1,1,"_CPPv4N18mdns_ip_protocol_t19MDNS_IP_PROTOCOL_V6E","MDNS_IP_PROTOCOL_V6"],[0,1,1,"_CPPv4N30mdns_query_transmission_type_t20MDNS_QUERY_MULTICASTE","MDNS_QUERY_MULTICAST"],[0,1,1,"_CPPv4N30mdns_query_transmission_type_t18MDNS_QUERY_UNICASTE","MDNS_QUERY_UNICAST"],[0,2,1,"_CPPv426mdns_delegate_hostname_addPKcPK14mdns_ip_addr_t","mdns_delegate_hostname_add"],[0,3,1,"_CPPv426mdns_delegate_hostname_addPKcPK14mdns_ip_addr_t","mdns_delegate_hostname_add::address_list"],[0,3,1,"_CPPv426mdns_delegate_hostname_addPKcPK14mdns_ip_addr_t","mdns_delegate_hostname_add::hostname"],[0,2,1,"_CPPv429mdns_delegate_hostname_removePKc","mdns_delegate_hostname_remove"],[0,3,1,"_CPPv429mdns_delegate_hostname_removePKc","mdns_delegate_hostname_remove::hostname"],[0,4,1,"_CPPv420mdns_event_actions_t","mdns_event_actions_t"],[0,1,1,"_CPPv4N20mdns_event_actions_t23MDNS_EVENT_ANNOUNCE_IP4E","mdns_event_actions_t::MDNS_EVENT_ANNOUNCE_IP4"],[0,1,1,"_CPPv4N20mdns_event_actions_t23MDNS_EVENT_ANNOUNCE_IP6E","mdns_event_actions_t::MDNS_EVENT_ANNOUNCE_IP6"],[0,1,1,"_CPPv4N20mdns_event_actions_t22MDNS_EVENT_DISABLE_IP4E","mdns_event_actions_t::MDNS_EVENT_DISABLE_IP4"],[0,1,1,"_CPPv4N20mdns_event_actions_t22MDNS_EVENT_DISABLE_IP6E","mdns_event_actions_t::MDNS_EVENT_DISABLE_IP6"],[0,1,1,"_CPPv4N20mdns_event_actions_t21MDNS_EVENT_ENABLE_IP4E","mdns_event_actions_t::MDNS_EVENT_ENABLE_IP4"],[0,1,1,"_CPPv4N20mdns_event_actions_t21MDNS_EVENT_ENABLE_IP6E","mdns_event_actions_t::MDNS_EVENT_ENABLE_IP6"],[0,1,1,"_CPPv4N20mdns_event_actions_t29MDNS_EVENT_IP4_REVERSE_LOOKUPE","mdns_event_actions_t::MDNS_EVENT_IP4_REVERSE_LOOKUP"],[0,1,1,"_CPPv4N20mdns_event_actions_t29MDNS_EVENT_IP6_REVERSE_LOOKUPE","mdns_event_actions_t::MDNS_EVENT_IP6_REVERSE_LOOKUP"],[0,2,1,"_CPPv49mdns_freev","mdns_free"],[0,2,1,"_CPPv420mdns_hostname_existsPKc","mdns_hostname_exists"],[0,3,1,"_CPPv420mdns_hostname_existsPKc","mdns_hostname_exists::hostname"],[0,2,1,"_CPPv417mdns_hostname_setPKc","mdns_hostname_set"],[0,3,1,"_CPPv417mdns_hostname_setPKc","mdns_hostname_set::hostname"],[0,2,1,"_CPPv49mdns_initv","mdns_init"],[0,2,1,"_CPPv422mdns_instance_name_setPKc","mdns_instance_name_set"],[0,3,1,"_CPPv422mdns_instance_name_setPKc","mdns_instance_name_set::instance_name"],[0,5,1,"_CPPv414mdns_ip_addr_s","mdns_ip_addr_s"],[0,6,1,"_CPPv4N14mdns_ip_addr_s4addrE","mdns_ip_addr_s::addr"],[0,6,1,"_CPPv4N14mdns_ip_addr_s4nextE","mdns_ip_addr_s::next"],[0,7,1,"_CPPv414mdns_ip_addr_t","mdns_ip_addr_t"],[0,4,1,"_CPPv418mdns_ip_protocol_t","mdns_ip_protocol_t"],[0,1,1,"_CPPv4N18mdns_ip_protocol_t20MDNS_IP_PROTOCOL_MAXE","mdns_ip_protocol_t::MDNS_IP_PROTOCOL_MAX"],[0,1,1,"_CPPv4N18mdns_ip_protocol_t19MDNS_IP_PROTOCOL_V4E","mdns_ip_protocol_t::MDNS_IP_PROTOCOL_V4"],[0,1,1,"_CPPv4N18mdns_ip_protocol_t19MDNS_IP_PROTOCOL_V6E","mdns_ip_protocol_t::MDNS_IP_PROTOCOL_V6"],[0,2,1,"_CPPv417mdns_netif_actionP11esp_netif_t20mdns_event_actions_t","mdns_netif_action"],[0,3,1,"_CPPv417mdns_netif_actionP11esp_netif_t20mdns_event_actions_t","mdns_netif_action::esp_netif"],[0,3,1,"_CPPv417mdns_netif_actionP11esp_netif_t20mdns_event_actions_t","mdns_netif_action::event_action"],[0,2,1,"_CPPv410mdns_queryPKcPKcPKc8uint16_t8uint32_t6size_tPP13mdns_result_t","mdns_query"],[0,3,1,"_CPPv410mdns_queryPKcPKcPKc8uint16_t8uint32_t6size_tPP13mdns_result_t","mdns_query::max_results"],[0,3,1,"_CPPv410mdns_queryPKcPKcPKc8uint16_t8uint32_t6size_tPP13mdns_result_t","mdns_query::name"],[0,3,1,"_CPPv410mdns_queryPKcPKcPKc8uint16_t8uint32_t6size_tPP13mdns_result_t","mdns_query::proto"],[0,3,1,"_CPPv410mdns_queryPKcPKcPKc8uint16_t8uint32_t6size_tPP13mdns_result_t","mdns_query::results"],[0,3,1,"_CPPv410mdns_queryPKcPKcPKc8uint16_t8uint32_t6size_tPP13mdns_result_t","mdns_query::service_type"],[0,3,1,"_CPPv410mdns_queryPKcPKcPKc8uint16_t8uint32_t6size_tPP13mdns_result_t","mdns_query::timeout"],[0,3,1,"_CPPv410mdns_queryPKcPKcPKc8uint16_t8uint32_t6size_tPP13mdns_result_t","mdns_query::type"],[0,2,1,"_CPPv412mdns_query_aPKc8uint32_tP14esp_ip4_addr_t","mdns_query_a"],[0,3,1,"_CPPv412mdns_query_aPKc8uint32_tP14esp_ip4_addr_t","mdns_query_a::addr"],[0,3,1,"_CPPv412mdns_query_aPKc8uint32_tP14esp_ip4_addr_t","mdns_query_a::host_name"],[0,3,1,"_CPPv412mdns_query_aPKc8uint32_tP14esp_ip4_addr_t","mdns_query_a::timeout"],[0,2,1,"_CPPv423mdns_query_async_deleteP18mdns_search_once_t","mdns_query_async_delete"],[0,3,1,"_CPPv423mdns_query_async_deleteP18mdns_search_once_t","mdns_query_async_delete::search"],[0,2,1,"_CPPv428mdns_query_async_get_resultsP18mdns_search_once_t8uint32_tPP13mdns_result_tP7uint8_t","mdns_query_async_get_results"],[0,3,1,"_CPPv428mdns_query_async_get_resultsP18mdns_search_once_t8uint32_tPP13mdns_result_tP7uint8_t","mdns_query_async_get_results::num_results"],[0,3,1,"_CPPv428mdns_query_async_get_resultsP18mdns_search_once_t8uint32_tPP13mdns_result_tP7uint8_t","mdns_query_async_get_results::results"],[0,3,1,"_CPPv428mdns_query_async_get_resultsP18mdns_search_once_t8uint32_tPP13mdns_result_tP7uint8_t","mdns_query_async_get_results::search"],[0,3,1,"_CPPv428mdns_query_async_get_resultsP18mdns_search_once_t8uint32_tPP13mdns_result_tP7uint8_t","mdns_query_async_get_results::timeout"],[0,2,1,"_CPPv420mdns_query_async_newPKcPKcPKc8uint16_t8uint32_t6size_t19mdns_query_notify_t","mdns_query_async_new"],[0,3,1,"_CPPv420mdns_query_async_newPKcPKcPKc8uint16_t8uint32_t6size_t19mdns_query_notify_t","mdns_query_async_new::max_results"],[0,3,1,"_CPPv420mdns_query_async_newPKcPKcPKc8uint16_t8uint32_t6size_t19mdns_query_notify_t","mdns_query_async_new::name"],[0,3,1,"_CPPv420mdns_query_async_newPKcPKcPKc8uint16_t8uint32_t6size_t19mdns_query_notify_t","mdns_query_async_new::notifier"],[0,3,1,"_CPPv420mdns_query_async_newPKcPKcPKc8uint16_t8uint32_t6size_t19mdns_query_notify_t","mdns_query_async_new::proto"],[0,3,1,"_CPPv420mdns_query_async_newPKcPKcPKc8uint16_t8uint32_t6size_t19mdns_query_notify_t","mdns_query_async_new::service_type"],[0,3,1,"_CPPv420mdns_query_async_newPKcPKcPKc8uint16_t8uint32_t6size_t19mdns_query_notify_t","mdns_query_async_new::timeout"],[0,3,1,"_CPPv420mdns_query_async_newPKcPKcPKc8uint16_t8uint32_t6size_t19mdns_query_notify_t","mdns_query_async_new::type"],[0,2,1,"_CPPv418mdns_query_genericPKcPKcPKc8uint16_t30mdns_query_transmission_type_t8uint32_t6size_tPP13mdns_result_t","mdns_query_generic"],[0,3,1,"_CPPv418mdns_query_genericPKcPKcPKc8uint16_t30mdns_query_transmission_type_t8uint32_t6size_tPP13mdns_result_t","mdns_query_generic::max_results"],[0,3,1,"_CPPv418mdns_query_genericPKcPKcPKc8uint16_t30mdns_query_transmission_type_t8uint32_t6size_tPP13mdns_result_t","mdns_query_generic::name"],[0,3,1,"_CPPv418mdns_query_genericPKcPKcPKc8uint16_t30mdns_query_transmission_type_t8uint32_t6size_tPP13mdns_result_t","mdns_query_generic::proto"],[0,3,1,"_CPPv418mdns_query_genericPKcPKcPKc8uint16_t30mdns_query_transmission_type_t8uint32_t6size_tPP13mdns_result_t","mdns_query_generic::results"],[0,3,1,"_CPPv418mdns_query_genericPKcPKcPKc8uint16_t30mdns_query_transmission_type_t8uint32_t6size_tPP13mdns_result_t","mdns_query_generic::service_type"],[0,3,1,"_CPPv418mdns_query_genericPKcPKcPKc8uint16_t30mdns_query_transmission_type_t8uint32_t6size_tPP13mdns_result_t","mdns_query_generic::timeout"],[0,3,1,"_CPPv418mdns_query_genericPKcPKcPKc8uint16_t30mdns_query_transmission_type_t8uint32_t6size_tPP13mdns_result_t","mdns_query_generic::transmission_type"],[0,3,1,"_CPPv418mdns_query_genericPKcPKcPKc8uint16_t30mdns_query_transmission_type_t8uint32_t6size_tPP13mdns_result_t","mdns_query_generic::type"],[0,7,1,"_CPPv419mdns_query_notify_t","mdns_query_notify_t"],[0,2,1,"_CPPv414mdns_query_ptrPKcPKc8uint32_t6size_tPP13mdns_result_t","mdns_query_ptr"],[0,3,1,"_CPPv414mdns_query_ptrPKcPKc8uint32_t6size_tPP13mdns_result_t","mdns_query_ptr::max_results"],[0,3,1,"_CPPv414mdns_query_ptrPKcPKc8uint32_t6size_tPP13mdns_result_t","mdns_query_ptr::proto"],[0,3,1,"_CPPv414mdns_query_ptrPKcPKc8uint32_t6size_tPP13mdns_result_t","mdns_query_ptr::results"],[0,3,1,"_CPPv414mdns_query_ptrPKcPKc8uint32_t6size_tPP13mdns_result_t","mdns_query_ptr::service_type"],[0,3,1,"_CPPv414mdns_query_ptrPKcPKc8uint32_t6size_tPP13mdns_result_t","mdns_query_ptr::timeout"],[0,2,1,"_CPPv423mdns_query_results_freeP13mdns_result_t","mdns_query_results_free"],[0,3,1,"_CPPv423mdns_query_results_freeP13mdns_result_t","mdns_query_results_free::results"],[0,2,1,"_CPPv414mdns_query_srvPKcPKcPKc8uint32_tPP13mdns_result_t","mdns_query_srv"],[0,3,1,"_CPPv414mdns_query_srvPKcPKcPKc8uint32_tPP13mdns_result_t","mdns_query_srv::instance_name"],[0,3,1,"_CPPv414mdns_query_srvPKcPKcPKc8uint32_tPP13mdns_result_t","mdns_query_srv::proto"],[0,3,1,"_CPPv414mdns_query_srvPKcPKcPKc8uint32_tPP13mdns_result_t","mdns_query_srv::result"],[0,3,1,"_CPPv414mdns_query_srvPKcPKcPKc8uint32_tPP13mdns_result_t","mdns_query_srv::service_type"],[0,3,1,"_CPPv414mdns_query_srvPKcPKcPKc8uint32_tPP13mdns_result_t","mdns_query_srv::timeout"],[0,4,1,"_CPPv430mdns_query_transmission_type_t","mdns_query_transmission_type_t"],[0,1,1,"_CPPv4N30mdns_query_transmission_type_t20MDNS_QUERY_MULTICASTE","mdns_query_transmission_type_t::MDNS_QUERY_MULTICAST"],[0,1,1,"_CPPv4N30mdns_query_transmission_type_t18MDNS_QUERY_UNICASTE","mdns_query_transmission_type_t::MDNS_QUERY_UNICAST"],[0,2,1,"_CPPv414mdns_query_txtPKcPKcPKc8uint32_tPP13mdns_result_t","mdns_query_txt"],[0,3,1,"_CPPv414mdns_query_txtPKcPKcPKc8uint32_tPP13mdns_result_t","mdns_query_txt::instance_name"],[0,3,1,"_CPPv414mdns_query_txtPKcPKcPKc8uint32_tPP13mdns_result_t","mdns_query_txt::proto"],[0,3,1,"_CPPv414mdns_query_txtPKcPKcPKc8uint32_tPP13mdns_result_t","mdns_query_txt::result"],[0,3,1,"_CPPv414mdns_query_txtPKcPKcPKc8uint32_tPP13mdns_result_t","mdns_query_txt::service_type"],[0,3,1,"_CPPv414mdns_query_txtPKcPKcPKc8uint32_tPP13mdns_result_t","mdns_query_txt::timeout"],[0,2,1,"_CPPv419mdns_register_netifP11esp_netif_t","mdns_register_netif"],[0,3,1,"_CPPv419mdns_register_netifP11esp_netif_t","mdns_register_netif::esp_netif"],[0,5,1,"_CPPv413mdns_result_s","mdns_result_s"],[0,6,1,"_CPPv4N13mdns_result_s4addrE","mdns_result_s::addr"],[0,6,1,"_CPPv4N13mdns_result_s9esp_netifE","mdns_result_s::esp_netif"],[0,6,1,"_CPPv4N13mdns_result_s8hostnameE","mdns_result_s::hostname"],[0,6,1,"_CPPv4N13mdns_result_s13instance_nameE","mdns_result_s::instance_name"],[0,6,1,"_CPPv4N13mdns_result_s11ip_protocolE","mdns_result_s::ip_protocol"],[0,6,1,"_CPPv4N13mdns_result_s4nextE","mdns_result_s::next"],[0,6,1,"_CPPv4N13mdns_result_s4portE","mdns_result_s::port"],[0,6,1,"_CPPv4N13mdns_result_s5protoE","mdns_result_s::proto"],[0,6,1,"_CPPv4N13mdns_result_s12service_typeE","mdns_result_s::service_type"],[0,6,1,"_CPPv4N13mdns_result_s3ttlE","mdns_result_s::ttl"],[0,6,1,"_CPPv4N13mdns_result_s3txtE","mdns_result_s::txt"],[0,6,1,"_CPPv4N13mdns_result_s9txt_countE","mdns_result_s::txt_count"],[0,6,1,"_CPPv4N13mdns_result_s13txt_value_lenE","mdns_result_s::txt_value_len"],[0,7,1,"_CPPv413mdns_result_t","mdns_result_t"],[0,7,1,"_CPPv418mdns_search_once_t","mdns_search_once_t"],[0,2,1,"_CPPv416mdns_service_addPKcPKcPKc8uint16_tA_15mdns_txt_item_t6size_t","mdns_service_add"],[0,3,1,"_CPPv416mdns_service_addPKcPKcPKc8uint16_tA_15mdns_txt_item_t6size_t","mdns_service_add::instance_name"],[0,3,1,"_CPPv416mdns_service_addPKcPKcPKc8uint16_tA_15mdns_txt_item_t6size_t","mdns_service_add::num_items"],[0,3,1,"_CPPv416mdns_service_addPKcPKcPKc8uint16_tA_15mdns_txt_item_t6size_t","mdns_service_add::port"],[0,3,1,"_CPPv416mdns_service_addPKcPKcPKc8uint16_tA_15mdns_txt_item_t6size_t","mdns_service_add::proto"],[0,3,1,"_CPPv416mdns_service_addPKcPKcPKc8uint16_tA_15mdns_txt_item_t6size_t","mdns_service_add::service_type"],[0,3,1,"_CPPv416mdns_service_addPKcPKcPKc8uint16_tA_15mdns_txt_item_t6size_t","mdns_service_add::txt"],[0,2,1,"_CPPv425mdns_service_add_for_hostPKcPKcPKcPKc8uint16_tA_15mdns_txt_item_t6size_t","mdns_service_add_for_host"],[0,3,1,"_CPPv425mdns_service_add_for_hostPKcPKcPKcPKc8uint16_tA_15mdns_txt_item_t6size_t","mdns_service_add_for_host::hostname"],[0,3,1,"_CPPv425mdns_service_add_for_hostPKcPKcPKcPKc8uint16_tA_15mdns_txt_item_t6size_t","mdns_service_add_for_host::instance_name"],[0,3,1,"_CPPv425mdns_service_add_for_hostPKcPKcPKcPKc8uint16_tA_15mdns_txt_item_t6size_t","mdns_service_add_for_host::num_items"],[0,3,1,"_CPPv425mdns_service_add_for_hostPKcPKcPKcPKc8uint16_tA_15mdns_txt_item_t6size_t","mdns_service_add_for_host::port"],[0,3,1,"_CPPv425mdns_service_add_for_hostPKcPKcPKcPKc8uint16_tA_15mdns_txt_item_t6size_t","mdns_service_add_for_host::proto"],[0,3,1,"_CPPv425mdns_service_add_for_hostPKcPKcPKcPKc8uint16_tA_15mdns_txt_item_t6size_t","mdns_service_add_for_host::service_type"],[0,3,1,"_CPPv425mdns_service_add_for_hostPKcPKcPKcPKc8uint16_tA_15mdns_txt_item_t6size_t","mdns_service_add_for_host::txt"],[0,2,1,"_CPPv419mdns_service_existsPKcPKcPKc","mdns_service_exists"],[0,3,1,"_CPPv419mdns_service_existsPKcPKcPKc","mdns_service_exists::hostname"],[0,3,1,"_CPPv419mdns_service_existsPKcPKcPKc","mdns_service_exists::proto"],[0,3,1,"_CPPv419mdns_service_existsPKcPKcPKc","mdns_service_exists::service_type"],[0,2,1,"_CPPv433mdns_service_exists_with_instancePKcPKcPKcPKc","mdns_service_exists_with_instance"],[0,3,1,"_CPPv433mdns_service_exists_with_instancePKcPKcPKcPKc","mdns_service_exists_with_instance::hostname"],[0,3,1,"_CPPv433mdns_service_exists_with_instancePKcPKcPKcPKc","mdns_service_exists_with_instance::instance"],[0,3,1,"_CPPv433mdns_service_exists_with_instancePKcPKcPKcPKc","mdns_service_exists_with_instance::proto"],[0,3,1,"_CPPv433mdns_service_exists_with_instancePKcPKcPKcPKc","mdns_service_exists_with_instance::service_type"],[0,2,1,"_CPPv430mdns_service_instance_name_setPKcPKcPKc","mdns_service_instance_name_set"],[0,3,1,"_CPPv430mdns_service_instance_name_setPKcPKcPKc","mdns_service_instance_name_set::instance_name"],[0,3,1,"_CPPv430mdns_service_instance_name_setPKcPKcPKc","mdns_service_instance_name_set::proto"],[0,3,1,"_CPPv430mdns_service_instance_name_setPKcPKcPKc","mdns_service_instance_name_set::service_type"],[0,2,1,"_CPPv439mdns_service_instance_name_set_for_hostPKcPKcPKcPKcPKc","mdns_service_instance_name_set_for_host"],[0,3,1,"_CPPv439mdns_service_instance_name_set_for_hostPKcPKcPKcPKcPKc","mdns_service_instance_name_set_for_host::hostname"],[0,3,1,"_CPPv439mdns_service_instance_name_set_for_hostPKcPKcPKcPKcPKc","mdns_service_instance_name_set_for_host::instance_name"],[0,3,1,"_CPPv439mdns_service_instance_name_set_for_hostPKcPKcPKcPKcPKc","mdns_service_instance_name_set_for_host::instance_old"],[0,3,1,"_CPPv439mdns_service_instance_name_set_for_hostPKcPKcPKcPKcPKc","mdns_service_instance_name_set_for_host::proto"],[0,3,1,"_CPPv439mdns_service_instance_name_set_for_hostPKcPKcPKcPKcPKc","mdns_service_instance_name_set_for_host::service_type"],[0,2,1,"_CPPv421mdns_service_port_setPKcPKc8uint16_t","mdns_service_port_set"],[0,3,1,"_CPPv421mdns_service_port_setPKcPKc8uint16_t","mdns_service_port_set::port"],[0,3,1,"_CPPv421mdns_service_port_setPKcPKc8uint16_t","mdns_service_port_set::proto"],[0,3,1,"_CPPv421mdns_service_port_setPKcPKc8uint16_t","mdns_service_port_set::service_type"],[0,2,1,"_CPPv430mdns_service_port_set_for_hostPKcPKcPKcPKc8uint16_t","mdns_service_port_set_for_host"],[0,3,1,"_CPPv430mdns_service_port_set_for_hostPKcPKcPKcPKc8uint16_t","mdns_service_port_set_for_host::hostname"],[0,3,1,"_CPPv430mdns_service_port_set_for_hostPKcPKcPKcPKc8uint16_t","mdns_service_port_set_for_host::instance"],[0,3,1,"_CPPv430mdns_service_port_set_for_hostPKcPKcPKcPKc8uint16_t","mdns_service_port_set_for_host::port"],[0,3,1,"_CPPv430mdns_service_port_set_for_hostPKcPKcPKcPKc8uint16_t","mdns_service_port_set_for_host::proto"],[0,3,1,"_CPPv430mdns_service_port_set_for_hostPKcPKcPKcPKc8uint16_t","mdns_service_port_set_for_host::service_type"],[0,2,1,"_CPPv419mdns_service_removePKcPKc","mdns_service_remove"],[0,3,1,"_CPPv419mdns_service_removePKcPKc","mdns_service_remove::proto"],[0,3,1,"_CPPv419mdns_service_removePKcPKc","mdns_service_remove::service_type"],[0,2,1,"_CPPv423mdns_service_remove_allv","mdns_service_remove_all"],[0,2,1,"_CPPv428mdns_service_remove_for_hostPKcPKcPKcPKc","mdns_service_remove_for_host"],[0,3,1,"_CPPv428mdns_service_remove_for_hostPKcPKcPKcPKc","mdns_service_remove_for_host::hostname"],[0,3,1,"_CPPv428mdns_service_remove_for_hostPKcPKcPKcPKc","mdns_service_remove_for_host::instance"],[0,3,1,"_CPPv428mdns_service_remove_for_hostPKcPKcPKcPKc","mdns_service_remove_for_host::proto"],[0,3,1,"_CPPv428mdns_service_remove_for_hostPKcPKcPKcPKc","mdns_service_remove_for_host::service_type"],[0,2,1,"_CPPv433mdns_service_subtype_add_for_hostPKcPKcPKcPKcPKc","mdns_service_subtype_add_for_host"],[0,3,1,"_CPPv433mdns_service_subtype_add_for_hostPKcPKcPKcPKcPKc","mdns_service_subtype_add_for_host::hostname"],[0,3,1,"_CPPv433mdns_service_subtype_add_for_hostPKcPKcPKcPKcPKc","mdns_service_subtype_add_for_host::instance_name"],[0,3,1,"_CPPv433mdns_service_subtype_add_for_hostPKcPKcPKcPKcPKc","mdns_service_subtype_add_for_host::proto"],[0,3,1,"_CPPv433mdns_service_subtype_add_for_hostPKcPKcPKcPKcPKc","mdns_service_subtype_add_for_host::service_type"],[0,3,1,"_CPPv433mdns_service_subtype_add_for_hostPKcPKcPKcPKcPKc","mdns_service_subtype_add_for_host::subtype"],[0,2,1,"_CPPv428mdns_service_txt_item_removePKcPKcPKc","mdns_service_txt_item_remove"],[0,3,1,"_CPPv428mdns_service_txt_item_removePKcPKcPKc","mdns_service_txt_item_remove::key"],[0,3,1,"_CPPv428mdns_service_txt_item_removePKcPKcPKc","mdns_service_txt_item_remove::proto"],[0,3,1,"_CPPv428mdns_service_txt_item_removePKcPKcPKc","mdns_service_txt_item_remove::service_type"],[0,2,1,"_CPPv437mdns_service_txt_item_remove_for_hostPKcPKcPKcPKcPKc","mdns_service_txt_item_remove_for_host"],[0,3,1,"_CPPv437mdns_service_txt_item_remove_for_hostPKcPKcPKcPKcPKc","mdns_service_txt_item_remove_for_host::hostname"],[0,3,1,"_CPPv437mdns_service_txt_item_remove_for_hostPKcPKcPKcPKcPKc","mdns_service_txt_item_remove_for_host::instance"],[0,3,1,"_CPPv437mdns_service_txt_item_remove_for_hostPKcPKcPKcPKcPKc","mdns_service_txt_item_remove_for_host::key"],[0,3,1,"_CPPv437mdns_service_txt_item_remove_for_hostPKcPKcPKcPKcPKc","mdns_service_txt_item_remove_for_host::proto"],[0,3,1,"_CPPv437mdns_service_txt_item_remove_for_hostPKcPKcPKcPKcPKc","mdns_service_txt_item_remove_for_host::service_type"],[0,2,1,"_CPPv425mdns_service_txt_item_setPKcPKcPKcPKc","mdns_service_txt_item_set"],[0,3,1,"_CPPv425mdns_service_txt_item_setPKcPKcPKcPKc","mdns_service_txt_item_set::key"],[0,3,1,"_CPPv425mdns_service_txt_item_setPKcPKcPKcPKc","mdns_service_txt_item_set::proto"],[0,3,1,"_CPPv425mdns_service_txt_item_setPKcPKcPKcPKc","mdns_service_txt_item_set::service_type"],[0,3,1,"_CPPv425mdns_service_txt_item_setPKcPKcPKcPKc","mdns_service_txt_item_set::value"],[0,2,1,"_CPPv434mdns_service_txt_item_set_for_hostPKcPKcPKcPKcPKcPKc","mdns_service_txt_item_set_for_host"],[0,3,1,"_CPPv434mdns_service_txt_item_set_for_hostPKcPKcPKcPKcPKcPKc","mdns_service_txt_item_set_for_host::hostname"],[0,3,1,"_CPPv434mdns_service_txt_item_set_for_hostPKcPKcPKcPKcPKcPKc","mdns_service_txt_item_set_for_host::instance"],[0,3,1,"_CPPv434mdns_service_txt_item_set_for_hostPKcPKcPKcPKcPKcPKc","mdns_service_txt_item_set_for_host::key"],[0,3,1,"_CPPv434mdns_service_txt_item_set_for_hostPKcPKcPKcPKcPKcPKc","mdns_service_txt_item_set_for_host::proto"],[0,3,1,"_CPPv434mdns_service_txt_item_set_for_hostPKcPKcPKcPKcPKcPKc","mdns_service_txt_item_set_for_host::service_type"],[0,3,1,"_CPPv434mdns_service_txt_item_set_for_hostPKcPKcPKcPKcPKcPKc","mdns_service_txt_item_set_for_host::value"],[0,2,1,"_CPPv458mdns_service_txt_item_set_for_host_with_explicit_value_lenPKcPKcPKcPKcPKcPKc7uint8_t","mdns_service_txt_item_set_for_host_with_explicit_value_len"],[0,3,1,"_CPPv458mdns_service_txt_item_set_for_host_with_explicit_value_lenPKcPKcPKcPKcPKcPKc7uint8_t","mdns_service_txt_item_set_for_host_with_explicit_value_len::hostname"],[0,3,1,"_CPPv458mdns_service_txt_item_set_for_host_with_explicit_value_lenPKcPKcPKcPKcPKcPKc7uint8_t","mdns_service_txt_item_set_for_host_with_explicit_value_len::instance"],[0,3,1,"_CPPv458mdns_service_txt_item_set_for_host_with_explicit_value_lenPKcPKcPKcPKcPKcPKc7uint8_t","mdns_service_txt_item_set_for_host_with_explicit_value_len::key"],[0,3,1,"_CPPv458mdns_service_txt_item_set_for_host_with_explicit_value_lenPKcPKcPKcPKcPKcPKc7uint8_t","mdns_service_txt_item_set_for_host_with_explicit_value_len::proto"],[0,3,1,"_CPPv458mdns_service_txt_item_set_for_host_with_explicit_value_lenPKcPKcPKcPKcPKcPKc7uint8_t","mdns_service_txt_item_set_for_host_with_explicit_value_len::service_type"],[0,3,1,"_CPPv458mdns_service_txt_item_set_for_host_with_explicit_value_lenPKcPKcPKcPKcPKcPKc7uint8_t","mdns_service_txt_item_set_for_host_with_explicit_value_len::value"],[0,3,1,"_CPPv458mdns_service_txt_item_set_for_host_with_explicit_value_lenPKcPKcPKcPKcPKcPKc7uint8_t","mdns_service_txt_item_set_for_host_with_explicit_value_len::value_len"],[0,2,1,"_CPPv449mdns_service_txt_item_set_with_explicit_value_lenPKcPKcPKcPKc7uint8_t","mdns_service_txt_item_set_with_explicit_value_len"],[0,3,1,"_CPPv449mdns_service_txt_item_set_with_explicit_value_lenPKcPKcPKcPKc7uint8_t","mdns_service_txt_item_set_with_explicit_value_len::key"],[0,3,1,"_CPPv449mdns_service_txt_item_set_with_explicit_value_lenPKcPKcPKcPKc7uint8_t","mdns_service_txt_item_set_with_explicit_value_len::proto"],[0,3,1,"_CPPv449mdns_service_txt_item_set_with_explicit_value_lenPKcPKcPKcPKc7uint8_t","mdns_service_txt_item_set_with_explicit_value_len::service_type"],[0,3,1,"_CPPv449mdns_service_txt_item_set_with_explicit_value_lenPKcPKcPKcPKc7uint8_t","mdns_service_txt_item_set_with_explicit_value_len::value"],[0,3,1,"_CPPv449mdns_service_txt_item_set_with_explicit_value_lenPKcPKcPKcPKc7uint8_t","mdns_service_txt_item_set_with_explicit_value_len::value_len"],[0,2,1,"_CPPv420mdns_service_txt_setPKcPKcA_15mdns_txt_item_t7uint8_t","mdns_service_txt_set"],[0,3,1,"_CPPv420mdns_service_txt_setPKcPKcA_15mdns_txt_item_t7uint8_t","mdns_service_txt_set::num_items"],[0,3,1,"_CPPv420mdns_service_txt_setPKcPKcA_15mdns_txt_item_t7uint8_t","mdns_service_txt_set::proto"],[0,3,1,"_CPPv420mdns_service_txt_setPKcPKcA_15mdns_txt_item_t7uint8_t","mdns_service_txt_set::service_type"],[0,3,1,"_CPPv420mdns_service_txt_setPKcPKcA_15mdns_txt_item_t7uint8_t","mdns_service_txt_set::txt"],[0,2,1,"_CPPv429mdns_service_txt_set_for_hostPKcPKcPKcPKcA_15mdns_txt_item_t7uint8_t","mdns_service_txt_set_for_host"],[0,3,1,"_CPPv429mdns_service_txt_set_for_hostPKcPKcPKcPKcA_15mdns_txt_item_t7uint8_t","mdns_service_txt_set_for_host::hostname"],[0,3,1,"_CPPv429mdns_service_txt_set_for_hostPKcPKcPKcPKcA_15mdns_txt_item_t7uint8_t","mdns_service_txt_set_for_host::instance"],[0,3,1,"_CPPv429mdns_service_txt_set_for_hostPKcPKcPKcPKcA_15mdns_txt_item_t7uint8_t","mdns_service_txt_set_for_host::num_items"],[0,3,1,"_CPPv429mdns_service_txt_set_for_hostPKcPKcPKcPKcA_15mdns_txt_item_t7uint8_t","mdns_service_txt_set_for_host::proto"],[0,3,1,"_CPPv429mdns_service_txt_set_for_hostPKcPKcPKcPKcA_15mdns_txt_item_t7uint8_t","mdns_service_txt_set_for_host::service_type"],[0,3,1,"_CPPv429mdns_service_txt_set_for_hostPKcPKcPKcPKcA_15mdns_txt_item_t7uint8_t","mdns_service_txt_set_for_host::txt"],[0,5,1,"_CPPv415mdns_txt_item_t","mdns_txt_item_t"],[0,6,1,"_CPPv4N15mdns_txt_item_t3keyE","mdns_txt_item_t::key"],[0,6,1,"_CPPv4N15mdns_txt_item_t5valueE","mdns_txt_item_t::value"],[0,2,1,"_CPPv421mdns_unregister_netifP11esp_netif_t","mdns_unregister_netif"],[0,3,1,"_CPPv421mdns_unregister_netifP11esp_netif_t","mdns_unregister_netif::esp_netif"]]},objnames:{"0":["c","macro","C macro"],"1":["cpp","enumerator","C++ enumerator"],"2":["cpp","function","C++ function"],"3":["cpp","functionParam","C++ function parameter"],"4":["cpp","enum","C++ enum"],"5":["cpp","class","C++ class"],"6":["cpp","member","C++ member"],"7":["cpp","type","C++ type"]},objtypes:{"0":"c:macro","1":"cpp:enumerator","2":"cpp:function","3":"cpp:functionParam","4":"cpp:enum","5":"cpp:class","6":"cpp:member","7":"cpp:type"},terms:{"0":0,"1":0,"1234":0,"2":0,"20":0,"2000":0,"3":0,"3000":0,"3232":0,"4321":0,"80":0,"\u4e2d\u6587":0,"char":0,"const":0,"default":0,"enum":0,"int":0,"new":0,"null":0,"public":0,"return":0,"static":0,"true":0,"var":0,"void":0,"while":0,A:0,If:0,No:0,On:0,The:0,_afpovertcp:0,_arduino:0,_ftp:0,_http:0,_ipp:0,_myservic:0,_nf:0,_printer:0,_smb:0,_tcp:0,_udp:0,aaaa:0,about:0,abov:0,action:0,activ:0,actual:0,ad:0,add:0,add_mdns_servic:0,addr:0,address:0,address_list:0,advertis:0,after:0,all:0,alreadi:0,also:0,although:0,an:0,ani:0,announc:0,answer:0,ap:0,appl:0,ar:0,arrai:0,asynchron:0,asynchronous:0,automat:0,avahi:0,avail:0,basic:0,been:0,befor:0,below:0,board:0,bonjour:0,bool:0,brows:0,bye:0,call:0,can:0,chang:0,check:0,collect:0,common:0,config:0,config_freertos_unicor:0,config_mdns_max_interfac:0,config_mdns_task_affin:0,config_mdns_task_prior:0,config_mdns_task_stack_s:0,configur:0,conflict:0,connect:0,correspond:0,could:0,cpu0:0,creat:0,current:0,custom:0,d:0,data:0,decid:0,default_inst:0,defin:0,deleg:0,delet:0,deriv:0,desir:0,detail:0,devic:0,differ:0,disabl:0,disconnect:0,discoveri:0,driver:0,dure:0,each:0,eesp32:0,eg:0,either:0,els:0,enabel:0,enabl:0,end:0,enough:0,err:0,error:0,esp32:0,esp:0,esp_err_invalid_arg:0,esp_err_invalid_st:0,esp_err_no_mem:0,esp_err_not_found:0,esp_err_t:0,esp_fail:0,esp_ip4_addr_t:0,esp_ip_addr_t:0,esp_log:0,esp_logw:0,esp_netif:0,esp_netif_t:0,esp_ok:0,etc:0,eth:0,ethernet:0,event:0,event_act:0,explicitli:0,fail:0,fals:0,few:0,find:0,find_mdns_servic:0,finish:0,first:0,follow:0,found:0,free:0,freed:0,friendli:0,from:0,ftp:0,gener:0,get:0,given:0,global:0,h:0,ha:0,handl:0,handler:0,have:0,here:0,host:0,host_nam:0,hostnam:0,http:0,i:0,if_str:0,ignor:0,includ:0,inform:0,init:0,initi:0,instal:0,instanc:0,instance_nam:0,instance_old:0,interfac:0,ip2str:0,ip4:0,ip4_addr:0,ip6:0,ip:0,ip_protocol:0,ip_protocol_str:0,ipaddr_type_v6:0,ipstr:0,ipv4:0,ipv62str:0,ipv6:0,ipv6str:0,item:0,jhon:0,kei:0,kind:0,last:0,len:0,length:0,like:0,link:0,linux:0,list:0,live:0,local:0,look:0,low:0,mac:0,manual:0,max:0,max_result:0,maxim:0,maximum:0,mdns_delegate_hostname_add:0,mdns_delegate_hostname_remov:0,mdns_event_actions_t:0,mdns_event_announce_ip4:0,mdns_event_announce_ip6:0,mdns_event_disable_ip4:0,mdns_event_disable_ip6:0,mdns_event_enable_ip4:0,mdns_event_enable_ip6:0,mdns_event_ip4_reverse_lookup:0,mdns_event_ip6_reverse_lookup:0,mdns_free:0,mdns_hostname_exist:0,mdns_hostname_set:0,mdns_init:0,mdns_instance_name_set:0,mdns_ip_addr_:0,mdns_ip_addr_t:0,mdns_ip_protocol_max:0,mdns_ip_protocol_t:0,mdns_ip_protocol_v4:0,mdns_ip_protocol_v6:0,mdns_multiple_inst:0,mdns_netif_act:0,mdns_print_result:0,mdns_queri:0,mdns_query_a:0,mdns_query_async_delet:0,mdns_query_async_get_result:0,mdns_query_async_new:0,mdns_query_gener:0,mdns_query_multicast:0,mdns_query_notify_t:0,mdns_query_ptr:0,mdns_query_results_fre:0,mdns_query_srv:0,mdns_query_transmission_type_t:0,mdns_query_txt:0,mdns_query_unicast:0,mdns_register_netif:0,mdns_result_:0,mdns_result_t:0,mdns_search_once_:0,mdns_search_once_t:0,mdns_service_add:0,mdns_service_add_for_host:0,mdns_service_exist:0,mdns_service_exists_with_inst:0,mdns_service_instance_name_set:0,mdns_service_instance_name_set_for_host:0,mdns_service_port_set:0,mdns_service_port_set_for_host:0,mdns_service_remov:0,mdns_service_remove_al:0,mdns_service_remove_for_host:0,mdns_service_subtype_add_for_host:0,mdns_service_txt_item_remov:0,mdns_service_txt_item_remove_for_host:0,mdns_service_txt_item_set:0,mdns_service_txt_item_set_for_host:0,mdns_service_txt_item_set_for_host_with_explicit_value_len:0,mdns_service_txt_item_set_with_explicit_value_len:0,mdns_service_txt_set:0,mdns_service_txt_set_for_host:0,mdns_txt_item_t:0,mdns_type_:0,mdns_type_a:0,mdns_type_aaaa:0,mdns_type_ani:0,mdns_type_nsec:0,mdns_type_opt:0,mdns_type_ptr:0,mdns_type_srv:0,mdns_type_txt:0,mdns_unregister_netif:0,member:0,memori:0,method:0,millisecond:0,more:0,most:0,multicast:0,multipl:0,must:0,my:0,my_app_some_method:0,n:0,name:0,need:0,netif:0,network:0,next:0,nf:0,note:0,notif:0,notifi:0,num_item:0,num_result:0,number:0,object:0,offer:0,onc:0,one:0,onli:0,oper:0,option:0,origin:0,os:0,other:0,otherwis:0,our:0,output:0,over:0,p:0,packag:0,packet:0,page:0,paramet:0,password:0,pin:0,pleas:0,pointer:0,port:0,preconfigur:0,prepend:0,printer:0,printf:0,prioriti:0,probe:0,progress:0,proto:0,protocol:0,provid:0,ptr:0,r:0,read:0,readi:0,record:0,regist:0,releas:0,remov:0,replac:0,repli:0,requir:0,resolv:0,resolve_mdns_host:0,respond:0,result:0,run:0,s:0,same:0,scanner:0,search:0,see:0,send:0,separ:0,server:0,service_nam:0,service_typ:0,servicetxtdata:0,set:0,share:0,size:0,size_t:0,some:0,specif:0,specifi:0,srevic:0,srv:0,sta:0,stack:0,standard:0,start:0,start_mdns_servic:0,state:0,stop:0,string:0,strlen:0,struct:0,subtyp:0,success:0,successfulli:0,support:0,system:0,t:0,tag:0,task:0,tcpip_if:0,test:0,text:0,them:0,thi:0,thing:0,time:0,timeout:0,transmission_typ:0,ttl:0,txt:0,txt_count:0,txt_value_len:0,typedef:0,u:0,u_addr:0,udp:0,uint16_t:0,uint32_t:0,uint8_t:0,underscor:0,unicast:0,unregist:0,updat:0,us:0,user:0,usual:0,v4:0,v6:0,val:0,valu:0,value_len:0,via:0,wa:0,wait:0,want:0,web:0,when:0,whether:0,which:0,wifi:0,window:0,you:0,your:0,zh_cn:0},titles:["mDNS Service"],titleterms:{"function":0,api:0,applic:0,definit:0,enumer:0,exampl:0,execut:0,file:0,header:0,macro:0,mdn:0,minim:0,optim:0,overview:0,perform:0,properti:0,queri:0,ram:0,refer:0,servic:0,speed:0,structur:0,type:0,usag:0}}) \ No newline at end of file diff --git a/mdns/zh_CN/.buildinfo b/mdns/zh_CN/.buildinfo deleted file mode 100644 index 7484b2bd1..000000000 --- a/mdns/zh_CN/.buildinfo +++ /dev/null @@ -1,4 +0,0 @@ -# Sphinx build info version 1 -# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: c7829b6d6667bd3af7d743aa5a3e9547 -tags: 549b3d6d0415232fb7e35403b330ff49 diff --git a/mdns/zh_CN/_sources/index.rst.txt b/mdns/zh_CN/_sources/index.rst.txt deleted file mode 100644 index cb1c3adc1..000000000 --- a/mdns/zh_CN/_sources/index.rst.txt +++ /dev/null @@ -1,187 +0,0 @@ -mDNS 服务 -========= -`en:[English] `_ - -概述 ----- - -mDNS 是一种组播 UDP 服务,用来提供本地网络服务和主机发现。 - -绝大多数的操作系统默认都会安装 mDNS 服务,或者提供单独的安装包。``Mac OS`` 默认会安装名为 ``Bonjour`` 的服务(该服务基于 mDNS),此外 Apple 还发布了适用于 Windows 系统的安装程序,可以在 `官方支持 `_ 找到。在 ``Linux`` 上,mDNS 服务由 `avahi `_ 提供,通常也会被默认安装。 - -mDNS 属性 -^^^^^^^^^ - - * ``hostname``:设备会去响应的主机名,如果没有设置,会根据设备的网络接口名定义 ``hostname`` 。例如,``my-{IDF_TARGET_PATH_NAME}`` 会被解析为 ``my-{IDF_TARGET_PATH_NAME}.local``。 - * ``default_instance``:默认实例名(即易记的设备名),例如 ``Jhon's {IDF_TARGET_NAME} Thing``。如果没有设置,将会使用 ``hostname``。 - -以下为 STA 接口启动 mDNS 服务并设置 ``hostname`` 和 ``default_instance`` 的示例方法: - -.. highlight:: c - -:: - - void start_mdns_service() - { - // 初始化 mDNS 服务 - esp_err_t err = mdns_init(); - if (err) { - printf("MDNS Init failed: %d\n", err); - return; - } - - // 设置 hostname - mdns_hostname_set("my-{IDF_TARGET_PATH_NAME}"); - // 设置默认实例 - mdns_instance_name_set("Jhon's {IDF_TARGET_NAME} Thing"); - } - -mDNS 服务 -^^^^^^^^^ - -mDNS 可以广播设备能够提供的网络服务的相关信息,每个服务会由以下属性构成。 - - * ``instance_name``:实例名(即易记的服务名),例如 ``Jhon's {IDF_TARGET_NAME} Web Server``。如果没有定义,会使用 ``default_instance``。 - * ``service_type``:(必需)服务类型,以下划线为前缀,`这里 `_ 列出了常见的类型。 - * ``proto``:(必需)服务运行所依赖的协议,以下划线为前缀,例如 ``_tcp`` 或者 ``_udp``。 - * ``port``:(必需)服务运行所用的端口号。 - * ``txt``:形如 ``{var, val}`` 的字符串数组,用于定义服务的属性。 - -添加一些服务和不同属性的示例方法:: - - void add_mdns_services() - { - // 添加服务 - mdns_service_add(NULL, "_http", "_tcp", 80, NULL, 0); - mdns_service_add(NULL, "_arduino", "_tcp", 3232, NULL, 0); - mdns_service_add(NULL, "_myservice", "_udp", 1234, NULL, 0); - - // 注意:必须先添加服务,然后才能设置其属性 - // web 服务器使用自定义的实例名 - mdns_service_instance_name_set("_http", "_tcp", "Jhon's {IDF_TARGET_NAME} Web Server"); - - mdns_txt_item_t serviceTxtData[3] = { - {"board","{IDF_TARGET_PATH_NAME}"}, - {"u","user"}, - {"p","password"} - }; - // 设置服务的文本数据(会释放并替换当前数据) - mdns_service_txt_set("_http", "_tcp", serviceTxtData, 3); - - // 修改服务端口号 - mdns_service_port_set("_myservice", "_udp", 4321); - } - -mDNS 查询 -^^^^^^^^^ - -mDNS 提供查询服务和解析主机 IP/IPv6 地址的方法。 - -服务查询的结果会作为 ``mdns_result_t`` 类型对象的链表返回。 - -解析主机 IP 地址的示例方法:: - - void resolve_mdns_host(const char * host_name) - { - printf("Query A: %s.local", host_name); - - struct ip4_addr addr; - addr.addr = 0; - - esp_err_t err = mdns_query_a(host_name, 2000, &addr); - if(err){ - if(err == ESP_ERR_NOT_FOUND){ - printf("Host was not found!"); - return; - } - printf("Query Failed"); - return; - } - - printf(IPSTR, IP2STR(&addr)); - } - -解析本地服务的示例方法:: - - static const char * if_str[] = {"STA", "AP", "ETH", "MAX"}; - static const char * ip_protocol_str[] = {"V4", "V6", "MAX"}; - - void mdns_print_results(mdns_result_t * results){ - mdns_result_t * r = results; - mdns_ip_addr_t * a = NULL; - int i = 1, t; - while(r){ - printf("%d: Interface: %s, Type: %s\n", i++, if_str[r->tcpip_if], ip_protocol_str[r->ip_protocol]); - if(r->instance_name){ - printf(" PTR : %s\n", r->instance_name); - } - if(r->hostname){ - printf(" SRV : %s.local:%u\n", r->hostname, r->port); - } - if(r->txt_count){ - printf(" TXT : [%u] ", r->txt_count); - for(t=0; ttxt_count; t++){ - printf("%s=%s; ", r->txt[t].key, r->txt[t].value); - } - printf("\n"); - } - a = r->addr; - while(a){ - if(a->addr.type == IPADDR_TYPE_V6){ - printf(" AAAA: " IPV6STR "\n", IPV62STR(a->addr.u_addr.ip6)); - } else { - printf(" A : " IPSTR "\n", IP2STR(&(a->addr.u_addr.ip4))); - } - a = a->next; - } - r = r->next; - } - - } - - void find_mdns_service(const char * service_name, const char * proto) - { - ESP_LOGI(TAG, "Query PTR: %s.%s.local", service_name, proto); - - mdns_result_t * results = NULL; - esp_err_t err = mdns_query_ptr(service_name, proto, 3000, 20, &results); - if(err){ - ESP_LOGE(TAG, "Query Failed"); - return; - } - if(!results){ - ESP_LOGW(TAG, "No results found!"); - return; - } - - mdns_print_results(results); - mdns_query_results_free(results); - } - -使用上述方法的示例:: - - void my_app_some_method(){ - // 搜索 {IDF_TARGET_PATH_NAME}-mdns.local - resolve_mdns_host("{IDF_TARGET_PATH_NAME}-mdns"); - - // 搜索 HTTP 服务器 - find_mdns_service("_http", "_tcp"); - // 或者搜索文件服务器 - find_mdns_service("_smb", "_tcp"); // Windows 系统的共享服务 - find_mdns_service("_afpovertcp", "_tcp"); // Apple AFP 文件共享服务 - find_mdns_service("_nfs", "_tcp"); // NFS 服务器 - find_mdns_service("_ftp", "_tcp"); // FTP 服务器 - // 或者网络打印机 - find_mdns_service("_printer", "_tcp"); - find_mdns_service("_ipp", "_tcp"); - } - -应用示例 --------- - -有关 mDNS 服务器和查询器的应用示例请参考 :example:`<../examples>`。 - -API 参考 --------- - -.. include-build-file:: inc/mdns.inc diff --git a/mdns/zh_CN/_static/DejaVuSans.ttf b/mdns/zh_CN/_static/DejaVuSans.ttf deleted file mode 100644 index 19ed0b468..000000000 Binary files a/mdns/zh_CN/_static/DejaVuSans.ttf and /dev/null differ diff --git a/mdns/zh_CN/_static/NotoSansSC-Regular.otf b/mdns/zh_CN/_static/NotoSansSC-Regular.otf deleted file mode 100644 index 7cd0b77ae..000000000 Binary files a/mdns/zh_CN/_static/NotoSansSC-Regular.otf and /dev/null differ diff --git a/mdns/zh_CN/_static/basic.css b/mdns/zh_CN/_static/basic.css deleted file mode 100644 index bf18350b6..000000000 --- a/mdns/zh_CN/_static/basic.css +++ /dev/null @@ -1,906 +0,0 @@ -/* - * basic.css - * ~~~~~~~~~ - * - * Sphinx stylesheet -- basic theme. - * - * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -/* -- main layout ----------------------------------------------------------- */ - -div.clearer { - clear: both; -} - -div.section::after { - display: block; - content: ''; - clear: left; -} - -/* -- relbar ---------------------------------------------------------------- */ - -div.related { - width: 100%; - font-size: 90%; -} - -div.related h3 { - display: none; -} - -div.related ul { - margin: 0; - padding: 0 0 0 10px; - list-style: none; -} - -div.related li { - display: inline; -} - -div.related li.right { - float: right; - margin-right: 5px; -} - -/* -- sidebar --------------------------------------------------------------- */ - -div.sphinxsidebarwrapper { - padding: 10px 5px 0 10px; -} - -div.sphinxsidebar { - float: left; - width: 230px; - margin-left: -100%; - font-size: 90%; - word-wrap: break-word; - overflow-wrap : break-word; -} - -div.sphinxsidebar ul { - list-style: none; -} - -div.sphinxsidebar ul ul, -div.sphinxsidebar ul.want-points { - margin-left: 20px; - list-style: square; -} - -div.sphinxsidebar ul ul { - margin-top: 0; - margin-bottom: 0; -} - -div.sphinxsidebar form { - margin-top: 10px; -} - -div.sphinxsidebar input { - border: 1px solid #98dbcc; - font-family: sans-serif; - font-size: 1em; -} - -div.sphinxsidebar #searchbox form.search { - overflow: hidden; -} - -div.sphinxsidebar #searchbox input[type="text"] { - float: left; - width: 80%; - padding: 0.25em; - box-sizing: border-box; -} - -div.sphinxsidebar #searchbox input[type="submit"] { - float: left; - width: 20%; - border-left: none; - padding: 0.25em; - box-sizing: border-box; -} - - -img { - border: 0; - max-width: 100%; -} - -/* -- search page ----------------------------------------------------------- */ - -ul.search { - margin: 10px 0 0 20px; - padding: 0; -} - -ul.search li { - padding: 5px 0 5px 20px; - background-image: url(file.png); - background-repeat: no-repeat; - background-position: 0 7px; -} - -ul.search li a { - font-weight: bold; -} - -ul.search li p.context { - color: #888; - margin: 2px 0 0 30px; - text-align: left; -} - -ul.keywordmatches li.goodmatch a { - font-weight: bold; -} - -/* -- index page ------------------------------------------------------------ */ - -table.contentstable { - width: 90%; - margin-left: auto; - margin-right: auto; -} - -table.contentstable p.biglink { - line-height: 150%; -} - -a.biglink { - font-size: 1.3em; -} - -span.linkdescr { - font-style: italic; - padding-top: 5px; - font-size: 90%; -} - -/* -- general index --------------------------------------------------------- */ - -table.indextable { - width: 100%; -} - -table.indextable td { - text-align: left; - vertical-align: top; -} - -table.indextable ul { - margin-top: 0; - margin-bottom: 0; - list-style-type: none; -} - -table.indextable > tbody > tr > td > ul { - padding-left: 0em; -} - -table.indextable tr.pcap { - height: 10px; -} - -table.indextable tr.cap { - margin-top: 10px; - background-color: #f2f2f2; -} - -img.toggler { - margin-right: 3px; - margin-top: 3px; - cursor: pointer; -} - -div.modindex-jumpbox { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - margin: 1em 0 1em 0; - padding: 0.4em; -} - -div.genindex-jumpbox { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - margin: 1em 0 1em 0; - padding: 0.4em; -} - -/* -- domain module index --------------------------------------------------- */ - -table.modindextable td { - padding: 2px; - border-collapse: collapse; -} - -/* -- general body styles --------------------------------------------------- */ - -div.body { - min-width: 450px; - max-width: 800px; -} - -div.body p, div.body dd, div.body li, div.body blockquote { - -moz-hyphens: auto; - -ms-hyphens: auto; - -webkit-hyphens: auto; - hyphens: auto; -} - -a.headerlink { - visibility: hidden; -} - -a.brackets:before, -span.brackets > a:before{ - content: "["; -} - -a.brackets:after, -span.brackets > a:after { - content: "]"; -} - -h1:hover > a.headerlink, -h2:hover > a.headerlink, -h3:hover > a.headerlink, -h4:hover > a.headerlink, -h5:hover > a.headerlink, -h6:hover > a.headerlink, -dt:hover > a.headerlink, -caption:hover > a.headerlink, -p.caption:hover > a.headerlink, -div.code-block-caption:hover > a.headerlink { - visibility: visible; -} - -div.body p.caption { - text-align: inherit; -} - -div.body td { - text-align: left; -} - -.first { - margin-top: 0 !important; -} - -p.rubric { - margin-top: 30px; - font-weight: bold; -} - -img.align-left, figure.align-left, .figure.align-left, object.align-left { - clear: left; - float: left; - margin-right: 1em; -} - -img.align-right, figure.align-right, .figure.align-right, object.align-right { - clear: right; - float: right; - margin-left: 1em; -} - -img.align-center, figure.align-center, .figure.align-center, object.align-center { - display: block; - margin-left: auto; - margin-right: auto; -} - -img.align-default, figure.align-default, .figure.align-default { - display: block; - margin-left: auto; - margin-right: auto; -} - -.align-left { - text-align: left; -} - -.align-center { - text-align: center; -} - -.align-default { - text-align: center; -} - -.align-right { - text-align: right; -} - -/* -- sidebars -------------------------------------------------------------- */ - -div.sidebar, -aside.sidebar { - margin: 0 0 0.5em 1em; - border: 1px solid #ddb; - padding: 7px; - background-color: #ffe; - width: 40%; - float: right; - clear: right; - overflow-x: auto; -} - -p.sidebar-title { - font-weight: bold; -} - -div.admonition, div.topic, blockquote { - clear: left; -} - -/* -- topics ---------------------------------------------------------------- */ - -div.topic { - border: 1px solid #ccc; - padding: 7px; - margin: 10px 0 10px 0; -} - -p.topic-title { - font-size: 1.1em; - font-weight: bold; - margin-top: 10px; -} - -/* -- admonitions ----------------------------------------------------------- */ - -div.admonition { - margin-top: 10px; - margin-bottom: 10px; - padding: 7px; -} - -div.admonition dt { - font-weight: bold; -} - -p.admonition-title { - margin: 0px 10px 5px 0px; - font-weight: bold; -} - -div.body p.centered { - text-align: center; - margin-top: 25px; -} - -/* -- content of sidebars/topics/admonitions -------------------------------- */ - -div.sidebar > :last-child, -aside.sidebar > :last-child, -div.topic > :last-child, -div.admonition > :last-child { - margin-bottom: 0; -} - -div.sidebar::after, -aside.sidebar::after, -div.topic::after, -div.admonition::after, -blockquote::after { - display: block; - content: ''; - clear: both; -} - -/* -- tables ---------------------------------------------------------------- */ - -table.docutils { - margin-top: 10px; - margin-bottom: 10px; - border: 0; - border-collapse: collapse; -} - -table.align-center { - margin-left: auto; - margin-right: auto; -} - -table.align-default { - margin-left: auto; - margin-right: auto; -} - -table caption span.caption-number { - font-style: italic; -} - -table caption span.caption-text { -} - -table.docutils td, table.docutils th { - padding: 1px 8px 1px 5px; - border-top: 0; - border-left: 0; - border-right: 0; - border-bottom: 1px solid #aaa; -} - -table.footnote td, table.footnote th { - border: 0 !important; -} - -th { - text-align: left; - padding-right: 5px; -} - -table.citation { - border-left: solid 1px gray; - margin-left: 1px; -} - -table.citation td { - border-bottom: none; -} - -th > :first-child, -td > :first-child { - margin-top: 0px; -} - -th > :last-child, -td > :last-child { - margin-bottom: 0px; -} - -/* -- figures --------------------------------------------------------------- */ - -div.figure, figure { - margin: 0.5em; - padding: 0.5em; -} - -div.figure p.caption, figcaption { - padding: 0.3em; -} - -div.figure p.caption span.caption-number, -figcaption span.caption-number { - font-style: italic; -} - -div.figure p.caption span.caption-text, -figcaption span.caption-text { -} - -/* -- field list styles ----------------------------------------------------- */ - -table.field-list td, table.field-list th { - border: 0 !important; -} - -.field-list ul { - margin: 0; - padding-left: 1em; -} - -.field-list p { - margin: 0; -} - -.field-name { - -moz-hyphens: manual; - -ms-hyphens: manual; - -webkit-hyphens: manual; - hyphens: manual; -} - -/* -- hlist styles ---------------------------------------------------------- */ - -table.hlist { - margin: 1em 0; -} - -table.hlist td { - vertical-align: top; -} - -/* -- object description styles --------------------------------------------- */ - -.sig { - font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; -} - -.sig-name, code.descname { - background-color: transparent; - font-weight: bold; -} - -.sig-name { - font-size: 1.1em; -} - -code.descname { - font-size: 1.2em; -} - -.sig-prename, code.descclassname { - background-color: transparent; -} - -.optional { - font-size: 1.3em; -} - -.sig-paren { - font-size: larger; -} - -.sig-param.n { - font-style: italic; -} - -/* C++ specific styling */ - -.sig-inline.c-texpr, -.sig-inline.cpp-texpr { - font-family: unset; -} - -.sig.c .k, .sig.c .kt, -.sig.cpp .k, .sig.cpp .kt { - color: #0033B3; -} - -.sig.c .m, -.sig.cpp .m { - color: #1750EB; -} - -.sig.c .s, .sig.c .sc, -.sig.cpp .s, .sig.cpp .sc { - color: #067D17; -} - - -/* -- other body styles ----------------------------------------------------- */ - -ol.arabic { - list-style: decimal; -} - -ol.loweralpha { - list-style: lower-alpha; -} - -ol.upperalpha { - list-style: upper-alpha; -} - -ol.lowerroman { - list-style: lower-roman; -} - -ol.upperroman { - list-style: upper-roman; -} - -:not(li) > ol > li:first-child > :first-child, -:not(li) > ul > li:first-child > :first-child { - margin-top: 0px; -} - -:not(li) > ol > li:last-child > :last-child, -:not(li) > ul > li:last-child > :last-child { - margin-bottom: 0px; -} - -ol.simple ol p, -ol.simple ul p, -ul.simple ol p, -ul.simple ul p { - margin-top: 0; -} - -ol.simple > li:not(:first-child) > p, -ul.simple > li:not(:first-child) > p { - margin-top: 0; -} - -ol.simple p, -ul.simple p { - margin-bottom: 0; -} - -dl.footnote > dt, -dl.citation > dt { - float: left; - margin-right: 0.5em; -} - -dl.footnote > dd, -dl.citation > dd { - margin-bottom: 0em; -} - -dl.footnote > dd:after, -dl.citation > dd:after { - content: ""; - clear: both; -} - -dl.field-list { - display: grid; - grid-template-columns: fit-content(30%) auto; -} - -dl.field-list > dt { - font-weight: bold; - word-break: break-word; - padding-left: 0.5em; - padding-right: 5px; -} - -dl.field-list > dt:after { - content: ":"; -} - -dl.field-list > dd { - padding-left: 0.5em; - margin-top: 0em; - margin-left: 0em; - margin-bottom: 0em; -} - -dl { - margin-bottom: 15px; -} - -dd > :first-child { - margin-top: 0px; -} - -dd ul, dd table { - margin-bottom: 10px; -} - -dd { - margin-top: 3px; - margin-bottom: 10px; - margin-left: 30px; -} - -dl > dd:last-child, -dl > dd:last-child > :last-child { - margin-bottom: 0; -} - -dt:target, span.highlighted { - background-color: #fbe54e; -} - -rect.highlighted { - fill: #fbe54e; -} - -dl.glossary dt { - font-weight: bold; - font-size: 1.1em; -} - -.versionmodified { - font-style: italic; -} - -.system-message { - background-color: #fda; - padding: 5px; - border: 3px solid red; -} - -.footnote:target { - background-color: #ffa; -} - -.line-block { - display: block; - margin-top: 1em; - margin-bottom: 1em; -} - -.line-block .line-block { - margin-top: 0; - margin-bottom: 0; - margin-left: 1.5em; -} - -.guilabel, .menuselection { - font-family: sans-serif; -} - -.accelerator { - text-decoration: underline; -} - -.classifier { - font-style: oblique; -} - -.classifier:before { - font-style: normal; - margin: 0 0.5em; - content: ":"; - display: inline-block; -} - -abbr, acronym { - border-bottom: dotted 1px; - cursor: help; -} - -/* -- code displays --------------------------------------------------------- */ - -pre { - overflow: auto; - overflow-y: hidden; /* fixes display issues on Chrome browsers */ -} - -pre, div[class*="highlight-"] { - clear: both; -} - -span.pre { - -moz-hyphens: none; - -ms-hyphens: none; - -webkit-hyphens: none; - hyphens: none; - white-space: nowrap; -} - -div[class*="highlight-"] { - margin: 1em 0; -} - -td.linenos pre { - border: 0; - background-color: transparent; - color: #aaa; -} - -table.highlighttable { - display: block; -} - -table.highlighttable tbody { - display: block; -} - -table.highlighttable tr { - display: flex; -} - -table.highlighttable td { - margin: 0; - padding: 0; -} - -table.highlighttable td.linenos { - padding-right: 0.5em; -} - -table.highlighttable td.code { - flex: 1; - overflow: hidden; -} - -.highlight .hll { - display: block; -} - -div.highlight pre, -table.highlighttable pre { - margin: 0; -} - -div.code-block-caption + div { - margin-top: 0; -} - -div.code-block-caption { - margin-top: 1em; - padding: 2px 5px; - font-size: small; -} - -div.code-block-caption code { - background-color: transparent; -} - -table.highlighttable td.linenos, -span.linenos, -div.highlight span.gp { /* gp: Generic.Prompt */ - user-select: none; - -webkit-user-select: text; /* Safari fallback only */ - -webkit-user-select: none; /* Chrome/Safari */ - -moz-user-select: none; /* Firefox */ - -ms-user-select: none; /* IE10+ */ -} - -div.code-block-caption span.caption-number { - padding: 0.1em 0.3em; - font-style: italic; -} - -div.code-block-caption span.caption-text { -} - -div.literal-block-wrapper { - margin: 1em 0; -} - -code.xref, a code { - background-color: transparent; - font-weight: bold; -} - -h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { - background-color: transparent; -} - -.viewcode-link { - float: right; -} - -.viewcode-back { - float: right; - font-family: sans-serif; -} - -div.viewcode-block:target { - margin: -1px -10px; - padding: 0 10px; -} - -/* -- math display ---------------------------------------------------------- */ - -img.math { - vertical-align: middle; -} - -div.body div.math p { - text-align: center; -} - -span.eqno { - float: right; -} - -span.eqno a.headerlink { - position: absolute; - z-index: 1; -} - -div.math:hover a.headerlink { - visibility: visible; -} - -/* -- printout stylesheet --------------------------------------------------- */ - -@media print { - div.document, - div.documentwrapper, - div.bodywrapper { - margin: 0 !important; - width: 100%; - } - - div.sphinxsidebar, - div.related, - div.footer, - #top-link { - display: none; - } -} \ No newline at end of file diff --git a/mdns/zh_CN/_static/check-solid.svg b/mdns/zh_CN/_static/check-solid.svg deleted file mode 100644 index 92fad4b5c..000000000 --- a/mdns/zh_CN/_static/check-solid.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/mdns/zh_CN/_static/clipboard.min.js b/mdns/zh_CN/_static/clipboard.min.js deleted file mode 100644 index 54b3c4638..000000000 --- a/mdns/zh_CN/_static/clipboard.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * clipboard.js v2.0.8 - * https://clipboardjs.com/ - * - * Licensed MIT © Zeno Rocha - */ -!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 - - - - diff --git a/mdns/zh_CN/_static/copybutton.css b/mdns/zh_CN/_static/copybutton.css deleted file mode 100644 index 40eafe5fc..000000000 --- a/mdns/zh_CN/_static/copybutton.css +++ /dev/null @@ -1,93 +0,0 @@ -/* Copy buttons */ -button.copybtn { - position: absolute; - display: flex; - top: .3em; - right: .3em; - width: 1.7em; - height: 1.7em; - opacity: 0; - transition: opacity 0.3s, border .3s, background-color .3s; - user-select: none; - padding: 0; - border: none; - outline: none; - border-radius: 0.4em; - /* The colors that GitHub uses */ - border: #1b1f2426 1px solid; - background-color: #f6f8fa; - color: #57606a; -} - -button.copybtn.success { - border-color: #22863a; - color: #22863a; -} - -button.copybtn svg { - stroke: currentColor; - width: 1.5em; - height: 1.5em; - padding: 0.1em; -} - -div.highlight { - position: relative; -} - -.highlight:hover button.copybtn { - opacity: 1; -} - -.highlight button.copybtn:hover { - background-color: rgb(235, 235, 235); -} - -.highlight button.copybtn:active { - background-color: rgb(187, 187, 187); -} - -/** - * A minimal CSS-only tooltip copied from: - * https://codepen.io/mildrenben/pen/rVBrpK - * - * To use, write HTML like the following: - * - *

Short

- */ - .o-tooltip--left { - position: relative; - } - - .o-tooltip--left:after { - opacity: 0; - visibility: hidden; - position: absolute; - content: attr(data-tooltip); - padding: .2em; - font-size: .8em; - left: -.2em; - background: grey; - color: white; - white-space: nowrap; - z-index: 2; - border-radius: 2px; - transform: translateX(-102%) translateY(0); - transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); -} - -.o-tooltip--left:hover:after { - display: block; - opacity: 1; - visibility: visible; - transform: translateX(-100%) translateY(0); - transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); - transition-delay: .5s; -} - -/* By default the copy button shouldn't show up when printing a page */ -@media print { - button.copybtn { - display: none; - } -} diff --git a/mdns/zh_CN/_static/copybutton.js b/mdns/zh_CN/_static/copybutton.js deleted file mode 100644 index 40ac33108..000000000 --- a/mdns/zh_CN/_static/copybutton.js +++ /dev/null @@ -1,220 +0,0 @@ -// Localization support -const messages = { - 'en': { - 'copy': 'Copy', - 'copy_to_clipboard': 'Copy to clipboard', - 'copy_success': 'Copied!', - 'copy_failure': 'Failed to copy', - }, - 'es' : { - 'copy': 'Copiar', - 'copy_to_clipboard': 'Copiar al portapapeles', - 'copy_success': '¡Copiado!', - 'copy_failure': 'Error al copiar', - }, - 'de' : { - 'copy': 'Kopieren', - 'copy_to_clipboard': 'In die Zwischenablage kopieren', - 'copy_success': 'Kopiert!', - 'copy_failure': 'Fehler beim Kopieren', - }, - 'fr' : { - 'copy': 'Copier', - 'copy_to_clipboard': 'Copié dans le presse-papier', - 'copy_success': 'Copié !', - 'copy_failure': 'Échec de la copie', - }, - 'ru': { - 'copy': 'Скопировать', - 'copy_to_clipboard': 'Скопировать в буфер', - 'copy_success': 'Скопировано!', - 'copy_failure': 'Не удалось скопировать', - }, - 'zh-CN': { - 'copy': '复制', - 'copy_to_clipboard': '复制到剪贴板', - 'copy_success': '复制成功!', - 'copy_failure': '复制失败', - }, - 'it' : { - 'copy': 'Copiare', - 'copy_to_clipboard': 'Copiato negli appunti', - 'copy_success': 'Copiato!', - 'copy_failure': 'Errore durante la copia', - } -} - -let locale = 'en' -if( document.documentElement.lang !== undefined - && messages[document.documentElement.lang] !== undefined ) { - locale = document.documentElement.lang -} - -let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; -if (doc_url_root == '#') { - doc_url_root = ''; -} - -/** - * SVG files for our copy buttons - */ -let iconCheck = ` - ${messages[locale]['copy_success']} - - -` - -// If the user specified their own SVG use that, otherwise use the default -let iconCopy = ``; -if (!iconCopy) { - iconCopy = ` - ${messages[locale]['copy_to_clipboard']} - - - -` -} - -/** - * Set up copy/paste for code blocks - */ - -const runWhenDOMLoaded = cb => { - if (document.readyState != 'loading') { - cb() - } else if (document.addEventListener) { - document.addEventListener('DOMContentLoaded', cb) - } else { - document.attachEvent('onreadystatechange', function() { - if (document.readyState == 'complete') cb() - }) - } -} - -const codeCellId = index => `codecell${index}` - -// Clears selected text since ClipboardJS will select the text when copying -const clearSelection = () => { - if (window.getSelection) { - window.getSelection().removeAllRanges() - } else if (document.selection) { - document.selection.empty() - } -} - -// Changes tooltip text for two seconds, then changes it back -const temporarilyChangeTooltip = (el, oldText, newText) => { - el.setAttribute('data-tooltip', newText) - el.classList.add('success') - setTimeout(() => el.setAttribute('data-tooltip', oldText), 2000) - setTimeout(() => el.classList.remove('success'), 2000) -} - -// Changes the copy button icon for two seconds, then changes it back -const temporarilyChangeIcon = (el) => { - el.innerHTML = iconCheck; - setTimeout(() => {el.innerHTML = iconCopy}, 2000) -} - -const addCopyButtonToCodeCells = () => { - // If ClipboardJS hasn't loaded, wait a bit and try again. This - // happens because we load ClipboardJS asynchronously. - if (window.ClipboardJS === undefined) { - setTimeout(addCopyButtonToCodeCells, 250) - return - } - - // Add copybuttons to all of our code cells - const codeCells = document.querySelectorAll('div.highlight pre') - codeCells.forEach((codeCell, index) => { - const id = codeCellId(index) - codeCell.setAttribute('id', id) - - const clipboardButton = id => - `` - codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) - }) - -function escapeRegExp(string) { - return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string -} - -// Callback when a copy button is clicked. Will be passed the node that was clicked -// should then grab the text and replace pieces of text that shouldn't be used in output -function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { - - var regexp; - var match; - - // Do we check for line continuation characters and "HERE-documents"? - var useLineCont = !!lineContinuationChar - var useHereDoc = !!hereDocDelim - - // create regexp to capture prompt and remaining line - if (isRegexp) { - regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') - } else { - regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') - } - - const outputLines = []; - var promptFound = false; - var gotLineCont = false; - var gotHereDoc = false; - const lineGotPrompt = []; - for (const line of textContent.split('\n')) { - match = line.match(regexp) - if (match || gotLineCont || gotHereDoc) { - promptFound = regexp.test(line) - lineGotPrompt.push(promptFound) - if (removePrompts && promptFound) { - outputLines.push(match[2]) - } else { - outputLines.push(line) - } - gotLineCont = line.endsWith(lineContinuationChar) & useLineCont - if (line.includes(hereDocDelim) & useHereDoc) - gotHereDoc = !gotHereDoc - } else if (!onlyCopyPromptLines) { - outputLines.push(line) - } else if (copyEmptyLines && line.trim() === '') { - outputLines.push(line) - } - } - - // If no lines with the prompt were found then just use original lines - if (lineGotPrompt.some(v => v === true)) { - textContent = outputLines.join('\n'); - } - - // Remove a trailing newline to avoid auto-running when pasting - if (textContent.endsWith("\n")) { - textContent = textContent.slice(0, -1) - } - return textContent -} - - -var copyTargetText = (trigger) => { - var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); - return formatCopyText(target.innerText, '', false, true, true, true, '', '') -} - - // Initialize with a callback so we can modify the text before copy - const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) - - // Update UI with error/success messages - clipboard.on('success', event => { - clearSelection() - temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) - temporarilyChangeIcon(event.trigger) - }) - - clipboard.on('error', event => { - temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) - }) -} - -runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/mdns/zh_CN/_static/copybutton_funcs.js b/mdns/zh_CN/_static/copybutton_funcs.js deleted file mode 100644 index b9168c556..000000000 --- a/mdns/zh_CN/_static/copybutton_funcs.js +++ /dev/null @@ -1,58 +0,0 @@ -function escapeRegExp(string) { - return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string -} - -// Callback when a copy button is clicked. Will be passed the node that was clicked -// should then grab the text and replace pieces of text that shouldn't be used in output -export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { - - var regexp; - var match; - - // Do we check for line continuation characters and "HERE-documents"? - var useLineCont = !!lineContinuationChar - var useHereDoc = !!hereDocDelim - - // create regexp to capture prompt and remaining line - if (isRegexp) { - regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') - } else { - regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') - } - - const outputLines = []; - var promptFound = false; - var gotLineCont = false; - var gotHereDoc = false; - const lineGotPrompt = []; - for (const line of textContent.split('\n')) { - match = line.match(regexp) - if (match || gotLineCont || gotHereDoc) { - promptFound = regexp.test(line) - lineGotPrompt.push(promptFound) - if (removePrompts && promptFound) { - outputLines.push(match[2]) - } else { - outputLines.push(line) - } - gotLineCont = line.endsWith(lineContinuationChar) & useLineCont - if (line.includes(hereDocDelim) & useHereDoc) - gotHereDoc = !gotHereDoc - } else if (!onlyCopyPromptLines) { - outputLines.push(line) - } else if (copyEmptyLines && line.trim() === '') { - outputLines.push(line) - } - } - - // If no lines with the prompt were found then just use original lines - if (lineGotPrompt.some(v => v === true)) { - textContent = outputLines.join('\n'); - } - - // Remove a trailing newline to avoid auto-running when pasting - if (textContent.endsWith("\n")) { - textContent = textContent.slice(0, -1) - } - return textContent -} diff --git a/mdns/zh_CN/_static/css/badge_only.css b/mdns/zh_CN/_static/css/badge_only.css deleted file mode 100644 index e380325bc..000000000 --- a/mdns/zh_CN/_static/css/badge_only.css +++ /dev/null @@ -1 +0,0 @@ -.fa:before{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} \ No newline at end of file diff --git a/mdns/zh_CN/_static/css/fonts/Roboto-Slab-Bold.woff b/mdns/zh_CN/_static/css/fonts/Roboto-Slab-Bold.woff deleted file mode 100644 index 6cb600001..000000000 Binary files a/mdns/zh_CN/_static/css/fonts/Roboto-Slab-Bold.woff and /dev/null differ diff --git a/mdns/zh_CN/_static/css/fonts/Roboto-Slab-Bold.woff2 b/mdns/zh_CN/_static/css/fonts/Roboto-Slab-Bold.woff2 deleted file mode 100644 index 7059e2314..000000000 Binary files a/mdns/zh_CN/_static/css/fonts/Roboto-Slab-Bold.woff2 and /dev/null differ diff --git a/mdns/zh_CN/_static/css/fonts/Roboto-Slab-Regular.woff b/mdns/zh_CN/_static/css/fonts/Roboto-Slab-Regular.woff deleted file mode 100644 index f815f63f9..000000000 Binary files a/mdns/zh_CN/_static/css/fonts/Roboto-Slab-Regular.woff and /dev/null differ diff --git a/mdns/zh_CN/_static/css/fonts/Roboto-Slab-Regular.woff2 b/mdns/zh_CN/_static/css/fonts/Roboto-Slab-Regular.woff2 deleted file mode 100644 index f2c76e5bd..000000000 Binary files a/mdns/zh_CN/_static/css/fonts/Roboto-Slab-Regular.woff2 and /dev/null differ diff --git a/mdns/zh_CN/_static/css/fonts/fontawesome-webfont.eot b/mdns/zh_CN/_static/css/fonts/fontawesome-webfont.eot deleted file mode 100644 index e9f60ca95..000000000 Binary files a/mdns/zh_CN/_static/css/fonts/fontawesome-webfont.eot and /dev/null differ diff --git a/mdns/zh_CN/_static/css/fonts/fontawesome-webfont.svg b/mdns/zh_CN/_static/css/fonts/fontawesome-webfont.svg deleted file mode 100644 index 855c845e5..000000000 --- a/mdns/zh_CN/_static/css/fonts/fontawesome-webfont.svg +++ /dev/null @@ -1,2671 +0,0 @@ - - - - -Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 - By ,,, -Copyright Dave Gandy 2016. All rights reserved. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/mdns/zh_CN/_static/css/fonts/fontawesome-webfont.ttf b/mdns/zh_CN/_static/css/fonts/fontawesome-webfont.ttf deleted file mode 100644 index 35acda2fa..000000000 Binary files a/mdns/zh_CN/_static/css/fonts/fontawesome-webfont.ttf and /dev/null differ diff --git a/mdns/zh_CN/_static/css/fonts/fontawesome-webfont.woff b/mdns/zh_CN/_static/css/fonts/fontawesome-webfont.woff deleted file mode 100644 index 400014a4b..000000000 Binary files a/mdns/zh_CN/_static/css/fonts/fontawesome-webfont.woff and /dev/null differ diff --git a/mdns/zh_CN/_static/css/fonts/fontawesome-webfont.woff2 b/mdns/zh_CN/_static/css/fonts/fontawesome-webfont.woff2 deleted file mode 100644 index 4d13fc604..000000000 Binary files a/mdns/zh_CN/_static/css/fonts/fontawesome-webfont.woff2 and /dev/null differ diff --git a/mdns/zh_CN/_static/css/fonts/lato-bold-italic.woff b/mdns/zh_CN/_static/css/fonts/lato-bold-italic.woff deleted file mode 100644 index 88ad05b9f..000000000 Binary files a/mdns/zh_CN/_static/css/fonts/lato-bold-italic.woff and /dev/null differ diff --git a/mdns/zh_CN/_static/css/fonts/lato-bold-italic.woff2 b/mdns/zh_CN/_static/css/fonts/lato-bold-italic.woff2 deleted file mode 100644 index c4e3d804b..000000000 Binary files a/mdns/zh_CN/_static/css/fonts/lato-bold-italic.woff2 and /dev/null differ diff --git a/mdns/zh_CN/_static/css/fonts/lato-bold.woff b/mdns/zh_CN/_static/css/fonts/lato-bold.woff deleted file mode 100644 index c6dff51f0..000000000 Binary files a/mdns/zh_CN/_static/css/fonts/lato-bold.woff and /dev/null differ diff --git a/mdns/zh_CN/_static/css/fonts/lato-bold.woff2 b/mdns/zh_CN/_static/css/fonts/lato-bold.woff2 deleted file mode 100644 index bb195043c..000000000 Binary files a/mdns/zh_CN/_static/css/fonts/lato-bold.woff2 and /dev/null differ diff --git a/mdns/zh_CN/_static/css/fonts/lato-normal-italic.woff b/mdns/zh_CN/_static/css/fonts/lato-normal-italic.woff deleted file mode 100644 index 76114bc03..000000000 Binary files a/mdns/zh_CN/_static/css/fonts/lato-normal-italic.woff and /dev/null differ diff --git a/mdns/zh_CN/_static/css/fonts/lato-normal-italic.woff2 b/mdns/zh_CN/_static/css/fonts/lato-normal-italic.woff2 deleted file mode 100644 index 3404f37e2..000000000 Binary files a/mdns/zh_CN/_static/css/fonts/lato-normal-italic.woff2 and /dev/null differ diff --git a/mdns/zh_CN/_static/css/fonts/lato-normal.woff b/mdns/zh_CN/_static/css/fonts/lato-normal.woff deleted file mode 100644 index ae1307ff5..000000000 Binary files a/mdns/zh_CN/_static/css/fonts/lato-normal.woff and /dev/null differ diff --git a/mdns/zh_CN/_static/css/fonts/lato-normal.woff2 b/mdns/zh_CN/_static/css/fonts/lato-normal.woff2 deleted file mode 100644 index 3bf984332..000000000 Binary files a/mdns/zh_CN/_static/css/fonts/lato-normal.woff2 and /dev/null differ diff --git a/mdns/zh_CN/_static/css/theme.css b/mdns/zh_CN/_static/css/theme.css deleted file mode 100644 index ba75bdc2e..000000000 --- a/mdns/zh_CN/_static/css/theme.css +++ /dev/null @@ -1,4 +0,0 @@ -html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,.wy-nav-top a,.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! - * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome - * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs li{display:inline-block}.wy-breadcrumbs li.wy-breadcrumbs-aside{float:right}.wy-breadcrumbs li a{display:inline-block;padding:5px}.wy-breadcrumbs li a:first-child{padding-left:0}.rst-content .wy-breadcrumbs li tt,.wy-breadcrumbs li .rst-content tt,.wy-breadcrumbs li code{padding:5px;border:none;background:none}.rst-content .wy-breadcrumbs li tt.literal,.wy-breadcrumbs li .rst-content tt.literal,.wy-breadcrumbs li code.literal{color:#404040}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.selectors{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;font-size:110%;line-height:1.6em;color:hsla(0,0%,100%,.3)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}footer .footer li{display:inline-block}footer .footer li.footer-aside{float:right;display:inline-block}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.field-list>dt:after,html.writer-html5 .rst-content dl.footnote>dt:after{content:":"}html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.footnote>dt>span.brackets{margin-right:.5rem}html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{font-style:italic}html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.footnote>dd p,html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{font-size:inherit;line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.field-list)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dl:not(.field-list)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.field-list)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dl:not(.field-list)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel{border:1px solid #7fbbe3;background:#e7f2fa;font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/mdns/zh_CN/_static/doctools.js b/mdns/zh_CN/_static/doctools.js deleted file mode 100644 index e1bfd708b..000000000 --- a/mdns/zh_CN/_static/doctools.js +++ /dev/null @@ -1,358 +0,0 @@ -/* - * doctools.js - * ~~~~~~~~~~~ - * - * Sphinx JavaScript utilities for all documentation. - * - * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -/** - * select a different prefix for underscore - */ -$u = _.noConflict(); - -/** - * make the code below compatible with browsers without - * an installed firebug like debugger -if (!window.console || !console.firebug) { - var names = ["log", "debug", "info", "warn", "error", "assert", "dir", - "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", - "profile", "profileEnd"]; - window.console = {}; - for (var i = 0; i < names.length; ++i) - window.console[names[i]] = function() {}; -} - */ - -/** - * small helper function to urldecode strings - * - * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL - */ -jQuery.urldecode = function(x) { - if (!x) { - return x - } - return decodeURIComponent(x.replace(/\+/g, ' ')); -}; - -/** - * small helper function to urlencode strings - */ -jQuery.urlencode = encodeURIComponent; - -/** - * This function returns the parsed url parameters of the - * current request. Multiple values per key are supported, - * it will always return arrays of strings for the value parts. - */ -jQuery.getQueryParameters = function(s) { - if (typeof s === 'undefined') - s = document.location.search; - var parts = s.substr(s.indexOf('?') + 1).split('&'); - var result = {}; - for (var i = 0; i < parts.length; i++) { - var tmp = parts[i].split('=', 2); - var key = jQuery.urldecode(tmp[0]); - var value = jQuery.urldecode(tmp[1]); - if (key in result) - result[key].push(value); - else - result[key] = [value]; - } - return result; -}; - -/** - * highlight a given string on a jquery object by wrapping it in - * span elements with the given class name. - */ -jQuery.fn.highlightText = function(text, className) { - function highlight(node, addItems) { - if (node.nodeType === 3) { - var val = node.nodeValue; - var pos = val.toLowerCase().indexOf(text); - if (pos >= 0 && - !jQuery(node.parentNode).hasClass(className) && - !jQuery(node.parentNode).hasClass("nohighlight")) { - var span; - var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); - if (isInSVG) { - span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); - } else { - span = document.createElement("span"); - span.className = className; - } - span.appendChild(document.createTextNode(val.substr(pos, text.length))); - node.parentNode.insertBefore(span, node.parentNode.insertBefore( - document.createTextNode(val.substr(pos + text.length)), - node.nextSibling)); - node.nodeValue = val.substr(0, pos); - if (isInSVG) { - var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); - var bbox = node.parentElement.getBBox(); - rect.x.baseVal.value = bbox.x; - rect.y.baseVal.value = bbox.y; - rect.width.baseVal.value = bbox.width; - rect.height.baseVal.value = bbox.height; - rect.setAttribute('class', className); - addItems.push({ - "parent": node.parentNode, - "target": rect}); - } - } - } - else if (!jQuery(node).is("button, select, textarea")) { - jQuery.each(node.childNodes, function() { - highlight(this, addItems); - }); - } - } - var addItems = []; - var result = this.each(function() { - highlight(this, addItems); - }); - for (var i = 0; i < addItems.length; ++i) { - jQuery(addItems[i].parent).before(addItems[i].target); - } - return result; -}; - -/* - * backward compatibility for jQuery.browser - * This will be supported until firefox bug is fixed. - */ -if (!jQuery.browser) { - jQuery.uaMatch = function(ua) { - ua = ua.toLowerCase(); - - var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || - /(webkit)[ \/]([\w.]+)/.exec(ua) || - /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || - /(msie) ([\w.]+)/.exec(ua) || - ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || - []; - - return { - browser: match[ 1 ] || "", - version: match[ 2 ] || "0" - }; - }; - jQuery.browser = {}; - jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; -} - -/** - * Small JavaScript module for the documentation. - */ -var Documentation = { - - init : function() { - this.fixFirefoxAnchorBug(); - this.highlightSearchWords(); - this.initIndexTable(); - this.initOnKeyListeners(); - }, - - /** - * i18n support - */ - TRANSLATIONS : {}, - PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; }, - LOCALE : 'unknown', - - // gettext and ngettext don't access this so that the functions - // can safely bound to a different name (_ = Documentation.gettext) - gettext : function(string) { - var translated = Documentation.TRANSLATIONS[string]; - if (typeof translated === 'undefined') - return string; - return (typeof translated === 'string') ? translated : translated[0]; - }, - - ngettext : function(singular, plural, n) { - var translated = Documentation.TRANSLATIONS[singular]; - if (typeof translated === 'undefined') - return (n == 1) ? singular : plural; - return translated[Documentation.PLURALEXPR(n)]; - }, - - addTranslations : function(catalog) { - for (var key in catalog.messages) - this.TRANSLATIONS[key] = catalog.messages[key]; - this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); - this.LOCALE = catalog.locale; - }, - - /** - * add context elements like header anchor links - */ - addContextElements : function() { - $('div[id] > :header:first').each(function() { - $('\u00B6'). - attr('href', '#' + this.id). - attr('title', _('Permalink to this headline')). - appendTo(this); - }); - $('dt[id]').each(function() { - $('\u00B6'). - attr('href', '#' + this.id). - attr('title', _('Permalink to this definition')). - appendTo(this); - }); - }, - - /** - * workaround a firefox stupidity - * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075 - */ - fixFirefoxAnchorBug : function() { - if (document.location.hash && $.browser.mozilla) - window.setTimeout(function() { - document.location.href += ''; - }, 10); - }, - - /** - * highlight the search words provided in the url in the text - */ - highlightSearchWords : function() { - var params = $.getQueryParameters(); - var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; - if (terms.length) { - var body = $('div.body'); - if (!body.length) { - body = $('body'); - } - window.setTimeout(function() { - $.each(terms, function() { - body.highlightText(this.toLowerCase(), 'highlighted'); - }); - }, 10); - $('') - .appendTo($('#searchbox')); - } - }, - - /** - * init the domain index toggle buttons - */ - initIndexTable : function() { - var togglers = $('img.toggler').click(function() { - var src = $(this).attr('src'); - var idnum = $(this).attr('id').substr(7); - $('tr.cg-' + idnum).toggle(); - if (src.substr(-9) === 'minus.png') - $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); - else - $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); - }).css('display', ''); - if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { - togglers.click(); - } - }, - - /** - * helper function to hide the search marks again - */ - hideSearchWords : function() { - $('#searchbox .highlight-link').fadeOut(300); - $('span.highlighted').removeClass('highlighted'); - var url = new URL(window.location); - url.searchParams.delete('highlight'); - window.history.replaceState({}, '', url); - }, - - /** - * helper function to focus on search bar - */ - focusSearchBar : function() { - $('input[name=q]').first().focus(); - }, - - /** - * make the url absolute - */ - makeURL : function(relativeURL) { - return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; - }, - - /** - * get the current relative url - */ - getCurrentURL : function() { - var path = document.location.pathname; - var parts = path.split(/\//); - $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { - if (this === '..') - parts.pop(); - }); - var url = parts.join('/'); - return path.substring(url.lastIndexOf('/') + 1, path.length - 1); - }, - - initOnKeyListeners: function() { - // only install a listener if it is really needed - if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && - !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) - return; - - $(document).keydown(function(event) { - var activeElementType = document.activeElement.tagName; - // don't navigate when in search box, textarea, dropdown or button - if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT' - && activeElementType !== 'BUTTON') { - if (event.altKey || event.ctrlKey || event.metaKey) - return; - - if (!event.shiftKey) { - switch (event.key) { - case 'ArrowLeft': - if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) - break; - var prevHref = $('link[rel="prev"]').prop('href'); - if (prevHref) { - window.location.href = prevHref; - return false; - } - break; - case 'ArrowRight': - if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) - break; - var nextHref = $('link[rel="next"]').prop('href'); - if (nextHref) { - window.location.href = nextHref; - return false; - } - break; - case 'Escape': - if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) - break; - Documentation.hideSearchWords(); - return false; - } - } - - // some keyboard layouts may need Shift to get / - switch (event.key) { - case '/': - if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) - break; - Documentation.focusSearchBar(); - return false; - } - } - }); - } -}; - -// quick alias for translations -_ = Documentation.gettext; - -$(document).ready(function() { - Documentation.init(); -}); diff --git a/mdns/zh_CN/_static/documentation_options.js b/mdns/zh_CN/_static/documentation_options.js deleted file mode 100644 index aacdc454f..000000000 --- a/mdns/zh_CN/_static/documentation_options.js +++ /dev/null @@ -1,14 +0,0 @@ -var DOCUMENTATION_OPTIONS = { - URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), - VERSION: 'latest', - LANGUAGE: 'zh_CN', - COLLAPSE_INDEX: false, - BUILDER: 'html', - FILE_SUFFIX: '.html', - LINK_SUFFIX: '.html', - HAS_SOURCE: true, - SOURCELINK_SUFFIX: '.txt', - NAVIGATION_WITH_KEYS: false, - SHOW_SEARCH_SUMMARY: true, - ENABLE_SEARCH_SHORTCUTS: true, -}; \ No newline at end of file diff --git a/mdns/zh_CN/_static/espressif-logo.svg b/mdns/zh_CN/_static/espressif-logo.svg deleted file mode 100644 index 1725310bf..000000000 --- a/mdns/zh_CN/_static/espressif-logo.svg +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/mdns/zh_CN/_static/espressif2.pdf b/mdns/zh_CN/_static/espressif2.pdf deleted file mode 100644 index 05d20ec86..000000000 --- a/mdns/zh_CN/_static/espressif2.pdf +++ /dev/null @@ -1,785 +0,0 @@ -%PDF-1.5 % -1 0 obj <>/OCGs[5 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream - - - - - Adobe Illustrator CC 2015 (Macintosh) - 2018-07-17T18:09:55+08:00 - 2018-07-17T18:09:55+08:00 - 2018-07-17T18:09:55+08:00 - - - - 256 - 256 - JPEG - /9j/4AAQSkZJRgABAgEAkACQAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAAkAAAAAEA AQCQAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq8Q/Pz8+Na8h6zp+i+X4bOe8lgNzftdq8nBWbjCqiOSOhP BieVdqYCWUY28r/6G5/M/wD5ZNJ/6R5/+q+DiZcARFl/zl/+Yccym70vSriDfmiR3ETnbaj+s4G/ +SceJeBk+lf85lW7ShdW8sPHFTeW0uhI1a/77kjjHT/Lx4kcDP8Ay5/zkz+VGstHHNfy6RcSEgRa hEY1BHjLGZYVG37TjDbHhL0vTNW0vVbRLzTLyG+tHFUnt5FljPyZCRhQisVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVSfzR5w8s+VdOOo+YNQi0+1rRWkJLO1CeMca1d2oOign FWI6b/zkP+T9/snmGOB6043MM8Peg+J4wm/XrgtNFmek+Z/LWsAHSNWs9RqK/wCi3EU2w6/YZsKE zxV2KvMPzL/5x+8neetQl1e4mudP1uVFRryF/Ujb0wFXnDJVaBR+wV8cBCRKnz151/5xl/Mby6sl xYQpr9gm/qWIPrgVI+K3b46/6nLBTMSeSyxSwyNFKjRyoeLo4KsCOxB6ZFktxV2KphonmHXdCvFv dG1C40+6Ug+rbSNGTQ1o3EjkPY7YVp7d5F/5y18y6eY7XzdZrrFoKA3tuFgu1G9SyikUnbb4PmcP EwMX0f5L/MPyh5zsjdeXtRjuuABntj8FxFUkD1Imo61INDSh7HJMSGR4odirsVdirsVdirsVdirs VdirsVdirsVdiqC1rWdM0XSrrVdUuFtdPs0MtxO/RVHy3JJ2AG5O2Kvn3y7/AM5ZW9z5+uLfVrYW vk+6ZYbC44/v7fiaCaahPJZK/EB9nalaGotlwvoyGaGeGOeCRZYZVDxSoQysrCqsrDYgjocLFfir w/8ANz/nJfRvLLTaP5WEWra4pKTXJPK0tmHWpX+9cHbiDQdz2wEshG3yl5i8z+YPMmpPqWu38uoX snWWZq0H8qKKKi/5KgDIswEswJXRySRuHjYo6mqspIIPsRirM/Ln50fmf5e4Lp/mG6aBBRba6YXU QHgEnEnH/Y0w2jhD1ryp/wA5hahFwh81aIlwgADXmnMY326kwyllYn2dRh4mJg9r8m/nN+XPm4pF pWrxpev00+6/0e4rXoqvQOf9QtkrYkM2xQwvz/8AlB5E88pz1qx4agF4x6pakQ3SgEbF6MsgoKAS KwG9KYKSDT5g/Mn/AJxs86+Ullv9Mrr+ixjk9xbIVuIlABJltwXNBv8AEhYUFW44CGYk8iyLJ2Ku xVF6Tq+qaPqEOo6XdS2V9btyhuIWKOp+Y7HuO+FX05+Un/OUlrfmHRvPbJaXdFSHXFASCVun+kKA BE3+WPg8QuSBazF9EI6uodCGVgCrA1BB6EHCxbxV2KuxV2KuxV2KuxV2KuxV2KuxVpmVVLMQqqKs x2AA7nFXxj/zkF+c0nnTVzoujzH/AAvp0n7tl2F1MuxmbxQb+mPp+USWyIY9+Tv5Sap+YevGEM1r olnRtTvwK0B6RR12Mj9vAbnsCAFJp9yaPo+m6NpdrpWmQLbWFnGIreBOiovz3J8SeuTa3hf/ADlZ +YXmTQbPTPL2kT/VLfWIp3v7iOomZEKqIlb9lW5HlTc9NhWoJZRD5PyDY7FXYq7FXYq7FXAkGo64 q9K8if8AOQP5i+UjFAt7+ldLjoPqF+WlAUVFI5a+olK7UNPbDbExfS35d/8AOQ3kPziY7SSb9C6y 9ALC8ZQrse0M+yP8jxb/ACckCwIp6hhQ8o/NP/nHjyl50E+o2Cro3mN+Tm8hX9zPITX/AEmIbEk1 q60bep5dMBCRKnyP528heaPJertpmv2bW8pqbedfignQH7cMg2Ybj3HcA7ZEhsBtj2BLsVdir2j8 kf8AnIO/8nyQ6H5ieS88sMQkUm7y2dSByTqWiHdO37PgZAsTF9hWN9Z39nBe2U6XNpcostvcRMGR 0YVVlYbEEZJrVsVdirsVdirsVdirsVdirsVdirwL/nKP81n0bS18maRNw1LU4+eqTIfiitTsIxTo 03f/ACf9bASyiHzR5J8n6t5w8y2WgaWtbm7ejSt9iKMbySvT9lF3/Ab5EMyaffHknydo3k/y3aaD pMfG2tl+OQgc5ZT9uWQjqzH+nQZNqTzFXzF/zmbbxrc+UrgV9SRL+NvCkZtyP+ThyMmcHzZkWbsV dirsVdirsVdirsVdir138sP+cj/N/lForDVmfXNBWi/V5n/0iFdh+5mapooGyNt4cckCxMX1l5K8 ++VvOmlDUtAvVuYxQTwH4ZoWIrwljO6n8D2JyTWQjPM/lXy/5o0iXSNeskvrCUhvTeoKuKgPG60Z HFTRlNcVfHP5xfkJr3kOaXU7HnqXlVnAjvQKy24c0VLoKABueIkA4safZJC5AhsEreVYGTsVdir2 j/nHz87ZPJ9+nl7XJi3li9k/dyuSfqczn7YqdomP2x2+141kCxkH2Ojq6h0IZWAKsDUEHoQck1t4 q7FXYq7FXYq7FXYq7FUn84eaNP8AK3lnUfMGoH/RtPhMpQGhd+kcanxdyFHzxV+fPmTzBqXmLXb7 W9Tk9W+v5WmmbsK9FXwVVoqjsBkG0B9e/wDONv5Xr5T8prreoQ8de1xFlk5D4obU/FFFuKgt9t/e g/ZyQDCRt7DhYuxV5x+cP5M235lfoj19VfTP0T9Y48IRN6n1n0utXSnH0fxwEJBp5nP/AM4ZWxA9 DzY6HevqWIcHw6XCUwcLLjSK8/5w683oD9S13T5z2Eyzwj/hVmx4V42Iax/zjV+b2mq0i6Sl/EnV rOeKQ/QjFJD9C40niDz/AFny35h0Sb0dZ0y606WtAl1DJCT8uYWv0YE2l2BLsVdirsVdirsVTXyz 5p1/yxq0WraHeyWV7CdnQ/Cy1qUkU/C6HurCmFBD7D/Jz8/dE89RppepCPTPM6rva8qQ3PEbtblj WvcxncDxFTkgWsinqlxb29zby21zEk1vMjRzQyKHR0cUZWU1BBBoQcKHyT+ev/OPNx5ba48yeVIX n8vUaW9sgeUlmK7sv7Tw7+5Uddt8iQzjJ4TkWbsVdir6n/5xb/Ns31qvkTWZh9btELaHM7fFLCgq 1vv+1EBVP8io/ZyYLXIPonCxdirsVdirsVdirsVdir5g/wCcu/PbSXWneSrST93CBf6oAertVYIz /qrycj/KXwyJZxDzj8gPy+HnLz/bLdRepo+lUvdRqKqwQ/uoj/xkfqP5QcACZF9zZNrdirsVQN9r 2h2BIvtRtbQjqJ5o4zv0+0RiqBh89+SJpDFD5h0ySRTxZEvLdmB8CA/XFU5gngniWWCRZYmrxkQh lNDQ0I264qvxVSurS1u7d7e6hS4t5BSSGVQ6MAa7qwIOKvNPNn/OOH5W+YfUlj046PePU/WNOb0V 5HpWEhoaV8FHzwUkSLwzzv8A84qeeNFEt1oEsfmCxSrCKMejdhev90xKvT/Ick/y4KZiTxi8sryy uZLW9gktrmI8ZYJkaORT4MrAEZFko4q7FXYq7FV8M00EyTQSNFNGweORCVZWBqCrDcEYq+sPyH/5 yGTXzb+V/Nsyx62fgsNTaipdeEcnQLN4Ho/+t9qYLXKL31lVlKsAVIoQdwQcLF8jf85D/kUfLc83 mzy1AB5fncG+sYlP+hyP+0oHSFm/4EmnSlIkM4yeEZFm7FUZo+r6jo+qWuqabM1vfWUqzW8y9VdD UfMeI7jCr9Afy886WXnPyhp3mG1AT61HS5gBJ9K4T4ZY6kAni4NDTcUOTaiGR4odirsVdirsVdiq ld3dvZ2k13cuIra3jaWaQ1oqICzMaeAGKvzt85+ZLnzN5q1TX7n+81G4eYL/ACoTSNN67IgCj5ZA toD67/5xk8lDy9+XEOozJx1DzAwvZiRQiAVW3X5cKuP9bJBhI7vXMLF47+an/OSPlnyhNNpWjout 6/ESkqI1La3cbESyCvJlPVE+RKnASyEbfNPm386vzK80yudQ1qaC1atLGyY20AB/ZKxkFx/rljkb ZiIYOSSancnqcCXYqr2l/fWUnqWdzLbSfzwu0Z291I8cKsx0P87fzV0Z0Np5kvJUTYRXbi7Tj4Uu BJt8sbRwh6Z5Z/5zB8x23CLzHo1vqEY2a4tGa2l+ZVvVRj8uOHiYmD2byd/zkB+WXmgxww6mNNvn oBZ6iBbsSR0VyTExrtQPX2w2xIL0YEEVG4PQ4UMY87/lr5N862f1fX9PSeRRSG9T93cxdfsSr8VN 68TVfEYpBfLH5o/841+avKay6lopbXNCSrM8a/6VAoFayxL9pR/On0hciQzEnjuRZOxV2KuxVtWZ WDKSGBqCNiCMVfWX/OPH58HX0h8peaLiuuRrx0y/f/j6RRX05D/v5QNj+2P8r7UwWuUXvNzbW91b y21zEk9vOjRzQyKHR0ccWVlaoZWBoQcLF8Ufn3+Ts3kPXvr2mRO3lXUnJspN3FvKasbV2NTsATGW 3Ze5KscgQ2RNvKsDJ2Kvfv8AnErz0dP8y3nlG6kpaawpuLIE7LdwLVlAp/uyIb7/ALA8clFhIPrL JMHYq7FXYq7FXYq8w/5yQ8yNof5T6oI2KT6q0emxEGm09TKNvGFHGApjzfGnlLQJvMPmjStDh2fU bqK3LD9lXcBm/wBitTkQ2Ev0VtbW3tLWG1t0EdvbosUMY6KiAKqivgBk2p8/f85IfnjcaQZfJflm 4MepOlNY1CM/FAjiogiYHaRlNWb9kHb4vsgllEPlUkk1O5PU5BsdirsVdirsVdirsVdirPfIP52+ f/JTpFp98bvS1I5aXeVlgp4R1IeL/YEe4OEFBi+oPyz/AOchvJfnRorC4b9C69JRVsLlgY5XPaCa iq5/yWCt4A5IFrMaep4UPFfzg/5xv0TzUk+seWlj0rzFu7xAcba6buHUbRuf51G/7Q7gEMhKnyPr eh6toeqXGlatayWd/atwmt5RxYHsfcEbgjYjcZFstA4FdirsVXwTTQTRzwu0c0TB4pEJDKymqsCO hBxV9q/kF+ccfnrRDpuqOq+Z9MjX60Nl+sxCii4UeNdpANgfYgZMFqIp6H5q8saR5o8v3uhavEZb C+ThIFNHUg8kdCQaOjAMpp1wofAvn3yTq/kvzReaBqa1ktzyguACEngbeOZPZh18DUdRkCG0G2PY Eph5e1u80LXdP1myYrdafcR3MVCRUxsG4mnZqUPthUv0W0nU7TVdLs9Ts3D2l9DHcQOO8cqh1P3H JtKKxV2KuxV2KuxV8y/85ka3WTy3oaHoJ72YfMrFF+p8jJnBhv8AzipoA1L80Vv3UGLR7Oa5BO49 SSkCD50lYj5YhMn1R+ZHm+Pyh5I1fzCy85LKH/R0IqGnlYRQg/5PqOvL2yTAB+fN9e3d9eT3t5K0 93cyNNcTOas8jkszE+JJyttUcVdirsVdirsVdirsVdirsVcCQajrir3L8of+cltZ8uGDRvNbSapo QokV4avdWyjYbn+9jH8p+Idj2yQLAxfWWj6zpetaZb6ppV1HeafdIHguIjyVgf1EHYg7g7HfJMGH fmx+UOgfmFpPp3AFrrVsjfo7U1HxITvwkA+3GT1HbqMBCQafEXmryrrnlbXLnRdatjbX1saEHdXU /Zkjb9pG7HItgKU4EuxV2Kpt5V8z6t5X8wWWu6TL6V7ZSB068XXo8bgdUdaqw8MKCH315C866V50 8rWWv6aaR3K0ngJBaGZdpInp3U/eKHvk2ohhH/OQ/wCVg86eUWvtOg5+YtGVprIIpLzxdZbfbckg ckFPtCg+0cBCYmnxNkG12Kvtv/nGbzG2s/lRYQySGS40iWXT5SRQhUIkiHQbLFKi19vHJhqlzeq4 UOxV2KuxV2KvjH/nKzUZLr815LdmqthY20CL4BuUx/GXIybI8md/84a6WgtfM2qstXd7a1jbfYKJ JHHhvyXGKJsg/wCcvNUltvy906wjcqL/AFFPWUU+KOGKR+J/2fA/RhKI83yFkGx2KuxVOvK3kvzV 5rvHs/L2mzajPEoaYRABUB6F3Yqi1ptU74aQSyuf/nHr844Fq/luUilf3c9rIfHokrY0jiDFdX8j +c9GSSTVtCv7GKIkPNPbTRxihpX1GXgRXuDjSbSTAl2KuxV2KuxV2Ks+/Kf84PMH5e6rztybzRLh q3+lM1FftzjJB4SDx79DhBQRb7a8p+bNC816Fb63olwLixuB8njcfajkX9l17j+FDk2pjX5vflPp H5haAbeQLba1agtpeo8alG6+m9NzG/cduowEJBp8Na5omqaFq11pGq27WuoWchiuIX6hh3B6FT1B GxG4yLaEDgV2KuxV67/zjh+Z58o+bl0q/l46DrjpDOWPww3H2YZtyAoqeLnw3/ZyQLGQfaeSa3xZ /wA5KflsvlPzqdUsIhHouvl7m3VaBYrhSDcRAA7Crh12Ao3EfZyJDZEvIsiyfTn/ADhrq0rW/mbS GI9KN7a7iHflIJI5K/RGmSiwm+lMkwdirsVdirsVfCP/ADkDdNc/nF5lkahKzRRfD0pFbxxj6aLv kC2R5Pfv+cRLRIvy2v7ig9S41WYlh14pBCoB+RqfpyQYy5sV/wCczZW9XylFU8Qt+5HapNuP4YJJ g+acizdirsVfZ3/OKqaSPyqiaz4fXGvLj9Jlac/VDfAH/wCePCmTDXLm9iwsXEAih6YqxLzR+U/5 d+Zw51jQrWWd6Vu4l9C426fvoeDn5E40kF4f53/5xCnjWW68m6p6wAqumahQOTUkhLhAF9gGQe7Z HhZCb5/8xeWPMHlvUX03XbCbT71N/SmWnJa05I26uv8AlKSMDIFLMCXYq7FXYqz78nvzY1T8vfMI uE5T6JeFU1WwH7aCoEkdekiV28ehwgoIt9zaNrGm6zpdrqumXC3VheRiW3nQ7MrfiCOhB3B2OTan kP8Azkh+UEfmnQ38y6RAP8RaVGTKiD4rq1TdkPi8YqyeO6+FAQyiafHOQbHYq7FXYq+4P+cefzEP nHyHFHeS+prOjFbO/LGrOoX9zMf9dBQ+LKcmC1EUnv5v+QI/PXkW+0VeI1BKXWlyNWi3UIPCu4FH VmjJNaBq02xKg0+BJYpIZXilUpLGxR0OxDKaEH5HINr3P/nEC9mj/MPVLQN+4uNKkd0oN3iuIeBr 12Dt9+Sixm+u8k1uxV2KuxV2Kvgb87v/ACbPmj/mOf8AUMgWyPJ9Jf8AOJnH/lVklAQf0lccqmtT 6cXTbwyQYy5sa/5zJ0ieTSfLWsKP3FrPc2kpp+1cIkke/wD0btgkmD5byLN2KuxVkXk38wvOPk26 kuPLmpSWRnoLiKiyQycenOKQMhI7GlR2OG0EW9Fg/wCcsvzUjcs6abMK14PbuB8vglQ/jh4kcAZf oP8AzmRLyij1/wAuKVp++ubCYg8qdVhlB2J7GXHiRwPWvJv57/ln5rMcNnqq2V/JxAsL8C3l5vWi KWPpyNt0R2w2xIegYUJP5p8oeW/NWmNpuv2EV/atUoJB8cbEEc4nFGRqH7SkHFXyV+cP/OO2t+TB NrOiM+qeWV+KRiK3NqO/rKoAZB/vxf8AZAdTEhsEnjmRZOxV2KuxV7l/zjT+bx8uayvlTWZ6aFqk gFnK5ottdMaDc9El6N4Gh8ckCwkH19kmD4x/5yU/K9fKfmoa1psXDQ9cZpERQAsN0N5YgB0Vq81+ kfs5EhsiXjuRZOxV2KvSv+cffPR8pfmNZGeThpmrUsL+pooErD0pD/qSU38K4QxkH3Nk2t8V/wDO TfkkeXfzGm1C3j4WGvqb2KnQT143C9OvP4/9lkS2RKY/84jf+TPu/wDtk3H/ACfgxis+T7DyTW7F XYq7FXYq+FP+chrR7X84vMaPvzlglU0oCJbaJx93KmQLZHk95/5xCvVl/LnUbUn95barKaUP2JII Spr/AKwbJBjLm9G/NTyWvnPyJquggD61NF6lg5IAW5iPOLc9AzDi3sThKAX5/wBzbXFrcy21zG0N xA7RzROKMjoeLKwPQgimVtqnirsVdirsVdirsVekflx+fXnnyS0dsk51XREoDpd27MqIABSCTdoq AbAVX/JwgsTF9bflx+a3lPz9pxuNInMd7EAbzTJqLcQnxp0dPB12+R2ydsCKZkyqylWAKkUIO4IO KHyt/wA5A/8AOPyaSlx5u8o24XS1Bk1XSoxQW4G7TQqP91fzL+x1Hw/ZiQzjJ88ZFm7FXYq4Eg1H XFX27/zjz+ZjedfJawX8vPXtG421+WNWljI/czn3dVIb/KUnvkwWqQpln5leSLPzr5N1DQLiiyTp zspj/uq5j+KJ++3LZv8AJJGFQX5+Xtnc2V5PZXUZiubaR4Z4m6rJGxVlPyIyttUcVdirgSDUdcVf ff5NecT5u/LnSNVlfnerH9Vvz3+sW/wMx93AD/7LLA1EJN/zkD+Wt/568mw2+kRLLrdhcpNZq7rG GR/3cycmIUDiwf8A2O2AhQaY9+Q/5B6z5D1qbzBrWoQS3k9m1othbBmVPUeOQs0zcKkenSgWm/XE BMpW9vwsXYq7FXYq7FXxr/zlhpj2n5pC6IHDUNPt5wRXqheEg+/7oZGTZBmf/OGuqLTzPpTfa/0W 6i6dP3kb/wDGmMUTfS+SYPm//nJP8jp7yWfzv5ZtzJcFeWt2EQJZ+I/3pjUdTQfvB3+115ZEhlGT 5fyLY7FXYq7FXYq7FXYqjtF1vVtD1S31XSLqSy1C1YPBcRGjAjsezKehU7EbHbCr7Q/JL87dN8/6 aLK9KWnmi0St3aDZZ1GxngB7fzL+z8qHJAtRFPUmVWUqwBUihB3BBwofGP8AzkT+Tw8ma2ut6NDx 8s6o54Rr0tbk1ZofZGHxR/SOwrEhsiXjuRZOxV2Ks+/JHz8/krz/AGN/LIV0u8P1PVFrt6EpA5n/ AIxvR/kCO+EFEg+8gQRUbg9Dk2p8ef8AOVfkhdF88w6/axcLLzBGZJSo+EXcNFl6fzqUf3JbIlsi XiWRZOxV2Kvo/wD5w881enf635VmcBLhF1G0UmnxxkRTADuWVkPyXJRYTD6hyTB2KuxV2KuxV2Ku xV82f85kaGTbeXNdQGkbz2M57fGFli/4hJkZM4PPv+cXdfGl/mtbWrvwh1e2msmr0L0E0f0loaD5 4hMuT7UyTW7FXh/5q/8AOMeheZZptX8sSR6NrMhLzW7Aiznc7klVBaJj3Kgj/JrvgIZCT5o82/ld 598pyONb0a4ggQn/AE1F9W2IHcTR8k360JB9sjTMEMWwJdirsVdirsVdiqN0TWtU0PVrXVtLuGtd QspBLbzoaEMPHxUjZgdiNjthV94/lR+Y+n+fvKUGsQARX0Z9DU7QdYrhRvT/ACHHxIfD3ByYaiKT rzf5W0zzV5bv9A1Na2l/EYy4ALRv1SRKgjkjAMPfFD8+/M/l3UfLfmC/0LUl43unzNDLSvFqfZda 0PF1IZfY5BtBSvAl2KuxV91fkB5xPmj8stMmmk9S+04fo68JILc7cAIx92iKE175MNRG6G/5yO8p DzD+VuoyRpzvNHK6lbkCp4w1Ewr1p6LMfoGJWJ3fD2QbXYq7FWbfkt5i/wAP/mh5e1Bn4QvdLa3B PQRXQMDE/wCr6nL6MIRLk++sm1OxV2KuxV2KuxV2KvOv+cgvLDeYPyq1mGJDJdWCrqFsF3PK2PKT bv8AuS42wFI5viTy7rVzoev6drNsSLjTrmK5jp3MThqb+NKZFsL9F9N1C11LTrXUbR/UtL2GO4t3 /mjlUOh+lTk2pE4q7FXYqkd/5E8j6jL6uoeXtMvJdz6lxZ28rb9d3QntitsZ1j8gPyj1SJkk8vQ2 rtustmz27KfECNgn0FSMFJsvG/P3/OI+o2cUt75LvjqCL8X6LvCiT08I5hxjc+zBfmcBDISfPl/Y X2n3s1jf28lreW7mOe3mUpIjjqrK1CDgZqGBXYq7FXpP5CfmQ3kjzzA91Jw0TVSlpqgY0RFZv3c5 qQP3TGpP8pbCCxkH3Pk2t8x/85feSFjm0vznaxgCb/cfqbDqXAL27kAfyh1JJ7KMjJnAvmvIs3Yq 7FX0J/zh95mNv5j1ny5K9I7+3W8t1P8Av22biwHuyS1/2OSiwmH1PdWsF3azWtwnqW9wjRTRmoDI 4KsNt9wckwfnL5k0abQ/MOp6NNUy6bdTWrE9zDIUr9NK5BtCXYEuxVdHI8ciyRsVdCGRh1BBqDir 9HPLGrDWPLelauCCNRs4Lrbb++iV/wDjbLGlMsVdirsVdirsVdiq2WKKaJ4pVDxSKUkRhUMrChBH uMVfnn+YnlObyn511fQJAQlncMLZmBHOB/jhfev2o2GQLaC+pf8AnFfzsuteQm0K4k5X+gSekFNK m1lJeFv9ieSfQMkGEhu9pwsXYq7FXYq7FXYq80/Ob8mNH8/aRJcW8aW3me3T/Qb/AOz6nHpDMQPi Q9j1U+1QQQkGnxFqGn3unX1xYX0LW95ayNDcQSCjJIh4spHiCMi2ofArsVdir7w/Ijzi3mv8s9Kv JpPUv7NTYX5Lc29W2ooZyf2pI+Dn/WyYaiE0/Nfyuvmf8u9d0cJznltXltFrT/SIP30O/vIgB9sJ UF+feVtrsVdirOPyR1xtF/NXy3dh+CS3a2kpPThdgwHl7fvK4QiXJ98ZNqfEH/OS2jrpv5vasyLx jv44LxR7vEFc/TIjHIlsjyeXZFk7FXYq+6v+cedS/SH5P+XpDXnBHLbMCD/uieSNdz1+ADpkw1Hm 9GwodirsVdirsVdirsVfN3/OXfkQy22n+dbOKrW9LHVWUD7DGtvI1PBiUJPioyJZxLxz8lPzAPkj z7ZalM5XSrr/AETVVHT0JSPjp/xW4D/QR3wAspC33mjo6K6MGRgGVlNQQdwQRk2pvFXz5+cX/OTi 6Hf3Hl/yakV1f27GO81WUc4YpFNGSFOkjL0LH4QexwEshF4FqP5xfmnqE5nn81akjmppbXElsm/+ RAY0/DI2zoMn8nf85LfmZoF1H9fvP09p4P721vaeoR34XAHqKf8AW5D2w2gxD60/L/8AMDy/558v x6zo0h4V9O6tZKCWCUCpjkAr41BGxGSYEMlxQ+Wf+cuPIMVnqNj50souKagRZ6px6euiVhkPu8al T/qjxyJZxL51yLN2KuxV9Lf84b683qeY/L8ko4lYL+2gqK1BMU7gde8QOSiwm+mskwfnV550ePRv OmvaTFGYobHULm3gRgQfSjmZY+vYoARkC2hJMCXYqr2F29lfW15HvJbSpMg6bxsGH6sKv0mgning jniblFKoeNqEVVhUGh36ZNpfKX/OYtkqeb9BvafFPp7Qk+0MzMP+T2Rkzg+f8izdiqZ+WPLupeZP MFhoWmp6l7qEqwxDsK7s7f5KKCzewwoJfoL5O8r6d5V8s6d5f08f6Lp8QjDkAM7n4pJGpQcnclj8 8m1JxirsVdirsVdirsVdiqX+YNC07X9EvdG1GP1bK/haCde9GHUeDKdwfHFX59edfKWp+UvM9/5f 1Ff9IspCqyAELJGd45Ur+y6kHIFtBt9Rf84v/mkuveXv8JanNXV9GjH1JnPxTWQ2UCvUw14f6vH3 yQLCQZl+fPnG58qflnqd9ZSGHULrhY2UoNCr3BozKezLEHZfcYlAG74QyDa7FXYq9X/5xp843Ogf mZZWJkI0/Xv9Buo6/CZCCbdqfzCT4R7MckGMhs+2ck1vPfz/ANHi1T8o/MMbrye1hW8iYdVa3dZC R/sAwPscBSOb4RyDa7FXYq9n/wCcTbkw/mo8Y6XOm3ER+QeKT/mXkosZ8n2Tkmt8Kf8AOQ0KQ/nJ 5kRBQGWBzQU3ktYnP4tkC2R5POsDJ2KuxV+jHk2b1/KGhzUp6un2r0O5+KBTljS8E/5zNgBtvKc9 d0e+jpTqHFuevtwyMmcHzFkWbsVfX/8AzjR+UbeWtGPmnWISmuatEBawuKNb2jUYAg7h5di3gKDx yYDXI29xwsXYq7FXYq7FXYq7FXYq7FXi3/OSv5Tt5q8vjzFpMPPXtGjPONftXFoKs6Ad3jJLL47j ckYCGUTT5K8ueYdV8ua5Z63pMxg1CxkEsEnUeBVh3VlJVh3GRbCH0X+dXnPT/wAxvyFsvMGlUR7D U7aTVrMmr28hilgKt/kl51Kt3B+dCeTAbF8xZFm7FXYqy/8AJ/T7i/8AzS8qwQCrpqdtcEf5FtIJ 5D9CRnCEHk/QHJtTEvzcvI7T8rvNcsgqraVdwj/WmhaJfxfEpHN+fmVtrsVdir2H/nFQE/mzCQKg WNyT7CijJRYz5Ps/JNb4Z/5yONfzo8xmlN7Qbe1lAMgWyPJ5rgZOxV2Kv0U8iAjyP5eB6/oyz/6h 0yxpYp+c35Pf8rKttKg/S/6J/RjzPy+r/WfU9YIKf3sPGnD3wEJBp5Tcf84ZXKx1t/NqSSV+zJYG MU+YuJP1YOFlxp7+Xv8AzinZ6D5kg1fzDqcWsW9p+8t7BICiNMD8LSlmbkq9eNNz12FCQEGT6Aws XYq7FXYq7FXYq7FXYq7FXYq7FXyT/wA5I/kq2g30vnDy/b00O8flqVrGNrWdz9tQOkUhPyVtuhAy JDOJeQ+VvNVzocl5Aym40jVYTa6tp5bis0R+yw6hZIm+ON6fC3tUEAsiEu1DT2tWSSN/Xsp6m1ug OIcLSoIqeLrUclrt7gglUFCYEuxV9V/84x/k7f6Jy85+YIDb31zEYtJs5BSSKKT7czg7qzj4VHXj XxyYDXIvoXCxeLf85W+a49K/LpdFSSl3r1wkXAdfq9uRNK3/AAQjX6cBZRG744yDY7FXYq95/wCc P9Kmn89atqdB9XstOMLHeokuJkKU2p9mF++Siwm+t8kwfAn51aoup/mt5ouVBAS/kthXv9Vpb16n r6VcgW2PJhWBLsVdir9I9DtJLPRdPs5BSS2toYXGx+KOMKem3bLGlG4q7FUHq+saXo2mz6nqt1HZ 2FsvKe5mbiiitOvudgO+KomGaGeGOeCRZYZVDxSoQysrCqsrDYgjocVX4q7FXYq7FXYq7FXYq7FX Yq7FVK8tLW9tJrS7iWe1uEaKeGQBkdHHFlYHqCDir4z/AD0/Iu88kXjazoyvc+Vbl9juz2jsdo5D 3Q/sP9B36xIbIyeeeVvND6HdMLizh1XSLgr9f0m6FYplXurfailUE8ZE+JfkSCAUkPoDyZ+Sn5Df mLp/6V8v32p2DKALvSI7mIyWzn9lhNFM5H8rciD864aDGyHqPk38g/yy8qXEd5Z6ab3UIiDHe37f WHVhuGVSFiVh/MqA4aYkl6HhQoX19Z2FnPe3syW9pbI0txPIeKIiCrMxPYDFXwh+c35kS+ffOlxq cfJNJth9W0mF9isCmvNh2aRqsfoHbIEtsRTBcCXYq7FX15/ziP5ZOn+RL3XZUAl1u7IicGvK3tKx r8v3rS5MNcub2nVtSttL0q81O6YJbWMElzO56BIkLsfuGFi/OG/vrm/vrm+um53N3K8870pWSRiz Gg8Scg3KGBXYqnnkbSX1fznoWloKm8v7aE+AVpVDE+wWpwhB5P0UybU7FUj84+dfLfk/R5NW167W 2tl2jTrLK9NkiTqzH/b2xV8V/m3+cWu/mHqgaYGz0S1Y/UNMViQO3qSn9uQjv0HQdyYEtgFPYP8A nE3zF5+ube50me3a68n2ob0L+Zipt59j6MJNfUVq1K/s9aitDIMZPpDCxdirsVdirsVdirsVdirs VdirsVUruztL21ltLuFLi1nUxzQSqHR0YUKsrVBBxV8nfnV/zjdfaC1x5g8nxPeaHvJdaatXntR1 LJ1aSIf8Eo61FTkSGYk8X8veY9c8uarDq2iXkljqEB/dzxHseqsDVWU91YUOBmQ+q/yt/wCcoPL2 vLDpnm309G1c0Rb2tLKZum7H+5J/yvh/yu2SBazF7kjo6K6MGRgGVlNQQdwQRhYrbi3guIJLe4jW aCVSksUihkZWFCrKaggjtir5P/PL/nHO40L6x5l8oQtPogrLe6YtWktAN2eOu7xDuOq+46RIZiTw LIs3Yqj9A0PUNe1ux0bTo/UvtQmS3gXenJzTk1AaKvVj2G+FS/RDy5oVnoGgafollX6rp1vHbRFv tMI1C8mp+03U++TaWM/nPovmrXPy71TRvLESzalfhIWVpViPocg0oVn+El1XhQkbHriUh8N+YPKv mTy7d/VNc02406f9lbiNkDe6MfhYe6nIU2ApVgSybyp+WvnvzWy/oHRbm7hatLvj6dvs3E/v5OEV Qe3KuGkEvoz8nv8AnGa48ra9Y+ZvMWoxz6hZFnt9OtVJhWRlZFZ5n4luIatAo+LuR1kAwMre/YWL x780P+ckvKflNZtP0Rk1zXlqvpxNW1hbcfvZV+0Qf2E38SuAlkI2+TPOHnbzL5w1ZtU1+9e7uT8M SnaOJOvCKMfCi/L5nfI2zAp6L+TP/OPur+dJIdY1oSad5XryWT7M10B+zCD0Q95KfL2ICDJ9haNo ulaLplvpelWqWen2q8ILeIUVR1+ZJO5J3J65JrRuKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KvFvzY /wCcavL/AJqabVvLpj0bXn+KRKUtLhu5dEBMbn+ZRv3BJrgIZCVPlPzb5L8z+UtTbTvMFhJZXG5j LCscig05RSCquvyORpmDbIfy+/Ovz55IZIdOvfrWlKatpV3WWCnfhuGj/wBgR7g4gqY2+ivJP/OV PkLWljt9dWTQL9qBmlrLak07TIKrv/OoHvkrYGJew6fqem6lapd6ddw3tpJ9i4t5Fljb5OhZThYs b8yflL+W/mMyvq3l+0luJyDLdRJ6FwxFKEzQmOQ9O7e3TGk2891b/nEf8uLqUyWN5qOnAinopLHL GPcerGz/APD4KTxFM/yq/wCceNG8g+ZLnXTqTatOYzFpyyQCI24evqMWDvzdlotQFoK+OICmVvXM LF2KobUNN07UrV7TUbWG9tJPt29xGssbfNHBU4qxjSPyf/LDSLtruw8t2SXLP6okkj9Yo4AAMfrF /T6fsUxpNsquLmzsbVpriWO1tYQOcsjLHGg6CrGijFDynzr/AM5N/lx5eV4dOmbzBqC1AhsjSAEf zXDDhT/UDYLZCJfOv5g/n/5/85erbPc/orR5Kr+jrIsgZT2lk+3J7jZfbIkshFg/l/y3r3mLUo9M 0Sxlv76X7MMK1oP5mP2VUd2YgDFJL6g/Kj/nFzS9GeHV/ObR6lqS0eLS0+K1ibr+8J/vmHh9n/Wy QDAye+qqqoVQFVRRVGwAHYYWLeKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kpfrvl7RNf06TTt asob+yk+1BOoYV8V7qw7Eb4q+fvPn/OItrKZbzyVqH1djVhpd8SydK8Y5wCw8AHB92yNMxJ4F5s/ Lzzr5TmMev6RcWSVKrclecD0NPgmTlG3X+bBTIFLdG8w69odyLrR9RudOuAa+pbSvETtTfiRXY98 Vp6ZoH/OUX5raWES6urbV4U243sA5Ef8ZITCxPuScNo4QzzS/wDnMr4OOq+WKv8A79tbqg6f77kj /wCN8eJHAyay/wCcvfy5lUC607VbaTetIoJE9txMG/4XDaOEor/obP8AKziT6ep1BA4/V46mtd/7 3tja8JQ93/zl3+W0SH6vYarcSUqoEMCLXwJaao+gHG14SxzVP+cyrYIy6V5YdnP2Jbq6Cgb9Skcb V2/y8HEngYLr/wDzlX+aOpBksGs9HiIoDaw+pJQ+L3BlFfcKMbTwvMtf82+Z/MM3ra5qt1qL/s/W JXdVp/KpPFfoGC0gL/LfkzzX5mufq2gaVcajJWjGFCUXp9uQ0RBv+0RjSkvePIn/ADiJdyNHd+dd REMezHS7A8nPtJOw4r8kVv8AWGHhYmT6H8r+T/LPlbTxYeX9Oh0+225iIfG5HRpJDV3PuxOSYJxi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdiq2aGKaJ4pkWSKQFXjcBlZTsQQdiMVee eZ/+cffyq8ws8s2jLYXUhqbnTmNs1T1Ppr+5PjumCk2XmOuf84b2xJfQvMboK/DBfQBzT3liZP8A k3g4WXGwjU/+cT/zTtHpanT9RSlQ0FwUPXoROkW+PCnjY9d/848/nHauEfy5K9a0aKe2lBA90lan 04KXiCB/5Ul+bH/Ur33/AAA/rjS8QRdr/wA4/fnFcsFj8tTqSOX72W3iFPnJIgr7Y0vEGQad/wA4 p/mvdSKtxHY2Cnq89yGAp7QLMcPCvEGaaJ/zhvKaPrnmRV6Vhsrcn5/vZWH/ACbx4Ucb0zy1/wA4 3/lPobJIdLbVbhKES6lJ64NPGIBID9MeGmPEXpNpZ2lnbpbWcEdtbRCkcEKqiKCa/CqgAb4UKuKu xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV//2Q== - - - - 1 - False - False - - 56.333333 - 57.333333 - Pixels - - - - Black - - - - - - 默认色板组 - 0 - - - - application/pdf - - - 黑鱼白底 - - - proof:pdf - xmp.did:279a03ea-f3e7-40a3-ae53-771dd64b883e - uuid:c3a85fc4-4db4-b943-8504-bfeab2b33386 - uuid:f45c532c-a658-3748-b74d-0cf5e658e16a - - uuid:28112cc2-f74a-0b45-b4e8-5de3f55b3424 - uuid:f45c532c-a658-3748-b74d-0cf5e658e16a - uuid:f45c532c-a658-3748-b74d-0cf5e658e16a - proof:pdf - - - - - saved - xmp.iid:279a03ea-f3e7-40a3-ae53-771dd64b883e - 2018-07-17T18:09:54+08:00 - Adobe Illustrator CC 2015 (Macintosh) - / - - - - Adobe PDF library 15.00 - - - - - - - - - - - - - - - - - - - - - - - - - endstream endobj 3 0 obj <> endobj 7 0 obj <>/Resources<>/Properties<>>>/Thumb 11 0 R/TrimBox[0.0 0.0 56.3333 57.3333]/Type/Page>> endobj 8 0 obj <>stream -HDWˮ\W|olׁ 'q$RS>70Ul滿}x_?(_?}oo|r0櫵~oI10nGaո4U;Q@?[`nɅqN&`TяPۋpFSS'F(5k s*GO݂1ã_*8Cu5b  -!u6G:.N5Gf'l! ES@]C`we,ÍWSpn=v*mua7jSh kO Ɓy{(Axflt-8utɈQ7& އ`fΆfDQ5x%YK7]b~ۿX@w_GƆ&a!z:>鏻hXzli*jϫF#\{<؋Bz^Bp6jÃlʫAlTf};E;Uj~vצt8$nrpGg ثHJ?3q񘻙hqDD&:U.#m0I5LY#v Ql؆5Pf1_r}3za%GFĊ$H58>>D-ZA"ч EWϘС$!Gĩ93zab_MA <GkIuNID"R2Iti_4d9G3y餲M,'&8imsԥ${KD0|%G=DԜ{J0pM% T@,I3zG86ANq0ݧ6lBc561OK%D%E B9%g83ᄖF9fe_&*U碌)x v<|%@n-;mA-7PWirWkԢg!(#oƷ-םJt8jvoX'Whλj7}o=|{.0wf+A:˓!S0ad[Y|0PM8]eS+U0?ո {TUQ* ϣ);C|;6K8tMp{$̗sF6| d^˅GZ3^S{2; W("ym!*LV~HIX9dǵYjN 9!sՏ:*>SYn 0gu>5 1L7|Qtw\MW\+>{oW@z'2Ǖȁߧ c|H~hˌuʋF9ޒ-$nߔAa3ە#ߡ3xIRzzyUtO:P0cP& -uifu^0$)>'+^%F{[갡f)S|K]lkqG9a~vwG*Caֳ?J 꽤=R+Z %&| kf xencB }{C1V^_O!Z}]4)Y:5TP)ҭ}͎l:vhAf^A b|\"QWdy|ʌLClН84LẓoEVcτeq|DK!xNh_y|O#'7s%ᓌxYytG'CI̾=Ѵwf1!էK,Cg8v{xyO|zߘ2 h۵Lgh3 gT92n/Ȧ,1foZ|- -#EL0D]gH`qy38!Яm _unO-B&2oJ:° =r+|QPf;Z&]vFX$K`&d|%(J:e+ݢ/p_Skm~]#EoE\,17]CasXocSMp2 U $Oso˒& E"_jeɍs#y0*[ʯ\t'#_](3Eu G71C2Ssv9[6; ̾<g¢M\fx_FL`i%iS!v)DOAMr5o(A'aQTg/OR0|p{@\DM{[E*>tp*=˫wyS/. `wמojr؏nU'Z~*!dIGxPPQ6ߑ F -|_~:s4T]%^L?Fp ξNNBсŠxޥ@Tix2't1~CG[9S=Hxy2d8b0QV}^n$/SDwfi28GzqoT'n9yп)R  }5}T4KVB q5<] -Ď!O5ĵ踯4(,*TF,jXqj=uOnXz' - 4S ΆL̬*p;-) -djUQ3)5W酜LMFhF!]zD4!@-jb)=ߖaBrǨ0SJ4sTY))HIuAVxc2kSP?y  Ty#Sx~ҝgvȏ r=?uu6"H -CEcӐAһFHkְxa -l?Wx_LW]t K,Zp1*ZM: -1x^#jQd`'1j]!Yô1~eD 2#07ܻFQg80i&yӁ3h"Gt% -8N5 -^i͜ P -mSU<ÀכO(ÁaYvqAES%GѪWBDWH=*R+%$^4tU)$].%2J4tFTl?]#N}kĹ^UB:hxDWP1Ѻ},M *P1p=3OW|u>&i3j %p:_{VNywl6r*E)L)5 ݁>f - )`vr`]H L nvK"Nb.02sNWr[LQ{FtggƼ -ص0Á4!@Y5b-Jܡ9e=*<(;k&lBf#݇T & -tBTkk1!F%0X][VkӜLO]t ;&c`]Id3`~(]v&LV~Y\t0]KD!OJӺ/s.-{u7*ֵ6㗮)]bg3V {F]k]Tsˠr{b1Y.I2xzՌy-! k@ڮphQcm{lPb$)Z᎝cWbh<,!sAVFԢ|%e={ikHJ{^t 4T"롣/Wr9Kn^p'vPK} );\|e44>h6rDZW -m7Mp:5xY )\het[#7z7`3-6p -/Mܚ>Sv=4>F5֖ZEIU"t$Yp?yػ -ek|ex?pȒ~/UsS*]bD|w޳ddub#gj2V°-M'O [ӍaU8T' ]' Ku=]&'ю*Fw -8\ַE)}U9 h*\Q/*<+j<4|Q$4ܗ==7>!Yg#ql%bJVF%hP>%*ov L6z!LE"eo}8M΍Uuܶ[ʂT>hN -~\`@jّP _}b| __|~ݼ~t?/|AW5/m??φhbi߃_B {.vx,!RFBE0'aR&a*Ec?/M(~(8Hu6>\Zic uA:2<4_ 〉QڅuҰn4tJ5:KȰvຕ;T7PA?x]^FNVYS65~?ݰgbHdb٢0\^cןX,#r/jJ^RR4?u,T)8VZh U oAvMcwHEaOВ< Op8}~Ij|KNd)a/5QC1EAYɏ>99uIeuD ;:ͩH7vƱHJ.!b7>OɚNƤ8ᤘdlq”l*}x@<6{(ك}>&D'osQ_`FW1!Fi+@Q%pթ5g$ˎ)"rhD+5yz2X>OFf؍&P !X$aHb0t05<t7#T XCh<3H{f@&A׌km%RjCDzQ#i+/bneڦz\?{' \20PvJV7ӳ6o,:vE:^ɓ^AKE}H]b3o!B' -Ig{(Ecң"R5e2MS$>Բ[)Fӳ 9vt`}`OHCVL E ձt%{rttJrG\k* -`QVe^IlS#g5S)T]a;N}aTUv]²Z)񀪲-E|. :g1: N6yDgwGE0:5ˈN& 0:?k.?Q=l38viV'kV țANQs˲&uc6 7^e"΍ոBv5$$D`ՃZ NPJ\ڀ7l3|xh\}lXvx#$󈖽#͵r76RX mL9JFQް3:@!oUvN9M}_q[- |Xa¤Vx%-mCZ<;_Š)bu8ʟ%] RRMH٪:zZ̤0(ov{ǑG@MH:#plύ х es|I^1܅*, ,O8.Yx$D|Ҵ2H|ھr$nݔ7rO:vR w4])7~sm( 6!"sCZHOX"}zLF80F#5Zwpn1)αlS3[]W6r@uid uI{d7:Ih_ߑ ;G#\!9{v -eաCGB}f8aSP *enl|#3e4Q  ʆ'Z9nOCl<aWGBW zAHFBh8KV3Vj)حXkFbG n̛VjLCNHpIRyI2^|$mu<- ,eؙ]$Sm=cCVUndO {)Tpm- =Q]ʃn-hbN%5O{&kLafS8-ie?} -Y=nGSy+^2bFt6D\p< {ēÁ+"64b1p$%;qxjp+ap n|IGfEՔ -Bw]Uh '1Qjč0xpTt ^:Fl4;3#|KjC]G.qŢc&©i-x8nFDk*{C 8*;6&p*/,(ٳ^Jl6Id*lcrFMJָ(!׉)A푥 Gvp0nIVwa,1$Ds:IYrxձÑwC-FAS)3t+T\yN!<ŖcX3o ;IptMpDLDUk\F3XO˰qޢ'oK5 rEI)cfG cֈ~byʹ׍=[Ȍ ->i.c7]+4ł]װhk [Ƕ,HCrmzP 5W3I/1MM' Acx"Lr8WJ<bBFlzPuחaPF$6xUxdήMNbn{U/eeUw+S!%P4_P$;囹Ј"m&]吝WSJ'>BgՈ\OI7Hj=6nTӑdQ@FtKZ\B2]IKW3rNjwz?[ cT;[7%M2+Y7N*m~ԯ,M:hǕ:l(SVj X*+AӺ:W8,)JQk4"5&rǖ> }%@> -,}51UpχgYk -S1=%ev2n(&6rw=T:" -3Vp$p}p!b`|y^yI4zԯ?. SE01[٠h)'yᢚcu:)"PkRWXh`NV%x0sA7k _M=qw`2k[5m;b<gh)eyOLZ{|wePnz>$}TT&ȷY5ct ƗpL#,,M=kj.B=hpk"@ k#UϼO4Z/$bq[] dֈmxno3"aLOB[uf=>72cZ[~Ī&Z -=2xOuopZK?_c9pX#hb8j`G>!ֶ#& {Yu -sr* jEl9t]%;[v)٥4+{J)xX0_LRAw;4*w)j~)"LB<9u{A:RApߦcVF#cJ˖|DgHe3d 9 ۭQB~w?ؕ]>mi ;6g?}{Xp=eўYF(NK]{;BO@ 7sݝUl$g`#f)Hmj6c7=r@pڀ=B]. tKPq;I~DyDq&wJ;,o)NjҚ unv}\x_#?HiؑZH0s%xZ|^#^zIqG ݲ;t7;̾25՝.m*FtI=ovyM5w֧]"^$S<P_,``OdM֙2)Z_)~dc_z8MҏP!kg\߭@&s9*vw=K𻚒 ij T>Q5x" hm#FJ= f9 -`G+ ļ -@G#\ʺi 2ZL-ıG `}# ֔>C `Gy70M1zJsUuQbVi˂]V"S5e]ix; p^ב"cIp HA}gk1 -opyj%: '0׶dД -R!`>V,4 XGjѨ#jaNbz-GZ -%e9:ؖFN } uUMAU<&p4k" wlf4#0HC"kx;X-|\!MӗU|4嵀 -&XOk<%@8rrDt"+iA2S! 8lK}udkWoTBO!Zőzʓ C6=nȚ5eo$DUk<(2kks.qeAS|d֧ ,DsՈ~Xoz:(tB8MJyGߚ2ȑ]{e⼣m,Hrm`ݭ+l_mЌXMv6MRDe:Hl(ؓ -u۫h]#&^|j_n.,A DVBJ@q/N?iI<wMS/5GQEb*eMO[N YN|9$Ϊ)Noz26mp$#%Ⱥp"$mU#ԅd5Nfl6zvpҥ-*ǨvoK &dhWbnT(5)ͩ_oY7Vu$+unQUW uu`yfIWB|&p,-Y2Sƕߣh(E^k6M8-}$@$7e*<`J/#,!A& AH:/ҩ^ #Tҧx4 -G$9od1F̜27KҎvl7nИi#wTKLU(UXV6ڙ9"ѣ1/XCb|$ -=3+O涋E3CJ[dvt"Ff,_M rR"O; "NѫM3٪)ME%$ߙ83 oPڪ\бKiTO '˪}AF0b=S+ֶc -cH5ԚhDJ35`zA55 ͻa˿]#\ *F$TS^-fӍ^@OcDQ,؟L`nѰ+!?t LtS6AY5##HљFX/7a.|i{{9(p rH>. -{=x7>Z6NkuH:$F4l@<wӼ[۴}ЈylODGz}d)mm-O*Uђhg`{ze #?:=NֱsI ϱ?h,@lBO>EpHGI(zhCu -=x* ' -v'JvB4उ6=Ed_LR4};4BSuZSA=IH3)Ha҆(@IH(ٚM[7 "i"$M$PUSiBB?C}g=ͩǟOXl?6OO0 i!i_~Ǔ2rן_@ -C~~$ʮGtu桷!ߚ\oHD'}Qj֧[߫斿g;n^y˚OVxVi: C$#B!ɻ~i\s!\ NA%@TU#iS"4 c5HYlMȟ\nmj!O VyLSE$aUḢjW&ZCXvzr:|Svv~k2'3^l;wؓߞ/~v~`Ylx8<ʱH$9z 6+*K]yx C!O634%Azǚay>_~DI@HIa-Y3 -qkzD /ɳf^{JjE '3kRb'y7Rb9_r#x~8y7[ө$P=⵩`s{I ;P}dfl1x #Dϱm K鐝;9 L֠?_ZsI"9 1|)M3IЈrhgVl @n`(/cD-^ w;t$\~"68MqeM{&Q>謏Zt,j4wMРrus_ JH v1 şPaO - KfIIC;^I \$Y[)8ZOnxd j$M"u}t g9p^SТg:m[S-HAw#A[8p$B<Ǟعţ# ]d gU67(b >T[pL't08V - 8Ͼ[gl)<8d]e g8e4P)G GP= 8"@6qy&VSHYra+kG,- -vu'|M{>HT)8qlp߬جtџ͹5=R/qB#FVGд@:7|\F ɑB@c-2ԭo^kl3NcLte4:(Yv}XvMN Mfvt0NtxMh˱8֔ŪFhf셼d xy# 0iFA0)Ү78Z^AɦĘ5jR488I1h!ǎrx\{b2sM7Ǹp?!7vx[3FX{9p`(c;mEl٣iZQ, < -XL!.bhD=8qR\leVt#rj<嘫fԈnD)>A㗃4h$QH]490I4w1y8B*l}#CV@۾,ftSg?9R/^[FԒ}׌ѥAӀ޲NM3)S "rL eeR1uF7p7v^ZEvSBDCJn}#ZJ7SBSʹ6 GiԍkUǕL8`˖9tX+Gwx$lz+]LoLWM$ )3-#g ,rMH7xCS]DOoT(.7 gK8<ݶ~g@p&x2jfki&>byGژbk\n:b&>STwpo<r't"$2mynMR۱/W=ouGIM^+ĭ* 6E4.G bpy$̈́4dr`;J2Vr4UgH9UDjz8ES,2dթHLIL'*cJ!MΓlo.Z-x1o TV%]zqRᨾfc#M$ ':~ELVx{Qܶߟ'*>ESR߹2J?}߿(eU'=?_B ߨZK>gY?왕7*mP2WI?,U98>P9Ѯh[mC }=kwczOw|T B+&E?E*KQl1|O1 0lϯׯ}fGL>m[X=2ݏ&E,-^8P+Gȇp8~y "kOcEuq zkcCGe-ZϮ[: Jetxp)vsLͮ2;8pdh(sg)H{_)Ng/@ɝU s -ZGyx@Wx|+yf}^&3S~Q&݌q>˼F>}}Q.$Zao~2Ӟl״kspq5/3Z)ffaڨc8QeC໖SUb2X8Ç8NBui) S4%t+GrW2$X:j -׶I)9mv\Q*+B'l44#zQtԷscx=&On|h[~x)M!PN 'm餟)v!`4OyCVt$i=h3eKߴa!;U]fn?$4iBGaOƶZ -]#&k/BFW`M!;su>q* wKtcG:FeOꜘ71x`IÎv$WZY[`㓟+ pnn6L6̮L.MJ&K9AruٺPWu^ɩ`o1b;l  $㴥$W 2minˁq4IӳnxyԼ$b+='ENfrSUztM#I'E}mrӂe ޏk(M -*pcc= C` -\y<RCVg]=Sֆ8 -_ Rm!0=`Tvl _|%1pu5kϘ6P)l2MVmfq8Zq`cz \Ք#L+k$G,-6 ut 4E1SC59U -މScfzXӉ#GN@Z!pFDV`iŘ@VY7<\PD–ZZ^%V Z67sL};VM4̲S7£02oa o͉\ZPN30Μ#so$mF|4h)">}Z6:ޘp2yF4t. xNќ+p[L}Xuch}T/%K;R3*0ިV/kyw%^ L=XJ=)pH65ޮW6QUw5ÁrAy@+ӘM|$MBmS.n~Ct( -v$%iI8DU`Y_kOJfi|SzcgP^ -U߼#m6sO3"=XkTc{\cE,4`Q* >oaKk>Q>)MZZ2+ZQ`9<+&j`vW\5=ԃ_ rOM(Ѳt#vɀsnCI֐ o_1Cd+W ZtՍ/luJ@%BaNMw]9 h?ia-vzYM*fѡtf&\Wst7F% ,j۩2bg }ɭ[xRifw•6?4bMJ8|dR`|XvqK2$bUQMӻ.'ިP]n$ϖ.PIeZ=rc_4p{A;2V>[%U6l4Vi\6-6lI i -`-JcWwPdhw϶r2 ,pNYfSeLǫSn=O4T0I$C^' \ 77ZbP`7J 5>7?Q}'FH Ou: -m1@M?OT}jW!~seV!7v>}5uQVc ʪ?Ւ+˭潊lg[B dOII8I %;pUozJ gV\gT el=L "?X=Bh ڒyrc߁zY^T'H]fa]) -ҽh)Lx8PBƼtAh)A+""=2C>|{C,tݸP$A 2 Mek(k%D^ ?'FXu]AgOp]/v~WGf3H$YlvIA1n>= %a u *`ӠF'f )_؀\1o/F1ٟ\Cpi0z4K﹄`,{.>?gXbK:Xs>``g=V7F:4? rD{ӯ·UC-B͍GrmvEs#R^L'ufJaP," 3gYVeD Q.`˃B-r>5-يP<r%i6];~`+zޕ qB^C?{q`K>!ͧ_t̎^ = #XrCvgpC+#YsgDX*ۘG>LOfLi'NҬ+_ޕ|-ΔtO(O 0ق]tog&7JC|Lw{XA7\{(-,=dM&7XR!Mk65X٣܅^Pn\6tT9m Ya)GK.R;uTp퐵,dHpr~.(\{UߍkV4ĖΓ'%e;7Xг]"~.-j9ž{ -g ||~'Gģ : 뇺f>cTU'LVaYQeIo8u|z c9|{ߔf q[6˘QS˯y8h ߦ1Ƨö4Nmg/}l¸Xt,0w|"1m g.x<_\),#.]-E_)Vx%s+34$ -w#, xI, 4$%qb(i{kH[a$Yӏynm%r®Xw񅅻\^8ZB.g@c0")ϸS3NSg2ԁG˙"Y 8amXrqR@1K8?7ÛoKLUL]f8COHu*mȪ'!XvW*9Q_}HQc}7C!}^lA^);=e -N B 98(\e@fq^jE㡪"lIa;SyXVocThl)ξ&81R&=KM FV!e"1,`C:HY -\o085X]wH rX +hL5eEXfY5 QB܇<0+mL -ёI=V\ c2h2r1*zJ8&'+V̳XsC"*ɕ,:E^f182_F2"YwR J.ws@$zoCƘL.R翸=>}L2m']%IGo6Xqw/QN:DKL <&pDN1/ !}@rw9N LؕXkx(NYT|ݤ5O=u ^otJs?|ԝ6-8kX9P-}}'+vG WWM_|#%ssS -~K]ZIJ4Nd/}m59e8ib3T,L -6?wKxX -L>._ͶέBҠ4<`W "KM!Jߐb+}0GUa=0xT% iw -Dt~փg Jf7zh(%kCkl[vtSVxTûnpއ 6Pep/rҨؾӪe*(z O7lXh <f =lX5Gt㚢"P`:< NcCe]15{yC,"k{XVmɆQoH†zd4vGּհrnޫ0Yjօl5GmzhjT j+ c{@╹|Q4S؍ݗ+89_L{*>wY$Q0sb0`=k&&)iHJoM_r.yȣ=ioӆqduyDNVk;Yvv Vź[/,ryv|S΀t+x6")xR3nSfe3EӍͩ1 rrR%cGn7rx3R,bmz%Gϡ6ܩ:.@X_6 |x;?G%MđCFjr!`=s؂3*0%,Fka|XLU[Ce9ʋYaanAΗ1n9r]6"WfQs7S0d fo#-9]4LKxVn.GտvEwVXqUjqs71qa۬isƌn6X7uy .;xUtÒ*tY>,:! }NH<S#1W83'C#a.o_a>rK.*GaMg{?J9xLB;0JF=|+jX}* e -7C!\zezx)%S, -]m@*'6+TQ?T(b$[4+ZD-.`^yC2'SB*&~d'ع[zlX~|(AD`\Y#J߯I3K5qpVb%7ṫO+!TM]kSˡڷ -j_oϯ}BPПȰ_1n5]U3?HKTⴴٙB+t -' -I@Y]X&R)Ho )qOK!Ҁ{c{!&ץ-b)p%vC JY"_mdmvNJAe xnGѽR@8-xT@ӒxfCpn^ -7 tT`4&[pu<"6TL=̅aMe[$ -|wMf.M@cQCokP+6>Uۢ+po -+t8@\모Fif-$TxVd=8 - #Z]7O>kd*VBN - y+{nŘQ zĩs=e(Ƕ#A1V sݴ'^~v,k‡g s(xrQr̃p_²ĦOͥ^Ň'(VL] pc +LK, 0mf~o;R`IuB?CSһ2(.)SS?[®E%z)|6R[_bxbw^ؾfJ|iyZd^΄]jsޖ!qIu~C%:~P/ oTK |;Ù4iWsMeΰ%.qx>ڛrN73_4¤Km%B~Fƛ i&+!S;j!H0+&1s;tZt^1osVirR0m7WBa}U`9Vd+kJN"k]׬=WQe^᱊*#5(Q(L=s,L;- -x 7t%w@GG+0GMO= y( :@. z>-݅;&C ͸z^R?V=&jx=h@B-54,@a@ -\iRVihϳ: n-<mkCu1'Y|mkW4 - sXj&Jt2Ws,.6qEF8_n~Vz --4A;Z (MuT"a0-*EtCuH\-eܑΝ=J$fZyhw=,P4yG7yq0XGOg۬cL Ӄ wyeSyt=lᅸ,b]aER ϷK;x -~{WuL䎦>kGz -ڡ{jz:w^r/g7QGl.5gVkiuO'&ݟXU1ƗI*1_~G*&j%?)XiN.8>.v4!ڕj/Denix- &E P)5Na'bG ly#5ɏm9`zMӔB;09YjK7_8ÚZTQcBPt`Ш5ʝctaqt5b0XNSb394ZI 3kI;,KȘXIf%[IlbJnNϯ߿ڷ~?9x?5Kq*e^^!&g1zzGP(c7W|NRƇXP'|z5(xNꗟ\l_2HI?8}XOMD;PД PQ!ߔE j 8s:@)75_:a ̄RG,6a ;\aD^aXdU]V%;b^`ˡE&C>AG`[L.̑}tB߆ iЄ0!y$)Lٽb,4Ű弻HWe6.<I>):yևjW+|9&|K%{ú]د{1IyTǼ;z)\584 ;̷ ܳw 6_ վy92 -~QkY}T^Te}Ґ]v|p-j?z/n9Qp<8\DMbC򀃗y$NOo1?\Ti%XUx?At7nH'"2) -oCCfx,1dIu# =X̮UE=1N I[ĮI+EZv~HĮ3)6vzC3=ysS.v9 !qUIu6LwyRJqTwygヵw/{p;>xֿ]~D;i ɾ*"'J7KM {&3;ss-vIo -wU69Ѕi;+M؇ݑ EzyY10iX{WU筛<]~x|V&+0޾*0qf3W k 6ܮy) ?_Yuj -ǪV9>Ze3 _ w༢kH]eAOQc It0Q}\s~K~y-%9zw?U(R~L?ʛ(֜z=NIv -wK'Kq56wrbYV!RG z+(؇t0wAhB%_sB$ڝ(j#KV5Q0VGdhK/ |`lY^ry{JYjFH5%*Wlncڐ] jti.i8<5ELh3L器VeɻGa`_^ cueZ3]PtoSoǶ5hG3u4tw!g8hC-E,>צb"tccwQ,+`%ѳ̉~@G-ϳ$C^PUܼŏY:zeftoY8qOL-Ҿ3Vb#tv֟}lqKlF>PJx>/ -vFiskh~{A:aO䊦 -_aQYov(M5]^CF/og5R+TM\`F8&ee-KL "OtMLx@e $_|F1Am_稽 -D'S=Å?lO]uv RKtK©HQ$Gq@վ lbܪ-RV䠸9y8WQQM)-(rsr˚YͱaiS^ skIR'QoG2]6-cKշS:?r.Bt&\?qɷՐQ1YS%ݡgZylVu HȘb9[ `hO?㿟!VNo"GGT3>ME4 w9-^ Hv;{G ;#oaaK G~Ox #]c?Rw3Mpŭ._^6.6Bz۝,sD%Hu&2C|A"jj;!=EJ n?9<5B=ټS+yo|;>;ҧ9m= ':J5="H9EoZd/wPQv{q^ -ohSauqo$":ph+Ƿp#,܈$ȕ[>'$t^ bwaϩ^{2ɚL?7iZj9t;CFRo+!cG1{=mI| XW-B?*+mH𴏸8w.ot[𤚕mYnxCh͡'BjjҼU!D8@k:ZC JLHfȚ"ɫO"ݲ9JGQb^&)Y2 D[hrslh E.h['{t홬3"_T/6 ,:&4`h CKWJИM<,atMh׋e܊{ =rU^t_Pm|0G4\Rr:ܲpF:w@g0+ںӝ1P*0Pe@F Mkrࣜ`DߓInC]:P1>T]e/G0) XQCo@zm>)\4R>g9IlA2nD5K!ST2HnU@1$œ+M.poz}l?/Jہ5G"ྋ38!)98ThЄ(Os>Uch3iĶFCM "V[2i]ߛ{1fh.WCK/|o1LĔFS-X>&$=”ⲇi3ir 6c2r^J*gC=[ܣ0 f^t_Lo]*ÇJYm`xNmF cՃ@A0HC}pn]`cԃ;ék)Þ6h7Ž. `YSz pEhM#\rum<8ߏed dOO>W˶DT3:T={6:]ra)pQ`o]\8:㊞:r0oAj/̷ =@X8JbQܞ^wv{wEjbFmK] i:-"~o.`">D?{g F]+=/cU2ԁUz0^',Մ , Nho7LT\5BD PWx;M}g9S)i܆`K"w߂tA,,;aAZ)>kKA[HC~Sj!ߦEJsl:Dս4y:z箒I-iN7PU3uތǰZVZh40RW4Y%W3lOi׆K:6M4Y:<5~.Խ"Se#׋닯Ohx*X^ma$S="NSdVng ԇ{QUV gH+Xum"3D2zT -kIw㕑P 6O81VSBQSs(gC*DAB4 KVnθ.2Lg~5;*x#~Q!>OJJ0(SJ4ӂ֎ Cbbw+ISF34_5a _ueb[E(¨3ª {@,s]mKX*g*\&M,_)V%쨰pI -RtyRB;_΄1;{ѭ-P ne -uɉcJP`N3 ~O@PԙගIPϿ~OՃASb5?\2/]Gܠnr7y)\yҥF/ȵ>k;7_fږHj%:οE%=,68Q.kM>T?oB"^e(4V<ӨGOwn8m v'} ݩaZ~} ~ȶEv;ǯJ¤ƣD=vMR_8%W"TDy(94 abAI^719d`hAgsf,nb|ČXG5B<b=ƖOS8 s3 4Litف4eڇ-{hNUl g(R%pz$p*fg_#MЖ lAUn'q6t#Yamډw%"|ZᖈTfRH5#FaA ݇hN8ڱ_(]V|{>G腵{#j[Y>Da9}d -++?i{!b ?^-'XxD -L޴;i)&ܖ:MYmf維 B$]#ٲ19A`$=x\D}i;~jV. {>^ƪPY$|p- iaVIѽO`Y AX"}>n3K2aM9u7zʊx;dYrS DmuڴY[.@ȥ޼d$İLGPNy9Z9!I$2OL^O<}9h9L (Tx>ۚ`w-ЇZ=goܻhTn';&XC*)0AB6z"7`jcS>P1yko .̤CPLMD3,8>%\Q!xH ꋷw5(USrMc{Bk#Y*1bm55$`#%6/jq,OQ^TEvF7s;b'ɞAB+ŤђL/+%,S1myI+D95uݺ)CٕЋb-\ S.CD.fSF!jDfndwIswL'ScUX#ɂS J)Pi_Iفr .7nC -H5P4=ٱ SAO[T׶_Kr(H1TC ˡ,ľˑyNWʩRuVPxJ4 1J&M9 >h,4ԯ(#=[/i;&fH6(["&$v$x0@ݗl8U^qP-> ("crC㮊A21[h[w%&^kE`8Pި3,y@ZSphmFLU94E -,#~(:xOaPN5+L X[6B^v# i=14 l-j_lq!bY {iz76fGW-ya/T<(! -1*Uzu:%)HaNC AFAJc>h{*{Kp+Iǁql2/j&VD$&m5M`R֨7h lJh'Gӟg 4 e@ʤֿ?RM7-dUS)Vh`Lg5Аli)^ J8[hߩÏXϣvh\ïMt_wcS**1A&-X;XI -w@Y6bHGk-XX6,ƙSQ!zaL[h6gxO4(ev \ FX;uE LD$LǵZ!$|~_0]Dnى%HT{U]D bc,+n9LXQM`'nzet2@rbHN~T=H!JEL?Ty .'=H"SJ񄋅Ī&X pM -R;b]¯k'Kalnc99(b_QŦ;X{ɩn2nOS F1$}Rܲվ)JĤok9p jx. %P6@a E-#*%`E+,Q!_/`°ozjmxsH]̧ |]h4r -EY ։ HQ{o3"Yא4i%㹩Lɏ Eډ;D4R?JLxzX<4k 0ƅct"xSN \TcfaysA:7|Ȕe҉gabSN4D&HDk҉Zeb։DJ̘F$ -0 -1DupLHDbǬ ڬ>D(u@:8^2>&P&Z'DЎ_^?` aֹ0}vAL;[ έyӼs+n޹wb޹f޹j޹7s[üs'xvyyOm`m ;&;$&;E&;f"̡N玺b炅碉⑉ià:\5\<6\6\D7\7\F0\0\N1\ 1^3-R,) *?GNED6jӇh oDZ@HT3N޺1O n$G1XrCK"Qbp&syi..މCht̮5[A)8ҐMy!Qt!b؁Ou⹅9U'.n g4$-2Q鼲A yኑH H \!؟#ts"q Sֈ۷in)ge+O& /w3Z* $ZF['<{T$rO1@S 2ނfOJNOHskFyH x񙳴@hh5/]HA~ -4H|1 @\;"9} IQ},)F)p 93tNH1k1`>a!J :36߀y?+X=S5VO|ss{lB%+WvT%ϡ$^I\4G5l$uIu+o=+~7 sZc6ƻj+WT~֐;<c5L(g %-C8ESiB؆1c}.)%[ &V](m~iҬ#|us6L!22 9ȂB# >Gn J}K[?9V)15r>-igǶw` }h/1ƸZπP{}(8:[+ -M ;vAHЗS-'~ Z9CBx x/ki\aJ2+]IPߛO1+A t0_8W .9۷jhpYdXp2YgW> ۅ_WINb+6|z ϗLͷ43i>eĊ_n\S+i1i TQkcԔ&|PC&*fFed U%n@h:TqW_l@pR 5884_ICAGl@HJ=&WM k 2\ըPB ׷'3j+xQo1j;P&bb͚&6̬-5kΞ5q(FMQj5FM$QeD5'AE_&2ܬ0kH (u&D5QbMX.ք5bMxXf#ք5aWbMX'؄# -6aMxhs:˕m.&m 6CE Dٴy߿~ן I endstream endobj 11 0 obj <>stream -8;S=C0`_7S%"\noO8`:`1K?(.gkjkgO>Z(g[7.,"GQA!K)E&9'~> endstream endobj 12 0 obj [/Indexed/DeviceRGB 255 13 0 R] endobj 13 0 obj <>stream -8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 -b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` -E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn -6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( -l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 5 0 obj <> endobj 14 0 obj [/View/Design] endobj 15 0 obj <>>> endobj 10 0 obj <> endobj 9 0 obj <> endobj 16 0 obj <> endobj 17 0 obj <>stream -%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 17.0 %%AI8_CreatorVersion: 19.0.0 %%For: (Graphics) () %%Title: (黑鱼白底.ai) %%CreationDate: 2018/7/17 下午6:09 %%Canvassize: 16383 %%BoundingBox: 512 14 580 82 %%HiResBoundingBox: 512.519474100296 14.5993985160931 579.268412090863 81.3483365066604 %%DocumentProcessColors: Black %AI5_FileFormat 13.0 %AI12_BuildNumber: 44 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%CMYKProcessColor: 1 1 1 1 ([套版色]) %AI3_Cropmarks: 516.333333333334 18 572.666666666666 75.3333333333339 %AI3_TemplateBox: 297.5 420.5 297.5 420.5 %AI3_TileBox: 265 -333.333333333332 824 449.666666666667 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 6 %AI9_ColorModel: 2 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI17_Begin_Content_if_version_gt:17 1 %AI9_OpenToView: 504 120 6 1448 814 26 0 0 67 38 0 0 0 1 1 0 1 1 0 1 %AI17_Alternate_Content %AI9_OpenToView: 504 120 6 1448 814 26 0 0 67 38 0 0 0 1 1 0 1 1 0 1 %AI17_End_Versioned_Content %AI5_OpenViewLayers: 7 %%PageOrigin:0 0 %AI7_GridSettings: 72 8 72 8 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 18 0 obj <>stream -%%BoundingBox: 512 14 580 82 %%HiResBoundingBox: 512.519474100296 14.5993985160931 579.268412090863 81.3483365066604 %AI7_Thumbnail: 128 128 8 %%BeginData: 17418 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDD6FF7D7D527D527D %527D7DA8A8FD74FFA827F8272027F8272027F8272052527DA8FD6FFF7DF8 %26F827F826F827F826F827F826F827F8527DFD6CFF272720272027202720 %272027202720272027202720527DFD6AFF7D52F827F826F827F826F827F8 %26F827F826F827F826207DA8FD69FFA852272027F8272027F8272027F827 %2027F8272027F82752FD52FF7D27F82727527DA8A8FD0FFFA87D2726F827 %F826F827F826F827F826F827F826F827F87DA8FD4EFF5227202720272027 %2027277D7DFD0FFF7D4B2027202720272027202720272027202720272027 %7DFD3DFF52A8FD0CFF7DF826F827F826F827F826F827F826F82752A8A8FD %0CFFA82726F827F826F827F826F827F826F827F827F82727A8FD3AFF7D20 %27A8FD09FFA852F8272027F8272027F8272027F8272027F827202752A8FD %0CFF7D27F8272027F8272027F8272027F8272027F827207DFD38FF52F827 %F827A8FD07FF7D27F826F827F826F827F826F827F826F827F826F827F826 %F8277DA8FD0AFFA852F827F826F827F826F827F826F827F826F827F852A8 %FD35FF7D20272027207DFD06FF5227202720272027202720272027202720 %2720272027202720272027207DA8FD0BFF27272027202720272027202720 %27202720272052A8FD33FFA8F826F827F852FD06FF5226F827F826F827F8 %26F827F826F827F826F827F826F827F826F827F826F82727A8FD0AFF7D26 %F827F826F827F826F827F826F827F827F827A8FD32FFF8272027F852FD06 %FFA8272027F8272027F8272027F8272027F8272027F8272027F8272027F8 %272027F82720527DFD09FFA852F8272027F8272027F8272027F8272027F8 %27A8FD30FF2726F827F827A8FD06FFA8F827F826F827F826F827F826F827 %F826F827F826F827F826F827F826F827F826F827F82627A8FD09FF7DF827 %F826F827F826F827F826F827F826F8277DFD2EFF522720272027A8FD07FF %A82720272027202720272027202720272027202720272027202720272027 %2027202720272027207DA8FD09FF27272027202720272027202720272027 %20277DFD2CFF7D27F826F8277DFD09FFF827F826F827F826F827F826F827 %F826F827F826F827F826F827F826F827F826F827F826F827F8267DFD09FF %5226F827F826F827F826F827F826F827F826A8FD2BFF27F827202752FD0A %FF27F8272027F8272027F8272027F8272027F8272027F8272027F8272027 %F8272027F8272027F827202727FD09FF7D27F8272027F8272027F8272027 %F8272027A8FD29FF7DF826F82727FD0BFF2026F827F826F827F826F827F8 %26F827F826F827F826F827F826F827F826F827F826F827F826F827F826F8 %7DFD08FF7D26F827F826F827F826F827F826F827F827A8FD27FFA9202720 %2720A8FD0BFF272027202720272027202720272027202720272027202720 %272027202720272027202720272027202720272052A8FD07FFA827202720 %27202720272027202720272052FD27FF2727F826F87DFD0CFF2727275227 %27F827F826F827F826F827F826F827F826F827F826F827F826F827F826F8 %27F826F827F826F827F8277DFD07FFA827F826F827F826F827F826F827F8 %26F87DFD25FF7D27F8272027FD13FFA8A8A87D7D27272027F8272027F827 %2027F8272027F8272027F8272027F8272027F8272027F82720277DFD07FF %A8522027F8272027F8272027F8272027F8FD24FFA827F826F8277DFD19FF %A8A87D522627F826F827F826F827F826F827F826F827F826F827F826F827 %F826F827F82652FD07FFA852F826F827F826F827F826F827F82627FD23FF %A82027202752FD1FFFA87D27272027202720272027202720272027202720 %272027202720272027202727FD08FF522027202720272027202720272027 %7DFD22FF2727F826F8A8FD22FFA87D2726F827F826F827F826F827F826F8 %27F826F827F826F827F826F82720A8FD07FF27F827F826F827F826F827F8 %26F827A8FD20FFA827F8272052FD26FFA852F8272027F8272027F8272027 %F8272027F8272027F8272027F82720A8FD07FF27F8272027F8272027F827 %2027F87DFD20FF52F826F827A8FD0DFFA8A87EA87D7D7DA8A8FD12FFA852 %27F826F827F826F827F826F827F826F827F826F827F826F827F8A8FD06FF %A827F827F826F827F826F827F826F8A8FD1FFF2027202727FD0BFFA87D52 %2720272027202720272752527D7DA8FD0EFFA87D20272027202720272027 %202720272027202720272027202720A9FD06FFA827202720272027202720 %27202752FD1EFF5227F826F8A8FD09FFA85227F826F827F826F827F826F8 %27F826F827F82752A8A8FD0CFFA82727F827F827F826F827F826F827F826 %F827F826F827F826F8A8FD06FF7D27F826F827F826F827F826F827A8FD1D %FF27F8272027AFFD07FFA87D2027F8272027F8272027F8272027F8272027 %F8272027F827277DA8FD0BFF7D272027F8272027F8272027F8272027F827 %2027F8272027F8FD07FF7D272027F8272027F8272027F87DFD1CFFA8F826 %F82752FD07FFA827F827F826F827F826F827F826F827F826F827F826F827 %F826F827F82627A8FD0AFFA852F826F827F826F827F826F827F826F827F8 %26F827F826F8FD07FF5227F826F827F826F827F826F8FD1CFF7D27202720 %A8FD06FF7D27202720272027202720272027202720272027202720272027 %202720272027204B7DFD0AFFA82727202720272027202720272027202720 %272027202727FD07FF2727202720272027202720277DFD1BFF27F826F827 %FD06FF7D27F827F827F826F827F826F827F826F827F826F827F826F827F8 %26F827F826F827F826277DFD0AFF4B27F827F827F826F827F826F827F826 %F827F826F82752FD06FFA8F826F827F826F827F826F852FD1AFFA8F82720 %2752FD05FFA827F8272027F8272027F8272027F8272027F8272027F82720 %27F8272027F8272027F8272027F8277DFD09FF7D272027F8272027F82720 %27F8272027F8272027F8277DFD06FF7D2027F8272027F8272027F8FD1AFF %7D26F827F8A8FD04FFA827F826F827F826F827F826F827F826F827F826F8 %27F826F827F826F827F826F827F826F827F826F82727A8FD08FF7D27F826 %F827F826F827F826F827F826F827F826F8277DFD06FF52F826F827F826F8 %27F8267DFD19FF5220272027A8FD04FF7D20272027202720272027202720 %272027202720272027202720272027202720272027202720272027202720 %7DFD08FFA8272027202720272027202720272027202720272027A8FD05FF %A8272027202720272027207DFD19FF2726F82727FD04FFA8F827F826F827 %F826F827F826F827F826F827F826F827F826F827F826F827F826F827F826 %F827F826F827F826F852A8FD07FFA827F827F826F827F826F827F826F827 %F826F827F852FD06FF7D26F827F826F827F826F8FD18FFA8272027F87DFD %04FF5227F8272027F8272027F8272027F8272027F8272027F8272027F827 %2027F8272027F8272027F8272027F8272027F8277DFD08FF4BF8272027F8 %272027F8272027F8272027F827207DFD06FF2727F8272027F8272027A8FD %17FFA8F827F8267DFFFFFFA827F826F827F826F827F826F827F826F827F8 %26F827F826F827F826F827F826F827F826F827F826F827F826F827F826F8 %2752FD07FFA827F827F826F827F826F827F826F827F826F827F8A8FD05FF %A8F826F827F826F827F87DFD17FF7D27202720FD04FFA820272027202720 %272027202720272027202720272027202720272027202720272027202720 %2720272027202720272027202752FD07FFA8522027202720272027202720 %2720272027202727FD06FF7D202720272027202752FD17FF52F827F827A8 %FFFFFF7D27F826F827F826F827F826F827F826F827F826F827F826F827F8 %26F827F826F827F826F827F826F827F826F827F826F827F82627FD07FFA8 %27F827F827F826F827F826F827F826F827F8267DFD05FFA827F827F826F8 %27F827FD17FF5227F82727FD04FF7DF8272027F8272027F8272027F82720 %27F8272727F8272027F8272027F8272027F8272027F8272027F8272027F8 %272027F827202726FD07FFA8272027F8272027F8272027F8272027F82720 %27A8FD05FF7D27F8272027F82720FD16FFA84BF826F852FD04FF5226F827 %F826F827F826F827F826F8277DFFA8FFA8A87D7D5227F827F826F827F826 %F827F826F827F826F827F826F827F826F827F826F8FD07FF7D27F826F827 %F826F827F826F827F826F827F852FD06FF2726F827F826F827A8FD16FF27 %27202752FD04FF2720272027202720272027202720277DFD0BFF7D522027 %20272027202720272027202720272027202720272027202727FD07FF7D27 %2027202720272027202720272027202720A8FD05FFA820272027202720A8 %FD15FFA827F826F87DFD04FF2026F827F826F827F826F827F826F8FD0FFF %7D52F826F827F826F827F826F827F826F827F826F827F826F82727FD07FF %5226F827F826F827F826F827F826F827F82627FD06FF27F827F826F8277D %FD15FFA8F82720277DFFFFFFA8272027F8272027F8272027F8272027A8FD %10FFA85227F8272027F8272027F8272027F8272027F8272027F82752FD07 %FF2727F8272027F8272027F8272027F82720277DFD05FF7D27F8272027F8 %7DFD15FFA826F827F8A8FD04FFF827F826F827F826F827F826F827F87DFD %12FFA852F827F826F827F826F827F826F827F826F827F826F82752FD06FF %A8F826F827F826F827F826F827F826F827F852FD06FF2726F827F82652FD %15FFA8202720277DFFFFFFA827202720272027202720272027202720A8FD %13FFA8272720272027202720272027202720272027202720277DFD06FF7D %2027202720272027202720272027202720A8FD05FFA820272027207DFD15 %FFA826F827F8A8FD04FFF827F826F827F826F827F826F827F826F8275252 %527D7DA8A8FD0DFF5226F827F826F827F826F827F826F827F826F827F826 %A8FD05FFA827F827F826F827F826F827F826F827F82627FD05FFA827F827 %F82652FD15FFA82027F8277DFD04FF52F8272027F8272027F8272027F827 %2027F8272027F827202752A8FD0CFFA827F8272027F8272027F8272027F8 %272027F8272052FD06FF7D27F8272027F8272027F8272027F8272027A8FD %05FF7D27F827207DFD15FF7D27F826F8A8FD04FF7D26F827F826F827F826 %F827F826F827F826F827F826F827F826F82752A8FD0AFFA827F827F826F8 %27F826F827F826F827F826F827F87DFD06FF2726F827F826F827F826F827 %F826F827F852FD05FFA8F826F82752FD16FF202720277DFD05FF20272027 %2027202720272027202720272027202720272027202720272052A8FD0AFF %5220272027202720272027202720272027202720FD06FFA8202720272027 %2027202720272027202720FD06FF522027207DFD15FFA827F826F8A8FD05 %FF52F827F826F827F826F827F826F827F826F827F826F827F826F827F826 %F82727A8FD09FF52F826F827F826F827F826F827F826F827F82627FD06FF %52F827F826F827F826F827F826F827F82659FD05FF7D26F8277DFD16FF20 %2720277DFD05FFA827F8272027F8272027F8272027F8272027F8272027F8 %272027F8272027F827207DFD09FF7D2027F8272027F8272027F8272027F8 %2720277DFD05FFA827F8272027F8272027F8272027F827204BFD06FF277D %A8FD17FF27F827F852FD06FF2726F827F826F827F826F827F826F827F826 %F827F826F827F826F827F826F827F827A8FD08FF52F826F827F826F827F8 %26F827F826F827F827A8FD05FF5226F827F826F827F826F827F826F827F8 %A8FD1FFF2727202752FD07FF202720272027202720272027202720272027 %20272027202720272027202720272027A8FD08FF52202720272027202720 %2720272027202720A8FD05FFA82027202720272027202720272027202752 %FD1FFF52F827F827FD07FF84F827F826F827F826F827F826F827F826F827 %F826F827F826F827F826F827F827F8277DFD07FFA827F827F826F827F826 %F827F826F827F82627FD06FF52F827F826F827F826F827F826F827F827A8 %FD1EFF7D27F82727FD08FF7DF8272027F8272027F8272027F8272027F827 %2027F8272027F8272027F8272027F8277DFD07FFA827F8272027F8272027 %F8272027F82720277DFD05FFA827F8272027F8272027F8272027F82720A8 %FD1EFFA8F826F827A8FD08FF7DF827F826F827F826F827F826F827F826F8 %27F826F827F826F827F826F827F826F8277DFD07FF5226F827F826F827F8 %26F827F826F827F827A8FD05FF2726F827F826F827F826F827F826F82752 %FD1EFFA827202720A8FD09FFA82027202720272027202720272027202720 %2720272027202720272027202720272027A8FD07FF272720272027202720 %2720272027202720A8FD05FF7D20272027202720272027202720272052FD %1FFFF826F82752FD0AFFA82726F827F826F827F826F827F826F827F826F8 %27F826F827F826F827F826F827F826A8FD06FFA8F827F826F827F826F827 %F826F827F82652FD05FFA826F827F826F827F826F827F826F827F8A8FD1E %FF522027F852FD0CFF7D4BF8272027F8272027F8272027F8272027F82720 %27F8272027F8272027F8272052FD07FF52F8272027F8272027F8272027F8 %272027A8FD05FF2727F8272027F8272027F8272027F8277DFD1EFF5227F8 %26F8A8FD0DFFA85227F826F827F826F827F826F827F826F827F826F827F8 %26F827F826F827F87DFD06FFA826F827F826F827F826F827F826F827F87D %FD05FF7DF826F827F826F827F826F827F826F852FD1EFFA8202720277DFD %11FF7DA87D7D525220272027202720272027202720272027202720272027 %20FD07FF5227202720272027202720272027202727FD05FFA82720272027 %2027202720272027202727FD1EFFA827F826F852FD17FFA87D27F827F826 %F827F826F827F826F827F826F827F82627FD06FFA8F827F826F827F826F8 %27F826F827F826A8FD05FF2726F827F826F827F826F827F826F827A8FD1E %FF2727202720FD1AFFA827272027F8272027F8272027F8272027F8272027 %7DFD06FF52F8272027F8272027F8272027F82720A8FD05FF7D2027F82720 %27F8272027F8272027F8A8FD1EFF7DF827F8267DFD1BFF5227F826F827F8 %26F827F826F827F826F827F84BFD06FF7D26F827F826F827F826F827F826 %F82752FD05FF7D27F826F827F826F827F826F827F8267DFD1EFFA8272027 %2052FD1CFF7D272027202720272027202720272027202720A8FD06FF2027 %202720272027202720272027204BFD05FFA9202720272027202720272027 %2027207DFD1FFF2727F826F8A9FD1CFFA826F827F826F827F826F827F826 %F827F82652FD06FF52F827F826F827F826F827F826F827F8A8FD04FFA827 %F826F827F826F827F826F827F82627FD1FFFA8F827202752FD1DFF7D27F8 %272027F8272027F8272027F8272027A8FD05FF7D27F8272027F8272027F8 %272027F8277DFD05FF27272027F8272027F8272027F8272027FD1FFFA827 %F827F827A8FD1DFF5226F827F826F827F826F827F826F827F87DFD06FFF8 %26F827F826F827F826F827F826F87DFD05FF52F827F826F827F826F827F8 %26F827F8A8FD1FFF5227202720A8FD0EFF7DA87DA8A8FD0BFF2727202720 %272027202720272027202752FD06FF272027202720272027202720272027 %52FD05FF7D27202720272027202720272027204BFD20FFA8F827F82627FD %0BFFA852F826F827F82627A8FD09FFA8F827F826F827F826F827F826F827 %F827A8FD05FF5226F827F826F827F826F827F826F852FD05FFA8F827F826 %F827F826F827F826F8277DFD21FF52F82720277DFD09FF7D27F8272027F8 %272027F87DFD09FF4BF8272027F8272027F8272027F82720FD06FF7D2027 %F8272027F8272027F827202727FD05FFA827F8272027F8272027F8272027 %4BFD22FFA826F827F827A8FD07FF7D27F826F827F826F827F826F87DFD08 %FF7D26F827F826F827F826F827F826F8277DFD05FF7D27F826F827F826F8 %27F826F827F826A8FD04FFA8F826F827F826F827F826F827F8A8FD23FF52 %272027207DFD06FFA82720272027202720272027202720A8FD08FF202720 %2720272027202720272027207DFD06FF2027202720272027202720272027 %20A8FD05FF2720272027202720272027207DFD24FFA8F827F826F8A8FD05 %FF52F827F826F827F826F827F826F82752FD08FF27F827F826F827F826F8 %27F826F82752FD05FFA827F826F827F826F827F826F827F8267DFD05FF27 %26F827F826F827F827F852FD26FF7DF827202727FD05FF2027F8272027F8 %272027F8272027F827A8FD07FF5227F8272027F8272027F8272027F876FD %06FF20272027F8272027F8272027F82720A8FD05FF522027F8272027F827 %2027A8FD26FFA827F827F8267DFFFFFF7D27F826F827F826F827F826F827 %F826F8A8FD07FF7DF826F827F826F827F826F827F82627FD05FFA827F827 %F826F827F826F827F826F8277DFD05FF2727F826F827F826F8277DFD28FF %7D2720272027A8FFFFA8202720272027202720272027202720277DFD07FF %7D272027202720272027202720272052FD06FF2727202720272027202720 %27202720A8FD05FF5220272027202720277DFD2AFF5227F827F827FFFF7D %27F826F827F826F827F826F827F826F87DFD07FF7DF826F827F826F827F8 %26F827F82652FD06FF27F827F826F827F826F827F826F8277DFD05FF2727 %2627F827F82652FD2CFF20272027F87DFFA8F8272027F8272027F8272027 %F82720277DFD07FF52272027F8272027F8272027F8272052FD06FF2727F8 %272027F8272027F8272027F8A8FD0AFFA8FFA8FD2DFFA8F827F826F87DA8 %26F827F826F827F826F827F826F827F8A8FD07FF52F827F826F827F826F8 %27F826F82752FD05FFA827F826F827F826F827F826F827F8267DFD3BFF7D %2027202720A852272027202720272027202720272052FD08FF2727202720 %272027202720272027207DFD06FF262720272027202720272027202720A8 %FD3CFF52F827F827207DF827F826F827F826F827F827F827A8FD07FFA826 %F827F826F827F826F827F826F8277DFD05FFA827F826F827F826F827F826 %F827F8267DFD3CFFA8272027F8272752F8272027F8272027F82720277DFD %08FF7D2027F8272027F8272027F8272027F8A8FD05FFA8F8272027F82720 %27F8272027F82720A8FD3DFFA827F826F8272052F827F826F827F826F827 %7DFD09FF2727F826F827F826F827F826F827F826A8FD05FF7D26F827F826 %F827F826F827F826F827A8FD0DFFA87DA8FD2EFFA82720272027277D5227 %202720272052A8FD09FF7D27202720272027202720272027202727FD06FF %7D202720272027202720272027202727FD0EFF522027A8FD2EFF7D26F827 %F82620A8A8A87D7D7DA8FD0BFF27F827F826F827F826F827F826F827F852 %FD06FF2726F827F826F827F826F827F826F852FD0CFFA852F827F827A8FD %2EFF8427F8272027F8A8FD0FFF7D2027F8272027F8272027F8272027F827 %7DFD05FFA8272027F8272027F8272027F82720277DFD0BFFA8272027F827 %2052FD2FFF7D26F827F826F852A8FD0CFF7DF827F826F827F826F827F826 %F827F826F8FD06FF7DF827F826F827F826F827F826F827F8A8FD0AFF7D26 %F827F826F852FD31FFA82720272027204BA8FD0BFFA82720272027202720 %27202720272027207DFD06FF52272027202720272027202720272027A8FD %09FF762720272027207DFD33FFA827F826F827F8267DFD0BFFA84BF826F8 %27F826F827F826F827F826A8FD05FFA826F827F826F827F826F827F826F8 %2752FD08FFA82727F827F827F87DFD35FFA8522027F827202727FD0CFF52 %2027F8272027F8272027F82727FD06FFA82727F8272027F8272027F82727 %7DA8FD08FF7D2027F8272027F8A8FD38FF7DF826F827F826F87DA8FD0AFF %7DF826F827F826F827F826F8A8FD08FF8452F827F826F827F8527DFD09FF %7D27F827F826F82727A8FD3AFFA820272027202720277DFD0BFF7D7D2727 %202720272052FD0CFF7D52277DA8FD0AFFA8522720272027202752FD3EFF %5227F826F827F826277DA8FD0BFFA87D527D2727A8FD19FFA852F827F826 %F827F8277DFD40FF7D272027F8272027F8277DFD28FFA827272027F82720 %27F87DFD43FFA87DF826F827F826F827F8527DFD22FFA85227F826F827F8 %26F82727A8FD47FF5227202720272027202727527DFD1BFFA8A8524B2027 %20272027202720527DFD4AFFA852F826F827F826F827F826F84B527D7DFD %12FFA87D7D2727F827F826F827F826F827277DFD4FFF7D27F8272027F827 %2027F8272027205252767DA87DA87DA87DA87D84525227272027F8272027 %F8272027F82720527DFD52FFA87D2727F826F827F826F827F826F827F826 %F827F826F827F826F827F826F827F826F827F826F827F82752A8FD57FFA8 %845227202720272027202720272027202720272027202720272027202720 %27202720527DA8FD5DFFA8A85252F827F826F827F826F827F826F827F826 %F827F826F827F82627527DA8FD65FFA8A87D52FD0427F8272027F8272027 %275252527DA8A8FD6EFFA8FFA8A87DA87DA87EA8A8FFA8FDFCFFFDFCFFFD %FCFFFDFCFFFD46FFFF %%EndData endstream endobj 19 0 obj <>stream -HWn X)l`=y+Y'n|,H=C\SC3C`E/ -h{ѻ@{U4-2My4>H$aIC~G|`#b&O8D -}Eegw g?8l ƤgŠ= -o;i^Ω| PXq[Ĕz'|O? >#Ag:jpʯXK`$Cv<<+~8V!VqcwB}qUqM0e"gNy4 GvPrϨL~w)$9K@t'=C$Jʯ%郃m\C"+l; XmF -3P5\ndil@ Pz]Un(_B2q1*z"!(%JfgG>ad39\"F5'h_:1>vCˇׅw s֡m9 8ށo}TJ•l(/O_/Hvq20av`_R#U@$Яs6*.!onzz,8c{ :mî ߰R/kP'gg4Z:fm^s1sE'[(mQ.Gt@׌'0ðZ;puO{NKŞgN~;G e6YV#~,NڨWW;[CwiZHV9zZap{fhEZ]޵B5!q$2舶q+Dhusg8ȓ8˜f$vcyg1MZX/ơafcios#Q ;2tbm_܄Bǒ=u:biF8ĆqaV}L9AFT Ӏ*TEͲ^<v[달͚7P64Lc"p4JXgU5A9Ы1>؂><t|*zf:jr3e**f|"${%'Nњ~]LߣIXzȒIBXʎ~.=ŤTΚ><_&VmC$ڡzвQ`cDw -fRϴvΩ,Z$ kYLm46L,с5;Nf--t'UK܈-u$>Bz]ಶ\'IzZʜt"T&$gi6Q/#iFe]{ANEd.EG&1h~lc@@HR@&g En"$CIIL3)Niz5ץ$%= Ri^cEW7g6CF#Ƴj)w{{[=J?Uua5 SQ@H+`vRj Sn#ijw{v[۸ninn23$I8?胫g%]`㼟[5ǍxG+ XY/"".:2e0wVЇ2iH$R˔-V{Pr4p0*ߙAkUA< X#?/D#yJCYsW  y-%!g,"XdsХ܊(Ȟ؛MH2Cܨ!\S&tpzuAq w SV= .Z>'!zӛVq k04 "[&Ꙃ,i&;PI F3T"bqx[p3Tg`Q4uI"~8I\d |!w+? 9&(}FЧN" - WA,9A8tBu`)e4w =s.饁nUAq+[Q9,tع >5!{'/CF DH5 J[z֯e5 9#r;(VOO"-,+SIdC4kq`)Ʊ9wR%h jbz8PR 5pF iKH_ؚu0x~qqg~Nդ[zؘ0hP0p Uj$Vl(ʢ[ј.5#VTSc4Z@.85h0/T_:_- I6BPa=oHod$8<&bF%@,uMuJ>9|U FY|f/Qdߨ ,DO&#(:c \|zS(ygQ Db XI10ʡuE쾰ңȣl B$ȮFFl.+FF#h*yGaYs1#e35=F:LkU쪡8X7 -[ڐ8DL0#J z-*Pm9GԂlr- E:l "#p4 ,>N 6$]@@US茌[ь&4M*d`!;gGzOƜ%FHUb"08צ[P1ÒA:!T!*W֖J[,L.zk |_t& =,vF=h?Cz&nA<}M/E.],r\% ^ӗ\S -T"b1)F>@J>{eVmY8uQY V1w% ظ( -&CCZ+ l.l8ȓmIwI@kFۅP+5Dz%pH 7@+txW$6 !~K9ne:)[*VU7Lِ4Sa)Z^iigp~`n^䳜;% Gn`2 P `P -MuCgo9ӧ,˦E|U")4JHC58h ;w}.fVxyѦ{2V$ȘVk<] H*A'arKwB ;'ŒFbH -^I5<X"΀W L,,"@]0('Ȓ *2w8`Yg3靳'cVy~)\,HZL ەl}Y$"w-߆ыc+4l@%JنwYq j\^[TO'ܨdg&7'4HJR~;UK ->8~(`M$65&u5V{iޫ|2™9LL~B~Ż~ 9p#:-cs[) Pӳsw2俙9h?"tCg97^@! n5 `A S[(Z,؜z9$dqy|[Ace!ھۣb='Ov@a@6{+;`r`"&XP I -q+BPuVO85*Q{B4ȋ>->ecĀFǁ3 -BG -k =h4h u hzh,TJ @',4tҩwL.TQƈߐjXpÀmz[I@ | 3o"zyu&YhvΩ /G/ƔC^º@ݥSC{c~o Byn$ZH,00-cm>aKA -@^5vhR~Q$+|kkِ/g>J#۹X -P$}1|&K4h%!ؕXu 9 oH~S}HqłɖۊM}D᪗Y=<eЙihg{4]҃ڏl AcǷREqVJ 6x2Lwi-~:hZ vZ [,{{ FoXA(wEjⷰnDk \͉ۗqTZvoj50 gXy*k >Dkd;KD nϊ-q_T&IΞPA&Z'(dZW>Z[p:Ke#?g;kqVJ.5V-QE.I8뛕;k dKQNj+駘>]o8eO^İ*2kMk6L{]ifN,78͸BN[H/gdi7]9 #M<{mGO|ŋ+- Y-XPQ@ɻ.^g7ߘj{ˠ0vjwXu'Oy&6.cpl ;MϝpZgzGb[)i&AR{gljˊCD"D/k>h,)?< - -ҏ.z^.2hj6q3׆;)&/'gׅIXAe)HR|4d!ZG -X74(݊LPBk"R ϩH9>t0VY?fEϟMeORQ۾A Puc+ʙ(v}^?,F*~üw zռ<~P\b9Ƚٟ }e -R9O=밠/iF@O7ג] y?<$W'5N]7\:%]Ykt%E]No mIn?Y|}aXk_"c؏σ1!cȘ~=^-4q&W)!ZCo)(orAsjB^~}Sߺ29CJ -Hd6"I2QdKPf7RVc- ء+#fO<#W\3L9ӖN[N.CFW<~l$Xу&4|.IKUk>(A )ܓ]lpZ–k(a#~hbՇ'pUS`l!?ʜPQB:M#GPX[o*x%!zd nzW^oq=~7xQmp0-qg Gg-+W%fDcQMQ}w --ѨWZ2ڨM$zĵ:kLJ_˘!K -ȸS69% =/>N>u|N;ASSģ4lҠ&˽%QLhTw%JؗlhlEXGaɸ/ц7tWuKƽw? r-~d$d~H~ѡNY$;-{otL3sDL1?a^iP &LЬPHڐ!Bax+ɛ$$Y6QQ,3gT=<O;%%;l0`g~d "E@ɢ^EUyqE2kOޔkmFQq~sUo˝`P8Kk*ZBE#QE _,-}([aX47,Gl" -dG*dpxd͚6Q4. 1'*Zh*hPfWJAm|M}P5Irlhp6W4P4X8kaMƢ9v ~iߐGծ|u;mgϙdžn*3̧ƃY |)Y0$e bY.$( =Πj`eEc'g 7Q9zaN%'4,Y4_|_Yo|ßbϚp{E,(xקxM1X5Y/bgsP0C8BBqOᄟ܂! -4,YӰ6C#(BP䊪Kq| ;d'܎`/ԓ$:BIE4!WJ &:|^IaV`/3 -A'){Vח+~]q}炕ߺgᛘ,c|Tr :}V(-GIv;Yţ/7fZ,Lo,v9iF,twʍkӦxfL_Ք^:+'';q@|jo> YU7nܬV2pZ,ipˁw_5 ֝xcz̿K./r/Y{i^kg$v5vs:/URVb:mBJgՋ4;^ -{h,~p.K$^{ΥKA,ˍK3}AL/RY{ŸN~oNzo+WoK|7@-ec& _/ֈj"?|biJxr=LI=w> @Ov[F,u߻:9:eoyC+?U?[0MyX ?_Ň4y-p}w$~"9GܤK< 9%Q5.bHRZ}J5lb};il<Җb˕ֵ2CLYxHi2w_Vd7HY-wAjUUI{ӜIGϘgD? e&hl㭪V?mkY:EV\?ɂO>I +bΣ ޣNI{~Dgn[A~MO~/ -.&3meڍ2F*Zm4:a ` 6~^ISr 2z5 `gفx0xjC--qb>X/ìNJg^*B&6uc!֒;C٩4y:\'A5OSC`'Qp7eKxdM1Av?0Q5.bqFG(0vrBvHgk7=ց#E:4j|'/C dEO8r:WBt=Rh84x'iܺx *mGsɠY*^",ti(/%˟pz'1%&Q.QpNcMd,o,wiyPft%B5Ka>E %j *84%Qhe؟J -<%UءD܀uQ@0"qݍ*FnӲJ tDbAM2;OV(rWF}z1Hί\%׹yԙZWh5/jFNF[(|۹}ڹ=1ஙx)TgPqO^xXT v#fMJšxJ'$,pV[nA(Se%vqS9H `Z] Ś2ߧ{;Ŷ$ {U{Kx8`\R[lS[Ҧ6:ێ\_TM5VN PsŘ2D^t= Y4k!,> )[pAEBLCh1. GiaX5~⩤D"zDʐb8fYI=+r9%|-lVC_:*39XCjQ^eJK1nlCÕ怌lhs:Sb' {E~}Bٗ;;5n -Cb"G)GX0NE_z㯇9`( O^\ -R,_I>=e-VTZpCF`}Oxo[k`dA˧ 32n` -u\ 8cMo{%=>p*သm4I[R5dÚ_35`@kHv$2D0pB -!N%c5=`-Zk/A"mØQ<<51o]ʂqdF%.o/0n:p ƃ߂k'|7xϫFǏuj_X'խꋿ;ؾ;J+s:;"ncSN'KpIn /x3RUwgF`"Pʃ׹xwEGyJ[, 'fӆ˩SҐJz IT8b;O}wlj;vKOpngSh -45g'&?/ʠ?.C%JGUIA)uȔ rz{s;oo |wє *B3:qbst -6#&۩e|1ՌvL + .9 BBAJ}]$ay1ng%^G jn+xXmוEF:J\U`\Xwy qo Ɯ".sAۏ_V8M0@SHLfȪ ҂_\za -,]U}ȧ94(AC m U_-Dn^-2aDÍh q!ِ2=AhB$`@=DNB`P<3=\u)ͰAW7HStȌqW%"bE=I~FD,hpT{5q)m,vdhɪ_7'g`slb'"Cf[M}ZF4ۄ),;*^zTLϏJS{?"|_\R#*p@ˈ g\PB OI$0,l s -bTҹ_cĭ=VagvET;sws \Vԕ -oF,XTx[yO1کժ _jIF'C -# deuz!yj(}Bќߖ[CnoKLC9y; =K/hbl:s Zňy|B_gm~y -sO60`F?w 7Oŵ "$5rytvj'ijDےϼ*OTs#[kЄR%d% -oe{V0_OB 9d`~yB)˥¡S0wJNFMURbS_D0?r"MxVd ɑ'DKXΊFJ»%91C.K6ߜZˇtf~4>Cd,"ˌ1By# +$%$"%5>stream -HW^L}<@H $Vh HE,?dyofa&Lk6A-uYXZvbֹ`a{|h)T.Fe9jUrѾ&eI6MZe59YzeP +rŊiPsƽ*]fWqS֡,O&jNgQJku޵ןVdl E$f|e)>9Н{T= -XyN\|k< n'] d ov"m}|UƱ"dIJ1>%*%"Eg7\;Pg^^ZyOI2/e\WAott̎&ӆ%5$m5a5!JV^\Z{3\ckE%ơȉ٣|2]xIGO&ʒ ԂH* -J+aB'J:'R ȥɏҜfw!;rɳB^l8T}\l&<+dKwQ٩e-nbQ Bn'&{ࣀI%dLx0Syyhdپy"0Ur{ ۚ$3eKs>r^2z!X?a론8¶~Ycu<ϬZhU]]Gڑ$wcN9;9+{۟SSVG:YFpNzG!F[Sr0KSL㤿Y. ~6et,Q4kFQ*j>GǽR'σ IvЖ R's3͖ ɐ_xI:(aAGHy cp޹_ 艟]k2qH2J+Z=UZ4kN^xv'iǤ V$\/ZǹIt$Z ƙ?4" G< |y›c<%kh!.:"T\b4-?S!Kܽ -.)ןL^+ora,bw.Y-ڹrI%QxBҊNAzxR6 '?6v{z؂~sCd*8^hjph3f}>U҉] Tzy:Y$ֆ\ANRU1{abVC,aB]IR+kmZv;U-g1,#.cii+tdRr x OhmRt W(lqrc Pآm(}1KӁ5N(MD̑@)͋J*N'`q K-7dەVW1FVvY~A}'RcmVE1x<[ح1 -JWNxRс,GqI>łyA`  -(]%+O=MvNm͂rR$rYm.zeiNߦi!*eK+^KPífZXϔ4ox@+;o(+ #X#(O)`~}Q^> TkE._p}e3BPwGqBG1W\;{j sx+|6t(4jB -mH"jB4-`&DVm>ֆעqW\D8CX#7L5pLnr=ʢ&L4^R.6o^?Li|h 2*Xbslo9DcXm$"s$C9WRސQ ɜE͞fwå"X>ޠi qJ=^Vesq{=Y5urX}7/maa!WFiÒjrې#v72e@@9aΊgF!T^^ZEms>X X*j̀cu3Jˬ|(g>oY!Y^Y!1hiXf .dgO >GP9WH2o.TWQoHL@䪃XϘ5dBIWzJ}bQc&K{TM100{v[k> ёPĮnȁ5{zhD#?5 Xb,H/p+z|ƶx-l@i*Fp=]Ɉ|tjg)LSwA`p4|g$Z:_@*Ex:ecT- R:p ;`@_>4ˢ];Ja;n QqZH[t"!&8gF=0:*RmK֢1-s:#[+(kUy;87Z?Q V9C}uyqai'a\Qo/U $҃ĩq;j>9}_ã}hԩplAWÓb}-&Ppm_Ĝ_>E]qu贾3?OqܢP,|, pI`Omg.CzZ7ۍ4YGjBLlBN{ѻ [i턨6GN'ł2Vɞ 6q5Ft("_f!7 -g!/BHz[܋Vߣ4sܨv |ycNӔĆtwBxkd7ڂ 1ŏN7UmsGRGՙ^zѷQ>K.=ϺX.;X[% l춾{rNօypr^Uk8?SX0ۥ?j{4V'c271 R~ kg(lUsqɰRI;:BtC._%0+#$D 8Ԥ3w(? !JL_hxWNM~}۫MmSmСBN{\7=p?UȾ Y?ǾN^B`x99Mˇ,b{j=Н- JbǶXU6{͝,u׷i낼$RqOK;l"ЕN)ޘ Zk8'p j5\ DрڃKˉ{eiDOSU͗쉺TU)5&k!n:Q22}WmE E[ $u G1% K-Dg)a;yO:uw9aT:%6Q at!cPP{ʞK !nv6փxo4hfBCi7+AGy&N+!rgOu2 Bg+SVPy:rτtևN{RZm %ilTv'0>$.X߈e64eH ʅ䖃]9d s{?-g^epEqN&7=vr;ؘE"Z6]r6_󄏥kz@u'2!u/%4t3};0CRD-QjJWC Rh@hҵpy'$3*s&z"pߙhMu`Y9E{svq, 9Hʳ꾆gOhPYSm; -Ǐ+7Z3d8>ꮍv7TEPr<ө -`=@モY"T9`6Pc7-#LBLmggKA:!=_c駾[phyhɖ"TR4 ŚWo*ʛ_DV뷽*ًA hv@]I3Q?F\;#I \6KDa:˱Cw9H?Q7mO^mWD0Z$<,tuiݒE}mкv Lt(ٯ*iNC* ??.nno#̿1Ώ -9=ZxA{2kI> `$Kn5 YnY'*H!_qRh6$bvk̢+;<9A K@K +-,zw eUxBѻr[=\xPf]B{jJaQ`) |]Ci5F&^Ki&OgPUwEDUӀ8za^bӘEDՊpH3J{rqdXH!0^2Iк(kJLبOľ G%e lBݪa" FX8ހ_nۙPOhcxoؗ5y3Pɿn|u|-?T,FxJ=~>@ǬrPJj<)-Uzx8&GGJ)f<\I! r_JX[O;$HQHgN! ?YI&=of*ȧrvհz Jهta՝ˡ'O%=`S3|֊_l0L\''vԹC{Mɻ5 W|l)PFqS8/E~);מ(L|@q1\Tj1>vvbHɎuct+8}9gT>s!q:QQGP vy)x8o'yx〱9v -%E徍9RI kJb'b2ս)jj \dU;hoU{:P;Ѥ-q;&#OӰuQh=䶩1tYoVݕ2ZWK ;;a9+݅-oco^{<˥hoo:'O,f%\iG `)pW)`hyGgßP斊*,̱ygܕ^r2u-wSLɻ"-\-[e%r3"'Bsx-c jf34b|hfޗ-u_䳟~@ 0f䳌rA"ȰV'Y[+񾈌&ގYJ46Xpi3/<[@G+Q(ȚƷ\ˈ!f@3l4-LQϮL?c4dz5 B3If~3dhA { @5?BFf}g8H=kB2 !-?o lA"|e;MyG cNnjcXZU ->ZmT!6dH*LUVIx FUnFΕv/oqx`AZm+>(0 kQ{GȿAɆWYkّYaHj8:.7u *{^GDcFrjR ^c/@ LAƞ"X]K"`5AvE&~DŎ놪t0'PtY3 @;^0܈LRgR7W}S< *TMUKe:-#VSDa̰S2"޺0v̵+e@Qmxw --> R*,BV* (Ŝ Sg= -_+FSjL/z3uhd5Cݼ\V/$n) aM6'd"gN˸_HE@WѺO"pyrkX[MYۑއ%3ۻKN(h5կrzȿzSݗ *˄=7K1\Au_ʘMp}o(k~li;n}3L-q=%Cg7U>x2\Y"^I$e䫐AkZ+/H-/u2JjdV{ͼxb/-YLG?QJr& -ѫ[ \I U^!NSytg6< MA$Etܩ Apwhq= -czakbHZFKet,oA: CH[%3T9z_F㡿f +3{ 1O<[^g`(,t? %D(/Yi>:aڨ7f~/u]|G_'!UQ..B9u̢B@s%#t,u'[K/A/b#nIe&VIuJo9I0]^@UY%KJٗ2+kYW-xb<_F'5QY؀ =IY_ZKF/1l *MN\I'f f1&l`m fs9\`n1bn BQYY_f~ 4 &2/(P:˸aW A_RY -$whax2GSN -3?C3&fBSXjoiMZzx>|ɕ.A^ Az0X>I PZ)2?fq])pWȘb=^+k -.g-MA]Ll-wiC8Y8`I|>F"%vXޛFWbqfxz(uKi -^ÚGEÛppg胍(;G#/W"QJ9jf5c'iLo.F{%S7kx+ɪ#0QotQ3gא[}*)Aŕdֱ{Z+PQ:[bݧ2g=ZIN#y`^N> ytk.ƪ|~GlvGxtPpO!@Y"`Rm *&'S2X]Q3|n;ߩ C-3]D&+g煇nMdrvDgmylխoU3:^\Ѷ0rd3?*;aR -x0ϒr1Y= -Tpk])3a{AFwL[j])hɛ,b.IHf}ZA,=:v̴ 5O_셴H8ZKƽ6>_+It)7)pL8׎+ b 7:T}ɴ#FA>OWxJݡ­*PBTWYwkJ#FLvF솽SVA$gyL7HpImH)|s5;᩾}eNאּA8Sɍu}BQF&iCcj2$Il0ۇlCA4^_:AC=iqN_neL+wh=Ga`~iAsB)!u#EA@k68D>Nɦk=@] 2:n?TCg,*eBG.ƎB&)DUyQ_d9Vs3©@pG6P>} N_ҙ5 - .hՑ}T1ȉ`'6TgW{W Q8o -ZRmp "›R"An{JTp wѭ;-e)b{OYdeVcί IJ QBRjoo^O3ƎQ:ӪlW7OlةE[iɀLgZ 'Aud9bGH?"i⚞~u"COR$S4X%qObvV-<^B{}JW=ka(ùQq> L)45s;ˈ<¢0FȌjӘٖ'jg/ASX5 -)ʁ͖Xk>a ku ud BDbL,Q4S|Cd\ȖU N-A)_C%LkS&2>B#"s1!@b2&ăSf1VM@W_'u0-#KoBv9tq7E)g͕ݪ1#QSO{0NSuUNgkCMjs11ha{օP -D{h&x?/f7̓nG*Zo-ސٗvwX)zN2 !'-A7x? &L:4^Ke&/dd5W3]@G#.HO@R{eDC e]S2Ehl>`7Ƹ/,/]JZnwx) } J j,lGZV5.iOLoCzoG<$ 5E}\Ը+;p5'U&K˒YrI;='Oo$ J -sy -g4W$/🶈<@#P 60" - -7%bĆ&9BAz!Uoj2*'ur{%H2!cFkD -;d/W])sRU@CMa IֳzuzX׺a`v6Al/K:1~"OHrD%Չ+}"'5bN/>MxI -:jeUOpޡ6.yWZ B5:3?*+322u~CPp;]ǟ_?G;/Σޮ?]{?~xivGm15f{2ͣóƯW*W{}|Iȏ$ۏgnwkY[2`ެoֽ2 i*=={Z~Yx[`{aP;[![zŲ=|Mo@zkz6Z :@okxi¸wѬj1oDI[3Zu*n}U kbXv̘Z]Vw>+CrFta=f!x\vE:9TC@%>FH-g{хsH]Tt3ACuNC - -$)DLgњa@#ސ`QH B 3u$9է0$Ci;VD6 -<$uCQr09G, 9v=`XwTgY&{v L ;1y&m #iE|4 2 &|$e/&IF4}-uy`rOcuXIc`qE 9g`fVu0 ̄|K`3 ybC4XH:8xAɴ_߅yR<ЗQ2EaBm`4=MB45sX(2z0HcBc1LT)K -:,#:@"Qa0Q(? HJ)aT]&1 ABR=6d7A6rn qҸT&b>0v*σAa;Rv4)/(|0fF3.;ͻ*B"_DݧN(f' *e\A)sqj()廾GoLC-t, &e6FZLjF1) ,%S{1QJrL-^1  jqS3 -huAFkŢ%j:G)` 4bCä2d09EmR#+\qp^yC<ڜ0p쥋Chbh9yjapg.OAh !bAI(^!&e:rEi*+<$~JǑ4 T^|!#hmLMCx|M:TAVSR Rln[Ţd~3 0HzYo e ,+kȏ0`UXGÍI&|Pu:F -EH{Jͧ{&(9t؍M(^"͐XgH3b!A5 KY8UQמR=Ӝ|YFkrV4Jy*xI+dAe93A# -l5"֙=uV7bTMj@hV`fvSZo䕕{?}G $ك~0w,SrXAaAL 0oi:+6Bx10U`.>aYp*r!xTWt*#r#AY˃A(g28ힰ'0Zn|#~>{-yav0C;7U#`0᥉Tyca!FIWd KQKMօ_8od0>|4(TALNSE?0[w[bDi -;#1l'ƍ;1qeWuA-1FcN1 }\KZPeZ;h-Y\Vjx7Cb458`UH:ϥ~u<]Ƀۼ@ G]΅MLsQA!M ߉beVrհCy -]>=6ԾPt -kR!<" x3\!dhq$൴հ k8;jڪj&%84uwq -f4]5 a.X^?hJ5GÆ2)Ewԩ0;9KS|j?70 }<Eϑt[&vpc} N֥]LwLչQs CF]@C!soio[H~`na}~_`!8e8Gu2SҷMοqC!`# -I .b7N` Ӣzmaȱܶb054^H-h -QB˭k$ -f,XclSUW$?4)8֎Ruw,]TϤJk|r.{_uXbX:-1ֆtù;{X;èH{^(wS"SjȈ3!8Mi7)7ͬI8JF?M:38eW.M>]'zd80]v W``:O[M16wi -@L_ -Yуc(E9iL,*,ʖb)hSt$yuyWU~!J3,FŮZ^!Oy8blbEFxųt&[f*55+[ "ƿE9}/DQ]}b&@QIͻ n?S`ac*؞pVa, -Iև`>'`%{m134?dF cN ^3-[}.&Meyb? c[ˑ[~W- ,W ނ -!-]h11}Gq#j6Cvszj6ca~z^ƋZ& bPȄ 2¿G3Pf}P=ƿaL̀e99"&\C,#r\p|:{4qLޚ:a -d0* V(X2BnFu -!J؉lPwʦ쑚/oa"Q? -_i ^1:fCpF_$gW0s,1ƗqZL-J<4M<RMC qgi<0(#Ϩpzf)) a; -ybbL&USc_K-3KMo$j_r11G.:^r#tW%1'72a= -{~m`W$1EK̕<=ʿ!/DcG>0틢ßP5dGD yԪ 6R [Wi=3P /b̀'hf(>T縫j@\=_  -(&@fbToXT0EC=9]YXR9OB^GT-DQdZ8 ND0Vy%r@Q_85-\'`Z ( ';ƕ)/% &L'C!۪U0Es; -8l'N(o濳igӺ5d?!EĦꋙe!(a%'0 aobU׭[\U A: KP3[*f*̜jh D|@2 MŽP5Ab\hgcIJ>+¡&] >u c`h@ab%ȄbR+|*=` `zNb`փa?N GIǠ-bܾٚzQYx3\b !2א{bx:]!!HN ;`u㈁옃ֵRKN9*! JvͿc -ܽ Q땆x" )a@<2j2^ul)e!b*-~lckb=}>›xzQzi/NbA"Ђ -MC[J5ũu.3bs}lPxK-01(y X ͆'ِ7:F!bnf,O(u_ 7 zJ(] &KmAdO!pM+-ϴ3vK=WxL95!WΘ&@Y_+TU~\d#Oxq2Bg|t -zE2|d`Hd_Bf CR ^dzĬ5 sq-O0Ou6!5 Ђj ÝAy1=>—qDoal_\t{YDIU}ߊɺ8 @dg3ro0hB0G*)f!pxHU^ $ATȬ,c]bPL rl1s>UW>гqaVI 3x'AHU3) O J|Ijݵ[aeFk)4+#} -YKWr --T6BWuߧ} Q[`d( _ /myЄ&}L .c1,@wFD t C@xI}4b'%/`5}}9)1ɏʍ񦕄%Y1 'yesŷH11䉷q6IctznS"py_瘵Þ0}zɬ,95JkwVQ.Fݘ'Z30M[Er Ѫa0 eWs',zs[a,+׎g`4^^f)S">WԳkbPBcy;P}&*=ɛU? -e0L5IU"KDFU'/afIp9Ycbn<XJA 6b3 *FcxfFCOZ*v -^LxT^׍*։è*:0t*PfxPP -9{~3Pc,l},pXӺ1o^x5x,4#)Faұ{ƜnDQ=H oEFOJjHi ?X:M-Oa?EHk6FlNLX1 >´DؓXQdXV U3>Ql91WZ;:݁8et8EXX04дn Gʫ80)]1v Ưt~ʥkbm|o-5B={//@l8e"eJ<7 -Q|T(ו9+k7 " ݩ #ְSVriqЗ=0?~w~?ߎ_Guri{*+e[D)c0bq^B`9@W"K#qbh(Kpao l.;ロ-1s%ID(,*@#g%a-D -7gYʨX02d^YYsè5y<~+J+ Q;X73 '"{9S uwG,2g ,m>ܘƫ& .WaÙ -_!l<(ئK:pYd1Lm;96~_u0q|HJ20P:qɅb]$Υ4%#VϚɮNz: ZrmR1Eq :oވx׏I<:ogJcۂ$pN'*h/Xm8c%Fҭi~t cArD\[f a,!68[cOʾ.ɦ\gQWFM9ya"@M'diw~5k0x(ߔJ:S,yUJa0ù)f616nM["3;,mC543v9݊%o1)0IVN2!sÒޙdRrI;'=*leDG2D`3q׾2 +E7)^qQVl$V׏8xsu8:jϓ~{O8Ò[ Ay"}VQ|jO*5@usdqcʎ9*s| eqɥ FzrǮ3BcOF&11 8~%3 - -0H]O7*0 -?.%'[J`IQ>'fnRnlB&0y:+gKтSG9)*sǹH<!ϲ07fLR\>zCQ[ֿ.H(Ie2&ŵ0"ODI.w&=0Z"uaZ4Bd -[0TEW6PS kT]x`;}aF! 9UslN55(@V;'uNVaSNӏ^z1ag1LM%w.{$$C7>QXatԹxCFGنv%8x Ty{@d -+ {uԻ9#1X2q7s0/5D+E Ϣ]V=%LOw@dCʰJˀj:b$ v՘bNBMMKxv}vj8dȋ(b@s)}s4VT瀏ygMlrt[~:[?ztU*\H)V~rj53:56հVS3il7_1{EdoyLjrR\zLHM˶X$~o;zTYXW Z>X52v: (.{Y& $W5L|%0 mn(J$|RnmBNO[i@4J5"\53~`̆?DqRoF9σ_kM-߭2Cy=L1PIisX_(&YHړJO(`5{/;"LP_{3-]LK~`z"!\^i(9w.ru9]pB| }%EF7&5~\ pqIhG]Xb&2vj<@;/ZN>HΛ%⊃sB2?5ϡ|NZuc2e1s/Yr}WOVj{zfb7 JFc"RN% qSUj@CzA*_e9 endstream endobj 21 0 obj <>stream -HDݑe)-Xʂ~|ZKLLtW!R߶5}E<ǜsjbGHwf0?ձE06l07l\6;WZ.}7_W̱jq%LU͝O bHADVnkV]L$'$_$wrU^UmE|5|X Cfq?O߳g㕼W?kinjLcA0_LԊ 3+axhB^bfMF07EBnoyyj.q!ZkZׂMj> y!foqܼ)SU_47" %H0vbt+J*A'Rs*%Ȩ SQD 6ـoFﱮ.ŏ~mNs!Ra3?QZ_vFhb&TZn/ūIX~_XJNT[UavY %&5u! t/ߝCRHCu( I Bpu3AӔ@u] rMFC\߳JVH&n[ |S z)m3*$Դ(r1dg%G1bP!t oeՐ{s`) m70ǧ]Hë}T(&hf\}i8Dգ @ #nS`6mDc]KF).V04^/HI|RWJ 1=! nTDDe-^Bd<(97ƐފߣLMD -?Dk A#99xGQK `؅ ycYQw -IɽtfX0^& @絜؇]49n⼫[s7_ba`DI'd)s+.,0L ,a {8gdKOOZK0+8K` d@gS Y:0xU}!-31J0{R}9Ys4I$T%C!k $΄~!tPA-aA̦,fje'm0EsETY2[^Cn8*A,8E]~j -Cv]%>s0Wrgd+ESj2)WY]-+;吒cxt,gG+V jl0HYo>B./?ɘn||xBqr-!艺Ta0iI0-|trahC.Sұz;.tZW(.JsLa0  /im^ -DP'L of Gգ. U1=e!seh'VS]zΛE(UPaeG4ynK`ZE7I!7ADsƖ(*M[Ő>FD}>C}f #MZMQ @[Ԕt#DZ.PL|S{א8m pJEÊH8-Kbю:!{B6yzLV:8IU :"48 w\+ʥ`\},Qdz3ed "mM yi`%PD7l.|g -lr.ftK5/w&K;C>v\V@j6IX|o ;iF$ a>U`2B~YO{K.&j_DCclp0%ef|1kC8gH<Bq1ķ,aߠ#AӴVaaj]CA }L{"]/Tp/`x2 ZKYC4TeP1/t:Ydv;>kNZJe7p=#C\( Y8SVE~5ߢ|U!O`(V㞝%!1ؖS1=Ҍk CşOs|99 %RRJ)-`UæG|&鱁u9#dzb Px DOZO¢˕^v=|JWۘB33aFO8]zT!%vbaMwɊ&gz߰ LgFz^:wDiS&,-#,1~":0x4;t l9O#~yI;)Y򌒌دYҤd[2 c.4:NL56fF=7&fx-W07.̝SV0Nuw13`HCi>~M+Pq\ D]^'On6.WXoaƓUhju%/*`* m!o )IG`Fi^zZɐ~,\3 ϻ3E=sx,;\Œl}F| OA$͎1.u.#]6rOq-OؼҕY}a]{L\P -,lsH`FҊ(ތ c(7[ƾT -sJZˀqT®$/AE$rl0n1dy\u6q ';آTb)K%˖0*W<˦@0Bi -bl D4 '%`}la0+$ Ӣ"7oSP h @TwD彐 0'kwaQ`b0UpLt / s$(R[īOup{!DP/;; - - nSkaP ) q܅A:$ gWFqD|12X=vlxӝUd'T ~%Z.+B9#6d?,SjP` #b# 눳JĬ\j*f )x< Fw^L̍Fn~Hb9bM -+'ӓa:.MZ}ٌ;:jBtWG$!ô]j3θ= o)vy0-3xfg18nǼC^ԬBQJ0 @ydLX,!R#! eDˤ+W@;A fQK2-$6v'_]YE3AmJ11Y{Zzy]܎ʷ8ӟ2 -&)NS_Kk~0?|cO4:X2w$=1v#h[0Nz J5?tyŔ+j"Xgd4^=-$&ω25G0z_`Qg5{'9(II~LsG%&FN--wlL nȥZqs%7M4Q;QU<c0YKLWRq,0AFkYcE2l=(f\oړ( r?ʜ!9# ZXɯtFnwsyxzcu8b 13'bIaf0ka$4"q4zU%OXuzCPہ@\`٩ƥeG3K5*ƥ,k`L>}Ӑ&;6!ͧԭT-"g2wcHƘ%6֓& UZa=J{?JA[&ܾ~|L>ĎԽȰ9!#X][@$176o6$e,_1B+FU%uy(sAo JfbŒyZ;̦@<o[0ФC$o.6 IjM -*Rq*>W /<DBK sDlǽD f :d!R-&ȅq'J4(ՅQ$*EP&2DU Fdr[jdr, 1s?,HIŻ -UֵQ$~ϣ L -~[@24R%Bs8Uy,ٖxO&`NmKcmyWuaȊ:E1Q$iǷENr@0u4a3Zr1({fE y" -Y"hxZɁ=LMpM̘ 59>bAL:Q܎u.`FDDiD3r }CPS/Z[m`{&E- !)$ \s rhl; WYVF- y&F-0u4פ3Dezr/B9V\4@^Ȕ!1W3Տ]^R&KÜM A\6@(S,waLgks, N)O\&ZL o> "YxE4%Ls0‰qdB3Lh]åA+}(j +a|YmEka9kI$: r9$wF\+&Һ:rObӫ5ȴ)zc ~̨ѥ')XhX잡5J4 -|U_ -}xsAwLx]s6F?01jR=MQOa `O#~8.tv2mqS x7TCd -zýƯP#W:bAeGf*~/>陮:q,Kp

%{!pî_U{2\>͓Qź]PJP)u\7A -y-cw;wByX>DK( : CfhT?2ű[EYg+Vg~:&9J0HьmJVsF gWЈkB% F b9n۶YR|ĆRHc[ `zmD;}Jh*4xJ@se9y+LSFG'AIT}-LcZmUmw5"8!VyOǽI@0;}̸oGv|ԓu,syPumhC:v&޾ 3*&56D1? nn{=1OR-T;'<ǽnB3I<؊ROXg;T$m7|:-nk`,QΜC)Tk]+W g&슛h>=L?80U{aUa>o0D9>}/kdzev0eC APPŢP>~.++0Te'>=mHUBٲ -b({a蘊*c,b8:"=KôHĸX40>B!& -kQ7$޽0FZ0(!֫m̠TNhJv0JYHzbt`ZhƁ`fAB_}hC/9XȘ {GAB$|P:1ݷ 'ӚcE 6i6@ DN@-sI$)i2{ 9% FREy_\ `b[f@m/l$U|Pv]vƭbĘ[q'x6v-1> 7T# õ2ee,hZգkrQ+*iz0 V^'A01 Fļt8MyT!uk-l5B7{/Kž( ]ѷ~F\c(|[G6\wJHH -Nggش'[LzZǥ`f&)pu8=0#p~=R`zjfrj"0J1>[pYO~<G xI7ALv=,݂qdgcI%L&t2]VP ѷo%q4YkHf#–q'~WќsaZ=}cՖO-YRGtt3щ #ow![ M_|ЉUtUIs{Cx9+[펛Jzq!+3y{c)pRX8Fj}G_R(mDt{W0.q[Rm0{I'{|-vb𐨩Mt` &xXJi5c0O3XKr6}9Io>'P={yq >"F/ y!I3+B!17&E$+sλ1j?b{D̼k ފ(0)Ĭi0ULǻ@gRMWѢ<тpyc^V=;(?Aⴭ}֑ B&@Aߪ]uơiHS껬K -K(\{mgu\wn,TT7Ɣƛ=QZ0:;w$G CKxQۊ#0T.~ö~vґw Yh1z!RF>X 31>mc249$gaj &:*sG>:#ʒy*7Bs:\mXc>6L杂pR;151gѕh-Xkg62J BU9|ӧ-dqOҐs,DuL'&Қ4]|w,Vԝ1{g”DM>^ rR<=GXp- [ӓqޥOlD쯷٩qT4yæ0$x焗G4hzw0-.Kt1_I3`i & ?ckaFb}0LL Y ucDu91q' *#9 :F*3=?L&'\Fx+X$}pU׺J" zTL)+ҔT: -P-Iט^Q7. $w.0;B~C9EQ4ze+rH|1@+׼龈@9s4oă gq|6>wq-LE0rXӢG>[b "_nj0Lq^+bt * v -kcI؀q]hm, Hz12bƙCh^Ս7O83 > >,3oz*t3*Eʞ!!jkaN SΤ(6-d~Ӓ( )JQ`(p;:ERKGİ^k+qsoP7&Q2Ns0{-*tZ`T3뜻'Y*~׸=5ĎPS3Wl3_;F< !jn\Nv<)C Y3rm|O2G$ʚs A5&<k!\϶sE!,O|49cA w2f*J="wU* zJ@ɔň3L3&`2ukP1)jK=Kq0D qY'5vr`h4ƶDMt Ƌ8 'h0yF>p[u~pEH`MHYs/e4L-K} mBʌ7F_jbNNV¢hHM @h+ -qyZXbb0ΎlL=AϹ1#E'\Icݘ$!#gc &iѕ -ka؀ 2ZΜ-uƖݣia$iOXOg!D;lmA 8HᙕJ#V=>Gg$QFչ$D`@$31mc7 o 1*k˯X$Ɠ+SaEȐƌzϕo f 9a\>x5Shf錹p! 3+#kx_wqH&76YFĭU5$g2wcӈύ1KdM53úl߬~N;;+UTu5f≊}yuj í2K- -:0;+!7Z eR׷BI{ß&-'gù5q/4l ps]-cjPݘMNZδb`DUT>9Q9gI&zc+7sZ)Ujͦc GڀM&n'ȕI5,E% ?U[Yӓ`WxaQKw?qzvBHu>+SK2?u7.Ko\SG Ew I=GUc)S 2\P qÁܜ>!LGgYT Dvϱbi'؛sM -13lk^ю4WO0:k X{!V={aC'JB)$g~Ƽ1̱` =QB;V4R#*ǀQ8s,S\WdF}k2]Ex`"E\s{0jBe[Egxxabya60oHۿTvIr0!!;]af[WGsjS?|~H蟩2YLVxIxҢ,N]&;\1r0KN;]lӨV6$apD?4˝<8p=<\Y_C6wxOz$ m}5줍ZCaϽ~^awa>c<Ԥ{">ddx9|#>Fq\8e8'poD=1RBo\-$, *sr!j00FgıRJ_/8.B*h |/LS@ՙ)f W(_ ov^Nfp]4wFoWC)AqŖxr=\T8i-cyW-4t. USWkSnnٓМ %/$p Yt^Fۿtj7NRr,=a`41=܂i)91^ I[g҄Zl=CNH[5Lhb;U:'3f#;Kc`Mx]]uf2ousaB Өc8Ѧ͝de)k0g`^|y&TrLH`.6͓ŔY{/\EM{X繓\K:Qu)BUkN9Čۍ`8br=^z ,5w\b*UZ&g>զG(9:Yuns{@ΘUSb޺[Xfbj"9H84434w%uD1za`,ٷ -8R#695p X׷}@*wҧB4^=}#LoamiqDrɤ:6V_1vW#Ut0D 8 -njnY'ȎzgF>G^=6^6:T$4l̡f `fOG^w̓T # qm@g~1]-Y< d 5׷NZa`0(gNڊd1<"*8ĕ`pe}2}vM4\~7` G^@$_27颜m',qe~0eC}eϡ!xs"Ǣ> SP~.++0Te'>}HUBٲ -b(ka蘊*c,b8:"=KHqǸX40>m -kQ7$$,{/da`ɣX[ߘAeP7Zsa0{#ҁ9Z[hƁ`fAB_}h|C/9XȘ {GAB$|P:1ݷ 'ӚcE <6i6@ DN@-sI$)7թd&X!>9% FREy_\ `b[f@m/l$U5;W[OcboŝnB <3 P$ ˔ᗱ0i]=^QOCplu`Dw3ƹ0lʭ wKka{AX* DqfEsY7Onap9k+ !)S;=<;Ʀ%d<7X.{ɤu\ fFmr ^ 3 3A./ $]V8@LN-òRFI7rm G[ǃ0ψ/f0Ty;}-K`8YřXRɞ^~ -&c:c.+4T04E&BC[d yM5rW^T aK޸~UќsaZ=}c՞O(Ҭ!UF!9UO F#Ō(sEx%U'R"b!20@a*z}G?޹o-)O+15qL+^|bf.*8vbbN#apC-W B a1ef=fJ\!Q0%^C)ۛp"y/DpDJc!LAbf# 6<3>2.Í ggO*pּ;~bs FRm_C ȸL.FJs1]V1kD ^9o^Lw{JLgOJ ixi!xx;0*/<M]{_7?>COS?cNi8F'i,q`SVу7c)#NaAcuI?^sŐ0@MI[<֋'1g1J.;4C;1j`欄n6#k~F scM̊"s},Qa$5ybZlAt ģ/&OC\dDȱO*U!:gGTwhp>|Hʜ^ZCu}.7HI($S󕻚_Ieb];tUkl ǎ 4HU|W W` -I=: L+pfRσYͲAc>s<7iv1}:)SX).B]"aЮO/(OS"tESqZs$f4`JspX -t#H-@HK[1:m]e5Sqծ\=H3ɠIBrx֎<+_q]C{$|oc2abW*J^Qq@W1I4ˀ9yk0)K#V>%+(ٴeh& Gkjr4ͷM:鈁8"dž3c4 - -E `q; ,}bh oU8De{!CnԝВ~guLv(W>_d V)0;sa1ABGt` sLQ#V/CW3aGΎs @Ũ#0zzF68D#f,5*'Zi~#@("2gAW[Y4RTGxU1:,$LTSՈadF8:÷dbJYm`4Zby6Ũn9>'ť~,מ]9Evfc{+H~bx? \;-fQĐNlZYH 4 ]@%CL v%f ũ1MGp#f=8G*~gyEhFW10auYB1c;WG8+1}G0kRr;m$A*qe?El -⊙L6`xbE= &͎`Ob8 1CoE;B󎠌H3}Մ!b40r#1;VѸS?(@Q1h6:AȲ•OHNLRo)Kƃuyd423P"U>,FW:2Aߏ`=:,2;YntM @? Ƣ) md= |.<56[ ǰ ;}H̲J|-cp>̊%~OaB31.FM-J/wx׺ĆofbMUȶ!*=11X= Q1`ޡ祈'pagk vao.%0=cʀY^b -Sb|x3P:䆴.m;;#{!zsi' ȗz0uq\6捁bQaj8 ck}@ HZR/Zq FøeoTXƑ*Ɔ_˔HYLJ5qbmYH׍Yf2\jy:'P̖<3%B{PL;nƬIEPKe`)]V3F (r {&f:tWYX:jWW|O^pcύu82 ->)/-cAhRx (᭎ቑKtrm}? HҦ@GG kKϣC06<HJbl =tI=mĨv~ୢ,T ^7=@sdii;Vq+1\8$q06#40TX&j[b3:"CMa{L+l *g5j^Sӎacyg'/ CY+> K 20ʉY؉ 0D] ۨ((`v3{ttE`'@ig -q;X5~iMB; otbx;hIs&{6^)MZKK G3daU !u3&;`LX*J@tzS TUutL<1`\]$w?+ &RhrW&CADC#+yk` ;!d+ 2 (|0Kb "cww`*Y`]sV(Ksyg;XwߓWQu"-8P<8;cEݧ৑f|aB|T6W|r RM IET#--Mzz*DxFF=*1M s2w7ođ1v><!sc11@shG:8a|3^wgYLlߝMd79/^K}tДa.b}Ś54PeraN0f0ocE)iA+x:> |f H:_9=UT -fg';)pfPr-N2$ -5H~c&W\:3M~v a0VF*``0׬;XDݡ ǁ4ew%"V?0qS#_҃kܹ($séxh?KzsF~λ8.iֈw } [A2i;a1^lfI5 R=?ep_ꀐv0s%s`;;aXt /-j GwW k/1ܥ2HgJT"Hח^2<seyX.BJ 5PU#TM녂&5Ix.rZ?Ԁpr+ -Pk| -Pa(>LS??1¬LaxfY 4 %0MO^nf$XLdA_ cf"'w:[0Q'/.-3bap|^0;$fޯ&f 1sT@z݅90v6EuaSda0LEg'>I =:$ - b -(>G Y`VaG4-k _/pqm(\utZsAJ)^0ǘXuCby;+k.6 NLԗAu( !:Lnq.L<opS|) MIIcXQt0W4'ZMmu_qOEx@z.TLg)7HkbX3^>$Ԥ㢙B8φ1cV-O^Z!Q/3/~בJ)Xz1szlaSc#C|\a0=Y>_Ә5'w(F7hcbhLˆng A(ފA +=\҃1l1f0}4tga$(|B+ KdI= SCUQE0Eٰ0a$S cDY c*`#@;>ұ'fT -VªVE3FHña:`X6s-LIu0T ^W."[SLa͆ )BFN5?Ydu \̭AH6ň]nMɖ"]?' бo1H1 ّQ%3܄Vp4(HT,=")Eha xc3j[(@ BI|DʉR+8f[NXI W>$1heD~)gÕSuY5~1N7g05:c7ƒfKBV)+KHgYt*Į?#n &&d%Vx3]t~M%pR027_u2Gʇ!q <2m,zIVvg1:K^GøcrX0zL3mm|Q]IE,N2M0gޘ'J]\YT~!EjW_.gb$'6JS3NEEjM2 -cNJ„@ ~:{B+i%yZ˼6gc2.#MVKl;^Œ^tD탱d&h%ڭ/ -sԚ2I_ 6Ng*1]1!|>8oMVտ+b]7s8_0l,<ƪey21F'sי0x}6Li NOe2s0Z鱿*QĶ0l/Sأ`zDpЪOs:T30gtUQԹf?#8m yFPC*+gLl 42#LH ^>=g1=QeD`8~&nLr0%౾#'c T ]gzěn-;Bgi$+0|NQ9=ox,*`08L'c'fa, Sgc=lcI"X*P awFdv7#5ɒa(۵&n^5uPodXGeE[_$ߞ^W:T'&Ci~>4 -3 KgL{ A:p_@숾'U P߷I{z04osssdzQz|x4&Lq~şϯ7?s~,.j9+?ԜMsbzHZ00u-/4]5#t d\>dN`2 QKU8wQ|~ƆK#h6=~ - gajzmͮ}cg&X(_O*Q#6瞋Jgc)6]|vЕ=PQ†/L;`]'u;](剧IFm34#e üqDSW34)sO|9Ҙgܜ+) -ݟ瞺qsWymOQG&cC]pC8NxcQ+97w}8;B0Ӿ)R9Fڞ702%Jܿe`69H>͸xי'9%I7&y6њl̝pP\}z.F@{º>@Y+}|#8F3<=MGXw]$4d+6CP@ܼE1s p]ɳ&q"-NY[jE5I)fkp#B1X?<))`dcGMٳ :ǜ{[IE\mYDZ,kL3=s?C!=cA$.,+^<1WU>M{[mKٟJB㴑xJr,R }x^AV0\b BO_f.Jab]fmۀQv"1F*@QLی=,cz~Z$tigA:V'ぅ\N8C #;qBFCvoHI&u|F9M]T:RrC0>ar!'e.|S{;0 @\}¯mcu[""Ư<&t0GWUȐ[OǿcAW ͡/tEGwX=ijhR -Q;kW3)Sz+35_4#JԾ%%C?o\pXMS) -?zi;xCNǺsvK@AԲ#(H->aݢy>!TşhiDk ?cb{Jƒ"_̘u&gT7m}_mٚJW| kj?@Ig{ st1%>&QwRk)Z>P盭b}㯳dQ; 0:{|Y( d&Rׄ&وVL)L -ճFc"o> Z|rO\_2}&Ynyr FMg>oѕ>߹CpO0W\?0Y7лu֥?"%h] e|CM^s˩Tz6!|ĜPy¤$oאַ+nP˝gw"B\)f$ax>R%UB> %ێ`qV(̑R%ٙ!2&v90涮 -&PY;-fiUaU3(da{)db(îhc<Ǩ8ͦ"afu9gV2rK&&a]>B*1K{PM>$gy6Q8B~ƾɾ TvG 0Ǒ2XٚUt;1)S=[G8C4~CG rN(IN>jW* ϖx51[! ;kĘC|1x~kd-q¨ :tNLєzv /wy6zVafeR_UEk00N K1Q&qd( GN_%YV90Fv}colnwE/15=AufobSa]?uC7TjU\&1vcޙE$UN KðǺ4.7f R0pA kРkb({̗qȅ/oӠǸvoQ]*a*c9#Snۖn`Τ*5_$o8t5W:a3 4, e_ w8TqVRٛvEyH= 3ۈXe܇2XJ~߱+p-S4aQt{N2W,&w޵c[X7(r؎VPKu: yI׀׋T^[ oT-&9+=Ajּ)oYe_G0v$<>0bҕYbK|x&.cTw$j'e#0VV,8J9mYe 5R åP61gs7:"aINVZ-Tp暚/맦;f\wWHĠ%F@LrRA H{> !]$pVyt5>?#] zzv&T(aٮ4+07yx+'6W+ 3e΂+M:<-6z&TcUaH]fg@@`;*Rm~LZZSwa'f{X%^]5!jE,ja 術 ,<w -DU{Bd74,2:LLAh.Xe;_׸1qP\cωE{# ">)ÕOR߉^eoWq'ޟoi2n쓡 -#13!yo̻Qoh|!5cS)1g -;Nt8 \qf_s^rLo:ot+=ya߯[lk{TT s1'+^0AzQF}) 4ɠ9kaqy0 ~.(jS%VJ0+znTN{D s_+#QԴ ka=4e7/wѵjygkXݦW`{Dxc4?%4Bs<{M7"UQEaz&AbHN%K5Q -L;11D" kBdF14l%IE!&ޑXHXH 1 0҈g5ƔU͌85FdW;IojQ/Sy%j^γTY9;5nfsPSAK_ңKZY&IA6wy*Z $d]$ ,-Ŕ@8x /A9Μq[:J7ʺ;9*i]^tc֌n -j!LM*o3:y`q 'S(ҰÇo-7T=sٙ!âs<yh UM\/p?ŜP(bm].鋤|,R$>ٮ9!ӘwseqiZ~!1pxDRLLEgN`xnV(0 Qj 9jgspE\~&NXhV ,*f&4CX|X.B85Pi"|v<"l -ⓩ=$)גSx!zPj@xs -J1 Pa(.oʟfaV&Sz]6C~a18~``I bStdOnfF0`m,+OUZL`&&Y#DB5ZQ6@ߌV*{y d{u敆0``n I-;N*y{X5pa췕3 -l)GwGnhSJ0rY*J`TW斤}wI j5Ii1QiH[9ԡgob D7]bV@JWCw(kat Csh3:ɰu= ڙ!2b0LEMI.bl˦]nAXtj6Tfߐ<e( U U`M|԰Ch5M=@p6(Xuzr }̡bdA4{N;h6h@I1 D-r0z ̛xSiDIð(tt0CMb %F~hӅ>zf!8b8*T0Dn`Tg`Uh5b*QH& Lv!ԎK$f2F <`GkdXxJ*D7םXOc"vLh@72if1pJ~$L?N'8PtfMc% sIa3~1U) -t3'\itMW2躍LJC3;9 SC9c9Fz+$Hr R.tBMm !t1 -;D`kJ6i^CO%j KL=S*BLjc) ^F3TB8fL}Q(TZ p,(-dQ DJ+b6iH'!  -s`ExjCwdKLGAx _A`(2$H#"b5쑘!tXTcuBQ垇-~+S{R#4N< /DPCTF_qA7Lu0(ZˋuSSb wT@X_b*#H{^sdX rჀ:Gx[|Y{$q_OSY7|4Rbb'0$LSY sasxG@A%`<3D:RSKJt`fw@ܝbݷI] Hp[SwLmXϞcC50} /=4FD,`C`pK:pwS\8ϾŠ|$rE}w= 14*jLRkߏ?O?;|O~~~rzˮH%qbSqX]!(%3US `I73 '_3KkaJGwu 3,je"6쫩j<ZaYS~d~=%7S$IT$_ݧ(Kؒ/Rl\N_q0 -҃JDQz2S5}4]DכKY-z\E\G@Cli_=_:Gl\9 #A%89]]#ȯ0Ry ‚/NxI϶W,JOgaMwr3g>0s*^֒sbQ!!b,4)+Jram^h4P8 B)I UQ -"Mؕ }NL7[ ʻc6 ^H -FM8ckA9dyw˰BEP)MNۣ=6Ku ^v%)p`BMڒ2:8EDiiw6S0JpDhʡ)׻ (F 02AE]~Z>̚Kָ8./`D)&ѻu ]NFJR&p.6n d(혰DR}?3=*tlŶ]sd\Wj endstream endobj 22 0 obj <>stream -HLc7 #p@E$oǧڵ[i{gϜs,o\3V_L(U{1b"X$2Wxm֎5Ŭme¤uW|1wF)k[񕕵bd0sG{9j,Lj_ճj^. Uq{E^Lw[- m6A^̴ms݂tof׸G 2nd;6t̜/f{6 zo>N2` rfOb*wE}0aكܓ)Pk0.ATT*F8.#L׏&Ni?rjP_P)8;P; ^ޓN~m2FZתE&'hL:TynS0179{74FYS_Sgd]XS3_> ˧v/L _ǩ6Tk/f6?n26`=p{ ?:Ks0L&5O*8p043AzWŀ3 `)6CÜ*96ý[ck2%R:(tM]KH\߁ЉbP_Jε㐊R͕r)F)Q<1֔)j閯BHIHiJ"6ue(+,F ƫ?gu Y0lpT=B(LAHm H_Y9®iF>qq Fr78 Lpa~ !2>؈-a0AT#b ZV 1EN!W0g3sDHγRpK_3Ec/Hy>s8abtN08t*n i -o0XgI7q1vd20R,݋; bL2Uc| '$jK؇biKFԆU×$_H;Q>czbO%~lǽAɤҶ`3zZ_u@q*Vc1)L S&3)͠ -p.8{KR &TE}9H 1ot^+mѕOma7*ZWBI԰5\%&Ä-N\z֝?Zxb& ˹9@oK,7&I5\?kn T|7x.LNZ_Q'Iڗ%85(Ԙ 6sW gr}GɜY.~^N;_c-롨a܆\g<ڣC68{$R l!%5-;dLYaal}-^` )1?LBQRB曱]~Dl ܨoCg]9 0n3uueOfC$:*j/}Si(:(:}J܍¨Qo0#jR7a.J S"k|`% N0N1 #nFکWVo%We%+-繂Y2Ӈi .<ϲΊ5YܸNgۄ1=ܣW{M0FC{R5yםЖ{ExW´8厶޸(ajY}׷0z):6q֞QzHE`32?-(y_DUuX0/3u)sKnci\Ϊq9eIºޕAZ"CgMY,i% _+J1mό?R] | "0, 3})C.-oX;U[ھF@P( cB܇MI8_RRf ,>g>`MaBP;*17ajڠ`?uWcK뢣`LUvVFoKBztDŽ#WHTۂZcJ>$J8#@ ҅$aN\Q3|[+X, fZ =Y -0(ݹB lcTrʁXEJfXR /!MIaa;E0H\m YB+Gj[ūp%EW$.#ۧkC -S; -Ȇ{curI(0#oP0fYV,.mcTfHZ2HS݅wdoL:~2\[U`UL_/>D}aujx9eY7m%6\y?zCfV𒑐Dd ԛ8 IP"FAG|Iw#k^*}wo0$ MK>v_<0vE:[IrGSZhJEz!l[`<\x2# -2%J'/nd,l Zgg嚼ɥӤv7*018]`f -*Yf;^2+`2Ky\Vè_}$_;f_Ĉvo>Djzc2: #1h!^6u{6.^7r wH8X@\",j.o0XAMcb.X3+f,Ag{s>`( Ǝ##;qK3WԸ2- \xŷ|K sN0O.(9PUrEL7FLLF`J:=GK95'`YrXi}EvYIE۝ú/im޲tmCPg$Oף+Tc#lk -iruZ}6&c`z? a21 -\T:2}ZBI0f3==(_<)pv9&mCT񇡃I(q*JS;EIO0'=6DIw-W_߉7a8`FT6svCh y0='{z g\)Ru a5Gyfl0y2,O!G3EB\}CM(t!)A Iz״zY%ĩf.:Ap  -M~UYxVXaZj i(͔oYΖmo<08cU0.;wۏpxM#ifSU$YsHY`&Բ\o/OQ0Eo}vIY)Ӆ_uL^lTA[vKZ 4mo۵>1TB |YgT\ȇ7%ǿ4I 3a\#xјhм՗b# 9àϙ{Xiu1wJKbtu~K)&L֢+9=Oͥ. -W{$ųC*[H4jXDy#ͪ-Iif0q˔WSUsbQlguݓ|L<0D:LYrdddY*٫* ؊8sR- zK:ߜ^I @&5}5o:zNx\PܟwbJbS1* -Nq/j d`$=lJ(GlL!vDtiM{x,@X*lXorkFm׉j輭Oɉ[\"6KNjua`dQń#ƾ%rsa1dD,$2ᑭumz|#.b<#]e}Pi]ؼ#!-J=Si2;n凟?ӏҏ~O퓘[OVKD UJ4~|×<(cXN+K -Q-V5U?}#&rLl$w,gď -?Ldz'G^4Zo%ّ:]&}'l 昢R2/w`PaHi3ջƷ[ 3VZ''a&&"ev\#c]c+12f l0W_\`Qt,03OK$W ɉvjcD -[i-OI`eOE#9d&EII0F#IǐiJEɭ5LM2]+// f'D?pWm3-S.ycZ̖nrXv s$TlXxNG/ y8;aF֡2T}}V$5c؍j!+gP)@g [/= `rf/5HL!%ȳ |f g0 .KF( zr*Dy `I!1Yd yur6vmk{lW,*$lgMЛX0_gzM-!^ɤ/Փ=AƠ~X빼Z9z0OL || Q:9$)|ɼ?㍁F˅e7n^Q aXu>qM%]T}C.yNf~|:e2#K~j A4N߉ᑾN/֧階O hoD fR=Y:'<H1`d[/7?1#Q+QmO`!|>$jƇ |{t bC]H`lZV垅h0٢HCxՑu,ZߊXO(R&1l&HncU:NLm3dH׌9%q Ts%$F]f1&# @'=^.[ <`8{cD`Jzi-=dP)CdYqhk'kbcCκ*ZַVfېZBЄȂРL6\3Z'erQ<޼fzrFۆA!:&!Uc!a[lZB]1WvuR~`0t%ٍ#A݊V\LPIN iDy7eJ)1g%= 1h0-c_{J=%b-V7!fQ6G|hPΕL ﲮ eEWTլdg=ٵA$b<bWpM^AH;yM1qF?It-!ff2^~Z=7`%c0:߬/^A5,A+AGe Gt%:FLRQ=;Lmھsd_ a --Qsd>_-"| -)*"DxdCzu)Eo -ue"d1q3x9rTvpL X&9,ML!}0o:k:Cv211Q[Jψ7:erCZSo+_d$o/)O9=% Ču9˜Ww1i)?.래u"9ƉgG-݃ӅuYYl^bo|8Z$ͽ<c}:19yލp+:\Ͷ&HI2@Iq'80R?GS1*~e*ҹCTzVA'FbKӬgz7^B#a%=NW!a'c@xKwxWݪu. doϛ _wՇ8L1p>1{Ϲ^Aboya`̫ȉ珷:GG~Pa蚁lĘ !Z4p$>ʱ FeWb_݂q[ooTم4Nmv>t}tAXs8[3sa4r=bŔe&7T=TDNK<cp<_lZ>ٟ 2ot+M*)%׾QuyK()h50c]B'Y;\͸֯W<jpB 7ي%)ƅkͺf[28~]9>r=&'KaMŶ7Kth \3z\'ƃ[r[ɜ _ ΆwS٦mfux(jbؼӰc/Kc:/*>lS J̲VCjS< -a=֚EZ^`Xgb_LPen7c; {?513[kӗQ 8rc ͨ&4eOfB`כϳd 2^"} -˶~lFa#jSxY'f\*̒{]|̠V= CxsJkBq7 -ުZ7҈oJ㯴8s2哛{{e)G}w8Nsmh퓛縶ф!7h='[jgpV1Ww=0[No)m8.JakjcﱖVPakQE?{ר0Z_+h~MGǙs7'İA )S{52fP9\Ƚٸie,RrDkE 0`sbVÐ/.Z,Һo9ޙ21…m(O /Zだc w6rnJ s|IɚM P{x|ƃx9ݷa -qM:laey<B:k CGCˆ0 "oƽ'ly/SA92{_kI2aO/.;3ꄩ8TJ_ 2J(Lێ0(_d5 2Kpigƈ":P4B]Ee q$'cs#UiƮE^68 -SNczS6Sa׷He\ -naLFv_$6iQa.Kag ٺ)l1?6"L. -XTuQ@+;pP <w #m1-~!Q^]d&N~3۠aJX,^+3s[~!=ܹ+ -y19a61ZJ91!XR /!˛¬ fz*Fb@>u8Raxǽz^B+"k~Sūp%EgW۫kS фob1 :?;ƾXVb27ξߤ}0Ey`zۨfu=K6;T{z#h=+xHHwb,Œx^C=őg?1_N$\hc6:j;H>c=)̡Bѿ2]}P1i g31+ʵc=P4e6QVZI]g0-%q(՟DQz F{K玌 -yF~Y^ uTXgR:Ph =H$`zj;?xFJ -%霌, MwnZ@-W[:RzT-u6}[veFjM (܃}kř|vqk Kܰә0jtxQ=uϑ.4oi1 YhkgJr]): a #{tcsF@;zb)I,CelBB}'N=;@aΗ\.J(vddħX qL2OTtqm9(2X]&7[E82=TN'L](2g2m{mUJNJ;{:y=IoJI @ϾL7I-fY'}{%m9n%wJW#d[lUVfkj\p.=GlrZ}kcB ǢsKkb!i^TDZl[L?Ǫi}mDކc8,wJ'@N񃐅IG\3Lca2 n Y#Nry3DumۺC&Gk[;!, -{bD"W>'#YR~?Ͽo|[?>7?l> Œ4c}r3i;{P)ӣXaʯ-a[z F*e\Nnޓ8ѐL׹NȢSwbfOp(I0HC2n ʮALx޽Ԇj>s|q=$ʹYe(FDTo=W"!qWǍу,QaZzPniVt4XuxE> CΠܐns'< GtߘK$IE*$ tq_<&(^Lj đZ+Ǹ#_֦ة4K>+^ACVZhP. ˳Sm>r .˾06Q[XF!OzxUFX Im8!%a\NcO~s!%r( q)-o=n5:wAI*yf( 81(M1IhU:>+ȗǦr_2>U={<{rfc"k?F\{ $BU1_#WY>-P -Vgד4^t6VӧyNB.imnDM'W['LyC*rc 93 FT9Oiܵt[iea$jnM u\1NJL"iw< ks8fu:apLgߵ/{=EZ &ĉZ#jɓ"ub"ijZ'F$҄k~3uKQ/LZQ P# uވX0gy]bÝ0jo<px0̩٦o(gX,&:gյRq#(=1*@=b _9jl -"OA(h -T($/ic+\qٟu)[BD.*6_imvkQ(>{{Q -|IȣϟChRz*~m:ON`bTklA{pU->Xgi-&_ykޢp8"c̎p)oٯLVS:<ԙQ -B=(YHvaoAuM<60i흈RAoNֵ[ Jƭ=3ܾc[f|&]q>; >>0|ʛzx?K:aO_}*Fe2$.|'Kj:?=&QSZ$Xo!)VƐJ 鞈)Y$zz, c5T0ƥTnZ"dRXcyZ\2%@X71΄(( k/$f:MVH: :6;}`z? -x'g`gJh^i%t7b}0{Yi8丷`<)_CsY|I.}9L$c=O/W CKΈ;,:}ڦ)"eFȽ#]gٕ@@%cWA1wT~gz7y\O`B~ٳf.Nv(\5-#bּ8KFA1\v94wG%D ސ1zǾamOW0ʉ~q { kk. u EV?[T όbGc#wz)oPxS o$FK)N &K&E+Z}D{2S[_2GB0WQtcwab4i0"EL5覡|~NCV9F鯑j~g7!wv$+\` 6s.(k<ƅ_c􂚱;ns;,;:BE̵0w3cq41l˕^DYU5;%V^;tF]  oNM,!u#K=_{a#xO9y`">=Tc1~%f`U_1Kɕ6*k׳ZQ$h\ =oυ&7Xvsas)eEe+Džї|{_[\!YȌ?ŝ>`.CŽ8JKCS->h[p_C"A5/ 3Kp01 E;Y iéas -'M]4hxLbgFT\ -hS?´"22wAuT%!76-7\LiBr`|9r\}`ݾeLT{BĸY2~FQX+j^ XVH7"Y'~w_/l_T_laZ,L|OG< oczl^k(!93u:!q:9gQ+h}}y ̸|wY8ogcyd5;YuXδ~FaBUFW0W M.  \߳XLjj%ҘQW=~υ%e\NZS -cl#Pqm R&jd -M呚a懹Bg0ϑOe+̋;0d%s,qVKQҞY1 -_Sl'ama~J?1\q:QC7>L}`T;XeN8sЕNé Qj ǘOy¤" <佶F!h a, y.l֌1,x$r*^a8HS>uW)5濿8%Ų;g$h({υ$;ث_>k;fgD;GzXCG}TUf<##'`#j;8;FḴd␬vY|iZeokfO]qJI B*8n-BG7Rs:t1DiǻN%,@ݱn0M}(0eϗN`8WhYXf ėrD#חI>O?ً -TDezVnoQt5\gd)oeFhK^!;]eGLab`rmH™H%qJfUҝ%f[? 5z){{A%Duo3.߸GۇтY0_n?m>096scD9\ E9 ;-E-2M}ěr' -rbo3?[}SOV"r2 -{& u8퉫PeTqut;ZXOg<7ߘڬsLH5R}ejp*Yȼ^lDuglom'Ru{f^}1Xu7(XL}{z[ -5Y=U3{|!X~?XvPQcRK c8"t᜞յdcNndTVK[ y!% ;>όgu$|1<[GfFHXc E+ >6:whԃh`Ha_ ",wΤM_ݳFG7r(kg.9~М)Wrp7/ƃff yJ> ct1S {`azI$/F=_ꙶH<p++]Wwl/۩@:Z-DgޡCPaB")&B\8cD}֚Hg5 @E>@ Q↉/y+*& ;_{K{YAJ8ڮg#=՜؋F_t9{AX;9 'θuąJcEh5=)~ -X!C&: -v+KE ԕqJ]-*['d^Ӯ0ڴMxxgPLxS$50u3M CQ,zai&-9רqHLp.Fozh}ۏq)ka~<|=*K ύq~}Dzqa6/9xc x>艼U(^1"}ܐ ` *n(@k@4ba]8k28z=*OĢ;g-Mڼލ8XsCd`A'*M!F.uPLuv -T'1EBdupQb2Qq$JobsQm/@ -3CL0t`ˎ ;| -!gi0(IS,:LK)G`;Y$1^+~yt)sH~¼4-?Љ ) k鑊I ۜFŠv/05ֱf668 iC鐳r#Oi6m*:yl-U("CBc;WbO35z}!=9 OjMv3h4`_ҥ~Zf38O`[U -U̮\DQ<~U! MƲ&^Td?@4~OXBTxU`פjZr/IaB፧$iEFƃacJl阅wσW$n=֔/``oYit}#LLӢg}i}ECYx_4/q"Qnj=4p2XkjC|34Js,% :ρ/x g/ʆb:w1Nq)F3"o2ΌӃRP -xlddQʬ/YK*ϵ@-&6&PZ KJ4/Fꃢg -~N t6MP*@~]96$fu6\}Bsq0l2nX mX~NÕa RF0L MZNl1<; V'pP{2= -FFM4mo7KELbuƲ*}3Dɵ1yi\uiGO .gL)ď%$I4scS6d`f؂Їrirdy,3Bň_wT>3jV%V^;tFnLWi 7&zH"Ϻ%ՖW6tnUjS7 &csKu`#ïDBW+f)ZZWvzvK+{"4ƕ1DJS`˟Ю6f>gRf\l1ҿ8^6pzH 2#ϡtq'cQ l1(v5 (/ M -ԯ>:n]Hl̽3P\PgMOw0̷ch9nzŒFS1-Ɋ)hDť6nLM!"351 -M!JBd3o0l+Zn{c2 =-Gp}Qwn-ezM?.'͒qF3jl26M?`ظ9pbY-#gc[YMOz Qu[a'0y6&>[gG< `z½QC's0gṍu:!q:9gQ+}}y qVp_:'jɞ+jvw:7fi 47x`l#-N0t[:7j욅}wŘ{a\~bϷWodL>U -kC'.bZY0!TA#\qjPT0oȁ㢬 -V ^\1452[p}b25J1+$ K4ʸ4ZS -cl#P_`X52iĠBge]=v`$n JX8VKQҞ٣1 -_S%$]O{~bbt67>>0 ,2 -R69@'ԍfcLkcR S]LkqLޫ{Pimaȳwaga1#SJ9Jƌ70C=zM1؋I6[hc|f}}\e1))]9#DCyo &i^kۘ=Nbr?EuZe6uCȒ<^w11.1^CG_m%̗VU&6SW\GRGκe_XjN?CSH=xTB? ԌMvaoC$Œ>_:?B#ĒVh # -9mLcXLZ~żA+{T_ua/daZ/78vƲspU[{q?DK -jc,;sCg}+If8RB:WiofvӂZ!דgqbw>TzWφ#xdLQA[r^^6c8Y)ta̰08/pU|WJwΗno]r~jSoxkn"&K { %N3.߸%hA?l0_n?ҭ>`axv&rsyf^<~H+7|s[iRL?$6?b9G3>H*FA"}2rfGlY<5(Hxka8Y) 30!Ä}|S#eUA$Y$U>çcǫ] yawQ/]-zM5==(VI{S>N`4YC2aN~+ΐ>Ͻޅdl>?],x9_ďg1ֶ9sc Djp;s -z8|ƳxqӴ+o޸&xL沞hȀ F'5>(>`xim2_#N\$VNuDŞ+ >4G#52Uz;&d㊂J8vec#zkKY/:-Wg<7_keutgO5Rudjfy9oڔrQ'jMf߄:0Y#Pg0ޖЭ&s싆 ĈM DAMv MQK#R͠ lU<޹e`c}v*;JǤ|y  qD*9-yPg<&&Ŋ%Œ^GR=h}u["3sIGݰCjJ Ki"Z%ŒT/[T03@SQoϤ[28z5#1=w.u|2jM:#_Rߘ$}b |W̿Va !Y s-=r"maGPK AM gi\:aƸv: 6A[3/ ˮ{bTw'Fhwy{B%=PaKmF>CA? ; 0g:3 5%XEx L`y($A=Fҗsa&`bR{@0fGeL:N{bC̱{Dy'^u ൐7cL 7E:nLLCU_L`ұ:֑lszL%Q·®0$P! /iŦ~@*J0#0VZC a83̰ -\/3I# -9(A ?2SԒ+тE-V!&cANa+/ؐFU?GU]ūQvY[qeKoa'1F0#Ŵc`?Chus X RVWFra~zf鄳1*ԠmuBìGʩqPIFf]iNj y0Tޫ˩z%LzxN n? Br- gyӴ׶DӐ̙Cb̑d`Nj)n]ԓ6-sF3l,SHƴ['UuVΐuLw#!-uǷk0UfA\\G=$^^vٌ Q#u<>i_DH㭠aϏZ w-v8FNp ;CsI!T_$\gGxiO(jxRm9!:װW9:=9I2奞V"A0/h_I{!zꘖat6D^`fVs9)k$ -W$u\p*Wvg-\E'co|1\^ӿ(֮61<8:T333T{/ -qB}1fDz"7Fm|lj -$22~Gj0)8̑P^E,ݱ̩Ҥ={#k柉 gJ# -سR0=޹h0 ߅;!S05EZg6\8Rg}ə獎7HR4fr.նx -CZ n7qcxk)\k~<<ݶuNފya+&[ĉTck#C `+A D;#z  e yL"}aj&+u>:+5׻60*-_2=A:̈́[8'"3niSR`%bf|0nhd=#:?>yn[ Qҋ -+A-:̟2sսb<j\>Kj Hb˄m $ah%6O|,`6ambF;ɘϡ)<RX{MڵIf i&/R-sx LoWclΑ޺1~-KORJDŽ`@cO1KcYǧ~gʾ_У+>h~' c(!+]gM MI7h {E'DD؈yu' {.%y4,0=IxŃ=E cK+3#/A&'Co6bZ{̒˞5\FDzXyJHtV4švW {'f1P)_aSхټLoz"R Cxo1 4r;7GX_m:t2p TIGmE$ U`]E y=J9ЪOy0Xf7ЂVOaǴ`xHV] ѽ:O8!wQklѹcרG>wLnv={ -oB~G]*c[ܝIhyE G7sTJar#,jvx%D){RhxFn$Ĥ-5'UV8RNB}5M>!j1]0)A 9V{aZ-ugez`0/ &R@2yM a{ X:~,W%hbd &ybUO;3rP [ȚzbrTNQOdUM`=bD -:2걹% l@I -hKx?tQM=; Q3vcΧkmVf>2sv5ny%6ų/q»;E4Plik1h?ύ1~{֧2u>BTFm}3Zsu:O 5?Lv;YV0Ϊ[ғI$(L =nmM?Mk`|ܛ -Ĩ)sV짏Z̝{= -j|KS|@Ju&GD-om-;A-wQZ|[4;3 *chLh=C&ڷ $$:>ِ5lġ_6ٵ+k`ʱ3Y=ʕ(x{0b׻ǔ$ we܅cQ7 ->ރ0Y;fć!ԙ`̹, @. NZ4X%BǞc3JdƲ1bA7!J~<+'܇zJ@5` }J;aTˆϊFIQ@6`ƕlHq< R| w͍#̕1YOdF/m31^7&D7RE ;clSrm20-buknI ){O -X{`Mo*f~(j&.H K;[Duwhb䖍16/<Y`%F8mN< D5y~= )ď;x?SUgM;G[1 Dj¼1BL2zGR1ad(2L2x{V>+:ƴ+$0(qqı-T»E 3$Px[0L[?r0}R|V|Bi+o D&ce)ƠMڬ"o26bMdtDŽ-I |MR-, VMf}$-#o cRތU- WzSiq qٸQx[/#0,8Y; 1lSffcѸw]]X"cctm6̻l|l -lL[a辯Fc}p~F% ]Zύ dQ<0X%}a -*$RbA a|{&OqOۘd{>x+ &j+37(zWE<6*_W -E쏜RFXkAJ${ 0v3C$#= --նզFHT{,ZQ fk: ' ~}淞4muº8(UFɠyh-R0}Ey.C*$jWv0l9<7i 1y7L$)%ٮoL^S'j0)ƷƄ|_IJ0FV>`//̝'1᧐$;E>e.&ouELz: ?sąښyIK"9%Z^k-f kˣِju,&kŸsdYՇ^B#wU\UBDy\3D$[7&#žːs'\OGc.2h19&-6/ğWA߲b2=lx./)['@^ʻU=d: ^GV1kQ#n`ؐ4S$ -gKdzrz>gp^Qao -:eU?繎 A^Ukg}Qo !WE?DfĖҥI_'ƲX1k ߺp`_~nwZLNtw\Q=#Ѯ?XP,smXzTWwզo=+ƔnX=zR:)@Lm'LGo[O`9 endstream endobj 23 0 obj <>stream -HD۵e'#89zӟ~ݫkJlQ>/20su19m:=n0Z2sV8bVV7l9*ﬖŜ5Yw/3w;3„6^/DHdp*qqP\HwnAf5cwLG) Ԫ bVE(),&i9-rƼV.bUcbaxu1` j1OU0R\Rv-O\vM0F$%#ofoAja:r{ ;zub,.@HQe{DY afwQE(,TR 銹=>ؤ60 Q\̞Q<'&0zPXJOQNB -dS)' TfBZ0t19܉SpRb*WaI*f]vxyb6]9~ؿA<$MG &\~tHbҐ<*gHb5)x>1S@d@ "\>/H sa3,dS}圃' -11ҼC XN/ǾeDc\BC׊p TrΉ{`ѩ%L1wHBGl17C -aHOŬsΠlʛ=Lcޘo ރ'a3a.q##q\~)|-Q b&c>V6ޛƫ EaăR/PT-Jɧ=h$$. ~Q%ل&L&NlEѿE8Tօ9ME(a#Da(6 -2q0#æIl~>sUQ;c[rTFE[X= C0~ h0N \>bwhCZ"(&1 %E?rG|o4$ iÔSJQ18xok.=ĥ1Dq̍ &s qa|9yq|W&Y5q9T$opOh<,2>NQIڇas a1wܖV6]?LB %^UJ=U!h3cIӯw9Q5ص(Y"q،4b3L] -9S<3mKm_'3\F6bLV=kt)Gu9HdAb9F{xks`nt:iD8֙ڲ!3>J-~],(GYzs8V8aIwJ)ra}h`Ȗ܅.3?`DlSc+VːWIaLEr6&1d%T^j`UǽӞvW0N4z 1Ug bd&7TL9UW15h‰|k8HM F)I`Y`!T|?F ;fv@% -w1j@0 x=zx40_Y-"°`a#Ab_}aR<$!DZ]9b1 ȵȎJ'e |?lC5 -M&A=5sd\xj0=#h"4{? ͇A!]8}T\O>zAj0gtK sC?K`ĿF9̻η`Jƪ&5~Uy3ń`B3EY{DEn;R~D0:'9[~kƨa,[H1N>"IaZ)ՄG[ofhFD9n-Rk[SL`kbE\)vmX:iU7KvJ]gDqt79Cey€P޼Ynywzn/ơ(dQ(b -%qU6m^^׬1p ǘˀar]@HIfǘPaR-* V|A@IywN0I<:l,f&n̝,=# qK+c,W7&q:Ǚw1lOr퉶8xIэ].0 &qOw5 E\nIDz^u1/C[>9;CtufdFH4SO@°-F9i^=Ls00-ĨCkRs ۏXQdbf@ s$iU]X5bX'$Z -3ŷW;B:;)uM >2gF5+ԞG-׋Ajgou.Ln *Of9"%!`8l}s33]F&Ӧp.,JN uZϚ{'"`0-]8Sfu MCeI㮮jR:ILњ2j`ݐB [q<1<$R){uKq"B5&T:g&"Ø5*EĶ$S aZf{ -oB~G]*ѱPKF 6G푾ar4ـۘ ZFj[q(ecbG:ǫ\xҏG -I`:D-F3!:-~0yU-ذLk %D -Hz0Ē^64\9_ H|'Z:^"J@L*Ū;+LAnE"k>Q9E>ߑU56suĈI[S[͍ .3yFp9w\t'|Ĝw&W?bی:ͼe$ e,Jl(gr kmwy@ Ι4O}=7X[%iDZB!*#F:rtim_]a w]BMN$e E3tg ']CϺ[zj:{]1ӥ0OJcs+MA{)*_{r3v:L&,a23+>q<g "Jo&yt׃Ce!X g}C&&ZT|y/TS`PxJo#cic&ƋcGgQʕ(sLa45V'M!iw!*$ -6oA }͈cCӽsYwt1f[jbZsJ{ QJ 33 b TOs\O>Sx6D?`.o9[] }6HxLHyZybhc 8W0Os$I[C/ Ax$='xy&nag1ӑ쥦„q04V6m\CBXZt>OL/u17$]Ez̹Z0m.|SǕ@3j }8vA]FTᎧ"=.X̙ܲ0ŘG p" 죤Elu%cZ9rB>K+y~i`ǝ$z'#|adՉ1£IE}aeׅ9}k``~m<`=י[&ID#'}|g1"nfY(E5Efk>)L6UQ2ua&m"߃˳ #3&3{x/K<¸bS}+[72_YrUl}KTY Kw1;NĨDB4T¼iX4n{'H0^m֪ + sW:#q1 ->JNژ .œy Q+& * L .<;Ih-u1f\{'2Lgp^a樰7`X2=h{ir\7uԉ0g -\q+smgpP_~LtbDh i*%IILE;25mCAk̚eOEMocᷭ=DS`(:crʹU=s) IKDR8?y#?qWqV#>xc'˳MBiԴq3D3Q {d/3q sDUY^B/{^×}HXKC~oEN1X^/签_1h;KBx5u}?{'i{ h=IJm<8Y}_VhrG^Tih{^~yzs4\ SehK!>UJuyٙu}%? Gӣ4Ll,&gcғxP&@;a~o3PAQ1H\WS0yYb24vL"ATia -֑{U~؉@˼2\@l;ic#u i&H?1:Wk L\pEw gwZw\v<c?l,}1bUrq_) m<ܷ <*:$ {i싩Mߘ>U\d4G&w'x)Mƶ+cRɑ{ D\ޅAW2#]CD6XzywZL f$Taߘw0$'$E'~SǸqҟLgW01e,Ŏ037LWX*jy9QypQw9lC%h|kaXW1r0і CPGR~۬.`*xF}fh  -H\GmՉLW]+2jX4o<((wjQ%*[}p QsoY@zk{Js~9ż91f - g$N{F{rMLX'{cHL.TBozm?Chr𔇠'wa~` 2co/ُ=n+-K?Vˆ&JeCٚVqmוmV1 -9KkOΡ(:Jc7hۯħXHuO(oSV^Ox:~vrڠe@dӗ]!R#syN?L/Yu'?uYRYM8?pxSZ'?dŗwȍkN+ +w"lhķw"2KE Mw2" X@Ї>V?mnxiqut)qu^ϧn.kJ &WylyH$g0g Q=/{a`ν[ϳ?DQ[`NIkz !Q'jNѤ% >TGQt8RdY+'ȯA߃a:T>e1jsT ~Hx0c4Ěfف`֣Ԟ9mpa& CcMD>|$(.j|;lw~=kZ?[sGh1pAGN( -2acL1 6\Lk6q0S@{-K@M1(:x>~QPc(s!τdxyqJI ˝NY'0$`JT?==p]3[n;qtq\]ܞ(_p=1'ɜ3 _vRaHpbD$i'0QxA~S -_Ĭ0Zu/,~, }f4"7;CiX - &S˗jyBh| 05W,[=sۂ˨CAO@;QQc c8:ׄ`+T?Z1ײ.S"7&9͒i Zu~0+3dޔ+nAV 06DWYboB1Dds++fڍQ -'ˍYa] 3YFXܿ'-;O{:vd6 `+5~[N"Ǯɱz~տ??/~?¯~//fY.e[~ ok9/Q6*AO!:Lx%ƄE)>{瘌jRTHs#aoXtL+#M/L%|uOeBD&/sXFG'Yƞ`>d}rH -OCm'w͙Ǽ`\&SBz\n?FZzy/7W}jr61%.a_kks^9C?ʇ1"g|ך||ۗ?~b4>"bOi&rr^e`ɆV/RP"ʳ 5꿍WsXg$c9b<&Ffc=OSB5qWĜi'qz[;7d٢kX.q1Li*(a3T?u? z0{ wq>'D>je6V;n; AyRnA7Yq`VEp5v%J UU&1`92 eޘ4)et<( -[7e'٥cW(\g+-TlEO($&"e4dV{֕x}u M%,Y@T>c=b U7]S {FEj R`غ$in<V˟3e%rӯߚHs17CG\XQ[2ꃱWB}렃 X0(fYR n2]ej#a5k,j'}BFgo Ѡzj>v?Z]o#"u6[^FcpGYPE4or~Wn־`ҹn4Tc6h<\Nje/ra>ca_l&]5ܲݫ\X'O/So U65rKD 4l΀\_iuPXM3ǎg,}Qga6SQόl$a{=o` wa>TlmL9ڍ@q 8Ѵ$LfHal1Tod,cr@G -J3( OZs˂8o `!=lJxkh":Xp!jfTYƘ'8 d4&k`n(?QM4gd7ߘ45 -6d{ӆ  IѮtC$*Id%ŏdqT΀]q=Iki똌vl'#k Wn>1ۺaeh0"vTĠj!"@ӧ&ao(t UFv=R~cөa4s0h(h<[8sVu93sV&=rG#:$i'-T*`07uNE9YfF.l s9&|ꨢ{5k#acL~Uy%1F%ޘLJw;n#f@8gᐾܤWӡ& -:H؟?{43\{e.vֿ #~T#<Ħ0Mh@oF -'JQNX 1E91CNq+ׅPs4ى#\j|?NN)ig! EoT[(~摖{l(9 kOd d_7R#LMmGN&ԉwĪ ._VQb_/NogFݩSzs. @vƂafUr >i$l#KRшChM*D&3ҵd_ 픑Oߣ<gtq.Vk%6\#f*{^E.R8mi˞KEkOii99k#%V:C(!٘5]׵.+gL_=j"e&KqMȜoVd$)t1,'Nn^vZfaVQaqA -%q| P\iy?(BhO!U*W|rV6Zt,c.]Ņjl/@"kG[q7&Ԧ?[uF;??-(#(pŪqM=׻H)mޞ}=X@Ae5לpY -=ڜ*f^2rw&YaFM{#^H_.jLޚW;K[Ns>kVވ)Dua8cM{Tb>#⌢pWL*mw m0Y}K&+5 䨁oZISCsiT`7B+e=+Ucwf4ܑH&5X<ڌ|npChFM6 -z49lYҽIyYjhb|a)2Tl\--:*WR%㛷8߬lAڒmD3KbOx*\E'^7޸(65:ofbWt'qi!.Ba5H2լJB̘(Ǭ\/nndwr}pݻqjZcnBV$rZ"?..w j^Y*y?Gf#2*Ov8kB].,&>b2T䂛Xg{R `Aݬ\WS,Q쳎<]bĄYZbp)]?ҕnyW}Y% -7:fKJ/I`&{:v<#9T&ܯ[R-ˎ=k.X-:u -ndN΍y6kӬIS'Pm_g C-,t$G&Gרop,BǬ\Q -o0jbs0Y^wi㔍;ҶUaI{~Wr% &꾶?G_ܹ.l~SWEYS+%g@k72 qf_b|$pQ 9tt`BW3z a0g8:+X¶;J~OA{vSz9)L@X}0%O-gi͎6}VcR~3mm6淽oRZF:ϬiKB9bj30W -"S =@kc]˱hcş2P.qqX~m2( t#bf61A,-r*:\\1 ڑ+rNykZ͚ *~&K8 sn9J^۾ç i|eDMos?T&jub Ù'Yp<\Q钟 J3B,79W\!IW[\phpBwrlRUle=x~4fI?\b0s3[^kgƥoO0êL"2rk .s)).f)PAmGgFl޸'HlUУQf{*5HBX1gK\ ;ʠ{0Vy6tV@J/7׬y\+ti_hRDMk PzOxϼf5~I gsvDr,a\MwEBiJ̚Oh8F b qh@Lt.@<(aGB.:|Y PgƩ@>j; CҊj> #հt45f -Xtpg=5R:/<h= a[GǗ%4W|.Q #lQbKBue"H%oͯI+5PZiF m5Vj\_/IxrTQ鵻KGA"A! }~85d{_}=&9LCiiYϡHY#8Y,C"zeY'ɂftQi Nu[4F5:l%9k -eo⨨p{pT @q]f% -nv"@Ԅ=*_vo&r[x5SM"ծpK moߓ1lVL:\5=p?y?4CFbLZin R3!YCp=_O5#6nNw%u;xƈ/[5;LOnщZ]#➅"^,R\,Jkac$sՅ;sC)0V/x^0>glu z=k܇spڑf&,D<Lh@2J($"{i*byu -!hs+G]-S8=[h2aq;k֒x5#4@uEN?]5Z!L3c7&`W8 L75Ĉ+g=(&4 %=cH|)kNTٍRkaO=qL37gru织W{R㈡3v SEfR̐RfW Z|LL% -\+4s]:ʵR Sa8h ѧ&K6N9o Vɦ{ -'Ơ{IdA&YEbhf}!G蓜P=Խh.n4;Zb]◁g?DqFt$]n9 ?^0L68wMgvEA1!Kh׾kķ?OR9Ԥa^䎒֙$k9D ){LwVێ;kozXއe-a;U3ԛ=DT]@` 11MGI"AiXlCk}kDT Uj\'9|O1vCPjs #o+ꤑn|@Y+9j?"ubvk5a+$i -ml#Jl"}U H D8=*)# @,xUԤ0 H6cSW5-f1nLDr/rw٠̖#X~L3!/0>E@[݋TH]ѵK(eSVSFm$-$` $skfr:|v&*P]`2?o #8,USuK<4rcl~dCYzr3yrF@0d艽&< dI6QܪzWf?ĥ+~Q85}%7y|^5jlN"$(s\(1}ᅭV-'% "}aHL oϧ#fެŞ?RpdgK;ٔ} -8twpVƵdw2S&=GmVW =S05iWueXsI4ߘ͔h(0jGaXy,/}J쯝t -5f&C{7\K|cOM>(F̠I\#!Z(wjxL/xc1L2dan+RNvM]!c`m]a߉ h?bQXiv)dgS -xq/4tOOSs/zi;I35A[GV ٌҔh@5ҧ_I1[""hƵkrq=#~J hghs#Z5.ayA'v-UjS#B|`Nf (!ΐUPLEXKU"_C;!09U?w<>IԸΠC-1{0]=K %6 CCJٙ3c%ڮДMيo y)Qc0 Sbt$C׮ n{$e:VlǴ8 - xB0@6^9k7?ˏ?o?;?|;?V>??^&+B1 1%yV`WA4Dkq2k./:dlH+ϵ0BcWjhTޝu֌nhlgy'yQ"SCɺ}5 ϮI|DyhKHHq0•+=ٌ& n M9lC y)[tE)9-LIXw߻X|'15$^ڻ XZR3aIlf芩 -|lmYX>ܬ5RS%TP275uңםIdog-KChQw|olJڂ(B/q &?:tXN K6K7of8X`fz\tx-zYia~`e:&XXkf`6t<"ް&a7sgEVvJSgTqw6ϭ%%*PZ5oKT"e~Nq2j6]&%Jt Yn@J`Bcs.E=1w5J ڌ]#p'FJcX%+;@p%{{5vG5"3NVu1GM;fjhI:y_r$۔d V,{--[Gjy$\7`˴2?[ɇx-1Otƞjm< -e -[5my P=!*.u \R2Xl7ON26&@dthU @qw!}IC-M|5^uԑX0Ls]Y60*:/3` Ma Hf4cyIWH*L$*{T,1M;•ta{A+T<3mu-ƪf)( -讉rcީ.Q_NWtuRO1M > q^(y"l(ο\H=6'Hwiw1/}EHQb05:P'%&ݫk~[F|4;kϢ>S$3s#D]:+lq(4/+[}L+)5<IZ_FnЖ㳚M7*D&3ҵd__ 픑O?溬gtq.Vk%6#3=p&s7)gδeOץߢ5~h'4\eVﺎC(!٘5]׵x ʝ<3i/52ݥ8&V]fdN7e$)t1,o'DBo-~ɰr+QaqA -%q| P\iy?(BhO!U*W|rV6Zt,c.]Ņjl/@"kG[q7&Ԧ?[uE;?v–w^~bոUTҞ] +mޞ}3X@Ae5לpY -=ڜ>*f^2rw&Y~aFM{#^H_.jLޚW;K[Ns>kVވ)Duc8cM{Tb>#⌢$1ls} T\ X`A2Faf1"&+Y 7w$I/-6#v1QMg[lR^F5mX - /+5wpK DʕTfb-7)$[Pd)̒S5 -W/t׍7. -4 ƞ6YM۬Y[P$9-`vw1q8dMh4=9޷PF ұzL5k﷼3918˨[3;ꮜs5\)c\V)Xۇe\경}!!p~~h~|?+yj6+i7j3,b1]S\+l/Z!,Ȼk5~jb%&O<|X)1a\iJ׏t%[U_|ox~fw $0[jh;~#9T&<[R-ˎ3k=kb8ܪ .^ -+YYƭī6EY d)Vɇy! W:#}v#kԷH8YZcg+ڸ<\2LVWSy8ecGŶmgX^2\C H5?>m+'w8"ȖZ7uE[4l5R Vr-.'Lj1M,W uȾN@ &zy:3GsV%lO~V2(`OβrJ/'?3DYf?~^I)_P6[snx+s%oPΠ&r -؃'L/va  還=Odݯt~2#x _SADr3cl40qq,*ePsVz^wX;T!vF`ztD.Li._(gjFb{8-qnAjݘJ=%߇+sVC?$.#NM¡Amނ0v- C1*HVp'_bGqGٱ+FBD6m.JWRc졆h\ ;A{Vjyڹ P6h җn߱j^e^A͑uOO׈wUT -$Kd#@ɣՈ{1 Oj`8%|x1"cѥt+)MK^s0AUBe-@!) Zr;ŰKC=zV160(AjW TGjKFgVwpB(,M^, ZF6F㩡4KnLw a jS+^#& \s\ ārͪyKiDG1VԜQ>&I'BzW161&9̅v2C=2q,!}>4Լ'ɂZ^bTQ\ YN= - is[[r4~CW* - ']34zh5. o]}ՔH&p^IFLP&1:-T{c@yHaVP%\s7NNW%y:x'Oùlּ?A˜DtbgȟxdHW+[[j @ixFxĝ!GӒf.='}]V1 z]5>8NMX0y. 0Ѐd-ΕPHD351<8RC9ÙΎWc;S8=7uwdW||Q)j=Кgj:|:kYZ!t3b7$]תy'Fp/F65b6kkUhdПU"x,IM+U?',A0}sdO;z~򐠛b(7ܫ -J"PTH-_LΙto)1B(u:*'\+頎vNTC> bXm!ԤyWwzajDy߯dRB#cP5R$S Wj"14ڳ 3p#IN4a7@A 1a*e {O5Q7Ul9 ?^i0L68VMm+CZBBA`Q ܹ\BN=~=jEA!KLkjķ?OR{qPBy3JqZG>wrlR 7\{6tzzLDՑ}kbj‚F7?ߒcD1Dt~d/(E&ՏFD=_T p4ϏQ3 -X@~33|| tce|MԑwՄ5쒜 RhF 7vU$^oHG[FxC6Ζ -ĄS)JM:d36uUsW3¬~ fDSN7Oj"1l{ JoقWK7SK iljбs -6R0#:W %lho=6t D`ntΠ*1֫e:&|0>Ȣ\%9إ>/Iyp˳}Rn̐f wgS#{ƑiV# ]Xj܉&< dK6Qܪzת/q錁rv$঑ Mᅁ_{FMéVdyc%'^Jcu'ĺ 2*fl- gL]V6ͮ'Yyce[6lNʸ -YKĺ盳+ua"tD>p]$R2obJ 4Q h 5G0WJr mAX5k&BҼ =kꃢj\)qvT'čp -+5B<ӱ&LsӟUlwQ5XpkcG8V"B`1ڭ,2m4. 4yjB>^$ 75\^#t+D )}##lFbiJ\@+}WRו.\59p iھb0W%gfƖ'dk9ң~Ss'WbdY5wBѰ7~lƔ3bT7ij4y uNQu@朗'%1ܔnv;@c=,a: aդ)J_rjDJA DO>p7 ^WdNQy8X%Z dWX5y,N8ΠCo.a:*=CZ(lԻ CCJ#c%UC)2_i 8w2RF Q&3 0\O!r-b?WMpM-&)P[}"8PhܦƋ+5\ٰGGӯ~~ok/~۾};nǾi@ti'\"RuRbӽU{s3^oIvZ@tJ*|\u*k6I2`yOIפ 眚ui]l'-W,zm3'j:tPףla$m\oӆ06ӌ9L-⊈۹ ,L,,1[K]ua{yJ GӺ}D2)@ jql?WFu>Zkbj\]zqXIkL=ML+ba>M%38Fɰ:s8pywt)dZDr |@RQSfp =c;$;%2fb0EBO -@+ -\RdO JSt*!R10n UB>?YwU9b#hYL_ vXvZM QX -&c-sH߉q`~0^CD -FP3e42s^ ?<0w`̥t6[cf'FJ)0'B0s e17 Wz"T֋J栾kǃ0ɵ1ʇζ?aᜆu{-a>>oh+֪*~o$$l#&p;W650v38N0F2i2lRTs0-Erl,w; -vQvØ-ƀjOR?W*vlP?.>-05NQ[JYJ^#fO{{,k,/w|tgnFo`o˚ԭnbwW2@OOuUZ!cu=?x0heČX{kWjVrmm c\It{jѤ-47a _^u5s0FŻ'\ٷv~?qƽ[;^&RSַ`Ҽsk/o%ݍ%UmH*|$ @Xdƾ% Ez\ƛ"[ݷ)i&&"l&l%hIvi6MpAp(?#W{!.m2cudduSzO3_t3}7?-mcEב́{/9тhƕ.xSLUjyEcEl&mv* C N.i0XlD0?.uA“+)DdNh}ylYzK4fD+͂c($k`Bv 0 ;wq:U h>̑rd5Q;O*oh10`ἡ0'ռ0t0k aRrs:#S 骆 G=-qD/ A5BZb Yg (۽ Vv:iA0:"K)qw?y~hf"Jt(y <%OQ"ߨ3gCwԙcdc;ϙ`$gpf~>J -\@ (} 3.Ys[g<ÆiZcaP\$ҬzW־ H" h0H2V 畟Wi3[3l0V3XR SS݊틉Z pX%6pVw[dc8l]sϢ.kBo1V3/,LY/i)+z݇9p -3c7Shh1!ŝ~#S %sI_yHv8rVmd*za6qR>3t?g-0-BMa!X4Dd7[n?+Vbs5 +گsw+g)^쀉Bt6Y 񌲫3Lo֗|^w_\s$<ܕMբvSx-粕iO1|Qi5b]ʼnO݀SȱnaO2όx씂=ώzȔJ#; -nwg?/*+jCnjzk9?/b?G7Pa|/c'ט-'[ˎ7-[V [I/b+:߸D`ʾc<`I٤#gX/{@N|~.}<{/kh%\{TX[2Y',SmXg4y/~nyWBH9noP=seO.PΠ qcqV07Kb廻zk+}1Ym.Xe+sUDa\~HJ\|vb35Bju5"jdz_js<3ݷѯ/~amsj TOXTRETB0d&–A1àyaKxFI{ Ӱ+Je\GT_ +u]upfOF¦zFCrsؙ\'aGա_E/2F h0&9OO"yޔ(anq-aٲobYht ҝg sHVd%Xވ#Kq$xM_Z+ʂv3dSlcY.F<~M_䤭AkE&>:Kvb(^A(N7e`bf7e,;eA1.^*QWweBz=9>^wBJ w9CH5nyqqS|*+? yP1b4|=R2 k lI_,>_gMS:ln_hD]{%=v<ȧ=\ z%c"/{vC!9v;bJso:;FޝgtO>ews >KI "Au-uw%4;GY sIO9s_s=>y켞h 9rHřWwd…8V4Y3G9M&*gf 휫l}-Nn-Y Z@иHs'iPS(rWNƊОc_F=_- Io!qLփΗ<ݫ ld}ʗ ҴkeY_3mY<ؕYVܶ-'bP/soY7e0 -NP'e†BD|VEŒ4zWWC]bglL5l{X%qf(}wF)^"jU2ȟ|A4neI)$RTa{{/j1oo/mXk'ULekY m?DYx`KiF}oiɼe/NnKpoXK|e.jiZn?|m5U96WƲڎhDg4ƻڲhDעvΩ<ַ'aq8:chpH{}fx=72R5>v%qc}J(Yc"g^,)#h3|M  7 < "%J$ZEӥ*E0@h۽m4HU;щ(Ys dQ(޼bnP -7EvÛec5z4=Ҍa18G,A4wX! $"dPgהVS7hz"_+M08öIă-Mۥ1Y -[֑zBMy-%fQMu̘oIÄ^*Rk~ +H$z2J'q#^:B4;jpT"wVErfϣ0ܫw%.l$ h̔`1 %}QrW\å{5˥bra$\"O}g+jrPaD#Lک ^n1P]=Zr{ߚa8У1ΣA5' 룉O;a:tOh6eݮH/gy We`K)Ҟ#W{' \){i"I]+[K4]}4-)3?^s_3Hܷꭎ8H^ 0׷}M%M=U}-ؗU2ި׏eh#`Tmž :L3ޕǹ/wk"+lx:)T.=w,b/)# u` q=^iq1*^4.0"8pK3 g)k@je4]:AZ;6VwFPt4A82եgMv+C;ȢYU`}]3UXFh c_F1 Lft2;HCh+. Y,cKє as.1el<&s,q&NV4"Ύ%}3y׻˒PjTIwUJiٔX7lư^;L4w/7 Sw`f&~ endstream endobj 24 0 obj <>stream -Hʥ9axMU% 7 "#:0 s>+ow{vϪU+ezx++ӺGX+`ódKV2k^󕖫blxG[mYo\|WσIY=F/+aՖ}ԁT8nܘ|{F1˹>`;궦0@**19g`Rk^m~/?~ן^竽['s_ҍ_˛ןB rhO8Ǡgi;x:݅ K1j|3) -"$]fZH䵄Ib|灘 u i[,? S3D kM*1""Tr\Ud@TO}pcU9jCh3x91 B]I9V $`xH^aNkv ()>H3#MdLtn$[nncPXp`1I'fҌ8Ϩ?l~6neXhxaRjFvw5Q9ccarqZ-3占HGdY~q!7C- g{.! ]KQFLz7JHvZ]D2mW΃A֙}ڗ߹;0WBya$f/#c(R}ڻf'IbWZYV``\`ȒtI}scH^~Bf608]dszF}0)Tk,SCc'Ck!T 76CfA2RUEH -j;ZcTJ3S˜̄|Q:aYAAgIZ@P1SAYqaI|0P2ɆL5bG9aL  f8B[)z'Ub 1  sOeKr95v+dQK?6~Maah߈aMmNR;ug=3䆴B8t%6b&xV[)ɸ1~Gvcu{Zl(ڪwa5Vܫ:juqVYcP\ *);CPaI>~e!T/fW6wCYAIE:`XHpuɚN5o3 -D˚D|u-ˮDHSL:_ L Uu(TU -` -y^%5&[MAp"U[E u`moP2<eފֱepB3!R־p>C;kZ[Xz,OȢ^lddFy+z}*WcV=2hsRv7a@pju5s`,$WONje[ְyT?|!.r`JS)Hjyq9oC\A -Ыw>(,"Cl"y{A_h]yWSJCՙWbhXc o&NG CE^`vQ[U&M^W`Щ9D_kU07s]=!,.LEZZ`&u^h8 )LJ*YD՟xiB UN2鴓`y#@@FWlHf.bQLN"^z%!RzHVX] x4+Ì$0ĕB0wNZRj9|0Ms4+d4FcΆԶۺ4NiA/ineؑŞgMLWt:gk9 :( "j~ W -nF Ol FT!Pl@#idTh!fe,&oV|f̒9֒C9 -_:^ LLaDDܘe:X>E xw=OL`l^T!g (}G^ -(8asf[ՃY4cG=R+Fӊ\Ex>t+#Qf#51 bh}]ElWo f@BJhSFߚv^dc:|(no)#Z°,8dc4b5I2‰2 -a~ Xrذ;?X+ 5AQ/RpyY &~sI7p\M̌6j -YC;x.[f 1wcegJٹX N|zYhN!U='RF\R9W.GT\QX,6Ce/*? -b5j9^17j2_~_8PJ&yRKl}Mˎ;V'͖R%0-rEWeg'SKa%eV#>gǃ؃oM'Z.}@pڴv1Slc,z#._䤭]7r O4r:eA3.pUloEBnwuctŸLvH䵃H:.m*<>J7q즒[}BHE -uyRm❉p{u_>WrE,tC:C!=+e ߈~'0ywD\x0n*;n9rb.bOv#bXc3{ -xU ;\˼3^s04Lw?k -$ lz;=_q6!`M; A}A\Q&ob &U(P{9-oLv.`s/*g׻ᮀG԰<iF=hn9Te?—` 8+ Fdc]i;NGŦFC uJq/L4)ߺ5"Jj 2#DWL͠:gV\gcgb-z C*ZV8rU{zխ&Z/Ceh_1X3hw[@2 3y,18-n^Ֆғ+< g6~:&.l-Vy {QbؗKs5y}Kl3*ZsI-o#"eNX%74XѕHq.]Soi渝dD7{U._]vQؐhӽl.ٖHj8A.}ir"y5:y-:c7`SG@B2:% tu[@JxyqC,B̘hH fJPdFXLE8+M=UBC\R*9GVOٜ4(@2q*Uw34dS$v*SC\'^VQX/UTFC}bRpo UA&L(Sh;ndK#yG!4#^4T45{gAD}K.\cR{լ7oH|>sܥt, -iQ<_wïf?4-OsåуK]Uzp `Ѿ>YB#~O!NQ2]S yv[~K'ߡkLbva( O۽Lc-xϷ˶,?e]we^uQݗ*S<:bU -q|{;`- endstream endobj 6 0 obj [5 0 R] endobj 25 0 obj <> endobj xref 0 26 0000000000 65535 f -0000000016 00000 n -0000000144 00000 n -0000025173 00000 n -0000000000 00000 f -0000065496 00000 n -0000216446 00000 n -0000025224 00000 n -0000025562 00000 n -0000065799 00000 n -0000065686 00000 n -0000064745 00000 n -0000064935 00000 n -0000064983 00000 n -0000065570 00000 n -0000065601 00000 n -0000065872 00000 n -0000066155 00000 n -0000067473 00000 n -0000085125 00000 n -0000098214 00000 n -0000119906 00000 n -0000150354 00000 n -0000180599 00000 n -0000210222 00000 n -0000216469 00000 n -trailer <<636425E0298441309A895498F62E903C>]>> startxref 216662 %%EOF \ No newline at end of file diff --git a/mdns/zh_CN/_static/file.png b/mdns/zh_CN/_static/file.png deleted file mode 100644 index a858a410e..000000000 Binary files a/mdns/zh_CN/_static/file.png and /dev/null differ diff --git a/mdns/zh_CN/_static/jquery-3.5.1.js b/mdns/zh_CN/_static/jquery-3.5.1.js deleted file mode 100644 index 50937333b..000000000 --- a/mdns/zh_CN/_static/jquery-3.5.1.js +++ /dev/null @@ -1,10872 +0,0 @@ -/*! - * jQuery JavaScript Library v3.5.1 - * https://jquery.com/ - * - * Includes Sizzle.js - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors - * Released under the MIT license - * https://jquery.org/license - * - * Date: 2020-05-04T22:49Z - */ -( function( global, factory ) { - - "use strict"; - - if ( typeof module === "object" && typeof module.exports === "object" ) { - - // For CommonJS and CommonJS-like environments where a proper `window` - // is present, execute the factory and get jQuery. - // For environments that do not have a `window` with a `document` - // (such as Node.js), expose a factory as module.exports. - // This accentuates the need for the creation of a real `window`. - // e.g. var jQuery = require("jquery")(window); - // See ticket #14549 for more info. - module.exports = global.document ? - factory( global, true ) : - function( w ) { - if ( !w.document ) { - throw new Error( "jQuery requires a window with a document" ); - } - return factory( w ); - }; - } else { - factory( global ); - } - -// Pass this if window is not defined yet -} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { - -// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 -// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode -// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common -// enough that all such attempts are guarded in a try block. -"use strict"; - -var arr = []; - -var getProto = Object.getPrototypeOf; - -var slice = arr.slice; - -var flat = arr.flat ? function( array ) { - return arr.flat.call( array ); -} : function( array ) { - return arr.concat.apply( [], array ); -}; - - -var push = arr.push; - -var indexOf = arr.indexOf; - -var class2type = {}; - -var toString = class2type.toString; - -var hasOwn = class2type.hasOwnProperty; - -var fnToString = hasOwn.toString; - -var ObjectFunctionString = fnToString.call( Object ); - -var support = {}; - -var isFunction = function isFunction( obj ) { - - // Support: Chrome <=57, Firefox <=52 - // In some browsers, typeof returns "function" for HTML elements - // (i.e., `typeof document.createElement( "object" ) === "function"`). - // We don't want to classify *any* DOM node as a function. - return typeof obj === "function" && typeof obj.nodeType !== "number"; - }; - - -var isWindow = function isWindow( obj ) { - return obj != null && obj === obj.window; - }; - - -var document = window.document; - - - - var preservedScriptAttributes = { - type: true, - src: true, - nonce: true, - noModule: true - }; - - function DOMEval( code, node, doc ) { - doc = doc || document; - - var i, val, - script = doc.createElement( "script" ); - - script.text = code; - if ( node ) { - for ( i in preservedScriptAttributes ) { - - // Support: Firefox 64+, Edge 18+ - // Some browsers don't support the "nonce" property on scripts. - // On the other hand, just using `getAttribute` is not enough as - // the `nonce` attribute is reset to an empty string whenever it - // becomes browsing-context connected. - // See https://github.com/whatwg/html/issues/2369 - // See https://html.spec.whatwg.org/#nonce-attributes - // The `node.getAttribute` check was added for the sake of - // `jQuery.globalEval` so that it can fake a nonce-containing node - // via an object. - val = node[ i ] || node.getAttribute && node.getAttribute( i ); - if ( val ) { - script.setAttribute( i, val ); - } - } - } - doc.head.appendChild( script ).parentNode.removeChild( script ); - } - - -function toType( obj ) { - if ( obj == null ) { - return obj + ""; - } - - // Support: Android <=2.3 only (functionish RegExp) - return typeof obj === "object" || typeof obj === "function" ? - class2type[ toString.call( obj ) ] || "object" : - typeof obj; -} -/* global Symbol */ -// Defining this global in .eslintrc.json would create a danger of using the global -// unguarded in another place, it seems safer to define global only for this module - - - -var - version = "3.5.1", - - // Define a local copy of jQuery - jQuery = function( selector, context ) { - - // The jQuery object is actually just the init constructor 'enhanced' - // Need init if jQuery is called (just allow error to be thrown if not included) - return new jQuery.fn.init( selector, context ); - }; - -jQuery.fn = jQuery.prototype = { - - // The current version of jQuery being used - jquery: version, - - constructor: jQuery, - - // The default length of a jQuery object is 0 - length: 0, - - toArray: function() { - return slice.call( this ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - - // Return all the elements in a clean array - if ( num == null ) { - return slice.call( this ); - } - - // Return just the one element from the set - return num < 0 ? this[ num + this.length ] : this[ num ]; - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems ) { - - // Build a new jQuery matched element set - var ret = jQuery.merge( this.constructor(), elems ); - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - each: function( callback ) { - return jQuery.each( this, callback ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map( this, function( elem, i ) { - return callback.call( elem, i, elem ); - } ) ); - }, - - slice: function() { - return this.pushStack( slice.apply( this, arguments ) ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - even: function() { - return this.pushStack( jQuery.grep( this, function( _elem, i ) { - return ( i + 1 ) % 2; - } ) ); - }, - - odd: function() { - return this.pushStack( jQuery.grep( this, function( _elem, i ) { - return i % 2; - } ) ); - }, - - eq: function( i ) { - var len = this.length, - j = +i + ( i < 0 ? len : 0 ); - return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); - }, - - end: function() { - return this.prevObject || this.constructor(); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: arr.sort, - splice: arr.splice -}; - -jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, - target = arguments[ 0 ] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - - // Skip the boolean and the target - target = arguments[ i ] || {}; - i++; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !isFunction( target ) ) { - target = {}; - } - - // Extend jQuery itself if only one argument is passed - if ( i === length ) { - target = this; - i--; - } - - for ( ; i < length; i++ ) { - - // Only deal with non-null/undefined values - if ( ( options = arguments[ i ] ) != null ) { - - // Extend the base object - for ( name in options ) { - copy = options[ name ]; - - // Prevent Object.prototype pollution - // Prevent never-ending loop - if ( name === "__proto__" || target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject( copy ) || - ( copyIsArray = Array.isArray( copy ) ) ) ) { - src = target[ name ]; - - // Ensure proper type for the source value - if ( copyIsArray && !Array.isArray( src ) ) { - clone = []; - } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { - clone = {}; - } else { - clone = src; - } - copyIsArray = false; - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend( { - - // Unique for each copy of jQuery on the page - expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), - - // Assume jQuery is ready without the ready module - isReady: true, - - error: function( msg ) { - throw new Error( msg ); - }, - - noop: function() {}, - - isPlainObject: function( obj ) { - var proto, Ctor; - - // Detect obvious negatives - // Use toString instead of jQuery.type to catch host objects - if ( !obj || toString.call( obj ) !== "[object Object]" ) { - return false; - } - - proto = getProto( obj ); - - // Objects with no prototype (e.g., `Object.create( null )`) are plain - if ( !proto ) { - return true; - } - - // Objects with prototype are plain iff they were constructed by a global Object function - Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; - return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; - }, - - isEmptyObject: function( obj ) { - var name; - - for ( name in obj ) { - return false; - } - return true; - }, - - // Evaluates a script in a provided context; falls back to the global one - // if not specified. - globalEval: function( code, options, doc ) { - DOMEval( code, { nonce: options && options.nonce }, doc ); - }, - - each: function( obj, callback ) { - var length, i = 0; - - if ( isArrayLike( obj ) ) { - length = obj.length; - for ( ; i < length; i++ ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } else { - for ( i in obj ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } - - return obj; - }, - - // results is for internal usage only - makeArray: function( arr, results ) { - var ret = results || []; - - if ( arr != null ) { - if ( isArrayLike( Object( arr ) ) ) { - jQuery.merge( ret, - typeof arr === "string" ? - [ arr ] : arr - ); - } else { - push.call( ret, arr ); - } - } - - return ret; - }, - - inArray: function( elem, arr, i ) { - return arr == null ? -1 : indexOf.call( arr, elem, i ); - }, - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - merge: function( first, second ) { - var len = +second.length, - j = 0, - i = first.length; - - for ( ; j < len; j++ ) { - first[ i++ ] = second[ j ]; - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, invert ) { - var callbackInverse, - matches = [], - i = 0, - length = elems.length, - callbackExpect = !invert; - - // Go through the array, only saving the items - // that pass the validator function - for ( ; i < length; i++ ) { - callbackInverse = !callback( elems[ i ], i ); - if ( callbackInverse !== callbackExpect ) { - matches.push( elems[ i ] ); - } - } - - return matches; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var length, value, - i = 0, - ret = []; - - // Go through the array, translating each of the items to their new values - if ( isArrayLike( elems ) ) { - length = elems.length; - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - - // Go through every key on the object, - } else { - for ( i in elems ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - } - - // Flatten any nested arrays - return flat( ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // jQuery.support is not used in Core but other projects attach their - // properties to it so it needs to exist. - support: support -} ); - -if ( typeof Symbol === "function" ) { - jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; -} - -// Populate the class2type map -jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), -function( _i, name ) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -} ); - -function isArrayLike( obj ) { - - // Support: real iOS 8.2 only (not reproducible in simulator) - // `in` check used to prevent JIT error (gh-2145) - // hasOwn isn't used here due to false negatives - // regarding Nodelist length in IE - var length = !!obj && "length" in obj && obj.length, - type = toType( obj ); - - if ( isFunction( obj ) || isWindow( obj ) ) { - return false; - } - - return type === "array" || length === 0 || - typeof length === "number" && length > 0 && ( length - 1 ) in obj; -} -var Sizzle = -/*! - * Sizzle CSS Selector Engine v2.3.5 - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors - * Released under the MIT license - * https://js.foundation/ - * - * Date: 2020-03-14 - */ -( function( window ) { -var i, - support, - Expr, - getText, - isXML, - tokenize, - compile, - select, - outermostContext, - sortInput, - hasDuplicate, - - // Local document vars - setDocument, - document, - docElem, - documentIsHTML, - rbuggyQSA, - rbuggyMatches, - matches, - contains, - - // Instance-specific data - expando = "sizzle" + 1 * new Date(), - preferredDoc = window.document, - dirruns = 0, - done = 0, - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - nonnativeSelectorCache = createCache(), - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - } - return 0; - }, - - // Instance methods - hasOwn = ( {} ).hasOwnProperty, - arr = [], - pop = arr.pop, - pushNative = arr.push, - push = arr.push, - slice = arr.slice, - - // Use a stripped-down indexOf as it's faster than native - // https://jsperf.com/thor-indexof-vs-for/5 - indexOf = function( list, elem ) { - var i = 0, - len = list.length; - for ( ; i < len; i++ ) { - if ( list[ i ] === elem ) { - return i; - } - } - return -1; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" + - "ismap|loop|multiple|open|readonly|required|scoped", - - // Regular expressions - - // http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - - // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram - identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + - "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", - - // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + - - // Operator (capture 2) - "*([*^$|!~]?=)" + whitespace + - - // "Attribute values must be CSS identifiers [capture 5] - // or strings [capture 3 or capture 4]" - "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + - whitespace + "*\\]", - - pseudos = ":(" + identifier + ")(?:\\((" + - - // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: - // 1. quoted (capture 3; capture 4 or capture 5) - "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + - - // 2. simple (capture 6) - "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + - - // 3. anything else (capture 2) - ".*" + - ")\\)|)", - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rwhitespace = new RegExp( whitespace + "+", "g" ), - rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + - whitespace + "+$", "g" ), - - rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + - "*" ), - rdescend = new RegExp( whitespace + "|>" ), - - rpseudo = new RegExp( pseudos ), - ridentifier = new RegExp( "^" + identifier + "$" ), - - matchExpr = { - "ID": new RegExp( "^#(" + identifier + ")" ), - "CLASS": new RegExp( "^\\.(" + identifier + ")" ), - "TAG": new RegExp( "^(" + identifier + "|[*])" ), - "ATTR": new RegExp( "^" + attributes ), - "PSEUDO": new RegExp( "^" + pseudos ), - "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + - whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + - whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), - - // For use in libraries implementing .is() - // We use this for POS matching in `select` - "needsContext": new RegExp( "^" + whitespace + - "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + - "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) - }, - - rhtml = /HTML$/i, - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - - rnative = /^[^{]+\{\s*\[native \w/, - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - - rsibling = /[+~]/, - - // CSS escapes - // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ), - funescape = function( escape, nonHex ) { - var high = "0x" + escape.slice( 1 ) - 0x10000; - - return nonHex ? - - // Strip the backslash prefix from a non-hex escape sequence - nonHex : - - // Replace a hexadecimal escape sequence with the encoded Unicode code point - // Support: IE <=11+ - // For values outside the Basic Multilingual Plane (BMP), manually construct a - // surrogate pair - high < 0 ? - String.fromCharCode( high + 0x10000 ) : - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }, - - // CSS string/identifier serialization - // https://drafts.csswg.org/cssom/#common-serializing-idioms - rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, - fcssescape = function( ch, asCodePoint ) { - if ( asCodePoint ) { - - // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER - if ( ch === "\0" ) { - return "\uFFFD"; - } - - // Control characters and (dependent upon position) numbers get escaped as code points - return ch.slice( 0, -1 ) + "\\" + - ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; - } - - // Other potentially-special ASCII characters get backslash-escaped - return "\\" + ch; - }, - - // Used for iframes - // See setDocument() - // Removing the function wrapper causes a "Permission Denied" - // error in IE - unloadHandler = function() { - setDocument(); - }, - - inDisabledFieldset = addCombinator( - function( elem ) { - return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; - }, - { dir: "parentNode", next: "legend" } - ); - -// Optimize for push.apply( _, NodeList ) -try { - push.apply( - ( arr = slice.call( preferredDoc.childNodes ) ), - preferredDoc.childNodes - ); - - // Support: Android<4.0 - // Detect silently failing push.apply - // eslint-disable-next-line no-unused-expressions - arr[ preferredDoc.childNodes.length ].nodeType; -} catch ( e ) { - push = { apply: arr.length ? - - // Leverage slice if possible - function( target, els ) { - pushNative.apply( target, slice.call( els ) ); - } : - - // Support: IE<9 - // Otherwise append directly - function( target, els ) { - var j = target.length, - i = 0; - - // Can't trust NodeList.length - while ( ( target[ j++ ] = els[ i++ ] ) ) {} - target.length = j - 1; - } - }; -} - -function Sizzle( selector, context, results, seed ) { - var m, i, elem, nid, match, groups, newSelector, - newContext = context && context.ownerDocument, - - // nodeType defaults to 9, since context defaults to document - nodeType = context ? context.nodeType : 9; - - results = results || []; - - // Return early from calls with invalid selector or context - if ( typeof selector !== "string" || !selector || - nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { - - return results; - } - - // Try to shortcut find operations (as opposed to filters) in HTML documents - if ( !seed ) { - setDocument( context ); - context = context || document; - - if ( documentIsHTML ) { - - // If the selector is sufficiently simple, try using a "get*By*" DOM method - // (excepting DocumentFragment context, where the methods don't exist) - if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { - - // ID selector - if ( ( m = match[ 1 ] ) ) { - - // Document context - if ( nodeType === 9 ) { - if ( ( elem = context.getElementById( m ) ) ) { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( elem.id === m ) { - results.push( elem ); - return results; - } - } else { - return results; - } - - // Element context - } else { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( newContext && ( elem = newContext.getElementById( m ) ) && - contains( context, elem ) && - elem.id === m ) { - - results.push( elem ); - return results; - } - } - - // Type selector - } else if ( match[ 2 ] ) { - push.apply( results, context.getElementsByTagName( selector ) ); - return results; - - // Class selector - } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName && - context.getElementsByClassName ) { - - push.apply( results, context.getElementsByClassName( m ) ); - return results; - } - } - - // Take advantage of querySelectorAll - if ( support.qsa && - !nonnativeSelectorCache[ selector + " " ] && - ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) && - - // Support: IE 8 only - // Exclude object elements - ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) { - - newSelector = selector; - newContext = context; - - // qSA considers elements outside a scoping root when evaluating child or - // descendant combinators, which is not what we want. - // In such cases, we work around the behavior by prefixing every selector in the - // list with an ID selector referencing the scope context. - // The technique has to be used as well when a leading combinator is used - // as such selectors are not recognized by querySelectorAll. - // Thanks to Andrew Dupont for this technique. - if ( nodeType === 1 && - ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) { - - // Expand context for sibling selectors - newContext = rsibling.test( selector ) && testContext( context.parentNode ) || - context; - - // We can use :scope instead of the ID hack if the browser - // supports it & if we're not changing the context. - if ( newContext !== context || !support.scope ) { - - // Capture the context ID, setting it first if necessary - if ( ( nid = context.getAttribute( "id" ) ) ) { - nid = nid.replace( rcssescape, fcssescape ); - } else { - context.setAttribute( "id", ( nid = expando ) ); - } - } - - // Prefix every selector in the list - groups = tokenize( selector ); - i = groups.length; - while ( i-- ) { - groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + - toSelector( groups[ i ] ); - } - newSelector = groups.join( "," ); - } - - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch ( qsaError ) { - nonnativeSelectorCache( selector, true ); - } finally { - if ( nid === expando ) { - context.removeAttribute( "id" ); - } - } - } - } - } - - // All others - return select( selector.replace( rtrim, "$1" ), context, results, seed ); -} - -/** - * Create key-value caches of limited size - * @returns {function(string, object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ -function createCache() { - var keys = []; - - function cache( key, value ) { - - // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) - if ( keys.push( key + " " ) > Expr.cacheLength ) { - - // Only keep the most recent entries - delete cache[ keys.shift() ]; - } - return ( cache[ key + " " ] = value ); - } - return cache; -} - -/** - * Mark a function for special use by Sizzle - * @param {Function} fn The function to mark - */ -function markFunction( fn ) { - fn[ expando ] = true; - return fn; -} - -/** - * Support testing using an element - * @param {Function} fn Passed the created element and returns a boolean result - */ -function assert( fn ) { - var el = document.createElement( "fieldset" ); - - try { - return !!fn( el ); - } catch ( e ) { - return false; - } finally { - - // Remove from its parent by default - if ( el.parentNode ) { - el.parentNode.removeChild( el ); - } - - // release memory in IE - el = null; - } -} - -/** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ -function addHandle( attrs, handler ) { - var arr = attrs.split( "|" ), - i = arr.length; - - while ( i-- ) { - Expr.attrHandle[ arr[ i ] ] = handler; - } -} - -/** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ -function siblingCheck( a, b ) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && - a.sourceIndex - b.sourceIndex; - - // Use IE sourceIndex if available on both nodes - if ( diff ) { - return diff; - } - - // Check if b follows a - if ( cur ) { - while ( ( cur = cur.nextSibling ) ) { - if ( cur === b ) { - return -1; - } - } - } - - return a ? 1 : -1; -} - -/** - * Returns a function to use in pseudos for input types - * @param {String} type - */ -function createInputPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ -function createButtonPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return ( name === "input" || name === "button" ) && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for :enabled/:disabled - * @param {Boolean} disabled true for :disabled; false for :enabled - */ -function createDisabledPseudo( disabled ) { - - // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable - return function( elem ) { - - // Only certain elements can match :enabled or :disabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled - if ( "form" in elem ) { - - // Check for inherited disabledness on relevant non-disabled elements: - // * listed form-associated elements in a disabled fieldset - // https://html.spec.whatwg.org/multipage/forms.html#category-listed - // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled - // * option elements in a disabled optgroup - // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled - // All such elements have a "form" property. - if ( elem.parentNode && elem.disabled === false ) { - - // Option elements defer to a parent optgroup if present - if ( "label" in elem ) { - if ( "label" in elem.parentNode ) { - return elem.parentNode.disabled === disabled; - } else { - return elem.disabled === disabled; - } - } - - // Support: IE 6 - 11 - // Use the isDisabled shortcut property to check for disabled fieldset ancestors - return elem.isDisabled === disabled || - - // Where there is no isDisabled, check manually - /* jshint -W018 */ - elem.isDisabled !== !disabled && - inDisabledFieldset( elem ) === disabled; - } - - return elem.disabled === disabled; - - // Try to winnow out elements that can't be disabled before trusting the disabled property. - // Some victims get caught in our net (label, legend, menu, track), but it shouldn't - // even exist on them, let alone have a boolean value. - } else if ( "label" in elem ) { - return elem.disabled === disabled; - } - - // Remaining elements are neither :enabled nor :disabled - return false; - }; -} - -/** - * Returns a function to use in pseudos for positionals - * @param {Function} fn - */ -function createPositionalPseudo( fn ) { - return markFunction( function( argument ) { - argument = +argument; - return markFunction( function( seed, matches ) { - var j, - matchIndexes = fn( [], seed.length, argument ), - i = matchIndexes.length; - - // Match elements found at the specified indexes - while ( i-- ) { - if ( seed[ ( j = matchIndexes[ i ] ) ] ) { - seed[ j ] = !( matches[ j ] = seed[ j ] ); - } - } - } ); - } ); -} - -/** - * Checks a node for validity as a Sizzle context - * @param {Element|Object=} context - * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value - */ -function testContext( context ) { - return context && typeof context.getElementsByTagName !== "undefined" && context; -} - -// Expose support vars for convenience -support = Sizzle.support = {}; - -/** - * Detects XML nodes - * @param {Element|Object} elem An element or a document - * @returns {Boolean} True iff elem is a non-HTML XML node - */ -isXML = Sizzle.isXML = function( elem ) { - var namespace = elem.namespaceURI, - docElem = ( elem.ownerDocument || elem ).documentElement; - - // Support: IE <=8 - // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes - // https://bugs.jquery.com/ticket/4833 - return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); -}; - -/** - * Sets document-related variables once based on the current document - * @param {Element|Object} [doc] An element or document object to use to set the document - * @returns {Object} Returns the current document - */ -setDocument = Sizzle.setDocument = function( node ) { - var hasCompare, subWindow, - doc = node ? node.ownerDocument || node : preferredDoc; - - // Return early if doc is invalid or already selected - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { - return document; - } - - // Update global variables - document = doc; - docElem = document.documentElement; - documentIsHTML = !isXML( document ); - - // Support: IE 9 - 11+, Edge 12 - 18+ - // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( preferredDoc != document && - ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { - - // Support: IE 11, Edge - if ( subWindow.addEventListener ) { - subWindow.addEventListener( "unload", unloadHandler, false ); - - // Support: IE 9 - 10 only - } else if ( subWindow.attachEvent ) { - subWindow.attachEvent( "onunload", unloadHandler ); - } - } - - // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only, - // Safari 4 - 5 only, Opera <=11.6 - 12.x only - // IE/Edge & older browsers don't support the :scope pseudo-class. - // Support: Safari 6.0 only - // Safari 6.0 supports :scope but it's an alias of :root there. - support.scope = assert( function( el ) { - docElem.appendChild( el ).appendChild( document.createElement( "div" ) ); - return typeof el.querySelectorAll !== "undefined" && - !el.querySelectorAll( ":scope fieldset div" ).length; - } ); - - /* Attributes - ---------------------------------------------------------------------- */ - - // Support: IE<8 - // Verify that getAttribute really returns attributes and not properties - // (excepting IE8 booleans) - support.attributes = assert( function( el ) { - el.className = "i"; - return !el.getAttribute( "className" ); - } ); - - /* getElement(s)By* - ---------------------------------------------------------------------- */ - - // Check if getElementsByTagName("*") returns only elements - support.getElementsByTagName = assert( function( el ) { - el.appendChild( document.createComment( "" ) ); - return !el.getElementsByTagName( "*" ).length; - } ); - - // Support: IE<9 - support.getElementsByClassName = rnative.test( document.getElementsByClassName ); - - // Support: IE<10 - // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programmatically-set names, - // so use a roundabout getElementsByName test - support.getById = assert( function( el ) { - docElem.appendChild( el ).id = expando; - return !document.getElementsByName || !document.getElementsByName( expando ).length; - } ); - - // ID filter and find - if ( support.getById ) { - Expr.filter[ "ID" ] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - return elem.getAttribute( "id" ) === attrId; - }; - }; - Expr.find[ "ID" ] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var elem = context.getElementById( id ); - return elem ? [ elem ] : []; - } - }; - } else { - Expr.filter[ "ID" ] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - var node = typeof elem.getAttributeNode !== "undefined" && - elem.getAttributeNode( "id" ); - return node && node.value === attrId; - }; - }; - - // Support: IE 6 - 7 only - // getElementById is not reliable as a find shortcut - Expr.find[ "ID" ] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var node, i, elems, - elem = context.getElementById( id ); - - if ( elem ) { - - // Verify the id attribute - node = elem.getAttributeNode( "id" ); - if ( node && node.value === id ) { - return [ elem ]; - } - - // Fall back on getElementsByName - elems = context.getElementsByName( id ); - i = 0; - while ( ( elem = elems[ i++ ] ) ) { - node = elem.getAttributeNode( "id" ); - if ( node && node.value === id ) { - return [ elem ]; - } - } - } - - return []; - } - }; - } - - // Tag - Expr.find[ "TAG" ] = support.getElementsByTagName ? - function( tag, context ) { - if ( typeof context.getElementsByTagName !== "undefined" ) { - return context.getElementsByTagName( tag ); - - // DocumentFragment nodes don't have gEBTN - } else if ( support.qsa ) { - return context.querySelectorAll( tag ); - } - } : - - function( tag, context ) { - var elem, - tmp = [], - i = 0, - - // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too - results = context.getElementsByTagName( tag ); - - // Filter out possible comments - if ( tag === "*" ) { - while ( ( elem = results[ i++ ] ) ) { - if ( elem.nodeType === 1 ) { - tmp.push( elem ); - } - } - - return tmp; - } - return results; - }; - - // Class - Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) { - if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { - return context.getElementsByClassName( className ); - } - }; - - /* QSA/matchesSelector - ---------------------------------------------------------------------- */ - - // QSA and matchesSelector support - - // matchesSelector(:active) reports false when true (IE9/Opera 11.5) - rbuggyMatches = []; - - // qSa(:focus) reports false when true (Chrome 21) - // We allow this because of a bug in IE8/9 that throws an error - // whenever `document.activeElement` is accessed on an iframe - // So, we allow :focus to pass through QSA all the time to avoid the IE error - // See https://bugs.jquery.com/ticket/13378 - rbuggyQSA = []; - - if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) { - - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert( function( el ) { - - var input; - - // Select is set to empty string on purpose - // This is to test IE's treatment of not explicitly - // setting a boolean content attribute, - // since its presence should be enough - // https://bugs.jquery.com/ticket/12359 - docElem.appendChild( el ).innerHTML = "" + - ""; - - // Support: IE8, Opera 11-12.16 - // Nothing should be selected when empty strings follow ^= or $= or *= - // The test attribute must be unknown in Opera but "safe" for WinRT - // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section - if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) { - rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); - } - - // Support: IE8 - // Boolean attributes and "value" are not treated correctly - if ( !el.querySelectorAll( "[selected]" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); - } - - // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ - if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { - rbuggyQSA.push( "~=" ); - } - - // Support: IE 11+, Edge 15 - 18+ - // IE 11/Edge don't find elements on a `[name='']` query in some cases. - // Adding a temporary attribute to the document before the selection works - // around the issue. - // Interestingly, IE 10 & older don't seem to have the issue. - input = document.createElement( "input" ); - input.setAttribute( "name", "" ); - el.appendChild( input ); - if ( !el.querySelectorAll( "[name='']" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + - whitespace + "*(?:''|\"\")" ); - } - - // Webkit/Opera - :checked should return selected option elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - // IE8 throws error here and will not see later tests - if ( !el.querySelectorAll( ":checked" ).length ) { - rbuggyQSA.push( ":checked" ); - } - - // Support: Safari 8+, iOS 8+ - // https://bugs.webkit.org/show_bug.cgi?id=136851 - // In-page `selector#id sibling-combinator selector` fails - if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { - rbuggyQSA.push( ".#.+[+~]" ); - } - - // Support: Firefox <=3.6 - 5 only - // Old Firefox doesn't throw on a badly-escaped identifier. - el.querySelectorAll( "\\\f" ); - rbuggyQSA.push( "[\\r\\n\\f]" ); - } ); - - assert( function( el ) { - el.innerHTML = "" + - ""; - - // Support: Windows 8 Native Apps - // The type and name attributes are restricted during .innerHTML assignment - var input = document.createElement( "input" ); - input.setAttribute( "type", "hidden" ); - el.appendChild( input ).setAttribute( "name", "D" ); - - // Support: IE8 - // Enforce case-sensitivity of name attribute - if ( el.querySelectorAll( "[name=d]" ).length ) { - rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); - } - - // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) - // IE8 throws error here and will not see later tests - if ( el.querySelectorAll( ":enabled" ).length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: IE9-11+ - // IE's :disabled selector does not pick up the children of disabled fieldsets - docElem.appendChild( el ).disabled = true; - if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: Opera 10 - 11 only - // Opera 10-11 does not throw on post-comma invalid pseudos - el.querySelectorAll( "*,:x" ); - rbuggyQSA.push( ",.*:" ); - } ); - } - - if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches || - docElem.webkitMatchesSelector || - docElem.mozMatchesSelector || - docElem.oMatchesSelector || - docElem.msMatchesSelector ) ) ) ) { - - assert( function( el ) { - - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call( el, "*" ); - - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( el, "[s!='']:x" ); - rbuggyMatches.push( "!=", pseudos ); - } ); - } - - rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); - rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) ); - - /* Contains - ---------------------------------------------------------------------- */ - hasCompare = rnative.test( docElem.compareDocumentPosition ); - - // Element contains another - // Purposefully self-exclusive - // As in, an element does not contain itself - contains = hasCompare || rnative.test( docElem.contains ) ? - function( a, b ) { - var adown = a.nodeType === 9 ? a.documentElement : a, - bup = b && b.parentNode; - return a === bup || !!( bup && bup.nodeType === 1 && ( - adown.contains ? - adown.contains( bup ) : - a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 - ) ); - } : - function( a, b ) { - if ( b ) { - while ( ( b = b.parentNode ) ) { - if ( b === a ) { - return true; - } - } - } - return false; - }; - - /* Sorting - ---------------------------------------------------------------------- */ - - // Document order sorting - sortOrder = hasCompare ? - function( a, b ) { - - // Flag for duplicate removal - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - // Sort on method existence if only one input has compareDocumentPosition - var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; - if ( compare ) { - return compare; - } - - // Calculate position if both inputs belong to the same document - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? - a.compareDocumentPosition( b ) : - - // Otherwise we know they are disconnected - 1; - - // Disconnected nodes - if ( compare & 1 || - ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { - - // Choose the first element that is related to our preferred document - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( a == document || a.ownerDocument == preferredDoc && - contains( preferredDoc, a ) ) { - return -1; - } - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( b == document || b.ownerDocument == preferredDoc && - contains( preferredDoc, b ) ) { - return 1; - } - - // Maintain original order - return sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - } - - return compare & 4 ? -1 : 1; - } : - function( a, b ) { - - // Exit early if the nodes are identical - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - var cur, - i = 0, - aup = a.parentNode, - bup = b.parentNode, - ap = [ a ], - bp = [ b ]; - - // Parentless nodes are either documents or disconnected - if ( !aup || !bup ) { - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - /* eslint-disable eqeqeq */ - return a == document ? -1 : - b == document ? 1 : - /* eslint-enable eqeqeq */ - aup ? -1 : - bup ? 1 : - sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - - // If the nodes are siblings, we can do a quick check - } else if ( aup === bup ) { - return siblingCheck( a, b ); - } - - // Otherwise we need full lists of their ancestors for comparison - cur = a; - while ( ( cur = cur.parentNode ) ) { - ap.unshift( cur ); - } - cur = b; - while ( ( cur = cur.parentNode ) ) { - bp.unshift( cur ); - } - - // Walk down the tree looking for a discrepancy - while ( ap[ i ] === bp[ i ] ) { - i++; - } - - return i ? - - // Do a sibling check if the nodes have a common ancestor - siblingCheck( ap[ i ], bp[ i ] ) : - - // Otherwise nodes in our document sort first - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - /* eslint-disable eqeqeq */ - ap[ i ] == preferredDoc ? -1 : - bp[ i ] == preferredDoc ? 1 : - /* eslint-enable eqeqeq */ - 0; - }; - - return document; -}; - -Sizzle.matches = function( expr, elements ) { - return Sizzle( expr, null, null, elements ); -}; - -Sizzle.matchesSelector = function( elem, expr ) { - setDocument( elem ); - - if ( support.matchesSelector && documentIsHTML && - !nonnativeSelectorCache[ expr + " " ] && - ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && - ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { - - try { - var ret = matches.call( elem, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || support.disconnectedMatch || - - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11 ) { - return ret; - } - } catch ( e ) { - nonnativeSelectorCache( expr, true ); - } - } - - return Sizzle( expr, document, null, [ elem ] ).length > 0; -}; - -Sizzle.contains = function( context, elem ) { - - // Set document vars if needed - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( ( context.ownerDocument || context ) != document ) { - setDocument( context ); - } - return contains( context, elem ); -}; - -Sizzle.attr = function( elem, name ) { - - // Set document vars if needed - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( ( elem.ownerDocument || elem ) != document ) { - setDocument( elem ); - } - - var fn = Expr.attrHandle[ name.toLowerCase() ], - - // Don't get fooled by Object.prototype properties (jQuery #13807) - val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? - fn( elem, name, !documentIsHTML ) : - undefined; - - return val !== undefined ? - val : - support.attributes || !documentIsHTML ? - elem.getAttribute( name ) : - ( val = elem.getAttributeNode( name ) ) && val.specified ? - val.value : - null; -}; - -Sizzle.escape = function( sel ) { - return ( sel + "" ).replace( rcssescape, fcssescape ); -}; - -Sizzle.error = function( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); -}; - -/** - * Document sorting and removing duplicates - * @param {ArrayLike} results - */ -Sizzle.uniqueSort = function( results ) { - var elem, - duplicates = [], - j = 0, - i = 0; - - // Unless we *know* we can detect duplicates, assume their presence - hasDuplicate = !support.detectDuplicates; - sortInput = !support.sortStable && results.slice( 0 ); - results.sort( sortOrder ); - - if ( hasDuplicate ) { - while ( ( elem = results[ i++ ] ) ) { - if ( elem === results[ i ] ) { - j = duplicates.push( i ); - } - } - while ( j-- ) { - results.splice( duplicates[ j ], 1 ); - } - } - - // Clear input after sorting to release objects - // See https://github.com/jquery/sizzle/pull/225 - sortInput = null; - - return results; -}; - -/** - * Utility function for retrieving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ -getText = Sizzle.getText = function( elem ) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if ( !nodeType ) { - - // If no nodeType, this is expected to be an array - while ( ( node = elem[ i++ ] ) ) { - - // Do not traverse comment nodes - ret += getText( node ); - } - } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { - - // Use textContent for elements - // innerText usage removed for consistency of new lines (jQuery #11153) - if ( typeof elem.textContent === "string" ) { - return elem.textContent; - } else { - - // Traverse its children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - ret += getText( elem ); - } - } - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - - // Do not include comment or processing instruction nodes - - return ret; -}; - -Expr = Sizzle.selectors = { - - // Can be adjusted by the user - cacheLength: 50, - - createPseudo: markFunction, - - match: matchExpr, - - attrHandle: {}, - - find: {}, - - relative: { - ">": { dir: "parentNode", first: true }, - " ": { dir: "parentNode" }, - "+": { dir: "previousSibling", first: true }, - "~": { dir: "previousSibling" } - }, - - preFilter: { - "ATTR": function( match ) { - match[ 1 ] = match[ 1 ].replace( runescape, funescape ); - - // Move the given value to match[3] whether quoted or unquoted - match[ 3 ] = ( match[ 3 ] || match[ 4 ] || - match[ 5 ] || "" ).replace( runescape, funescape ); - - if ( match[ 2 ] === "~=" ) { - match[ 3 ] = " " + match[ 3 ] + " "; - } - - return match.slice( 0, 4 ); - }, - - "CHILD": function( match ) { - - /* matches from matchExpr["CHILD"] - 1 type (only|nth|...) - 2 what (child|of-type) - 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) - 4 xn-component of xn+y argument ([+-]?\d*n|) - 5 sign of xn-component - 6 x of xn-component - 7 sign of y-component - 8 y of y-component - */ - match[ 1 ] = match[ 1 ].toLowerCase(); - - if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { - - // nth-* requires argument - if ( !match[ 3 ] ) { - Sizzle.error( match[ 0 ] ); - } - - // numeric x and y parameters for Expr.filter.CHILD - // remember that false/true cast respectively to 0/1 - match[ 4 ] = +( match[ 4 ] ? - match[ 5 ] + ( match[ 6 ] || 1 ) : - 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) ); - match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); - - // other types prohibit arguments - } else if ( match[ 3 ] ) { - Sizzle.error( match[ 0 ] ); - } - - return match; - }, - - "PSEUDO": function( match ) { - var excess, - unquoted = !match[ 6 ] && match[ 2 ]; - - if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) { - return null; - } - - // Accept quoted arguments as-is - if ( match[ 3 ] ) { - match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; - - // Strip excess characters from unquoted arguments - } else if ( unquoted && rpseudo.test( unquoted ) && - - // Get excess from tokenize (recursively) - ( excess = tokenize( unquoted, true ) ) && - - // advance to the next closing parenthesis - ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { - - // excess is a negative index - match[ 0 ] = match[ 0 ].slice( 0, excess ); - match[ 2 ] = unquoted.slice( 0, excess ); - } - - // Return only captures needed by the pseudo filter method (type and argument) - return match.slice( 0, 3 ); - } - }, - - filter: { - - "TAG": function( nodeNameSelector ) { - var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); - return nodeNameSelector === "*" ? - function() { - return true; - } : - function( elem ) { - return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; - }; - }, - - "CLASS": function( className ) { - var pattern = classCache[ className + " " ]; - - return pattern || - ( pattern = new RegExp( "(^|" + whitespace + - ")" + className + "(" + whitespace + "|$)" ) ) && classCache( - className, function( elem ) { - return pattern.test( - typeof elem.className === "string" && elem.className || - typeof elem.getAttribute !== "undefined" && - elem.getAttribute( "class" ) || - "" - ); - } ); - }, - - "ATTR": function( name, operator, check ) { - return function( elem ) { - var result = Sizzle.attr( elem, name ); - - if ( result == null ) { - return operator === "!="; - } - if ( !operator ) { - return true; - } - - result += ""; - - /* eslint-disable max-len */ - - return operator === "=" ? result === check : - operator === "!=" ? result !== check : - operator === "^=" ? check && result.indexOf( check ) === 0 : - operator === "*=" ? check && result.indexOf( check ) > -1 : - operator === "$=" ? check && result.slice( -check.length ) === check : - operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : - operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : - false; - /* eslint-enable max-len */ - - }; - }, - - "CHILD": function( type, what, _argument, first, last ) { - var simple = type.slice( 0, 3 ) !== "nth", - forward = type.slice( -4 ) !== "last", - ofType = what === "of-type"; - - return first === 1 && last === 0 ? - - // Shortcut for :nth-*(n) - function( elem ) { - return !!elem.parentNode; - } : - - function( elem, _context, xml ) { - var cache, uniqueCache, outerCache, node, nodeIndex, start, - dir = simple !== forward ? "nextSibling" : "previousSibling", - parent = elem.parentNode, - name = ofType && elem.nodeName.toLowerCase(), - useCache = !xml && !ofType, - diff = false; - - if ( parent ) { - - // :(first|last|only)-(child|of-type) - if ( simple ) { - while ( dir ) { - node = elem; - while ( ( node = node[ dir ] ) ) { - if ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) { - - return false; - } - } - - // Reverse direction for :only-* (if we haven't yet done so) - start = dir = type === "only" && !start && "nextSibling"; - } - return true; - } - - start = [ forward ? parent.firstChild : parent.lastChild ]; - - // non-xml :nth-child(...) stores cache data on `parent` - if ( forward && useCache ) { - - // Seek `elem` from a previously-cached index - - // ...in a gzip-friendly way - node = parent; - outerCache = node[ expando ] || ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex && cache[ 2 ]; - node = nodeIndex && parent.childNodes[ nodeIndex ]; - - while ( ( node = ++nodeIndex && node && node[ dir ] || - - // Fallback to seeking `elem` from the start - ( diff = nodeIndex = 0 ) || start.pop() ) ) { - - // When found, cache indexes on `parent` and break - if ( node.nodeType === 1 && ++diff && node === elem ) { - uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; - break; - } - } - - } else { - - // Use previously-cached element index if available - if ( useCache ) { - - // ...in a gzip-friendly way - node = elem; - outerCache = node[ expando ] || ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex; - } - - // xml :nth-child(...) - // or :nth-last-child(...) or :nth(-last)?-of-type(...) - if ( diff === false ) { - - // Use the same loop as above to seek `elem` from the start - while ( ( node = ++nodeIndex && node && node[ dir ] || - ( diff = nodeIndex = 0 ) || start.pop() ) ) { - - if ( ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) && - ++diff ) { - - // Cache the index of each encountered element - if ( useCache ) { - outerCache = node[ expando ] || - ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - uniqueCache[ type ] = [ dirruns, diff ]; - } - - if ( node === elem ) { - break; - } - } - } - } - } - - // Incorporate the offset, then check against cycle size - diff -= last; - return diff === first || ( diff % first === 0 && diff / first >= 0 ); - } - }; - }, - - "PSEUDO": function( pseudo, argument ) { - - // pseudo-class names are case-insensitive - // http://www.w3.org/TR/selectors/#pseudo-classes - // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters - // Remember that setFilters inherits from pseudos - var args, - fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || - Sizzle.error( "unsupported pseudo: " + pseudo ); - - // The user may use createPseudo to indicate that - // arguments are needed to create the filter function - // just as Sizzle does - if ( fn[ expando ] ) { - return fn( argument ); - } - - // But maintain support for old signatures - if ( fn.length > 1 ) { - args = [ pseudo, pseudo, "", argument ]; - return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? - markFunction( function( seed, matches ) { - var idx, - matched = fn( seed, argument ), - i = matched.length; - while ( i-- ) { - idx = indexOf( seed, matched[ i ] ); - seed[ idx ] = !( matches[ idx ] = matched[ i ] ); - } - } ) : - function( elem ) { - return fn( elem, 0, args ); - }; - } - - return fn; - } - }, - - pseudos: { - - // Potentially complex pseudos - "not": markFunction( function( selector ) { - - // Trim the selector passed to compile - // to avoid treating leading and trailing - // spaces as combinators - var input = [], - results = [], - matcher = compile( selector.replace( rtrim, "$1" ) ); - - return matcher[ expando ] ? - markFunction( function( seed, matches, _context, xml ) { - var elem, - unmatched = matcher( seed, null, xml, [] ), - i = seed.length; - - // Match elements unmatched by `matcher` - while ( i-- ) { - if ( ( elem = unmatched[ i ] ) ) { - seed[ i ] = !( matches[ i ] = elem ); - } - } - } ) : - function( elem, _context, xml ) { - input[ 0 ] = elem; - matcher( input, null, xml, results ); - - // Don't keep the element (issue #299) - input[ 0 ] = null; - return !results.pop(); - }; - } ), - - "has": markFunction( function( selector ) { - return function( elem ) { - return Sizzle( selector, elem ).length > 0; - }; - } ), - - "contains": markFunction( function( text ) { - text = text.replace( runescape, funescape ); - return function( elem ) { - return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1; - }; - } ), - - // "Whether an element is represented by a :lang() selector - // is based solely on the element's language value - // being equal to the identifier C, - // or beginning with the identifier C immediately followed by "-". - // The matching of C against the element's language value is performed case-insensitively. - // The identifier C does not have to be a valid language name." - // http://www.w3.org/TR/selectors/#lang-pseudo - "lang": markFunction( function( lang ) { - - // lang value must be a valid identifier - if ( !ridentifier.test( lang || "" ) ) { - Sizzle.error( "unsupported lang: " + lang ); - } - lang = lang.replace( runescape, funescape ).toLowerCase(); - return function( elem ) { - var elemLang; - do { - if ( ( elemLang = documentIsHTML ? - elem.lang : - elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { - - elemLang = elemLang.toLowerCase(); - return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; - } - } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); - return false; - }; - } ), - - // Miscellaneous - "target": function( elem ) { - var hash = window.location && window.location.hash; - return hash && hash.slice( 1 ) === elem.id; - }, - - "root": function( elem ) { - return elem === docElem; - }, - - "focus": function( elem ) { - return elem === document.activeElement && - ( !document.hasFocus || document.hasFocus() ) && - !!( elem.type || elem.href || ~elem.tabIndex ); - }, - - // Boolean properties - "enabled": createDisabledPseudo( false ), - "disabled": createDisabledPseudo( true ), - - "checked": function( elem ) { - - // In CSS3, :checked should return both checked and selected elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - var nodeName = elem.nodeName.toLowerCase(); - return ( nodeName === "input" && !!elem.checked ) || - ( nodeName === "option" && !!elem.selected ); - }, - - "selected": function( elem ) { - - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - // eslint-disable-next-line no-unused-expressions - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - // Contents - "empty": function( elem ) { - - // http://www.w3.org/TR/selectors/#empty-pseudo - // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), - // but not by others (comment: 8; processing instruction: 7; etc.) - // nodeType < 6 works because attributes (2) do not appear as children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - if ( elem.nodeType < 6 ) { - return false; - } - } - return true; - }, - - "parent": function( elem ) { - return !Expr.pseudos[ "empty" ]( elem ); - }, - - // Element/input types - "header": function( elem ) { - return rheader.test( elem.nodeName ); - }, - - "input": function( elem ) { - return rinputs.test( elem.nodeName ); - }, - - "button": function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === "button" || name === "button"; - }, - - "text": function( elem ) { - var attr; - return elem.nodeName.toLowerCase() === "input" && - elem.type === "text" && - - // Support: IE<8 - // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" - ( ( attr = elem.getAttribute( "type" ) ) == null || - attr.toLowerCase() === "text" ); - }, - - // Position-in-collection - "first": createPositionalPseudo( function() { - return [ 0 ]; - } ), - - "last": createPositionalPseudo( function( _matchIndexes, length ) { - return [ length - 1 ]; - } ), - - "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) { - return [ argument < 0 ? argument + length : argument ]; - } ), - - "even": createPositionalPseudo( function( matchIndexes, length ) { - var i = 0; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "odd": createPositionalPseudo( function( matchIndexes, length ) { - var i = 1; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "lt": createPositionalPseudo( function( matchIndexes, length, argument ) { - var i = argument < 0 ? - argument + length : - argument > length ? - length : - argument; - for ( ; --i >= 0; ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "gt": createPositionalPseudo( function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; ++i < length; ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ) - } -}; - -Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ]; - -// Add button/input type pseudos -for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { - Expr.pseudos[ i ] = createInputPseudo( i ); -} -for ( i in { submit: true, reset: true } ) { - Expr.pseudos[ i ] = createButtonPseudo( i ); -} - -// Easy API for creating new setFilters -function setFilters() {} -setFilters.prototype = Expr.filters = Expr.pseudos; -Expr.setFilters = new setFilters(); - -tokenize = Sizzle.tokenize = function( selector, parseOnly ) { - var matched, match, tokens, type, - soFar, groups, preFilters, - cached = tokenCache[ selector + " " ]; - - if ( cached ) { - return parseOnly ? 0 : cached.slice( 0 ); - } - - soFar = selector; - groups = []; - preFilters = Expr.preFilter; - - while ( soFar ) { - - // Comma and first run - if ( !matched || ( match = rcomma.exec( soFar ) ) ) { - if ( match ) { - - // Don't consume trailing commas as valid - soFar = soFar.slice( match[ 0 ].length ) || soFar; - } - groups.push( ( tokens = [] ) ); - } - - matched = false; - - // Combinators - if ( ( match = rcombinators.exec( soFar ) ) ) { - matched = match.shift(); - tokens.push( { - value: matched, - - // Cast descendant combinators to space - type: match[ 0 ].replace( rtrim, " " ) - } ); - soFar = soFar.slice( matched.length ); - } - - // Filters - for ( type in Expr.filter ) { - if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || - ( match = preFilters[ type ]( match ) ) ) ) { - matched = match.shift(); - tokens.push( { - value: matched, - type: type, - matches: match - } ); - soFar = soFar.slice( matched.length ); - } - } - - if ( !matched ) { - break; - } - } - - // Return the length of the invalid excess - // if we're just parsing - // Otherwise, throw an error or return tokens - return parseOnly ? - soFar.length : - soFar ? - Sizzle.error( selector ) : - - // Cache the tokens - tokenCache( selector, groups ).slice( 0 ); -}; - -function toSelector( tokens ) { - var i = 0, - len = tokens.length, - selector = ""; - for ( ; i < len; i++ ) { - selector += tokens[ i ].value; - } - return selector; -} - -function addCombinator( matcher, combinator, base ) { - var dir = combinator.dir, - skip = combinator.next, - key = skip || dir, - checkNonElements = base && key === "parentNode", - doneName = done++; - - return combinator.first ? - - // Check against closest ancestor/preceding element - function( elem, context, xml ) { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - return matcher( elem, context, xml ); - } - } - return false; - } : - - // Check against all ancestor/preceding elements - function( elem, context, xml ) { - var oldCache, uniqueCache, outerCache, - newCache = [ dirruns, doneName ]; - - // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching - if ( xml ) { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - if ( matcher( elem, context, xml ) ) { - return true; - } - } - } - } else { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - outerCache = elem[ expando ] || ( elem[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ elem.uniqueID ] || - ( outerCache[ elem.uniqueID ] = {} ); - - if ( skip && skip === elem.nodeName.toLowerCase() ) { - elem = elem[ dir ] || elem; - } else if ( ( oldCache = uniqueCache[ key ] ) && - oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { - - // Assign to newCache so results back-propagate to previous elements - return ( newCache[ 2 ] = oldCache[ 2 ] ); - } else { - - // Reuse newcache so results back-propagate to previous elements - uniqueCache[ key ] = newCache; - - // A match means we're done; a fail means we have to keep checking - if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { - return true; - } - } - } - } - } - return false; - }; -} - -function elementMatcher( matchers ) { - return matchers.length > 1 ? - function( elem, context, xml ) { - var i = matchers.length; - while ( i-- ) { - if ( !matchers[ i ]( elem, context, xml ) ) { - return false; - } - } - return true; - } : - matchers[ 0 ]; -} - -function multipleContexts( selector, contexts, results ) { - var i = 0, - len = contexts.length; - for ( ; i < len; i++ ) { - Sizzle( selector, contexts[ i ], results ); - } - return results; -} - -function condense( unmatched, map, filter, context, xml ) { - var elem, - newUnmatched = [], - i = 0, - len = unmatched.length, - mapped = map != null; - - for ( ; i < len; i++ ) { - if ( ( elem = unmatched[ i ] ) ) { - if ( !filter || filter( elem, context, xml ) ) { - newUnmatched.push( elem ); - if ( mapped ) { - map.push( i ); - } - } - } - } - - return newUnmatched; -} - -function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { - if ( postFilter && !postFilter[ expando ] ) { - postFilter = setMatcher( postFilter ); - } - if ( postFinder && !postFinder[ expando ] ) { - postFinder = setMatcher( postFinder, postSelector ); - } - return markFunction( function( seed, results, context, xml ) { - var temp, i, elem, - preMap = [], - postMap = [], - preexisting = results.length, - - // Get initial elements from seed or context - elems = seed || multipleContexts( - selector || "*", - context.nodeType ? [ context ] : context, - [] - ), - - // Prefilter to get matcher input, preserving a map for seed-results synchronization - matcherIn = preFilter && ( seed || !selector ) ? - condense( elems, preMap, preFilter, context, xml ) : - elems, - - matcherOut = matcher ? - - // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, - postFinder || ( seed ? preFilter : preexisting || postFilter ) ? - - // ...intermediate processing is necessary - [] : - - // ...otherwise use results directly - results : - matcherIn; - - // Find primary matches - if ( matcher ) { - matcher( matcherIn, matcherOut, context, xml ); - } - - // Apply postFilter - if ( postFilter ) { - temp = condense( matcherOut, postMap ); - postFilter( temp, [], context, xml ); - - // Un-match failing elements by moving them back to matcherIn - i = temp.length; - while ( i-- ) { - if ( ( elem = temp[ i ] ) ) { - matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); - } - } - } - - if ( seed ) { - if ( postFinder || preFilter ) { - if ( postFinder ) { - - // Get the final matcherOut by condensing this intermediate into postFinder contexts - temp = []; - i = matcherOut.length; - while ( i-- ) { - if ( ( elem = matcherOut[ i ] ) ) { - - // Restore matcherIn since elem is not yet a final match - temp.push( ( matcherIn[ i ] = elem ) ); - } - } - postFinder( null, ( matcherOut = [] ), temp, xml ); - } - - // Move matched elements from seed to results to keep them synchronized - i = matcherOut.length; - while ( i-- ) { - if ( ( elem = matcherOut[ i ] ) && - ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) { - - seed[ temp ] = !( results[ temp ] = elem ); - } - } - } - - // Add elements to results, through postFinder if defined - } else { - matcherOut = condense( - matcherOut === results ? - matcherOut.splice( preexisting, matcherOut.length ) : - matcherOut - ); - if ( postFinder ) { - postFinder( null, results, matcherOut, xml ); - } else { - push.apply( results, matcherOut ); - } - } - } ); -} - -function matcherFromTokens( tokens ) { - var checkContext, matcher, j, - len = tokens.length, - leadingRelative = Expr.relative[ tokens[ 0 ].type ], - implicitRelative = leadingRelative || Expr.relative[ " " ], - i = leadingRelative ? 1 : 0, - - // The foundational matcher ensures that elements are reachable from top-level context(s) - matchContext = addCombinator( function( elem ) { - return elem === checkContext; - }, implicitRelative, true ), - matchAnyContext = addCombinator( function( elem ) { - return indexOf( checkContext, elem ) > -1; - }, implicitRelative, true ), - matchers = [ function( elem, context, xml ) { - var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( - ( checkContext = context ).nodeType ? - matchContext( elem, context, xml ) : - matchAnyContext( elem, context, xml ) ); - - // Avoid hanging onto element (issue #299) - checkContext = null; - return ret; - } ]; - - for ( ; i < len; i++ ) { - if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { - matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; - } else { - matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); - - // Return special upon seeing a positional matcher - if ( matcher[ expando ] ) { - - // Find the next relative operator (if any) for proper handling - j = ++i; - for ( ; j < len; j++ ) { - if ( Expr.relative[ tokens[ j ].type ] ) { - break; - } - } - return setMatcher( - i > 1 && elementMatcher( matchers ), - i > 1 && toSelector( - - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens - .slice( 0, i - 1 ) - .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) - ).replace( rtrim, "$1" ), - matcher, - i < j && matcherFromTokens( tokens.slice( i, j ) ), - j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), - j < len && toSelector( tokens ) - ); - } - matchers.push( matcher ); - } - } - - return elementMatcher( matchers ); -} - -function matcherFromGroupMatchers( elementMatchers, setMatchers ) { - var bySet = setMatchers.length > 0, - byElement = elementMatchers.length > 0, - superMatcher = function( seed, context, xml, results, outermost ) { - var elem, j, matcher, - matchedCount = 0, - i = "0", - unmatched = seed && [], - setMatched = [], - contextBackup = outermostContext, - - // We must always have either seed elements or outermost context - elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ), - - // Use integer dirruns iff this is the outermost matcher - dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), - len = elems.length; - - if ( outermost ) { - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - outermostContext = context == document || context || outermost; - } - - // Add elements passing elementMatchers directly to results - // Support: IE<9, Safari - // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id - for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { - if ( byElement && elem ) { - j = 0; - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( !context && elem.ownerDocument != document ) { - setDocument( elem ); - xml = !documentIsHTML; - } - while ( ( matcher = elementMatchers[ j++ ] ) ) { - if ( matcher( elem, context || document, xml ) ) { - results.push( elem ); - break; - } - } - if ( outermost ) { - dirruns = dirrunsUnique; - } - } - - // Track unmatched elements for set filters - if ( bySet ) { - - // They will have gone through all possible matchers - if ( ( elem = !matcher && elem ) ) { - matchedCount--; - } - - // Lengthen the array for every element, matched or not - if ( seed ) { - unmatched.push( elem ); - } - } - } - - // `i` is now the count of elements visited above, and adding it to `matchedCount` - // makes the latter nonnegative. - matchedCount += i; - - // Apply set filters to unmatched elements - // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` - // equals `i`), unless we didn't visit _any_ elements in the above loop because we have - // no element matchers and no seed. - // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that - // case, which will result in a "00" `matchedCount` that differs from `i` but is also - // numerically zero. - if ( bySet && i !== matchedCount ) { - j = 0; - while ( ( matcher = setMatchers[ j++ ] ) ) { - matcher( unmatched, setMatched, context, xml ); - } - - if ( seed ) { - - // Reintegrate element matches to eliminate the need for sorting - if ( matchedCount > 0 ) { - while ( i-- ) { - if ( !( unmatched[ i ] || setMatched[ i ] ) ) { - setMatched[ i ] = pop.call( results ); - } - } - } - - // Discard index placeholder values to get only actual matches - setMatched = condense( setMatched ); - } - - // Add matches to results - push.apply( results, setMatched ); - - // Seedless set matches succeeding multiple successful matchers stipulate sorting - if ( outermost && !seed && setMatched.length > 0 && - ( matchedCount + setMatchers.length ) > 1 ) { - - Sizzle.uniqueSort( results ); - } - } - - // Override manipulation of globals by nested matchers - if ( outermost ) { - dirruns = dirrunsUnique; - outermostContext = contextBackup; - } - - return unmatched; - }; - - return bySet ? - markFunction( superMatcher ) : - superMatcher; -} - -compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { - var i, - setMatchers = [], - elementMatchers = [], - cached = compilerCache[ selector + " " ]; - - if ( !cached ) { - - // Generate a function of recursive functions that can be used to check each element - if ( !match ) { - match = tokenize( selector ); - } - i = match.length; - while ( i-- ) { - cached = matcherFromTokens( match[ i ] ); - if ( cached[ expando ] ) { - setMatchers.push( cached ); - } else { - elementMatchers.push( cached ); - } - } - - // Cache the compiled function - cached = compilerCache( - selector, - matcherFromGroupMatchers( elementMatchers, setMatchers ) - ); - - // Save selector and tokenization - cached.selector = selector; - } - return cached; -}; - -/** - * A low-level selection function that works with Sizzle's compiled - * selector functions - * @param {String|Function} selector A selector or a pre-compiled - * selector function built with Sizzle.compile - * @param {Element} context - * @param {Array} [results] - * @param {Array} [seed] A set of elements to match against - */ -select = Sizzle.select = function( selector, context, results, seed ) { - var i, tokens, token, type, find, - compiled = typeof selector === "function" && selector, - match = !seed && tokenize( ( selector = compiled.selector || selector ) ); - - results = results || []; - - // Try to minimize operations if there is only one selector in the list and no seed - // (the latter of which guarantees us context) - if ( match.length === 1 ) { - - // Reduce context if the leading compound selector is an ID - tokens = match[ 0 ] = match[ 0 ].slice( 0 ); - if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && - context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { - - context = ( Expr.find[ "ID" ]( token.matches[ 0 ] - .replace( runescape, funescape ), context ) || [] )[ 0 ]; - if ( !context ) { - return results; - - // Precompiled matchers will still verify ancestry, so step up a level - } else if ( compiled ) { - context = context.parentNode; - } - - selector = selector.slice( tokens.shift().value.length ); - } - - // Fetch a seed set for right-to-left matching - i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length; - while ( i-- ) { - token = tokens[ i ]; - - // Abort if we hit a combinator - if ( Expr.relative[ ( type = token.type ) ] ) { - break; - } - if ( ( find = Expr.find[ type ] ) ) { - - // Search, expanding context for leading sibling combinators - if ( ( seed = find( - token.matches[ 0 ].replace( runescape, funescape ), - rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) || - context - ) ) ) { - - // If seed is empty or no tokens remain, we can return early - tokens.splice( i, 1 ); - selector = seed.length && toSelector( tokens ); - if ( !selector ) { - push.apply( results, seed ); - return results; - } - - break; - } - } - } - } - - // Compile and execute a filtering function if one is not provided - // Provide `match` to avoid retokenization if we modified the selector above - ( compiled || compile( selector, match ) )( - seed, - context, - !documentIsHTML, - results, - !context || rsibling.test( selector ) && testContext( context.parentNode ) || context - ); - return results; -}; - -// One-time assignments - -// Sort stability -support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; - -// Support: Chrome 14-35+ -// Always assume duplicates if they aren't passed to the comparison function -support.detectDuplicates = !!hasDuplicate; - -// Initialize against the default document -setDocument(); - -// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) -// Detached nodes confoundingly follow *each other* -support.sortDetached = assert( function( el ) { - - // Should return 1, but returns 4 (following) - return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; -} ); - -// Support: IE<8 -// Prevent attribute/property "interpolation" -// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx -if ( !assert( function( el ) { - el.innerHTML = ""; - return el.firstChild.getAttribute( "href" ) === "#"; -} ) ) { - addHandle( "type|href|height|width", function( elem, name, isXML ) { - if ( !isXML ) { - return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); - } - } ); -} - -// Support: IE<9 -// Use defaultValue in place of getAttribute("value") -if ( !support.attributes || !assert( function( el ) { - el.innerHTML = ""; - el.firstChild.setAttribute( "value", "" ); - return el.firstChild.getAttribute( "value" ) === ""; -} ) ) { - addHandle( "value", function( elem, _name, isXML ) { - if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { - return elem.defaultValue; - } - } ); -} - -// Support: IE<9 -// Use getAttributeNode to fetch booleans when getAttribute lies -if ( !assert( function( el ) { - return el.getAttribute( "disabled" ) == null; -} ) ) { - addHandle( booleans, function( elem, name, isXML ) { - var val; - if ( !isXML ) { - return elem[ name ] === true ? name.toLowerCase() : - ( val = elem.getAttributeNode( name ) ) && val.specified ? - val.value : - null; - } - } ); -} - -return Sizzle; - -} )( window ); - - - -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; - -// Deprecated -jQuery.expr[ ":" ] = jQuery.expr.pseudos; -jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; -jQuery.escapeSelector = Sizzle.escape; - - - - -var dir = function( elem, dir, until ) { - var matched = [], - truncate = until !== undefined; - - while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { - if ( elem.nodeType === 1 ) { - if ( truncate && jQuery( elem ).is( until ) ) { - break; - } - matched.push( elem ); - } - } - return matched; -}; - - -var siblings = function( n, elem ) { - var matched = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - matched.push( n ); - } - } - - return matched; -}; - - -var rneedsContext = jQuery.expr.match.needsContext; - - - -function nodeName( elem, name ) { - - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - -}; -var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); - - - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, not ) { - if ( isFunction( qualifier ) ) { - return jQuery.grep( elements, function( elem, i ) { - return !!qualifier.call( elem, i, elem ) !== not; - } ); - } - - // Single element - if ( qualifier.nodeType ) { - return jQuery.grep( elements, function( elem ) { - return ( elem === qualifier ) !== not; - } ); - } - - // Arraylike of elements (jQuery, arguments, Array) - if ( typeof qualifier !== "string" ) { - return jQuery.grep( elements, function( elem ) { - return ( indexOf.call( qualifier, elem ) > -1 ) !== not; - } ); - } - - // Filtered directly for both simple and complex selectors - return jQuery.filter( qualifier, elements, not ); -} - -jQuery.filter = function( expr, elems, not ) { - var elem = elems[ 0 ]; - - if ( not ) { - expr = ":not(" + expr + ")"; - } - - if ( elems.length === 1 && elem.nodeType === 1 ) { - return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; - } - - return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { - return elem.nodeType === 1; - } ) ); -}; - -jQuery.fn.extend( { - find: function( selector ) { - var i, ret, - len = this.length, - self = this; - - if ( typeof selector !== "string" ) { - return this.pushStack( jQuery( selector ).filter( function() { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - } ) ); - } - - ret = this.pushStack( [] ); - - for ( i = 0; i < len; i++ ) { - jQuery.find( selector, self[ i ], ret ); - } - - return len > 1 ? jQuery.uniqueSort( ret ) : ret; - }, - filter: function( selector ) { - return this.pushStack( winnow( this, selector || [], false ) ); - }, - not: function( selector ) { - return this.pushStack( winnow( this, selector || [], true ) ); - }, - is: function( selector ) { - return !!winnow( - this, - - // If this is a positional/relative selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - typeof selector === "string" && rneedsContext.test( selector ) ? - jQuery( selector ) : - selector || [], - false - ).length; - } -} ); - - -// Initialize a jQuery object - - -// A central reference to the root jQuery(document) -var rootjQuery, - - // A simple way to check for HTML strings - // Prioritize #id over to avoid XSS via location.hash (#9521) - // Strict HTML recognition (#11290: must start with <) - // Shortcut simple #id case for speed - rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, - - init = jQuery.fn.init = function( selector, context, root ) { - var match, elem; - - // HANDLE: $(""), $(null), $(undefined), $(false) - if ( !selector ) { - return this; - } - - // Method init() accepts an alternate rootjQuery - // so migrate can support jQuery.sub (gh-2101) - root = root || rootjQuery; - - // Handle HTML strings - if ( typeof selector === "string" ) { - if ( selector[ 0 ] === "<" && - selector[ selector.length - 1 ] === ">" && - selector.length >= 3 ) { - - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = rquickExpr.exec( selector ); - } - - // Match html or make sure no context is specified for #id - if ( match && ( match[ 1 ] || !context ) ) { - - // HANDLE: $(html) -> $(array) - if ( match[ 1 ] ) { - context = context instanceof jQuery ? context[ 0 ] : context; - - // Option to run scripts is true for back-compat - // Intentionally let the error be thrown if parseHTML is not present - jQuery.merge( this, jQuery.parseHTML( - match[ 1 ], - context && context.nodeType ? context.ownerDocument || context : document, - true - ) ); - - // HANDLE: $(html, props) - if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { - for ( match in context ) { - - // Properties of context are called as methods if possible - if ( isFunction( this[ match ] ) ) { - this[ match ]( context[ match ] ); - - // ...and otherwise set as attributes - } else { - this.attr( match, context[ match ] ); - } - } - } - - return this; - - // HANDLE: $(#id) - } else { - elem = document.getElementById( match[ 2 ] ); - - if ( elem ) { - - // Inject the element directly into the jQuery object - this[ 0 ] = elem; - this.length = 1; - } - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return ( context || root ).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(DOMElement) - } else if ( selector.nodeType ) { - this[ 0 ] = selector; - this.length = 1; - return this; - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( isFunction( selector ) ) { - return root.ready !== undefined ? - root.ready( selector ) : - - // Execute immediately if ready is not present - selector( jQuery ); - } - - return jQuery.makeArray( selector, this ); - }; - -// Give the init function the jQuery prototype for later instantiation -init.prototype = jQuery.fn; - -// Initialize central reference -rootjQuery = jQuery( document ); - - -var rparentsprev = /^(?:parents|prev(?:Until|All))/, - - // Methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - -jQuery.fn.extend( { - has: function( target ) { - var targets = jQuery( target, this ), - l = targets.length; - - return this.filter( function() { - var i = 0; - for ( ; i < l; i++ ) { - if ( jQuery.contains( this, targets[ i ] ) ) { - return true; - } - } - } ); - }, - - closest: function( selectors, context ) { - var cur, - i = 0, - l = this.length, - matched = [], - targets = typeof selectors !== "string" && jQuery( selectors ); - - // Positional selectors never match, since there's no _selection_ context - if ( !rneedsContext.test( selectors ) ) { - for ( ; i < l; i++ ) { - for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { - - // Always skip document fragments - if ( cur.nodeType < 11 && ( targets ? - targets.index( cur ) > -1 : - - // Don't pass non-elements to Sizzle - cur.nodeType === 1 && - jQuery.find.matchesSelector( cur, selectors ) ) ) { - - matched.push( cur ); - break; - } - } - } - } - - return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); - }, - - // Determine the position of an element within the set - index: function( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; - } - - // Index in selector - if ( typeof elem === "string" ) { - return indexOf.call( jQuery( elem ), this[ 0 ] ); - } - - // Locate the position of the desired element - return indexOf.call( this, - - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[ 0 ] : elem - ); - }, - - add: function( selector, context ) { - return this.pushStack( - jQuery.uniqueSort( - jQuery.merge( this.get(), jQuery( selector, context ) ) - ) - ); - }, - - addBack: function( selector ) { - return this.add( selector == null ? - this.prevObject : this.prevObject.filter( selector ) - ); - } -} ); - -function sibling( cur, dir ) { - while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} - return cur; -} - -jQuery.each( { - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, _i, until ) { - return dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return sibling( elem, "nextSibling" ); - }, - prev: function( elem ) { - return sibling( elem, "previousSibling" ); - }, - nextAll: function( elem ) { - return dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, _i, until ) { - return dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, _i, until ) { - return dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return siblings( ( elem.parentNode || {} ).firstChild, elem ); - }, - children: function( elem ) { - return siblings( elem.firstChild ); - }, - contents: function( elem ) { - if ( elem.contentDocument != null && - - // Support: IE 11+ - // elements with no `data` attribute has an object - // `contentDocument` with a `null` prototype. - getProto( elem.contentDocument ) ) { - - return elem.contentDocument; - } - - // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only - // Treat the template element as a regular one in browsers that - // don't support it. - if ( nodeName( elem, "template" ) ) { - elem = elem.content || elem; - } - - return jQuery.merge( [], elem.childNodes ); - } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var matched = jQuery.map( this, fn, until ); - - if ( name.slice( -5 ) !== "Until" ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - matched = jQuery.filter( selector, matched ); - } - - if ( this.length > 1 ) { - - // Remove duplicates - if ( !guaranteedUnique[ name ] ) { - jQuery.uniqueSort( matched ); - } - - // Reverse order for parents* and prev-derivatives - if ( rparentsprev.test( name ) ) { - matched.reverse(); - } - } - - return this.pushStack( matched ); - }; -} ); -var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); - - - -// Convert String-formatted options into Object-formatted ones -function createOptions( options ) { - var object = {}; - jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { - object[ flag ] = true; - } ); - return object; -} - -/* - * Create a callback list using the following parameters: - * - * options: an optional list of space-separated options that will change how - * the callback list behaves or a more traditional option object - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible options: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ -jQuery.Callbacks = function( options ) { - - // Convert options from String-formatted to Object-formatted if needed - // (we check in cache first) - options = typeof options === "string" ? - createOptions( options ) : - jQuery.extend( {}, options ); - - var // Flag to know if list is currently firing - firing, - - // Last fire value for non-forgettable lists - memory, - - // Flag to know if list was already fired - fired, - - // Flag to prevent firing - locked, - - // Actual callback list - list = [], - - // Queue of execution data for repeatable lists - queue = [], - - // Index of currently firing callback (modified by add/remove as needed) - firingIndex = -1, - - // Fire callbacks - fire = function() { - - // Enforce single-firing - locked = locked || options.once; - - // Execute callbacks for all pending executions, - // respecting firingIndex overrides and runtime changes - fired = firing = true; - for ( ; queue.length; firingIndex = -1 ) { - memory = queue.shift(); - while ( ++firingIndex < list.length ) { - - // Run callback and check for early termination - if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && - options.stopOnFalse ) { - - // Jump to end and forget the data so .add doesn't re-fire - firingIndex = list.length; - memory = false; - } - } - } - - // Forget the data if we're done with it - if ( !options.memory ) { - memory = false; - } - - firing = false; - - // Clean up if we're done firing for good - if ( locked ) { - - // Keep an empty list if we have data for future add calls - if ( memory ) { - list = []; - - // Otherwise, this object is spent - } else { - list = ""; - } - } - }, - - // Actual Callbacks object - self = { - - // Add a callback or a collection of callbacks to the list - add: function() { - if ( list ) { - - // If we have memory from a past run, we should fire after adding - if ( memory && !firing ) { - firingIndex = list.length - 1; - queue.push( memory ); - } - - ( function add( args ) { - jQuery.each( args, function( _, arg ) { - if ( isFunction( arg ) ) { - if ( !options.unique || !self.has( arg ) ) { - list.push( arg ); - } - } else if ( arg && arg.length && toType( arg ) !== "string" ) { - - // Inspect recursively - add( arg ); - } - } ); - } )( arguments ); - - if ( memory && !firing ) { - fire(); - } - } - return this; - }, - - // Remove a callback from the list - remove: function() { - jQuery.each( arguments, function( _, arg ) { - var index; - while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { - list.splice( index, 1 ); - - // Handle firing indexes - if ( index <= firingIndex ) { - firingIndex--; - } - } - } ); - return this; - }, - - // Check if a given callback is in the list. - // If no argument is given, return whether or not list has callbacks attached. - has: function( fn ) { - return fn ? - jQuery.inArray( fn, list ) > -1 : - list.length > 0; - }, - - // Remove all callbacks from the list - empty: function() { - if ( list ) { - list = []; - } - return this; - }, - - // Disable .fire and .add - // Abort any current/pending executions - // Clear all callbacks and values - disable: function() { - locked = queue = []; - list = memory = ""; - return this; - }, - disabled: function() { - return !list; - }, - - // Disable .fire - // Also disable .add unless we have memory (since it would have no effect) - // Abort any pending executions - lock: function() { - locked = queue = []; - if ( !memory && !firing ) { - list = memory = ""; - } - return this; - }, - locked: function() { - return !!locked; - }, - - // Call all callbacks with the given context and arguments - fireWith: function( context, args ) { - if ( !locked ) { - args = args || []; - args = [ context, args.slice ? args.slice() : args ]; - queue.push( args ); - if ( !firing ) { - fire(); - } - } - return this; - }, - - // Call all the callbacks with the given arguments - fire: function() { - self.fireWith( this, arguments ); - return this; - }, - - // To know if the callbacks have already been called at least once - fired: function() { - return !!fired; - } - }; - - return self; -}; - - -function Identity( v ) { - return v; -} -function Thrower( ex ) { - throw ex; -} - -function adoptValue( value, resolve, reject, noValue ) { - var method; - - try { - - // Check for promise aspect first to privilege synchronous behavior - if ( value && isFunction( ( method = value.promise ) ) ) { - method.call( value ).done( resolve ).fail( reject ); - - // Other thenables - } else if ( value && isFunction( ( method = value.then ) ) ) { - method.call( value, resolve, reject ); - - // Other non-thenables - } else { - - // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: - // * false: [ value ].slice( 0 ) => resolve( value ) - // * true: [ value ].slice( 1 ) => resolve() - resolve.apply( undefined, [ value ].slice( noValue ) ); - } - - // For Promises/A+, convert exceptions into rejections - // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in - // Deferred#then to conditionally suppress rejection. - } catch ( value ) { - - // Support: Android 4.0 only - // Strict mode functions invoked without .call/.apply get global-object context - reject.apply( undefined, [ value ] ); - } -} - -jQuery.extend( { - - Deferred: function( func ) { - var tuples = [ - - // action, add listener, callbacks, - // ... .then handlers, argument index, [final state] - [ "notify", "progress", jQuery.Callbacks( "memory" ), - jQuery.Callbacks( "memory" ), 2 ], - [ "resolve", "done", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 0, "resolved" ], - [ "reject", "fail", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 1, "rejected" ] - ], - state = "pending", - promise = { - state: function() { - return state; - }, - always: function() { - deferred.done( arguments ).fail( arguments ); - return this; - }, - "catch": function( fn ) { - return promise.then( null, fn ); - }, - - // Keep pipe for back-compat - pipe: function( /* fnDone, fnFail, fnProgress */ ) { - var fns = arguments; - - return jQuery.Deferred( function( newDefer ) { - jQuery.each( tuples, function( _i, tuple ) { - - // Map tuples (progress, done, fail) to arguments (done, fail, progress) - var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; - - // deferred.progress(function() { bind to newDefer or newDefer.notify }) - // deferred.done(function() { bind to newDefer or newDefer.resolve }) - // deferred.fail(function() { bind to newDefer or newDefer.reject }) - deferred[ tuple[ 1 ] ]( function() { - var returned = fn && fn.apply( this, arguments ); - if ( returned && isFunction( returned.promise ) ) { - returned.promise() - .progress( newDefer.notify ) - .done( newDefer.resolve ) - .fail( newDefer.reject ); - } else { - newDefer[ tuple[ 0 ] + "With" ]( - this, - fn ? [ returned ] : arguments - ); - } - } ); - } ); - fns = null; - } ).promise(); - }, - then: function( onFulfilled, onRejected, onProgress ) { - var maxDepth = 0; - function resolve( depth, deferred, handler, special ) { - return function() { - var that = this, - args = arguments, - mightThrow = function() { - var returned, then; - - // Support: Promises/A+ section 2.3.3.3.3 - // https://promisesaplus.com/#point-59 - // Ignore double-resolution attempts - if ( depth < maxDepth ) { - return; - } - - returned = handler.apply( that, args ); - - // Support: Promises/A+ section 2.3.1 - // https://promisesaplus.com/#point-48 - if ( returned === deferred.promise() ) { - throw new TypeError( "Thenable self-resolution" ); - } - - // Support: Promises/A+ sections 2.3.3.1, 3.5 - // https://promisesaplus.com/#point-54 - // https://promisesaplus.com/#point-75 - // Retrieve `then` only once - then = returned && - - // Support: Promises/A+ section 2.3.4 - // https://promisesaplus.com/#point-64 - // Only check objects and functions for thenability - ( typeof returned === "object" || - typeof returned === "function" ) && - returned.then; - - // Handle a returned thenable - if ( isFunction( then ) ) { - - // Special processors (notify) just wait for resolution - if ( special ) { - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ) - ); - - // Normal processors (resolve) also hook into progress - } else { - - // ...and disregard older resolution values - maxDepth++; - - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ), - resolve( maxDepth, deferred, Identity, - deferred.notifyWith ) - ); - } - - // Handle all other returned values - } else { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Identity ) { - that = undefined; - args = [ returned ]; - } - - // Process the value(s) - // Default process is resolve - ( special || deferred.resolveWith )( that, args ); - } - }, - - // Only normal processors (resolve) catch and reject exceptions - process = special ? - mightThrow : - function() { - try { - mightThrow(); - } catch ( e ) { - - if ( jQuery.Deferred.exceptionHook ) { - jQuery.Deferred.exceptionHook( e, - process.stackTrace ); - } - - // Support: Promises/A+ section 2.3.3.3.4.1 - // https://promisesaplus.com/#point-61 - // Ignore post-resolution exceptions - if ( depth + 1 >= maxDepth ) { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Thrower ) { - that = undefined; - args = [ e ]; - } - - deferred.rejectWith( that, args ); - } - } - }; - - // Support: Promises/A+ section 2.3.3.3.1 - // https://promisesaplus.com/#point-57 - // Re-resolve promises immediately to dodge false rejection from - // subsequent errors - if ( depth ) { - process(); - } else { - - // Call an optional hook to record the stack, in case of exception - // since it's otherwise lost when execution goes async - if ( jQuery.Deferred.getStackHook ) { - process.stackTrace = jQuery.Deferred.getStackHook(); - } - window.setTimeout( process ); - } - }; - } - - return jQuery.Deferred( function( newDefer ) { - - // progress_handlers.add( ... ) - tuples[ 0 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onProgress ) ? - onProgress : - Identity, - newDefer.notifyWith - ) - ); - - // fulfilled_handlers.add( ... ) - tuples[ 1 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onFulfilled ) ? - onFulfilled : - Identity - ) - ); - - // rejected_handlers.add( ... ) - tuples[ 2 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onRejected ) ? - onRejected : - Thrower - ) - ); - } ).promise(); - }, - - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - return obj != null ? jQuery.extend( obj, promise ) : promise; - } - }, - deferred = {}; - - // Add list-specific methods - jQuery.each( tuples, function( i, tuple ) { - var list = tuple[ 2 ], - stateString = tuple[ 5 ]; - - // promise.progress = list.add - // promise.done = list.add - // promise.fail = list.add - promise[ tuple[ 1 ] ] = list.add; - - // Handle state - if ( stateString ) { - list.add( - function() { - - // state = "resolved" (i.e., fulfilled) - // state = "rejected" - state = stateString; - }, - - // rejected_callbacks.disable - // fulfilled_callbacks.disable - tuples[ 3 - i ][ 2 ].disable, - - // rejected_handlers.disable - // fulfilled_handlers.disable - tuples[ 3 - i ][ 3 ].disable, - - // progress_callbacks.lock - tuples[ 0 ][ 2 ].lock, - - // progress_handlers.lock - tuples[ 0 ][ 3 ].lock - ); - } - - // progress_handlers.fire - // fulfilled_handlers.fire - // rejected_handlers.fire - list.add( tuple[ 3 ].fire ); - - // deferred.notify = function() { deferred.notifyWith(...) } - // deferred.resolve = function() { deferred.resolveWith(...) } - // deferred.reject = function() { deferred.rejectWith(...) } - deferred[ tuple[ 0 ] ] = function() { - deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); - return this; - }; - - // deferred.notifyWith = list.fireWith - // deferred.resolveWith = list.fireWith - // deferred.rejectWith = list.fireWith - deferred[ tuple[ 0 ] + "With" ] = list.fireWith; - } ); - - // Make the deferred a promise - promise.promise( deferred ); - - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function( singleValue ) { - var - - // count of uncompleted subordinates - remaining = arguments.length, - - // count of unprocessed arguments - i = remaining, - - // subordinate fulfillment data - resolveContexts = Array( i ), - resolveValues = slice.call( arguments ), - - // the master Deferred - master = jQuery.Deferred(), - - // subordinate callback factory - updateFunc = function( i ) { - return function( value ) { - resolveContexts[ i ] = this; - resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; - if ( !( --remaining ) ) { - master.resolveWith( resolveContexts, resolveValues ); - } - }; - }; - - // Single- and empty arguments are adopted like Promise.resolve - if ( remaining <= 1 ) { - adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, - !remaining ); - - // Use .then() to unwrap secondary thenables (cf. gh-3000) - if ( master.state() === "pending" || - isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { - - return master.then(); - } - } - - // Multiple arguments are aggregated like Promise.all array elements - while ( i-- ) { - adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); - } - - return master.promise(); - } -} ); - - -// These usually indicate a programmer mistake during development, -// warn about them ASAP rather than swallowing them by default. -var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; - -jQuery.Deferred.exceptionHook = function( error, stack ) { - - // Support: IE 8 - 9 only - // Console exists when dev tools are open, which can happen at any time - if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { - window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); - } -}; - - - - -jQuery.readyException = function( error ) { - window.setTimeout( function() { - throw error; - } ); -}; - - - - -// The deferred used on DOM ready -var readyList = jQuery.Deferred(); - -jQuery.fn.ready = function( fn ) { - - readyList - .then( fn ) - - // Wrap jQuery.readyException in a function so that the lookup - // happens at the time of error handling instead of callback - // registration. - .catch( function( error ) { - jQuery.readyException( error ); - } ); - - return this; -}; - -jQuery.extend( { - - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Handle when the DOM is ready - ready: function( wait ) { - - // Abort if there are pending holds or we're already ready - if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { - return; - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith( document, [ jQuery ] ); - } -} ); - -jQuery.ready.then = readyList.then; - -// The ready event handler and self cleanup method -function completed() { - document.removeEventListener( "DOMContentLoaded", completed ); - window.removeEventListener( "load", completed ); - jQuery.ready(); -} - -// Catch cases where $(document).ready() is called -// after the browser event has already occurred. -// Support: IE <=9 - 10 only -// Older IE sometimes signals "interactive" too soon -if ( document.readyState === "complete" || - ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { - - // Handle it asynchronously to allow scripts the opportunity to delay ready - window.setTimeout( jQuery.ready ); - -} else { - - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", completed ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", completed ); -} - - - - -// Multifunctional method to get and set values of a collection -// The value/s can optionally be executed if it's a function -var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { - var i = 0, - len = elems.length, - bulk = key == null; - - // Sets many values - if ( toType( key ) === "object" ) { - chainable = true; - for ( i in key ) { - access( elems, fn, i, key[ i ], true, emptyGet, raw ); - } - - // Sets one value - } else if ( value !== undefined ) { - chainable = true; - - if ( !isFunction( value ) ) { - raw = true; - } - - if ( bulk ) { - - // Bulk operations run against the entire set - if ( raw ) { - fn.call( elems, value ); - fn = null; - - // ...except when executing function values - } else { - bulk = fn; - fn = function( elem, _key, value ) { - return bulk.call( jQuery( elem ), value ); - }; - } - } - - if ( fn ) { - for ( ; i < len; i++ ) { - fn( - elems[ i ], key, raw ? - value : - value.call( elems[ i ], i, fn( elems[ i ], key ) ) - ); - } - } - } - - if ( chainable ) { - return elems; - } - - // Gets - if ( bulk ) { - return fn.call( elems ); - } - - return len ? fn( elems[ 0 ], key ) : emptyGet; -}; - - -// Matches dashed string for camelizing -var rmsPrefix = /^-ms-/, - rdashAlpha = /-([a-z])/g; - -// Used by camelCase as callback to replace() -function fcamelCase( _all, letter ) { - return letter.toUpperCase(); -} - -// Convert dashed to camelCase; used by the css and data modules -// Support: IE <=9 - 11, Edge 12 - 15 -// Microsoft forgot to hump their vendor prefix (#9572) -function camelCase( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); -} -var acceptData = function( owner ) { - - // Accepts only: - // - Node - // - Node.ELEMENT_NODE - // - Node.DOCUMENT_NODE - // - Object - // - Any - return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); -}; - - - - -function Data() { - this.expando = jQuery.expando + Data.uid++; -} - -Data.uid = 1; - -Data.prototype = { - - cache: function( owner ) { - - // Check if the owner object already has a cache - var value = owner[ this.expando ]; - - // If not, create one - if ( !value ) { - value = {}; - - // We can accept data for non-element nodes in modern browsers, - // but we should not, see #8335. - // Always return an empty object. - if ( acceptData( owner ) ) { - - // If it is a node unlikely to be stringify-ed or looped over - // use plain assignment - if ( owner.nodeType ) { - owner[ this.expando ] = value; - - // Otherwise secure it in a non-enumerable property - // configurable must be true to allow the property to be - // deleted when data is removed - } else { - Object.defineProperty( owner, this.expando, { - value: value, - configurable: true - } ); - } - } - } - - return value; - }, - set: function( owner, data, value ) { - var prop, - cache = this.cache( owner ); - - // Handle: [ owner, key, value ] args - // Always use camelCase key (gh-2257) - if ( typeof data === "string" ) { - cache[ camelCase( data ) ] = value; - - // Handle: [ owner, { properties } ] args - } else { - - // Copy the properties one-by-one to the cache object - for ( prop in data ) { - cache[ camelCase( prop ) ] = data[ prop ]; - } - } - return cache; - }, - get: function( owner, key ) { - return key === undefined ? - this.cache( owner ) : - - // Always use camelCase key (gh-2257) - owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; - }, - access: function( owner, key, value ) { - - // In cases where either: - // - // 1. No key was specified - // 2. A string key was specified, but no value provided - // - // Take the "read" path and allow the get method to determine - // which value to return, respectively either: - // - // 1. The entire cache object - // 2. The data stored at the key - // - if ( key === undefined || - ( ( key && typeof key === "string" ) && value === undefined ) ) { - - return this.get( owner, key ); - } - - // When the key is not a string, or both a key and value - // are specified, set or extend (existing objects) with either: - // - // 1. An object of properties - // 2. A key and value - // - this.set( owner, key, value ); - - // Since the "set" path can have two possible entry points - // return the expected data based on which path was taken[*] - return value !== undefined ? value : key; - }, - remove: function( owner, key ) { - var i, - cache = owner[ this.expando ]; - - if ( cache === undefined ) { - return; - } - - if ( key !== undefined ) { - - // Support array or space separated string of keys - if ( Array.isArray( key ) ) { - - // If key is an array of keys... - // We always set camelCase keys, so remove that. - key = key.map( camelCase ); - } else { - key = camelCase( key ); - - // If a key with the spaces exists, use it. - // Otherwise, create an array by matching non-whitespace - key = key in cache ? - [ key ] : - ( key.match( rnothtmlwhite ) || [] ); - } - - i = key.length; - - while ( i-- ) { - delete cache[ key[ i ] ]; - } - } - - // Remove the expando if there's no more data - if ( key === undefined || jQuery.isEmptyObject( cache ) ) { - - // Support: Chrome <=35 - 45 - // Webkit & Blink performance suffers when deleting properties - // from DOM nodes, so set to undefined instead - // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) - if ( owner.nodeType ) { - owner[ this.expando ] = undefined; - } else { - delete owner[ this.expando ]; - } - } - }, - hasData: function( owner ) { - var cache = owner[ this.expando ]; - return cache !== undefined && !jQuery.isEmptyObject( cache ); - } -}; -var dataPriv = new Data(); - -var dataUser = new Data(); - - - -// Implementation Summary -// -// 1. Enforce API surface and semantic compatibility with 1.9.x branch -// 2. Improve the module's maintainability by reducing the storage -// paths to a single mechanism. -// 3. Use the same single mechanism to support "private" and "user" data. -// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) -// 5. Avoid exposing implementation details on user objects (eg. expando properties) -// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 - -var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, - rmultiDash = /[A-Z]/g; - -function getData( data ) { - if ( data === "true" ) { - return true; - } - - if ( data === "false" ) { - return false; - } - - if ( data === "null" ) { - return null; - } - - // Only convert to a number if it doesn't change the string - if ( data === +data + "" ) { - return +data; - } - - if ( rbrace.test( data ) ) { - return JSON.parse( data ); - } - - return data; -} - -function dataAttr( elem, key, data ) { - var name; - - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = getData( data ); - } catch ( e ) {} - - // Make sure we set the data so it isn't changed later - dataUser.set( elem, key, data ); - } else { - data = undefined; - } - } - return data; -} - -jQuery.extend( { - hasData: function( elem ) { - return dataUser.hasData( elem ) || dataPriv.hasData( elem ); - }, - - data: function( elem, name, data ) { - return dataUser.access( elem, name, data ); - }, - - removeData: function( elem, name ) { - dataUser.remove( elem, name ); - }, - - // TODO: Now that all calls to _data and _removeData have been replaced - // with direct calls to dataPriv methods, these can be deprecated. - _data: function( elem, name, data ) { - return dataPriv.access( elem, name, data ); - }, - - _removeData: function( elem, name ) { - dataPriv.remove( elem, name ); - } -} ); - -jQuery.fn.extend( { - data: function( key, value ) { - var i, name, data, - elem = this[ 0 ], - attrs = elem && elem.attributes; - - // Gets all values - if ( key === undefined ) { - if ( this.length ) { - data = dataUser.get( elem ); - - if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { - i = attrs.length; - while ( i-- ) { - - // Support: IE 11 only - // The attrs elements can be null (#14894) - if ( attrs[ i ] ) { - name = attrs[ i ].name; - if ( name.indexOf( "data-" ) === 0 ) { - name = camelCase( name.slice( 5 ) ); - dataAttr( elem, name, data[ name ] ); - } - } - } - dataPriv.set( elem, "hasDataAttrs", true ); - } - } - - return data; - } - - // Sets multiple values - if ( typeof key === "object" ) { - return this.each( function() { - dataUser.set( this, key ); - } ); - } - - return access( this, function( value ) { - var data; - - // The calling jQuery object (element matches) is not empty - // (and therefore has an element appears at this[ 0 ]) and the - // `value` parameter was not undefined. An empty jQuery object - // will result in `undefined` for elem = this[ 0 ] which will - // throw an exception if an attempt to read a data cache is made. - if ( elem && value === undefined ) { - - // Attempt to get data from the cache - // The key will always be camelCased in Data - data = dataUser.get( elem, key ); - if ( data !== undefined ) { - return data; - } - - // Attempt to "discover" the data in - // HTML5 custom data-* attrs - data = dataAttr( elem, key ); - if ( data !== undefined ) { - return data; - } - - // We tried really hard, but the data doesn't exist. - return; - } - - // Set the data... - this.each( function() { - - // We always store the camelCased key - dataUser.set( this, key, value ); - } ); - }, null, value, arguments.length > 1, null, true ); - }, - - removeData: function( key ) { - return this.each( function() { - dataUser.remove( this, key ); - } ); - } -} ); - - -jQuery.extend( { - queue: function( elem, type, data ) { - var queue; - - if ( elem ) { - type = ( type || "fx" ) + "queue"; - queue = dataPriv.get( elem, type ); - - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !queue || Array.isArray( data ) ) { - queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); - } else { - queue.push( data ); - } - } - return queue || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - startLength = queue.length, - fn = queue.shift(), - hooks = jQuery._queueHooks( elem, type ), - next = function() { - jQuery.dequeue( elem, type ); - }; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - startLength--; - } - - if ( fn ) { - - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift( "inprogress" ); - } - - // Clear up the last queue stop function - delete hooks.stop; - fn.call( elem, next, hooks ); - } - - if ( !startLength && hooks ) { - hooks.empty.fire(); - } - }, - - // Not public - generate a queueHooks object, or return the current one - _queueHooks: function( elem, type ) { - var key = type + "queueHooks"; - return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { - empty: jQuery.Callbacks( "once memory" ).add( function() { - dataPriv.remove( elem, [ type + "queue", key ] ); - } ) - } ); - } -} ); - -jQuery.fn.extend( { - queue: function( type, data ) { - var setter = 2; - - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - setter--; - } - - if ( arguments.length < setter ) { - return jQuery.queue( this[ 0 ], type ); - } - - return data === undefined ? - this : - this.each( function() { - var queue = jQuery.queue( this, type, data ); - - // Ensure a hooks for this queue - jQuery._queueHooks( this, type ); - - if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - } ); - }, - dequeue: function( type ) { - return this.each( function() { - jQuery.dequeue( this, type ); - } ); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, obj ) { - var tmp, - count = 1, - defer = jQuery.Deferred(), - elements = this, - i = this.length, - resolve = function() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - }; - - if ( typeof type !== "string" ) { - obj = type; - type = undefined; - } - type = type || "fx"; - - while ( i-- ) { - tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); - if ( tmp && tmp.empty ) { - count++; - tmp.empty.add( resolve ); - } - } - resolve(); - return defer.promise( obj ); - } -} ); -var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; - -var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); - - -var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; - -var documentElement = document.documentElement; - - - - var isAttached = function( elem ) { - return jQuery.contains( elem.ownerDocument, elem ); - }, - composed = { composed: true }; - - // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only - // Check attachment across shadow DOM boundaries when possible (gh-3504) - // Support: iOS 10.0-10.2 only - // Early iOS 10 versions support `attachShadow` but not `getRootNode`, - // leading to errors. We need to check for `getRootNode`. - if ( documentElement.getRootNode ) { - isAttached = function( elem ) { - return jQuery.contains( elem.ownerDocument, elem ) || - elem.getRootNode( composed ) === elem.ownerDocument; - }; - } -var isHiddenWithinTree = function( elem, el ) { - - // isHiddenWithinTree might be called from jQuery#filter function; - // in that case, element will be second argument - elem = el || elem; - - // Inline style trumps all - return elem.style.display === "none" || - elem.style.display === "" && - - // Otherwise, check computed style - // Support: Firefox <=43 - 45 - // Disconnected elements can have computed display: none, so first confirm that elem is - // in the document. - isAttached( elem ) && - - jQuery.css( elem, "display" ) === "none"; - }; - - - -function adjustCSS( elem, prop, valueParts, tween ) { - var adjusted, scale, - maxIterations = 20, - currentValue = tween ? - function() { - return tween.cur(); - } : - function() { - return jQuery.css( elem, prop, "" ); - }, - initial = currentValue(), - unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), - - // Starting value computation is required for potential unit mismatches - initialInUnit = elem.nodeType && - ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && - rcssNum.exec( jQuery.css( elem, prop ) ); - - if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { - - // Support: Firefox <=54 - // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) - initial = initial / 2; - - // Trust units reported by jQuery.css - unit = unit || initialInUnit[ 3 ]; - - // Iteratively approximate from a nonzero starting point - initialInUnit = +initial || 1; - - while ( maxIterations-- ) { - - // Evaluate and update our best guess (doubling guesses that zero out). - // Finish if the scale equals or crosses 1 (making the old*new product non-positive). - jQuery.style( elem, prop, initialInUnit + unit ); - if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { - maxIterations = 0; - } - initialInUnit = initialInUnit / scale; - - } - - initialInUnit = initialInUnit * 2; - jQuery.style( elem, prop, initialInUnit + unit ); - - // Make sure we update the tween properties later on - valueParts = valueParts || []; - } - - if ( valueParts ) { - initialInUnit = +initialInUnit || +initial || 0; - - // Apply relative offset (+=/-=) if specified - adjusted = valueParts[ 1 ] ? - initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : - +valueParts[ 2 ]; - if ( tween ) { - tween.unit = unit; - tween.start = initialInUnit; - tween.end = adjusted; - } - } - return adjusted; -} - - -var defaultDisplayMap = {}; - -function getDefaultDisplay( elem ) { - var temp, - doc = elem.ownerDocument, - nodeName = elem.nodeName, - display = defaultDisplayMap[ nodeName ]; - - if ( display ) { - return display; - } - - temp = doc.body.appendChild( doc.createElement( nodeName ) ); - display = jQuery.css( temp, "display" ); - - temp.parentNode.removeChild( temp ); - - if ( display === "none" ) { - display = "block"; - } - defaultDisplayMap[ nodeName ] = display; - - return display; -} - -function showHide( elements, show ) { - var display, elem, - values = [], - index = 0, - length = elements.length; - - // Determine new display value for elements that need to change - for ( ; index < length; index++ ) { - elem = elements[ index ]; - if ( !elem.style ) { - continue; - } - - display = elem.style.display; - if ( show ) { - - // Since we force visibility upon cascade-hidden elements, an immediate (and slow) - // check is required in this first loop unless we have a nonempty display value (either - // inline or about-to-be-restored) - if ( display === "none" ) { - values[ index ] = dataPriv.get( elem, "display" ) || null; - if ( !values[ index ] ) { - elem.style.display = ""; - } - } - if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { - values[ index ] = getDefaultDisplay( elem ); - } - } else { - if ( display !== "none" ) { - values[ index ] = "none"; - - // Remember what we're overwriting - dataPriv.set( elem, "display", display ); - } - } - } - - // Set the display of the elements in a second loop to avoid constant reflow - for ( index = 0; index < length; index++ ) { - if ( values[ index ] != null ) { - elements[ index ].style.display = values[ index ]; - } - } - - return elements; -} - -jQuery.fn.extend( { - show: function() { - return showHide( this, true ); - }, - hide: function() { - return showHide( this ); - }, - toggle: function( state ) { - if ( typeof state === "boolean" ) { - return state ? this.show() : this.hide(); - } - - return this.each( function() { - if ( isHiddenWithinTree( this ) ) { - jQuery( this ).show(); - } else { - jQuery( this ).hide(); - } - } ); - } -} ); -var rcheckableType = ( /^(?:checkbox|radio)$/i ); - -var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); - -var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); - - - -( function() { - var fragment = document.createDocumentFragment(), - div = fragment.appendChild( document.createElement( "div" ) ), - input = document.createElement( "input" ); - - // Support: Android 4.0 - 4.3 only - // Check state lost if the name is set (#11217) - // Support: Windows Web Apps (WWA) - // `name` and `type` must use .setAttribute for WWA (#14901) - input.setAttribute( "type", "radio" ); - input.setAttribute( "checked", "checked" ); - input.setAttribute( "name", "t" ); - - div.appendChild( input ); - - // Support: Android <=4.1 only - // Older WebKit doesn't clone checked state correctly in fragments - support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Support: IE <=11 only - // Make sure textarea (and checkbox) defaultValue is properly cloned - div.innerHTML = ""; - support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; - - // Support: IE <=9 only - // IE <=9 replaces "; - support.option = !!div.lastChild; -} )(); - - -// We have to close these tags to support XHTML (#13200) -var wrapMap = { - - // XHTML parsers do not magically insert elements in the - // same way that tag soup parsers do. So we cannot shorten - // this by omitting or other required elements. - thead: [ 1, "", "
" ], - col: [ 2, "", "
" ], - tr: [ 2, "", "
" ], - td: [ 3, "", "
" ], - - _default: [ 0, "", "" ] -}; - -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - -// Support: IE <=9 only -if ( !support.option ) { - wrapMap.optgroup = wrapMap.option = [ 1, "" ]; -} - - -function getAll( context, tag ) { - - // Support: IE <=9 - 11 only - // Use typeof to avoid zero-argument method invocation on host objects (#15151) - var ret; - - if ( typeof context.getElementsByTagName !== "undefined" ) { - ret = context.getElementsByTagName( tag || "*" ); - - } else if ( typeof context.querySelectorAll !== "undefined" ) { - ret = context.querySelectorAll( tag || "*" ); - - } else { - ret = []; - } - - if ( tag === undefined || tag && nodeName( context, tag ) ) { - return jQuery.merge( [ context ], ret ); - } - - return ret; -} - - -// Mark scripts as having already been evaluated -function setGlobalEval( elems, refElements ) { - var i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - dataPriv.set( - elems[ i ], - "globalEval", - !refElements || dataPriv.get( refElements[ i ], "globalEval" ) - ); - } -} - - -var rhtml = /<|&#?\w+;/; - -function buildFragment( elems, context, scripts, selection, ignored ) { - var elem, tmp, tag, wrap, attached, j, - fragment = context.createDocumentFragment(), - nodes = [], - i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - elem = elems[ i ]; - - if ( elem || elem === 0 ) { - - // Add nodes directly - if ( toType( elem ) === "object" ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); - - // Convert non-html into a text node - } else if ( !rhtml.test( elem ) ) { - nodes.push( context.createTextNode( elem ) ); - - // Convert html into DOM nodes - } else { - tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); - - // Deserialize a standard representation - tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); - wrap = wrapMap[ tag ] || wrapMap._default; - tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; - - // Descend through wrappers to the right content - j = wrap[ 0 ]; - while ( j-- ) { - tmp = tmp.lastChild; - } - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, tmp.childNodes ); - - // Remember the top-level container - tmp = fragment.firstChild; - - // Ensure the created nodes are orphaned (#12392) - tmp.textContent = ""; - } - } - } - - // Remove wrapper from fragment - fragment.textContent = ""; - - i = 0; - while ( ( elem = nodes[ i++ ] ) ) { - - // Skip elements already in the context collection (trac-4087) - if ( selection && jQuery.inArray( elem, selection ) > -1 ) { - if ( ignored ) { - ignored.push( elem ); - } - continue; - } - - attached = isAttached( elem ); - - // Append to fragment - tmp = getAll( fragment.appendChild( elem ), "script" ); - - // Preserve script evaluation history - if ( attached ) { - setGlobalEval( tmp ); - } - - // Capture executables - if ( scripts ) { - j = 0; - while ( ( elem = tmp[ j++ ] ) ) { - if ( rscriptType.test( elem.type || "" ) ) { - scripts.push( elem ); - } - } - } - } - - return fragment; -} - - -var - rkeyEvent = /^key/, - rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, - rtypenamespace = /^([^.]*)(?:\.(.+)|)/; - -function returnTrue() { - return true; -} - -function returnFalse() { - return false; -} - -// Support: IE <=9 - 11+ -// focus() and blur() are asynchronous, except when they are no-op. -// So expect focus to be synchronous when the element is already active, -// and blur to be synchronous when the element is not already active. -// (focus and blur are always synchronous in other supported browsers, -// this just defines when we can count on it). -function expectSync( elem, type ) { - return ( elem === safeActiveElement() ) === ( type === "focus" ); -} - -// Support: IE <=9 only -// Accessing document.activeElement can throw unexpectedly -// https://bugs.jquery.com/ticket/13393 -function safeActiveElement() { - try { - return document.activeElement; - } catch ( err ) { } -} - -function on( elem, types, selector, data, fn, one ) { - var origFn, type; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { - - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for ( type in types ) { - on( elem, type, selector, data, types[ type ], one ); - } - return elem; - } - - if ( data == null && fn == null ) { - - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return elem; - } - - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return elem.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - } ); -} - -/* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ -jQuery.event = { - - global: {}, - - add: function( elem, types, handler, data, selector ) { - - var handleObjIn, eventHandle, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.get( elem ); - - // Only attach events to objects that accept data - if ( !acceptData( elem ) ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Ensure that invalid selectors throw exceptions at attach time - // Evaluate against documentElement in case elem is a non-element node (e.g., document) - if ( selector ) { - jQuery.find.matchesSelector( documentElement, selector ); - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - if ( !( events = elemData.events ) ) { - events = elemData.events = Object.create( null ); - } - if ( !( eventHandle = elemData.handle ) ) { - eventHandle = elemData.handle = function( e ) { - - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? - jQuery.event.dispatch.apply( elem, arguments ) : undefined; - }; - } - - // Handle multiple events separated by a space - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // There *must* be a type, no attaching namespace-only handlers - if ( !type ) { - continue; - } - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; - - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend( { - type: type, - origType: origType, - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - needsContext: selector && jQuery.expr.match.needsContext.test( selector ), - namespace: namespaces.join( "." ) - }, handleObjIn ); - - // Init the event handler queue if we're the first - if ( !( handlers = events[ type ] ) ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; - - // Only use addEventListener if the special events handler returns false - if ( !special.setup || - special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - }, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, selector, mappedTypes ) { - - var j, origCount, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); - - if ( !elemData || !( events = elemData.events ) ) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); - } - continue; - } - - special = jQuery.event.special[ type ] || {}; - type = ( selector ? special.delegateType : special.bindType ) || type; - handlers = events[ type ] || []; - tmp = tmp[ 2 ] && - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); - - // Remove matching events - origCount = j = handlers.length; - while ( j-- ) { - handleObj = handlers[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !tmp || tmp.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || - selector === "**" && handleObj.selector ) ) { - handlers.splice( j, 1 ); - - if ( handleObj.selector ) { - handlers.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( origCount && !handlers.length ) { - if ( !special.teardown || - special.teardown.call( elem, namespaces, elemData.handle ) === false ) { - - jQuery.removeEvent( elem, type, elemData.handle ); - } - - delete events[ type ]; - } - } - - // Remove data and the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - dataPriv.remove( elem, "handle events" ); - } - }, - - dispatch: function( nativeEvent ) { - - var i, j, ret, matched, handleObj, handlerQueue, - args = new Array( arguments.length ), - - // Make a writable jQuery.Event from the native event object - event = jQuery.event.fix( nativeEvent ), - - handlers = ( - dataPriv.get( this, "events" ) || Object.create( null ) - )[ event.type ] || [], - special = jQuery.event.special[ event.type ] || {}; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[ 0 ] = event; - - for ( i = 1; i < arguments.length; i++ ) { - args[ i ] = arguments[ i ]; - } - - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { - return; - } - - // Determine handlers - handlerQueue = jQuery.event.handlers.call( this, event, handlers ); - - // Run delegates first; they may want to stop propagation beneath us - i = 0; - while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { - event.currentTarget = matched.elem; - - j = 0; - while ( ( handleObj = matched.handlers[ j++ ] ) && - !event.isImmediatePropagationStopped() ) { - - // If the event is namespaced, then each handler is only invoked if it is - // specially universal or its namespaces are a superset of the event's. - if ( !event.rnamespace || handleObj.namespace === false || - event.rnamespace.test( handleObj.namespace ) ) { - - event.handleObj = handleObj; - event.data = handleObj.data; - - ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || - handleObj.handler ).apply( matched.elem, args ); - - if ( ret !== undefined ) { - if ( ( event.result = ret ) === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if ( special.postDispatch ) { - special.postDispatch.call( this, event ); - } - - return event.result; - }, - - handlers: function( event, handlers ) { - var i, handleObj, sel, matchedHandlers, matchedSelectors, - handlerQueue = [], - delegateCount = handlers.delegateCount, - cur = event.target; - - // Find delegate handlers - if ( delegateCount && - - // Support: IE <=9 - // Black-hole SVG instance trees (trac-13180) - cur.nodeType && - - // Support: Firefox <=42 - // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) - // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click - // Support: IE 11 only - // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) - !( event.type === "click" && event.button >= 1 ) ) { - - for ( ; cur !== this; cur = cur.parentNode || this ) { - - // Don't check non-elements (#13208) - // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) - if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { - matchedHandlers = []; - matchedSelectors = {}; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - - // Don't conflict with Object.prototype properties (#13203) - sel = handleObj.selector + " "; - - if ( matchedSelectors[ sel ] === undefined ) { - matchedSelectors[ sel ] = handleObj.needsContext ? - jQuery( sel, this ).index( cur ) > -1 : - jQuery.find( sel, this, null, [ cur ] ).length; - } - if ( matchedSelectors[ sel ] ) { - matchedHandlers.push( handleObj ); - } - } - if ( matchedHandlers.length ) { - handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); - } - } - } - } - - // Add the remaining (directly-bound) handlers - cur = this; - if ( delegateCount < handlers.length ) { - handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); - } - - return handlerQueue; - }, - - addProp: function( name, hook ) { - Object.defineProperty( jQuery.Event.prototype, name, { - enumerable: true, - configurable: true, - - get: isFunction( hook ) ? - function() { - if ( this.originalEvent ) { - return hook( this.originalEvent ); - } - } : - function() { - if ( this.originalEvent ) { - return this.originalEvent[ name ]; - } - }, - - set: function( value ) { - Object.defineProperty( this, name, { - enumerable: true, - configurable: true, - writable: true, - value: value - } ); - } - } ); - }, - - fix: function( originalEvent ) { - return originalEvent[ jQuery.expando ] ? - originalEvent : - new jQuery.Event( originalEvent ); - }, - - special: { - load: { - - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - click: { - - // Utilize native event to ensure correct state for checkable inputs - setup: function( data ) { - - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Claim the first handler - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, "input" ) ) { - - // dataPriv.set( el, "click", ... ) - leverageNative( el, "click", returnTrue ); - } - - // Return false to allow normal processing in the caller - return false; - }, - trigger: function( data ) { - - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Force setup before triggering a click - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, "input" ) ) { - - leverageNative( el, "click" ); - } - - // Return non-false to allow normal event-path propagation - return true; - }, - - // For cross-browser consistency, suppress native .click() on links - // Also prevent it if we're currently inside a leveraged native-event stack - _default: function( event ) { - var target = event.target; - return rcheckableType.test( target.type ) && - target.click && nodeName( target, "input" ) && - dataPriv.get( target, "click" ) || - nodeName( target, "a" ); - } - }, - - beforeunload: { - postDispatch: function( event ) { - - // Support: Firefox 20+ - // Firefox doesn't alert if the returnValue field is not set. - if ( event.result !== undefined && event.originalEvent ) { - event.originalEvent.returnValue = event.result; - } - } - } - } -}; - -// Ensure the presence of an event listener that handles manually-triggered -// synthetic events by interrupting progress until reinvoked in response to -// *native* events that it fires directly, ensuring that state changes have -// already occurred before other listeners are invoked. -function leverageNative( el, type, expectSync ) { - - // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add - if ( !expectSync ) { - if ( dataPriv.get( el, type ) === undefined ) { - jQuery.event.add( el, type, returnTrue ); - } - return; - } - - // Register the controller as a special universal handler for all event namespaces - dataPriv.set( el, type, false ); - jQuery.event.add( el, type, { - namespace: false, - handler: function( event ) { - var notAsync, result, - saved = dataPriv.get( this, type ); - - if ( ( event.isTrigger & 1 ) && this[ type ] ) { - - // Interrupt processing of the outer synthetic .trigger()ed event - // Saved data should be false in such cases, but might be a leftover capture object - // from an async native handler (gh-4350) - if ( !saved.length ) { - - // Store arguments for use when handling the inner native event - // There will always be at least one argument (an event object), so this array - // will not be confused with a leftover capture object. - saved = slice.call( arguments ); - dataPriv.set( this, type, saved ); - - // Trigger the native event and capture its result - // Support: IE <=9 - 11+ - // focus() and blur() are asynchronous - notAsync = expectSync( this, type ); - this[ type ](); - result = dataPriv.get( this, type ); - if ( saved !== result || notAsync ) { - dataPriv.set( this, type, false ); - } else { - result = {}; - } - if ( saved !== result ) { - - // Cancel the outer synthetic event - event.stopImmediatePropagation(); - event.preventDefault(); - return result.value; - } - - // If this is an inner synthetic event for an event with a bubbling surrogate - // (focus or blur), assume that the surrogate already propagated from triggering the - // native event and prevent that from happening again here. - // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the - // bubbling surrogate propagates *after* the non-bubbling base), but that seems - // less bad than duplication. - } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { - event.stopPropagation(); - } - - // If this is a native event triggered above, everything is now in order - // Fire an inner synthetic event with the original arguments - } else if ( saved.length ) { - - // ...and capture the result - dataPriv.set( this, type, { - value: jQuery.event.trigger( - - // Support: IE <=9 - 11+ - // Extend with the prototype to reset the above stopImmediatePropagation() - jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), - saved.slice( 1 ), - this - ) - } ); - - // Abort handling of the native event - event.stopImmediatePropagation(); - } - } - } ); -} - -jQuery.removeEvent = function( elem, type, handle ) { - - // This "if" is needed for plain objects - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle ); - } -}; - -jQuery.Event = function( src, props ) { - - // Allow instantiation without the 'new' keyword - if ( !( this instanceof jQuery.Event ) ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = src.defaultPrevented || - src.defaultPrevented === undefined && - - // Support: Android <=2.3 only - src.returnValue === false ? - returnTrue : - returnFalse; - - // Create target properties - // Support: Safari <=6 - 7 only - // Target should not be a text node (#504, #13143) - this.target = ( src.target && src.target.nodeType === 3 ) ? - src.target.parentNode : - src.target; - - this.currentTarget = src.currentTarget; - this.relatedTarget = src.relatedTarget; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || Date.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - constructor: jQuery.Event, - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse, - isSimulated: false, - - preventDefault: function() { - var e = this.originalEvent; - - this.isDefaultPrevented = returnTrue; - - if ( e && !this.isSimulated ) { - e.preventDefault(); - } - }, - stopPropagation: function() { - var e = this.originalEvent; - - this.isPropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopPropagation(); - } - }, - stopImmediatePropagation: function() { - var e = this.originalEvent; - - this.isImmediatePropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopImmediatePropagation(); - } - - this.stopPropagation(); - } -}; - -// Includes all common event props including KeyEvent and MouseEvent specific props -jQuery.each( { - altKey: true, - bubbles: true, - cancelable: true, - changedTouches: true, - ctrlKey: true, - detail: true, - eventPhase: true, - metaKey: true, - pageX: true, - pageY: true, - shiftKey: true, - view: true, - "char": true, - code: true, - charCode: true, - key: true, - keyCode: true, - button: true, - buttons: true, - clientX: true, - clientY: true, - offsetX: true, - offsetY: true, - pointerId: true, - pointerType: true, - screenX: true, - screenY: true, - targetTouches: true, - toElement: true, - touches: true, - - which: function( event ) { - var button = event.button; - - // Add which for key events - if ( event.which == null && rkeyEvent.test( event.type ) ) { - return event.charCode != null ? event.charCode : event.keyCode; - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { - if ( button & 1 ) { - return 1; - } - - if ( button & 2 ) { - return 3; - } - - if ( button & 4 ) { - return 2; - } - - return 0; - } - - return event.which; - } -}, jQuery.event.addProp ); - -jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { - jQuery.event.special[ type ] = { - - // Utilize native event if possible so blur/focus sequence is correct - setup: function() { - - // Claim the first handler - // dataPriv.set( this, "focus", ... ) - // dataPriv.set( this, "blur", ... ) - leverageNative( this, type, expectSync ); - - // Return false to allow normal processing in the caller - return false; - }, - trigger: function() { - - // Force setup before trigger - leverageNative( this, type ); - - // Return non-false to allow normal event-path propagation - return true; - }, - - delegateType: delegateType - }; -} ); - -// Create mouseenter/leave events using mouseover/out and event-time checks -// so that event delegation works in jQuery. -// Do the same for pointerenter/pointerleave and pointerover/pointerout -// -// Support: Safari 7 only -// Safari sends mouseenter too often; see: -// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 -// for the description of the bug (it existed in older Chrome versions as well). -jQuery.each( { - mouseenter: "mouseover", - mouseleave: "mouseout", - pointerenter: "pointerover", - pointerleave: "pointerout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function( event ) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - - // For mouseenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; -} ); - -jQuery.fn.extend( { - - on: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn ); - }, - one: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn, 1 ); - }, - off: function( types, selector, fn ) { - var handleObj, type; - if ( types && types.preventDefault && types.handleObj ) { - - // ( event ) dispatched jQuery.Event - handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace ? - handleObj.origType + "." + handleObj.namespace : - handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - - // ( types-object [, selector] ) - for ( type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { - - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each( function() { - jQuery.event.remove( this, types, fn, selector ); - } ); - } -} ); - - -var - - // Support: IE <=10 - 11, Edge 12 - 13 only - // In IE/Edge using regex groups here causes severe slowdowns. - // See https://connect.microsoft.com/IE/feedback/details/1736512/ - rnoInnerhtml = /\s*$/g; - -// Prefer a tbody over its parent table for containing new rows -function manipulationTarget( elem, content ) { - if ( nodeName( elem, "table" ) && - nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { - - return jQuery( elem ).children( "tbody" )[ 0 ] || elem; - } - - return elem; -} - -// Replace/restore the type attribute of script elements for safe DOM manipulation -function disableScript( elem ) { - elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; - return elem; -} -function restoreScript( elem ) { - if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { - elem.type = elem.type.slice( 5 ); - } else { - elem.removeAttribute( "type" ); - } - - return elem; -} - -function cloneCopyEvent( src, dest ) { - var i, l, type, pdataOld, udataOld, udataCur, events; - - if ( dest.nodeType !== 1 ) { - return; - } - - // 1. Copy private data: events, handlers, etc. - if ( dataPriv.hasData( src ) ) { - pdataOld = dataPriv.get( src ); - events = pdataOld.events; - - if ( events ) { - dataPriv.remove( dest, "handle events" ); - - for ( type in events ) { - for ( i = 0, l = events[ type ].length; i < l; i++ ) { - jQuery.event.add( dest, type, events[ type ][ i ] ); - } - } - } - } - - // 2. Copy user data - if ( dataUser.hasData( src ) ) { - udataOld = dataUser.access( src ); - udataCur = jQuery.extend( {}, udataOld ); - - dataUser.set( dest, udataCur ); - } -} - -// Fix IE bugs, see support tests -function fixInput( src, dest ) { - var nodeName = dest.nodeName.toLowerCase(); - - // Fails to persist the checked state of a cloned checkbox or radio button. - if ( nodeName === "input" && rcheckableType.test( src.type ) ) { - dest.checked = src.checked; - - // Fails to return the selected option to the default selected state when cloning options - } else if ( nodeName === "input" || nodeName === "textarea" ) { - dest.defaultValue = src.defaultValue; - } -} - -function domManip( collection, args, callback, ignored ) { - - // Flatten any nested arrays - args = flat( args ); - - var fragment, first, scripts, hasScripts, node, doc, - i = 0, - l = collection.length, - iNoClone = l - 1, - value = args[ 0 ], - valueIsFunction = isFunction( value ); - - // We can't cloneNode fragments that contain checked, in WebKit - if ( valueIsFunction || - ( l > 1 && typeof value === "string" && - !support.checkClone && rchecked.test( value ) ) ) { - return collection.each( function( index ) { - var self = collection.eq( index ); - if ( valueIsFunction ) { - args[ 0 ] = value.call( this, index, self.html() ); - } - domManip( self, args, callback, ignored ); - } ); - } - - if ( l ) { - fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); - first = fragment.firstChild; - - if ( fragment.childNodes.length === 1 ) { - fragment = first; - } - - // Require either new content or an interest in ignored elements to invoke the callback - if ( first || ignored ) { - scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); - hasScripts = scripts.length; - - // Use the original fragment for the last item - // instead of the first because it can end up - // being emptied incorrectly in certain situations (#8070). - for ( ; i < l; i++ ) { - node = fragment; - - if ( i !== iNoClone ) { - node = jQuery.clone( node, true, true ); - - // Keep references to cloned scripts for later restoration - if ( hasScripts ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( scripts, getAll( node, "script" ) ); - } - } - - callback.call( collection[ i ], node, i ); - } - - if ( hasScripts ) { - doc = scripts[ scripts.length - 1 ].ownerDocument; - - // Reenable scripts - jQuery.map( scripts, restoreScript ); - - // Evaluate executable scripts on first document insertion - for ( i = 0; i < hasScripts; i++ ) { - node = scripts[ i ]; - if ( rscriptType.test( node.type || "" ) && - !dataPriv.access( node, "globalEval" ) && - jQuery.contains( doc, node ) ) { - - if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { - - // Optional AJAX dependency, but won't run scripts if not present - if ( jQuery._evalUrl && !node.noModule ) { - jQuery._evalUrl( node.src, { - nonce: node.nonce || node.getAttribute( "nonce" ) - }, doc ); - } - } else { - DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); - } - } - } - } - } - } - - return collection; -} - -function remove( elem, selector, keepData ) { - var node, - nodes = selector ? jQuery.filter( selector, elem ) : elem, - i = 0; - - for ( ; ( node = nodes[ i ] ) != null; i++ ) { - if ( !keepData && node.nodeType === 1 ) { - jQuery.cleanData( getAll( node ) ); - } - - if ( node.parentNode ) { - if ( keepData && isAttached( node ) ) { - setGlobalEval( getAll( node, "script" ) ); - } - node.parentNode.removeChild( node ); - } - } - - return elem; -} - -jQuery.extend( { - htmlPrefilter: function( html ) { - return html; - }, - - clone: function( elem, dataAndEvents, deepDataAndEvents ) { - var i, l, srcElements, destElements, - clone = elem.cloneNode( true ), - inPage = isAttached( elem ); - - // Fix IE cloning issues - if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && - !jQuery.isXMLDoc( elem ) ) { - - // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 - destElements = getAll( clone ); - srcElements = getAll( elem ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - fixInput( srcElements[ i ], destElements[ i ] ); - } - } - - // Copy the events from the original to the clone - if ( dataAndEvents ) { - if ( deepDataAndEvents ) { - srcElements = srcElements || getAll( elem ); - destElements = destElements || getAll( clone ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - cloneCopyEvent( srcElements[ i ], destElements[ i ] ); - } - } else { - cloneCopyEvent( elem, clone ); - } - } - - // Preserve script evaluation history - destElements = getAll( clone, "script" ); - if ( destElements.length > 0 ) { - setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); - } - - // Return the cloned set - return clone; - }, - - cleanData: function( elems ) { - var data, elem, type, - special = jQuery.event.special, - i = 0; - - for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { - if ( acceptData( elem ) ) { - if ( ( data = elem[ dataPriv.expando ] ) ) { - if ( data.events ) { - for ( type in data.events ) { - if ( special[ type ] ) { - jQuery.event.remove( elem, type ); - - // This is a shortcut to avoid jQuery.event.remove's overhead - } else { - jQuery.removeEvent( elem, type, data.handle ); - } - } - } - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataPriv.expando ] = undefined; - } - if ( elem[ dataUser.expando ] ) { - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataUser.expando ] = undefined; - } - } - } - } -} ); - -jQuery.fn.extend( { - detach: function( selector ) { - return remove( this, selector, true ); - }, - - remove: function( selector ) { - return remove( this, selector ); - }, - - text: function( value ) { - return access( this, function( value ) { - return value === undefined ? - jQuery.text( this ) : - this.empty().each( function() { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - this.textContent = value; - } - } ); - }, null, value, arguments.length ); - }, - - append: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.appendChild( elem ); - } - } ); - }, - - prepend: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.insertBefore( elem, target.firstChild ); - } - } ); - }, - - before: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this ); - } - } ); - }, - - after: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this.nextSibling ); - } - } ); - }, - - empty: function() { - var elem, - i = 0; - - for ( ; ( elem = this[ i ] ) != null; i++ ) { - if ( elem.nodeType === 1 ) { - - // Prevent memory leaks - jQuery.cleanData( getAll( elem, false ) ); - - // Remove any remaining nodes - elem.textContent = ""; - } - } - - return this; - }, - - clone: function( dataAndEvents, deepDataAndEvents ) { - dataAndEvents = dataAndEvents == null ? false : dataAndEvents; - deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - - return this.map( function() { - return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); - } ); - }, - - html: function( value ) { - return access( this, function( value ) { - var elem = this[ 0 ] || {}, - i = 0, - l = this.length; - - if ( value === undefined && elem.nodeType === 1 ) { - return elem.innerHTML; - } - - // See if we can take a shortcut and just use innerHTML - if ( typeof value === "string" && !rnoInnerhtml.test( value ) && - !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { - - value = jQuery.htmlPrefilter( value ); - - try { - for ( ; i < l; i++ ) { - elem = this[ i ] || {}; - - // Remove element nodes and prevent memory leaks - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - elem.innerHTML = value; - } - } - - elem = 0; - - // If using innerHTML throws an exception, use the fallback method - } catch ( e ) {} - } - - if ( elem ) { - this.empty().append( value ); - } - }, null, value, arguments.length ); - }, - - replaceWith: function() { - var ignored = []; - - // Make the changes, replacing each non-ignored context element with the new content - return domManip( this, arguments, function( elem ) { - var parent = this.parentNode; - - if ( jQuery.inArray( this, ignored ) < 0 ) { - jQuery.cleanData( getAll( this ) ); - if ( parent ) { - parent.replaceChild( elem, this ); - } - } - - // Force callback invocation - }, ignored ); - } -} ); - -jQuery.each( { - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" -}, function( name, original ) { - jQuery.fn[ name ] = function( selector ) { - var elems, - ret = [], - insert = jQuery( selector ), - last = insert.length - 1, - i = 0; - - for ( ; i <= last; i++ ) { - elems = i === last ? this : this.clone( true ); - jQuery( insert[ i ] )[ original ]( elems ); - - // Support: Android <=4.0 only, PhantomJS 1 only - // .get() because push.apply(_, arraylike) throws on ancient WebKit - push.apply( ret, elems.get() ); - } - - return this.pushStack( ret ); - }; -} ); -var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); - -var getStyles = function( elem ) { - - // Support: IE <=11 only, Firefox <=30 (#15098, #14150) - // IE throws on elements created in popups - // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" - var view = elem.ownerDocument.defaultView; - - if ( !view || !view.opener ) { - view = window; - } - - return view.getComputedStyle( elem ); - }; - -var swap = function( elem, options, callback ) { - var ret, name, - old = {}; - - // Remember the old values, and insert the new ones - for ( name in options ) { - old[ name ] = elem.style[ name ]; - elem.style[ name ] = options[ name ]; - } - - ret = callback.call( elem ); - - // Revert the old values - for ( name in options ) { - elem.style[ name ] = old[ name ]; - } - - return ret; -}; - - -var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); - - - -( function() { - - // Executing both pixelPosition & boxSizingReliable tests require only one layout - // so they're executed at the same time to save the second computation. - function computeStyleTests() { - - // This is a singleton, we need to execute it only once - if ( !div ) { - return; - } - - container.style.cssText = "position:absolute;left:-11111px;width:60px;" + - "margin-top:1px;padding:0;border:0"; - div.style.cssText = - "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + - "margin:auto;border:1px;padding:1px;" + - "width:60%;top:1%"; - documentElement.appendChild( container ).appendChild( div ); - - var divStyle = window.getComputedStyle( div ); - pixelPositionVal = divStyle.top !== "1%"; - - // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 - reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; - - // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 - // Some styles come back with percentage values, even though they shouldn't - div.style.right = "60%"; - pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; - - // Support: IE 9 - 11 only - // Detect misreporting of content dimensions for box-sizing:border-box elements - boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; - - // Support: IE 9 only - // Detect overflow:scroll screwiness (gh-3699) - // Support: Chrome <=64 - // Don't get tricked when zoom affects offsetWidth (gh-4029) - div.style.position = "absolute"; - scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; - - documentElement.removeChild( container ); - - // Nullify the div so it wouldn't be stored in the memory and - // it will also be a sign that checks already performed - div = null; - } - - function roundPixelMeasures( measure ) { - return Math.round( parseFloat( measure ) ); - } - - var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, - reliableTrDimensionsVal, reliableMarginLeftVal, - container = document.createElement( "div" ), - div = document.createElement( "div" ); - - // Finish early in limited (non-browser) environments - if ( !div.style ) { - return; - } - - // Support: IE <=9 - 11 only - // Style of cloned element affects source element cloned (#8908) - div.style.backgroundClip = "content-box"; - div.cloneNode( true ).style.backgroundClip = ""; - support.clearCloneStyle = div.style.backgroundClip === "content-box"; - - jQuery.extend( support, { - boxSizingReliable: function() { - computeStyleTests(); - return boxSizingReliableVal; - }, - pixelBoxStyles: function() { - computeStyleTests(); - return pixelBoxStylesVal; - }, - pixelPosition: function() { - computeStyleTests(); - return pixelPositionVal; - }, - reliableMarginLeft: function() { - computeStyleTests(); - return reliableMarginLeftVal; - }, - scrollboxSize: function() { - computeStyleTests(); - return scrollboxSizeVal; - }, - - // Support: IE 9 - 11+, Edge 15 - 18+ - // IE/Edge misreport `getComputedStyle` of table rows with width/height - // set in CSS while `offset*` properties report correct values. - // Behavior in IE 9 is more subtle than in newer versions & it passes - // some versions of this test; make sure not to make it pass there! - reliableTrDimensions: function() { - var table, tr, trChild, trStyle; - if ( reliableTrDimensionsVal == null ) { - table = document.createElement( "table" ); - tr = document.createElement( "tr" ); - trChild = document.createElement( "div" ); - - table.style.cssText = "position:absolute;left:-11111px"; - tr.style.height = "1px"; - trChild.style.height = "9px"; - - documentElement - .appendChild( table ) - .appendChild( tr ) - .appendChild( trChild ); - - trStyle = window.getComputedStyle( tr ); - reliableTrDimensionsVal = parseInt( trStyle.height ) > 3; - - documentElement.removeChild( table ); - } - return reliableTrDimensionsVal; - } - } ); -} )(); - - -function curCSS( elem, name, computed ) { - var width, minWidth, maxWidth, ret, - - // Support: Firefox 51+ - // Retrieving style before computed somehow - // fixes an issue with getting wrong values - // on detached elements - style = elem.style; - - computed = computed || getStyles( elem ); - - // getPropertyValue is needed for: - // .css('filter') (IE 9 only, #12537) - // .css('--customProperty) (#3144) - if ( computed ) { - ret = computed.getPropertyValue( name ) || computed[ name ]; - - if ( ret === "" && !isAttached( elem ) ) { - ret = jQuery.style( elem, name ); - } - - // A tribute to the "awesome hack by Dean Edwards" - // Android Browser returns percentage for some values, - // but width seems to be reliably pixels. - // This is against the CSSOM draft spec: - // https://drafts.csswg.org/cssom/#resolved-values - if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { - - // Remember the original values - width = style.width; - minWidth = style.minWidth; - maxWidth = style.maxWidth; - - // Put in the new values to get a computed value out - style.minWidth = style.maxWidth = style.width = ret; - ret = computed.width; - - // Revert the changed values - style.width = width; - style.minWidth = minWidth; - style.maxWidth = maxWidth; - } - } - - return ret !== undefined ? - - // Support: IE <=9 - 11 only - // IE returns zIndex value as an integer. - ret + "" : - ret; -} - - -function addGetHookIf( conditionFn, hookFn ) { - - // Define the hook, we'll check on the first run if it's really needed. - return { - get: function() { - if ( conditionFn() ) { - - // Hook not needed (or it's not possible to use it due - // to missing dependency), remove it. - delete this.get; - return; - } - - // Hook needed; redefine it so that the support test is not executed again. - return ( this.get = hookFn ).apply( this, arguments ); - } - }; -} - - -var cssPrefixes = [ "Webkit", "Moz", "ms" ], - emptyStyle = document.createElement( "div" ).style, - vendorProps = {}; - -// Return a vendor-prefixed property or undefined -function vendorPropName( name ) { - - // Check for vendor prefixed names - var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), - i = cssPrefixes.length; - - while ( i-- ) { - name = cssPrefixes[ i ] + capName; - if ( name in emptyStyle ) { - return name; - } - } -} - -// Return a potentially-mapped jQuery.cssProps or vendor prefixed property -function finalPropName( name ) { - var final = jQuery.cssProps[ name ] || vendorProps[ name ]; - - if ( final ) { - return final; - } - if ( name in emptyStyle ) { - return name; - } - return vendorProps[ name ] = vendorPropName( name ) || name; -} - - -var - - // Swappable if display is none or starts with table - // except "table", "table-cell", or "table-caption" - // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display - rdisplayswap = /^(none|table(?!-c[ea]).+)/, - rcustomProp = /^--/, - cssShow = { position: "absolute", visibility: "hidden", display: "block" }, - cssNormalTransform = { - letterSpacing: "0", - fontWeight: "400" - }; - -function setPositiveNumber( _elem, value, subtract ) { - - // Any relative (+/-) values have already been - // normalized at this point - var matches = rcssNum.exec( value ); - return matches ? - - // Guard against undefined "subtract", e.g., when used as in cssHooks - Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : - value; -} - -function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { - var i = dimension === "width" ? 1 : 0, - extra = 0, - delta = 0; - - // Adjustment may not be necessary - if ( box === ( isBorderBox ? "border" : "content" ) ) { - return 0; - } - - for ( ; i < 4; i += 2 ) { - - // Both box models exclude margin - if ( box === "margin" ) { - delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); - } - - // If we get here with a content-box, we're seeking "padding" or "border" or "margin" - if ( !isBorderBox ) { - - // Add padding - delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - - // For "border" or "margin", add border - if ( box !== "padding" ) { - delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - - // But still keep track of it otherwise - } else { - extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - - // If we get here with a border-box (content + padding + border), we're seeking "content" or - // "padding" or "margin" - } else { - - // For "content", subtract padding - if ( box === "content" ) { - delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - } - - // For "content" or "padding", subtract border - if ( box !== "margin" ) { - delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } - } - - // Account for positive content-box scroll gutter when requested by providing computedVal - if ( !isBorderBox && computedVal >= 0 ) { - - // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border - // Assuming integer scroll gutter, subtract the rest and round down - delta += Math.max( 0, Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - computedVal - - delta - - extra - - 0.5 - - // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter - // Use an explicit zero to avoid NaN (gh-3964) - ) ) || 0; - } - - return delta; -} - -function getWidthOrHeight( elem, dimension, extra ) { - - // Start with computed style - var styles = getStyles( elem ), - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). - // Fake content-box until we know it's needed to know the true value. - boxSizingNeeded = !support.boxSizingReliable() || extra, - isBorderBox = boxSizingNeeded && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - valueIsBorderBox = isBorderBox, - - val = curCSS( elem, dimension, styles ), - offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); - - // Support: Firefox <=54 - // Return a confounding non-pixel value or feign ignorance, as appropriate. - if ( rnumnonpx.test( val ) ) { - if ( !extra ) { - return val; - } - val = "auto"; - } - - - // Support: IE 9 - 11 only - // Use offsetWidth/offsetHeight for when box sizing is unreliable. - // In those cases, the computed value can be trusted to be border-box. - if ( ( !support.boxSizingReliable() && isBorderBox || - - // Support: IE 10 - 11+, Edge 15 - 18+ - // IE/Edge misreport `getComputedStyle` of table rows with width/height - // set in CSS while `offset*` properties report correct values. - // Interestingly, in some cases IE 9 doesn't suffer from this issue. - !support.reliableTrDimensions() && nodeName( elem, "tr" ) || - - // Fall back to offsetWidth/offsetHeight when value is "auto" - // This happens for inline elements with no explicit setting (gh-3571) - val === "auto" || - - // Support: Android <=4.1 - 4.3 only - // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) - !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && - - // Make sure the element is visible & connected - elem.getClientRects().length ) { - - isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; - - // Where available, offsetWidth/offsetHeight approximate border box dimensions. - // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the - // retrieved value as a content box dimension. - valueIsBorderBox = offsetProp in elem; - if ( valueIsBorderBox ) { - val = elem[ offsetProp ]; - } - } - - // Normalize "" and auto - val = parseFloat( val ) || 0; - - // Adjust for the element's box model - return ( val + - boxModelAdjustment( - elem, - dimension, - extra || ( isBorderBox ? "border" : "content" ), - valueIsBorderBox, - styles, - - // Provide the current computed size to request scroll gutter calculation (gh-3589) - val - ) - ) + "px"; -} - -jQuery.extend( { - - // Add in style property hooks for overriding the default - // behavior of getting and setting a style property - cssHooks: { - opacity: { - get: function( elem, computed ) { - if ( computed ) { - - // We should always get a number back from opacity - var ret = curCSS( elem, "opacity" ); - return ret === "" ? "1" : ret; - } - } - } - }, - - // Don't automatically add "px" to these possibly-unitless properties - cssNumber: { - "animationIterationCount": true, - "columnCount": true, - "fillOpacity": true, - "flexGrow": true, - "flexShrink": true, - "fontWeight": true, - "gridArea": true, - "gridColumn": true, - "gridColumnEnd": true, - "gridColumnStart": true, - "gridRow": true, - "gridRowEnd": true, - "gridRowStart": true, - "lineHeight": true, - "opacity": true, - "order": true, - "orphans": true, - "widows": true, - "zIndex": true, - "zoom": true - }, - - // Add in properties whose names you wish to fix before - // setting or getting the value - cssProps: {}, - - // Get and set the style property on a DOM Node - style: function( elem, name, value, extra ) { - - // Don't set styles on text and comment nodes - if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { - return; - } - - // Make sure that we're working with the right name - var ret, type, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ), - style = elem.style; - - // Make sure that we're working with the right name. We don't - // want to query the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Gets hook for the prefixed version, then unprefixed version - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // Check if we're setting a value - if ( value !== undefined ) { - type = typeof value; - - // Convert "+=" or "-=" to relative numbers (#7345) - if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { - value = adjustCSS( elem, name, ret ); - - // Fixes bug #9237 - type = "number"; - } - - // Make sure that null and NaN values aren't set (#7116) - if ( value == null || value !== value ) { - return; - } - - // If a number was passed in, add the unit (except for certain CSS properties) - // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append - // "px" to a few hardcoded values. - if ( type === "number" && !isCustomProp ) { - value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); - } - - // background-* props affect original clone's values - if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { - style[ name ] = "inherit"; - } - - // If a hook was provided, use that value, otherwise just set the specified value - if ( !hooks || !( "set" in hooks ) || - ( value = hooks.set( elem, value, extra ) ) !== undefined ) { - - if ( isCustomProp ) { - style.setProperty( name, value ); - } else { - style[ name ] = value; - } - } - - } else { - - // If a hook was provided get the non-computed value from there - if ( hooks && "get" in hooks && - ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { - - return ret; - } - - // Otherwise just get the value from the style object - return style[ name ]; - } - }, - - css: function( elem, name, extra, styles ) { - var val, num, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ); - - // Make sure that we're working with the right name. We don't - // want to modify the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Try prefixed name followed by the unprefixed name - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // If a hook was provided get the computed value from there - if ( hooks && "get" in hooks ) { - val = hooks.get( elem, true, extra ); - } - - // Otherwise, if a way to get the computed value exists, use that - if ( val === undefined ) { - val = curCSS( elem, name, styles ); - } - - // Convert "normal" to computed value - if ( val === "normal" && name in cssNormalTransform ) { - val = cssNormalTransform[ name ]; - } - - // Make numeric if forced or a qualifier was provided and val looks numeric - if ( extra === "" || extra ) { - num = parseFloat( val ); - return extra === true || isFinite( num ) ? num || 0 : val; - } - - return val; - } -} ); - -jQuery.each( [ "height", "width" ], function( _i, dimension ) { - jQuery.cssHooks[ dimension ] = { - get: function( elem, computed, extra ) { - if ( computed ) { - - // Certain elements can have dimension info if we invisibly show them - // but it must have a current display style that would benefit - return rdisplayswap.test( jQuery.css( elem, "display" ) ) && - - // Support: Safari 8+ - // Table columns in Safari have non-zero offsetWidth & zero - // getBoundingClientRect().width unless display is changed. - // Support: IE <=11 only - // Running getBoundingClientRect on a disconnected node - // in IE throws an error. - ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? - swap( elem, cssShow, function() { - return getWidthOrHeight( elem, dimension, extra ); - } ) : - getWidthOrHeight( elem, dimension, extra ); - } - }, - - set: function( elem, value, extra ) { - var matches, - styles = getStyles( elem ), - - // Only read styles.position if the test has a chance to fail - // to avoid forcing a reflow. - scrollboxSizeBuggy = !support.scrollboxSize() && - styles.position === "absolute", - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) - boxSizingNeeded = scrollboxSizeBuggy || extra, - isBorderBox = boxSizingNeeded && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - subtract = extra ? - boxModelAdjustment( - elem, - dimension, - extra, - isBorderBox, - styles - ) : - 0; - - // Account for unreliable border-box dimensions by comparing offset* to computed and - // faking a content-box to get border and padding (gh-3699) - if ( isBorderBox && scrollboxSizeBuggy ) { - subtract -= Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - parseFloat( styles[ dimension ] ) - - boxModelAdjustment( elem, dimension, "border", false, styles ) - - 0.5 - ); - } - - // Convert to pixels if value adjustment is needed - if ( subtract && ( matches = rcssNum.exec( value ) ) && - ( matches[ 3 ] || "px" ) !== "px" ) { - - elem.style[ dimension ] = value; - value = jQuery.css( elem, dimension ); - } - - return setPositiveNumber( elem, value, subtract ); - } - }; -} ); - -jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, - function( elem, computed ) { - if ( computed ) { - return ( parseFloat( curCSS( elem, "marginLeft" ) ) || - elem.getBoundingClientRect().left - - swap( elem, { marginLeft: 0 }, function() { - return elem.getBoundingClientRect().left; - } ) - ) + "px"; - } - } -); - -// These hooks are used by animate to expand properties -jQuery.each( { - margin: "", - padding: "", - border: "Width" -}, function( prefix, suffix ) { - jQuery.cssHooks[ prefix + suffix ] = { - expand: function( value ) { - var i = 0, - expanded = {}, - - // Assumes a single number if not a string - parts = typeof value === "string" ? value.split( " " ) : [ value ]; - - for ( ; i < 4; i++ ) { - expanded[ prefix + cssExpand[ i ] + suffix ] = - parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; - } - - return expanded; - } - }; - - if ( prefix !== "margin" ) { - jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; - } -} ); - -jQuery.fn.extend( { - css: function( name, value ) { - return access( this, function( elem, name, value ) { - var styles, len, - map = {}, - i = 0; - - if ( Array.isArray( name ) ) { - styles = getStyles( elem ); - len = name.length; - - for ( ; i < len; i++ ) { - map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); - } - - return map; - } - - return value !== undefined ? - jQuery.style( elem, name, value ) : - jQuery.css( elem, name ); - }, name, value, arguments.length > 1 ); - } -} ); - - -function Tween( elem, options, prop, end, easing ) { - return new Tween.prototype.init( elem, options, prop, end, easing ); -} -jQuery.Tween = Tween; - -Tween.prototype = { - constructor: Tween, - init: function( elem, options, prop, end, easing, unit ) { - this.elem = elem; - this.prop = prop; - this.easing = easing || jQuery.easing._default; - this.options = options; - this.start = this.now = this.cur(); - this.end = end; - this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); - }, - cur: function() { - var hooks = Tween.propHooks[ this.prop ]; - - return hooks && hooks.get ? - hooks.get( this ) : - Tween.propHooks._default.get( this ); - }, - run: function( percent ) { - var eased, - hooks = Tween.propHooks[ this.prop ]; - - if ( this.options.duration ) { - this.pos = eased = jQuery.easing[ this.easing ]( - percent, this.options.duration * percent, 0, 1, this.options.duration - ); - } else { - this.pos = eased = percent; - } - this.now = ( this.end - this.start ) * eased + this.start; - - if ( this.options.step ) { - this.options.step.call( this.elem, this.now, this ); - } - - if ( hooks && hooks.set ) { - hooks.set( this ); - } else { - Tween.propHooks._default.set( this ); - } - return this; - } -}; - -Tween.prototype.init.prototype = Tween.prototype; - -Tween.propHooks = { - _default: { - get: function( tween ) { - var result; - - // Use a property on the element directly when it is not a DOM element, - // or when there is no matching style property that exists. - if ( tween.elem.nodeType !== 1 || - tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { - return tween.elem[ tween.prop ]; - } - - // Passing an empty string as a 3rd parameter to .css will automatically - // attempt a parseFloat and fallback to a string if the parse fails. - // Simple values such as "10px" are parsed to Float; - // complex values such as "rotate(1rad)" are returned as-is. - result = jQuery.css( tween.elem, tween.prop, "" ); - - // Empty strings, null, undefined and "auto" are converted to 0. - return !result || result === "auto" ? 0 : result; - }, - set: function( tween ) { - - // Use step hook for back compat. - // Use cssHook if its there. - // Use .style if available and use plain properties where available. - if ( jQuery.fx.step[ tween.prop ] ) { - jQuery.fx.step[ tween.prop ]( tween ); - } else if ( tween.elem.nodeType === 1 && ( - jQuery.cssHooks[ tween.prop ] || - tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { - jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); - } else { - tween.elem[ tween.prop ] = tween.now; - } - } - } -}; - -// Support: IE <=9 only -// Panic based approach to setting things on disconnected nodes -Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { - set: function( tween ) { - if ( tween.elem.nodeType && tween.elem.parentNode ) { - tween.elem[ tween.prop ] = tween.now; - } - } -}; - -jQuery.easing = { - linear: function( p ) { - return p; - }, - swing: function( p ) { - return 0.5 - Math.cos( p * Math.PI ) / 2; - }, - _default: "swing" -}; - -jQuery.fx = Tween.prototype.init; - -// Back compat <1.8 extension point -jQuery.fx.step = {}; - - - - -var - fxNow, inProgress, - rfxtypes = /^(?:toggle|show|hide)$/, - rrun = /queueHooks$/; - -function schedule() { - if ( inProgress ) { - if ( document.hidden === false && window.requestAnimationFrame ) { - window.requestAnimationFrame( schedule ); - } else { - window.setTimeout( schedule, jQuery.fx.interval ); - } - - jQuery.fx.tick(); - } -} - -// Animations created synchronously will run synchronously -function createFxNow() { - window.setTimeout( function() { - fxNow = undefined; - } ); - return ( fxNow = Date.now() ); -} - -// Generate parameters to create a standard animation -function genFx( type, includeWidth ) { - var which, - i = 0, - attrs = { height: type }; - - // If we include width, step value is 1 to do all cssExpand values, - // otherwise step value is 2 to skip over Left and Right - includeWidth = includeWidth ? 1 : 0; - for ( ; i < 4; i += 2 - includeWidth ) { - which = cssExpand[ i ]; - attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; - } - - if ( includeWidth ) { - attrs.opacity = attrs.width = type; - } - - return attrs; -} - -function createTween( value, prop, animation ) { - var tween, - collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), - index = 0, - length = collection.length; - for ( ; index < length; index++ ) { - if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { - - // We're done with this property - return tween; - } - } -} - -function defaultPrefilter( elem, props, opts ) { - var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, - isBox = "width" in props || "height" in props, - anim = this, - orig = {}, - style = elem.style, - hidden = elem.nodeType && isHiddenWithinTree( elem ), - dataShow = dataPriv.get( elem, "fxshow" ); - - // Queue-skipping animations hijack the fx hooks - if ( !opts.queue ) { - hooks = jQuery._queueHooks( elem, "fx" ); - if ( hooks.unqueued == null ) { - hooks.unqueued = 0; - oldfire = hooks.empty.fire; - hooks.empty.fire = function() { - if ( !hooks.unqueued ) { - oldfire(); - } - }; - } - hooks.unqueued++; - - anim.always( function() { - - // Ensure the complete handler is called before this completes - anim.always( function() { - hooks.unqueued--; - if ( !jQuery.queue( elem, "fx" ).length ) { - hooks.empty.fire(); - } - } ); - } ); - } - - // Detect show/hide animations - for ( prop in props ) { - value = props[ prop ]; - if ( rfxtypes.test( value ) ) { - delete props[ prop ]; - toggle = toggle || value === "toggle"; - if ( value === ( hidden ? "hide" : "show" ) ) { - - // Pretend to be hidden if this is a "show" and - // there is still data from a stopped show/hide - if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { - hidden = true; - - // Ignore all other no-op show/hide data - } else { - continue; - } - } - orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); - } - } - - // Bail out if this is a no-op like .hide().hide() - propTween = !jQuery.isEmptyObject( props ); - if ( !propTween && jQuery.isEmptyObject( orig ) ) { - return; - } - - // Restrict "overflow" and "display" styles during box animations - if ( isBox && elem.nodeType === 1 ) { - - // Support: IE <=9 - 11, Edge 12 - 15 - // Record all 3 overflow attributes because IE does not infer the shorthand - // from identically-valued overflowX and overflowY and Edge just mirrors - // the overflowX value there. - opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; - - // Identify a display type, preferring old show/hide data over the CSS cascade - restoreDisplay = dataShow && dataShow.display; - if ( restoreDisplay == null ) { - restoreDisplay = dataPriv.get( elem, "display" ); - } - display = jQuery.css( elem, "display" ); - if ( display === "none" ) { - if ( restoreDisplay ) { - display = restoreDisplay; - } else { - - // Get nonempty value(s) by temporarily forcing visibility - showHide( [ elem ], true ); - restoreDisplay = elem.style.display || restoreDisplay; - display = jQuery.css( elem, "display" ); - showHide( [ elem ] ); - } - } - - // Animate inline elements as inline-block - if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { - if ( jQuery.css( elem, "float" ) === "none" ) { - - // Restore the original display value at the end of pure show/hide animations - if ( !propTween ) { - anim.done( function() { - style.display = restoreDisplay; - } ); - if ( restoreDisplay == null ) { - display = style.display; - restoreDisplay = display === "none" ? "" : display; - } - } - style.display = "inline-block"; - } - } - } - - if ( opts.overflow ) { - style.overflow = "hidden"; - anim.always( function() { - style.overflow = opts.overflow[ 0 ]; - style.overflowX = opts.overflow[ 1 ]; - style.overflowY = opts.overflow[ 2 ]; - } ); - } - - // Implement show/hide animations - propTween = false; - for ( prop in orig ) { - - // General show/hide setup for this element animation - if ( !propTween ) { - if ( dataShow ) { - if ( "hidden" in dataShow ) { - hidden = dataShow.hidden; - } - } else { - dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); - } - - // Store hidden/visible for toggle so `.stop().toggle()` "reverses" - if ( toggle ) { - dataShow.hidden = !hidden; - } - - // Show elements before animating them - if ( hidden ) { - showHide( [ elem ], true ); - } - - /* eslint-disable no-loop-func */ - - anim.done( function() { - - /* eslint-enable no-loop-func */ - - // The final step of a "hide" animation is actually hiding the element - if ( !hidden ) { - showHide( [ elem ] ); - } - dataPriv.remove( elem, "fxshow" ); - for ( prop in orig ) { - jQuery.style( elem, prop, orig[ prop ] ); - } - } ); - } - - // Per-property setup - propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); - if ( !( prop in dataShow ) ) { - dataShow[ prop ] = propTween.start; - if ( hidden ) { - propTween.end = propTween.start; - propTween.start = 0; - } - } - } -} - -function propFilter( props, specialEasing ) { - var index, name, easing, value, hooks; - - // camelCase, specialEasing and expand cssHook pass - for ( index in props ) { - name = camelCase( index ); - easing = specialEasing[ name ]; - value = props[ index ]; - if ( Array.isArray( value ) ) { - easing = value[ 1 ]; - value = props[ index ] = value[ 0 ]; - } - - if ( index !== name ) { - props[ name ] = value; - delete props[ index ]; - } - - hooks = jQuery.cssHooks[ name ]; - if ( hooks && "expand" in hooks ) { - value = hooks.expand( value ); - delete props[ name ]; - - // Not quite $.extend, this won't overwrite existing keys. - // Reusing 'index' because we have the correct "name" - for ( index in value ) { - if ( !( index in props ) ) { - props[ index ] = value[ index ]; - specialEasing[ index ] = easing; - } - } - } else { - specialEasing[ name ] = easing; - } - } -} - -function Animation( elem, properties, options ) { - var result, - stopped, - index = 0, - length = Animation.prefilters.length, - deferred = jQuery.Deferred().always( function() { - - // Don't match elem in the :animated selector - delete tick.elem; - } ), - tick = function() { - if ( stopped ) { - return false; - } - var currentTime = fxNow || createFxNow(), - remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), - - // Support: Android 2.3 only - // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) - temp = remaining / animation.duration || 0, - percent = 1 - temp, - index = 0, - length = animation.tweens.length; - - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( percent ); - } - - deferred.notifyWith( elem, [ animation, percent, remaining ] ); - - // If there's more to do, yield - if ( percent < 1 && length ) { - return remaining; - } - - // If this was an empty animation, synthesize a final progress notification - if ( !length ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - } - - // Resolve the animation and report its conclusion - deferred.resolveWith( elem, [ animation ] ); - return false; - }, - animation = deferred.promise( { - elem: elem, - props: jQuery.extend( {}, properties ), - opts: jQuery.extend( true, { - specialEasing: {}, - easing: jQuery.easing._default - }, options ), - originalProperties: properties, - originalOptions: options, - startTime: fxNow || createFxNow(), - duration: options.duration, - tweens: [], - createTween: function( prop, end ) { - var tween = jQuery.Tween( elem, animation.opts, prop, end, - animation.opts.specialEasing[ prop ] || animation.opts.easing ); - animation.tweens.push( tween ); - return tween; - }, - stop: function( gotoEnd ) { - var index = 0, - - // If we are going to the end, we want to run all the tweens - // otherwise we skip this part - length = gotoEnd ? animation.tweens.length : 0; - if ( stopped ) { - return this; - } - stopped = true; - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( 1 ); - } - - // Resolve when we played the last frame; otherwise, reject - if ( gotoEnd ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - deferred.resolveWith( elem, [ animation, gotoEnd ] ); - } else { - deferred.rejectWith( elem, [ animation, gotoEnd ] ); - } - return this; - } - } ), - props = animation.props; - - propFilter( props, animation.opts.specialEasing ); - - for ( ; index < length; index++ ) { - result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); - if ( result ) { - if ( isFunction( result.stop ) ) { - jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = - result.stop.bind( result ); - } - return result; - } - } - - jQuery.map( props, createTween, animation ); - - if ( isFunction( animation.opts.start ) ) { - animation.opts.start.call( elem, animation ); - } - - // Attach callbacks from options - animation - .progress( animation.opts.progress ) - .done( animation.opts.done, animation.opts.complete ) - .fail( animation.opts.fail ) - .always( animation.opts.always ); - - jQuery.fx.timer( - jQuery.extend( tick, { - elem: elem, - anim: animation, - queue: animation.opts.queue - } ) - ); - - return animation; -} - -jQuery.Animation = jQuery.extend( Animation, { - - tweeners: { - "*": [ function( prop, value ) { - var tween = this.createTween( prop, value ); - adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); - return tween; - } ] - }, - - tweener: function( props, callback ) { - if ( isFunction( props ) ) { - callback = props; - props = [ "*" ]; - } else { - props = props.match( rnothtmlwhite ); - } - - var prop, - index = 0, - length = props.length; - - for ( ; index < length; index++ ) { - prop = props[ index ]; - Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; - Animation.tweeners[ prop ].unshift( callback ); - } - }, - - prefilters: [ defaultPrefilter ], - - prefilter: function( callback, prepend ) { - if ( prepend ) { - Animation.prefilters.unshift( callback ); - } else { - Animation.prefilters.push( callback ); - } - } -} ); - -jQuery.speed = function( speed, easing, fn ) { - var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { - complete: fn || !fn && easing || - isFunction( speed ) && speed, - duration: speed, - easing: fn && easing || easing && !isFunction( easing ) && easing - }; - - // Go to the end state if fx are off - if ( jQuery.fx.off ) { - opt.duration = 0; - - } else { - if ( typeof opt.duration !== "number" ) { - if ( opt.duration in jQuery.fx.speeds ) { - opt.duration = jQuery.fx.speeds[ opt.duration ]; - - } else { - opt.duration = jQuery.fx.speeds._default; - } - } - } - - // Normalize opt.queue - true/undefined/null -> "fx" - if ( opt.queue == null || opt.queue === true ) { - opt.queue = "fx"; - } - - // Queueing - opt.old = opt.complete; - - opt.complete = function() { - if ( isFunction( opt.old ) ) { - opt.old.call( this ); - } - - if ( opt.queue ) { - jQuery.dequeue( this, opt.queue ); - } - }; - - return opt; -}; - -jQuery.fn.extend( { - fadeTo: function( speed, to, easing, callback ) { - - // Show any hidden elements after setting opacity to 0 - return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() - - // Animate to the value specified - .end().animate( { opacity: to }, speed, easing, callback ); - }, - animate: function( prop, speed, easing, callback ) { - var empty = jQuery.isEmptyObject( prop ), - optall = jQuery.speed( speed, easing, callback ), - doAnimation = function() { - - // Operate on a copy of prop so per-property easing won't be lost - var anim = Animation( this, jQuery.extend( {}, prop ), optall ); - - // Empty animations, or finishing resolves immediately - if ( empty || dataPriv.get( this, "finish" ) ) { - anim.stop( true ); - } - }; - doAnimation.finish = doAnimation; - - return empty || optall.queue === false ? - this.each( doAnimation ) : - this.queue( optall.queue, doAnimation ); - }, - stop: function( type, clearQueue, gotoEnd ) { - var stopQueue = function( hooks ) { - var stop = hooks.stop; - delete hooks.stop; - stop( gotoEnd ); - }; - - if ( typeof type !== "string" ) { - gotoEnd = clearQueue; - clearQueue = type; - type = undefined; - } - if ( clearQueue ) { - this.queue( type || "fx", [] ); - } - - return this.each( function() { - var dequeue = true, - index = type != null && type + "queueHooks", - timers = jQuery.timers, - data = dataPriv.get( this ); - - if ( index ) { - if ( data[ index ] && data[ index ].stop ) { - stopQueue( data[ index ] ); - } - } else { - for ( index in data ) { - if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { - stopQueue( data[ index ] ); - } - } - } - - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && - ( type == null || timers[ index ].queue === type ) ) { - - timers[ index ].anim.stop( gotoEnd ); - dequeue = false; - timers.splice( index, 1 ); - } - } - - // Start the next in the queue if the last step wasn't forced. - // Timers currently will call their complete callbacks, which - // will dequeue but only if they were gotoEnd. - if ( dequeue || !gotoEnd ) { - jQuery.dequeue( this, type ); - } - } ); - }, - finish: function( type ) { - if ( type !== false ) { - type = type || "fx"; - } - return this.each( function() { - var index, - data = dataPriv.get( this ), - queue = data[ type + "queue" ], - hooks = data[ type + "queueHooks" ], - timers = jQuery.timers, - length = queue ? queue.length : 0; - - // Enable finishing flag on private data - data.finish = true; - - // Empty the queue first - jQuery.queue( this, type, [] ); - - if ( hooks && hooks.stop ) { - hooks.stop.call( this, true ); - } - - // Look for any active animations, and finish them - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && timers[ index ].queue === type ) { - timers[ index ].anim.stop( true ); - timers.splice( index, 1 ); - } - } - - // Look for any animations in the old queue and finish them - for ( index = 0; index < length; index++ ) { - if ( queue[ index ] && queue[ index ].finish ) { - queue[ index ].finish.call( this ); - } - } - - // Turn off finishing flag - delete data.finish; - } ); - } -} ); - -jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) { - var cssFn = jQuery.fn[ name ]; - jQuery.fn[ name ] = function( speed, easing, callback ) { - return speed == null || typeof speed === "boolean" ? - cssFn.apply( this, arguments ) : - this.animate( genFx( name, true ), speed, easing, callback ); - }; -} ); - -// Generate shortcuts for custom animations -jQuery.each( { - slideDown: genFx( "show" ), - slideUp: genFx( "hide" ), - slideToggle: genFx( "toggle" ), - fadeIn: { opacity: "show" }, - fadeOut: { opacity: "hide" }, - fadeToggle: { opacity: "toggle" } -}, function( name, props ) { - jQuery.fn[ name ] = function( speed, easing, callback ) { - return this.animate( props, speed, easing, callback ); - }; -} ); - -jQuery.timers = []; -jQuery.fx.tick = function() { - var timer, - i = 0, - timers = jQuery.timers; - - fxNow = Date.now(); - - for ( ; i < timers.length; i++ ) { - timer = timers[ i ]; - - // Run the timer and safely remove it when done (allowing for external removal) - if ( !timer() && timers[ i ] === timer ) { - timers.splice( i--, 1 ); - } - } - - if ( !timers.length ) { - jQuery.fx.stop(); - } - fxNow = undefined; -}; - -jQuery.fx.timer = function( timer ) { - jQuery.timers.push( timer ); - jQuery.fx.start(); -}; - -jQuery.fx.interval = 13; -jQuery.fx.start = function() { - if ( inProgress ) { - return; - } - - inProgress = true; - schedule(); -}; - -jQuery.fx.stop = function() { - inProgress = null; -}; - -jQuery.fx.speeds = { - slow: 600, - fast: 200, - - // Default speed - _default: 400 -}; - - -// Based off of the plugin by Clint Helfers, with permission. -// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ -jQuery.fn.delay = function( time, type ) { - time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; - type = type || "fx"; - - return this.queue( type, function( next, hooks ) { - var timeout = window.setTimeout( next, time ); - hooks.stop = function() { - window.clearTimeout( timeout ); - }; - } ); -}; - - -( function() { - var input = document.createElement( "input" ), - select = document.createElement( "select" ), - opt = select.appendChild( document.createElement( "option" ) ); - - input.type = "checkbox"; - - // Support: Android <=4.3 only - // Default value for a checkbox should be "on" - support.checkOn = input.value !== ""; - - // Support: IE <=11 only - // Must access selectedIndex to make default options select - support.optSelected = opt.selected; - - // Support: IE <=11 only - // An input loses its value after becoming a radio - input = document.createElement( "input" ); - input.value = "t"; - input.type = "radio"; - support.radioValue = input.value === "t"; -} )(); - - -var boolHook, - attrHandle = jQuery.expr.attrHandle; - -jQuery.fn.extend( { - attr: function( name, value ) { - return access( this, jQuery.attr, name, value, arguments.length > 1 ); - }, - - removeAttr: function( name ) { - return this.each( function() { - jQuery.removeAttr( this, name ); - } ); - } -} ); - -jQuery.extend( { - attr: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set attributes on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - // Fallback to prop when attributes are not supported - if ( typeof elem.getAttribute === "undefined" ) { - return jQuery.prop( elem, name, value ); - } - - // Attribute hooks are determined by the lowercase version - // Grab necessary hook if one is defined - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - hooks = jQuery.attrHooks[ name.toLowerCase() ] || - ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); - } - - if ( value !== undefined ) { - if ( value === null ) { - jQuery.removeAttr( elem, name ); - return; - } - - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - elem.setAttribute( name, value + "" ); - return value; - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - ret = jQuery.find.attr( elem, name ); - - // Non-existent attributes return null, we normalize to undefined - return ret == null ? undefined : ret; - }, - - attrHooks: { - type: { - set: function( elem, value ) { - if ( !support.radioValue && value === "radio" && - nodeName( elem, "input" ) ) { - var val = elem.value; - elem.setAttribute( "type", value ); - if ( val ) { - elem.value = val; - } - return value; - } - } - } - }, - - removeAttr: function( elem, value ) { - var name, - i = 0, - - // Attribute names can contain non-HTML whitespace characters - // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 - attrNames = value && value.match( rnothtmlwhite ); - - if ( attrNames && elem.nodeType === 1 ) { - while ( ( name = attrNames[ i++ ] ) ) { - elem.removeAttribute( name ); - } - } - } -} ); - -// Hooks for boolean attributes -boolHook = { - set: function( elem, value, name ) { - if ( value === false ) { - - // Remove boolean attributes when set to false - jQuery.removeAttr( elem, name ); - } else { - elem.setAttribute( name, name ); - } - return name; - } -}; - -jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) { - var getter = attrHandle[ name ] || jQuery.find.attr; - - attrHandle[ name ] = function( elem, name, isXML ) { - var ret, handle, - lowercaseName = name.toLowerCase(); - - if ( !isXML ) { - - // Avoid an infinite loop by temporarily removing this function from the getter - handle = attrHandle[ lowercaseName ]; - attrHandle[ lowercaseName ] = ret; - ret = getter( elem, name, isXML ) != null ? - lowercaseName : - null; - attrHandle[ lowercaseName ] = handle; - } - return ret; - }; -} ); - - - - -var rfocusable = /^(?:input|select|textarea|button)$/i, - rclickable = /^(?:a|area)$/i; - -jQuery.fn.extend( { - prop: function( name, value ) { - return access( this, jQuery.prop, name, value, arguments.length > 1 ); - }, - - removeProp: function( name ) { - return this.each( function() { - delete this[ jQuery.propFix[ name ] || name ]; - } ); - } -} ); - -jQuery.extend( { - prop: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set properties on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - - // Fix name and attach hooks - name = jQuery.propFix[ name ] || name; - hooks = jQuery.propHooks[ name ]; - } - - if ( value !== undefined ) { - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - return ( elem[ name ] = value ); - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - return elem[ name ]; - }, - - propHooks: { - tabIndex: { - get: function( elem ) { - - // Support: IE <=9 - 11 only - // elem.tabIndex doesn't always return the - // correct value when it hasn't been explicitly set - // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ - // Use proper attribute retrieval(#12072) - var tabindex = jQuery.find.attr( elem, "tabindex" ); - - if ( tabindex ) { - return parseInt( tabindex, 10 ); - } - - if ( - rfocusable.test( elem.nodeName ) || - rclickable.test( elem.nodeName ) && - elem.href - ) { - return 0; - } - - return -1; - } - } - }, - - propFix: { - "for": "htmlFor", - "class": "className" - } -} ); - -// Support: IE <=11 only -// Accessing the selectedIndex property -// forces the browser to respect setting selected -// on the option -// The getter ensures a default option is selected -// when in an optgroup -// eslint rule "no-unused-expressions" is disabled for this code -// since it considers such accessions noop -if ( !support.optSelected ) { - jQuery.propHooks.selected = { - get: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent && parent.parentNode ) { - parent.parentNode.selectedIndex; - } - return null; - }, - set: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent ) { - parent.selectedIndex; - - if ( parent.parentNode ) { - parent.parentNode.selectedIndex; - } - } - } - }; -} - -jQuery.each( [ - "tabIndex", - "readOnly", - "maxLength", - "cellSpacing", - "cellPadding", - "rowSpan", - "colSpan", - "useMap", - "frameBorder", - "contentEditable" -], function() { - jQuery.propFix[ this.toLowerCase() ] = this; -} ); - - - - - // Strip and collapse whitespace according to HTML spec - // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace - function stripAndCollapse( value ) { - var tokens = value.match( rnothtmlwhite ) || []; - return tokens.join( " " ); - } - - -function getClass( elem ) { - return elem.getAttribute && elem.getAttribute( "class" ) || ""; -} - -function classesToArray( value ) { - if ( Array.isArray( value ) ) { - return value; - } - if ( typeof value === "string" ) { - return value.match( rnothtmlwhite ) || []; - } - return []; -} - -jQuery.fn.extend( { - addClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - classes = classesToArray( value ); - - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - if ( cur.indexOf( " " + clazz + " " ) < 0 ) { - cur += clazz + " "; - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - removeClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - if ( !arguments.length ) { - return this.attr( "class", "" ); - } - - classes = classesToArray( value ); - - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - - // This expression is here for better compressibility (see addClass) - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - - // Remove *all* instances - while ( cur.indexOf( " " + clazz + " " ) > -1 ) { - cur = cur.replace( " " + clazz + " ", " " ); - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - toggleClass: function( value, stateVal ) { - var type = typeof value, - isValidValue = type === "string" || Array.isArray( value ); - - if ( typeof stateVal === "boolean" && isValidValue ) { - return stateVal ? this.addClass( value ) : this.removeClass( value ); - } - - if ( isFunction( value ) ) { - return this.each( function( i ) { - jQuery( this ).toggleClass( - value.call( this, i, getClass( this ), stateVal ), - stateVal - ); - } ); - } - - return this.each( function() { - var className, i, self, classNames; - - if ( isValidValue ) { - - // Toggle individual class names - i = 0; - self = jQuery( this ); - classNames = classesToArray( value ); - - while ( ( className = classNames[ i++ ] ) ) { - - // Check each className given, space separated list - if ( self.hasClass( className ) ) { - self.removeClass( className ); - } else { - self.addClass( className ); - } - } - - // Toggle whole class name - } else if ( value === undefined || type === "boolean" ) { - className = getClass( this ); - if ( className ) { - - // Store className if set - dataPriv.set( this, "__className__", className ); - } - - // If the element has a class name or if we're passed `false`, - // then remove the whole classname (if there was one, the above saved it). - // Otherwise bring back whatever was previously saved (if anything), - // falling back to the empty string if nothing was stored. - if ( this.setAttribute ) { - this.setAttribute( "class", - className || value === false ? - "" : - dataPriv.get( this, "__className__" ) || "" - ); - } - } - } ); - }, - - hasClass: function( selector ) { - var className, elem, - i = 0; - - className = " " + selector + " "; - while ( ( elem = this[ i++ ] ) ) { - if ( elem.nodeType === 1 && - ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { - return true; - } - } - - return false; - } -} ); - - - - -var rreturn = /\r/g; - -jQuery.fn.extend( { - val: function( value ) { - var hooks, ret, valueIsFunction, - elem = this[ 0 ]; - - if ( !arguments.length ) { - if ( elem ) { - hooks = jQuery.valHooks[ elem.type ] || - jQuery.valHooks[ elem.nodeName.toLowerCase() ]; - - if ( hooks && - "get" in hooks && - ( ret = hooks.get( elem, "value" ) ) !== undefined - ) { - return ret; - } - - ret = elem.value; - - // Handle most common string cases - if ( typeof ret === "string" ) { - return ret.replace( rreturn, "" ); - } - - // Handle cases where value is null/undef or number - return ret == null ? "" : ret; - } - - return; - } - - valueIsFunction = isFunction( value ); - - return this.each( function( i ) { - var val; - - if ( this.nodeType !== 1 ) { - return; - } - - if ( valueIsFunction ) { - val = value.call( this, i, jQuery( this ).val() ); - } else { - val = value; - } - - // Treat null/undefined as ""; convert numbers to string - if ( val == null ) { - val = ""; - - } else if ( typeof val === "number" ) { - val += ""; - - } else if ( Array.isArray( val ) ) { - val = jQuery.map( val, function( value ) { - return value == null ? "" : value + ""; - } ); - } - - hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; - - // If set returns undefined, fall back to normal setting - if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { - this.value = val; - } - } ); - } -} ); - -jQuery.extend( { - valHooks: { - option: { - get: function( elem ) { - - var val = jQuery.find.attr( elem, "value" ); - return val != null ? - val : - - // Support: IE <=10 - 11 only - // option.text throws exceptions (#14686, #14858) - // Strip and collapse whitespace - // https://html.spec.whatwg.org/#strip-and-collapse-whitespace - stripAndCollapse( jQuery.text( elem ) ); - } - }, - select: { - get: function( elem ) { - var value, option, i, - options = elem.options, - index = elem.selectedIndex, - one = elem.type === "select-one", - values = one ? null : [], - max = one ? index + 1 : options.length; - - if ( index < 0 ) { - i = max; - - } else { - i = one ? index : 0; - } - - // Loop through all the selected options - for ( ; i < max; i++ ) { - option = options[ i ]; - - // Support: IE <=9 only - // IE8-9 doesn't update selected after form reset (#2551) - if ( ( option.selected || i === index ) && - - // Don't return options that are disabled or in a disabled optgroup - !option.disabled && - ( !option.parentNode.disabled || - !nodeName( option.parentNode, "optgroup" ) ) ) { - - // Get the specific value for the option - value = jQuery( option ).val(); - - // We don't need an array for one selects - if ( one ) { - return value; - } - - // Multi-Selects return an array - values.push( value ); - } - } - - return values; - }, - - set: function( elem, value ) { - var optionSet, option, - options = elem.options, - values = jQuery.makeArray( value ), - i = options.length; - - while ( i-- ) { - option = options[ i ]; - - /* eslint-disable no-cond-assign */ - - if ( option.selected = - jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 - ) { - optionSet = true; - } - - /* eslint-enable no-cond-assign */ - } - - // Force browsers to behave consistently when non-matching value is set - if ( !optionSet ) { - elem.selectedIndex = -1; - } - return values; - } - } - } -} ); - -// Radios and checkboxes getter/setter -jQuery.each( [ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = { - set: function( elem, value ) { - if ( Array.isArray( value ) ) { - return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); - } - } - }; - if ( !support.checkOn ) { - jQuery.valHooks[ this ].get = function( elem ) { - return elem.getAttribute( "value" ) === null ? "on" : elem.value; - }; - } -} ); - - - - -// Return jQuery for attributes-only inclusion - - -support.focusin = "onfocusin" in window; - - -var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, - stopPropagationCallback = function( e ) { - e.stopPropagation(); - }; - -jQuery.extend( jQuery.event, { - - trigger: function( event, data, elem, onlyHandlers ) { - - var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, - eventPath = [ elem || document ], - type = hasOwn.call( event, "type" ) ? event.type : event, - namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; - - cur = lastElement = tmp = elem = elem || document; - - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } - - if ( type.indexOf( "." ) > -1 ) { - - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split( "." ); - type = namespaces.shift(); - namespaces.sort(); - } - ontype = type.indexOf( ":" ) < 0 && "on" + type; - - // Caller can pass in a jQuery.Event object, Object, or just an event type string - event = event[ jQuery.expando ] ? - event : - new jQuery.Event( type, typeof event === "object" && event ); - - // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) - event.isTrigger = onlyHandlers ? 2 : 3; - event.namespace = namespaces.join( "." ); - event.rnamespace = event.namespace ? - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : - null; - - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data == null ? - [ event ] : - jQuery.makeArray( data, [ event ] ); - - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { - - bubbleType = special.delegateType || type; - if ( !rfocusMorph.test( bubbleType + type ) ) { - cur = cur.parentNode; - } - for ( ; cur; cur = cur.parentNode ) { - eventPath.push( cur ); - tmp = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( tmp === ( elem.ownerDocument || document ) ) { - eventPath.push( tmp.defaultView || tmp.parentWindow || window ); - } - } - - // Fire handlers on the event path - i = 0; - while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { - lastElement = cur; - event.type = i > 1 ? - bubbleType : - special.bindType || type; - - // jQuery handler - handle = ( - dataPriv.get( cur, "events" ) || Object.create( null ) - )[ event.type ] && - dataPriv.get( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - - // Native handler - handle = ontype && cur[ ontype ]; - if ( handle && handle.apply && acceptData( cur ) ) { - event.result = handle.apply( cur, data ); - if ( event.result === false ) { - event.preventDefault(); - } - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( ( !special._default || - special._default.apply( eventPath.pop(), data ) === false ) && - acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name as the event. - // Don't do default actions on window, that's where global variables be (#6170) - if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - tmp = elem[ ontype ]; - - if ( tmp ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - - if ( event.isPropagationStopped() ) { - lastElement.addEventListener( type, stopPropagationCallback ); - } - - elem[ type ](); - - if ( event.isPropagationStopped() ) { - lastElement.removeEventListener( type, stopPropagationCallback ); - } - - jQuery.event.triggered = undefined; - - if ( tmp ) { - elem[ ontype ] = tmp; - } - } - } - } - - return event.result; - }, - - // Piggyback on a donor event to simulate a different one - // Used only for `focus(in | out)` events - simulate: function( type, elem, event ) { - var e = jQuery.extend( - new jQuery.Event(), - event, - { - type: type, - isSimulated: true - } - ); - - jQuery.event.trigger( e, null, elem ); - } - -} ); - -jQuery.fn.extend( { - - trigger: function( type, data ) { - return this.each( function() { - jQuery.event.trigger( type, data, this ); - } ); - }, - triggerHandler: function( type, data ) { - var elem = this[ 0 ]; - if ( elem ) { - return jQuery.event.trigger( type, data, elem, true ); - } - } -} ); - - -// Support: Firefox <=44 -// Firefox doesn't have focus(in | out) events -// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 -// -// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 -// focus(in | out) events fire after focus & blur events, -// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order -// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 -if ( !support.focusin ) { - jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler on the document while someone wants focusin/focusout - var handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); - }; - - jQuery.event.special[ fix ] = { - setup: function() { - - // Handle: regular nodes (via `this.ownerDocument`), window - // (via `this.document`) & document (via `this`). - var doc = this.ownerDocument || this.document || this, - attaches = dataPriv.access( doc, fix ); - - if ( !attaches ) { - doc.addEventListener( orig, handler, true ); - } - dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); - }, - teardown: function() { - var doc = this.ownerDocument || this.document || this, - attaches = dataPriv.access( doc, fix ) - 1; - - if ( !attaches ) { - doc.removeEventListener( orig, handler, true ); - dataPriv.remove( doc, fix ); - - } else { - dataPriv.access( doc, fix, attaches ); - } - } - }; - } ); -} -var location = window.location; - -var nonce = { guid: Date.now() }; - -var rquery = ( /\?/ ); - - - -// Cross-browser xml parsing -jQuery.parseXML = function( data ) { - var xml; - if ( !data || typeof data !== "string" ) { - return null; - } - - // Support: IE 9 - 11 only - // IE throws on parseFromString with invalid input. - try { - xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); - } catch ( e ) { - xml = undefined; - } - - if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { - jQuery.error( "Invalid XML: " + data ); - } - return xml; -}; - - -var - rbracket = /\[\]$/, - rCRLF = /\r?\n/g, - rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, - rsubmittable = /^(?:input|select|textarea|keygen)/i; - -function buildParams( prefix, obj, traditional, add ) { - var name; - - if ( Array.isArray( obj ) ) { - - // Serialize array item. - jQuery.each( obj, function( i, v ) { - if ( traditional || rbracket.test( prefix ) ) { - - // Treat each array item as a scalar. - add( prefix, v ); - - } else { - - // Item is non-scalar (array or object), encode its numeric index. - buildParams( - prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", - v, - traditional, - add - ); - } - } ); - - } else if ( !traditional && toType( obj ) === "object" ) { - - // Serialize object item. - for ( name in obj ) { - buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); - } - - } else { - - // Serialize scalar item. - add( prefix, obj ); - } -} - -// Serialize an array of form elements or a set of -// key/values into a query string -jQuery.param = function( a, traditional ) { - var prefix, - s = [], - add = function( key, valueOrFunction ) { - - // If value is a function, invoke it and use its return value - var value = isFunction( valueOrFunction ) ? - valueOrFunction() : - valueOrFunction; - - s[ s.length ] = encodeURIComponent( key ) + "=" + - encodeURIComponent( value == null ? "" : value ); - }; - - if ( a == null ) { - return ""; - } - - // If an array was passed in, assume that it is an array of form elements. - if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { - - // Serialize the form elements - jQuery.each( a, function() { - add( this.name, this.value ); - } ); - - } else { - - // If traditional, encode the "old" way (the way 1.3.2 or older - // did it), otherwise encode params recursively. - for ( prefix in a ) { - buildParams( prefix, a[ prefix ], traditional, add ); - } - } - - // Return the resulting serialization - return s.join( "&" ); -}; - -jQuery.fn.extend( { - serialize: function() { - return jQuery.param( this.serializeArray() ); - }, - serializeArray: function() { - return this.map( function() { - - // Can add propHook for "elements" to filter or add form elements - var elements = jQuery.prop( this, "elements" ); - return elements ? jQuery.makeArray( elements ) : this; - } ) - .filter( function() { - var type = this.type; - - // Use .is( ":disabled" ) so that fieldset[disabled] works - return this.name && !jQuery( this ).is( ":disabled" ) && - rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && - ( this.checked || !rcheckableType.test( type ) ); - } ) - .map( function( _i, elem ) { - var val = jQuery( this ).val(); - - if ( val == null ) { - return null; - } - - if ( Array.isArray( val ) ) { - return jQuery.map( val, function( val ) { - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ); - } - - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ).get(); - } -} ); - - -var - r20 = /%20/g, - rhash = /#.*$/, - rantiCache = /([?&])_=[^&]*/, - rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, - - // #7653, #8125, #8152: local protocol detection - rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, - rnoContent = /^(?:GET|HEAD)$/, - rprotocol = /^\/\//, - - /* Prefilters - * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) - * 2) These are called: - * - BEFORE asking for a transport - * - AFTER param serialization (s.data is a string if s.processData is true) - * 3) key is the dataType - * 4) the catchall symbol "*" can be used - * 5) execution will start with transport dataType and THEN continue down to "*" if needed - */ - prefilters = {}, - - /* Transports bindings - * 1) key is the dataType - * 2) the catchall symbol "*" can be used - * 3) selection will start with transport dataType and THEN go to "*" if needed - */ - transports = {}, - - // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression - allTypes = "*/".concat( "*" ), - - // Anchor tag for parsing the document origin - originAnchor = document.createElement( "a" ); - originAnchor.href = location.href; - -// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport -function addToPrefiltersOrTransports( structure ) { - - // dataTypeExpression is optional and defaults to "*" - return function( dataTypeExpression, func ) { - - if ( typeof dataTypeExpression !== "string" ) { - func = dataTypeExpression; - dataTypeExpression = "*"; - } - - var dataType, - i = 0, - dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; - - if ( isFunction( func ) ) { - - // For each dataType in the dataTypeExpression - while ( ( dataType = dataTypes[ i++ ] ) ) { - - // Prepend if requested - if ( dataType[ 0 ] === "+" ) { - dataType = dataType.slice( 1 ) || "*"; - ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); - - // Otherwise append - } else { - ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); - } - } - } - }; -} - -// Base inspection function for prefilters and transports -function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { - - var inspected = {}, - seekingTransport = ( structure === transports ); - - function inspect( dataType ) { - var selected; - inspected[ dataType ] = true; - jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { - var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); - if ( typeof dataTypeOrTransport === "string" && - !seekingTransport && !inspected[ dataTypeOrTransport ] ) { - - options.dataTypes.unshift( dataTypeOrTransport ); - inspect( dataTypeOrTransport ); - return false; - } else if ( seekingTransport ) { - return !( selected = dataTypeOrTransport ); - } - } ); - return selected; - } - - return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); -} - -// A special extend for ajax options -// that takes "flat" options (not to be deep extended) -// Fixes #9887 -function ajaxExtend( target, src ) { - var key, deep, - flatOptions = jQuery.ajaxSettings.flatOptions || {}; - - for ( key in src ) { - if ( src[ key ] !== undefined ) { - ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; - } - } - if ( deep ) { - jQuery.extend( true, target, deep ); - } - - return target; -} - -/* Handles responses to an ajax request: - * - finds the right dataType (mediates between content-type and expected dataType) - * - returns the corresponding response - */ -function ajaxHandleResponses( s, jqXHR, responses ) { - - var ct, type, finalDataType, firstDataType, - contents = s.contents, - dataTypes = s.dataTypes; - - // Remove auto dataType and get content-type in the process - while ( dataTypes[ 0 ] === "*" ) { - dataTypes.shift(); - if ( ct === undefined ) { - ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); - } - } - - // Check if we're dealing with a known content-type - if ( ct ) { - for ( type in contents ) { - if ( contents[ type ] && contents[ type ].test( ct ) ) { - dataTypes.unshift( type ); - break; - } - } - } - - // Check to see if we have a response for the expected dataType - if ( dataTypes[ 0 ] in responses ) { - finalDataType = dataTypes[ 0 ]; - } else { - - // Try convertible dataTypes - for ( type in responses ) { - if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { - finalDataType = type; - break; - } - if ( !firstDataType ) { - firstDataType = type; - } - } - - // Or just use first one - finalDataType = finalDataType || firstDataType; - } - - // If we found a dataType - // We add the dataType to the list if needed - // and return the corresponding response - if ( finalDataType ) { - if ( finalDataType !== dataTypes[ 0 ] ) { - dataTypes.unshift( finalDataType ); - } - return responses[ finalDataType ]; - } -} - -/* Chain conversions given the request and the original response - * Also sets the responseXXX fields on the jqXHR instance - */ -function ajaxConvert( s, response, jqXHR, isSuccess ) { - var conv2, current, conv, tmp, prev, - converters = {}, - - // Work with a copy of dataTypes in case we need to modify it for conversion - dataTypes = s.dataTypes.slice(); - - // Create converters map with lowercased keys - if ( dataTypes[ 1 ] ) { - for ( conv in s.converters ) { - converters[ conv.toLowerCase() ] = s.converters[ conv ]; - } - } - - current = dataTypes.shift(); - - // Convert to each sequential dataType - while ( current ) { - - if ( s.responseFields[ current ] ) { - jqXHR[ s.responseFields[ current ] ] = response; - } - - // Apply the dataFilter if provided - if ( !prev && isSuccess && s.dataFilter ) { - response = s.dataFilter( response, s.dataType ); - } - - prev = current; - current = dataTypes.shift(); - - if ( current ) { - - // There's only work to do if current dataType is non-auto - if ( current === "*" ) { - - current = prev; - - // Convert response if prev dataType is non-auto and differs from current - } else if ( prev !== "*" && prev !== current ) { - - // Seek a direct converter - conv = converters[ prev + " " + current ] || converters[ "* " + current ]; - - // If none found, seek a pair - if ( !conv ) { - for ( conv2 in converters ) { - - // If conv2 outputs current - tmp = conv2.split( " " ); - if ( tmp[ 1 ] === current ) { - - // If prev can be converted to accepted input - conv = converters[ prev + " " + tmp[ 0 ] ] || - converters[ "* " + tmp[ 0 ] ]; - if ( conv ) { - - // Condense equivalence converters - if ( conv === true ) { - conv = converters[ conv2 ]; - - // Otherwise, insert the intermediate dataType - } else if ( converters[ conv2 ] !== true ) { - current = tmp[ 0 ]; - dataTypes.unshift( tmp[ 1 ] ); - } - break; - } - } - } - } - - // Apply converter (if not an equivalence) - if ( conv !== true ) { - - // Unless errors are allowed to bubble, catch and return them - if ( conv && s.throws ) { - response = conv( response ); - } else { - try { - response = conv( response ); - } catch ( e ) { - return { - state: "parsererror", - error: conv ? e : "No conversion from " + prev + " to " + current - }; - } - } - } - } - } - } - - return { state: "success", data: response }; -} - -jQuery.extend( { - - // Counter for holding the number of active queries - active: 0, - - // Last-Modified header cache for next request - lastModified: {}, - etag: {}, - - ajaxSettings: { - url: location.href, - type: "GET", - isLocal: rlocalProtocol.test( location.protocol ), - global: true, - processData: true, - async: true, - contentType: "application/x-www-form-urlencoded; charset=UTF-8", - - /* - timeout: 0, - data: null, - dataType: null, - username: null, - password: null, - cache: null, - throws: false, - traditional: false, - headers: {}, - */ - - accepts: { - "*": allTypes, - text: "text/plain", - html: "text/html", - xml: "application/xml, text/xml", - json: "application/json, text/javascript" - }, - - contents: { - xml: /\bxml\b/, - html: /\bhtml/, - json: /\bjson\b/ - }, - - responseFields: { - xml: "responseXML", - text: "responseText", - json: "responseJSON" - }, - - // Data converters - // Keys separate source (or catchall "*") and destination types with a single space - converters: { - - // Convert anything to text - "* text": String, - - // Text to html (true = no transformation) - "text html": true, - - // Evaluate text as a json expression - "text json": JSON.parse, - - // Parse text as xml - "text xml": jQuery.parseXML - }, - - // For options that shouldn't be deep extended: - // you can add your own custom options here if - // and when you create one that shouldn't be - // deep extended (see ajaxExtend) - flatOptions: { - url: true, - context: true - } - }, - - // Creates a full fledged settings object into target - // with both ajaxSettings and settings fields. - // If target is omitted, writes into ajaxSettings. - ajaxSetup: function( target, settings ) { - return settings ? - - // Building a settings object - ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : - - // Extending ajaxSettings - ajaxExtend( jQuery.ajaxSettings, target ); - }, - - ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), - ajaxTransport: addToPrefiltersOrTransports( transports ), - - // Main method - ajax: function( url, options ) { - - // If url is an object, simulate pre-1.5 signature - if ( typeof url === "object" ) { - options = url; - url = undefined; - } - - // Force options to be an object - options = options || {}; - - var transport, - - // URL without anti-cache param - cacheURL, - - // Response headers - responseHeadersString, - responseHeaders, - - // timeout handle - timeoutTimer, - - // Url cleanup var - urlAnchor, - - // Request state (becomes false upon send and true upon completion) - completed, - - // To know if global events are to be dispatched - fireGlobals, - - // Loop variable - i, - - // uncached part of the url - uncached, - - // Create the final options object - s = jQuery.ajaxSetup( {}, options ), - - // Callbacks context - callbackContext = s.context || s, - - // Context for global events is callbackContext if it is a DOM node or jQuery collection - globalEventContext = s.context && - ( callbackContext.nodeType || callbackContext.jquery ) ? - jQuery( callbackContext ) : - jQuery.event, - - // Deferreds - deferred = jQuery.Deferred(), - completeDeferred = jQuery.Callbacks( "once memory" ), - - // Status-dependent callbacks - statusCode = s.statusCode || {}, - - // Headers (they are sent all at once) - requestHeaders = {}, - requestHeadersNames = {}, - - // Default abort message - strAbort = "canceled", - - // Fake xhr - jqXHR = { - readyState: 0, - - // Builds headers hashtable if needed - getResponseHeader: function( key ) { - var match; - if ( completed ) { - if ( !responseHeaders ) { - responseHeaders = {}; - while ( ( match = rheaders.exec( responseHeadersString ) ) ) { - responseHeaders[ match[ 1 ].toLowerCase() + " " ] = - ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) - .concat( match[ 2 ] ); - } - } - match = responseHeaders[ key.toLowerCase() + " " ]; - } - return match == null ? null : match.join( ", " ); - }, - - // Raw string - getAllResponseHeaders: function() { - return completed ? responseHeadersString : null; - }, - - // Caches the header - setRequestHeader: function( name, value ) { - if ( completed == null ) { - name = requestHeadersNames[ name.toLowerCase() ] = - requestHeadersNames[ name.toLowerCase() ] || name; - requestHeaders[ name ] = value; - } - return this; - }, - - // Overrides response content-type header - overrideMimeType: function( type ) { - if ( completed == null ) { - s.mimeType = type; - } - return this; - }, - - // Status-dependent callbacks - statusCode: function( map ) { - var code; - if ( map ) { - if ( completed ) { - - // Execute the appropriate callbacks - jqXHR.always( map[ jqXHR.status ] ); - } else { - - // Lazy-add the new callbacks in a way that preserves old ones - for ( code in map ) { - statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; - } - } - } - return this; - }, - - // Cancel the request - abort: function( statusText ) { - var finalText = statusText || strAbort; - if ( transport ) { - transport.abort( finalText ); - } - done( 0, finalText ); - return this; - } - }; - - // Attach deferreds - deferred.promise( jqXHR ); - - // Add protocol if not provided (prefilters might expect it) - // Handle falsy url in the settings object (#10093: consistency with old signature) - // We also use the url parameter if available - s.url = ( ( url || s.url || location.href ) + "" ) - .replace( rprotocol, location.protocol + "//" ); - - // Alias method option to type as per ticket #12004 - s.type = options.method || options.type || s.method || s.type; - - // Extract dataTypes list - s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; - - // A cross-domain request is in order when the origin doesn't match the current origin. - if ( s.crossDomain == null ) { - urlAnchor = document.createElement( "a" ); - - // Support: IE <=8 - 11, Edge 12 - 15 - // IE throws exception on accessing the href property if url is malformed, - // e.g. http://example.com:80x/ - try { - urlAnchor.href = s.url; - - // Support: IE <=8 - 11 only - // Anchor's host property isn't correctly set when s.url is relative - urlAnchor.href = urlAnchor.href; - s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== - urlAnchor.protocol + "//" + urlAnchor.host; - } catch ( e ) { - - // If there is an error parsing the URL, assume it is crossDomain, - // it can be rejected by the transport if it is invalid - s.crossDomain = true; - } - } - - // Convert data if not already a string - if ( s.data && s.processData && typeof s.data !== "string" ) { - s.data = jQuery.param( s.data, s.traditional ); - } - - // Apply prefilters - inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); - - // If request was aborted inside a prefilter, stop there - if ( completed ) { - return jqXHR; - } - - // We can fire global events as of now if asked to - // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) - fireGlobals = jQuery.event && s.global; - - // Watch for a new set of requests - if ( fireGlobals && jQuery.active++ === 0 ) { - jQuery.event.trigger( "ajaxStart" ); - } - - // Uppercase the type - s.type = s.type.toUpperCase(); - - // Determine if request has content - s.hasContent = !rnoContent.test( s.type ); - - // Save the URL in case we're toying with the If-Modified-Since - // and/or If-None-Match header later on - // Remove hash to simplify url manipulation - cacheURL = s.url.replace( rhash, "" ); - - // More options handling for requests with no content - if ( !s.hasContent ) { - - // Remember the hash so we can put it back - uncached = s.url.slice( cacheURL.length ); - - // If data is available and should be processed, append data to url - if ( s.data && ( s.processData || typeof s.data === "string" ) ) { - cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; - - // #9682: remove data so that it's not used in an eventual retry - delete s.data; - } - - // Add or update anti-cache param if needed - if ( s.cache === false ) { - cacheURL = cacheURL.replace( rantiCache, "$1" ); - uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) + - uncached; - } - - // Put hash and anti-cache on the URL that will be requested (gh-1732) - s.url = cacheURL + uncached; - - // Change '%20' to '+' if this is encoded form body content (gh-2658) - } else if ( s.data && s.processData && - ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { - s.data = s.data.replace( r20, "+" ); - } - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - if ( jQuery.lastModified[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); - } - if ( jQuery.etag[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); - } - } - - // Set the correct header, if data is being sent - if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { - jqXHR.setRequestHeader( "Content-Type", s.contentType ); - } - - // Set the Accepts header for the server, depending on the dataType - jqXHR.setRequestHeader( - "Accept", - s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? - s.accepts[ s.dataTypes[ 0 ] ] + - ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : - s.accepts[ "*" ] - ); - - // Check for headers option - for ( i in s.headers ) { - jqXHR.setRequestHeader( i, s.headers[ i ] ); - } - - // Allow custom headers/mimetypes and early abort - if ( s.beforeSend && - ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { - - // Abort if not done already and return - return jqXHR.abort(); - } - - // Aborting is no longer a cancellation - strAbort = "abort"; - - // Install callbacks on deferreds - completeDeferred.add( s.complete ); - jqXHR.done( s.success ); - jqXHR.fail( s.error ); - - // Get transport - transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); - - // If no transport, we auto-abort - if ( !transport ) { - done( -1, "No Transport" ); - } else { - jqXHR.readyState = 1; - - // Send global event - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); - } - - // If request was aborted inside ajaxSend, stop there - if ( completed ) { - return jqXHR; - } - - // Timeout - if ( s.async && s.timeout > 0 ) { - timeoutTimer = window.setTimeout( function() { - jqXHR.abort( "timeout" ); - }, s.timeout ); - } - - try { - completed = false; - transport.send( requestHeaders, done ); - } catch ( e ) { - - // Rethrow post-completion exceptions - if ( completed ) { - throw e; - } - - // Propagate others as results - done( -1, e ); - } - } - - // Callback for when everything is done - function done( status, nativeStatusText, responses, headers ) { - var isSuccess, success, error, response, modified, - statusText = nativeStatusText; - - // Ignore repeat invocations - if ( completed ) { - return; - } - - completed = true; - - // Clear timeout if it exists - if ( timeoutTimer ) { - window.clearTimeout( timeoutTimer ); - } - - // Dereference transport for early garbage collection - // (no matter how long the jqXHR object will be used) - transport = undefined; - - // Cache response headers - responseHeadersString = headers || ""; - - // Set readyState - jqXHR.readyState = status > 0 ? 4 : 0; - - // Determine if successful - isSuccess = status >= 200 && status < 300 || status === 304; - - // Get response data - if ( responses ) { - response = ajaxHandleResponses( s, jqXHR, responses ); - } - - // Use a noop converter for missing script - if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) { - s.converters[ "text script" ] = function() {}; - } - - // Convert no matter what (that way responseXXX fields are always set) - response = ajaxConvert( s, response, jqXHR, isSuccess ); - - // If successful, handle type chaining - if ( isSuccess ) { - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - modified = jqXHR.getResponseHeader( "Last-Modified" ); - if ( modified ) { - jQuery.lastModified[ cacheURL ] = modified; - } - modified = jqXHR.getResponseHeader( "etag" ); - if ( modified ) { - jQuery.etag[ cacheURL ] = modified; - } - } - - // if no content - if ( status === 204 || s.type === "HEAD" ) { - statusText = "nocontent"; - - // if not modified - } else if ( status === 304 ) { - statusText = "notmodified"; - - // If we have data, let's convert it - } else { - statusText = response.state; - success = response.data; - error = response.error; - isSuccess = !error; - } - } else { - - // Extract error from statusText and normalize for non-aborts - error = statusText; - if ( status || !statusText ) { - statusText = "error"; - if ( status < 0 ) { - status = 0; - } - } - } - - // Set data for the fake xhr object - jqXHR.status = status; - jqXHR.statusText = ( nativeStatusText || statusText ) + ""; - - // Success/Error - if ( isSuccess ) { - deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); - } else { - deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); - } - - // Status-dependent callbacks - jqXHR.statusCode( statusCode ); - statusCode = undefined; - - if ( fireGlobals ) { - globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", - [ jqXHR, s, isSuccess ? success : error ] ); - } - - // Complete - completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); - - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); - - // Handle the global AJAX counter - if ( !( --jQuery.active ) ) { - jQuery.event.trigger( "ajaxStop" ); - } - } - } - - return jqXHR; - }, - - getJSON: function( url, data, callback ) { - return jQuery.get( url, data, callback, "json" ); - }, - - getScript: function( url, callback ) { - return jQuery.get( url, undefined, callback, "script" ); - } -} ); - -jQuery.each( [ "get", "post" ], function( _i, method ) { - jQuery[ method ] = function( url, data, callback, type ) { - - // Shift arguments if data argument was omitted - if ( isFunction( data ) ) { - type = type || callback; - callback = data; - data = undefined; - } - - // The url can be an options object (which then must have .url) - return jQuery.ajax( jQuery.extend( { - url: url, - type: method, - dataType: type, - data: data, - success: callback - }, jQuery.isPlainObject( url ) && url ) ); - }; -} ); - -jQuery.ajaxPrefilter( function( s ) { - var i; - for ( i in s.headers ) { - if ( i.toLowerCase() === "content-type" ) { - s.contentType = s.headers[ i ] || ""; - } - } -} ); - - -jQuery._evalUrl = function( url, options, doc ) { - return jQuery.ajax( { - url: url, - - // Make this explicit, since user can override this through ajaxSetup (#11264) - type: "GET", - dataType: "script", - cache: true, - async: false, - global: false, - - // Only evaluate the response if it is successful (gh-4126) - // dataFilter is not invoked for failure responses, so using it instead - // of the default converter is kludgy but it works. - converters: { - "text script": function() {} - }, - dataFilter: function( response ) { - jQuery.globalEval( response, options, doc ); - } - } ); -}; - - -jQuery.fn.extend( { - wrapAll: function( html ) { - var wrap; - - if ( this[ 0 ] ) { - if ( isFunction( html ) ) { - html = html.call( this[ 0 ] ); - } - - // The elements to wrap the target around - wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); - - if ( this[ 0 ].parentNode ) { - wrap.insertBefore( this[ 0 ] ); - } - - wrap.map( function() { - var elem = this; - - while ( elem.firstElementChild ) { - elem = elem.firstElementChild; - } - - return elem; - } ).append( this ); - } - - return this; - }, - - wrapInner: function( html ) { - if ( isFunction( html ) ) { - return this.each( function( i ) { - jQuery( this ).wrapInner( html.call( this, i ) ); - } ); - } - - return this.each( function() { - var self = jQuery( this ), - contents = self.contents(); - - if ( contents.length ) { - contents.wrapAll( html ); - - } else { - self.append( html ); - } - } ); - }, - - wrap: function( html ) { - var htmlIsFunction = isFunction( html ); - - return this.each( function( i ) { - jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); - } ); - }, - - unwrap: function( selector ) { - this.parent( selector ).not( "body" ).each( function() { - jQuery( this ).replaceWith( this.childNodes ); - } ); - return this; - } -} ); - - -jQuery.expr.pseudos.hidden = function( elem ) { - return !jQuery.expr.pseudos.visible( elem ); -}; -jQuery.expr.pseudos.visible = function( elem ) { - return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); -}; - - - - -jQuery.ajaxSettings.xhr = function() { - try { - return new window.XMLHttpRequest(); - } catch ( e ) {} -}; - -var xhrSuccessStatus = { - - // File protocol always yields status code 0, assume 200 - 0: 200, - - // Support: IE <=9 only - // #1450: sometimes IE returns 1223 when it should be 204 - 1223: 204 - }, - xhrSupported = jQuery.ajaxSettings.xhr(); - -support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); -support.ajax = xhrSupported = !!xhrSupported; - -jQuery.ajaxTransport( function( options ) { - var callback, errorCallback; - - // Cross domain only allowed if supported through XMLHttpRequest - if ( support.cors || xhrSupported && !options.crossDomain ) { - return { - send: function( headers, complete ) { - var i, - xhr = options.xhr(); - - xhr.open( - options.type, - options.url, - options.async, - options.username, - options.password - ); - - // Apply custom fields if provided - if ( options.xhrFields ) { - for ( i in options.xhrFields ) { - xhr[ i ] = options.xhrFields[ i ]; - } - } - - // Override mime type if needed - if ( options.mimeType && xhr.overrideMimeType ) { - xhr.overrideMimeType( options.mimeType ); - } - - // X-Requested-With header - // For cross-domain requests, seeing as conditions for a preflight are - // akin to a jigsaw puzzle, we simply never set it to be sure. - // (it can always be set on a per-request basis or even using ajaxSetup) - // For same-domain requests, won't change header if already provided. - if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { - headers[ "X-Requested-With" ] = "XMLHttpRequest"; - } - - // Set headers - for ( i in headers ) { - xhr.setRequestHeader( i, headers[ i ] ); - } - - // Callback - callback = function( type ) { - return function() { - if ( callback ) { - callback = errorCallback = xhr.onload = - xhr.onerror = xhr.onabort = xhr.ontimeout = - xhr.onreadystatechange = null; - - if ( type === "abort" ) { - xhr.abort(); - } else if ( type === "error" ) { - - // Support: IE <=9 only - // On a manual native abort, IE9 throws - // errors on any property access that is not readyState - if ( typeof xhr.status !== "number" ) { - complete( 0, "error" ); - } else { - complete( - - // File: protocol always yields status 0; see #8605, #14207 - xhr.status, - xhr.statusText - ); - } - } else { - complete( - xhrSuccessStatus[ xhr.status ] || xhr.status, - xhr.statusText, - - // Support: IE <=9 only - // IE9 has no XHR2 but throws on binary (trac-11426) - // For XHR2 non-text, let the caller handle it (gh-2498) - ( xhr.responseType || "text" ) !== "text" || - typeof xhr.responseText !== "string" ? - { binary: xhr.response } : - { text: xhr.responseText }, - xhr.getAllResponseHeaders() - ); - } - } - }; - }; - - // Listen to events - xhr.onload = callback(); - errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); - - // Support: IE 9 only - // Use onreadystatechange to replace onabort - // to handle uncaught aborts - if ( xhr.onabort !== undefined ) { - xhr.onabort = errorCallback; - } else { - xhr.onreadystatechange = function() { - - // Check readyState before timeout as it changes - if ( xhr.readyState === 4 ) { - - // Allow onerror to be called first, - // but that will not handle a native abort - // Also, save errorCallback to a variable - // as xhr.onerror cannot be accessed - window.setTimeout( function() { - if ( callback ) { - errorCallback(); - } - } ); - } - }; - } - - // Create the abort callback - callback = callback( "abort" ); - - try { - - // Do send the request (this may raise an exception) - xhr.send( options.hasContent && options.data || null ); - } catch ( e ) { - - // #14683: Only rethrow if this hasn't been notified as an error yet - if ( callback ) { - throw e; - } - } - }, - - abort: function() { - if ( callback ) { - callback(); - } - } - }; - } -} ); - - - - -// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) -jQuery.ajaxPrefilter( function( s ) { - if ( s.crossDomain ) { - s.contents.script = false; - } -} ); - -// Install script dataType -jQuery.ajaxSetup( { - accepts: { - script: "text/javascript, application/javascript, " + - "application/ecmascript, application/x-ecmascript" - }, - contents: { - script: /\b(?:java|ecma)script\b/ - }, - converters: { - "text script": function( text ) { - jQuery.globalEval( text ); - return text; - } - } -} ); - -// Handle cache's special case and crossDomain -jQuery.ajaxPrefilter( "script", function( s ) { - if ( s.cache === undefined ) { - s.cache = false; - } - if ( s.crossDomain ) { - s.type = "GET"; - } -} ); - -// Bind script tag hack transport -jQuery.ajaxTransport( "script", function( s ) { - - // This transport only deals with cross domain or forced-by-attrs requests - if ( s.crossDomain || s.scriptAttrs ) { - var script, callback; - return { - send: function( _, complete ) { - script = jQuery( " - - - - - - - - - - - - - - - - - - - -
- - -
- -
-
-
- -
-
-
-
- - -

索引

- -
- M - -
-

M

- - - -
- - - -
-
- -
-
-
-
- - - - - \ No newline at end of file diff --git a/mdns/zh_CN/index.html b/mdns/zh_CN/index.html deleted file mode 100644 index e3cf9acad..000000000 --- a/mdns/zh_CN/index.html +++ /dev/null @@ -1,1599 +0,0 @@ - - - - - - - mDNS 服务 - ESP32 - — ESP-IDF 编程指南 latest 文档 - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
- -
-
-
- -
-
-
-
- -
-

mDNS 服务

-

en:[English]

-
-

概述

-

mDNS 是一种组播 UDP 服务,用来提供本地网络服务和主机发现。

-

绝大多数的操作系统默认都会安装 mDNS 服务,或者提供单独的安装包。Mac OS 默认会安装名为 Bonjour 的服务(该服务基于 mDNS),此外 Apple 还发布了适用于 Windows 系统的安装程序,可以在 官方支持 找到。在 Linux 上,mDNS 服务由 avahi 提供,通常也会被默认安装。

-
-

mDNS 属性

-
-
    -
  • hostname:设备会去响应的主机名,如果没有设置,会根据设备的网络接口名定义 hostname 。例如,my-esp32 会被解析为 my-esp32.local

  • -
  • default_instance:默认实例名(即易记的设备名),例如 Jhon's ESP32 Thing。如果没有设置,将会使用 hostname

  • -
-
-

以下为 STA 接口启动 mDNS 服务并设置 hostnamedefault_instance 的示例方法:

-
void start_mdns_service()
-{
-    // 初始化 mDNS 服务
-    esp_err_t err = mdns_init();
-    if (err) {
-        printf("MDNS Init failed: %d\n", err);
-        return;
-    }
-
-    // 设置 hostname
-    mdns_hostname_set("my-esp32");
-    // 设置默认实例
-    mdns_instance_name_set("Jhon's ESP32 Thing");
-}
-
-
-
-
-

mDNS 服务

-

mDNS 可以广播设备能够提供的网络服务的相关信息,每个服务会由以下属性构成。

-
-
    -
  • instance_name:实例名(即易记的服务名),例如 Jhon's ESP32 Web Server。如果没有定义,会使用 default_instance

  • -
  • service_type:(必需)服务类型,以下划线为前缀,这里 列出了常见的类型。

  • -
  • proto:(必需)服务运行所依赖的协议,以下划线为前缀,例如 _tcp 或者 _udp

  • -
  • port:(必需)服务运行所用的端口号。

  • -
  • txt:形如 {var, val} 的字符串数组,用于定义服务的属性。

  • -
-
-

添加一些服务和不同属性的示例方法:

-
void add_mdns_services()
-{
-    // 添加服务
-    mdns_service_add(NULL, "_http", "_tcp", 80, NULL, 0);
-    mdns_service_add(NULL, "_arduino", "_tcp", 3232, NULL, 0);
-    mdns_service_add(NULL, "_myservice", "_udp", 1234, NULL, 0);
-
-    // 注意:必须先添加服务,然后才能设置其属性
-    // web 服务器使用自定义的实例名
-    mdns_service_instance_name_set("_http", "_tcp", "Jhon's ESP32 Web Server");
-
-    mdns_txt_item_t serviceTxtData[3] = {
-        {"board","esp32"},
-        {"u","user"},
-        {"p","password"}
-    };
-    // 设置服务的文本数据(会释放并替换当前数据)
-    mdns_service_txt_set("_http", "_tcp", serviceTxtData, 3);
-
-    // 修改服务端口号
-    mdns_service_port_set("_myservice", "_udp", 4321);
-}
-
-
-
-
-

mDNS 查询

-

mDNS 提供查询服务和解析主机 IP/IPv6 地址的方法。

-

服务查询的结果会作为 mdns_result_t 类型对象的链表返回。

-

解析主机 IP 地址的示例方法:

-
void resolve_mdns_host(const char * host_name)
-{
-    printf("Query A: %s.local", host_name);
-
-    struct ip4_addr addr;
-    addr.addr = 0;
-
-    esp_err_t err = mdns_query_a(host_name, 2000,  &addr);
-    if(err){
-        if(err == ESP_ERR_NOT_FOUND){
-            printf("Host was not found!");
-            return;
-        }
-        printf("Query Failed");
-        return;
-    }
-
-    printf(IPSTR, IP2STR(&addr));
-}
-
-
-

解析本地服务的示例方法:

-
static const char * if_str[] = {"STA", "AP", "ETH", "MAX"};
-static const char * ip_protocol_str[] = {"V4", "V6", "MAX"};
-
-void mdns_print_results(mdns_result_t * results){
-    mdns_result_t * r = results;
-    mdns_ip_addr_t * a = NULL;
-    int i = 1, t;
-    while(r){
-        printf("%d: Interface: %s, Type: %s\n", i++, if_str[r->tcpip_if], ip_protocol_str[r->ip_protocol]);
-        if(r->instance_name){
-            printf("  PTR : %s\n", r->instance_name);
-        }
-        if(r->hostname){
-            printf("  SRV : %s.local:%u\n", r->hostname, r->port);
-        }
-        if(r->txt_count){
-            printf("  TXT : [%u] ", r->txt_count);
-            for(t=0; t<r->txt_count; t++){
-                printf("%s=%s; ", r->txt[t].key, r->txt[t].value);
-            }
-            printf("\n");
-        }
-        a = r->addr;
-        while(a){
-            if(a->addr.type == IPADDR_TYPE_V6){
-                printf("  AAAA: " IPV6STR "\n", IPV62STR(a->addr.u_addr.ip6));
-            } else {
-                printf("  A   : " IPSTR "\n", IP2STR(&(a->addr.u_addr.ip4)));
-            }
-            a = a->next;
-        }
-        r = r->next;
-    }
-
-}
-
-void find_mdns_service(const char * service_name, const char * proto)
-{
-    ESP_LOGI(TAG, "Query PTR: %s.%s.local", service_name, proto);
-
-    mdns_result_t * results = NULL;
-    esp_err_t err = mdns_query_ptr(service_name, proto, 3000, 20,  &results);
-    if(err){
-        ESP_LOGE(TAG, "Query Failed");
-        return;
-    }
-    if(!results){
-        ESP_LOGW(TAG, "No results found!");
-        return;
-    }
-
-    mdns_print_results(results);
-    mdns_query_results_free(results);
-}
-
-
-

使用上述方法的示例:

-
void my_app_some_method(){
-    // 搜索 esp32-mdns.local
-    resolve_mdns_host("esp32-mdns");
-
-    // 搜索 HTTP 服务器
-    find_mdns_service("_http", "_tcp");
-    // 或者搜索文件服务器
-    find_mdns_service("_smb", "_tcp"); // Windows 系统的共享服务
-    find_mdns_service("_afpovertcp", "_tcp"); // Apple AFP 文件共享服务
-    find_mdns_service("_nfs", "_tcp"); // NFS 服务器
-    find_mdns_service("_ftp", "_tcp"); // FTP 服务器
-    // 或者网络打印机
-    find_mdns_service("_printer", "_tcp");
-    find_mdns_service("_ipp", "_tcp");
-}
-
-
-
-
-
-

应用示例

-

有关 mDNS 服务器和查询器的应用示例请参考

-
-
-

API 参考

-
-

Header File

- -
-
-

Functions

-
-
-esp_err_t mdns_init(void)
-

Initialize mDNS on given interface.

-
-
返回
-

    -
  • ESP_OK on success

  • -
  • ESP_ERR_INVALID_STATE when failed to register event handler

  • -
  • ESP_ERR_NO_MEM on memory error

  • -
  • ESP_FAIL when failed to start mdns task

  • -
-

-
-
-
- -
-
-void mdns_free(void)
-

Stop and free mDNS server.

-
- -
-
-esp_err_t mdns_hostname_set(const char *hostname)
-

Set the hostname for mDNS server required if you want to advertise services.

-
-
参数
-

hostname – Hostname to set

-
-
返回
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_ARG Parameter error

  • -
  • ESP_ERR_NO_MEM memory error

  • -
-

-
-
-
- -
-
-esp_err_t mdns_delegate_hostname_add(const char *hostname, const mdns_ip_addr_t *address_list)
-

Adds a hostname and address to be delegated A/AAAA queries will be replied for the hostname and services can be added to this host.

-
-
参数
-
    -
  • hostname – Hostname to add

  • -
  • address_list – The IP address list of the host

  • -
-
-
返回
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_STATE mDNS is not running

  • -
  • ESP_ERR_INVALID_ARG Parameter error

  • -
  • ESP_ERR_NO_MEM memory error

  • -
-

-
-
-
- -
-
-esp_err_t mdns_delegate_hostname_remove(const char *hostname)
-

Remove a delegated hostname All the services added to this host will also be removed.

-
-
参数
-

hostname – Hostname to remove

-
-
返回
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_STATE mDNS is not running

  • -
  • ESP_ERR_INVALID_ARG Parameter error

  • -
  • ESP_ERR_NO_MEM memory error

  • -
-

-
-
-
- -
-
-bool mdns_hostname_exists(const char *hostname)
-

Query whether a hostname has been added.

-
-
参数
-

hostname – Hostname to query

-
-
返回
-

    -
  • true The hostname has been added.

  • -
  • false The hostname has not been added.

  • -
-

-
-
-
- -
-
-esp_err_t mdns_instance_name_set(const char *instance_name)
-

Set the default instance name for mDNS server.

-
-
参数
-

instance_name – Instance name to set

-
-
返回
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_ARG Parameter error

  • -
  • ESP_ERR_NO_MEM memory error

  • -
-

-
-
-
- -
-
-esp_err_t mdns_service_add(const char *instance_name, const char *service_type, const char *proto, uint16_t port, mdns_txt_item_t txt[], size_t num_items)
-

Add service to mDNS server.

-
-

备注

-

The value length of txt items will be automatically decided by strlen

-
-
-
参数
-
    -
  • instance_name – instance name to set. If NULL, global instance name or hostname will be used. Note that MDNS_MULTIPLE_INSTANCE config option needs to be enabled for adding multiple instances with the same instance type.

  • -
  • service_type – service type (_http, _ftp, etc)

  • -
  • proto – service protocol (_tcp, _udp)

  • -
  • port – service port

  • -
  • txt – string array of TXT data (eg. {{“var”,”val”},{“other”,”2”}})

  • -
  • num_items – number of items in TXT data

  • -
-
-
返回
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_ARG Parameter error

  • -
  • ESP_ERR_NO_MEM memory error

  • -
  • ESP_FAIL failed to add service

  • -
-

-
-
-
- -
-
-esp_err_t mdns_service_add_for_host(const char *instance_name, const char *service_type, const char *proto, const char *hostname, uint16_t port, mdns_txt_item_t txt[], size_t num_items)
-

Add service to mDNS server with a delegated hostname.

-
-

备注

-

The value length of txt items will be automatically decided by strlen

-
-
-
参数
-
    -
  • instance_name – instance name to set. If NULL, global instance name or hostname will be used Note that MDNS_MULTIPLE_INSTANCE config option needs to be enabled for adding multiple instances with the same instance type.

  • -
  • service_type – service type (_http, _ftp, etc)

  • -
  • proto – service protocol (_tcp, _udp)

  • -
  • hostname – service hostname. If NULL, local hostname will be used.

  • -
  • port – service port

  • -
  • txt – string array of TXT data (eg. {{“var”,”val”},{“other”,”2”}})

  • -
  • num_items – number of items in TXT data

  • -
-
-
返回
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_ARG Parameter error

  • -
  • ESP_ERR_NO_MEM memory error

  • -
  • ESP_FAIL failed to add service

  • -
-

-
-
-
- -
-
-bool mdns_service_exists(const char *service_type, const char *proto, const char *hostname)
-

Check whether a service has been added.

-
-
参数
-
    -
  • service_type – service type (_http, _ftp, etc)

  • -
  • proto – service protocol (_tcp, _udp)

  • -
  • hostname – service hostname. If NULL, checks for the local hostname.

  • -
-
-
返回
-

    -
  • true Correspondding service has been added.

  • -
  • false Service not found.

  • -
-

-
-
-
- -
-
-bool mdns_service_exists_with_instance(const char *instance, const char *service_type, const char *proto, const char *hostname)
-

Check whether a service has been added.

-
-
参数
-
    -
  • instance – instance name

  • -
  • service_type – service type (_http, _ftp, etc)

  • -
  • proto – service protocol (_tcp, _udp)

  • -
  • hostname – service hostname. If NULL, checks for the local hostname.

  • -
-
-
返回
-

    -
  • true Correspondding service has been added.

  • -
  • false Service not found.

  • -
-

-
-
-
- -
-
-esp_err_t mdns_service_remove(const char *service_type, const char *proto)
-

Remove service from mDNS server.

-
-
参数
-
    -
  • service_type – service type (_http, _ftp, etc)

  • -
  • proto – service protocol (_tcp, _udp)

  • -
-
-
返回
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_ARG Parameter error

  • -
  • ESP_ERR_NOT_FOUND Service not found

  • -
  • ESP_ERR_NO_MEM memory error

  • -
-

-
-
-
- -
-
-esp_err_t mdns_service_remove_for_host(const char *instance, const char *service_type, const char *proto, const char *hostname)
-

Remove service from mDNS server with hostname.

-
-
参数
-
    -
  • instance – instance name

  • -
  • service_type – service type (_http, _ftp, etc)

  • -
  • proto – service protocol (_tcp, _udp)

  • -
  • hostname – service hostname. If NULL, local hostname will be used.

  • -
-
-
返回
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_ARG Parameter error

  • -
  • ESP_ERR_NOT_FOUND Service not found

  • -
  • ESP_ERR_NO_MEM memory error

  • -
-

-
-
-
- -
-
-esp_err_t mdns_service_instance_name_set(const char *service_type, const char *proto, const char *instance_name)
-

Set instance name for service.

-
-
参数
-
    -
  • service_type – service type (_http, _ftp, etc)

  • -
  • proto – service protocol (_tcp, _udp)

  • -
  • instance_name – instance name to set

  • -
-
-
返回
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_ARG Parameter error

  • -
  • ESP_ERR_NOT_FOUND Service not found

  • -
  • ESP_ERR_NO_MEM memory error

  • -
-

-
-
-
- -
-
-esp_err_t mdns_service_instance_name_set_for_host(const char *instance_old, const char *service_type, const char *proto, const char *hostname, const char *instance_name)
-

Set instance name for service with hostname.

-
-
参数
-
    -
  • instance_old – original instance name

  • -
  • service_type – service type (_http, _ftp, etc)

  • -
  • proto – service protocol (_tcp, _udp)

  • -
  • hostname – service hostname. If NULL, local hostname will be used.

  • -
  • instance_name – instance name to set

  • -
-
-
返回
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_ARG Parameter error

  • -
  • ESP_ERR_NOT_FOUND Service not found

  • -
  • ESP_ERR_NO_MEM memory error

  • -
-

-
-
-
- -
-
-esp_err_t mdns_service_port_set(const char *service_type, const char *proto, uint16_t port)
-

Set service port.

-
-
参数
-
    -
  • service_type – service type (_http, _ftp, etc)

  • -
  • proto – service protocol (_tcp, _udp)

  • -
  • port – service port

  • -
-
-
返回
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_ARG Parameter error

  • -
  • ESP_ERR_NOT_FOUND Service not found

  • -
  • ESP_ERR_NO_MEM memory error

  • -
-

-
-
-
- -
-
-esp_err_t mdns_service_port_set_for_host(const char *instance, const char *service_type, const char *proto, const char *hostname, uint16_t port)
-

Set service port with hostname.

-
-
参数
-
    -
  • instance – instance name

  • -
  • service_type – service type (_http, _ftp, etc)

  • -
  • proto – service protocol (_tcp, _udp)

  • -
  • hostname – service hostname. If NULL, local hostname will be used.

  • -
  • port – service port

  • -
-
-
返回
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_ARG Parameter error

  • -
  • ESP_ERR_NOT_FOUND Service not found

  • -
  • ESP_ERR_NO_MEM memory error

  • -
-

-
-
-
- -
-
-esp_err_t mdns_service_txt_set(const char *service_type, const char *proto, mdns_txt_item_t txt[], uint8_t num_items)
-

Replace all TXT items for service.

-
-

备注

-

The value length of txt items will be automatically decided by strlen

-
-
-
参数
-
    -
  • service_type – service type (_http, _ftp, etc)

  • -
  • proto – service protocol (_tcp, _udp)

  • -
  • txt – array of TXT data (eg. {{“var”,”val”},{“other”,”2”}})

  • -
  • num_items – number of items in TXT data

  • -
-
-
返回
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_ARG Parameter error

  • -
  • ESP_ERR_NOT_FOUND Service not found

  • -
  • ESP_ERR_NO_MEM memory error

  • -
-

-
-
-
- -
-
-esp_err_t mdns_service_txt_set_for_host(const char *instance, const char *service_type, const char *proto, const char *hostname, mdns_txt_item_t txt[], uint8_t num_items)
-

Replace all TXT items for service with hostname.

-
-

备注

-

The value length of txt items will be automatically decided by strlen

-
-
-
参数
-
    -
  • instance – instance name

  • -
  • service_type – service type (_http, _ftp, etc)

  • -
  • proto – service protocol (_tcp, _udp)

  • -
  • hostname – service hostname. If NULL, local hostname will be used.

  • -
  • txt – array of TXT data (eg. {{“var”,”val”},{“other”,”2”}})

  • -
  • num_items – number of items in TXT data

  • -
-
-
返回
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_ARG Parameter error

  • -
  • ESP_ERR_NOT_FOUND Service not found

  • -
  • ESP_ERR_NO_MEM memory error

  • -
-

-
-
-
- -
-
-esp_err_t mdns_service_txt_item_set(const char *service_type, const char *proto, const char *key, const char *value)
-

Set/Add TXT item for service TXT record.

-
-

备注

-

The value length will be automatically decided by strlen

-
-
-
参数
-
    -
  • service_type – service type (_http, _ftp, etc)

  • -
  • proto – service protocol (_tcp, _udp)

  • -
  • key – the key that you want to add/update

  • -
  • value – the new value of the key

  • -
-
-
返回
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_ARG Parameter error

  • -
  • ESP_ERR_NOT_FOUND Service not found

  • -
  • ESP_ERR_NO_MEM memory error

  • -
-

-
-
-
- -
-
-esp_err_t mdns_service_txt_item_set_with_explicit_value_len(const char *service_type, const char *proto, const char *key, const char *value, uint8_t value_len)
-

Set/Add TXT item for service TXT record.

-
-
参数
-
    -
  • service_type – service type (_http, _ftp, etc)

  • -
  • proto – service protocol (_tcp, _udp)

  • -
  • key – the key that you want to add/update

  • -
  • value – the new value of the key

  • -
  • value_len – the length of the value

  • -
-
-
返回
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_ARG Parameter error

  • -
  • ESP_ERR_NOT_FOUND Service not found

  • -
  • ESP_ERR_NO_MEM memory error

  • -
-

-
-
-
- -
-
-esp_err_t mdns_service_txt_item_set_for_host(const char *instance, const char *service_type, const char *proto, const char *hostname, const char *key, const char *value)
-

Set/Add TXT item for service TXT record with hostname.

-
-

备注

-

The value length will be automatically decided by strlen

-
-
-
参数
-
    -
  • instance – instance name

  • -
  • service_type – service type (_http, _ftp, etc)

  • -
  • proto – service protocol (_tcp, _udp)

  • -
  • hostname – service hostname. If NULL, local hostname will be used.

  • -
  • key – the key that you want to add/update

  • -
  • value – the new value of the key

  • -
-
-
返回
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_ARG Parameter error

  • -
  • ESP_ERR_NOT_FOUND Service not found

  • -
  • ESP_ERR_NO_MEM memory error

  • -
-

-
-
-
- -
-
-esp_err_t mdns_service_txt_item_set_for_host_with_explicit_value_len(const char *instance, const char *service_type, const char *proto, const char *hostname, const char *key, const char *value, uint8_t value_len)
-

Set/Add TXT item for service TXT record with hostname and txt value length.

-
-
参数
-
    -
  • instance – instance name

  • -
  • service_type – service type (_http, _ftp, etc)

  • -
  • proto – service protocol (_tcp, _udp)

  • -
  • hostname – service hostname. If NULL, local hostname will be used.

  • -
  • key – the key that you want to add/update

  • -
  • value – the new value of the key

  • -
  • value_len – the length of the value

  • -
-
-
返回
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_ARG Parameter error

  • -
  • ESP_ERR_NOT_FOUND Service not found

  • -
  • ESP_ERR_NO_MEM memory error

  • -
-

-
-
-
- -
-
-esp_err_t mdns_service_txt_item_remove(const char *service_type, const char *proto, const char *key)
-

Remove TXT item for service TXT record.

-
-
参数
-
    -
  • service_type – service type (_http, _ftp, etc)

  • -
  • proto – service protocol (_tcp, _udp)

  • -
  • key – the key that you want to remove

  • -
-
-
返回
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_ARG Parameter error

  • -
  • ESP_ERR_NOT_FOUND Service not found

  • -
  • ESP_ERR_NO_MEM memory error

  • -
-

-
-
-
- -
-
-esp_err_t mdns_service_txt_item_remove_for_host(const char *instance, const char *service_type, const char *proto, const char *hostname, const char *key)
-

Remove TXT item for service TXT record with hostname.

-
-
参数
-
    -
  • instance – instance name

  • -
  • service_type – service type (_http, _ftp, etc)

  • -
  • proto – service protocol (_tcp, _udp)

  • -
  • hostname – service hostname. If NULL, local hostname will be used.

  • -
  • key – the key that you want to remove

  • -
-
-
返回
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_ARG Parameter error

  • -
  • ESP_ERR_NOT_FOUND Service not found

  • -
  • ESP_ERR_NO_MEM memory error

  • -
-

-
-
-
- -
-
-esp_err_t mdns_service_subtype_add_for_host(const char *instance_name, const char *service_type, const char *proto, const char *hostname, const char *subtype)
-

Add subtype for service.

-
-
参数
-
    -
  • instance_name – instance name. If NULL, will find the first service with the same service type and protocol.

  • -
  • service_type – service type (_http, _ftp, etc)

  • -
  • proto – service protocol (_tcp, _udp)

  • -
  • hostname – service hostname. If NULL, local hostname will be used.

  • -
  • subtype – The subtype to add.

  • -
-
-
返回
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_ARG Parameter error

  • -
  • ESP_ERR_NOT_FOUND Service not found

  • -
  • ESP_ERR_NO_MEM memory error

  • -
-

-
-
-
- -
-
-esp_err_t mdns_service_remove_all(void)
-

Remove and free all services from mDNS server.

-
-
返回
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_ARG Parameter error

  • -
-

-
-
-
- -
-
-esp_err_t mdns_query_async_delete(mdns_search_once_t *search)
-

Deletes the finished query. Call this only after the search has ended!

-
-
参数
-

search – pointer to search object

-
-
返回
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_STATE search has not finished

  • -
  • ESP_ERR_INVALID_ARG pointer to search object is NULL

  • -
-

-
-
-
- -
-
-bool mdns_query_async_get_results(mdns_search_once_t *search, uint32_t timeout, mdns_result_t **results, uint8_t *num_results)
-

Get results from search pointer. Results available as a pointer to the output parameter. Pointer to search object has to be deleted via mdns_query_async_delete once the query has finished. The results although have to be freed manually.

-
-
参数
-
    -
  • search – pointer to search object

  • -
  • timeout – time in milliseconds to wait for answers

  • -
  • results – pointer to the results of the query

  • -
  • num_results – pointer to the number of the actual result items (set to NULL to ignore this return value)

  • -
-
-
返回
-

True if search has finished before or at timeout False if search timeout is over

-
-
-
- -
-
-mdns_search_once_t *mdns_query_async_new(const char *name, const char *service_type, const char *proto, uint16_t type, uint32_t timeout, size_t max_results, mdns_query_notify_t notifier)
-

Query mDNS for host or service asynchronousely. Search has to be tested for progress and deleted manually!

-
-
参数
-
    -
  • name – service instance or host name (NULL for PTR queries)

  • -
  • service_type – service type (_http, _arduino, _ftp etc.) (NULL for host queries)

  • -
  • proto – service protocol (_tcp, _udp, etc.) (NULL for host queries)

  • -
  • type – type of query (MDNS_TYPE_*)

  • -
  • timeout – time in milliseconds during which mDNS query is active

  • -
  • max_results – maximum results to be collected

  • -
  • notifier – Notification function to be called when the result is ready, can be NULL

  • -
-
-
返回
-

mdns_search_once_s pointer to new search object if query initiated successfully. NULL otherwise.

-
-
-
- -
-
-esp_err_t mdns_query_generic(const char *name, const char *service_type, const char *proto, uint16_t type, mdns_query_transmission_type_t transmission_type, uint32_t timeout, size_t max_results, mdns_result_t **results)
-

Generic mDNS query All following query methods are derived from this one.

-
-
参数
-
    -
  • name – service instance or host name (NULL for PTR queries)

  • -
  • service_type – service type (_http, _arduino, _ftp etc.) (NULL for host queries)

  • -
  • proto – service protocol (_tcp, _udp, etc.) (NULL for host queries)

  • -
  • type – type of query (MDNS_TYPE_*)

  • -
  • transmission_type – either Unicast query, or Multicast query

  • -
  • timeout – time in milliseconds to wait for answers.

  • -
  • max_results – maximum results to be collected

  • -
  • results – pointer to the results of the query results must be freed using mdns_query_results_free below

  • -
-
-
返回
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_STATE mDNS is not running

  • -
  • ESP_ERR_NO_MEM memory error

  • -
  • ESP_ERR_INVALID_ARG timeout was not given

  • -
-

-
-
-
- -
-
-esp_err_t mdns_query(const char *name, const char *service_type, const char *proto, uint16_t type, uint32_t timeout, size_t max_results, mdns_result_t **results)
-

Query mDNS for host or service.

-

Note that querying PTR types sends Multicast query, all other types send Unicast queries

-
-
参数
-
    -
  • name – service instance or host name (NULL for PTR queries)

  • -
  • service_type – service type (_http, _arduino, _ftp etc.) (NULL for host queries)

  • -
  • proto – service protocol (_tcp, _udp, etc.) (NULL for host queries)

  • -
  • type – type of query (MDNS_TYPE_*)

  • -
  • timeout – time in milliseconds to wait for answers.

  • -
  • max_results – maximum results to be collected

  • -
  • results – pointer to the results of the query results must be freed using mdns_query_results_free below

  • -
-
-
返回
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_STATE mDNS is not running

  • -
  • ESP_ERR_NO_MEM memory error

  • -
  • ESP_ERR_INVALID_ARG timeout was not given

  • -
-

-
-
-
- -
-
-void mdns_query_results_free(mdns_result_t *results)
-

Free query results.

-
-
参数
-

results – linked list of results to be freed

-
-
-
- -
-
-esp_err_t mdns_query_ptr(const char *service_type, const char *proto, uint32_t timeout, size_t max_results, mdns_result_t **results)
-

Query mDNS for service.

-
-
参数
-
    -
  • service_type – service type (_http, _arduino, _ftp etc.)

  • -
  • proto – service protocol (_tcp, _udp, etc.)

  • -
  • timeout – time in milliseconds to wait for answer.

  • -
  • max_results – maximum results to be collected

  • -
  • results – pointer to the results of the query

  • -
-
-
返回
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_STATE mDNS is not running

  • -
  • ESP_ERR_NO_MEM memory error

  • -
  • ESP_ERR_INVALID_ARG parameter error

  • -
-

-
-
-
- -
-
-esp_err_t mdns_query_srv(const char *instance_name, const char *service_type, const char *proto, uint32_t timeout, mdns_result_t **result)
-

Query mDNS for SRV record.

-
-
参数
-
    -
  • instance_name – service instance name

  • -
  • service_type – service type (_http, _arduino, _ftp etc.)

  • -
  • proto – service protocol (_tcp, _udp, etc.)

  • -
  • timeout – time in milliseconds to wait for answer.

  • -
  • result – pointer to the result of the query

  • -
-
-
返回
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_STATE mDNS is not running

  • -
  • ESP_ERR_NO_MEM memory error

  • -
  • ESP_ERR_INVALID_ARG parameter error

  • -
-

-
-
-
- -
-
-esp_err_t mdns_query_txt(const char *instance_name, const char *service_type, const char *proto, uint32_t timeout, mdns_result_t **result)
-

Query mDNS for TXT record.

-
-
参数
-
    -
  • instance_name – service instance name

  • -
  • service_type – service type (_http, _arduino, _ftp etc.)

  • -
  • proto – service protocol (_tcp, _udp, etc.)

  • -
  • timeout – time in milliseconds to wait for answer.

  • -
  • result – pointer to the result of the query

  • -
-
-
返回
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_STATE mDNS is not running

  • -
  • ESP_ERR_NO_MEM memory error

  • -
  • ESP_ERR_INVALID_ARG parameter error

  • -
-

-
-
-
- -
-
-esp_err_t mdns_query_a(const char *host_name, uint32_t timeout, esp_ip4_addr_t *addr)
-

Query mDNS for A record.

-
-
参数
-
    -
  • host_name – host name to look for

  • -
  • timeout – time in milliseconds to wait for answer.

  • -
  • addr – pointer to the resulting IP4 address

  • -
-
-
返回
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_STATE mDNS is not running

  • -
  • ESP_ERR_NO_MEM memory error

  • -
  • ESP_ERR_INVALID_ARG parameter error

  • -
-

-
-
-
- -
-
-esp_err_t mdns_register_netif(esp_netif_t *esp_netif)
-

Register custom esp_netif with mDNS functionality mDNS service runs by default on preconfigured interfaces (STA, AP, ETH). This API enables running the service on any customized interface, either using standard WiFi or Ethernet driver or any kind of user defined driver.

-
-
参数
-

esp_netif – Pointer to esp-netif interface

-
-
返回
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_STATE mDNS is not running or this netif is already registered

  • -
  • ESP_ERR_NO_MEM not enough memory for this in interface in the netif list (see CONFIG_MDNS_MAX_INTERFACES)

  • -
-

-
-
-
- -
-
-esp_err_t mdns_unregister_netif(esp_netif_t *esp_netif)
-

Unregister esp-netif already registered in mDNS service.

-
-
参数
-

esp_netif – Pointer to esp-netif interface

-
-
返回
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_STATE mDNS is not running

  • -
  • ESP_ERR_NOT_FOUND this esp-netif was not registered in mDNS service

  • -
-

-
-
-
- -
-
-esp_err_t mdns_netif_action(esp_netif_t *esp_netif, mdns_event_actions_t event_action)
-

Set esp_netif to a desired state, or perform a desired action, such as enable/disable this interface or send announcement packets to this netif.

-

    -
  • This function is used to enable (probe, resolve conflicts and announce), announce, or disable (send bye) mDNS services on the specified network interface.

  • -
  • This function must be called if users registers a specific interface using mdns_register_netif() to enable mDNS services on that interface.

  • -
  • This function could be used in IP/connection event handlers to automatically enable/announce mDNS services when network properties change and/or disable them on disconnection.

  • -
-

-
-
参数
-
    -
  • esp_netif – Pointer to esp-netif interface

  • -
  • event_action – Disable/Enable/Announce on this interface over IPv4/IPv6 protocol. Actions enumerated in mdns_event_actions_t type.

  • -
-
-
返回
-

    -
  • ESP_OK success

  • -
  • ESP_ERR_INVALID_STATE mDNS is not running or this netif is not registered

  • -
  • ESP_ERR_NO_MEM memory error

  • -
-

-
-
-
- -
-
-

Structures

-
-
-struct mdns_txt_item_t
-

mDNS basic text item structure Used in mdns_service_add()

-
-

Public Members

-
-
-const char *key
-

item key name

-
- -
-
-const char *value
-

item value string

-
- -
-
- -
-
-struct mdns_ip_addr_s
-

mDNS query linked list IP item

-
-

Public Members

-
-
-esp_ip_addr_t addr
-

IP address

-
- -
-
-struct mdns_ip_addr_s *next
-

next IP, or NULL for the last IP in the list

-
- -
-
- -
-
-struct mdns_result_s
-

mDNS query result structure

-
-

Public Members

-
-
-struct mdns_result_s *next
-

next result, or NULL for the last result in the list

-
- -
-
-esp_netif_t *esp_netif
-

ptr to corresponding esp-netif

-
- -
-
-uint32_t ttl
-

time to live

-
- -
-
-mdns_ip_protocol_t ip_protocol
-

ip_protocol type of the interface (v4/v6)

-
- -
-
-char *instance_name
-

instance name

-
- -
-
-char *service_type
-

service type

-
- -
-
-char *proto
-

srevice protocol

-
- -
-
-char *hostname
-

hostname

-
- -
-
-uint16_t port
-

service port

-
- -
-
-mdns_txt_item_t *txt
-

txt record

-
- -
-
-uint8_t *txt_value_len
-

array of txt value len of each record

-
- -
-
-size_t txt_count
-

number of txt items

-
- -
-
-mdns_ip_addr_t *addr
-

linked list of IP addresses found

-
- -
-
- -
-
-

Macros

-
-
-MDNS_TYPE_A
-
- -
-
-MDNS_TYPE_PTR
-
- -
-
-MDNS_TYPE_TXT
-
- -
-
-MDNS_TYPE_AAAA
-
- -
-
-MDNS_TYPE_SRV
-
- -
-
-MDNS_TYPE_OPT
-
- -
-
-MDNS_TYPE_NSEC
-
- -
-
-MDNS_TYPE_ANY
-
- -
-
-

Type Definitions

-
-
-typedef struct mdns_search_once_s mdns_search_once_t
-

Asynchronous query handle.

-
- -
-
-typedef struct mdns_ip_addr_s mdns_ip_addr_t
-

mDNS query linked list IP item

-
- -
-
-typedef struct mdns_result_s mdns_result_t
-

mDNS query result structure

-
- -
-
-typedef void (*mdns_query_notify_t)(mdns_search_once_t *search)
-
- -
-
-

Enumerations

-
-
-enum mdns_event_actions_t
-

Values:

-
-
-enumerator MDNS_EVENT_ENABLE_IP4
-
- -
-
-enumerator MDNS_EVENT_ENABLE_IP6
-
- -
-
-enumerator MDNS_EVENT_ANNOUNCE_IP4
-
- -
-
-enumerator MDNS_EVENT_ANNOUNCE_IP6
-
- -
-
-enumerator MDNS_EVENT_DISABLE_IP4
-
- -
-
-enumerator MDNS_EVENT_DISABLE_IP6
-
- -
-
-enumerator MDNS_EVENT_IP4_REVERSE_LOOKUP
-
- -
-
-enumerator MDNS_EVENT_IP6_REVERSE_LOOKUP
-
- -
- -
-
-enum mdns_ip_protocol_t
-

mDNS enum to specify the ip_protocol type

-

Values:

-
-
-enumerator MDNS_IP_PROTOCOL_V4
-
- -
-
-enumerator MDNS_IP_PROTOCOL_V6
-
- -
-
-enumerator MDNS_IP_PROTOCOL_MAX
-
- -
- -
-
-enum mdns_query_transmission_type_t
-

mDNS query type to be explicitly set to either Unicast or Multicast

-

Values:

-
-
-enumerator MDNS_QUERY_UNICAST
-
- -
-
-enumerator MDNS_QUERY_MULTICAST
-
- -
- -
-
-
- - -
-
- -
-
-
-
- - - - - diff --git a/mdns/zh_CN/objects.inv b/mdns/zh_CN/objects.inv deleted file mode 100644 index 31221d29d..000000000 Binary files a/mdns/zh_CN/objects.inv and /dev/null differ diff --git a/mdns/zh_CN/search.html b/mdns/zh_CN/search.html deleted file mode 100644 index 1b2a5538d..000000000 --- a/mdns/zh_CN/search.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - 搜索 - ESP32 - — ESP-IDF 编程指南 latest 文档 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
- -
-
-
-
    -
  • »
  • -
  • 搜索
  • -
  • -
  • -
-
-
-
-
- - - - -
- -
- -
-
- -
-
-
-
- - - - - - - - - - \ No newline at end of file diff --git a/mdns/zh_CN/searchindex.js b/mdns/zh_CN/searchindex.js deleted file mode 100644 index bed10a3a0..000000000 --- a/mdns/zh_CN/searchindex.js +++ /dev/null @@ -1 +0,0 @@ -Search.setIndex({docnames:["index"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":5,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":3,"sphinx.domains.rst":2,"sphinx.domains.std":2,"sphinx.ext.todo":2,sphinx:56},filenames:["index.rst"],objects:{"":[[0,0,1,"c.MDNS_TYPE_A","MDNS_TYPE_A"],[0,0,1,"c.MDNS_TYPE_AAAA","MDNS_TYPE_AAAA"],[0,0,1,"c.MDNS_TYPE_ANY","MDNS_TYPE_ANY"],[0,0,1,"c.MDNS_TYPE_NSEC","MDNS_TYPE_NSEC"],[0,0,1,"c.MDNS_TYPE_OPT","MDNS_TYPE_OPT"],[0,0,1,"c.MDNS_TYPE_PTR","MDNS_TYPE_PTR"],[0,0,1,"c.MDNS_TYPE_SRV","MDNS_TYPE_SRV"],[0,0,1,"c.MDNS_TYPE_TXT","MDNS_TYPE_TXT"],[0,1,1,"_CPPv4N20mdns_event_actions_t23MDNS_EVENT_ANNOUNCE_IP4E","MDNS_EVENT_ANNOUNCE_IP4"],[0,1,1,"_CPPv4N20mdns_event_actions_t23MDNS_EVENT_ANNOUNCE_IP6E","MDNS_EVENT_ANNOUNCE_IP6"],[0,1,1,"_CPPv4N20mdns_event_actions_t22MDNS_EVENT_DISABLE_IP4E","MDNS_EVENT_DISABLE_IP4"],[0,1,1,"_CPPv4N20mdns_event_actions_t22MDNS_EVENT_DISABLE_IP6E","MDNS_EVENT_DISABLE_IP6"],[0,1,1,"_CPPv4N20mdns_event_actions_t21MDNS_EVENT_ENABLE_IP4E","MDNS_EVENT_ENABLE_IP4"],[0,1,1,"_CPPv4N20mdns_event_actions_t21MDNS_EVENT_ENABLE_IP6E","MDNS_EVENT_ENABLE_IP6"],[0,1,1,"_CPPv4N20mdns_event_actions_t29MDNS_EVENT_IP4_REVERSE_LOOKUPE","MDNS_EVENT_IP4_REVERSE_LOOKUP"],[0,1,1,"_CPPv4N20mdns_event_actions_t29MDNS_EVENT_IP6_REVERSE_LOOKUPE","MDNS_EVENT_IP6_REVERSE_LOOKUP"],[0,1,1,"_CPPv4N18mdns_ip_protocol_t20MDNS_IP_PROTOCOL_MAXE","MDNS_IP_PROTOCOL_MAX"],[0,1,1,"_CPPv4N18mdns_ip_protocol_t19MDNS_IP_PROTOCOL_V4E","MDNS_IP_PROTOCOL_V4"],[0,1,1,"_CPPv4N18mdns_ip_protocol_t19MDNS_IP_PROTOCOL_V6E","MDNS_IP_PROTOCOL_V6"],[0,1,1,"_CPPv4N30mdns_query_transmission_type_t20MDNS_QUERY_MULTICASTE","MDNS_QUERY_MULTICAST"],[0,1,1,"_CPPv4N30mdns_query_transmission_type_t18MDNS_QUERY_UNICASTE","MDNS_QUERY_UNICAST"],[0,2,1,"_CPPv426mdns_delegate_hostname_addPKcPK14mdns_ip_addr_t","mdns_delegate_hostname_add"],[0,3,1,"_CPPv426mdns_delegate_hostname_addPKcPK14mdns_ip_addr_t","mdns_delegate_hostname_add::address_list"],[0,3,1,"_CPPv426mdns_delegate_hostname_addPKcPK14mdns_ip_addr_t","mdns_delegate_hostname_add::hostname"],[0,2,1,"_CPPv429mdns_delegate_hostname_removePKc","mdns_delegate_hostname_remove"],[0,3,1,"_CPPv429mdns_delegate_hostname_removePKc","mdns_delegate_hostname_remove::hostname"],[0,4,1,"_CPPv420mdns_event_actions_t","mdns_event_actions_t"],[0,1,1,"_CPPv4N20mdns_event_actions_t23MDNS_EVENT_ANNOUNCE_IP4E","mdns_event_actions_t::MDNS_EVENT_ANNOUNCE_IP4"],[0,1,1,"_CPPv4N20mdns_event_actions_t23MDNS_EVENT_ANNOUNCE_IP6E","mdns_event_actions_t::MDNS_EVENT_ANNOUNCE_IP6"],[0,1,1,"_CPPv4N20mdns_event_actions_t22MDNS_EVENT_DISABLE_IP4E","mdns_event_actions_t::MDNS_EVENT_DISABLE_IP4"],[0,1,1,"_CPPv4N20mdns_event_actions_t22MDNS_EVENT_DISABLE_IP6E","mdns_event_actions_t::MDNS_EVENT_DISABLE_IP6"],[0,1,1,"_CPPv4N20mdns_event_actions_t21MDNS_EVENT_ENABLE_IP4E","mdns_event_actions_t::MDNS_EVENT_ENABLE_IP4"],[0,1,1,"_CPPv4N20mdns_event_actions_t21MDNS_EVENT_ENABLE_IP6E","mdns_event_actions_t::MDNS_EVENT_ENABLE_IP6"],[0,1,1,"_CPPv4N20mdns_event_actions_t29MDNS_EVENT_IP4_REVERSE_LOOKUPE","mdns_event_actions_t::MDNS_EVENT_IP4_REVERSE_LOOKUP"],[0,1,1,"_CPPv4N20mdns_event_actions_t29MDNS_EVENT_IP6_REVERSE_LOOKUPE","mdns_event_actions_t::MDNS_EVENT_IP6_REVERSE_LOOKUP"],[0,2,1,"_CPPv49mdns_freev","mdns_free"],[0,2,1,"_CPPv420mdns_hostname_existsPKc","mdns_hostname_exists"],[0,3,1,"_CPPv420mdns_hostname_existsPKc","mdns_hostname_exists::hostname"],[0,2,1,"_CPPv417mdns_hostname_setPKc","mdns_hostname_set"],[0,3,1,"_CPPv417mdns_hostname_setPKc","mdns_hostname_set::hostname"],[0,2,1,"_CPPv49mdns_initv","mdns_init"],[0,2,1,"_CPPv422mdns_instance_name_setPKc","mdns_instance_name_set"],[0,3,1,"_CPPv422mdns_instance_name_setPKc","mdns_instance_name_set::instance_name"],[0,5,1,"_CPPv414mdns_ip_addr_s","mdns_ip_addr_s"],[0,6,1,"_CPPv4N14mdns_ip_addr_s4addrE","mdns_ip_addr_s::addr"],[0,6,1,"_CPPv4N14mdns_ip_addr_s4nextE","mdns_ip_addr_s::next"],[0,7,1,"_CPPv414mdns_ip_addr_t","mdns_ip_addr_t"],[0,4,1,"_CPPv418mdns_ip_protocol_t","mdns_ip_protocol_t"],[0,1,1,"_CPPv4N18mdns_ip_protocol_t20MDNS_IP_PROTOCOL_MAXE","mdns_ip_protocol_t::MDNS_IP_PROTOCOL_MAX"],[0,1,1,"_CPPv4N18mdns_ip_protocol_t19MDNS_IP_PROTOCOL_V4E","mdns_ip_protocol_t::MDNS_IP_PROTOCOL_V4"],[0,1,1,"_CPPv4N18mdns_ip_protocol_t19MDNS_IP_PROTOCOL_V6E","mdns_ip_protocol_t::MDNS_IP_PROTOCOL_V6"],[0,2,1,"_CPPv417mdns_netif_actionP11esp_netif_t20mdns_event_actions_t","mdns_netif_action"],[0,3,1,"_CPPv417mdns_netif_actionP11esp_netif_t20mdns_event_actions_t","mdns_netif_action::esp_netif"],[0,3,1,"_CPPv417mdns_netif_actionP11esp_netif_t20mdns_event_actions_t","mdns_netif_action::event_action"],[0,2,1,"_CPPv410mdns_queryPKcPKcPKc8uint16_t8uint32_t6size_tPP13mdns_result_t","mdns_query"],[0,3,1,"_CPPv410mdns_queryPKcPKcPKc8uint16_t8uint32_t6size_tPP13mdns_result_t","mdns_query::max_results"],[0,3,1,"_CPPv410mdns_queryPKcPKcPKc8uint16_t8uint32_t6size_tPP13mdns_result_t","mdns_query::name"],[0,3,1,"_CPPv410mdns_queryPKcPKcPKc8uint16_t8uint32_t6size_tPP13mdns_result_t","mdns_query::proto"],[0,3,1,"_CPPv410mdns_queryPKcPKcPKc8uint16_t8uint32_t6size_tPP13mdns_result_t","mdns_query::results"],[0,3,1,"_CPPv410mdns_queryPKcPKcPKc8uint16_t8uint32_t6size_tPP13mdns_result_t","mdns_query::service_type"],[0,3,1,"_CPPv410mdns_queryPKcPKcPKc8uint16_t8uint32_t6size_tPP13mdns_result_t","mdns_query::timeout"],[0,3,1,"_CPPv410mdns_queryPKcPKcPKc8uint16_t8uint32_t6size_tPP13mdns_result_t","mdns_query::type"],[0,2,1,"_CPPv412mdns_query_aPKc8uint32_tP14esp_ip4_addr_t","mdns_query_a"],[0,3,1,"_CPPv412mdns_query_aPKc8uint32_tP14esp_ip4_addr_t","mdns_query_a::addr"],[0,3,1,"_CPPv412mdns_query_aPKc8uint32_tP14esp_ip4_addr_t","mdns_query_a::host_name"],[0,3,1,"_CPPv412mdns_query_aPKc8uint32_tP14esp_ip4_addr_t","mdns_query_a::timeout"],[0,2,1,"_CPPv423mdns_query_async_deleteP18mdns_search_once_t","mdns_query_async_delete"],[0,3,1,"_CPPv423mdns_query_async_deleteP18mdns_search_once_t","mdns_query_async_delete::search"],[0,2,1,"_CPPv428mdns_query_async_get_resultsP18mdns_search_once_t8uint32_tPP13mdns_result_tP7uint8_t","mdns_query_async_get_results"],[0,3,1,"_CPPv428mdns_query_async_get_resultsP18mdns_search_once_t8uint32_tPP13mdns_result_tP7uint8_t","mdns_query_async_get_results::num_results"],[0,3,1,"_CPPv428mdns_query_async_get_resultsP18mdns_search_once_t8uint32_tPP13mdns_result_tP7uint8_t","mdns_query_async_get_results::results"],[0,3,1,"_CPPv428mdns_query_async_get_resultsP18mdns_search_once_t8uint32_tPP13mdns_result_tP7uint8_t","mdns_query_async_get_results::search"],[0,3,1,"_CPPv428mdns_query_async_get_resultsP18mdns_search_once_t8uint32_tPP13mdns_result_tP7uint8_t","mdns_query_async_get_results::timeout"],[0,2,1,"_CPPv420mdns_query_async_newPKcPKcPKc8uint16_t8uint32_t6size_t19mdns_query_notify_t","mdns_query_async_new"],[0,3,1,"_CPPv420mdns_query_async_newPKcPKcPKc8uint16_t8uint32_t6size_t19mdns_query_notify_t","mdns_query_async_new::max_results"],[0,3,1,"_CPPv420mdns_query_async_newPKcPKcPKc8uint16_t8uint32_t6size_t19mdns_query_notify_t","mdns_query_async_new::name"],[0,3,1,"_CPPv420mdns_query_async_newPKcPKcPKc8uint16_t8uint32_t6size_t19mdns_query_notify_t","mdns_query_async_new::notifier"],[0,3,1,"_CPPv420mdns_query_async_newPKcPKcPKc8uint16_t8uint32_t6size_t19mdns_query_notify_t","mdns_query_async_new::proto"],[0,3,1,"_CPPv420mdns_query_async_newPKcPKcPKc8uint16_t8uint32_t6size_t19mdns_query_notify_t","mdns_query_async_new::service_type"],[0,3,1,"_CPPv420mdns_query_async_newPKcPKcPKc8uint16_t8uint32_t6size_t19mdns_query_notify_t","mdns_query_async_new::timeout"],[0,3,1,"_CPPv420mdns_query_async_newPKcPKcPKc8uint16_t8uint32_t6size_t19mdns_query_notify_t","mdns_query_async_new::type"],[0,2,1,"_CPPv418mdns_query_genericPKcPKcPKc8uint16_t30mdns_query_transmission_type_t8uint32_t6size_tPP13mdns_result_t","mdns_query_generic"],[0,3,1,"_CPPv418mdns_query_genericPKcPKcPKc8uint16_t30mdns_query_transmission_type_t8uint32_t6size_tPP13mdns_result_t","mdns_query_generic::max_results"],[0,3,1,"_CPPv418mdns_query_genericPKcPKcPKc8uint16_t30mdns_query_transmission_type_t8uint32_t6size_tPP13mdns_result_t","mdns_query_generic::name"],[0,3,1,"_CPPv418mdns_query_genericPKcPKcPKc8uint16_t30mdns_query_transmission_type_t8uint32_t6size_tPP13mdns_result_t","mdns_query_generic::proto"],[0,3,1,"_CPPv418mdns_query_genericPKcPKcPKc8uint16_t30mdns_query_transmission_type_t8uint32_t6size_tPP13mdns_result_t","mdns_query_generic::results"],[0,3,1,"_CPPv418mdns_query_genericPKcPKcPKc8uint16_t30mdns_query_transmission_type_t8uint32_t6size_tPP13mdns_result_t","mdns_query_generic::service_type"],[0,3,1,"_CPPv418mdns_query_genericPKcPKcPKc8uint16_t30mdns_query_transmission_type_t8uint32_t6size_tPP13mdns_result_t","mdns_query_generic::timeout"],[0,3,1,"_CPPv418mdns_query_genericPKcPKcPKc8uint16_t30mdns_query_transmission_type_t8uint32_t6size_tPP13mdns_result_t","mdns_query_generic::transmission_type"],[0,3,1,"_CPPv418mdns_query_genericPKcPKcPKc8uint16_t30mdns_query_transmission_type_t8uint32_t6size_tPP13mdns_result_t","mdns_query_generic::type"],[0,7,1,"_CPPv419mdns_query_notify_t","mdns_query_notify_t"],[0,2,1,"_CPPv414mdns_query_ptrPKcPKc8uint32_t6size_tPP13mdns_result_t","mdns_query_ptr"],[0,3,1,"_CPPv414mdns_query_ptrPKcPKc8uint32_t6size_tPP13mdns_result_t","mdns_query_ptr::max_results"],[0,3,1,"_CPPv414mdns_query_ptrPKcPKc8uint32_t6size_tPP13mdns_result_t","mdns_query_ptr::proto"],[0,3,1,"_CPPv414mdns_query_ptrPKcPKc8uint32_t6size_tPP13mdns_result_t","mdns_query_ptr::results"],[0,3,1,"_CPPv414mdns_query_ptrPKcPKc8uint32_t6size_tPP13mdns_result_t","mdns_query_ptr::service_type"],[0,3,1,"_CPPv414mdns_query_ptrPKcPKc8uint32_t6size_tPP13mdns_result_t","mdns_query_ptr::timeout"],[0,2,1,"_CPPv423mdns_query_results_freeP13mdns_result_t","mdns_query_results_free"],[0,3,1,"_CPPv423mdns_query_results_freeP13mdns_result_t","mdns_query_results_free::results"],[0,2,1,"_CPPv414mdns_query_srvPKcPKcPKc8uint32_tPP13mdns_result_t","mdns_query_srv"],[0,3,1,"_CPPv414mdns_query_srvPKcPKcPKc8uint32_tPP13mdns_result_t","mdns_query_srv::instance_name"],[0,3,1,"_CPPv414mdns_query_srvPKcPKcPKc8uint32_tPP13mdns_result_t","mdns_query_srv::proto"],[0,3,1,"_CPPv414mdns_query_srvPKcPKcPKc8uint32_tPP13mdns_result_t","mdns_query_srv::result"],[0,3,1,"_CPPv414mdns_query_srvPKcPKcPKc8uint32_tPP13mdns_result_t","mdns_query_srv::service_type"],[0,3,1,"_CPPv414mdns_query_srvPKcPKcPKc8uint32_tPP13mdns_result_t","mdns_query_srv::timeout"],[0,4,1,"_CPPv430mdns_query_transmission_type_t","mdns_query_transmission_type_t"],[0,1,1,"_CPPv4N30mdns_query_transmission_type_t20MDNS_QUERY_MULTICASTE","mdns_query_transmission_type_t::MDNS_QUERY_MULTICAST"],[0,1,1,"_CPPv4N30mdns_query_transmission_type_t18MDNS_QUERY_UNICASTE","mdns_query_transmission_type_t::MDNS_QUERY_UNICAST"],[0,2,1,"_CPPv414mdns_query_txtPKcPKcPKc8uint32_tPP13mdns_result_t","mdns_query_txt"],[0,3,1,"_CPPv414mdns_query_txtPKcPKcPKc8uint32_tPP13mdns_result_t","mdns_query_txt::instance_name"],[0,3,1,"_CPPv414mdns_query_txtPKcPKcPKc8uint32_tPP13mdns_result_t","mdns_query_txt::proto"],[0,3,1,"_CPPv414mdns_query_txtPKcPKcPKc8uint32_tPP13mdns_result_t","mdns_query_txt::result"],[0,3,1,"_CPPv414mdns_query_txtPKcPKcPKc8uint32_tPP13mdns_result_t","mdns_query_txt::service_type"],[0,3,1,"_CPPv414mdns_query_txtPKcPKcPKc8uint32_tPP13mdns_result_t","mdns_query_txt::timeout"],[0,2,1,"_CPPv419mdns_register_netifP11esp_netif_t","mdns_register_netif"],[0,3,1,"_CPPv419mdns_register_netifP11esp_netif_t","mdns_register_netif::esp_netif"],[0,5,1,"_CPPv413mdns_result_s","mdns_result_s"],[0,6,1,"_CPPv4N13mdns_result_s4addrE","mdns_result_s::addr"],[0,6,1,"_CPPv4N13mdns_result_s9esp_netifE","mdns_result_s::esp_netif"],[0,6,1,"_CPPv4N13mdns_result_s8hostnameE","mdns_result_s::hostname"],[0,6,1,"_CPPv4N13mdns_result_s13instance_nameE","mdns_result_s::instance_name"],[0,6,1,"_CPPv4N13mdns_result_s11ip_protocolE","mdns_result_s::ip_protocol"],[0,6,1,"_CPPv4N13mdns_result_s4nextE","mdns_result_s::next"],[0,6,1,"_CPPv4N13mdns_result_s4portE","mdns_result_s::port"],[0,6,1,"_CPPv4N13mdns_result_s5protoE","mdns_result_s::proto"],[0,6,1,"_CPPv4N13mdns_result_s12service_typeE","mdns_result_s::service_type"],[0,6,1,"_CPPv4N13mdns_result_s3ttlE","mdns_result_s::ttl"],[0,6,1,"_CPPv4N13mdns_result_s3txtE","mdns_result_s::txt"],[0,6,1,"_CPPv4N13mdns_result_s9txt_countE","mdns_result_s::txt_count"],[0,6,1,"_CPPv4N13mdns_result_s13txt_value_lenE","mdns_result_s::txt_value_len"],[0,7,1,"_CPPv413mdns_result_t","mdns_result_t"],[0,7,1,"_CPPv418mdns_search_once_t","mdns_search_once_t"],[0,2,1,"_CPPv416mdns_service_addPKcPKcPKc8uint16_tA_15mdns_txt_item_t6size_t","mdns_service_add"],[0,3,1,"_CPPv416mdns_service_addPKcPKcPKc8uint16_tA_15mdns_txt_item_t6size_t","mdns_service_add::instance_name"],[0,3,1,"_CPPv416mdns_service_addPKcPKcPKc8uint16_tA_15mdns_txt_item_t6size_t","mdns_service_add::num_items"],[0,3,1,"_CPPv416mdns_service_addPKcPKcPKc8uint16_tA_15mdns_txt_item_t6size_t","mdns_service_add::port"],[0,3,1,"_CPPv416mdns_service_addPKcPKcPKc8uint16_tA_15mdns_txt_item_t6size_t","mdns_service_add::proto"],[0,3,1,"_CPPv416mdns_service_addPKcPKcPKc8uint16_tA_15mdns_txt_item_t6size_t","mdns_service_add::service_type"],[0,3,1,"_CPPv416mdns_service_addPKcPKcPKc8uint16_tA_15mdns_txt_item_t6size_t","mdns_service_add::txt"],[0,2,1,"_CPPv425mdns_service_add_for_hostPKcPKcPKcPKc8uint16_tA_15mdns_txt_item_t6size_t","mdns_service_add_for_host"],[0,3,1,"_CPPv425mdns_service_add_for_hostPKcPKcPKcPKc8uint16_tA_15mdns_txt_item_t6size_t","mdns_service_add_for_host::hostname"],[0,3,1,"_CPPv425mdns_service_add_for_hostPKcPKcPKcPKc8uint16_tA_15mdns_txt_item_t6size_t","mdns_service_add_for_host::instance_name"],[0,3,1,"_CPPv425mdns_service_add_for_hostPKcPKcPKcPKc8uint16_tA_15mdns_txt_item_t6size_t","mdns_service_add_for_host::num_items"],[0,3,1,"_CPPv425mdns_service_add_for_hostPKcPKcPKcPKc8uint16_tA_15mdns_txt_item_t6size_t","mdns_service_add_for_host::port"],[0,3,1,"_CPPv425mdns_service_add_for_hostPKcPKcPKcPKc8uint16_tA_15mdns_txt_item_t6size_t","mdns_service_add_for_host::proto"],[0,3,1,"_CPPv425mdns_service_add_for_hostPKcPKcPKcPKc8uint16_tA_15mdns_txt_item_t6size_t","mdns_service_add_for_host::service_type"],[0,3,1,"_CPPv425mdns_service_add_for_hostPKcPKcPKcPKc8uint16_tA_15mdns_txt_item_t6size_t","mdns_service_add_for_host::txt"],[0,2,1,"_CPPv419mdns_service_existsPKcPKcPKc","mdns_service_exists"],[0,3,1,"_CPPv419mdns_service_existsPKcPKcPKc","mdns_service_exists::hostname"],[0,3,1,"_CPPv419mdns_service_existsPKcPKcPKc","mdns_service_exists::proto"],[0,3,1,"_CPPv419mdns_service_existsPKcPKcPKc","mdns_service_exists::service_type"],[0,2,1,"_CPPv433mdns_service_exists_with_instancePKcPKcPKcPKc","mdns_service_exists_with_instance"],[0,3,1,"_CPPv433mdns_service_exists_with_instancePKcPKcPKcPKc","mdns_service_exists_with_instance::hostname"],[0,3,1,"_CPPv433mdns_service_exists_with_instancePKcPKcPKcPKc","mdns_service_exists_with_instance::instance"],[0,3,1,"_CPPv433mdns_service_exists_with_instancePKcPKcPKcPKc","mdns_service_exists_with_instance::proto"],[0,3,1,"_CPPv433mdns_service_exists_with_instancePKcPKcPKcPKc","mdns_service_exists_with_instance::service_type"],[0,2,1,"_CPPv430mdns_service_instance_name_setPKcPKcPKc","mdns_service_instance_name_set"],[0,3,1,"_CPPv430mdns_service_instance_name_setPKcPKcPKc","mdns_service_instance_name_set::instance_name"],[0,3,1,"_CPPv430mdns_service_instance_name_setPKcPKcPKc","mdns_service_instance_name_set::proto"],[0,3,1,"_CPPv430mdns_service_instance_name_setPKcPKcPKc","mdns_service_instance_name_set::service_type"],[0,2,1,"_CPPv439mdns_service_instance_name_set_for_hostPKcPKcPKcPKcPKc","mdns_service_instance_name_set_for_host"],[0,3,1,"_CPPv439mdns_service_instance_name_set_for_hostPKcPKcPKcPKcPKc","mdns_service_instance_name_set_for_host::hostname"],[0,3,1,"_CPPv439mdns_service_instance_name_set_for_hostPKcPKcPKcPKcPKc","mdns_service_instance_name_set_for_host::instance_name"],[0,3,1,"_CPPv439mdns_service_instance_name_set_for_hostPKcPKcPKcPKcPKc","mdns_service_instance_name_set_for_host::instance_old"],[0,3,1,"_CPPv439mdns_service_instance_name_set_for_hostPKcPKcPKcPKcPKc","mdns_service_instance_name_set_for_host::proto"],[0,3,1,"_CPPv439mdns_service_instance_name_set_for_hostPKcPKcPKcPKcPKc","mdns_service_instance_name_set_for_host::service_type"],[0,2,1,"_CPPv421mdns_service_port_setPKcPKc8uint16_t","mdns_service_port_set"],[0,3,1,"_CPPv421mdns_service_port_setPKcPKc8uint16_t","mdns_service_port_set::port"],[0,3,1,"_CPPv421mdns_service_port_setPKcPKc8uint16_t","mdns_service_port_set::proto"],[0,3,1,"_CPPv421mdns_service_port_setPKcPKc8uint16_t","mdns_service_port_set::service_type"],[0,2,1,"_CPPv430mdns_service_port_set_for_hostPKcPKcPKcPKc8uint16_t","mdns_service_port_set_for_host"],[0,3,1,"_CPPv430mdns_service_port_set_for_hostPKcPKcPKcPKc8uint16_t","mdns_service_port_set_for_host::hostname"],[0,3,1,"_CPPv430mdns_service_port_set_for_hostPKcPKcPKcPKc8uint16_t","mdns_service_port_set_for_host::instance"],[0,3,1,"_CPPv430mdns_service_port_set_for_hostPKcPKcPKcPKc8uint16_t","mdns_service_port_set_for_host::port"],[0,3,1,"_CPPv430mdns_service_port_set_for_hostPKcPKcPKcPKc8uint16_t","mdns_service_port_set_for_host::proto"],[0,3,1,"_CPPv430mdns_service_port_set_for_hostPKcPKcPKcPKc8uint16_t","mdns_service_port_set_for_host::service_type"],[0,2,1,"_CPPv419mdns_service_removePKcPKc","mdns_service_remove"],[0,3,1,"_CPPv419mdns_service_removePKcPKc","mdns_service_remove::proto"],[0,3,1,"_CPPv419mdns_service_removePKcPKc","mdns_service_remove::service_type"],[0,2,1,"_CPPv423mdns_service_remove_allv","mdns_service_remove_all"],[0,2,1,"_CPPv428mdns_service_remove_for_hostPKcPKcPKcPKc","mdns_service_remove_for_host"],[0,3,1,"_CPPv428mdns_service_remove_for_hostPKcPKcPKcPKc","mdns_service_remove_for_host::hostname"],[0,3,1,"_CPPv428mdns_service_remove_for_hostPKcPKcPKcPKc","mdns_service_remove_for_host::instance"],[0,3,1,"_CPPv428mdns_service_remove_for_hostPKcPKcPKcPKc","mdns_service_remove_for_host::proto"],[0,3,1,"_CPPv428mdns_service_remove_for_hostPKcPKcPKcPKc","mdns_service_remove_for_host::service_type"],[0,2,1,"_CPPv433mdns_service_subtype_add_for_hostPKcPKcPKcPKcPKc","mdns_service_subtype_add_for_host"],[0,3,1,"_CPPv433mdns_service_subtype_add_for_hostPKcPKcPKcPKcPKc","mdns_service_subtype_add_for_host::hostname"],[0,3,1,"_CPPv433mdns_service_subtype_add_for_hostPKcPKcPKcPKcPKc","mdns_service_subtype_add_for_host::instance_name"],[0,3,1,"_CPPv433mdns_service_subtype_add_for_hostPKcPKcPKcPKcPKc","mdns_service_subtype_add_for_host::proto"],[0,3,1,"_CPPv433mdns_service_subtype_add_for_hostPKcPKcPKcPKcPKc","mdns_service_subtype_add_for_host::service_type"],[0,3,1,"_CPPv433mdns_service_subtype_add_for_hostPKcPKcPKcPKcPKc","mdns_service_subtype_add_for_host::subtype"],[0,2,1,"_CPPv428mdns_service_txt_item_removePKcPKcPKc","mdns_service_txt_item_remove"],[0,3,1,"_CPPv428mdns_service_txt_item_removePKcPKcPKc","mdns_service_txt_item_remove::key"],[0,3,1,"_CPPv428mdns_service_txt_item_removePKcPKcPKc","mdns_service_txt_item_remove::proto"],[0,3,1,"_CPPv428mdns_service_txt_item_removePKcPKcPKc","mdns_service_txt_item_remove::service_type"],[0,2,1,"_CPPv437mdns_service_txt_item_remove_for_hostPKcPKcPKcPKcPKc","mdns_service_txt_item_remove_for_host"],[0,3,1,"_CPPv437mdns_service_txt_item_remove_for_hostPKcPKcPKcPKcPKc","mdns_service_txt_item_remove_for_host::hostname"],[0,3,1,"_CPPv437mdns_service_txt_item_remove_for_hostPKcPKcPKcPKcPKc","mdns_service_txt_item_remove_for_host::instance"],[0,3,1,"_CPPv437mdns_service_txt_item_remove_for_hostPKcPKcPKcPKcPKc","mdns_service_txt_item_remove_for_host::key"],[0,3,1,"_CPPv437mdns_service_txt_item_remove_for_hostPKcPKcPKcPKcPKc","mdns_service_txt_item_remove_for_host::proto"],[0,3,1,"_CPPv437mdns_service_txt_item_remove_for_hostPKcPKcPKcPKcPKc","mdns_service_txt_item_remove_for_host::service_type"],[0,2,1,"_CPPv425mdns_service_txt_item_setPKcPKcPKcPKc","mdns_service_txt_item_set"],[0,3,1,"_CPPv425mdns_service_txt_item_setPKcPKcPKcPKc","mdns_service_txt_item_set::key"],[0,3,1,"_CPPv425mdns_service_txt_item_setPKcPKcPKcPKc","mdns_service_txt_item_set::proto"],[0,3,1,"_CPPv425mdns_service_txt_item_setPKcPKcPKcPKc","mdns_service_txt_item_set::service_type"],[0,3,1,"_CPPv425mdns_service_txt_item_setPKcPKcPKcPKc","mdns_service_txt_item_set::value"],[0,2,1,"_CPPv434mdns_service_txt_item_set_for_hostPKcPKcPKcPKcPKcPKc","mdns_service_txt_item_set_for_host"],[0,3,1,"_CPPv434mdns_service_txt_item_set_for_hostPKcPKcPKcPKcPKcPKc","mdns_service_txt_item_set_for_host::hostname"],[0,3,1,"_CPPv434mdns_service_txt_item_set_for_hostPKcPKcPKcPKcPKcPKc","mdns_service_txt_item_set_for_host::instance"],[0,3,1,"_CPPv434mdns_service_txt_item_set_for_hostPKcPKcPKcPKcPKcPKc","mdns_service_txt_item_set_for_host::key"],[0,3,1,"_CPPv434mdns_service_txt_item_set_for_hostPKcPKcPKcPKcPKcPKc","mdns_service_txt_item_set_for_host::proto"],[0,3,1,"_CPPv434mdns_service_txt_item_set_for_hostPKcPKcPKcPKcPKcPKc","mdns_service_txt_item_set_for_host::service_type"],[0,3,1,"_CPPv434mdns_service_txt_item_set_for_hostPKcPKcPKcPKcPKcPKc","mdns_service_txt_item_set_for_host::value"],[0,2,1,"_CPPv458mdns_service_txt_item_set_for_host_with_explicit_value_lenPKcPKcPKcPKcPKcPKc7uint8_t","mdns_service_txt_item_set_for_host_with_explicit_value_len"],[0,3,1,"_CPPv458mdns_service_txt_item_set_for_host_with_explicit_value_lenPKcPKcPKcPKcPKcPKc7uint8_t","mdns_service_txt_item_set_for_host_with_explicit_value_len::hostname"],[0,3,1,"_CPPv458mdns_service_txt_item_set_for_host_with_explicit_value_lenPKcPKcPKcPKcPKcPKc7uint8_t","mdns_service_txt_item_set_for_host_with_explicit_value_len::instance"],[0,3,1,"_CPPv458mdns_service_txt_item_set_for_host_with_explicit_value_lenPKcPKcPKcPKcPKcPKc7uint8_t","mdns_service_txt_item_set_for_host_with_explicit_value_len::key"],[0,3,1,"_CPPv458mdns_service_txt_item_set_for_host_with_explicit_value_lenPKcPKcPKcPKcPKcPKc7uint8_t","mdns_service_txt_item_set_for_host_with_explicit_value_len::proto"],[0,3,1,"_CPPv458mdns_service_txt_item_set_for_host_with_explicit_value_lenPKcPKcPKcPKcPKcPKc7uint8_t","mdns_service_txt_item_set_for_host_with_explicit_value_len::service_type"],[0,3,1,"_CPPv458mdns_service_txt_item_set_for_host_with_explicit_value_lenPKcPKcPKcPKcPKcPKc7uint8_t","mdns_service_txt_item_set_for_host_with_explicit_value_len::value"],[0,3,1,"_CPPv458mdns_service_txt_item_set_for_host_with_explicit_value_lenPKcPKcPKcPKcPKcPKc7uint8_t","mdns_service_txt_item_set_for_host_with_explicit_value_len::value_len"],[0,2,1,"_CPPv449mdns_service_txt_item_set_with_explicit_value_lenPKcPKcPKcPKc7uint8_t","mdns_service_txt_item_set_with_explicit_value_len"],[0,3,1,"_CPPv449mdns_service_txt_item_set_with_explicit_value_lenPKcPKcPKcPKc7uint8_t","mdns_service_txt_item_set_with_explicit_value_len::key"],[0,3,1,"_CPPv449mdns_service_txt_item_set_with_explicit_value_lenPKcPKcPKcPKc7uint8_t","mdns_service_txt_item_set_with_explicit_value_len::proto"],[0,3,1,"_CPPv449mdns_service_txt_item_set_with_explicit_value_lenPKcPKcPKcPKc7uint8_t","mdns_service_txt_item_set_with_explicit_value_len::service_type"],[0,3,1,"_CPPv449mdns_service_txt_item_set_with_explicit_value_lenPKcPKcPKcPKc7uint8_t","mdns_service_txt_item_set_with_explicit_value_len::value"],[0,3,1,"_CPPv449mdns_service_txt_item_set_with_explicit_value_lenPKcPKcPKcPKc7uint8_t","mdns_service_txt_item_set_with_explicit_value_len::value_len"],[0,2,1,"_CPPv420mdns_service_txt_setPKcPKcA_15mdns_txt_item_t7uint8_t","mdns_service_txt_set"],[0,3,1,"_CPPv420mdns_service_txt_setPKcPKcA_15mdns_txt_item_t7uint8_t","mdns_service_txt_set::num_items"],[0,3,1,"_CPPv420mdns_service_txt_setPKcPKcA_15mdns_txt_item_t7uint8_t","mdns_service_txt_set::proto"],[0,3,1,"_CPPv420mdns_service_txt_setPKcPKcA_15mdns_txt_item_t7uint8_t","mdns_service_txt_set::service_type"],[0,3,1,"_CPPv420mdns_service_txt_setPKcPKcA_15mdns_txt_item_t7uint8_t","mdns_service_txt_set::txt"],[0,2,1,"_CPPv429mdns_service_txt_set_for_hostPKcPKcPKcPKcA_15mdns_txt_item_t7uint8_t","mdns_service_txt_set_for_host"],[0,3,1,"_CPPv429mdns_service_txt_set_for_hostPKcPKcPKcPKcA_15mdns_txt_item_t7uint8_t","mdns_service_txt_set_for_host::hostname"],[0,3,1,"_CPPv429mdns_service_txt_set_for_hostPKcPKcPKcPKcA_15mdns_txt_item_t7uint8_t","mdns_service_txt_set_for_host::instance"],[0,3,1,"_CPPv429mdns_service_txt_set_for_hostPKcPKcPKcPKcA_15mdns_txt_item_t7uint8_t","mdns_service_txt_set_for_host::num_items"],[0,3,1,"_CPPv429mdns_service_txt_set_for_hostPKcPKcPKcPKcA_15mdns_txt_item_t7uint8_t","mdns_service_txt_set_for_host::proto"],[0,3,1,"_CPPv429mdns_service_txt_set_for_hostPKcPKcPKcPKcA_15mdns_txt_item_t7uint8_t","mdns_service_txt_set_for_host::service_type"],[0,3,1,"_CPPv429mdns_service_txt_set_for_hostPKcPKcPKcPKcA_15mdns_txt_item_t7uint8_t","mdns_service_txt_set_for_host::txt"],[0,5,1,"_CPPv415mdns_txt_item_t","mdns_txt_item_t"],[0,6,1,"_CPPv4N15mdns_txt_item_t3keyE","mdns_txt_item_t::key"],[0,6,1,"_CPPv4N15mdns_txt_item_t5valueE","mdns_txt_item_t::value"],[0,2,1,"_CPPv421mdns_unregister_netifP11esp_netif_t","mdns_unregister_netif"],[0,3,1,"_CPPv421mdns_unregister_netifP11esp_netif_t","mdns_unregister_netif::esp_netif"]]},objnames:{"0":["c","macro","C \u5b8f"],"1":["cpp","enumerator","C++ \u679a\u4e3e\u5b50"],"2":["cpp","function","C++ \u51fd\u6570"],"3":["cpp","functionParam","C++ function parameter"],"4":["cpp","enum","C++ \u679a\u4e3e"],"5":["cpp","class","C++ \u7c7b"],"6":["cpp","member","C++ \u6210\u5458"],"7":["cpp","type","C++ \u7c7b\u578b"]},objtypes:{"0":"c:macro","1":"cpp:enumerator","2":"cpp:function","3":"cpp:functionParam","4":"cpp:enum","5":"cpp:class","6":"cpp:member","7":"cpp:type"},terms:{"1234":0,"20":0,"2000":0,"3000":0,"3232":0,"4321":0,"80":0,"char":0,"const":0,"default":0,"enum":0,"for":0,"if":0,"in":0,"int":0,"new":0,"null":0,"public":0,"return":0,"static":0,"true":0,"var":0,"void":0,"while":0,"with":0,_afpovertcp:0,_arduino:0,_ftp:0,_http:0,_ipp:0,_myservic:0,_nf:0,_printer:0,_smb:0,_tcp:0,_udp:0,aaaa:0,action:0,activ:0,actual:0,add:0,add_mdns_servic:0,added:0,adding:0,addr:0,address:0,address_list:0,advertis:0,afp:0,after:0,all:0,alreadi:0,also:0,although:0,and:0,ani:0,announc:0,answer:0,ap:0,appl:0,are:0,arrai:0,as:0,asynchron:0,asynchronous:0,at:0,automat:0,avahi:0,avail:0,basic:0,be:0,been:0,befor:0,below:0,board:0,bonjour:0,bool:0,by:0,bye:0,call:0,can:0,chang:0,check:0,collect:0,config:0,config_mdns_max_interfac:0,conflict:0,connect:0,correspond:0,could:0,custom:0,data:0,decid:0,default_inst:0,defin:0,deleg:0,delet:0,deriv:0,desir:0,disabl:0,disconnect:0,driver:0,dure:0,each:0,eg:0,either:0,els:0,en:0,enabl:0,end:0,english:0,enough:0,err:0,error:0,esp32:0,esp:0,esp_err_invalid_arg:0,esp_err_invalid_st:0,esp_err_no_mem:0,esp_err_not_found:0,esp_err_t:0,esp_fail:0,esp_ip4_addr_t:0,esp_ip_addr_t:0,esp_log:0,esp_logw:0,esp_netif:0,esp_netif_t:0,esp_ok:0,etc:0,eth:0,ethernet:0,event:0,event_act:0,explicitli:0,fail:0,fals:0,find:0,find_mdns_servic:0,finish:0,first:0,follow:0,found:0,free:0,freed:0,from:0,ftp:0,gener:0,get:0,given:0,global:0,handl:0,handler:0,has:0,have:0,host:0,host_nam:0,hostnam:0,http:0,if_str:0,ignor:0,includ:0,init:0,initi:0,instanc:0,instance_nam:0,instance_old:0,interfac:0,ip2str:0,ip4:0,ip4_addr:0,ip6:0,ip:0,ip_protocol:0,ip_protocol_str:0,ipaddr_type_v6:0,ipstr:0,ipv4:0,ipv62str:0,ipv6:0,ipv6str:0,is:0,item:0,jhon:0,kei:0,kind:0,last:0,len:0,length:0,link:0,linux:0,list:0,live:0,local:0,look:0,mac:0,manual:0,max:0,max_result:0,maximum:0,mdns_delegate_hostname_add:0,mdns_delegate_hostname_remov:0,mdns_event_actions_t:0,mdns_event_announce_ip4:0,mdns_event_announce_ip6:0,mdns_event_disable_ip4:0,mdns_event_disable_ip6:0,mdns_event_enable_ip4:0,mdns_event_enable_ip6:0,mdns_event_ip4_reverse_lookup:0,mdns_event_ip6_reverse_lookup:0,mdns_free:0,mdns_hostname_exist:0,mdns_hostname_set:0,mdns_init:0,mdns_instance_name_set:0,mdns_ip_addr_:0,mdns_ip_addr_t:0,mdns_ip_protocol_max:0,mdns_ip_protocol_t:0,mdns_ip_protocol_v4:0,mdns_ip_protocol_v6:0,mdns_multiple_inst:0,mdns_netif_act:0,mdns_print_result:0,mdns_queri:0,mdns_query_a:0,mdns_query_async_delet:0,mdns_query_async_get_result:0,mdns_query_async_new:0,mdns_query_gener:0,mdns_query_multicast:0,mdns_query_notify_t:0,mdns_query_ptr:0,mdns_query_results_fre:0,mdns_query_srv:0,mdns_query_transmission_type_t:0,mdns_query_txt:0,mdns_query_unicast:0,mdns_register_netif:0,mdns_result_:0,mdns_result_t:0,mdns_search_once_:0,mdns_search_once_t:0,mdns_service_add:0,mdns_service_add_for_host:0,mdns_service_exist:0,mdns_service_exists_with_inst:0,mdns_service_instance_name_set:0,mdns_service_instance_name_set_for_host:0,mdns_service_port_set:0,mdns_service_port_set_for_host:0,mdns_service_remov:0,mdns_service_remove_al:0,mdns_service_remove_for_host:0,mdns_service_subtype_add_for_host:0,mdns_service_txt_item_remov:0,mdns_service_txt_item_remove_for_host:0,mdns_service_txt_item_set:0,mdns_service_txt_item_set_for_host:0,mdns_service_txt_item_set_for_host_with_explicit_value_len:0,mdns_service_txt_item_set_with_explicit_value_len:0,mdns_service_txt_set:0,mdns_service_txt_set_for_host:0,mdns_txt_item_t:0,mdns_type_:0,mdns_type_a:0,mdns_type_aaaa:0,mdns_type_ani:0,mdns_type_nsec:0,mdns_type_opt:0,mdns_type_ptr:0,mdns_type_srv:0,mdns_type_txt:0,mdns_unregister_netif:0,member:0,memori:0,method:0,millisecond:0,multicast:0,multipl:0,must:0,my:0,my_app_some_method:0,name:0,need:0,netif:0,network:0,next:0,nfs:0,no:0,not:0,note:0,notif:0,notifi:0,num_item:0,num_result:0,number:0,object:0,of:0,on:0,onc:0,one:0,onli:0,option:0,or:0,origin:0,os:0,other:0,otherwis:0,output:0,over:0,packet:0,paramet:0,password:0,perform:0,pointer:0,port:0,preconfigur:0,printf:0,probe:0,progress:0,properti:0,proto:0,protocol:0,ptr:0,queri:0,readi:0,record:0,regist:0,remov:0,replac:0,repli:0,requir:0,resolv:0,resolve_mdns_host:0,result:0,run:0,same:0,search:0,see:0,send:0,server:0,servic:0,service_nam:0,service_typ:0,servicetxtdata:0,set:0,size_t:0,specif:0,specifi:0,srevic:0,srv:0,sta:0,standard:0,start:0,start_mdns_servic:0,state:0,stop:0,string:0,strlen:0,struct:0,subtyp:0,success:0,successfulli:0,such:0,tag:0,task:0,tcpip_if:0,test:0,text:0,that:0,the:0,them:0,thi:0,thing:0,time:0,timeout:0,to:0,transmission_typ:0,ttl:0,txt:0,txt_count:0,txt_value_len:0,typedef:0,u_addr:0,udp:0,uint16_t:0,uint32_t:0,uint8_t:0,unicast:0,unregist:0,updat:0,used:0,user:0,using:0,v4:0,v6:0,val:0,valu:0,value_len:0,via:0,wait:0,want:0,was:0,web:0,when:0,whether:0,which:0,wifi:0,will:0,window:0,you:0},titles:["mDNS \u670d\u52a1"],titleterms:{"function":0,api:0,definit:0,enumer:0,file:0,header:0,macro:0,mdn:0,structur:0,type:0}}) \ No newline at end of file