From 0e154270b0c6f31e1e7b516380d6c718fe62dfc0 Mon Sep 17 00:00:00 2001 From: DeadPool <88374958+DeadPool3333@users.noreply.github.com> Date: Tue, 1 Feb 2022 14:29:37 +0000 Subject: [PATCH 1/2] Add sphinx_rtd_theme theme for docs --- docs/_build/doctrees/environment.pickle | Bin 39624 -> 39164 bytes docs/_build/doctrees/index.doctree | Bin 11355 -> 11383 bytes docs/_build/doctrees/modules.doctree | Bin 2400 -> 2428 bytes docs/_build/doctrees/pomice.doctree | Bin 291251 -> 329685 bytes docs/_build/doctrees/pomice.spotify.doctree | Bin 25284 -> 25851 bytes docs/_build/html/.buildinfo | 2 +- docs/_build/html/_static/alabaster.css | 701 -------------------- docs/_build/html/_static/basic.css | 6 +- docs/_build/html/_static/custom.css | 1 - docs/_build/html/_static/doctools.js | 5 +- docs/_build/html/_static/language_data.js | 2 +- docs/_build/html/_static/pygments.css | 138 ++-- docs/_build/html/_static/searchtools.js | 7 +- docs/_build/html/genindex.html | 186 +++--- docs/_build/html/index.html | 181 +++-- docs/_build/html/modules.html | 177 +++-- docs/_build/html/objects.inv | Bin 1154 -> 1202 bytes docs/_build/html/pomice.html | 493 ++++++++------ docs/_build/html/pomice.spotify.html | 313 +++++---- docs/_build/html/py-modindex.html | 166 +++-- docs/_build/html/search.html | 190 +++--- docs/_build/html/searchindex.js | 2 +- docs/conf.py | 4 +- docs/requirements_rtd.txt | 2 + 24 files changed, 958 insertions(+), 1618 deletions(-) delete mode 100644 docs/_build/html/_static/alabaster.css delete mode 100644 docs/_build/html/_static/custom.css diff --git a/docs/_build/doctrees/environment.pickle b/docs/_build/doctrees/environment.pickle index cc54593c8bc0151e13edd06ad2082c11f71c29d6..07dcc06ec5787954816303ceb4e8555fd2775034 100644 GIT binary patch literal 39164 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 I-LF^vKU?Pa4FCWD literal 39624 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 SP7wC-QT3&d@ZP9e<^KUUw!Sa` diff --git a/docs/_build/doctrees/index.doctree b/docs/_build/doctrees/index.doctree index c918508c9c92575f15c556d3a8efff53e48bb273..c0329e58e36551a23ca6452a0f86f761c3c3232d 100644 GIT binary patch delta 127 zcmcZ|@jZg2fpu!mMwVSnQcC(6`MIh3MWuOpsYUt)`MH_Nsro7T$;JAcUo(AFRaDC; zDJdwn($`N(EJ-XWN=(j9Ez-+OElJbMFG>d~ocvki3NKG;Zc=JWd}eN9dTR0HBbo*x eg2k!HC7Jno@x`e*Y4JIkdD&AsH-Fa5U;+R_4>7O+ delta 101 zcmew!aXW&gfpu!YMwVSnx~9%nF`>n&Ma40BnaSCiF)sPZrManjCB-r6nI##eNihZa zxtYnSF)8`U#W9<2Fnv@Nm&qt8DJZtm*DuM>&nec+Of5;%%P&fw{7U1>*aC*%MC diff --git a/docs/_build/doctrees/modules.doctree b/docs/_build/doctrees/modules.doctree index 0360d5875c990dc6960ca1bad6aff452029abc22..9d15f99594342ff670fbef4ed28a73c02245c171 100644 GIT binary patch delta 127 zcmaDL^hb!Lfpu!(MwTgzQY!ix`MIh3MWuOpsYUt)`MH_Nsro7T$;JAck1{T0QB=z) zDJdwn($`N(EJ-XWN=(j9Ez-+OElJbMFG>d~oZQHEg_kEaHz_qGJ~KBlJ+*jp5W9hh dU~y`4NoIatd~s?{T6|7sUiOsE&5i8$83C4YFEjuE delta 101 zcmew(^gxKEfpu!=MwTgzy5`PSF`>n&Ma40BnaSCiF)sPZrManjCB-r6nI##eNihZa zxtYnSF)8`U#W9;VF)n2hm&qt8DJZtm*DuM>&nec+Of5;%%P&fwT)}o_atyof=6US* F7y*^tCT9Qu diff --git a/docs/_build/doctrees/pomice.doctree b/docs/_build/doctrees/pomice.doctree index e3e2d07113de8d85b49e019dda0d4f7658d21a50..397d430d26e4942fd75a2bb04718368f06029ae6 100644 GIT binary patch literal 329685 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 literal 25284 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 CS@$3S diff --git a/docs/_build/html/.buildinfo b/docs/_build/html/.buildinfo index d761e76..f1c1dfc 100644 --- a/docs/_build/html/.buildinfo +++ b/docs/_build/html/.buildinfo @@ -1,4 +1,4 @@ # 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: 0ed884b921767abe79957ecf5d5887be +config: b63d0a8d2c46c67bfeda65e124ed2f92 tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/_build/html/_static/alabaster.css b/docs/_build/html/_static/alabaster.css deleted file mode 100644 index 0eddaeb..0000000 --- a/docs/_build/html/_static/alabaster.css +++ /dev/null @@ -1,701 +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: 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/docs/_build/html/_static/basic.css b/docs/_build/html/_static/basic.css index 912859b..bf18350 100644 --- a/docs/_build/html/_static/basic.css +++ b/docs/_build/html/_static/basic.css @@ -4,7 +4,7 @@ * * Sphinx stylesheet -- basic theme. * - * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -731,8 +731,9 @@ dl.glossary dt { .classifier:before { font-style: normal; - margin: 0.5em; + margin: 0 0.5em; content: ":"; + display: inline-block; } abbr, acronym { @@ -756,6 +757,7 @@ span.pre { -ms-hyphens: none; -webkit-hyphens: none; hyphens: none; + white-space: nowrap; } div[class*="highlight-"] { diff --git a/docs/_build/html/_static/custom.css b/docs/_build/html/_static/custom.css deleted file mode 100644 index 2a924f1..0000000 --- a/docs/_build/html/_static/custom.css +++ /dev/null @@ -1 +0,0 @@ -/* This file intentionally left blank. */ diff --git a/docs/_build/html/_static/doctools.js b/docs/_build/html/_static/doctools.js index 8cbf1b1..e509e48 100644 --- a/docs/_build/html/_static/doctools.js +++ b/docs/_build/html/_static/doctools.js @@ -4,7 +4,7 @@ * * Sphinx JavaScript utilities for all documentation. * - * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -264,6 +264,9 @@ var Documentation = { 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); }, /** diff --git a/docs/_build/html/_static/language_data.js b/docs/_build/html/_static/language_data.js index 863704b..ebe2f03 100644 --- a/docs/_build/html/_static/language_data.js +++ b/docs/_build/html/_static/language_data.js @@ -5,7 +5,7 @@ * This script contains the language-specific data used by searchtools.js, * namely the list of stopwords, stemmer, scorer and splitter. * - * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ diff --git a/docs/_build/html/_static/pygments.css b/docs/_build/html/_static/pygments.css index 87f8bd1..08bec68 100644 --- a/docs/_build/html/_static/pygments.css +++ b/docs/_build/html/_static/pygments.css @@ -5,78 +5,70 @@ td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5 span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } .highlight .hll { background-color: #ffffcc } .highlight { background: #f8f8f8; } -.highlight .c { color: #8f5902; font-style: italic } /* Comment */ -.highlight .err { color: #a40000; border: 1px solid #ef2929 } /* Error */ -.highlight .g { color: #000000 } /* Generic */ -.highlight .k { color: #004461; font-weight: bold } /* Keyword */ -.highlight .l { color: #000000 } /* Literal */ -.highlight .n { color: #000000 } /* Name */ -.highlight .o { color: #582800 } /* Operator */ -.highlight .x { color: #000000 } /* Other */ -.highlight .p { color: #000000; font-weight: bold } /* Punctuation */ -.highlight .ch { color: #8f5902; font-style: italic } /* Comment.Hashbang */ -.highlight .cm { color: #8f5902; font-style: italic } /* Comment.Multiline */ -.highlight .cp { color: #8f5902 } /* Comment.Preproc */ -.highlight .cpf { color: #8f5902; font-style: italic } /* Comment.PreprocFile */ -.highlight .c1 { color: #8f5902; font-style: italic } /* Comment.Single */ -.highlight .cs { color: #8f5902; font-style: italic } /* Comment.Special */ -.highlight .gd { color: #a40000 } /* Generic.Deleted */ -.highlight .ge { color: #000000; font-style: italic } /* Generic.Emph */ -.highlight .gr { color: #ef2929 } /* Generic.Error */ +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .gr { color: #E40000 } /* Generic.Error */ .highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ -.highlight .gi { color: #00A000 } /* Generic.Inserted */ -.highlight .go { color: #888888 } /* Generic.Output */ -.highlight .gp { color: #745334 } /* Generic.Prompt */ -.highlight .gs { color: #000000; font-weight: bold } /* Generic.Strong */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ .highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ -.highlight .gt { color: #a40000; font-weight: bold } /* Generic.Traceback */ -.highlight .kc { color: #004461; font-weight: bold } /* Keyword.Constant */ -.highlight .kd { color: #004461; font-weight: bold } /* Keyword.Declaration */ -.highlight .kn { color: #004461; font-weight: bold } /* Keyword.Namespace */ -.highlight .kp { color: #004461; font-weight: bold } /* Keyword.Pseudo */ -.highlight .kr { color: #004461; font-weight: bold } /* Keyword.Reserved */ -.highlight .kt { color: #004461; font-weight: bold } /* Keyword.Type */ -.highlight .ld { color: #000000 } /* Literal.Date */ -.highlight .m { color: #990000 } /* Literal.Number */ -.highlight .s { color: #4e9a06 } /* Literal.String */ -.highlight .na { color: #c4a000 } /* Name.Attribute */ -.highlight .nb { color: #004461 } /* Name.Builtin */ -.highlight .nc { color: #000000 } /* Name.Class */ -.highlight .no { color: #000000 } /* Name.Constant */ -.highlight .nd { color: #888888 } /* Name.Decorator */ -.highlight .ni { color: #ce5c00 } /* Name.Entity */ -.highlight .ne { color: #cc0000; font-weight: bold } /* Name.Exception */ -.highlight .nf { color: #000000 } /* Name.Function */ -.highlight .nl { color: #f57900 } /* Name.Label */ -.highlight .nn { color: #000000 } /* Name.Namespace */ -.highlight .nx { color: #000000 } /* Name.Other */ -.highlight .py { color: #000000 } /* Name.Property */ -.highlight .nt { color: #004461; font-weight: bold } /* Name.Tag */ -.highlight .nv { color: #000000 } /* Name.Variable */ -.highlight .ow { color: #004461; font-weight: bold } /* Operator.Word */ -.highlight .w { color: #f8f8f8; text-decoration: underline } /* Text.Whitespace */ -.highlight .mb { color: #990000 } /* Literal.Number.Bin */ -.highlight .mf { color: #990000 } /* Literal.Number.Float */ -.highlight .mh { color: #990000 } /* Literal.Number.Hex */ -.highlight .mi { color: #990000 } /* Literal.Number.Integer */ -.highlight .mo { color: #990000 } /* Literal.Number.Oct */ -.highlight .sa { color: #4e9a06 } /* Literal.String.Affix */ -.highlight .sb { color: #4e9a06 } /* Literal.String.Backtick */ -.highlight .sc { color: #4e9a06 } /* Literal.String.Char */ -.highlight .dl { color: #4e9a06 } /* Literal.String.Delimiter */ -.highlight .sd { color: #8f5902; font-style: italic } /* Literal.String.Doc */ -.highlight .s2 { color: #4e9a06 } /* Literal.String.Double */ -.highlight .se { color: #4e9a06 } /* Literal.String.Escape */ -.highlight .sh { color: #4e9a06 } /* Literal.String.Heredoc */ -.highlight .si { color: #4e9a06 } /* Literal.String.Interpol */ -.highlight .sx { color: #4e9a06 } /* Literal.String.Other */ -.highlight .sr { color: #4e9a06 } /* Literal.String.Regex */ -.highlight .s1 { color: #4e9a06 } /* Literal.String.Single */ -.highlight .ss { color: #4e9a06 } /* Literal.String.Symbol */ -.highlight .bp { color: #3465a4 } /* Name.Builtin.Pseudo */ -.highlight .fm { color: #000000 } /* Name.Function.Magic */ -.highlight .vc { color: #000000 } /* Name.Variable.Class */ -.highlight .vg { color: #000000 } /* Name.Variable.Global */ -.highlight .vi { color: #000000 } /* Name.Variable.Instance */ -.highlight .vm { color: #000000 } /* Name.Variable.Magic */ -.highlight .il { color: #990000 } /* Literal.Number.Integer.Long */ \ No newline at end of file +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/docs/_build/html/_static/searchtools.js b/docs/_build/html/_static/searchtools.js index 58ff35c..2d77859 100644 --- a/docs/_build/html/_static/searchtools.js +++ b/docs/_build/html/_static/searchtools.js @@ -4,7 +4,7 @@ * * Sphinx JavaScript utilities for the full-text search. * - * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -328,7 +328,9 @@ var Search = { var results = []; for (var prefix in objects) { - for (var name in objects[prefix]) { + for (var iMatch = 0; iMatch != objects[prefix].length; ++iMatch) { + var match = objects[prefix][iMatch]; + var name = match[4]; var fullname = (prefix ? prefix + '.' : '') + name; var fullnameLower = fullname.toLowerCase() if (fullnameLower.indexOf(object) > -1) { @@ -342,7 +344,6 @@ var Search = { } else if (parts[parts.length - 1].indexOf(object) > -1) { score += Scorer.objPartialMatch; } - var match = objects[prefix][name]; var objname = objnames[match[1]][2]; var title = titles[match[0]]; // If more than one term searched for, we require other words to be diff --git a/docs/_build/html/genindex.html b/docs/_build/html/genindex.html index e886072..0db161a 100644 --- a/docs/_build/html/genindex.html +++ b/docs/_build/html/genindex.html @@ -1,35 +1,66 @@ - - - - - - - Index — Pomice 1.1.1 documentation - - - - - - + + + + + Index — Pomice 1.1.1 documentation + + + + + + + + + - - - - - - + + - - + +
+ -
- +
+ +
+
+
+
    +
  • »
  • +
  • Index
  • +
  • +
  • +
+
+
+
+
+

Index

@@ -75,9 +106,15 @@
  • (pomice.pool.Node property)
  • +
  • build_track() (pomice.pool.Node method) +
  • @@ -155,6 +192,8 @@

    G

    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
    • -
    • -
    • -
    -
    -
    -
    -
    - - -

    Index

    - -
    - A - | B - | C - | D - | E - | F - | G - | H - | I - | K - | L - | M - | N - | O - | P - | R - | S - | T - | U - | V - | W - | Y - -
    -

    A

    - - -
    - -

    B

    - - - -
    - -

    C

    - - - -
    - -

    D

    - - - -
    - -

    E

    - - - -
    - -

    F

    - - - -
    - -

    G

    - - - -
    - -

    H

    - - -
    - -

    I

    - - - -
    - -

    K

    - - -
    - -

    L

    - - - -
    - -

    M

    - - -
    - -

    N

    - - - -
    - -

    O

    - - - -
    - -

    P

    - - - -
    - -

    R

    - - - -
    - -

    S

    - - - -
    - -

    T

    - - - -
    - -

    U

    - - -
    - -

    V

    - - - -
    - -

    W

    - - - -
    - -

    Y

    - - - -
    - - - -
    -
    - -
    -
    -
    -
    - - - - \ No newline at end of file diff --git a/docs/_build/html/index.html b/docs/_build/html/index.html deleted file mode 100644 index cf7d28b..0000000 --- a/docs/_build/html/index.html +++ /dev/null @@ -1,213 +0,0 @@ - - - - - - - Welcome to Pomice! — Pomice 1.1.1 documentation - - - - - - - - - - - - - - - -
    - - -
    - -
    -
    -
    - -
    -
    -
    -
    - -
    -

    Welcome to Pomice!

    -https://raw.githubusercontent.com/cloudwithax/pomice/main/banner.jpg -

    The modern Lavalink wrapper designed for discord.py

    -
    -

    Contents

    - -
    -
    -

    Before You Start

    -

    This library is designed to work with the Lavalink audio delivery system, -which directly interfaces with Discord to provide buttery smooth audio without -wasting your precious system resources.

    -

    Pomice is made with convenience to the user, in that everything is easy to use -and is out of your way, while also being customizable.

    -

    In order to start using this library, please download a Lavalink node to start, -you can get it here

    -
    -
    -

    Quick Jumpstart

    -

    If you want a quick example as to how to start with Pomice, look below:

    -
    import pomice
    -import discord
    -import re
    -
    -from discord.ext import commands
    -
    -URL_REG = re.compile(r'https?://(?:www\.)?.+')
    -
    -class MyBot(commands.Bot):
    -
    -   def __init__(self) -> None:
    -      super().__init__(command_prefix='!', activity=discord.Activity(type=discord.ActivityType.listening, name='to music!'))
    -
    -      self.add_cog(Music(self))
    -
    -   async def on_ready(self) -> None:
    -      print("I'm online!")
    -      await self.cogs["Music"].start_nodes()
    -
    -
    -class Music(commands.Cog):
    -
    -   def __init__(self, bot) -> None:
    -      self.bot = bot
    -
    -      self.pomice = pomice.NodePool()
    -
    -   async def start_nodes(self):
    -      await self.pomice.create_node(bot=self.bot, host='127.0.0.1', port='3030',
    -                                    password='youshallnotpass', identifier='MAIN')
    -      print(f"Node is ready!")
    -
    -
    -
    -   @commands.command(name='join', aliases=['connect'])
    -   async def join(self, ctx: commands.Context, *, channel: discord.TextChannel = None) -> None:
    -
    -      if not channel:
    -            channel = getattr(ctx.author.voice, 'channel', None)
    -            if not channel:
    -               raise commands.CheckFailure('You must be in a voice channel to use this command'
    -                                          'without specifying the channel argument.')
    -
    -
    -      await ctx.author.voice.channel.connect(cls=pomice.Player)
    -      await ctx.send(f'Joined the voice channel `{channel}`')
    -
    -   @commands.command(name='play')
    -   async def play(self, ctx, *, search: str) -> None:
    -
    -      if not ctx.voice_client:
    -            await ctx.invoke(self.join)
    -
    -      player = ctx.voice_client
    -
    -      results = await player.get_tracks(query=f'{search}')
    -
    -      if not results:
    -            raise commands.CommandError('No results were found for that search term.')
    -
    -      if isinstance(results, pomice.Playlist):
    -            await player.play(track=results.tracks[0])
    -      else:
    -            await player.play(track=results[0])
    -
    -
    -bot = MyBot()
    -bot.run("token here")
    -
    -
    -
    -
    - - -
    -
    - -
    -
    -
    -
    - - - - \ No newline at end of file diff --git a/docs/_build/html/modules.html b/docs/_build/html/modules.html deleted file mode 100644 index 4011fbb..0000000 --- a/docs/_build/html/modules.html +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - <no title> — Pomice 1.1.1 documentation - - - - - - - - - - - - - - - - -
    - - -
    - -
    -
    -
    - -
    -
    - - -
    -
    -
    -
    - - - - \ No newline at end of file diff --git a/docs/_build/html/objects.inv b/docs/_build/html/objects.inv deleted file mode 100644 index e4e5f04d93164489bed0ff55cc59fb3ddc0a21df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1202 zcmV;j1Wo%RAX9K?X>NERX>N99Zgg*Qc_4OWa&u{KZXhxWBOp+6Z)#;@bUGkVZ*6H~ zWeOu8R%LQ?X>V>iAPOTORA^-&a%F8{X>Md?av*PJAarPHb0B7EY-J#6b0A}HZE$jB zb8}^6Aa!$TZf78RY-wUH3V7PBm`#t{HV}sI{uL_P>k`d1C$69-3AV-(9919%UdwxINFP81xN z6eu5CpsF}NwKYUnKO#gIx_d|rNm^6g>Hx=|Kp0e)bO70OPiyxOGfe-1NXc|fjnA_J zbCe|tKT=V0P&=v)8dd7di=Y+Y=qE*s=d~!2mCvx`urCGF#`bek@EM$%!q!k_Qo@g5 zdg#VhkrcWI6GDH5d@GA*Fe@%KV5j{YeR~oc+Hy(Dgf#xFL8O*2u&4t1u0u)80FjT3 z8&IFbiE>sh)uE|E@`FuGY!V!7YiZcNU2$f;EE_92iv6G_><~DY57KQmdU>LZ)0{(! zhZ0s&2q@gMpW0i!e6-m#Dm57e-C(Shk}A!`pfYLrgETh`Xi)a_6heP2dEQj_c7?go zOqrA5XJfx$IMe2TaMcOfEq*!&VHs?sW@!U7q=9LXeYb`&0uTtYvb($h{)N3n=v5DW zup=&2Utc7&{@&P;`2h;Scx^%epQ)nq84$$1{Ac3~_RRre6X<`UMvsWI%{HHdQX{>T+V!q~IfsImOPshfz+pkfw#mBT~kK}y!!>Y%odjPXDZqhYA z>Y-u0ObN>LE|dzXd`CDc$*}8pnCJ{U*!5R#zglj<(?~}p z^~yj;4zBj+RYKhv`ka9E1{Z{E#*=05<<%6;oSdPH?uO@v@ZJGg4Stdm2s{~YM6<$u_Ca=(udwM(cyR7HMtdJj$`w!QXVig^IRL - - - - - - Pomice — Pomice 1.1.1 documentation - - - - - - - - - - - - - - - - -
    - - -
    - -
    -
    -
    - -
    -
    -
    -
    - -
    -

    Pomice

    - -
    -

    Enums

    -
    -
    -class pomice.enums.NodeAlgorithm(value)
    -

    Bases: enum.Enum

    -

    The enum for the different node algorithms in Pomice.

    -

    The enums in this class are to only differentiate different -methods, since the actual method is handled in the -get_best_node() method.

    -

    NodeAlgorithm.by_ping returns a node based on it’s latency, -preferring a node with the lowest response time

    -

    NodeAlgorithm.by_region returns a node based on its voice region, -which the region is specified by the user in the method as an arg. -This method will only work if you set a voice region when you create a node.

    -

    NodeAlgorithm.by_players return a nodes based on how many players it has. -This algorithm prefers nodes with the least amount of players.

    -
    -
    -by_ping = 1
    -
    - -
    -
    -by_players = 3
    -
    - -
    -
    -by_region = 2
    -
    - -
    - -
    -
    -class pomice.enums.SearchType(value)
    -

    Bases: enum.Enum

    -

    The enum for the different search types for Pomice. -This feature is exclusively for the Spotify search feature of Pomice. -If you are not using this feature, this class is not necessary.

    -

    SearchType.ytsearch searches using regular Youtube, -which is best for all scenarios.

    -

    SearchType.ytmsearch searches using YouTube Music, -which is best for getting audio-only results.

    -

    SearchType.scsearch searches using SoundCloud, -which is an alternative to YouTube or YouTube Music.

    -
    -
    -scsearch = 'scsearch'
    -
    - -
    -
    -ytmsearch = 'ytmsearch'
    -
    - -
    -
    -ytsearch = 'ytsearch'
    -
    - -
    - -
    -
    -

    Events

    -
    -
    -class pomice.events.PomiceEvent
    -

    Bases: object

    -

    The base class for all events dispatched by a node. -Every event must be formatted within your bot’s code as a listener. -i.e: If you want to listen for when a track starts, the event would be: -`py -@bot.listen -async def on_pomice_track_start(self, event): -`

    -
    -
    -dispatch(bot: discord.client.Client)
    -
    - -
    -
    -handler_args = ()
    -
    - -
    -
    -name = 'event'
    -
    - -
    - -
    -
    -class pomice.events.TrackEndEvent(data: dict, player)
    -

    Bases: pomice.events.PomiceEvent

    -

    Fired when a track has successfully ended. -Returns the player associated with the event along with the pomice.Track object and reason.

    -
    -
    -name = 'track_end'
    -
    - -
    - -
    -
    -class pomice.events.TrackExceptionEvent(data: dict, player)
    -

    Bases: pomice.events.PomiceEvent

    -

    Fired when a track error has occured. -Returns the player associated with the event along with the error code and exception.

    -
    -
    -name = 'track_exception'
    -
    - -
    - -
    -
    -class pomice.events.TrackStartEvent(data: dict, player)
    -

    Bases: pomice.events.PomiceEvent

    -

    Fired when a track has successfully started. -Returns the player associated with the event and the pomice.Track object.

    -
    -
    -name = 'track_start'
    -
    - -
    - -
    -
    -class pomice.events.TrackStuckEvent(data: dict, player)
    -

    Bases: pomice.events.PomiceEvent

    -

    Fired when a track is stuck and cannot be played. Returns the player -associated with the event along with the pomice.Track object -to be further parsed by the end user.

    -
    -
    -name = 'track_stuck'
    -
    - -
    - -
    -
    -class pomice.events.WebSocketClosedEvent(data: dict, _)
    -

    Bases: pomice.events.PomiceEvent

    -

    Fired when a websocket connection to a node has been closed. -Returns the reason and the error code.

    -
    -
    -name = 'websocket_closed'
    -
    - -
    - -
    -
    -class pomice.events.WebSocketClosedPayload(data: dict)
    -

    Bases: object

    -
    - -
    -
    -class pomice.events.WebSocketOpenEvent(data: dict, _)
    -

    Bases: pomice.events.PomiceEvent

    -

    Fired when a websocket connection to a node has been initiated. -Returns the target and the session SSRC.

    -
    -
    -name = 'websocket_open'
    -
    - -
    - -
    -
    -

    Exceptions

    -
    -
    -exception pomice.exceptions.FilterInvalidArgument
    -

    Bases: pomice.exceptions.PomiceException

    -

    An invalid argument was passed to a filter.

    -
    - -
    -
    -exception pomice.exceptions.InvalidSpotifyClientAuthorization
    -

    Bases: pomice.exceptions.PomiceException

    -

    No Spotify client authorization was provided for track searching.

    -
    - -
    -
    -exception pomice.exceptions.NoNodesAvailable
    -

    Bases: pomice.exceptions.PomiceException

    -

    There are no nodes currently available.

    -
    - -
    -
    -exception pomice.exceptions.NodeConnectionClosed
    -

    Bases: pomice.exceptions.NodeException

    -

    The node’s connection is closed.

    -
    - -
    -
    -exception pomice.exceptions.NodeConnectionFailure
    -

    Bases: pomice.exceptions.NodeException

    -

    There was a problem while connecting to the node.

    -
    - -
    -
    -exception pomice.exceptions.NodeCreationError
    -

    Bases: pomice.exceptions.NodeException

    -

    There was a problem while creating the node.

    -
    - -
    -
    -exception pomice.exceptions.NodeException
    -

    Bases: Exception

    -

    Base exception for nodes.

    -
    - -
    -
    -exception pomice.exceptions.NodeNotAvailable
    -

    Bases: pomice.exceptions.PomiceException

    -

    The node is currently unavailable.

    -
    - -
    -
    -exception pomice.exceptions.PomiceException
    -

    Bases: Exception

    -

    Base of all Pomice exceptions.

    -
    - -
    -
    -exception pomice.exceptions.SpotifyAlbumLoadFailed
    -

    Bases: pomice.exceptions.PomiceException

    -

    The pomice Spotify client was unable to load an album.

    -
    - -
    -
    -exception pomice.exceptions.SpotifyPlaylistLoadFailed
    -

    Bases: pomice.exceptions.PomiceException

    -

    The pomice Spotify client was unable to load a playlist.

    -
    - -
    -
    -exception pomice.exceptions.SpotifyTrackLoadFailed
    -

    Bases: pomice.exceptions.PomiceException

    -

    The pomice Spotify client was unable to load a track.

    -
    - -
    -
    -exception pomice.exceptions.TrackInvalidPosition
    -

    Bases: pomice.exceptions.PomiceException

    -

    An invalid position was chosen for a track.

    -
    - -
    -
    -exception pomice.exceptions.TrackLoadError
    -

    Bases: pomice.exceptions.PomiceException

    -

    There was an error while loading a track.

    -
    - -
    -
    -

    Filters

    -
    -
    -class pomice.filters.ChannelMix(*, left_to_left: float = 1, right_to_right: float = 1, left_to_right: float = 0, right_to_left: float = 0)
    -

    Bases: pomice.filters.Filter

    -

    Filter which manually adjusts the panning of the audio, which can make -for some cool effects when done correctly.

    -
    - -
    -
    -class pomice.filters.Distortion(*, sin_offset: float = 0, sin_scale: float = 1, cos_offset: float = 0, cos_scale: float = 1, tan_offset: float = 0, tan_scale: float = 1, offset: float = 0, scale: float = 1)
    -

    Bases: pomice.filters.Filter

    -

    Filter which generates a distortion effect. Useful for certain filter implementations where -distortion is needed.

    -
    - -
    -
    -class pomice.filters.Equalizer(*, levels: list)
    -

    Bases: pomice.filters.Filter

    -

    Filter which represents a 15 band equalizer. -You can adjust the dynamic of the sound using this filter. -i.e: Applying a bass boost filter to emphasize the bass in a song. -The format for the levels is: List[Tuple[int, float]]

    -
    - -
    -
    -class pomice.filters.Filter
    -

    Bases: object

    -

    The base class for all filters. -You can use these filters if you have the latest Lavalink version -installed. If you do not have the latest Lavalink version, -these filters will not work.

    -
    - -
    -
    -class pomice.filters.Karaoke(*, level: float = 1.0, mono_level: float = 1.0, filter_band: float = 220.0, filter_width: float = 100.0)
    -

    Bases: pomice.filters.Filter

    -

    Filter which filters the vocal track from any song and leaves the instrumental. -Best for karaoke as the filter implies.

    -
    - -
    -
    -class pomice.filters.LowPass(*, smoothing: float = 20)
    -

    Bases: pomice.filters.Filter

    -

    Filter which supresses higher frequencies and allows lower frequencies to pass. -You can also do this with the Equalizer filter, but this is an easier way to do it.

    -
    - -
    -
    -class pomice.filters.Rotation(*, rotation_hertz: float = 5)
    -

    Bases: pomice.filters.Filter

    -

    Filter which produces a stereo-like panning effect, which sounds like -the audio is being rotated around the listener’s head

    -
    - -
    -
    -class pomice.filters.Timescale(*, speed: float = 1.0, pitch: float = 1.0, rate: float = 1.0)
    -

    Bases: pomice.filters.Filter

    -

    Filter which changes the speed and pitch of a track. -You can make some very nice effects with this filter, -i.e: a vaporwave-esque filter which slows the track down -a certain amount to produce said effect.

    -
    - -
    -
    -class pomice.filters.Tremolo(*, frequency: float = 2.0, depth: float = 0.5)
    -

    Bases: pomice.filters.Filter

    -

    Filter which produces a wavering tone in the music, -causing it to sound like the music is changing in volume rapidly.

    -
    - -
    -
    -class pomice.filters.Vibrato(*, frequency: float = 2.0, depth: float = 0.5)
    -

    Bases: pomice.filters.Filter

    -

    Filter which produces a wavering tone in the music, similar to the Tremolo filter, -but changes in pitch rather than volume.

    -
    - -
    -
    -

    Objects

    -
    -
    -class pomice.objects.Playlist(*, playlist_info: dict, tracks: list, ctx: Optional[discord.ext.commands.context.Context] = None, spotify: bool = False, spotify_playlist=None)
    -

    Bases: object

    -

    The base playlist object. -Returns critical playlist information needed for parsing by Lavalink. -You can also pass in commands.Context to get a discord.py Context object in your tracks.

    -
    -
    -property thumbnail: Optional[str]
    -

    Spotify album/playlist thumbnail, or None if not a Spotify object.

    -
    - -
    -
    -property uri: Optional[str]
    -

    Spotify album/playlist URI, or None if not a Spotify object.

    -
    - -
    - -
    -
    -class pomice.objects.Track(*, track_id: str, info: dict, ctx: Optional[discord.ext.commands.context.Context] = None, spotify: bool = False, search_type: pomice.enums.SearchType = SearchType.ytsearch, spotify_track=None)
    -

    Bases: object

    -

    The base track object. Returns critical track information needed for parsing by Lavalink. -You can also pass in commands.Context to get a discord.py Context object in your track.

    -
    - -
    -
    -

    Player

    -
    -
    -class pomice.player.Player(client: Optional[discord.client.Client] = None, channel: Optional[discord.channel.VoiceChannel] = None, *, node: Optional[pomice.pool.Node] = None)
    -

    Bases: discord.voice_client.VoiceProtocol

    -

    The base player class for Pomice. -In order to initiate a player, you must pass it in as a cls when you connect to a channel. -i.e: `py -await ctx.author.voice.channel.connect(cls=pomice.Player) -`

    -
    -
    -property bot: discord.client.Client
    -

    Property which returns the bot associated with this player instance

    -
    - -
    -
    -async connect(*, timeout: float, reconnect: bool)
    -

    |coro|

    -

    An abstract method called when the client initiates the connection request.

    -

    When a connection is requested initially, the library calls the constructor -under __init__ and then calls connect(). If connect() fails at -some point then disconnect() is called.

    -

    Within this method, to start the voice connection flow it is recommended to -use Guild.change_voice_state() to start the flow. After which, -on_voice_server_update() and on_voice_state_update() will be called. -The order that these two are called is unspecified.

    -
    -
    timeout: float

    The timeout for the connection.

    -
    -
    reconnect: bool

    Whether reconnection is expected.

    -
    -
    -
    - -
    -
    -property current: pomice.objects.Track
    -

    Property which returns the currently playing track

    -
    - -
    -
    -async destroy()
    -

    Disconnects and destroys the player, and runs internal cleanup.

    -
    - -
    -
    -async disconnect(*, force: bool = False)
    -

    Disconnects the player from voice.

    -
    - -
    -
    -property filter: pomice.filters.Filter
    -

    Property which returns the currently applied filter, if one is applied

    -
    - -
    -
    -async get_tracks(query: str, *, ctx: Optional[discord.ext.commands.context.Context] = None, search_type: pomice.enums.SearchType = SearchType.ytsearch)
    -

    Fetches tracks from the node’s REST api to parse into Lavalink.

    -

    If you passed in Spotify API credentials when you created the node, -you can also pass in a Spotify URL of a playlist, album or track and it will be parsed -accordingly.

    -

    You can also pass in a discord.py Context object to get a -Context object on any track you search.

    -
    - -
    -
    -property guild: discord.guild.Guild
    -

    Property which returns the guild associated with the player

    -
    - -
    -
    -property is_connected: bool
    -

    Property which returns whether or not the player is connected

    -
    - -
    -
    -property is_dead: bool
    -

    Returns a bool representing whether the player is dead or not. -A player is considered dead if it has been destroyed and removed from stored players.

    -
    - -
    -
    -property is_paused: bool
    -

    Property which returns whether or not the player has a track which is paused or not.

    -
    - -
    -
    -property is_playing: bool
    -

    Property which returns whether or not the player is actively playing a track.

    -
    - -
    -
    -property node: pomice.pool.Node
    -

    Property which returns the node the player is connected to

    -
    - -
    -
    -async on_voice_server_update(data: dict)
    -

    |coro|

    -

    An abstract method that is called when initially connecting to voice. -This corresponds to VOICE_SERVER_UPDATE.

    -
    -
    data: dict

    The raw voice server update payload.

    -
    -
    -
    - -
    -
    -async on_voice_state_update(data: dict)
    -

    |coro|

    -

    An abstract method that is called when the client’s voice state -has changed. This corresponds to VOICE_STATE_UPDATE.

    -
    -
    data: dict

    The raw voice state payload.

    -
    -
    -
    - -
    -
    -async play(track: pomice.objects.Track, *, start: int = 0, end: int = 0, ignore_if_playing: bool = False) pomice.objects.Track
    -

    Plays a track. If a Spotify track is passed in, it will be handled accordingly.

    -
    - -
    -
    -property position: float
    -

    Property which returns the player’s position in a track in milliseconds

    -
    - -
    -
    -async reset_filter()
    -

    Resets a currently applied filter to its default parameters. -You must have a filter applied in order for this to work

    -
    - -
    -
    -async seek(position: float) float
    -

    Seeks to a position in the currently playing track milliseconds

    -
    - -
    -
    -async set_filter(filter: pomice.filters.Filter) pomice.filters.Filter
    -

    Sets a filter of the player. Takes a pomice.Filter object. -This will only work if you are using a version of Lavalink that supports filters.

    -
    - -
    -
    -async set_pause(pause: bool) bool
    -

    Sets the pause state of the currently playing track.

    -
    - -
    -
    -async set_volume(volume: int) int
    -

    Sets the volume of the player as an integer. Lavalink accepts values from 0 to 500.

    -
    - -
    -
    -async stop()
    -

    Stops the currently playing track.

    -
    - -
    -
    -property volume: int
    -

    Property which returns the players current volume

    -
    - -
    - -
    -
    -

    Pool

    -
    -
    -class pomice.pool.Node(*, pool, bot: discord.client.Client, host: str, port: int, password: str, identifier: str, secure: bool = False, heartbeat: int = 30, region: Optional[discord.enums.VoiceRegion] = None, session: Optional[aiohttp.client.ClientSession] = None, spotify_client_id: Optional[str] = None, spotify_client_secret: Optional[str] = None)
    -

    Bases: object

    -

    The base class for a node. -This node object represents a Lavalink node. -To enable Spotify searching, pass in a proper Spotify Client ID and Spotify Client Secret

    -
    -
    -property bot: discord.client.Client
    -

    Property which returns the discord.py client linked to this node

    -
    - -
    -
    -async build_track(identifier: str, ctx: Optional[discord.ext.commands.context.Context] = None) pomice.objects.Track
    -

    Builds a track using a valid track identifier

    -

    You can also pass in a discord.py Context object to get a -Context object on the track it builds.

    -
    - -
    -
    -async connect()
    -

    Initiates a connection with a Lavalink node and adds it to the node pool.

    -
    - -
    -
    -async disconnect()
    -

    Disconnects a connected Lavalink node and removes it from the node pool. -This also destroys any players connected to the node.

    -
    - -
    -
    -get_player(guild_id: int)
    -

    Takes a guild ID as a parameter. Returns a pomice Player object.

    -
    - -
    -
    -async get_tracks(query: str, *, ctx: Optional[discord.ext.commands.context.Context] = None, search_type: pomice.enums.SearchType = SearchType.ytsearch)
    -

    Fetches tracks from the node’s REST api to parse into Lavalink.

    -

    If you passed in Spotify API credentials, you can also pass in a -Spotify URL of a playlist, album or track and it will be parsed accordingly.

    -

    You can also pass in a discord.py Context object to get a -Context object on any track you search.

    -
    - -
    -
    -property is_connected: bool
    -

    “Property which returns whether this node is connected or not

    -
    - -
    -
    -property latency
    -

    Property which returns the latency of the node

    -
    - -
    -
    -property player_count: int
    -

    Property which returns how many players are connected to this node

    -
    - -
    -
    -property players: Dict[int, Player]
    -

    Property which returns a dict containing the guild ID and the player object.

    -
    - -
    -
    -property pool
    -

    Property which returns the pool this node is apart of

    -
    - -
    -
    -property region: Optional[discord.enums.VoiceRegion]
    -

    Property which returns the VoiceRegion of the node, if one is set

    -
    - -
    -
    -async send(**data)
    -
    - -
    -
    -property stats: pomice.utils.NodeStats
    -

    Property which returns the node stats.

    -
    - -
    - -
    -
    -class pomice.pool.NodePool
    -

    Bases: object

    -

    The base class for the node pool. -This holds all the nodes that are to be used by the bot.

    -
    -
    -async classmethod create_node(*, bot: discord.client.Client, host: str, port: str, password: str, identifier: str, secure: bool = False, heartbeat: int = 30, region: Optional[discord.enums.VoiceRegion] = None, spotify_client_id: Optional[str] = None, spotify_client_secret: Optional[str] = None, session: Optional[aiohttp.client.ClientSession] = None) pomice.pool.Node
    -

    Creates a Node object to be then added into the node pool. -For Spotify searching capabilites, pass in valid Spotify API credentials.

    -
    - -
    -
    -classmethod get_best_node(*, algorithm: pomice.enums.NodeAlgorithm, voice_region: Optional[discord.enums.VoiceRegion] = None) pomice.pool.Node
    -

    Fetches the best node based on an NodeAlgorithm. -This option is preferred if you want to choose the best node -from a multi-node setup using either the node’s latency -or the node’s voice region.

    -

    Use NodeAlgorithm.by_ping if you want to get the best node -based on the node’s latency.

    -

    Use NodeAlgorithm.by_region if you want to get the best node -based on the node’s voice region. This method will only work -if you set a voice region when you create a node.

    -

    Use NodeAlgorithm.by_players if you want to get the best node -based on how players it has. This method will return a node with -the least amount of players

    -
    - -
    -
    -classmethod get_node(*, identifier: Optional[str] = None) pomice.pool.Node
    -

    Fetches a node from the node pool using it’s identifier. -If no identifier is provided, it will choose a node at random.

    -
    - -
    -
    -property node_count
    -
    - -
    -
    -property nodes: Dict[str, pomice.pool.Node]
    -

    Property which returns a dict with the node identifier and the Node object.

    -
    - -
    - -
    -
    -

    Utils

    -
    -
    -class pomice.utils.ExponentialBackoff(base: int = 1, *, integral: bool = False)
    -

    Bases: object

    -

    The MIT License (MIT) -Copyright (c) 2015-present Rapptz -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the “Software”), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE.

    -
    -
    -delay() float
    -
    - -
    - -
    -
    -class pomice.utils.NodeStats(data: dict)
    -

    Bases: object

    -

    The base class for the node stats object. -Gives critical information on the node, which is updated every minute.

    -
    - -
    -
    - - -
    -
    - -
    -
    -
    -
    - - - - \ No newline at end of file diff --git a/docs/_build/html/pomice.spotify.html b/docs/_build/html/pomice.spotify.html deleted file mode 100644 index 1ab5a9a..0000000 --- a/docs/_build/html/pomice.spotify.html +++ /dev/null @@ -1,185 +0,0 @@ - - - - - - - Spotify — Pomice 1.1.1 documentation - - - - - - - - - - - - - - - -
    - - -
    - -
    -
    -
    - -
    -
    -
    -
    - -
    -

    Spotify

    -
    -

    spotify.Album

    -
    -
    -class pomice.spotify.album.Album(data: dict)
    -

    Bases: object

    -

    The base class for a Spotify album

    -
    - -
    -
    -

    spotify.Client

    -
    -
    -class pomice.spotify.client.Client(client_id: str, client_secret: str)
    -

    Bases: object

    -

    The base client for the Spotify module of Pomice. -This class will do all the heavy lifting of getting all the metadata -for any Spotify URL you throw at it.

    -
    -
    -async search(*, query: str)
    -
    - -
    - -
    -
    -

    spotify.Exceptions

    -
    -
    -exception pomice.spotify.exceptions.InvalidSpotifyURL
    -

    Bases: Exception

    -

    An invalid Spotify URL was passed

    -
    - -
    -
    -exception pomice.spotify.exceptions.SpotifyRequestException
    -

    Bases: Exception

    -

    An error occurred when making a request to the Spotify API

    -
    - -
    -
    -

    spotify.Playlist

    -
    -
    -class pomice.spotify.playlist.Playlist(data: dict, tracks: List[pomice.spotify.track.Track])
    -

    Bases: object

    -

    The base class for a Spotify playlist

    -
    - -
    -
    -

    spotify.Track

    -
    -
    -class pomice.spotify.track.Track(data: dict, image=None)
    -

    Bases: object

    -

    The base class for a Spotify Track

    -
    - -
    -
    - - -
    -
    - -
    -
    -
    -
    - - - - \ No newline at end of file diff --git a/docs/_build/html/py-modindex.html b/docs/_build/html/py-modindex.html deleted file mode 100644 index a798496..0000000 --- a/docs/_build/html/py-modindex.html +++ /dev/null @@ -1,179 +0,0 @@ - - - - - - Python Module Index — Pomice 1.1.1 documentation - - - - - - - - - - - - - - - - - -
    - - -
    - -
    -
    -
    -
      -
    • »
    • -
    • Python Module Index
    • -
    • -
    • -
    -
    -
    -
    -
    - - -

    Python Module Index

    - -
    - p -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
     
    - p
    - pomice -
        - pomice.enums -
        - pomice.events -
        - pomice.exceptions -
        - pomice.filters -
        - pomice.objects -
        - pomice.player -
        - pomice.pool -
        - pomice.spotify.album -
        - pomice.spotify.client -
        - pomice.spotify.exceptions -
        - pomice.spotify.playlist -
        - pomice.spotify.track -
        - pomice.utils -
    - - -
    -
    - -
    -
    -
    -
    - - - - \ No newline at end of file diff --git a/docs/_build/html/search.html b/docs/_build/html/search.html deleted file mode 100644 index 99302e1..0000000 --- a/docs/_build/html/search.html +++ /dev/null @@ -1,114 +0,0 @@ - - - - - - Search — Pomice 1.1.1 documentation - - - - - - - - - - - - - - - - - -
    - - -
    - -
    -
    -
    -
      -
    • »
    • -
    • Search
    • -
    • -
    • -
    -
    -
    -
    -
    - - - - -
    - -
    - -
    -
    - -
    -
    -
    -
    - - - - - - - - - \ No newline at end of file diff --git a/docs/_build/html/searchindex.js b/docs/_build/html/searchindex.js deleted file mode 100644 index 2acf37a..0000000 --- a/docs/_build/html/searchindex.js +++ /dev/null @@ -1 +0,0 @@ -Search.setIndex({docnames:["index","modules","pomice","pomice.spotify"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":4,"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:["index.rst","modules.rst","pomice.rst","pomice.spotify.rst"],objects:{"pomice.enums":[[2,1,1,"","NodeAlgorithm"],[2,1,1,"","SearchType"]],"pomice.enums.NodeAlgorithm":[[2,2,1,"","by_ping"],[2,2,1,"","by_players"],[2,2,1,"","by_region"]],"pomice.enums.SearchType":[[2,2,1,"","scsearch"],[2,2,1,"","ytmsearch"],[2,2,1,"","ytsearch"]],"pomice.events":[[2,1,1,"","PomiceEvent"],[2,1,1,"","TrackEndEvent"],[2,1,1,"","TrackExceptionEvent"],[2,1,1,"","TrackStartEvent"],[2,1,1,"","TrackStuckEvent"],[2,1,1,"","WebSocketClosedEvent"],[2,1,1,"","WebSocketClosedPayload"],[2,1,1,"","WebSocketOpenEvent"]],"pomice.events.PomiceEvent":[[2,3,1,"","dispatch"],[2,2,1,"","handler_args"],[2,2,1,"","name"]],"pomice.events.TrackEndEvent":[[2,2,1,"","name"]],"pomice.events.TrackExceptionEvent":[[2,2,1,"","name"]],"pomice.events.TrackStartEvent":[[2,2,1,"","name"]],"pomice.events.TrackStuckEvent":[[2,2,1,"","name"]],"pomice.events.WebSocketClosedEvent":[[2,2,1,"","name"]],"pomice.events.WebSocketOpenEvent":[[2,2,1,"","name"]],"pomice.exceptions":[[2,4,1,"","FilterInvalidArgument"],[2,4,1,"","InvalidSpotifyClientAuthorization"],[2,4,1,"","NoNodesAvailable"],[2,4,1,"","NodeConnectionClosed"],[2,4,1,"","NodeConnectionFailure"],[2,4,1,"","NodeCreationError"],[2,4,1,"","NodeException"],[2,4,1,"","NodeNotAvailable"],[2,4,1,"","PomiceException"],[2,4,1,"","SpotifyAlbumLoadFailed"],[2,4,1,"","SpotifyPlaylistLoadFailed"],[2,4,1,"","SpotifyTrackLoadFailed"],[2,4,1,"","TrackInvalidPosition"],[2,4,1,"","TrackLoadError"]],"pomice.filters":[[2,1,1,"","ChannelMix"],[2,1,1,"","Distortion"],[2,1,1,"","Equalizer"],[2,1,1,"","Filter"],[2,1,1,"","Karaoke"],[2,1,1,"","LowPass"],[2,1,1,"","Rotation"],[2,1,1,"","Timescale"],[2,1,1,"","Tremolo"],[2,1,1,"","Vibrato"]],"pomice.objects":[[2,1,1,"","Playlist"],[2,1,1,"","Track"]],"pomice.objects.Playlist":[[2,5,1,"","thumbnail"],[2,5,1,"","uri"]],"pomice.player":[[2,1,1,"","Player"]],"pomice.player.Player":[[2,5,1,"","bot"],[2,3,1,"","connect"],[2,5,1,"","current"],[2,3,1,"","destroy"],[2,3,1,"","disconnect"],[2,5,1,"","filter"],[2,3,1,"","get_tracks"],[2,5,1,"","guild"],[2,5,1,"","is_connected"],[2,5,1,"","is_dead"],[2,5,1,"","is_paused"],[2,5,1,"","is_playing"],[2,5,1,"","node"],[2,3,1,"","on_voice_server_update"],[2,3,1,"","on_voice_state_update"],[2,3,1,"","play"],[2,5,1,"","position"],[2,3,1,"","reset_filter"],[2,3,1,"","seek"],[2,3,1,"","set_filter"],[2,3,1,"","set_pause"],[2,3,1,"","set_volume"],[2,3,1,"","stop"],[2,5,1,"","volume"]],"pomice.pool":[[2,1,1,"","Node"],[2,1,1,"","NodePool"]],"pomice.pool.Node":[[2,5,1,"","bot"],[2,3,1,"","build_track"],[2,3,1,"","connect"],[2,3,1,"","disconnect"],[2,3,1,"","get_player"],[2,3,1,"","get_tracks"],[2,5,1,"","is_connected"],[2,5,1,"","latency"],[2,5,1,"","player_count"],[2,5,1,"","players"],[2,5,1,"","pool"],[2,5,1,"","region"],[2,3,1,"","send"],[2,5,1,"","stats"]],"pomice.pool.NodePool":[[2,3,1,"","create_node"],[2,3,1,"","get_best_node"],[2,3,1,"","get_node"],[2,5,1,"","node_count"],[2,5,1,"","nodes"]],"pomice.spotify":[[3,0,0,"-","album"],[3,0,0,"-","client"],[3,0,0,"-","exceptions"],[3,0,0,"-","playlist"],[3,0,0,"-","track"]],"pomice.spotify.album":[[3,1,1,"","Album"]],"pomice.spotify.client":[[3,1,1,"","Client"]],"pomice.spotify.client.Client":[[3,3,1,"","search"]],"pomice.spotify.exceptions":[[3,4,1,"","InvalidSpotifyURL"],[3,4,1,"","SpotifyRequestException"]],"pomice.spotify.playlist":[[3,1,1,"","Playlist"]],"pomice.spotify.track":[[3,1,1,"","Track"]],"pomice.utils":[[2,1,1,"","ExponentialBackoff"],[2,1,1,"","NodeStats"]],"pomice.utils.ExponentialBackoff":[[2,3,1,"","delay"]],pomice:[[2,0,0,"-","enums"],[2,0,0,"-","events"],[2,0,0,"-","exceptions"],[2,0,0,"-","filters"],[2,0,0,"-","objects"],[2,0,0,"-","player"],[2,0,0,"-","pool"],[2,0,0,"-","utils"]]},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","attribute","Python attribute"],"3":["py","method","Python method"],"4":["py","exception","Python exception"],"5":["py","property","Python property"]},objtypes:{"0":"py:module","1":"py:class","2":"py:attribute","3":"py:method","4":"py:exception","5":"py:property"},terms:{"0":[0,2],"1":[0,2],"100":2,"127":0,"15":2,"2":2,"20":2,"2015":2,"220":2,"3":2,"30":2,"3030":0,"5":2,"500":2,"abstract":2,"class":[0,2,3],"default":2,"do":[2,3],"enum":[0,1],"float":2,"import":0,"int":2,"return":2,"super":0,"throw":3,"while":[0,2],A:2,AND:2,AS:2,BE:2,BUT:2,FOR:2,For:2,IN:2,IS:2,If:[0,2],In:[0,2],NO:2,NOT:2,No:[0,2],OF:2,OR:2,THE:2,TO:2,The:[0,2,3],There:2,To:2,WITH:2,_:2,__init__:[0,2],abov:2,accept:2,accordingli:2,action:2,activ:[0,2],activitytyp:0,actual:2,ad:2,add:2,add_cog:0,adjust:2,after:2,aiohttp:2,album:[0,1,2],algorithm:2,alias:0,all:[2,3],allow:2,along:2,also:[0,2],altern:2,amount:2,an:[2,3],ani:[2,3],apart:2,api:[2,3],appli:2,ar:2,arg:2,argument:[0,2],aris:2,around:2,associ:2,async:[0,2,3],audio:[0,2],author:[0,2],avail:2,await:[0,2],band:2,base:[2,3],bass:2,been:2,being:[0,2],below:0,best:2,bool:2,boost:2,bot:[0,2],build:2,build_track:2,butteri:0,by_p:2,by_play:2,by_region:2,c:2,call:2,can:[0,2],cannot:2,capabilit:2,caus:2,certain:2,chang:2,change_voice_st:2,channel:[0,2],channelmix:2,charg:2,checkfailur:0,choos:2,chosen:2,cl:[0,2],claim:2,classmethod:2,cleanup:2,client:[0,1,2],client_id:3,client_secret:3,clientsess:2,close:2,code:2,cog:0,command:[0,2],command_prefix:0,commanderror:0,compil:0,condit:2,connect:[0,2],consid:2,constructor:2,contain:2,context:[0,2],contract:2,conveni:0,cool:2,copi:2,copyright:2,coro:2,correctli:2,correspond:2,cos_offset:2,cos_scal:2,creat:2,create_nod:[0,2],credenti:2,critic:2,ctx:[0,2],current:2,customiz:0,damag:2,data:[2,3],dead:2,deal:2,def:[0,2],delai:2,deliveri:0,depth:2,design:0,destroi:2,dict:[2,3],differ:2,differenti:2,directli:0,disconnect:2,discord:[0,2],dispatch:2,distort:2,distribut:2,document:2,done:2,down:2,download:0,dynam:2,e:2,easi:0,easier:2,effect:2,either:2,els:0,emphas:2,enabl:2,end:2,equal:2,error:[2,3],esqu:2,event:[0,1],everi:2,everyth:0,exampl:0,except:[0,1],exclus:2,expect:2,exponentialbackoff:2,express:2,ext:[0,2],f:0,fail:2,fals:2,featur:2,fetch:2,file:2,filter:[0,1],filter_band:2,filter_width:2,filterinvalidargu:2,fire:2,fit:2,flow:2,follow:2,forc:2,format:2,found:0,free:2,frequenc:2,from:[0,2],furnish:2,further:2,gener:2,get:[0,2,3],get_best_nod:2,get_nod:2,get_play:2,get_track:[0,2],getattr:0,give:2,grant:2,guild:2,guild_id:2,ha:2,handl:2,handler_arg:2,have:2,head:2,heartbeat:2,heavi:3,here:0,herebi:2,higher:2,hold:2,holder:2,host:[0,2],how:[0,2],http:0,i:[0,2],id:2,identifi:[0,2],ignore_if_plai:2,imag:3,implement:2,impli:2,includ:2,info:2,inform:2,initi:2,instal:2,instanc:2,instrument:2,integ:2,integr:2,interfac:0,intern:2,invalid:[2,3],invalidspotifyclientauthor:2,invalidspotifyurl:3,invok:0,is_connect:2,is_dead:2,is_paus:2,is_plai:2,isinst:0,its:2,join:0,karaok:2,kind:2,latenc:2,latest:2,lavalink:[0,2],least:2,leav:2,left_to_left:2,left_to_right:2,level:2,liabil:2,liabl:2,librari:[0,2],licens:2,lift:3,like:2,limit:2,link:2,list:[2,3],listen:[0,2],load:2,look:0,lower:2,lowest:2,lowpass:2,m:0,made:0,main:0,make:[2,3],mani:2,manual:2,merchant:2,merg:2,metadata:3,method:2,millisecond:2,minut:2,mit:2,modern:0,modifi:2,modul:3,mono_level:2,multi:2,music:[0,2],must:[0,2],mybot:0,name:[0,2],necessari:2,need:2,nice:2,node:[0,2],node_count:2,nodealgorithm:2,nodeconnectionclos:2,nodeconnectionfailur:2,nodecreationerror:2,nodeexcept:2,nodenotavail:2,nodepool:[0,2],nodestat:2,none:[0,2,3],noninfring:2,nonodesavail:2,notic:2,object:[0,1,3],obtain:2,occur:[2,3],offset:2,on_pomice_track_start:2,on_readi:0,on_voice_server_upd:2,on_voice_state_upd:2,one:2,onli:2,onlin:0,option:2,order:[0,2],other:2,otherwis:2,out:[0,2],pan:2,paramet:2,pars:2,particular:2,pass:[2,3],password:[0,2],paus:2,payload:2,permiss:2,permit:2,person:2,pitch:2,plai:[0,2],player:[0,1],player_count:2,playlist:[0,1,2],playlist_info:2,pleas:0,point:2,pomic:[1,3],pomiceev:2,pomiceexcept:2,pool:[0,1],port:[0,2],portion:2,posit:2,preciou:0,prefer:2,present:2,print:0,problem:2,produc:2,proper:2,properti:2,provid:[0,2],publish:2,purpos:2,py:[0,2],queri:[0,2,3],r:0,rais:0,random:2,rapidli:2,rapptz:2,rate:2,rather:2,raw:2,re:0,readi:0,reason:2,recommend:2,reconnect:2,region:2,regular:2,remov:2,repres:2,request:[2,3],reset:2,reset_filt:2,resourc:0,respons:2,rest:2,restrict:2,result:[0,2],right:2,right_to_left:2,right_to_right:2,rotat:2,rotation_hertz:2,run:[0,2],s:2,said:2,scale:2,scenario:2,scsearch:2,search:[0,2,3],search_typ:2,searchtyp:2,secret:2,secur:2,seek:2,self:[0,2],sell:2,send:[0,2],server:2,session:2,set:2,set_filt:2,set_paus:2,set_volum:2,setup:2,shall:2,similar:2,sin_offset:2,sin_scal:2,sinc:2,slow:2,smooth:[0,2],so:2,softwar:2,some:2,song:2,sound:2,soundcloud:2,specifi:[0,2],speed:2,spotifi:[0,1,2],spotify_client_id:2,spotify_client_secret:2,spotify_playlist:2,spotify_track:2,spotifyalbumloadfail:2,spotifyplaylistloadfail:2,spotifyrequestexcept:3,spotifytrackloadfail:2,ssrc:2,start:2,start_nod:0,stat:2,state:2,stereo:2,stop:2,store:2,str:[0,2,3],stuck:2,subject:2,sublicens:2,substanti:2,successfulli:2,support:2,supress:2,system:0,take:2,tan_offset:2,tan_scal:2,target:2,term:0,textchannel:0,than:2,thi:[0,2,3],thumbnail:2,time:2,timeout:2,timescal:2,token:0,tone:2,tort:2,track:[0,1,2],track_end:2,track_except:2,track_id:2,track_start:2,track_stuck:2,trackendev:2,trackexceptionev:2,trackinvalidposit:2,trackloaderror:2,trackstartev:2,trackstuckev:2,tremolo:2,tupl:2,two:2,type:[0,2],unabl:2,unavail:2,under:2,unspecifi:2,updat:2,uri:2,url:[2,3],url_reg:0,us:[0,2],user:[0,2],util:[0,1],valid:2,valu:2,vaporwav:2,veri:2,version:2,vibrato:2,vocal:2,voic:[0,2],voice_cli:[0,2],voice_region:2,voice_server_upd:2,voice_state_upd:2,voicechannel:2,voiceprotocol:2,voiceregion:2,volum:2,wa:[2,3],wai:[0,2],want:[0,2],warranti:2,wast:0,waver:2,websocket:2,websocket_clos:2,websocket_open:2,websocketclosedev:2,websocketclosedpayload:2,websocketopenev:2,were:0,when:[2,3],where:2,whether:2,which:[0,2],whom:2,within:2,without:[0,2],work:[0,2],would:2,wrapper:0,www:0,you:[2,3],your:[0,2],youshallnotpass:0,youtub:2,ytmsearch:2,ytsearch:2},titles:["Welcome to Pomice!","<no title>","Pomice","Spotify"],titleterms:{"enum":2,album:3,befor:0,client:3,content:0,event:2,except:[2,3],filter:2,jumpstart:0,object:2,player:2,playlist:3,pomic:[0,2],pool:2,quick:0,spotifi:3,start:0,track:3,util:2,welcom:0,you:0}}) \ No newline at end of file