diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000000..a04587262d --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,216 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +BUILDDIR = _build + +# User-friendly check for sphinx-build +ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) +$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/) +endif + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . +# the i18n builder cannot share the environment and doctrees with the others +I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . + +.PHONY: help +help: + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " singlehtml to make a single large HTML file" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " applehelp to make an Apple Help Book" + @echo " devhelp to make HTML files and a Devhelp project" + @echo " epub to make an epub" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " texinfo to make Texinfo files" + @echo " info to make Texinfo files and run them through makeinfo" + @echo " gettext to make PO message catalogs" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " xml to make Docutils-native XML files" + @echo " pseudoxml to make pseudoxml-XML files for display purposes" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + @echo " coverage to run coverage check of the documentation (if enabled)" + +.PHONY: clean +clean: + rm -rf $(BUILDDIR)/* + +.PHONY: html +html: + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +.PHONY: dirhtml +dirhtml: + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +.PHONY: singlehtml +singlehtml: + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +.PHONY: pickle +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +.PHONY: json +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +.PHONY: htmlhelp +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +.PHONY: qthelp +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Remix.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Remix.qhc" + +.PHONY: applehelp +applehelp: + $(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp + @echo + @echo "Build finished. The help book is in $(BUILDDIR)/applehelp." + @echo "N.B. You won't be able to view it unless you put it in" \ + "~/Library/Documentation/Help or install it in your application" \ + "bundle." + +.PHONY: devhelp +devhelp: + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." + @echo "To view the help file:" + @echo "# mkdir -p $$HOME/.local/share/devhelp/Remix" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Remix" + @echo "# devhelp" + +.PHONY: epub +epub: + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub + @echo + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +.PHONY: latex +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make latexpdf' here to do that automatically)." + +.PHONY: latexpdf +latexpdf: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through pdflatex..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +.PHONY: latexpdfja +latexpdfja: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through platex and dvipdfmx..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +.PHONY: text +text: + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/text." + +.PHONY: man +man: + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +.PHONY: texinfo +texinfo: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo + @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." + @echo "Run \`make' in that directory to run these through makeinfo" \ + "(use \`make info' here to do that automatically)." + +.PHONY: info +info: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo "Running Texinfo files through makeinfo..." + make -C $(BUILDDIR)/texinfo info + @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." + +.PHONY: gettext +gettext: + $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale + @echo + @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." + +.PHONY: changes +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +.PHONY: linkcheck +linkcheck: + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +.PHONY: doctest +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." + +.PHONY: coverage +coverage: + $(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage + @echo "Testing of coverage in the sources finished, look at the " \ + "results in $(BUILDDIR)/coverage/python.txt." + +.PHONY: xml +xml: + $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml + @echo + @echo "Build finished. The XML files are in $(BUILDDIR)/xml." + +.PHONY: pseudoxml +pseudoxml: + $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml + @echo + @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." diff --git a/docs/_build/doctrees/analysis.doctree b/docs/_build/doctrees/analysis.doctree new file mode 100644 index 0000000000..034c1aba22 Binary files /dev/null and b/docs/_build/doctrees/analysis.doctree differ diff --git a/docs/_build/doctrees/analysis_tab.doctree b/docs/_build/doctrees/analysis_tab.doctree new file mode 100644 index 0000000000..960903147a Binary files /dev/null and b/docs/_build/doctrees/analysis_tab.doctree differ diff --git a/docs/_build/doctrees/code_contribution_guide.doctree b/docs/_build/doctrees/code_contribution_guide.doctree new file mode 100644 index 0000000000..4270e42515 Binary files /dev/null and b/docs/_build/doctrees/code_contribution_guide.doctree differ diff --git a/docs/_build/doctrees/community.doctree b/docs/_build/doctrees/community.doctree new file mode 100644 index 0000000000..c98de288b3 Binary files /dev/null and b/docs/_build/doctrees/community.doctree differ diff --git a/docs/_build/doctrees/compile.doctree b/docs/_build/doctrees/compile.doctree new file mode 100644 index 0000000000..cde3acaef5 Binary files /dev/null and b/docs/_build/doctrees/compile.doctree differ diff --git a/docs/_build/doctrees/compile_tab.doctree b/docs/_build/doctrees/compile_tab.doctree new file mode 100644 index 0000000000..0d847c435f Binary files /dev/null and b/docs/_build/doctrees/compile_tab.doctree differ diff --git a/docs/_build/doctrees/contract_metadata.doctree b/docs/_build/doctrees/contract_metadata.doctree new file mode 100644 index 0000000000..8d263edc5b Binary files /dev/null and b/docs/_build/doctrees/contract_metadata.doctree differ diff --git a/docs/_build/doctrees/create_deploy.doctree b/docs/_build/doctrees/create_deploy.doctree new file mode 100644 index 0000000000..56380ab0e0 Binary files /dev/null and b/docs/_build/doctrees/create_deploy.doctree differ diff --git a/docs/_build/doctrees/debugger.doctree b/docs/_build/doctrees/debugger.doctree new file mode 100644 index 0000000000..6f52728b35 Binary files /dev/null and b/docs/_build/doctrees/debugger.doctree differ diff --git a/docs/_build/doctrees/debugger_tab.doctree b/docs/_build/doctrees/debugger_tab.doctree new file mode 100644 index 0000000000..0902a7c232 Binary files /dev/null and b/docs/_build/doctrees/debugger_tab.doctree differ diff --git a/docs/_build/doctrees/environment.pickle b/docs/_build/doctrees/environment.pickle new file mode 100644 index 0000000000..74bbee8f87 Binary files /dev/null and b/docs/_build/doctrees/environment.pickle differ diff --git a/docs/_build/doctrees/faq.doctree b/docs/_build/doctrees/faq.doctree new file mode 100644 index 0000000000..fd6de3e866 Binary files /dev/null and b/docs/_build/doctrees/faq.doctree differ diff --git a/docs/_build/doctrees/file_explorer.doctree b/docs/_build/doctrees/file_explorer.doctree new file mode 100644 index 0000000000..4bf55898a5 Binary files /dev/null and b/docs/_build/doctrees/file_explorer.doctree differ diff --git a/docs/_build/doctrees/glossary.doctree b/docs/_build/doctrees/glossary.doctree new file mode 100644 index 0000000000..e7250b85d0 Binary files /dev/null and b/docs/_build/doctrees/glossary.doctree differ diff --git a/docs/_build/doctrees/homepage.doctree b/docs/_build/doctrees/homepage.doctree new file mode 100644 index 0000000000..9dc4d07dd2 Binary files /dev/null and b/docs/_build/doctrees/homepage.doctree differ diff --git a/docs/_build/doctrees/import.doctree b/docs/_build/doctrees/import.doctree new file mode 100644 index 0000000000..3db2ea31f1 Binary files /dev/null and b/docs/_build/doctrees/import.doctree differ diff --git a/docs/_build/doctrees/index.doctree b/docs/_build/doctrees/index.doctree new file mode 100644 index 0000000000..0a6ef9d778 Binary files /dev/null and b/docs/_build/doctrees/index.doctree differ diff --git a/docs/_build/doctrees/javascript_vm.doctree b/docs/_build/doctrees/javascript_vm.doctree new file mode 100644 index 0000000000..b0b15842ea Binary files /dev/null and b/docs/_build/doctrees/javascript_vm.doctree differ diff --git a/docs/_build/doctrees/layout.doctree b/docs/_build/doctrees/layout.doctree new file mode 100644 index 0000000000..805dc1f9b5 Binary files /dev/null and b/docs/_build/doctrees/layout.doctree differ diff --git a/docs/_build/doctrees/locations.doctree b/docs/_build/doctrees/locations.doctree new file mode 100644 index 0000000000..9733ef5067 Binary files /dev/null and b/docs/_build/doctrees/locations.doctree differ diff --git a/docs/_build/doctrees/locationss.doctree b/docs/_build/doctrees/locationss.doctree new file mode 100644 index 0000000000..5d0fbae720 Binary files /dev/null and b/docs/_build/doctrees/locationss.doctree differ diff --git a/docs/_build/doctrees/packages.doctree b/docs/_build/doctrees/packages.doctree new file mode 100644 index 0000000000..2ae05dc167 Binary files /dev/null and b/docs/_build/doctrees/packages.doctree differ diff --git a/docs/_build/doctrees/plugin-manager.doctree b/docs/_build/doctrees/plugin-manager.doctree new file mode 100644 index 0000000000..0d9ef904a9 Binary files /dev/null and b/docs/_build/doctrees/plugin-manager.doctree differ diff --git a/docs/_build/doctrees/plugin_manager.doctree b/docs/_build/doctrees/plugin_manager.doctree new file mode 100644 index 0000000000..7aaad144dc Binary files /dev/null and b/docs/_build/doctrees/plugin_manager.doctree differ diff --git a/docs/_build/doctrees/quickstart_javascript_vm.doctree b/docs/_build/doctrees/quickstart_javascript_vm.doctree new file mode 100644 index 0000000000..cd048d5a55 Binary files /dev/null and b/docs/_build/doctrees/quickstart_javascript_vm.doctree differ diff --git a/docs/_build/doctrees/remix-tutorials-github.doctree b/docs/_build/doctrees/remix-tutorials-github.doctree new file mode 100644 index 0000000000..7d18fb328c Binary files /dev/null and b/docs/_build/doctrees/remix-tutorials-github.doctree differ diff --git a/docs/_build/doctrees/remix_plugin.doctree b/docs/_build/doctrees/remix_plugin.doctree new file mode 100644 index 0000000000..1d3f381959 Binary files /dev/null and b/docs/_build/doctrees/remix_plugin.doctree differ diff --git a/docs/_build/doctrees/remix_plugin_api.doctree b/docs/_build/doctrees/remix_plugin_api.doctree new file mode 100644 index 0000000000..a6d86148a9 Binary files /dev/null and b/docs/_build/doctrees/remix_plugin_api.doctree differ diff --git a/docs/_build/doctrees/remix_plugin_old.doctree b/docs/_build/doctrees/remix_plugin_old.doctree new file mode 100644 index 0000000000..3dac0d16bc Binary files /dev/null and b/docs/_build/doctrees/remix_plugin_old.doctree differ diff --git a/docs/_build/doctrees/remix_tutorials_github.doctree b/docs/_build/doctrees/remix_tutorials_github.doctree new file mode 100644 index 0000000000..0ce1218a0e Binary files /dev/null and b/docs/_build/doctrees/remix_tutorials_github.doctree differ diff --git a/docs/_build/doctrees/remixd.doctree b/docs/_build/doctrees/remixd.doctree new file mode 100644 index 0000000000..283aa1d4f5 Binary files /dev/null and b/docs/_build/doctrees/remixd.doctree differ diff --git a/docs/_build/doctrees/run.doctree b/docs/_build/doctrees/run.doctree new file mode 100644 index 0000000000..3a4a5b3d82 Binary files /dev/null and b/docs/_build/doctrees/run.doctree differ diff --git a/docs/_build/doctrees/run_tab.doctree b/docs/_build/doctrees/run_tab.doctree new file mode 100644 index 0000000000..8b0337eb6b Binary files /dev/null and b/docs/_build/doctrees/run_tab.doctree differ diff --git a/docs/_build/doctrees/settings.doctree b/docs/_build/doctrees/settings.doctree new file mode 100644 index 0000000000..ad5b9e778c Binary files /dev/null and b/docs/_build/doctrees/settings.doctree differ diff --git a/docs/_build/doctrees/settings_tab.doctree b/docs/_build/doctrees/settings_tab.doctree new file mode 100644 index 0000000000..959f033424 Binary files /dev/null and b/docs/_build/doctrees/settings_tab.doctree differ diff --git a/docs/_build/doctrees/solidity_editor.doctree b/docs/_build/doctrees/solidity_editor.doctree new file mode 100644 index 0000000000..a75454b3d2 Binary files /dev/null and b/docs/_build/doctrees/solidity_editor.doctree differ diff --git a/docs/_build/doctrees/static_analysis.doctree b/docs/_build/doctrees/static_analysis.doctree new file mode 100644 index 0000000000..952fc876c3 Binary files /dev/null and b/docs/_build/doctrees/static_analysis.doctree differ diff --git a/docs/_build/doctrees/support.doctree b/docs/_build/doctrees/support.doctree new file mode 100644 index 0000000000..4d63918dcb Binary files /dev/null and b/docs/_build/doctrees/support.doctree differ diff --git a/docs/_build/doctrees/support_tab.doctree b/docs/_build/doctrees/support_tab.doctree new file mode 100644 index 0000000000..e7c7c3d66f Binary files /dev/null and b/docs/_build/doctrees/support_tab.doctree differ diff --git a/docs/_build/doctrees/terminal.doctree b/docs/_build/doctrees/terminal.doctree new file mode 100644 index 0000000000..cfdb6c43c6 Binary files /dev/null and b/docs/_build/doctrees/terminal.doctree differ diff --git a/docs/_build/doctrees/tutorial_debug.doctree b/docs/_build/doctrees/tutorial_debug.doctree new file mode 100644 index 0000000000..33c4707043 Binary files /dev/null and b/docs/_build/doctrees/tutorial_debug.doctree differ diff --git a/docs/_build/doctrees/tutorial_eattheblock.doctree b/docs/_build/doctrees/tutorial_eattheblock.doctree new file mode 100644 index 0000000000..814a1637d9 Binary files /dev/null and b/docs/_build/doctrees/tutorial_eattheblock.doctree differ diff --git a/docs/_build/doctrees/tutorial_geth-remix.doctree b/docs/_build/doctrees/tutorial_geth-remix.doctree new file mode 100644 index 0000000000..0fd79463c0 Binary files /dev/null and b/docs/_build/doctrees/tutorial_geth-remix.doctree differ diff --git a/docs/_build/doctrees/tutorial_import.doctree b/docs/_build/doctrees/tutorial_import.doctree new file mode 100644 index 0000000000..ea3cb9d22b Binary files /dev/null and b/docs/_build/doctrees/tutorial_import.doctree differ diff --git a/docs/_build/doctrees/tutorial_mist.doctree b/docs/_build/doctrees/tutorial_mist.doctree new file mode 100644 index 0000000000..bb61176629 Binary files /dev/null and b/docs/_build/doctrees/tutorial_mist.doctree differ diff --git a/docs/_build/doctrees/tutorial_remixd_filesystem.doctree b/docs/_build/doctrees/tutorial_remixd_filesystem.doctree new file mode 100644 index 0000000000..07bf738bfb Binary files /dev/null and b/docs/_build/doctrees/tutorial_remixd_filesystem.doctree differ diff --git a/docs/_build/doctrees/udapp.doctree b/docs/_build/doctrees/udapp.doctree new file mode 100644 index 0000000000..7199958b04 Binary files /dev/null and b/docs/_build/doctrees/udapp.doctree differ diff --git a/docs/_build/doctrees/unittesting.doctree b/docs/_build/doctrees/unittesting.doctree new file mode 100644 index 0000000000..957b1a024e Binary files /dev/null and b/docs/_build/doctrees/unittesting.doctree differ diff --git a/docs/_build/doctrees/unittesting_tab.doctree b/docs/_build/doctrees/unittesting_tab.doctree new file mode 100644 index 0000000000..05f4c2acdf Binary files /dev/null and b/docs/_build/doctrees/unittesting_tab.doctree differ diff --git a/docs/_build/doctrees/workshop_Building_smart_contracts_with_Remix.doctree b/docs/_build/doctrees/workshop_Building_smart_contracts_with_Remix.doctree new file mode 100644 index 0000000000..cdc3feb4eb Binary files /dev/null and b/docs/_build/doctrees/workshop_Building_smart_contracts_with_Remix.doctree differ diff --git a/docs/_build/html/.buildinfo b/docs/_build/html/.buildinfo new file mode 100644 index 0000000000..e1b8a56c73 --- /dev/null +++ b/docs/_build/html/.buildinfo @@ -0,0 +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: de6eaf603c35d106b865878e14270948 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/_build/html/_images/a-Runtab-deploy-atAddress.png b/docs/_build/html/_images/a-Runtab-deploy-atAddress.png new file mode 100644 index 0000000000..89d3e77ef6 Binary files /dev/null and b/docs/_build/html/_images/a-Runtab-deploy-atAddress.png differ diff --git a/docs/_build/html/_images/a-analysis.png b/docs/_build/html/_images/a-analysis.png new file mode 100644 index 0000000000..0a171b6ba0 Binary files /dev/null and b/docs/_build/html/_images/a-analysis.png differ diff --git a/docs/_build/html/_images/a-contract-inputs.png b/docs/_build/html/_images/a-contract-inputs.png new file mode 100644 index 0000000000..abf2a1aeae Binary files /dev/null and b/docs/_build/html/_images/a-contract-inputs.png differ diff --git a/docs/_build/html/_images/a-debug1-deploy.png b/docs/_build/html/_images/a-debug1-deploy.png new file mode 100644 index 0000000000..f2dedaf456 Binary files /dev/null and b/docs/_build/html/_images/a-debug1-deploy.png differ diff --git a/docs/_build/html/_images/a-debug2-udapp1a.png b/docs/_build/html/_images/a-debug2-udapp1a.png new file mode 100644 index 0000000000..0b57f61709 Binary files /dev/null and b/docs/_build/html/_images/a-debug2-udapp1a.png differ diff --git a/docs/_build/html/_images/a-debug3-udapp2.png b/docs/_build/html/_images/a-debug3-udapp2.png new file mode 100644 index 0000000000..56ae6a0dc7 Binary files /dev/null and b/docs/_build/html/_images/a-debug3-udapp2.png differ diff --git a/docs/_build/html/_images/a-debug4-value-loc.png b/docs/_build/html/_images/a-debug4-value-loc.png new file mode 100644 index 0000000000..61cdcab9ac Binary files /dev/null and b/docs/_build/html/_images/a-debug4-value-loc.png differ diff --git a/docs/_build/html/_images/a-debug5-term-debug-but.png b/docs/_build/html/_images/a-debug5-term-debug-but.png new file mode 100644 index 0000000000..96bf3ca56e Binary files /dev/null and b/docs/_build/html/_images/a-debug5-term-debug-but.png differ diff --git a/docs/_build/html/_images/a-debugger.png b/docs/_build/html/_images/a-debugger.png new file mode 100644 index 0000000000..2756ab6c47 Binary files /dev/null and b/docs/_build/html/_images/a-debugger.png differ diff --git a/docs/_build/html/_images/a-file-explorer-buttons.png b/docs/_build/html/_images/a-file-explorer-buttons.png new file mode 100644 index 0000000000..9c6ee3f795 Binary files /dev/null and b/docs/_build/html/_images/a-file-explorer-buttons.png differ diff --git a/docs/_build/html/_images/a-file-explorer1.png b/docs/_build/html/_images/a-file-explorer1.png new file mode 100644 index 0000000000..fbc53896fc Binary files /dev/null and b/docs/_build/html/_images/a-file-explorer1.png differ diff --git a/docs/_build/html/_images/a-home-page.png b/docs/_build/html/_images/a-home-page.png new file mode 100644 index 0000000000..f4ca8b0537 Binary files /dev/null and b/docs/_build/html/_images/a-home-page.png differ diff --git a/docs/_build/html/_images/a-hometab.png b/docs/_build/html/_images/a-hometab.png new file mode 100644 index 0000000000..a48d9f61c0 Binary files /dev/null and b/docs/_build/html/_images/a-hometab.png differ diff --git a/docs/_build/html/_images/a-icons-at-load.png b/docs/_build/html/_images/a-icons-at-load.png new file mode 100644 index 0000000000..ce859729ed Binary files /dev/null and b/docs/_build/html/_images/a-icons-at-load.png differ diff --git a/docs/_build/html/_images/a-jvm-calling-instance.png b/docs/_build/html/_images/a-jvm-calling-instance.png new file mode 100644 index 0000000000..7dc9a7adf1 Binary files /dev/null and b/docs/_build/html/_images/a-jvm-calling-instance.png differ diff --git a/docs/_build/html/_images/a-jvm-instance.png b/docs/_build/html/_images/a-jvm-instance.png new file mode 100644 index 0000000000..5ed6615c9d Binary files /dev/null and b/docs/_build/html/_images/a-jvm-instance.png differ diff --git a/docs/_build/html/_images/a-jvm.png b/docs/_build/html/_images/a-jvm.png new file mode 100644 index 0000000000..851236b457 Binary files /dev/null and b/docs/_build/html/_images/a-jvm.png differ diff --git a/docs/_build/html/_images/a-layout1.png b/docs/_build/html/_images/a-layout1.png new file mode 100644 index 0000000000..bb8ebbeda0 Binary files /dev/null and b/docs/_build/html/_images/a-layout1.png differ diff --git a/docs/_build/html/_images/a-layout1a.png b/docs/_build/html/_images/a-layout1a.png new file mode 100644 index 0000000000..cee0ffe747 Binary files /dev/null and b/docs/_build/html/_images/a-layout1a.png differ diff --git a/docs/_build/html/_images/a-layout1b.png b/docs/_build/html/_images/a-layout1b.png new file mode 100644 index 0000000000..18e9aabc7c Binary files /dev/null and b/docs/_build/html/_images/a-layout1b.png differ diff --git a/docs/_build/html/_images/a-old-tuto_basicimport.png b/docs/_build/html/_images/a-old-tuto_basicimport.png new file mode 100644 index 0000000000..81a8009336 Binary files /dev/null and b/docs/_build/html/_images/a-old-tuto_basicimport.png differ diff --git a/docs/_build/html/_images/a-old-tuto_importgit.png b/docs/_build/html/_images/a-old-tuto_importgit.png new file mode 100644 index 0000000000..022eb4b011 Binary files /dev/null and b/docs/_build/html/_images/a-old-tuto_importgit.png differ diff --git a/docs/_build/html/_images/a-old-tuto_importswarm.png b/docs/_build/html/_images/a-old-tuto_importswarm.png new file mode 100644 index 0000000000..01fba3e646 Binary files /dev/null and b/docs/_build/html/_images/a-old-tuto_importswarm.png differ diff --git a/docs/_build/html/_images/a-plug.png b/docs/_build/html/_images/a-plug.png new file mode 100644 index 0000000000..3161fe3a78 Binary files /dev/null and b/docs/_build/html/_images/a-plug.png differ diff --git a/docs/_build/html/_images/a-plugin-man-local.png b/docs/_build/html/_images/a-plugin-man-local.png new file mode 100644 index 0000000000..b760bab001 Binary files /dev/null and b/docs/_build/html/_images/a-plugin-man-local.png differ diff --git a/docs/_build/html/_images/a-remixd-success.png b/docs/_build/html/_images/a-remixd-success.png new file mode 100644 index 0000000000..bef13de555 Binary files /dev/null and b/docs/_build/html/_images/a-remixd-success.png differ diff --git a/docs/_build/html/_images/a-runtab-recorder.png b/docs/_build/html/_images/a-runtab-recorder.png new file mode 100644 index 0000000000..36d6b0528b Binary files /dev/null and b/docs/_build/html/_images/a-runtab-recorder.png differ diff --git a/docs/_build/html/_images/a-runtab1.png b/docs/_build/html/_images/a-runtab1.png new file mode 100644 index 0000000000..138a93305f Binary files /dev/null and b/docs/_build/html/_images/a-runtab1.png differ diff --git a/docs/_build/html/_images/a-settings.png b/docs/_build/html/_images/a-settings.png new file mode 100644 index 0000000000..9bda647842 Binary files /dev/null and b/docs/_build/html/_images/a-settings.png differ diff --git a/docs/_build/html/_images/a-sol-compile.png b/docs/_build/html/_images/a-sol-compile.png new file mode 100644 index 0000000000..a3dc688a69 Binary files /dev/null and b/docs/_build/html/_images/a-sol-compile.png differ diff --git a/docs/_build/html/_images/a-sol-compiler.png b/docs/_build/html/_images/a-sol-compiler.png new file mode 100644 index 0000000000..87f90586e0 Binary files /dev/null and b/docs/_build/html/_images/a-sol-compiler.png differ diff --git a/docs/_build/html/_images/a-sol-editor.png b/docs/_build/html/_images/a-sol-editor.png new file mode 100644 index 0000000000..b6c0cd5c58 Binary files /dev/null and b/docs/_build/html/_images/a-sol-editor.png differ diff --git a/docs/_build/html/_images/a-solidity-editor.png b/docs/_build/html/_images/a-solidity-editor.png new file mode 100644 index 0000000000..250cb0f025 Binary files /dev/null and b/docs/_build/html/_images/a-solidity-editor.png differ diff --git a/docs/_build/html/_images/a-static-analysis.png b/docs/_build/html/_images/a-static-analysis.png new file mode 100644 index 0000000000..e3d2cfe46e Binary files /dev/null and b/docs/_build/html/_images/a-static-analysis.png differ diff --git a/docs/_build/html/_images/a-terminal-and-more.png b/docs/_build/html/_images/a-terminal-and-more.png new file mode 100644 index 0000000000..45d41644ca Binary files /dev/null and b/docs/_build/html/_images/a-terminal-and-more.png differ diff --git a/docs/_build/html/_images/a-themes.png b/docs/_build/html/_images/a-themes.png new file mode 100644 index 0000000000..bc48776de1 Binary files /dev/null and b/docs/_build/html/_images/a-themes.png differ diff --git a/docs/_build/html/_images/a-udapp-inputs.png b/docs/_build/html/_images/a-udapp-inputs.png new file mode 100644 index 0000000000..ec68350135 Binary files /dev/null and b/docs/_build/html/_images/a-udapp-inputs.png differ diff --git a/docs/_build/html/_images/a-udapp-multi-param-man.png b/docs/_build/html/_images/a-udapp-multi-param-man.png new file mode 100644 index 0000000000..afb7e4f3a8 Binary files /dev/null and b/docs/_build/html/_images/a-udapp-multi-param-man.png differ diff --git a/docs/_build/html/_images/a-unit-testing1.png b/docs/_build/html/_images/a-unit-testing1.png new file mode 100644 index 0000000000..5e1b167584 Binary files /dev/null and b/docs/_build/html/_images/a-unit-testing1.png differ diff --git a/docs/_build/html/_images/mist1.png b/docs/_build/html/_images/mist1.png new file mode 100644 index 0000000000..cd2991e2fd Binary files /dev/null and b/docs/_build/html/_images/mist1.png differ diff --git a/docs/_build/html/_images/remix1.png b/docs/_build/html/_images/remix1.png new file mode 100644 index 0000000000..7575d34f6c Binary files /dev/null and b/docs/_build/html/_images/remix1.png differ diff --git a/docs/_build/html/_images/remix2.png b/docs/_build/html/_images/remix2.png new file mode 100644 index 0000000000..17a53affd9 Binary files /dev/null and b/docs/_build/html/_images/remix2.png differ diff --git a/docs/_build/html/_images/remix3.png b/docs/_build/html/_images/remix3.png new file mode 100644 index 0000000000..060352a755 Binary files /dev/null and b/docs/_build/html/_images/remix3.png differ diff --git a/docs/_build/html/_images/remix4.png b/docs/_build/html/_images/remix4.png new file mode 100644 index 0000000000..404ed50572 Binary files /dev/null and b/docs/_build/html/_images/remix4.png differ diff --git a/docs/_build/html/_images/remix5.png b/docs/_build/html/_images/remix5.png new file mode 100644 index 0000000000..4297d58adc Binary files /dev/null and b/docs/_build/html/_images/remix5.png differ diff --git a/docs/_build/html/_images/remix_analysistab.png b/docs/_build/html/_images/remix_analysistab.png new file mode 100644 index 0000000000..e43143962c Binary files /dev/null and b/docs/_build/html/_images/remix_analysistab.png differ diff --git a/docs/_build/html/_images/remix_breakpoint.png b/docs/_build/html/_images/remix_breakpoint.png new file mode 100644 index 0000000000..c755f61348 Binary files /dev/null and b/docs/_build/html/_images/remix_breakpoint.png differ diff --git a/docs/_build/html/_images/remix_compiletab.png b/docs/_build/html/_images/remix_compiletab.png new file mode 100644 index 0000000000..cd51b11574 Binary files /dev/null and b/docs/_build/html/_images/remix_compiletab.png differ diff --git a/docs/_build/html/_images/remix_debuggertab.png b/docs/_build/html/_images/remix_debuggertab.png new file mode 100644 index 0000000000..104d9744b2 Binary files /dev/null and b/docs/_build/html/_images/remix_debuggertab.png differ diff --git a/docs/_build/html/_images/remix_debuginstructions.png b/docs/_build/html/_images/remix_debuginstructions.png new file mode 100644 index 0000000000..bb36decbaf Binary files /dev/null and b/docs/_build/html/_images/remix_debuginstructions.png differ diff --git a/docs/_build/html/_images/remix_debugtransactioninfo.png b/docs/_build/html/_images/remix_debugtransactioninfo.png new file mode 100644 index 0000000000..92d2e33100 Binary files /dev/null and b/docs/_build/html/_images/remix_debugtransactioninfo.png differ diff --git a/docs/_build/html/_images/remix_editor.png b/docs/_build/html/_images/remix_editor.png new file mode 100644 index 0000000000..9260f05fe4 Binary files /dev/null and b/docs/_build/html/_images/remix_editor.png differ diff --git a/docs/_build/html/_images/remix_executionexception.png b/docs/_build/html/_images/remix_executionexception.png new file mode 100644 index 0000000000..9f28396b8a Binary files /dev/null and b/docs/_build/html/_images/remix_executionexception.png differ diff --git a/docs/_build/html/_images/remix_file_explorer_browser.png b/docs/_build/html/_images/remix_file_explorer_browser.png new file mode 100644 index 0000000000..3f09c0c752 Binary files /dev/null and b/docs/_build/html/_images/remix_file_explorer_browser.png differ diff --git a/docs/_build/html/_images/remix_file_explorer_menu.png b/docs/_build/html/_images/remix_file_explorer_menu.png new file mode 100644 index 0000000000..2140e9b36c Binary files /dev/null and b/docs/_build/html/_images/remix_file_explorer_menu.png differ diff --git a/docs/_build/html/_images/remix_navigation.png b/docs/_build/html/_images/remix_navigation.png new file mode 100644 index 0000000000..d4187a462a Binary files /dev/null and b/docs/_build/html/_images/remix_navigation.png differ diff --git a/docs/_build/html/_images/remix_quickstart_javascriptvm_callinginstance.png b/docs/_build/html/_images/remix_quickstart_javascriptvm_callinginstance.png new file mode 100644 index 0000000000..fe11a2cb06 Binary files /dev/null and b/docs/_build/html/_images/remix_quickstart_javascriptvm_callinginstance.png differ diff --git a/docs/_build/html/_images/remix_quickstart_javascriptvm_creation.png b/docs/_build/html/_images/remix_quickstart_javascriptvm_creation.png new file mode 100644 index 0000000000..fc7598aea7 Binary files /dev/null and b/docs/_build/html/_images/remix_quickstart_javascriptvm_creation.png differ diff --git a/docs/_build/html/_images/remix_quickstart_javascriptvm_creationTransaction.png b/docs/_build/html/_images/remix_quickstart_javascriptvm_creationTransaction.png new file mode 100644 index 0000000000..0b27bc105f Binary files /dev/null and b/docs/_build/html/_images/remix_quickstart_javascriptvm_creationTransaction.png differ diff --git a/docs/_build/html/_images/remix_recorder.png b/docs/_build/html/_images/remix_recorder.png new file mode 100644 index 0000000000..1f7abc7363 Binary files /dev/null and b/docs/_build/html/_images/remix_recorder.png differ diff --git a/docs/_build/html/_images/remix_runtab.png b/docs/_build/html/_images/remix_runtab.png new file mode 100644 index 0000000000..c636298493 Binary files /dev/null and b/docs/_build/html/_images/remix_runtab.png differ diff --git a/docs/_build/html/_images/remix_runtab_example.png b/docs/_build/html/_images/remix_runtab_example.png new file mode 100644 index 0000000000..78fba7e994 Binary files /dev/null and b/docs/_build/html/_images/remix_runtab_example.png differ diff --git a/docs/_build/html/_images/remix_settingstab.png b/docs/_build/html/_images/remix_settingstab.png new file mode 100644 index 0000000000..bfd50332e1 Binary files /dev/null and b/docs/_build/html/_images/remix_settingstab.png differ diff --git a/docs/_build/html/_images/remix_soliditylocals.png b/docs/_build/html/_images/remix_soliditylocals.png new file mode 100644 index 0000000000..bfa627d1a4 Binary files /dev/null and b/docs/_build/html/_images/remix_soliditylocals.png differ diff --git a/docs/_build/html/_images/remix_soliditystate.png b/docs/_build/html/_images/remix_soliditystate.png new file mode 100644 index 0000000000..789df079e2 Binary files /dev/null and b/docs/_build/html/_images/remix_soliditystate.png differ diff --git a/docs/_build/html/_images/remix_startdebugging.png b/docs/_build/html/_images/remix_startdebugging.png new file mode 100644 index 0000000000..bf5287a5c3 Binary files /dev/null and b/docs/_build/html/_images/remix_startdebugging.png differ diff --git a/docs/_build/html/_images/remix_supporttab.png b/docs/_build/html/_images/remix_supporttab.png new file mode 100644 index 0000000000..b62ead496b Binary files /dev/null and b/docs/_build/html/_images/remix_supporttab.png differ diff --git a/docs/_build/html/_images/remix_terminal.png b/docs/_build/html/_images/remix_terminal.png new file mode 100644 index 0000000000..3f096a2490 Binary files /dev/null and b/docs/_build/html/_images/remix_terminal.png differ diff --git a/docs/_build/html/_images/remix_unittest.png b/docs/_build/html/_images/remix_unittest.png new file mode 100644 index 0000000000..c94077524c Binary files /dev/null and b/docs/_build/html/_images/remix_unittest.png differ diff --git a/docs/_build/html/_images/remix_valueinput.png b/docs/_build/html/_images/remix_valueinput.png new file mode 100644 index 0000000000..381ebfc86a Binary files /dev/null and b/docs/_build/html/_images/remix_valueinput.png differ diff --git a/docs/_build/html/_images/remixd_alert.png b/docs/_build/html/_images/remixd_alert.png new file mode 100644 index 0000000000..d64e6f7214 Binary files /dev/null and b/docs/_build/html/_images/remixd_alert.png differ diff --git a/docs/_build/html/_images/remixd_connectionok.png b/docs/_build/html/_images/remixd_connectionok.png new file mode 100644 index 0000000000..e8381f55df Binary files /dev/null and b/docs/_build/html/_images/remixd_connectionok.png differ diff --git a/docs/_build/html/_images/remixd_noconnection.png b/docs/_build/html/_images/remixd_noconnection.png new file mode 100644 index 0000000000..b6cd6f5b40 Binary files /dev/null and b/docs/_build/html/_images/remixd_noconnection.png differ diff --git a/docs/_build/html/_images/tuto_basicimport.png b/docs/_build/html/_images/tuto_basicimport.png new file mode 100644 index 0000000000..81a8009336 Binary files /dev/null and b/docs/_build/html/_images/tuto_basicimport.png differ diff --git a/docs/_build/html/_images/tuto_importgit.png b/docs/_build/html/_images/tuto_importgit.png new file mode 100644 index 0000000000..022eb4b011 Binary files /dev/null and b/docs/_build/html/_images/tuto_importgit.png differ diff --git a/docs/_build/html/_images/tuto_importswarm.png b/docs/_build/html/_images/tuto_importswarm.png new file mode 100644 index 0000000000..01fba3e646 Binary files /dev/null and b/docs/_build/html/_images/tuto_importswarm.png differ diff --git a/docs/_build/html/_sources/analysis.md.txt b/docs/_build/html/_sources/analysis.md.txt new file mode 100644 index 0000000000..ac3de2ed7e --- /dev/null +++ b/docs/_build/html/_sources/analysis.md.txt @@ -0,0 +1,33 @@ +Analysis +======== + +This section gives information about the last compilation. By default, a +new analysis is run at each compilation. + +The analysis tab gives detailed information about the contract code. It +can help you avoid code mistakes and to enforce best practices. + +![](images/a-static-analysis.png) + +Here is the list of analyzers: + +Security: +- Transaction origin: Warns if tx.origin is used +- Check effects: Avoid potential reentrancy bugs +- Inline assembly: Use of Inline Assembly +- Block timestamp: Semantics maybe unclear +- Low level calls: Semantics maybe unclear +- Block.blockhash usage: Semantics maybe unclear + + +Gas & Economy: +- Gas costs: Warns if the gas requirements of the functions + are too high +- This on local calls: Invocation of local functions via + this + +Miscellaneous: +- Constant functions: Checks for potentially constant + functions +- Similar variable names: Checks if variable names are too + similar diff --git a/docs/_build/html/_sources/analysis_tab.md.txt b/docs/_build/html/_sources/analysis_tab.md.txt new file mode 100644 index 0000000000..b15322cfc9 --- /dev/null +++ b/docs/_build/html/_sources/analysis_tab.md.txt @@ -0,0 +1,33 @@ +Analysis +======== + +This section gives information about the last compilation. By default, a +new analysis is run at each compilation. + +The analysis tab gives detailed information about the contract code. It +can help you avoid code mistakes and to enforce best practices. + +![](images/a-analysis.png) + +Here is the list of analyzers: + +Security: +- Transaction origin: Warns if tx.origin is used +- Check effects: Avoid potential reentrancy bugs +- Inline assembly: Use of Inline Assembly +- Block timestamp: Semantics maybe unclear +- Low level calls: Semantics maybe unclear +- Block.blockhash usage: Semantics maybe unclear + + +Gas & Economy: +- Gas costs: Warns if the gas requirements of the functions + are too high +- This on local calls: Invocation of local functions via + this + +Miscellaneous: +- Constant functions: Checks for potentially constant + functions +- Similar variable names: Checks if variable names are too + similar diff --git a/docs/_build/html/_sources/code_contribution_guide.md.txt b/docs/_build/html/_sources/code_contribution_guide.md.txt new file mode 100644 index 0000000000..3ff6334308 --- /dev/null +++ b/docs/_build/html/_sources/code_contribution_guide.md.txt @@ -0,0 +1,11 @@ +Code contribution guide +======================= + +Remix is an open source tool and we encourage anyone to help us improve our tool. +You can do that by opening issues, giving feedback or by contributing a pull request +to our codebase. + +The Remix application is built with JavaScript and it doesn't use any framework. We only +rely on selected set of npm modules, like `yo-yo`, `csjs-inject` and others. Check out the `package.json` files in the Remix submodules to learn more about the stack. + +To learn more, please visit our [GitHub page](https://github.com/ethereum/remix-ide). diff --git a/docs/_build/html/_sources/community.md.txt b/docs/_build/html/_sources/community.md.txt new file mode 100644 index 0000000000..a76c8fd09d --- /dev/null +++ b/docs/_build/html/_sources/community.md.txt @@ -0,0 +1,14 @@ +Community +======================= + +We know that blockchain ecosystem is very new and that lots of information is scattered around the web. +That is why we created a community support channel where we and other users try to answer your questions if +you get stuck using Remix. Please, join [the community](https://gitter.im/ethereum/remix) and ask for help. + +For anyone who is interested in developing a custom plugin for Remix or who wants to contribute to the codebase, +we opened a [contributors' channel](https://gitter.im/ethereum/remix-dev) especially for developers working on Remix tools. + +We would kindly ask you to respect the space and to use it for +getting help with your work and the developers' channel for discussions related to working on Remix codebase. If you have +ideas for collaborations or you want to promote your project, try to find some more appropriate channels to do so. Or you can contact +the main contributors directly on Gitter or Twitter. diff --git a/docs/_build/html/_sources/compile.md.txt b/docs/_build/html/_sources/compile.md.txt new file mode 100644 index 0000000000..8123ade117 --- /dev/null +++ b/docs/_build/html/_sources/compile.md.txt @@ -0,0 +1,28 @@ +Compiler (Solidity) +=================== + +Clicking the Solidity icon in the icon panel brings you to the Solidty Compiler. + +Compiling is triggered when you click the compile button ( **A. in image below**). If you want the file to be compiled each time the file is saved or when another file is selected - check the auto compile checkbox ( **B. in image below**). + +If the contract has a lot of dependencies it can take a while to compile - so you use autocompilation at your discretion. + +![](images/a-sol-compiler.png) + +After each compilation, a list is updated with all the newly compiled +contracts. The contract compiled can be selected with the Contract pulldown menu ( **C. in image below**). Multiple contracts are compiled when one contract imports other contracts. Selecting a contract will show information about that one. + +When the "Compilation Details" button is clicked ( **D. in image below**), a modal opens displaying detailed information about the current selected contract. + +From this tab, you can also publish your contract to Swarm (only non +abstract contracts can be published). + +Published data notably contains the `abi` and solidity source code. + +After a contract is published, you can find its metadata information +using the bzz URL located in the details modal dialog `SWARM LOCATION`. + +Compilation Errors and Warning are displayed below the contract section. +At each compilation, the static analysis tab builds a report. It is very +valuable when addressing reported issues even if the compiler doesn't +complain. ([see more](static_analysis.html)) diff --git a/docs/_build/html/_sources/compile_tab.md.txt b/docs/_build/html/_sources/compile_tab.md.txt new file mode 100644 index 0000000000..8123ade117 --- /dev/null +++ b/docs/_build/html/_sources/compile_tab.md.txt @@ -0,0 +1,28 @@ +Compiler (Solidity) +=================== + +Clicking the Solidity icon in the icon panel brings you to the Solidty Compiler. + +Compiling is triggered when you click the compile button ( **A. in image below**). If you want the file to be compiled each time the file is saved or when another file is selected - check the auto compile checkbox ( **B. in image below**). + +If the contract has a lot of dependencies it can take a while to compile - so you use autocompilation at your discretion. + +![](images/a-sol-compiler.png) + +After each compilation, a list is updated with all the newly compiled +contracts. The contract compiled can be selected with the Contract pulldown menu ( **C. in image below**). Multiple contracts are compiled when one contract imports other contracts. Selecting a contract will show information about that one. + +When the "Compilation Details" button is clicked ( **D. in image below**), a modal opens displaying detailed information about the current selected contract. + +From this tab, you can also publish your contract to Swarm (only non +abstract contracts can be published). + +Published data notably contains the `abi` and solidity source code. + +After a contract is published, you can find its metadata information +using the bzz URL located in the details modal dialog `SWARM LOCATION`. + +Compilation Errors and Warning are displayed below the contract section. +At each compilation, the static analysis tab builds a report. It is very +valuable when addressing reported issues even if the compiler doesn't +complain. ([see more](static_analysis.html)) diff --git a/docs/_build/html/_sources/contract_metadata.md.txt b/docs/_build/html/_sources/contract_metadata.md.txt new file mode 100644 index 0000000000..4806e30cd3 --- /dev/null +++ b/docs/_build/html/_sources/contract_metadata.md.txt @@ -0,0 +1,69 @@ +Build Artifact +============== + +As compilation succeed Remix create a JSON file for each compiled contract. +These JSON files contains several metadata + +Library Deployment +------------------ + +By default Remix automatically deploy needed libraries. + +`linkReferences` contains a map representing libraries which depend on the current contract. +Values are addresses of libraries used for linking the contract. + +`autoDeployLib` defines if the libraries should be auto deployed by Remix or if the contract should be linked with libraries described in `linkReferences` + +Note that Remix will resolve addresses corresponding to the current network. +By default, a configuration key follow the form: `:`, but it is also possible +to define `` or `` as keys. + +``` +{ + "VM:-": { + "linkReferences": { + "browser/Untitled.sol": { + "lib": "
", + "lib2": "
" + } + }, + "autoDeployLib": true + }, + "main:1": { + "linkReferences": { + "browser/Untitled.sol": { + "lib": "
", + "lib2": "
" + } + }, + "autoDeployLib": true + }, + "ropsten:3": { + "linkReferences": { + "browser/Untitled.sol": { + "lib": "
", + "lib2": "
" + } + }, + "autoDeployLib": true + }, + "rinkeby:4": { + "linkReferences": { + "browser/Untitled.sol": { + "lib": "
", + "lib2": "
" + } + }, + "autoDeployLib": true + }, + "kovan:42": { + "linkReferences": { + "browser/Untitled.sol": { + "lib": "
", + "lib2": "
" + } + }, + "autoDeployLib": true + } +} +``` diff --git a/docs/_build/html/_sources/create_deploy.md.txt b/docs/_build/html/_sources/create_deploy.md.txt new file mode 100644 index 0000000000..77279ca5cf --- /dev/null +++ b/docs/_build/html/_sources/create_deploy.md.txt @@ -0,0 +1,108 @@ +Creating and Deploying a Contract +================================ + +There are 3 type of environments Remix can be plugged to: +`Javascript VM`, `Injected provider`, or `Web3 provider`. (for details see [Running transactions](http://remix.readthedocs.io/en/latest/run_tab.html)) + +Both `Web3 provider` and `Injected provider` require the use of an +external tool. + +The external tool for `Web3 provider` is an Ethereum node and for +`Injected provider` Metamask. + +The `JavaScript VM` mode is convenient because each execution runs in +your browser and you don't need any other software or Ethereum node to run it. + +So, it is the easiest test environment - **no setup required!** + +But keep in mind that reloading the browser when you are in the Javascript VM will restart Remix in an empty state. + +For performance purposes ( which is to say - for testing in an environment that is closest to the mainnet), it might also be better to use an external node. + +Selecting the VM mode +--------------------- + +Make sure the VM mode is selected. All accounts displayed in `Accounts` +should have 100 ether. + +Sample contract +--------------- + +``` +{.sourceCode .none} +pragma solidity ^0.5.1; + +contract testContract { + + uint value; + + constructor (uint _p) public { + value = _p; + } + + function setP(uint _n) payable public { + value = _n; + } + + function setNP(uint _n) public { + value = _n; + } + + function get () view public returns (uint) { + return value; + } +} + +``` + +This contract is very basic. The goal is to quickly start to create and +to interact with a sample contract. + +Deploying an instance +--------------------- + +The `Compile tab` displays information related to the current contract +(note that there can be more than one) (see ../compile\_tab). + +Moving on, in the `Run tab` select, `JavaScript VM` to specify that you +are going to deploy an instance of the contract in the `JavaScript VM` +state. + +![](images/a-jvm.png) + +The constructor of `Ballot.sol` needs a parameter (of type `uint8`). +Give any value and click on `Deploy`. + +The transaction which deploys the instance of `Ballot` is created. + +In a "normal" blockchain, it can take several seconds to execute. This +is the time for the transaction to be mined. However, because we are +using the `JavaScript VM`, our execution is immediate. + +The terminal will inform you about the transaction. You can see details +there and start debugging. + +The newly created instance is displayed in the `run tab`. + +![](images/a-jvm-instance.png) + +Interacting with an instance +---------------------------- + +This new instance contains 3 actions which corresponds to the 3 +functions (`setP`, `setPN`, `get`). Clicking on `SetP` or `SetPN` will +create a new transaction. + +Note that `SetP` is `payable` (red button) : it is possible to send +value (Ether) to the contract. + +`SetPN` is not payable (orange button - depending on the theme) : it is not possible to send +value (Ether) to the contract. + +Clicking on `get` will not execute a transaction (usually its a blue button - depending on the theme). It doesn't execute a transaction because a `get` does not modify the state (variable +`value`) of this instance. + +As `get` is `view` you can see the return value just below the +action. + +![](images/a-jvm-calling-instance.png) diff --git a/docs/_build/html/_sources/debugger.md.txt b/docs/_build/html/_sources/debugger.md.txt new file mode 100644 index 0000000000..8a5c0959ff --- /dev/null +++ b/docs/_build/html/_sources/debugger.md.txt @@ -0,0 +1,12 @@ +Debugger +======== + +This module allows you to debug the transaction. It can be used to +deploy transactions created from Remix and already mined transactions. +(debugging works only if the current environment provides the necessary +features). + +To get to the debugger - you can click the debug button in the terminal when a successful or failed transaction appears there. You can also load the module from the plugin manager and then click the bug in the icon panel. Or you can get to the debugger by running the debug command in the console. + + +![](images/a-debugger.png) diff --git a/docs/_build/html/_sources/debugger_tab.md.txt b/docs/_build/html/_sources/debugger_tab.md.txt new file mode 100644 index 0000000000..43ca629553 --- /dev/null +++ b/docs/_build/html/_sources/debugger_tab.md.txt @@ -0,0 +1,15 @@ +Debugger +======== + +This module allows you to debug the transaction. It can be used to +deploy transactions created from Remix and already mined transactions. +(debugging works only if the current environment provides the necessary +features). + +To get to the debugger - you can click the debug button in the terminal when a successful or failed transaction appears there. You can also load the module from the plugin manager and then click the bug in the icon panel. Or you can get to the debugger by running the debug command in the console. + + +![](images/a-debugger.png) + +For more information about debugging, see the [Tutorial on debugging transactions with Remix +](tutorial_debug.html) diff --git a/docs/_build/html/_sources/faq.md.txt b/docs/_build/html/_sources/faq.md.txt new file mode 100644 index 0000000000..fb85d714ea --- /dev/null +++ b/docs/_build/html/_sources/faq.md.txt @@ -0,0 +1,10 @@ +FAQ +======================= + +How to record a series of transactions for replaying in a different environment? + +How to link files in solidity? + +How to deploy optimized code? + + diff --git a/docs/_build/html/_sources/file_explorer.md.txt b/docs/_build/html/_sources/file_explorer.md.txt new file mode 100644 index 0000000000..8f09b973ea --- /dev/null +++ b/docs/_build/html/_sources/file_explorer.md.txt @@ -0,0 +1,54 @@ +File Explorer +============= + +To get to the file explorers - click the file explorers icon. + +![](images/a-file-explorer1.png) + +The file explorer lists by default all the files stored in your browser. +You can see them in the browser folder. You can always rename, remove or +add new files to the file explorer. + +Note that clearing the browser storage will permanently delete all the +solidity files you wrote. To avoid this, you can use Remixd, which +enables you to store and sync files in the browser with your local +computer ( for more information see [remixd](remixd.html) ). + +![](images/a-file-explorer-buttons.png) + +We will start by reviewing at the icons at the top left - from left to +the right: + +Create new File +--------------- + +Creates a new `untitled.sol` file in Remix. + +Add Local File +-------------- + +Allows you to select files from the local file system and import them to +the Remix browser storage. + +Publish to Gist +--------------- + +Publishes all files from the browser folder to a gist. +Gist API has changed in 2018 and it unfortunately requires users to be authenticated to be able to publish a gist. + +Click [this link](https://github.com/settings/tokens) to Github tokens setup and select Generate new token. +Then check only Create gists checkbox and generate a new token. + +Then paste it in Remix (right panel/Settings tab) and click Save. Now you should be able to use the feature. + +Copy to another Remix instance +------------------------ + +Enables you to copy files from the browser storage to another instance +(URL) of Remix. + +Connect your filesystem to Remix +-------------------- + +Allows to sync between Remix and your local file system (see +[more about RemixD](remixd.html)). diff --git a/docs/_build/html/_sources/glossary.md.txt b/docs/_build/html/_sources/glossary.md.txt new file mode 100644 index 0000000000..8abe6f0967 --- /dev/null +++ b/docs/_build/html/_sources/glossary.md.txt @@ -0,0 +1,32 @@ +Glossary +======================= + +ABI + +Environment + - Where the transaction is happening + -- as in Javascript Virtual Machine, Injected Provider, or Injected Web3 Provider + - An ecosystem - as in the Solidity world or the Vyper / Python World + +Context + +Provider + +IPFS + +Swarm + +Gas & Gas Estimation + +compilation result + +remixd + +payable functions + +pure functions + +constant functions + +compilation result + diff --git a/docs/_build/html/_sources/homepage.md.txt b/docs/_build/html/_sources/homepage.md.txt new file mode 100644 index 0000000000..21a35d9b24 --- /dev/null +++ b/docs/_build/html/_sources/homepage.md.txt @@ -0,0 +1,7 @@ +Homepage +============== + +Environment +----------- + +Click the solidity button to load the modules related to solidity. \ No newline at end of file diff --git a/docs/_build/html/_sources/import.md.txt b/docs/_build/html/_sources/import.md.txt new file mode 100644 index 0000000000..a576d24586 --- /dev/null +++ b/docs/_build/html/_sources/import.md.txt @@ -0,0 +1,39 @@ +Importing Source Files in Solidity +================================== + +It is essential to know all many techniques for importing files. + +For a tutorial about importing files see this [tutorial](https://github.com/ethereum/remix-workshops/tree/master/loading_via_npm_github_plugin). + +For a detailed explanation of the `import` keyword see the +[Solidity documentation](https://solidity.readthedocs.io/en/develop/layout-of-source-files.html?highlight=import#importing-other-source-files) + +Here are a some of the main methods of importing a file: + +Importing a file from the browser's local storage +------------------------------------------------- + +Files in Remix can be imported just by specifying their path. Please use ./ for relative paths to increase portability. +![](images/a-old-tuto_basicimport.png) + +Importing a file from your computer's filesystem +------------------------------------------------- + +This method uses **remixd** - the remix daemon. Please go to the [remixd tutorial](remixd.html) for instructions about how to bridge the divide between the browser and your computers filesystem. + + +Importing from GitHub +--------------------- + +It is possible to import files directly from GitHub with URLs like +`https://github.com///`. + +![](images/a-old-tuto_importgit.png) + +Importing from Swarm +-------------------- + +Files can be imported using all URLs supported by swarm. If you do not +have a swarm node, then use swarm-gateways.net. + +![](images/a-old-tuto_importswarm.png) diff --git a/docs/_build/html/_sources/index.rst.txt b/docs/_build/html/_sources/index.rst.txt new file mode 100644 index 0000000000..a2b8905151 --- /dev/null +++ b/docs/_build/html/_sources/index.rst.txt @@ -0,0 +1,88 @@ +Welcome to Remix documentation! +=============================== + +Remix is a powerful, open source tool that helps you write Solidity contracts straight from the browser. +Written in JavaScript, Remix supports both usage in the browser and locally. + +Remix also supports testing, debugging and deploying of smart contracts and much more. + +Our Remix project with all its features is available +at `remix.ethereum.org `__ and more information can be found in these +docs. Our IDE tool is available at `our GitHub repository +`__. + +This set of documents covers instructions on how to use Remix and some tutorials to help you get started. + +Useful links: + +- `Solidity documentation `__ + +- `Remix alpha `__ - The version where we test new Remix release (not stable!). + +- `Ethereum StackExchange for Remix `__ + +- `Community support channel `__ + +- `Ðapp Developer resources (Ethereum wiki) `__ + +.. toctree:: + :maxdepth: 2 + :caption: New Layout Intro + + layout + +.. toctree:: + :maxdepth: 2 + :caption: Tour of default modules + + file_explorer + plugin_manager + settings + solidity_editor + terminal + +.. toctree:: + :maxdepth: 2 + :caption: Tour of typical solidity modules + + compile + run + udapp + debugger + static_analysis + +.. toctree:: + :maxdepth: 2 + :caption: Using Remix + + contract_metadata + create_deploy + import + remixd + unittesting + +.. toctree:: + :maxdepth: 2 + :caption: Building Plugins + + remix_plugin.md + +.. toctree:: + :maxdepth: 2 + :caption: URLs & Downloads + + locations + +.. toctree:: + :maxdepth: 2 + :caption: Tutorials and workshops slides + + remix_tutorials_github + +.. toctree:: + :maxdepth: 2 + :caption: Code contribution guide + + code_contribution_guide + community + support diff --git a/docs/_build/html/_sources/javascript_vm.md.txt b/docs/_build/html/_sources/javascript_vm.md.txt new file mode 100644 index 0000000000..27f9731ed8 --- /dev/null +++ b/docs/_build/html/_sources/javascript_vm.md.txt @@ -0,0 +1,108 @@ +Using the JavaScript VM +======================== + +There are 3 type of environments Remix can be plugged to: +`Javascript VM`, `Injected provider`, or `Web3 provider`. (for details see [Running transactions](http://remix.readthedocs.io/en/latest/run_tab.html)) + +Both `Web3 provider` and `Injected provider` require the use of an +external tool. + +The external tool for `Web3 provider` is an Ethereum node and for +`Injected provider` Metamask. + +The `JavaScript VM` mode is convenient because each execution runs in +your browser and you don't need any other software or Ethereum node to run it. + +So, it is the easiest test environment - **no setup required!** + +But keep in mind that reloading the browser when you are in the Javascript VM will restart Remix in an empty state. + +For performance purposes ( which is to say - for testing in an environment that is closest to the mainnet), it might also be better to use an external node. + +Selecting the VM mode +--------------------- + +Make sure the VM mode is selected. All accounts displayed in `Accounts` +should have 100 ether. + +Sample contract +--------------- + +``` +{.sourceCode .none} +pragma solidity ^0.5.1; + +contract testContract { + + uint value; + + constructor (uint _p) public { + value = _p; + } + + function setP(uint _n) payable public { + value = _n; + } + + function setNP(uint _n) public { + value = _n; + } + + function get () view public returns (uint) { + return value; + } +} + +``` + +This contract is very basic. The goal is to quickly start to create and +to interact with a sample contract. + +Deploying an instance +--------------------- + +The `Compile tab` displays information related to the current contract +(note that there can be more than one) (see ../compile\_tab). + +Moving on, in the `Run tab` select, `JavaScript VM` to specify that you +are going to deploy an instance of the contract in the `JavaScript VM` +state. + +![](images/a-jvm.png) + +The constructor of `Ballot.sol` needs a parameter (of type `uint8`). +Give any value and click on `Deploy`. + +The transaction which deploys the instance of `Ballot` is created. + +In a "normal" blockchain, it can take several seconds to execute. This +is the time for the transaction to be mined. However, because we are +using the `JavaScript VM`, our execution is immediate. + +The terminal will inform you about the transaction. You can see details +there and start debugging. + +The newly created instance is displayed in the `run tab`. + +![](images/a-jvm-instance.png) + +Interacting with an instance +---------------------------- + +This new instance contains 3 actions which corresponds to the 3 +functions (`setP`, `setPN`, `get`). Clicking on `SetP` or `SetPN` will +create a new transaction. + +Note that `SetP` is `payable` (red button) : it is possible to send +value (Ether) to the contract. + +`SetPN` is not payable (orange button - depending on the theme) : it is not possible to send +value (Ether) to the contract. + +Clicking on `get` will not execute a transaction (usually its a blue button - depending on the theme). It doesn't execute a transaction because a `get` does not modify the state (variable +`value`) of this instance. + +As `get` is `view` you can see the return value just below the +action. + +![](images/a-jvm-calling-instance.png) diff --git a/docs/_build/html/_sources/layout.md.txt b/docs/_build/html/_sources/layout.md.txt new file mode 100644 index 0000000000..2cbeed1066 --- /dev/null +++ b/docs/_build/html/_sources/layout.md.txt @@ -0,0 +1,54 @@ +Remix-IDE Layout +============== + +The new structure +-------------------- +![](images/a-layout1b.png) + +1. Icon Panel - click to change which plugin appears in the Swap Panel +2. Swap Panel - Most but not all plugins will have their GUI here. +3. Main Panel - In the old layout this was just for editing files. In the tabs can be plugins or files for the IDE to compile. +4. Terminal - where you will see the results of your interactions with the GUI's. Also you can run scripts here. + +Icon Panel at Page Load +----------------------- +When you load remix - the icon panel show these icons by default. + +![](images/a-icons-at-load.png) + +Everything in remix is now a plugin... so the **[Plugin Manager](#plugin-manager)** is very important. +In the old layout, each basic task in remix was separated into the tabs. Now these tabs are plugins. + +But to activate a half a dozen plugins - (or however many you are using) each time the page load is **tedious**. So learn about the **[Environments](#environments)**. + +Homepage +-------- + +![](images/a-hometab.png) + +The homepage is located in a tab in the Main Panel. + +You can also get there by clicking the remix logo at the top of the icon panel. + +### Environments +Clicking on one of the environment buttons loads up a collection of plugins. We currently have a **Solidity** Button and a **Vyper** button. In the future you will be able to save your own environment. + +To see all the plugins go to the **plugin manager** - by selecting the plug in the icon panel. +![](images/a-plug.png) + +The environment buttons are time & sanity savers - so you don't need to go to the plugin manager to get started everytime you load the page. + + +Plugin Manager +--------------- + +In order to make Remix flexible for integrating changes into its functionality and for integrating remix into other projects (your's for example), we've now made everything a plugin. This means that you only load the functionality you need. It also means that you need a place to turn off and on plugins - as your needs change. This all happens in the plug manager. + +The Plugin Manager is also the place you go when you are creating your own plugin and you want to load your local plugin into Remix. In that case you'd click on the "Connect to a Local Plugin" link at the top of the Plugin Manager panel. + +Themes +--------------- + +So you want to work on Remix with a dark theme or a gray theme or just a different theme that the one you are currently looking at? Go to the settings tab and at the bottom is a choice of lots of bootstrap based themes. + +![](images/a-themes.png) diff --git a/docs/_build/html/_sources/locations.md.txt b/docs/_build/html/_sources/locations.md.txt new file mode 100644 index 0000000000..51e50e8a7a --- /dev/null +++ b/docs/_build/html/_sources/locations.md.txt @@ -0,0 +1,10 @@ +Finding Remix +============= + +So if you've found the documentation to Remix but don't know where to find Remix or if you want to run the remix-ide locally and want to find out where to download it - this page is here to help. + +- An online version is available at [https://remix.ethereum.org](https://remix.ethereum.org). This version is stable and is updated at almost every release. +- An alpha online version is available at [https://remix-alpha.ethereum.org](https://remix-alpha.ethereum.org). This is not a stable version. +- npm `remix-ide` package `npm install remix-ide -g`. `remix-ide` create a new instance of `Remix IDE` available at [http://127.0.0.1:8080](http://127.0.0.1:8080) and make the current folder available to Remix IDE by automatically starting `remixd`. +see [Connection to `remixd`](http://remix.readthedocs.io/en/latest/tutorial_remixd_filesystem.html) for more information about sharing local file with `Remix IDE`. +- Github release: [https://github.com/ethereum/remix-ide/releases](https://github.com/ethereum/remix-ide/releases) . The source code is packaged at every release but still need to be built using `npm run build`. diff --git a/docs/_build/html/_sources/locationss.md.txt b/docs/_build/html/_sources/locationss.md.txt new file mode 100644 index 0000000000..745a0ae3ba --- /dev/null +++ b/docs/_build/html/_sources/locationss.md.txt @@ -0,0 +1,11 @@ +Locations +========= + +This part focuses on using `Remix IDE`, which is a browser based smart contract IDE. We will basically answer the question: +Where can I find or download `Remix IDE`, and what is the difference between packages? + +- An online version is available at [https://remix.ethereum.org](https://remix.ethereum.org). This version is stable and is updated at almost every release. +- An alpha online version is available at [https://remix-alpha.ethereum.org](https://remix-alpha.ethereum.org). This is not a stable version. +- npm `remix-ide` package `npm install remix-ide -g`. `remix-ide` create a new instance of `Remix IDE` available at [http://127.0.0.1:8080](http://127.0.0.1:8080) and make the current folder available to Remix IDE by automatically starting `remixd`. +see [Connection to `remixd`](http://remix.readthedocs.io/en/latest/tutorial_remixd_filesystem.html) for more information about sharing local file with `Remix IDE`. +- Github release: [https://github.com/ethereum/remix-ide/releases](https://github.com/ethereum/remix-ide/releases) . The source code is packaged at every release but still need to be built using `npm run build`. diff --git a/docs/_build/html/_sources/packages.md.txt b/docs/_build/html/_sources/packages.md.txt new file mode 100644 index 0000000000..745a0ae3ba --- /dev/null +++ b/docs/_build/html/_sources/packages.md.txt @@ -0,0 +1,11 @@ +Locations +========= + +This part focuses on using `Remix IDE`, which is a browser based smart contract IDE. We will basically answer the question: +Where can I find or download `Remix IDE`, and what is the difference between packages? + +- An online version is available at [https://remix.ethereum.org](https://remix.ethereum.org). This version is stable and is updated at almost every release. +- An alpha online version is available at [https://remix-alpha.ethereum.org](https://remix-alpha.ethereum.org). This is not a stable version. +- npm `remix-ide` package `npm install remix-ide -g`. `remix-ide` create a new instance of `Remix IDE` available at [http://127.0.0.1:8080](http://127.0.0.1:8080) and make the current folder available to Remix IDE by automatically starting `remixd`. +see [Connection to `remixd`](http://remix.readthedocs.io/en/latest/tutorial_remixd_filesystem.html) for more information about sharing local file with `Remix IDE`. +- Github release: [https://github.com/ethereum/remix-ide/releases](https://github.com/ethereum/remix-ide/releases) . The source code is packaged at every release but still need to be built using `npm run build`. diff --git a/docs/_build/html/_sources/plugin-manager.md.txt b/docs/_build/html/_sources/plugin-manager.md.txt new file mode 100644 index 0000000000..fdcbe8854a --- /dev/null +++ b/docs/_build/html/_sources/plugin-manager.md.txt @@ -0,0 +1,28 @@ +Plugin Manager +=================== + +lallallalal By default Remix triggers a compilation each time the current file is +changed or another file is selected. If the contract has a lot of +dependencies and takes a long time to compile, it is possible to disable +the autocompilation. + +![](images/a-sol-compiler.png) + +After each compilation, a list is updated with all the newly compiled +contracts. + +Details modal dialog displays detailed information about the current +selected contract. + +From this tab, you can also publish your contract to Swarm (only non +abstract contracts can be published). + +Published data notably contains the `abi` and solidity source code. + +After a contract is published, you can find its metadata information +using the bzz URL located in the details modal dialog `SWARM LOCATION`. + +Compilation Errors and Warning are displayed below the contract section. +At each compilation, the static analysis tab builds a report. It is very +valuable when addressing reported issues even if the compiler doesn't +complain. ([see more](http://remix.readthedocs.io/en/latest/analysis_tab.html)) diff --git a/docs/_build/html/_sources/plugin_manager.md.txt b/docs/_build/html/_sources/plugin_manager.md.txt new file mode 100644 index 0000000000..9c95b45661 --- /dev/null +++ b/docs/_build/html/_sources/plugin_manager.md.txt @@ -0,0 +1,22 @@ +Plugin Manager +=================== + +## Everything is a PLUGIN in Remix + +In order to integrate new tools made by us and by ...you into Remix, we've now made everything a plugin. +This architcture will also allow Remix or just parts of Remix to be integrated into other projects (your's for example). + +This means that you only load the functionality you need. + +It also means that you can turn off and on plugins - as your needs change. + +This all happens in the plug manager. + +The Plugin Manager is also the place you go when you are creating your own plugin and you want to load your local plugin into Remix. + +To load your local plugin, you'd click on the "Connect to a Local Plugin" link at the top of the Plugin Manager panel. + +![](images/a-plugin-man-local.png) + +To learn more about how to create your own plugin, go to +[the README of remix-plugin repo](https://github.com/ethereum/remix-plugin). diff --git a/docs/_build/html/_sources/quickstart_javascript_vm.md.txt b/docs/_build/html/_sources/quickstart_javascript_vm.md.txt new file mode 100644 index 0000000000..72b4e01d6c --- /dev/null +++ b/docs/_build/html/_sources/quickstart_javascript_vm.md.txt @@ -0,0 +1,104 @@ +Using the JavaScript VM +======================== + +There are 3 type of environments Remix can be plugged to: +`Javascript VM`, `Injected provider`, or `Web3 provider`. (for details see [Running transactions](http://remix.readthedocs.io/en/latest/run_tab.html)) + +Both `Web3 provider` and `Injected provider` require the use of an +external tool. + +The external tool for `Web3 provider` is an Ethereum node the tools for +`Injected provider` are Mist or Metamask. + +The `JavaScript VM` mode is convenient because each execution runs in +your browser. Thus reloading the page will restart Remix with an empty +state. + +So for performance purposes, it might also be better to use an external +node. + +Selecting the VM mode +--------------------- + +Make sure the VM mode is selected. All accounts displayed in `Accounts` +should have 100 ether. + +Sample contract +--------------- + +``` {.sourceCode .none} +pragma solidity ^0.4.16; + +contract testContract { + + uint value; + function testContract(uint _p) { + value = _p; + } + + function setP(uint _n) payable { + value = _n; + } + + function setNP(uint _n) { + value = _n; + } + + function get () constant returns (uint) { + return value; + } +} +``` + +This contract is very basic. The goal is to quickly start to create and +to interact with a sample contract. + +Deploying an instance +--------------------- + +The `Compile tab` displays information related to the current contract +(note that there can be more than one) (see ../compile\_tab). + +Moving on, in the `Run tab` select, `JavaScript VM` to specify that you +are going to deploy an instance of the contract in the `JavaScript VM` +state. + +![image](images/remix_quickstart_javascriptvm_creation.png) + +The constructor of `testContract` needs a parameter (of type `uint`). +Give any value and click on `Create`. + +The transaction which deploys the instance of `testContract` is created. + +In a "normal" blockchain, it can take several seconds to execute. This +is the time for the transaction to be mined. However, because we are +using the `JavaScript VM`, our execution is immediate. + +The terminal will inform you about the transaction. You can see details +there and start debugging. + +The newly created instance is displayed in the `run tab`. + +![image](images/remix_quickstart_javascriptvm_creationTransaction.png) + +Interacting with an instance +---------------------------- + +This new instance contains 3 actions which corresponds to the 3 +functions (`setP`, `setPN`, `get`). Clicking on `SetP` or `SetPN` will +create a new transaction. + +Note that `SetP` is `payable` (red action) : it is possible to send +value (Ether) to the contract. + +`SetPN` is not payable (light red action) : it is not possible to send +value (Ether) to the contract. + +Clicking on `get` will not execute a transaction (blue action). It is +not necessary to do so because `get` does not modify the state (variable +`value`) of this instance. + +As `get` is `constant` you can see the return value just below the +action. + +![image](images/remix_quickstart_javascriptvm_callinginstance.png) diff --git a/docs/_build/html/_sources/remix-tutorials-github.md.txt b/docs/_build/html/_sources/remix-tutorials-github.md.txt new file mode 100644 index 0000000000..0aa626f164 --- /dev/null +++ b/docs/_build/html/_sources/remix-tutorials-github.md.txt @@ -0,0 +1,6 @@ +Remix Tutorials +======================= + +There are a series of tutorials in our github repo [remix-workshops] (https://github.com/ethereum/remix-workshops). We are in the process of upgrading these tutorials to use the new Remix layout. + +There are beginner tutorials as well as advanced ones. diff --git a/docs/_build/html/_sources/remix_plugin.md.txt b/docs/_build/html/_sources/remix_plugin.md.txt new file mode 100644 index 0000000000..95ccd300f7 --- /dev/null +++ b/docs/_build/html/_sources/remix_plugin.md.txt @@ -0,0 +1,4 @@ +Remix Plugin +============ + +The best documentation about how to build a plugin is currently in [the readme of remix-plugin repo](https://github.com/ethereum/remix-plugin). Please go [here](https://github.com/ethereum/remix-plugin) to learn all about it. diff --git a/docs/_build/html/_sources/remix_plugin_api.md.txt b/docs/_build/html/_sources/remix_plugin_api.md.txt new file mode 100644 index 0000000000..1c6f66e1ba --- /dev/null +++ b/docs/_build/html/_sources/remix_plugin_api.md.txt @@ -0,0 +1,60 @@ +Remix Plugin API usage +====================== + +This section list all the available key and value pair which define this API: + +## 1) notifications + +### app (key: app) + + - unfocus `[]` + - focus `[]` + +### compiler (key: compiler) + + - compilationFinished `[success (bool), data (obj), source (obj)]` + - compilationData `[compilationResult (obj)]` + +### transaction listener (key: txlistener) + + - newTransaction `[tx (obj)]` + +### addendum + +`newTransaction` is broadcasted to all loaded plugins. +`compilationFinished` is sent to the plugin that currently has the focus. +`focus / unfocus` is sent to the plugin which currently has the focus or is unfocused. +`compilationData` is sent always just upon the `focus` event and gives the last compilation result. + +## 2) requests + +### app + + - getExecutionContextProvider `@return {String} provider (injected | web3 | vm)` + - getProviderEndpoint `@return {String} provider endpoint url if web3, returns an error if injected or javascript VM` + - updateTitle `@param {String} title` + +### config + + - setConfig `@param {String} path, @param {String} content` + - getConfig `@param {String} path` + - removeConfig `@param {String} path` + +### compiler + - getCompilationResult `@return {Object} compilation result` + +### udapp (only VM) + - runTx `@param {Object} tx` + - getAccounts `@return {Array} acccounts` + - createVMAccount `@param {String} privateKey, @param {String} balance (hex)` + +### editor + - getCurrentFile `@return {String} current file path displayed in the editor` + - getFile `@param {String} path` + - setFile `@param {String} path, @param {String} content` + - highlight `@param {Object} lineColumnPos, @param {String} filePath, @param {String} hexColor` + + + + + diff --git a/docs/_build/html/_sources/remix_plugin_old.md.txt b/docs/_build/html/_sources/remix_plugin_old.md.txt new file mode 100644 index 0000000000..16c3bbcdbb --- /dev/null +++ b/docs/_build/html/_sources/remix_plugin_old.md.txt @@ -0,0 +1,101 @@ +Remix Plugin API +================ + +This section provides informations about developing plugin for Remix. + +Introduction +------------ + +A plugin is basically a front end interface loaded through an iframe. Plugins have access to remix main features through an API. +This API consist of `notification` and `request` messages built over iframe messages (https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage) +plugin resources (html, js, img, ...) needs to have their own hosting, either using normal web or using decentralized infrastructure like Swarm and IPFS. + +A plugin declaration is a JSON value which contains the properties `url` and `title`. + +``` +{ + "title": "", + "url": "" +} +``` + + +Loading / Registering a plugin in Remix IDE can be done: + + - Creating a PR which add a new entry: https://github.com/ethereum/remix-ide/blob/master/src/app/plugin/plugins.js , the plugin can then be loaded directly from remix IDE with a single click. + - In the settings tab, paste a plugin declaration in the plugin section and hit load. + - Load Remix IDE with the following url parameters: `pluginurl` and `plugintitle` + +Using the API with iframe post message +-------------------------------------- + +A message (either received by the plugin or sent to it) is defined as follow: + +``` + { + action: , + key: '', + type: '', + value: [, , ...], + id: + } +``` + +example: + +``` + window.parent.postMessage(JSON.stringify({ + action: 'request', + key: 'config', + type: 'setConfig', + value: [document.getElementById('filename').value, document.getElementById('valuetosend').value], + id: 34 + }), '*') +``` + +There are 2 ways for interacting with the API, listening on notification and sending request + +``` + function receiveMessage (event) { + if (event.data.action === 'notification') { + ... + } + if (event.data.action === 'response') { + < listen on the response of the request app / updateTitle > + < contain event.data.error if any > + ... + } + } + window.addEventListener('message', receiveMessage, false) + + window.parent.postMessage(JSON.stringify({ + action: 'request', + key: 'app', + type: 'updateTitle', + value: ['changed title ' + k++], + id: 39 + }), '*') +``` + +from a response point of view, The `error` property is `undefined` if no error happened. In case of error (due to permission, system error, API error, etc...), `error` contains a string describing the error + +see [Remix Plugin API usage](./remix_plugin_api.html) for a list of available key / value describing the API. + +Using the API with remix extension NPM package +---------------------------------------------- + +The `remix-plugin` NPM package can be used to abstract the iframe layer: + +``` + var extension = require('remix-plugin') + + extension.listen('', '', function () {}) + extension.call('', '', '', function (error, result) {}) + + // examples + extension.listen('compiler', 'compilationFinished', function () {}) + extension.call('app', 'detectNetWork', [], function (error, result) {}) + extension.call('config', 'setConfig', ['', ''], function (error, result) {}) +``` + +`error` is either null or a string, `result` is an array. diff --git a/docs/_build/html/_sources/remix_tutorials_github.md.txt b/docs/_build/html/_sources/remix_tutorials_github.md.txt new file mode 100644 index 0000000000..5373c23029 --- /dev/null +++ b/docs/_build/html/_sources/remix_tutorials_github.md.txt @@ -0,0 +1,37 @@ +Remix Tutorials +======================= + +There are a series of tutorials in our github repo [remix-workshops](https://github.com/ethereum/remix-workshops). + +We are in the process of upgrading these tutorials to use the new Remix layout. + +In this repo there tutorials for all levels. + +There are tutorials for specific remix functionalities like: + +***Deploying*** + + Multiple ways of loading files in Remix + Deploying with libraries + Deploying a proxy contract + +***Testing*** + + Testing Examples + Continuous integration + +***Remix Plugin Development*** + + Developing a plugin for Remix and deploying it to swarm + +***Other*** + + EtherAtom (walkthrough slides + screencast) + Debugging transactions with Remix IDE + Recording and replaying transactions + Using a Pipeline plugin for developing Solidity contracts with demo video + Running scripts in the Remix terminal (batch deployment) (proxy deployment) + +***Additional external workshops*** + + Using Oraclize plugin in Remix diff --git a/docs/_build/html/_sources/remixd.md.txt b/docs/_build/html/_sources/remixd.md.txt new file mode 100644 index 0000000000..f96e6f5d44 --- /dev/null +++ b/docs/_build/html/_sources/remixd.md.txt @@ -0,0 +1,57 @@ +Remixd: Get access your local filesystem +========================================= + +`remixd` is an npm module. Its purpose is to give the remix web +application access to a folder on your local computer. + +The code of `remixd` is +[here](https://github.com/ethereum/remixd) . + +`remixd` can be globally installed using the following command: +`npm install -g remixd` + +You can install it just in the directory of your choice using this command: +`npm install remixd` + +Then `remixd -s --remix-ide ` will start `remixd` and will share the given folder. + +For example, to sync your local folder to the official Remix IDE, +`remixd -s --remix-ide https://remix.ethereum.org` + +The folder is shared using a websocket connection between `Remix IDE` +and `remixd`. + +Be sure the user executing `remixd` has read/write permission on the +folder. + +There is an option to run remixd in read-only mode, use `--read-only` flag. + +**Warning!** + +`remixd` provides `full read and write access` to the given folder for `any +application` that can access the `TCP port 65520` on your local host. + +From `Remix IDE`, in the Plugin Manager you need to activate the remixd plugin. + +A modal dialog will ask confirmation + +Accepting this dialog will start a session. + +If you do not have `remixd` running in the background - another modal will open up and it will say: + +``` +Cannot connect to the remixd daemon. +Please make sure you have the remixd running in the background. +``` + +Assuming you don't get the 2nd modal, your connection to the remixd daemon is successful. The shared folder will be available in the file explorer. + +**When you click the activation of remixd is successful - there will NOT be an icon that loads in the icon panel.** + +Click the File Explorers icon and in the swap panel you should now see the folder for `localhost`. + +Click on the `localhost connection` icon: + +![](images/a-remixd-success.png) + + diff --git a/docs/_build/html/_sources/run.md.txt b/docs/_build/html/_sources/run.md.txt new file mode 100644 index 0000000000..62a8e8fd1c --- /dev/null +++ b/docs/_build/html/_sources/run.md.txt @@ -0,0 +1,282 @@ +Run & Deploy +============ + +The Run tab allows you to send transactions to the current environment. + +To get to the Run & Deploy module - click the run icon in the icon panel. + +In order to use this module you need to have a contract compiled. So if there is file name in the contract pulldown menu ( in the image below it's the pulldown that says **Ballot**), then you can interact with this contract. If nothing is there - then you need to select a contract - make it the active contract in the main panel, ( in the image below - on the right side of the page - in the main panel - you see the ballot.sol so it is the active contract) then go to the compiler module and compile it. + +![](images/a-runtab1.png) + +Run Setup +--------- + +The following settings allow you to directly influence the transaction +execution: + +Environment: + +- `JavaScript VM`: All the transactions will be executed in + a sandbox blockchain in the browser. This means nothing + will be persisted and a page reload will restart a new + blockchain from scratch, the old one will not be saved. + +- `Injected Provider`: Remix will connect to an injected + web3 provider. `Metamask` is an example of + providers that inject web3, thus can be used with this + option. + +- `Web3 Provider`: Remix will connect to a remote node. You + will need to provide the URL address to the selected + provider: geth, parity or any Ethereum client. + +- Account: the list of accounts associated with the current + environment (and their associated balances). + +- Gas Limit: the maximum amount of gas that can be set for all the + transactions created in Remix. + +- Value: the amount of value for the next created transaction (this + value is always reset to 0 after each transaction execution). + + ![](images/a-Runtab-deploy-atAddress.png) + +Initiate Instance +----------------- + +This section contains the list of compiled contracts and 2 actions: + +- `At Address` assumes the given address is an instance of the + selected contract. It is then possible to interact with an already + deployed contract. There's no check at this point, so be careful + when using this feature, and be sure you trust the contract at that + address. + +- `Deploy` send a transaction that deploys the selected contract. When + the transaction is mined, the newly created instance will be added + (this might take several seconds). Note that if the `constructor` + has parameters, you need to specify them. + +Pending Instances +----------------- + +Validating a transaction take several seconds. During this time, the GUI +shows it in a pending mode. When transaction is mined the number of +pending transactions is updated and the transaction is added to the log +(see ../terminal) + +Using the ABI +------------ + +Using `Deploy` or `At Address` is a classic use case of Remix. It is +possible though to interact with a contract by using its ABI. The ABI is +a JSON array which describe its interface. + +To interact with a contract using the ABI, create a new file in Remix +with extension `*.abi` and copy the ABI content to it. Then in the input +next to `At Address`, put the Address of the contract you want to +interact with. Click on `At Address`, a new "connection" with the +contract will popup below. + +Using the Recorder +------------------ + +The Recorder allows to save a bunch of transactions in a JSON file and +rerun them later either in the same environment or in another. + +Saving to JSON allows to easily check the transaction list, tweak input +parameters, change linked library, etc... + +We can find many use cases for the recorder, for instance: +: - After having coded and tested contracts in a constrained + environment (like the JavaScript VM), it could be interesting to + redeploy them easily in a more persisted environment (like a + Geth node) in order to check whether everything behaves normally + in a classic environment. + - Deploying contract does often require more than creating one + transaction. + - Working in a dev environment does often require to setup the + state in a first place. + +![](images/a-runtab-recorder.png) + +Saving a record ends up with the creation of this type of content (see +below): + +In that specific record, 3 transactions are executed: + +The first corresponds to the deployment of the lib `testLib`. + +The second corresponds to the deployment of the contract `test`, the +first parameter of the constructor is set to 11. That contract depends +on a library. The linkage is done using the property `linkReferences`. +In that case we use the addres of the previously created library : +`created{1512830014773}`. the number is the id (timestamp) of the +transaction that leads to the creation of the library. + +The third parameter corresponds to the call to the function `set` of the +contract `test` (the property to is set to: `created{1512830015080}`) . +Input parameters are `1` and +`0xca35b7d915458ef540ade6068dfe2f44e8fa733c` + +all these transactions are created using the value of the accounts +`account{0}`. + +``` +{.sourceCode .none} +{ +"accounts": { + "account{0}": "0xca35b7d915458ef540ade6068dfe2f44e8fa733c" +}, +"linkReferences": { + "testLib": "created{1512830014773}" +}, +"transactions": [ + { + "timestamp": 1512830014773, + "record": { + "value": "0", + "parameters": [], + "abi": "0xbc36789e7a1e281436464229828f817d6612f7b477d66591ff96a9e064bcc98a", + "contractName": "testLib", + "bytecode": "60606040523415600e57600080fd5b60968061001c6000396000f300606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680636d4ce63c146044575b600080fd5b604a6060565b6040518082815260200191505060405180910390f35b6000610d809050905600a165627a7a7230582022d123b15248b8176151f8d45c2dc132063bcc9bb8d5cd652aea7efae362c8050029", + "linkReferences": {}, + "type": "constructor", + "from": "account{0}" + } + }, + { + "timestamp": 1512830015080, + "record": { + "value": "100", + "parameters": [ + 11 + ], + "abi": "0xc41589e7559804ea4a2080dad19d876a024ccb05117835447d72ce08c1d020ec", + "contractName": "test", + "bytecode": "60606040526040516020806102b183398101604052808051906020019091905050806000819055505061027a806100376000396000f300606060405260043610610062576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680632f30c6f61461006757806338cc48311461009e57806362738998146100f357806387cc10e11461011c575b600080fd5b61009c600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610145565b005b34156100a957600080fd5b6100b1610191565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156100fe57600080fd5b6101066101bb565b6040518082815260200191505060405180910390f35b341561012757600080fd5b61012f6101c4565b6040518082815260200191505060405180910390f35b8160008190555080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008054905090565b600073__browser/ballot.sol:testLib____________636d4ce63c6000604051602001526040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b151561022e57600080fd5b6102c65a03f4151561023f57600080fd5b505050604051805190509050905600a165627a7a72305820e0b2510bb2890a0334bfe5613d96db3e72442e63b514cdeaee8fc2c6bbd19d3a0029", + "linkReferences": { + "browser/ballot.sol": { + "testLib": [ + { + "length": 20, + "start": 511 + } + ] + } + }, + "name": "", + "type": "constructor", + "from": "account{0}" + } + }, + { + "timestamp": 1512830034180, + "record": { + "value": "1000000000000000000", + "parameters": [ + 1, + "0xca35b7d915458ef540ade6068dfe2f44e8fa733c" + ], + "to": "created{1512830015080}", + "abi": "0xc41589e7559804ea4a2080dad19d876a024ccb05117835447d72ce08c1d020ec", + "name": "set", + "type": "function", + "from": "account{0}" + } + } +], +"abis": { + "0xbc36789e7a1e281436464229828f817d6612f7b477d66591ff96a9e064bcc98a": [ + { + "constant": true, + "inputs": [], + "name": "get", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + } + ], + "0xc41589e7559804ea4a2080dad19d876a024ccb05117835447d72ce08c1d020ec": [ + { + "constant": true, + "inputs": [], + "name": "getInt", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getFromLib", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getAddress", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_t", + "type": "uint256" + }, + { + "name": "_add", + "type": "address" + } + ], + "name": "set", + "outputs": [], + "payable": true, + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "name": "_r", + "type": "uint256" + } + ], + "payable": true, + "stateMutability": "payable", + "type": "constructor" + } + ] +} +} +``` diff --git a/docs/_build/html/_sources/run_tab.md.txt b/docs/_build/html/_sources/run_tab.md.txt new file mode 100644 index 0000000000..62a8e8fd1c --- /dev/null +++ b/docs/_build/html/_sources/run_tab.md.txt @@ -0,0 +1,282 @@ +Run & Deploy +============ + +The Run tab allows you to send transactions to the current environment. + +To get to the Run & Deploy module - click the run icon in the icon panel. + +In order to use this module you need to have a contract compiled. So if there is file name in the contract pulldown menu ( in the image below it's the pulldown that says **Ballot**), then you can interact with this contract. If nothing is there - then you need to select a contract - make it the active contract in the main panel, ( in the image below - on the right side of the page - in the main panel - you see the ballot.sol so it is the active contract) then go to the compiler module and compile it. + +![](images/a-runtab1.png) + +Run Setup +--------- + +The following settings allow you to directly influence the transaction +execution: + +Environment: + +- `JavaScript VM`: All the transactions will be executed in + a sandbox blockchain in the browser. This means nothing + will be persisted and a page reload will restart a new + blockchain from scratch, the old one will not be saved. + +- `Injected Provider`: Remix will connect to an injected + web3 provider. `Metamask` is an example of + providers that inject web3, thus can be used with this + option. + +- `Web3 Provider`: Remix will connect to a remote node. You + will need to provide the URL address to the selected + provider: geth, parity or any Ethereum client. + +- Account: the list of accounts associated with the current + environment (and their associated balances). + +- Gas Limit: the maximum amount of gas that can be set for all the + transactions created in Remix. + +- Value: the amount of value for the next created transaction (this + value is always reset to 0 after each transaction execution). + + ![](images/a-Runtab-deploy-atAddress.png) + +Initiate Instance +----------------- + +This section contains the list of compiled contracts and 2 actions: + +- `At Address` assumes the given address is an instance of the + selected contract. It is then possible to interact with an already + deployed contract. There's no check at this point, so be careful + when using this feature, and be sure you trust the contract at that + address. + +- `Deploy` send a transaction that deploys the selected contract. When + the transaction is mined, the newly created instance will be added + (this might take several seconds). Note that if the `constructor` + has parameters, you need to specify them. + +Pending Instances +----------------- + +Validating a transaction take several seconds. During this time, the GUI +shows it in a pending mode. When transaction is mined the number of +pending transactions is updated and the transaction is added to the log +(see ../terminal) + +Using the ABI +------------ + +Using `Deploy` or `At Address` is a classic use case of Remix. It is +possible though to interact with a contract by using its ABI. The ABI is +a JSON array which describe its interface. + +To interact with a contract using the ABI, create a new file in Remix +with extension `*.abi` and copy the ABI content to it. Then in the input +next to `At Address`, put the Address of the contract you want to +interact with. Click on `At Address`, a new "connection" with the +contract will popup below. + +Using the Recorder +------------------ + +The Recorder allows to save a bunch of transactions in a JSON file and +rerun them later either in the same environment or in another. + +Saving to JSON allows to easily check the transaction list, tweak input +parameters, change linked library, etc... + +We can find many use cases for the recorder, for instance: +: - After having coded and tested contracts in a constrained + environment (like the JavaScript VM), it could be interesting to + redeploy them easily in a more persisted environment (like a + Geth node) in order to check whether everything behaves normally + in a classic environment. + - Deploying contract does often require more than creating one + transaction. + - Working in a dev environment does often require to setup the + state in a first place. + +![](images/a-runtab-recorder.png) + +Saving a record ends up with the creation of this type of content (see +below): + +In that specific record, 3 transactions are executed: + +The first corresponds to the deployment of the lib `testLib`. + +The second corresponds to the deployment of the contract `test`, the +first parameter of the constructor is set to 11. That contract depends +on a library. The linkage is done using the property `linkReferences`. +In that case we use the addres of the previously created library : +`created{1512830014773}`. the number is the id (timestamp) of the +transaction that leads to the creation of the library. + +The third parameter corresponds to the call to the function `set` of the +contract `test` (the property to is set to: `created{1512830015080}`) . +Input parameters are `1` and +`0xca35b7d915458ef540ade6068dfe2f44e8fa733c` + +all these transactions are created using the value of the accounts +`account{0}`. + +``` +{.sourceCode .none} +{ +"accounts": { + "account{0}": "0xca35b7d915458ef540ade6068dfe2f44e8fa733c" +}, +"linkReferences": { + "testLib": "created{1512830014773}" +}, +"transactions": [ + { + "timestamp": 1512830014773, + "record": { + "value": "0", + "parameters": [], + "abi": "0xbc36789e7a1e281436464229828f817d6612f7b477d66591ff96a9e064bcc98a", + "contractName": "testLib", + "bytecode": "60606040523415600e57600080fd5b60968061001c6000396000f300606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680636d4ce63c146044575b600080fd5b604a6060565b6040518082815260200191505060405180910390f35b6000610d809050905600a165627a7a7230582022d123b15248b8176151f8d45c2dc132063bcc9bb8d5cd652aea7efae362c8050029", + "linkReferences": {}, + "type": "constructor", + "from": "account{0}" + } + }, + { + "timestamp": 1512830015080, + "record": { + "value": "100", + "parameters": [ + 11 + ], + "abi": "0xc41589e7559804ea4a2080dad19d876a024ccb05117835447d72ce08c1d020ec", + "contractName": "test", + "bytecode": "60606040526040516020806102b183398101604052808051906020019091905050806000819055505061027a806100376000396000f300606060405260043610610062576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680632f30c6f61461006757806338cc48311461009e57806362738998146100f357806387cc10e11461011c575b600080fd5b61009c600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610145565b005b34156100a957600080fd5b6100b1610191565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156100fe57600080fd5b6101066101bb565b6040518082815260200191505060405180910390f35b341561012757600080fd5b61012f6101c4565b6040518082815260200191505060405180910390f35b8160008190555080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008054905090565b600073__browser/ballot.sol:testLib____________636d4ce63c6000604051602001526040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b151561022e57600080fd5b6102c65a03f4151561023f57600080fd5b505050604051805190509050905600a165627a7a72305820e0b2510bb2890a0334bfe5613d96db3e72442e63b514cdeaee8fc2c6bbd19d3a0029", + "linkReferences": { + "browser/ballot.sol": { + "testLib": [ + { + "length": 20, + "start": 511 + } + ] + } + }, + "name": "", + "type": "constructor", + "from": "account{0}" + } + }, + { + "timestamp": 1512830034180, + "record": { + "value": "1000000000000000000", + "parameters": [ + 1, + "0xca35b7d915458ef540ade6068dfe2f44e8fa733c" + ], + "to": "created{1512830015080}", + "abi": "0xc41589e7559804ea4a2080dad19d876a024ccb05117835447d72ce08c1d020ec", + "name": "set", + "type": "function", + "from": "account{0}" + } + } +], +"abis": { + "0xbc36789e7a1e281436464229828f817d6612f7b477d66591ff96a9e064bcc98a": [ + { + "constant": true, + "inputs": [], + "name": "get", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + } + ], + "0xc41589e7559804ea4a2080dad19d876a024ccb05117835447d72ce08c1d020ec": [ + { + "constant": true, + "inputs": [], + "name": "getInt", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getFromLib", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getAddress", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_t", + "type": "uint256" + }, + { + "name": "_add", + "type": "address" + } + ], + "name": "set", + "outputs": [], + "payable": true, + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "name": "_r", + "type": "uint256" + } + ], + "payable": true, + "stateMutability": "payable", + "type": "constructor" + } + ] +} +} +``` diff --git a/docs/_build/html/_sources/settings.md.txt b/docs/_build/html/_sources/settings.md.txt new file mode 100644 index 0000000000..2f78eb52f0 --- /dev/null +++ b/docs/_build/html/_sources/settings.md.txt @@ -0,0 +1,14 @@ +Settings +======== + +To get to **Settings** click the gear a the very bottom of the icon panel. + +You can find a link to the homepage (if you closed it) as well as a link to our Gitter Channel and for you aesthetes out there, we now have a rather large list of themes. + +![](images/a-themes.png) + +Another important settings: + +- Text wrap: controls if the text in the editor should be wrapped. + +- Enable optimization: defines if the compiler should enable optimization during compilation. Enabling this option saves execution gas. It is useful to enable optimization for contracts ready to be deployed in production but could lead to some inconsistencies when debugging such a contract. diff --git a/docs/_build/html/_sources/settings_tab.md.txt b/docs/_build/html/_sources/settings_tab.md.txt new file mode 100644 index 0000000000..88f3c7b67e --- /dev/null +++ b/docs/_build/html/_sources/settings_tab.md.txt @@ -0,0 +1,14 @@ +Settings +======== + +To get to **Settings** click the gear a the very bottom of the icon panel. + +You can find a link to the homepage (if you closed it) as well as a link to our Gitter Channel and for you aesthetes out there, we now have a rather large list of themes. + +![](images/a-settings.png) + +Another important settings: + +- Text wrap: controls if the text in the editor should be wrapped. + +- Enable optimization: defines if the compiler should enable optimization during compilation. Enabling this option saves execution gas. It is useful to enable optimization for contracts ready to be deployed in production but could lead to some inconsistencies when debugging such a contract. diff --git a/docs/_build/html/_sources/solidity_editor.md.txt b/docs/_build/html/_sources/solidity_editor.md.txt new file mode 100644 index 0000000000..f492dab9a9 --- /dev/null +++ b/docs/_build/html/_sources/solidity_editor.md.txt @@ -0,0 +1,18 @@ +Solidity Editor +=============== + +The Remix editor recompiles the code each time the current file is +changed or another file is selected. It also provides syntax +highlighting mapped to solidity keywords. + +![](images/a-sol-editor.png) + +Here's the list of some important features: + +- It display opened files as tabs. +- Compilation Warning and Error are displayed in the gutter +- Remix saves the current file continuously (5s after the last + changes) +- +/- on the top left corner enable you to increase/decrease the font + size of the editor + diff --git a/docs/_build/html/_sources/static_analysis.md.txt b/docs/_build/html/_sources/static_analysis.md.txt new file mode 100644 index 0000000000..ac3de2ed7e --- /dev/null +++ b/docs/_build/html/_sources/static_analysis.md.txt @@ -0,0 +1,33 @@ +Analysis +======== + +This section gives information about the last compilation. By default, a +new analysis is run at each compilation. + +The analysis tab gives detailed information about the contract code. It +can help you avoid code mistakes and to enforce best practices. + +![](images/a-static-analysis.png) + +Here is the list of analyzers: + +Security: +- Transaction origin: Warns if tx.origin is used +- Check effects: Avoid potential reentrancy bugs +- Inline assembly: Use of Inline Assembly +- Block timestamp: Semantics maybe unclear +- Low level calls: Semantics maybe unclear +- Block.blockhash usage: Semantics maybe unclear + + +Gas & Economy: +- Gas costs: Warns if the gas requirements of the functions + are too high +- This on local calls: Invocation of local functions via + this + +Miscellaneous: +- Constant functions: Checks for potentially constant + functions +- Similar variable names: Checks if variable names are too + similar diff --git a/docs/_build/html/_sources/support.md.txt b/docs/_build/html/_sources/support.md.txt new file mode 100644 index 0000000000..85dfb873c5 --- /dev/null +++ b/docs/_build/html/_sources/support.md.txt @@ -0,0 +1,9 @@ +Support chat +======================= + +We know that blockchain ecosystem is very new and that lots of information is scattered around the web. +That is why we created a community support chat where we and other users try to answer your questions if +you get stuck using Remix. Please, join [the Remix channel](https://gitter.im/ethereum/remix) and ask the community for help. + +For anyone who is interested in developing a custom plugin for Remix or who wants to contribute to the codebase, +we've opened [another channel](https://gitter.im/ethereum/remix-dev) specially for developers working on Remix tool. diff --git a/docs/_build/html/_sources/support_tab.md.txt b/docs/_build/html/_sources/support_tab.md.txt new file mode 100644 index 0000000000..90ed7a47b2 --- /dev/null +++ b/docs/_build/html/_sources/support_tab.md.txt @@ -0,0 +1,9 @@ +Support tab in Remix +====================== + +This section provides a link to Remix Issues where users can report a +bug or suggest a feature, as well as providing other useful links. It +also displays a [Remix support +channel](http://gitter.im/ethereum/remix) + +![image](images/remix_supporttab.png) diff --git a/docs/_build/html/_sources/terminal.md.txt b/docs/_build/html/_sources/terminal.md.txt new file mode 100644 index 0000000000..56fdb7c2fd --- /dev/null +++ b/docs/_build/html/_sources/terminal.md.txt @@ -0,0 +1,21 @@ +Terminal +======== + +![](images/a-terminal-and-more.png) + +Features, available in the terminal: + +- It integrates a JavaScript interpreter and the `web3` object. It + enables the execution of the JavaScript script which interacts with + the current context. (note that `web3` is only available if the + `web provider` or `injected provider` mode is selected). +- It displays important actions made while interacting with the Remix + IDE (i.e. sending a new transaction). +- It displays transactions that are mined in the current context. You + can choose to display all transactions or only transactions that + refers to the contracts Remix knows (e.g transaction created from + the Remix IDE). +- It allows searching for the data and clearing the logs from the + terminal. +- You can run scripts by inputting them at the bottom after the `>`. + diff --git a/docs/_build/html/_sources/tutorial_debug.md.txt b/docs/_build/html/_sources/tutorial_debug.md.txt new file mode 100644 index 0000000000..f85712faa0 --- /dev/null +++ b/docs/_build/html/_sources/tutorial_debug.md.txt @@ -0,0 +1,239 @@ +Debugging transactions +====================== + +There are two ways to start debugging, each one corresponds to a different use case. +* from the transaction log in the Terminal - use this when you are want to debug a "sucessful" transaction. +* from the Debugger - use this if you have a *transaction hash* or a *block number* with a *transaction index*. + +### Debug from the Transaction GUI - + +Let's start with a basic contract (or replace this one by your own): +- create a blank file in the file explorer (by clicking the + icon) and give it a name. +- copy the code below. +- compile the code. +- click the Run & Deploy icon in the icon panel. + +``` +{.sourceCode .none} - RS why is this here? +pragma solidity >=0.5.1 <0.6.0; +contract Donation { + address owner; + event fundMoved(address _to, uint _amount); + modifier onlyowner { if (msg.sender == owner) _; } + address[] _giver; + uint[] _values; + + constructor() public { + owner = msg.sender; + } + + function donate() payable public { + addGiver(msg.value); + } + + function moveFund(address payable _to, uint _amount) onlyowner public { + uint balance = address(this).balance; + uint amount = _amount; + if (_amount <= balance) { + if (_to.send(balance)) { + emit fundMoved(_to, _amount); + } else { + revert(); + } + } else { + revert(); + } + } + + function addGiver(uint _amount) internal { + _giver.push(msg.sender); + _values.push(_amount); + } +} +``` + +For the purpose of this tutorial, we will run the `JavaScript VM`. +This simulates a custom blockchain. You could do the same using a proper backend node. + +Let's deploy the contract: + +Click the `Deploy` button + +![](images/a-debug1-deploy.png) + +You'll see the deployed instance (AKA the udapp). + +![](images/a-debug2-udapp1a.png) + +Then open it up (by clicking the caret). + +![](images/a-debug3-udapp2.png) + + +We are going to call the `Donate` function and will send it ether. + +To do this: in the value input box put in **2** and select Ether as the unit (and not wei like I did in the image below - well you could - it won't really change anything). + +![](images/a-debug4-value-loc.png) + +Then click the `Donate` button. + +This will send Ether to the this function. + +Because we are using the `JavaScript VM`, everything happens almost instantly. (If we had been using Injected Web 3, then we would have to need to approve the transaction, pay for gas and wait for the transaction to get mined.) + +Remix displays information related to each transaction result in the terminal. + +Check in the **terminal** where the transaction you just made is logged. + +Click the debug button to start debugging it. + +![](images/a-debug5-term-debug-but.png) + +### From the Debugger + +Click the bug icon in the icon panel to get to the debugger in the side panel. If you don't see the bug icon go to the plugin manager and activate the debugger. + +You can start a debug session by providing either a `transaction hash` +or a `block number` and `transaction index`. + +To find a transaction hash +1. go to a transaction in the terminal. +2. Click a line with a transaction - to exand the log. +3. Copy the transaction has locate there. + +![image](remix3.png) + +Then click on the `start debugging` button. + +Using the debugger +------------------ + +The debugger allows one to see detailed informations about the +transaction's execution. It uses the editor to display the +location in the source code where the current execution is. + +The transaction panel displays basic information about the current +transaction. + +![image](remix_debugtransactioninfo.png) + +The navigation part contains a slider and buttons that can be used to +step through the transaction execution. + +From the left to the right: + +step over back, step into back, step into forward, step over forward, +jump out (jump out of the current call), jump to the previous +breakpoint, jump to the next breakpoint. + +![image](remix_navigation.png) + +11 panels give detailed information about the execution: + +### Instructions + +![image](remix_debuginstructions.png) + +The Instructions panel displays the bytecode of the current executing +contract- with the current step highlighted. + +Important note: When this panel is hidden, the slider will have a +courser granularity and only stop at *expression boundaries*, even if they +are compiled into multiple EVM instructions. When the panel is +displayed, it will be possible to step over every instruction, even +those that refers to the same expression. + +### Solidity Locals + +![image](remix_soliditylocals.png) + +The Solidity Locals panel displays local variables associated with the +current context. + +### Solidity State + +![image](remix_soliditystate.png) + +The Solidity State panel displays state variables of the current +executing contract. + +### Low level panels + +These panels display low level informations about the execution: + +> - Stack +> - Storages Changes +> - Memory +> - Call Data +> - Call Stack +> - Return Value (only if the current step is a RETURN opcode) +> - Full Storages Changes (only at the end of the execution - display +> every storage change of every modified contract) + +### Reverted Transaction + +A transaction could be `reverted` (because of an *out of gas exception* or +Solidity `revert` statement or because of a low level exception). + +It is important to be aware of the exception and to locate +where the exception is in the source code. + +Remix will warn you when the execution throws an exception. The +`warning` button will jump to the last opcode before the exception +happened. + +![image](remix_executionexception.png) + +### Breakpoints + +The two last buttons from the navigation area are used to jump either +back to the previous breakpoint or forward to the next breakpoint. + +Breakpoints can be added and removed by clicking on the line number in the *Editor*. + +![image](remix_breakpoint.png) + +When using debug session with breakpoints, the execution will jump to the first +encountered breakpoint. + +**Important note:** If you add a breakpoint to a line that declares a +variable, it might be triggered twice: Once for initializing the +variable to zero and second time for assigning the actual value. As an +example, assume you are debugging the following contract: + +(RS - what is the {.sourceCode .none} doing?) +``` +{.sourceCode .none} +pragma solidity >=0.5.1 <0.6.0; + +contract ctr { + function hid () public { + uint p = 45; + uint m; + m = 89; + uint l = 34; + } +} +``` + +And let's says that breakpoints are set for the lines + +`uint p = 45;` + +`m = 89;` + +`uint l = 34;` + +then clicking on `Jump to next breakpoint` will stop at the following +lines in the given order: + +> `uint p = 45;` (declaration of p) +> +> `uint l = 34;` (declaration of l) +> +> `uint p = 45;` (45 assigned to p) +> +> `m = 89;` (89 assigned to m) +> +> `uint l = 34;` (34 assigned to l) diff --git a/docs/_build/html/_sources/tutorial_eattheblock.md.txt b/docs/_build/html/_sources/tutorial_eattheblock.md.txt new file mode 100644 index 0000000000..ad8e80349c --- /dev/null +++ b/docs/_build/html/_sources/tutorial_eattheblock.md.txt @@ -0,0 +1,10 @@ +Eat the Block tutorials +======================= + +This section list Remix related tutorials: + +[Youtube channel](https://www.youtube.com/playlist?list=PLbbtODcOYIoH7597VZ4sTXRKJkuhMAqYy) + +[Introduction](https://www.youtube.com/watch?v=4CsH5xTxhSA&index=3&t=738s&list=PLbbtODcOYIoH7597VZ4sTXRKJkuhMAqYy) + +[Remix File explorer](https://www.youtube.com/watch?v=nAI_Cr5Y8JY) diff --git a/docs/_build/html/_sources/tutorial_geth-remix.md.txt b/docs/_build/html/_sources/tutorial_geth-remix.md.txt new file mode 100644 index 0000000000..ec096a1fda --- /dev/null +++ b/docs/_build/html/_sources/tutorial_geth-remix.md.txt @@ -0,0 +1,279 @@ +Debugging a Dapp using Remix & Geth +========================================== + +The ultimate goal of this tutorial is to debug transactions that have +been created by a dapp front end. + +It is easy in Remix to debug a transaction created from its own GUI. +However, setting up an environment that allows you to debug transactions +created outside of Remix, require a bit more of complexity. + +We will need four tools for that : + +> - Geth - this is the center piece and provides the blockchain +> environment. We will basically run geth in a dev mode. +> - Remix - this is the Ethereum IDE. We will use it to develop our +> Solidity contract. +> - Any code editor you want - in order to write your front end :) + +Install the environment +----------------------- + +### Install Metamask + +Basically we will run our front end in the Metamask Chrome plugin ([Metamask](http://metamask.io)). + +### Install Geth + +[Geth](http://github.com/ethereum/go-ethereum/releases) is the official +Ethereum client. + +Running the environment +----------------------- + +### Run Geth + +We will run a test node. This node will have a new empty state and will +not be synced to the main or ropsten network. + + geth --ipcpath /geth.ipc --datadir --dev console + +`` is the folder where keys and chain data will be +stored. + +`--ipcpath` defines the end point that other apps (like Metamask) use to +talk to geth. + +`--datadir` specifies the data directory. + +`--dev` sets the node into private chain mode and adds some debugging +flags. + +Then we need to create accounts and mine a bit to generate some Ether: + + // from the geth console : + personal.newAccount() // You can execute this command several time if you need more than one account. + miner.start() // generate some Ether. + miner.stop() // stop mining after 30s-60s - we could also keep mining. + +Next time we run Geth, we will only need to mine transactions (no need +to recreate account). + + +### Starting Remix + +In Mist click on `Develop` / `Open Remix IDE` + +Remix will open in a new window. If this is the first time it is run, +the `Ballot` contract will be loaded. + +Now, we need to check if Remix is connected to Mist: + +Right panel / third tab from the left, `Injected Provider` should be +checked. + +![image](remix4.png) + +Right panel / second tab from the left, `Transaction Origin` should +contain accounts we have previously created in Geth. + +![image](remix5.png) + +Developing contract / front end +------------------------------- + +### Donation contract - Dapp Back end + +Here is a sample solidity contract. + +Copy and paste the following inside remix: + +``` +{.sourceCode .none} +contract Donation { + address owner; + event fundMoved(address _to, uint _amount); + modifier onlyowner { if (msg.sender == owner) _; } + address[] _giver; + uint[] _values; + + function Donation() { + owner = msg.sender; + } + + function donate() payable { + addGiver(msg.value); + } + + function moveFund(address _to, uint _amount) onlyowner { + uint balance = this.balance; + uint amount = _amount; + if (_amount <= this.balance) { + if (_to.send(this.balance)) { + fundMoved(_to, _amount); + } else { + throw; + } + } else { + throw; + } + } + + function addGiver(uint _amount) internal { + _giver.push(msg.sender); + _values.push(_amount); + } +} +``` + +### Dapp Front end + +and here is the front end: + +```html +
+
Donation Contract
+
+ +
+
+
+ +
+
+ +
+
+
+
+
+
+
+
+
+ + +``` + +I would suggest serving this file using `http-serve`, but you can use +any web server you like. + +Example: Dapp Front End + +### Important notice ! + +The variable `contractspec` contains the abi of the `donation` contract. +This means that if you change something in the contract interface +(function names, parameters, ...) you need to copy the new abi from +remix to the front end. + +Deploying +--------- + +Right panel / Red button `Create` + +![image](remix1.png) + +This creates a new transaction that deploys the `Donation` contract +(Mist will ask for the usual passphrase check). + +Wait for the transaction to be mined (don't forget to activate mining +`miner.start()`). Once this is done, you can use it by executing the +`moveFund` and `donate` function. But this is not what we want to +achieve. We want to run and debug those functions from the front end. + +Remix also display the address of the contract. Save it, we'll need this +address later. + +![image](remix2.png) + +Debugging +--------- + +From Mist, browse the above front end. In the first field, paste the +address of the newly created contract. Now, let's call the first +function (label `give`). + +You will need an account and a value. + +The account could be any account that is declared in the Wallet section +of Mist. This is the sender of the transaction that we are going to +create. The value should be no more than the actual balance of the +account - the unit is in wei, so just put `100` (100 wei), that should +be fine. + +Click on `Give` and wait for the transaction to be mined. + +The HTML block with id `log` is filled by all the transactions created +from the front end. It was easier for the purpose of this tutorial to +just log transactions in a div but you can have your own logging +mechanism. + +There is only one field that we need, this is the `transactionHash`. + +Copy it and switch to Remix. On the right side, the fifth panel shows a +small "bug" icon, that is the debugger. + +Paste the hash into the transaction field and click on the `play` +button. + +![image](remix3.png) + +You are now entering a debug session for the call to `donate`. + +Debugging in Remix is easier than with common tools like gdb because you +can freely move in time. Use the slider to change the current step and +click on the panels below to expand them and explore the curret state, +local variables, etc. There are also breakpoints to move between +sections of the code quickly, but more on all that later. + +At the time of this writing, there is an issue that could break the +contract creation. The a workaround for that at + . Please follow +the workaround or wait for this issue to be closed. + +Also, although retrieving a contract's storage when Remix is using the +JavaScript VM is working well, there is still work to be done when Remix +is using eth or geth as backend. diff --git a/docs/_build/html/_sources/tutorial_import.md.txt b/docs/_build/html/_sources/tutorial_import.md.txt new file mode 100644 index 0000000000..dc1e41f2f9 --- /dev/null +++ b/docs/_build/html/_sources/tutorial_import.md.txt @@ -0,0 +1,39 @@ +Importing Source Files in Solidity +================================== + +This tutorial will show you how to import local and external files. + +The compilation result will also contain contracts implemented in the +imported files. + +For a detailed explanation of the `import` keyword see the +[Solidity documentation](https://solidity.readthedocs.io/en/develop/layout-of-source-files.html?highlight=import#importing-other-source-files) + + +Importing a file from the browser's local storage +------------------------------------------------- + +Files in Remix can be imported just by specifying their path. Please use ./ for relative paths to increase portability. +![](images/a-old-tuto_basicimport.png) + +Importing a file from your computer's filesystem +------------------------------------------------- + +This method uses remixd - the remix daemon. Please go to the [remixd tutorial](remixd.html) for instructions about how to bridge the divide between the browser and your computers filesystem. + + +Importing from GitHub +--------------------- + +It is possible to import files directly from GitHub with URLs like +`https://github.com///`. + +![](images/a-old-tuto_importgit.png) + +Importing from Swarm +-------------------- + +Files can be imported using all URLs supported by swarm. If you do not +have a swarm node, swarm-gateways.net will be used instead. + +![](images/a-old-tuto_importswarm.png) diff --git a/docs/_build/html/_sources/tutorial_mist.md.txt b/docs/_build/html/_sources/tutorial_mist.md.txt new file mode 100644 index 0000000000..568cf34b46 --- /dev/null +++ b/docs/_build/html/_sources/tutorial_mist.md.txt @@ -0,0 +1,309 @@ +Debugging a Dapp using Remix - Mist - Geth +========================================== + +The ultimate goal of this tutorial is to debug transactions that have +been created by a dapp front end. + +It is easy in Remix to debug a transaction created from its own GUI. +However, setting up an environment that allows you to debug transactions +created outside of Remix, require a bit more of complexity. + +We will need four tools for that : + +> - Geth - this is the center piece and provides the blockchain +> environment. We will basically run geth in a dev mode. +> - Mist - this is the Ethereum dapp browser. We will use it to browse +> our front end. +> - Remix - this is the Ethereum IDE. We will use it to develop our +> Solidity contract. +> - Any code editor you want - in order to write your front end :) + +Install the environment +----------------------- + +### Install Mist + +Mist is the Ethereum browser and the entry point of a Dapp. + +Please download [the latest +version](http://github.com/ethereum/mist/releases) (at least 0.8.9). + +Basically we will always run our front end in Mist (note that it is also +possible to use [Metamask](http://metamask.io)). + +### Install Geth + +[Geth](http://github.com/ethereum/go-ethereum/releases) is the official +Ethereum client. + +Running the environment +----------------------- + +### Run Geth + +We will run a test node. This node will have a new empty state and will +not be synced to the main or ropsten network. + + geth --ipcpath /geth.ipc --datadir --dev console + +`` is the folder where keys and chain data will be +stored. + +`--ipcpath` defines the end point that other apps (like Mist) use to +talk to geth. + +`--datadir` specifies the data directory. + +`--dev` sets the node into private chain mode and adds some debugging +flags. + +Then we need to create accounts and mine a bit to generate some Ether: + + // from the geth console : + personal.newAccount() // You can execute this command several time if you need more than one account. + miner.start() // generate some Ether. + miner.stop() // stop mining after 30s-60s - we could also keep mining. + +Next time we run Geth, we will only need to mine transactions (no need +to recreate account). + +### Run Mist + +If we run Mist without any argument, its internal Geth node will run. As +we have our own we need to specify the ipc path of the node installed +above. + + mist --rpc /geth.ipc + +(yes the option is --rpc) + +Once Mist is started, verify that it is connected to the test node +(that's very important!!). + +On the bottom left, check that the network is `Private-net` and that the +block number is the same as reported by the test node we are currently +running. Run the following command in the Geth Console to check: +web3.eth.blockNumber. + +![image](mist1.png) + +Clicking on Wallet will allow you to send transactions and check account +balances (if you are currently mining you should see the balance +increasing). + +### Starting Remix + +In Mist click on `Develop` / `Open Remix IDE` + +Remix will open in a new window. If this is the first time it is run, +the `Ballot` contract will be loaded. + +Now, we need to check if Remix is connected to Mist: + +Right panel / third tab from the left, `Injected Provider` should be +checked. + +![image](remix4.png) + +Right panel / second tab from the left, `Transaction Origin` should +contain accounts we have previously created in Geth. + +![image](remix5.png) + +Developing contract / front end +------------------------------- + +### Donation contract - Dapp Back end + +Here is a sample solidity contract. + +Copy and paste the following inside remix: + +``` {.sourceCode .none} +contract Donation { + address owner; + event fundMoved(address _to, uint _amount); + modifier onlyowner { if (msg.sender == owner) _; } + address[] _giver; + uint[] _values; + + function Donation() { + owner = msg.sender; + } + + function donate() payable { + addGiver(msg.value); + } + + function moveFund(address _to, uint _amount) onlyowner { + uint balance = this.balance; + uint amount = _amount; + if (_amount <= this.balance) { + if (_to.send(this.balance)) { + fundMoved(_to, _amount); + } else { + throw; + } + } else { + throw; + } + } + + function addGiver(uint _amount) internal { + _giver.push(msg.sender); + _values.push(_amount); + } +} +``` + +### Dapp Front end + +and here is the front end: + +``` {.sourceCode .none} +
+
Donation Contract
+
+ +
+
+
+ +
+
+ +
+
+
+
+
+
+
+
+
+ + +``` + +I would suggest serving this file using `http-serve`, but you can use +any web server you like. + +Example: Dapp Front End + +### Important notice ! + +The variable `contractspec` contains the abi of the `donation` contract. +This means that if you change something in the contract interface +(function names, parameters, ...) you need to copy the new abi from +remix to the front end. + +Deploying +--------- + +Right panel / Red button `Create` + +![image](remix1.png) + +This creates a new transaction that deploys the `Donation` contract +(Mist will ask for the usual passphrase check). + +Wait for the transaction to be mined (don't forget to activate mining +`miner.start()`). Once this is done, you can use it by executing the +`moveFund` and `donate` function. But this is not what we want to +achieve. We want to run and debug those functions from the front end. + +Remix also display the address of the contract. Save it, we'll need this +address later. + +![image](remix2.png) + +Debugging +--------- + +From Mist, browse the above front end. In the first field, paste the +address of the newly created contract. Now, let's call the first +function (label `give`). + +You will need an account and a value. + +The account could be any account that is declared in the Wallet section +of Mist. This is the sender of the transaction that we are going to +create. The value should be no more than the actual balance of the +account - the unit is in wei, so just put `100` (100 wei), that should +be fine. + +Click on `Give` and wait for the transaction to be mined. + +The HTML block with id `log` is filled by all the transactions created +from the front end. It was easier for the purpose of this tutorial to +just log transactions in a div but you can have your own logging +mechanism. + +There is only one field that we need, this is the `transactionHash`. + +Copy it and switch to Remix. On the right side, the fifth panel shows a +small "bug" icon, that is the debugger. + +Paste the hash into the transaction field and click on the `play` +button. + +![image](remix3.png) + +You are now entering a debug session for the call to `donate`. + +Debugging in Remix is easier than with common tools like gdb because you +can freely move in time. Use the slider to change the current step and +click on the panels below to expand them and explore the curret state, +local variables, etc. There are also breakpoints to move between +sections of the code quickly, but more on all that later. + +At the time of this writing, there is an issue that could break the +contract creation. The a workaround for that at + . Please follow +the workaround or wait for this issue to be closed. + +Also, although retrieving a contract's storage when Remix is using the +JavaScript VM is working well, there is still work to be done when Remix +is using eth or geth as backend. diff --git a/docs/_build/html/_sources/tutorial_remixd_filesystem.md.txt b/docs/_build/html/_sources/tutorial_remixd_filesystem.md.txt new file mode 100644 index 0000000000..2537628a27 --- /dev/null +++ b/docs/_build/html/_sources/tutorial_remixd_filesystem.md.txt @@ -0,0 +1,50 @@ +Access your local filesystem by using remixd +=================================================== + +`remixd` is an npm module. Its purpose is to give the remix web +application access to a folder from your local computer. + +The code of `remixd` can be checked out +[here](https://github.com/ethereum/remixd) . + +`remixd` can be globally installed using the following command: +`npm install -g remixd`. + +Then `remixd -s --remix-ide ` will start `remixd` +and share the given folder. + +For example, to sync your local folder to the official Remix IDE, +`remixd -s --remix-ide https://remix.ethereum.org` + +The folder is shared using a websocket connection between `Remix IDE` +and `remixd`. + +Be sure the user executing `remixd` has read/write permission on the +folder. + +There is an option to run remixd in read-only mode, use `--read-only` flag. + +**Warning!** + +`remixd` provides `full read and write access` to the given folder for `any +application` that can access the `TCP port 65520` on your local host. + +From `Remix IDE`, you will need to activate the connection. + +Click on the `localhost connection` icon: + +![image](remixd_noconnection.png) + +A modal dialog will ask confirmation + +![image](remixd_alert.png) + +Accepting this dialog will start a session. Once the connection is made, +the status will update and the connection icon should shows up in green. + +Hovering the icon will give more connection status information. + +At this point if the connection is successful, the shared folder will be +available in the file explorer. + +![image](remixd_connectionok.png) diff --git a/docs/_build/html/_sources/udapp.md.txt b/docs/_build/html/_sources/udapp.md.txt new file mode 100644 index 0000000000..fd464e9ab1 --- /dev/null +++ b/docs/_build/html/_sources/udapp.md.txt @@ -0,0 +1,52 @@ +Run & Deploy (part 2) +===================== + +## Deployed contracts + +This section in the Run tab contains a list of deployed contracts to interact with through autogenerated UI of the deployed contract (also called udapp). + +The deployed contract appears but is in its collapsed form. + +![](images/a-debug2-udapp1a.png) + +Click the sideways caret to open it up. + +![](images/a-debug3-udapp2.png) + +You will see the functions in the contract. The functions buttons can have different color buttons. + +- Functions that are `constant` or `pure` functions in Solidity have a blue buttons. Clicking one of this type does not create a new transaction. So clicking will not cause state changes - it will only return a value stored in the contract - so it won't cost you anything in gas fees. + +- Functions that changes the state of the contract are orange, clicking this type of function will cost gas and they do change the state of the contract and so they do create a new transaction. +But this transaction does not accept Ether. + +- Functions that have red buttons are `payable` functions in Solidity. Clicking one of these will create a new transaction and this transaction can accept a **value**. The **value** is put in in the Value field which is under the Gas Limit field. + +![](images/a-jvm-calling-instance.png) + + +For more information see more about [Solidity +modifier](http://solidity.readthedocs.io/en/develop/miscellaneous.html?highlight=pure#modifiers) +. + +If a function requires input parameters, well, you have to put them in. + +## Inputting parameters + +![](images/a-udapp-inputs.png) + +The input box tells you what type each parameter needs to be. + +Numbers and addresses do not need to be wrapped in double quotes. Strings need to be wrapped. + +When using the input box for parameters in its "up" display, the parameters need to be separated by a comma. In the example above the "delegate" function has 3 parameters. + +Clicking the 'down' caret brings you to the *Multi-param Manager* - where you can input the parameters one at a time. + +![](images/a-udapp-multi-param-man.png) + +In the *Multi-param Manager*, strings do not need to be wrapped. + +Clicking the clipboard icon will encode the inputs and will copy them. Only a valid set of inputs can be encoded. + +So if you made a mistake and put a uint8 where an address should have been, clicking the clipboard here will give you an error. diff --git a/docs/_build/html/_sources/unittesting.md.txt b/docs/_build/html/_sources/unittesting.md.txt new file mode 100644 index 0000000000..27720f7f38 --- /dev/null +++ b/docs/_build/html/_sources/unittesting.md.txt @@ -0,0 +1,41 @@ +Unit Testing +============ + +Click the "double check" icon to get to the unit testing plugin. If you don't see this icon, go to the plugin manager and load up the unit testing plugin. + +![](images/a-unit-testing1.png) + +Generate test File +------------------ + +This create a new solidity file in the current folder suffixed with `_test`. +This file contains the minimun you need for running unit testing. + +Run Tests +--------- + +This execute tests. The execution is run in a separate environment and the result is displayed below. + +| Available functions | Supported types | + +| ------------- | ------------- | + +| `Assert.ok()` | `bool` | + +| `Assert.equal()` | `uint`, `int`, `bool`, `address`, `bytes32`, `string` | + +| `Assert.notEqual()` | `uint`, `int`, `bool`, `address`, `bytes32`, `string` | + +| `Assert.greaterThan()` | `uint`, `int` | + +| `Assert.lesserThan()` | `uint`, `int` | + +see [https://github.com/ethereum/remix/blob/master/remix-tests/tests/examples_4/SafeMath_test.sol](https://github.com/ethereum/remix/blob/master/remix-tests/tests/examples_4/SafeMath_test.sol) for some code sample + +Continuous integration +---------------------- + +remix-tests is also a CLI, it can be used in a continuous integration environement which support node.js. +Please find more information in the [remix-test repository](https://github.com/ethereum/remix/tree/master/remix-tests) + +See also: example [Su Squares contract](https://github.com/su-squares/ethereum-contract/tree/e542f37d4f8f6c7b07d90a6554424268384a4186) and [Travis build](https://travis-ci.org/su-squares/ethereum-contract/builds/446186067) that uses remix-tests for continuous integration testing. diff --git a/docs/_build/html/_sources/unittesting_tab.md.txt b/docs/_build/html/_sources/unittesting_tab.md.txt new file mode 100644 index 0000000000..27720f7f38 --- /dev/null +++ b/docs/_build/html/_sources/unittesting_tab.md.txt @@ -0,0 +1,41 @@ +Unit Testing +============ + +Click the "double check" icon to get to the unit testing plugin. If you don't see this icon, go to the plugin manager and load up the unit testing plugin. + +![](images/a-unit-testing1.png) + +Generate test File +------------------ + +This create a new solidity file in the current folder suffixed with `_test`. +This file contains the minimun you need for running unit testing. + +Run Tests +--------- + +This execute tests. The execution is run in a separate environment and the result is displayed below. + +| Available functions | Supported types | + +| ------------- | ------------- | + +| `Assert.ok()` | `bool` | + +| `Assert.equal()` | `uint`, `int`, `bool`, `address`, `bytes32`, `string` | + +| `Assert.notEqual()` | `uint`, `int`, `bool`, `address`, `bytes32`, `string` | + +| `Assert.greaterThan()` | `uint`, `int` | + +| `Assert.lesserThan()` | `uint`, `int` | + +see [https://github.com/ethereum/remix/blob/master/remix-tests/tests/examples_4/SafeMath_test.sol](https://github.com/ethereum/remix/blob/master/remix-tests/tests/examples_4/SafeMath_test.sol) for some code sample + +Continuous integration +---------------------- + +remix-tests is also a CLI, it can be used in a continuous integration environement which support node.js. +Please find more information in the [remix-test repository](https://github.com/ethereum/remix/tree/master/remix-tests) + +See also: example [Su Squares contract](https://github.com/su-squares/ethereum-contract/tree/e542f37d4f8f6c7b07d90a6554424268384a4186) and [Travis build](https://travis-ci.org/su-squares/ethereum-contract/builds/446186067) that uses remix-tests for continuous integration testing. diff --git a/docs/_build/html/_sources/workshop_Building_smart_contracts_with_Remix.md.txt b/docs/_build/html/_sources/workshop_Building_smart_contracts_with_Remix.md.txt new file mode 100644 index 0000000000..2f975fd7af --- /dev/null +++ b/docs/_build/html/_sources/workshop_Building_smart_contracts_with_Remix.md.txt @@ -0,0 +1,14 @@ +Building Smart Contracts with Remix +======================= + +We prepared a tutorial that will help you build DApps with Remix. In this tutorial, you learn how to build smart contracts, how to deploy them and how to interact with them. Then we show you how to connect your frontend with the blockchain by using web3.js. + +### Let's get started + +These tutorials were used in workshops at ethCC, Edcon, and DappCon. They are using the old interface. We will be updating these slides in the near future. + +You can [watch the Edcon presentation talk](https://www.youtube.com/watch?v=nAI_Cr5Y8JY) and here are the [workshop slides](https://slides.com/ninabreznik/deck-11-13#/). +(May 3, 2018) + +Here are the [latest slides (hosted on swarm)](http://30400.swarm-gateways.net/bzz:/49277e2a16baf5576c9f54204c70dc403a425c3df85424864fe04ad6dfc609bc/) and here are the [latest slides (not on swarm)](https://www.updig.is/pdf/remix-chez-coinhouse.pdf). +(Oct 16, 2018) \ No newline at end of file diff --git a/docs/_build/html/_static/basic.css b/docs/_build/html/_static/basic.css new file mode 100644 index 0000000000..53acd096ab --- /dev/null +++ b/docs/_build/html/_static/basic.css @@ -0,0 +1,748 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li div.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 450px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a.brackets:before, +span.brackets > a:before{ + content: "["; +} + +a.brackets:after, +span.brackets > a:after { + content: "]"; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px 7px 0 7px; + background-color: #ffe; + width: 40%; + float: right; +} + +p.sidebar-title { + font-weight: bold; +} + +/* -- topics ---------------------------------------------------------------- */ + +div.topic { + border: 1px solid #ccc; + padding: 7px 7px 0 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +div.admonition dl { + margin-bottom: 0; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +table.footnote td, table.footnote th { + border: 0 !important; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > p:first-child, +td > p:first-child { + margin-top: 0px; +} + +th > p:last-child, +td > p:last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist td { + vertical-align: top; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +li > p:first-child { + margin-top: 0px; +} + +li > p:last-child { + margin-bottom: 0px; +} + +dl.footnote > dt, +dl.citation > dt { + float: left; +} + +dl.footnote > dd, +dl.citation > dd { + margin-bottom: 0em; +} + +dl.footnote > dd:after, +dl.citation > dd:after { + content: ""; + clear: both; +} + +dl.field-list { + display: flex; + flex-wrap: wrap; +} + +dl.field-list > dt { + flex-basis: 20%; + font-weight: bold; + word-break: break-word; +} + +dl.field-list > dt:after { + content: ":"; +} + +dl.field-list > dd { + flex-basis: 70%; + padding-left: 1em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > p:first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0.5em; + content: ":"; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; +} + +td.linenos pre { + padding: 5px 0px; + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + margin-left: 0.5em; +} + +table.highlighttable td { + padding: 0 0.5em 0 0.5em; +} + +div.code-block-caption { + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +div.code-block-caption + div > div.highlight > pre { + margin-top: 0; +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + padding: 1em 1em 0; +} + +div.literal-block-wrapper div.highlight { + margin: 0; +} + +code.descname { + background-color: transparent; + font-weight: bold; + font-size: 1.2em; +} + +code.descclassname { + background-color: transparent; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: relative; + left: 0px; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/docs/_build/html/_static/css/badge_only.css b/docs/_build/html/_static/css/badge_only.css new file mode 100644 index 0000000000..3c33cef545 --- /dev/null +++ b/docs/_build/html/_static/css/badge_only.css @@ -0,0 +1 @@ +.fa:before{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-weight:normal;font-style:normal;src:url("../fonts/fontawesome-webfont.eot");src:url("../fonts/fontawesome-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/fontawesome-webfont.woff") format("woff"),url("../fonts/fontawesome-webfont.ttf") format("truetype"),url("../fonts/fontawesome-webfont.svg#FontAwesome") format("svg")}.fa:before{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;text-decoration:inherit}a .fa{display:inline-block;text-decoration:inherit}li .fa{display:inline-block}li .fa-large:before,li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-0.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before,ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before{content:""}.icon-book:before{content:""}.fa-caret-down:before{content:""}.icon-caret-down:before{content:""}.fa-caret-up:before{content:""}.icon-caret-up:before{content:""}.fa-caret-left:before{content:""}.icon-caret-left:before{content:""}.fa-caret-right:before{content:""}.icon-caret-right:before{content:""}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;z-index:400}.rst-versions a{color:#2980B9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27AE60;*zoom:1}.rst-versions .rst-current-version:before,.rst-versions .rst-current-version:after{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book{float:left}.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#E74C3C;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#F1C40F;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:gray;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:solid 1px #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge .fa-book{float:none}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book{float:left}.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge .rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width: 768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} diff --git a/docs/_build/html/_static/css/theme.css b/docs/_build/html/_static/css/theme.css new file mode 100644 index 0000000000..aed8cef066 --- /dev/null +++ b/docs/_build/html/_static/css/theme.css @@ -0,0 +1,6 @@ +/* sphinx_rtd_theme version 0.4.3 | MIT license */ +/* Built 20190212 16:02 */ +*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}[hidden]{display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:hover,a:active{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;color:#000;text-decoration:none}mark{background:#ff0;color:#000;font-style:italic;font-weight:bold}pre,code,.rst-content tt,.rst-content code,kbd,samp{font-family:monospace,serif;_font-family:"courier new",monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:before,q:after{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}ul,ol,dl{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure{margin:0}form{margin:0}fieldset{border:0;margin:0;padding:0}label{cursor:pointer}legend{border:0;*margin-left:-7px;padding:0;white-space:normal}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0;*width:13px;*height:13px}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top;resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none !important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{html,body,section{background:none !important}*{box-shadow:none !important;text-shadow:none !important;filter:none !important;-ms-filter:none !important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:.5cm}p,h2,.rst-content .toctree-wrapper p.caption,h3{orphans:3;widows:3}h2,.rst-content .toctree-wrapper p.caption,h3{page-break-after:avoid}}.fa:before,.wy-menu-vertical li span.toctree-expand:before,.wy-menu-vertical li.on a span.toctree-expand:before,.wy-menu-vertical li.current>a span.toctree-expand:before,.rst-content .admonition-title:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content dl dt .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content .code-block-caption .headerlink:before,.rst-content tt.download span:first-child:before,.rst-content code.download span:first-child:before,.icon:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-alert,.rst-content .note,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .warning,.rst-content .seealso,.rst-content .admonition-todo,.rst-content .admonition,.btn,input[type="text"],input[type="password"],input[type="email"],input[type="url"],input[type="date"],input[type="month"],input[type="time"],input[type="datetime"],input[type="datetime-local"],input[type="week"],input[type="number"],input[type="search"],input[type="tel"],input[type="color"],select,textarea,.wy-menu-vertical li.on a,.wy-menu-vertical li.current>a,.wy-side-nav-search>a,.wy-side-nav-search .wy-dropdown>a,.wy-nav-top a{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:""}.clearfix:after{clear:both}/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url("../fonts/fontawesome-webfont.eot?v=4.7.0");src:url("../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0") format("embedded-opentype"),url("../fonts/fontawesome-webfont.woff2?v=4.7.0") format("woff2"),url("../fonts/fontawesome-webfont.woff?v=4.7.0") format("woff"),url("../fonts/fontawesome-webfont.ttf?v=4.7.0") format("truetype"),url("../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular") format("svg");font-weight:normal;font-style:normal}.fa,.wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.current>a span.toctree-expand,.rst-content .admonition-title,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink,.rst-content p.caption .headerlink,.rst-content table>caption .headerlink,.rst-content .code-block-caption .headerlink,.rst-content tt.download span:first-child,.rst-content code.download span:first-child,.icon{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.3333333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.2857142857em;text-align:center}.fa-ul{padding-left:0;margin-left:2.1428571429em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.1428571429em;width:2.1428571429em;top:.1428571429em;text-align:center}.fa-li.fa-lg{left:-1.8571428571em}.fa-border{padding:.2em .25em .15em;border:solid 0.08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.wy-menu-vertical li span.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a span.fa-pull-left.toctree-expand,.wy-menu-vertical li.current>a span.fa-pull-left.toctree-expand,.rst-content .fa-pull-left.admonition-title,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content dl dt .fa-pull-left.headerlink,.rst-content p.caption .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.rst-content code.download span.fa-pull-left:first-child,.fa-pull-left.icon{margin-right:.3em}.fa.fa-pull-right,.wy-menu-vertical li span.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a span.fa-pull-right.toctree-expand,.wy-menu-vertical li.current>a span.fa-pull-right.toctree-expand,.rst-content .fa-pull-right.admonition-title,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content dl dt .fa-pull-right.headerlink,.rst-content p.caption .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.rst-content code.download span.fa-pull-right:first-child,.fa-pull-right.icon{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.wy-menu-vertical li span.pull-left.toctree-expand,.wy-menu-vertical li.on a span.pull-left.toctree-expand,.wy-menu-vertical li.current>a span.pull-left.toctree-expand,.rst-content .pull-left.admonition-title,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content dl dt .pull-left.headerlink,.rst-content p.caption .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content .code-block-caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.rst-content code.download span.pull-left:first-child,.pull-left.icon{margin-right:.3em}.fa.pull-right,.wy-menu-vertical li span.pull-right.toctree-expand,.wy-menu-vertical li.on a span.pull-right.toctree-expand,.wy-menu-vertical li.current>a span.pull-right.toctree-expand,.rst-content .pull-right.admonition-title,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content dl dt .pull-right.headerlink,.rst-content p.caption .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content .code-block-caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.rst-content code.download span.pull-right:first-child,.pull-right.icon{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-remove:before,.fa-close:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-gear:before,.fa-cog:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content tt.download span:first-child:before,.rst-content code.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-rotate-right:before,.fa-repeat:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.rst-content .admonition-title:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-warning:before,.fa-exclamation-triangle:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-gears:before,.fa-cogs:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-save:before,.fa-floppy-o:before{content:""}.fa-square:before{content:""}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.wy-dropdown .caret:before,.icon-caret-down:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-unsorted:before,.fa-sort:before{content:""}.fa-sort-down:before,.fa-sort-desc:before{content:""}.fa-sort-up:before,.fa-sort-asc:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-legal:before,.fa-gavel:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-flash:before,.fa-bolt:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-paste:before,.fa-clipboard:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-unlink:before,.fa-chain-broken:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.on a span.toctree-expand:before,.wy-menu-vertical li.current>a span.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:""}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:""}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:""}.fa-euro:before,.fa-eur:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-rupee:before,.fa-inr:before{content:""}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:""}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:""}.fa-won:before,.fa-krw:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-turkish-lira:before,.fa-try:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li span.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-institution:before,.fa-bank:before,.fa-university:before{content:""}.fa-mortar-board:before,.fa-graduation-cap:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:""}.fa-file-zip-o:before,.fa-file-archive-o:before{content:""}.fa-file-sound-o:before,.fa-file-audio-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:""}.fa-ge:before,.fa-empire:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-send:before,.fa-paper-plane:before{content:""}.fa-send-o:before,.fa-paper-plane-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-hotel:before,.fa-bed:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-yc:before,.fa-y-combinator:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-tv:before,.fa-television:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:""}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-signing:before,.fa-sign-language:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-vcard:before,.fa-address-card:before{content:""}.fa-vcard-o:before,.fa-address-card-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.current>a span.toctree-expand,.rst-content .admonition-title,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink,.rst-content p.caption .headerlink,.rst-content table>caption .headerlink,.rst-content .code-block-caption .headerlink,.rst-content tt.download span:first-child,.rst-content code.download span:first-child,.icon,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context{font-family:inherit}.fa:before,.wy-menu-vertical li span.toctree-expand:before,.wy-menu-vertical li.on a span.toctree-expand:before,.wy-menu-vertical li.current>a span.toctree-expand:before,.rst-content .admonition-title:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content dl dt .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content .code-block-caption .headerlink:before,.rst-content tt.download span:first-child:before,.rst-content code.download span:first-child:before,.icon:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before{font-family:"FontAwesome";display:inline-block;font-style:normal;font-weight:normal;line-height:1;text-decoration:inherit}a .fa,a .wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li a span.toctree-expand,.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.current>a span.toctree-expand,a .rst-content .admonition-title,.rst-content a .admonition-title,a .rst-content h1 .headerlink,.rst-content h1 a .headerlink,a .rst-content h2 .headerlink,.rst-content h2 a .headerlink,a .rst-content h3 .headerlink,.rst-content h3 a .headerlink,a .rst-content h4 .headerlink,.rst-content h4 a .headerlink,a .rst-content h5 .headerlink,.rst-content h5 a .headerlink,a .rst-content h6 .headerlink,.rst-content h6 a .headerlink,a .rst-content dl dt .headerlink,.rst-content dl dt a .headerlink,a .rst-content p.caption .headerlink,.rst-content p.caption a .headerlink,a .rst-content table>caption .headerlink,.rst-content table>caption a .headerlink,a .rst-content .code-block-caption .headerlink,.rst-content .code-block-caption a .headerlink,a .rst-content tt.download span:first-child,.rst-content tt.download a span:first-child,a .rst-content code.download span:first-child,.rst-content code.download a span:first-child,a .icon{display:inline-block;text-decoration:inherit}.btn .fa,.btn .wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li .btn span.toctree-expand,.btn .wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.on a .btn span.toctree-expand,.btn .wy-menu-vertical li.current>a span.toctree-expand,.wy-menu-vertical li.current>a .btn span.toctree-expand,.btn .rst-content .admonition-title,.rst-content .btn .admonition-title,.btn .rst-content h1 .headerlink,.rst-content h1 .btn .headerlink,.btn .rst-content h2 .headerlink,.rst-content h2 .btn .headerlink,.btn .rst-content h3 .headerlink,.rst-content h3 .btn .headerlink,.btn .rst-content h4 .headerlink,.rst-content h4 .btn .headerlink,.btn .rst-content h5 .headerlink,.rst-content h5 .btn .headerlink,.btn .rst-content h6 .headerlink,.rst-content h6 .btn .headerlink,.btn .rst-content dl dt .headerlink,.rst-content dl dt .btn .headerlink,.btn .rst-content p.caption .headerlink,.rst-content p.caption .btn .headerlink,.btn .rst-content table>caption .headerlink,.rst-content table>caption .btn .headerlink,.btn .rst-content .code-block-caption .headerlink,.rst-content .code-block-caption .btn .headerlink,.btn .rst-content tt.download span:first-child,.rst-content tt.download .btn span:first-child,.btn .rst-content code.download span:first-child,.rst-content code.download .btn span:first-child,.btn .icon,.nav .fa,.nav .wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li .nav span.toctree-expand,.nav .wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.on a .nav span.toctree-expand,.nav .wy-menu-vertical li.current>a span.toctree-expand,.wy-menu-vertical li.current>a .nav span.toctree-expand,.nav .rst-content .admonition-title,.rst-content .nav .admonition-title,.nav .rst-content h1 .headerlink,.rst-content h1 .nav .headerlink,.nav .rst-content h2 .headerlink,.rst-content h2 .nav .headerlink,.nav .rst-content h3 .headerlink,.rst-content h3 .nav .headerlink,.nav .rst-content h4 .headerlink,.rst-content h4 .nav .headerlink,.nav .rst-content h5 .headerlink,.rst-content h5 .nav .headerlink,.nav .rst-content h6 .headerlink,.rst-content h6 .nav .headerlink,.nav .rst-content dl dt .headerlink,.rst-content dl dt .nav .headerlink,.nav .rst-content p.caption .headerlink,.rst-content p.caption .nav .headerlink,.nav .rst-content table>caption .headerlink,.rst-content table>caption .nav .headerlink,.nav .rst-content .code-block-caption .headerlink,.rst-content .code-block-caption .nav .headerlink,.nav .rst-content tt.download span:first-child,.rst-content tt.download .nav span:first-child,.nav .rst-content code.download span:first-child,.rst-content code.download .nav span:first-child,.nav .icon{display:inline}.btn .fa.fa-large,.btn .wy-menu-vertical li span.fa-large.toctree-expand,.wy-menu-vertical li .btn span.fa-large.toctree-expand,.btn .rst-content .fa-large.admonition-title,.rst-content .btn .fa-large.admonition-title,.btn .rst-content h1 .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.btn .rst-content dl dt .fa-large.headerlink,.rst-content dl dt .btn .fa-large.headerlink,.btn .rst-content p.caption .fa-large.headerlink,.rst-content p.caption .btn .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.btn .rst-content .code-block-caption .fa-large.headerlink,.rst-content .code-block-caption .btn .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.rst-content tt.download .btn span.fa-large:first-child,.btn .rst-content code.download span.fa-large:first-child,.rst-content code.download .btn span.fa-large:first-child,.btn .fa-large.icon,.nav .fa.fa-large,.nav .wy-menu-vertical li span.fa-large.toctree-expand,.wy-menu-vertical li .nav span.fa-large.toctree-expand,.nav .rst-content .fa-large.admonition-title,.rst-content .nav .fa-large.admonition-title,.nav .rst-content h1 .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.nav .rst-content dl dt .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.nav .rst-content p.caption .fa-large.headerlink,.rst-content p.caption .nav .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.nav .rst-content .code-block-caption .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.nav .rst-content code.download span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.nav .fa-large.icon{line-height:.9em}.btn .fa.fa-spin,.btn .wy-menu-vertical li span.fa-spin.toctree-expand,.wy-menu-vertical li .btn span.fa-spin.toctree-expand,.btn .rst-content .fa-spin.admonition-title,.rst-content .btn .fa-spin.admonition-title,.btn .rst-content h1 .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.btn .rst-content dl dt .fa-spin.headerlink,.rst-content dl dt .btn .fa-spin.headerlink,.btn .rst-content p.caption .fa-spin.headerlink,.rst-content p.caption .btn .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.btn .rst-content .code-block-caption .fa-spin.headerlink,.rst-content .code-block-caption .btn .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.rst-content tt.download .btn span.fa-spin:first-child,.btn .rst-content code.download span.fa-spin:first-child,.rst-content code.download .btn span.fa-spin:first-child,.btn .fa-spin.icon,.nav .fa.fa-spin,.nav .wy-menu-vertical li span.fa-spin.toctree-expand,.wy-menu-vertical li .nav span.fa-spin.toctree-expand,.nav .rst-content .fa-spin.admonition-title,.rst-content .nav .fa-spin.admonition-title,.nav .rst-content h1 .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.nav .rst-content dl dt .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.nav .rst-content p.caption .fa-spin.headerlink,.rst-content p.caption .nav .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.nav .rst-content .code-block-caption .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.nav .rst-content code.download span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.nav .fa-spin.icon{display:inline-block}.btn.fa:before,.wy-menu-vertical li span.btn.toctree-expand:before,.rst-content .btn.admonition-title:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content dl dt .btn.headerlink:before,.rst-content p.caption .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.rst-content code.download span.btn:first-child:before,.btn.icon:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.wy-menu-vertical li span.btn.toctree-expand:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content p.caption .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.rst-content code.download span.btn:first-child:hover:before,.btn.icon:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .wy-menu-vertical li span.toctree-expand:before,.wy-menu-vertical li .btn-mini span.toctree-expand:before,.btn-mini .rst-content .admonition-title:before,.rst-content .btn-mini .admonition-title:before,.btn-mini .rst-content h1 .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.btn-mini .rst-content dl dt .headerlink:before,.rst-content dl dt .btn-mini .headerlink:before,.btn-mini .rst-content p.caption .headerlink:before,.rst-content p.caption .btn-mini .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.rst-content tt.download .btn-mini span:first-child:before,.btn-mini .rst-content code.download span:first-child:before,.rst-content code.download .btn-mini span:first-child:before,.btn-mini .icon:before{font-size:14px;vertical-align:-15%}.wy-alert,.rst-content .note,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .warning,.rst-content .seealso,.rst-content .admonition-todo,.rst-content .admonition{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.wy-alert-title,.rst-content .admonition-title{color:#fff;font-weight:bold;display:block;color:#fff;background:#6ab0de;margin:-12px;padding:6px 12px;margin-bottom:12px}.wy-alert.wy-alert-danger,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.admonition{background:#fdf3f2}.wy-alert.wy-alert-danger .wy-alert-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .danger .wy-alert-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .danger .admonition-title,.rst-content .error .admonition-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition .admonition-title{background:#f29f97}.wy-alert.wy-alert-warning,.rst-content .wy-alert-warning.note,.rst-content .attention,.rst-content .caution,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.tip,.rst-content .warning,.rst-content .wy-alert-warning.seealso,.rst-content .admonition-todo,.rst-content .wy-alert-warning.admonition{background:#ffedcc}.wy-alert.wy-alert-warning .wy-alert-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .attention .wy-alert-title,.rst-content .caution .wy-alert-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .attention .admonition-title,.rst-content .caution .admonition-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .warning .admonition-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .admonition-todo .admonition-title,.rst-content .wy-alert-warning.admonition .admonition-title{background:#f0b37e}.wy-alert.wy-alert-info,.rst-content .note,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.rst-content .seealso,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.admonition{background:#e7f2fa}.wy-alert.wy-alert-info .wy-alert-title,.rst-content .note .wy-alert-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.rst-content .note .admonition-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .seealso .admonition-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition .admonition-title{background:#6ab0de}.wy-alert.wy-alert-success,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.warning,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.admonition{background:#dbfaf4}.wy-alert.wy-alert-success .wy-alert-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .hint .wy-alert-title,.rst-content .important .wy-alert-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .hint .admonition-title,.rst-content .important .admonition-title,.rst-content .tip .admonition-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition .admonition-title{background:#1abc9c}.wy-alert.wy-alert-neutral,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.admonition{background:#f3f6f6}.wy-alert.wy-alert-neutral .wy-alert-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition .admonition-title{color:#404040;background:#e1e4e5}.wy-alert.wy-alert-neutral a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a{color:#2980B9}.wy-alert p:last-child,.rst-content .note p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.rst-content .seealso p:last-child,.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0px;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,0.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27AE60}.wy-tray-container li.wy-tray-item-info{background:#2980B9}.wy-tray-container li.wy-tray-item-warning{background:#E67E22}.wy-tray-container li.wy-tray-item-danger{background:#E74C3C}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width: 768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px 12px;color:#fff;border:1px solid rgba(0,0,0,0.1);background-color:#27AE60;text-decoration:none;font-weight:normal;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;box-shadow:0px 1px 2px -1px rgba(255,255,255,0.5) inset,0px -2px 0px 0px rgba(0,0,0,0.1) inset;outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:0px -1px 0px 0px rgba(0,0,0,0.05) inset,0px 2px 0px 0px rgba(0,0,0,0.1) inset;padding:8px 12px 6px 12px}.btn:visited{color:#fff}.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn-disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn-disabled:hover,.btn-disabled:focus,.btn-disabled:active{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980B9 !important}.btn-info:hover{background-color:#2e8ece !important}.btn-neutral{background-color:#f3f6f6 !important;color:#404040 !important}.btn-neutral:hover{background-color:#e5ebeb !important;color:#404040}.btn-neutral:visited{color:#404040 !important}.btn-success{background-color:#27AE60 !important}.btn-success:hover{background-color:#295 !important}.btn-danger{background-color:#E74C3C !important}.btn-danger:hover{background-color:#ea6153 !important}.btn-warning{background-color:#E67E22 !important}.btn-warning:hover{background-color:#e98b39 !important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f !important}.btn-link{background-color:transparent !important;color:#2980B9;box-shadow:none;border-color:transparent !important}.btn-link:hover{background-color:transparent !important;color:#409ad5 !important;box-shadow:none}.btn-link:active{background-color:transparent !important;color:#409ad5 !important;box-shadow:none}.btn-link:visited{color:#9B59B6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:before,.wy-btn-group:after{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:solid 1px #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,0.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980B9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:solid 1px #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type="search"]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980B9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned input,.wy-form-aligned textarea,.wy-form-aligned select,.wy-form-aligned .wy-help-inline,.wy-form-aligned label{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{border:0;margin:0;padding:0}legend{display:block;width:100%;border:0;padding:0;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label{display:block;margin:0 0 .3125em 0;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;*zoom:1;max-width:68em;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:before,.wy-control-group:after{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group:before,.wy-control-group:after{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#E74C3C}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full input[type="text"],.wy-control-group .wy-form-full input[type="password"],.wy-control-group .wy-form-full input[type="email"],.wy-control-group .wy-form-full input[type="url"],.wy-control-group .wy-form-full input[type="date"],.wy-control-group .wy-form-full input[type="month"],.wy-control-group .wy-form-full input[type="time"],.wy-control-group .wy-form-full input[type="datetime"],.wy-control-group .wy-form-full input[type="datetime-local"],.wy-control-group .wy-form-full input[type="week"],.wy-control-group .wy-form-full input[type="number"],.wy-control-group .wy-form-full input[type="search"],.wy-control-group .wy-form-full input[type="tel"],.wy-control-group .wy-form-full input[type="color"],.wy-control-group .wy-form-halves input[type="text"],.wy-control-group .wy-form-halves input[type="password"],.wy-control-group .wy-form-halves input[type="email"],.wy-control-group .wy-form-halves input[type="url"],.wy-control-group .wy-form-halves input[type="date"],.wy-control-group .wy-form-halves input[type="month"],.wy-control-group .wy-form-halves input[type="time"],.wy-control-group .wy-form-halves input[type="datetime"],.wy-control-group .wy-form-halves input[type="datetime-local"],.wy-control-group .wy-form-halves input[type="week"],.wy-control-group .wy-form-halves input[type="number"],.wy-control-group .wy-form-halves input[type="search"],.wy-control-group .wy-form-halves input[type="tel"],.wy-control-group .wy-form-halves input[type="color"],.wy-control-group .wy-form-thirds input[type="text"],.wy-control-group .wy-form-thirds input[type="password"],.wy-control-group .wy-form-thirds input[type="email"],.wy-control-group .wy-form-thirds input[type="url"],.wy-control-group .wy-form-thirds input[type="date"],.wy-control-group .wy-form-thirds input[type="month"],.wy-control-group .wy-form-thirds input[type="time"],.wy-control-group .wy-form-thirds input[type="datetime"],.wy-control-group .wy-form-thirds input[type="datetime-local"],.wy-control-group .wy-form-thirds input[type="week"],.wy-control-group .wy-form-thirds input[type="number"],.wy-control-group .wy-form-thirds input[type="search"],.wy-control-group .wy-form-thirds input[type="tel"],.wy-control-group .wy-form-thirds input[type="color"]{width:100%}.wy-control-group .wy-form-full{float:left;display:block;margin-right:2.3576515979%;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.3576515979%;width:48.821174201%}.wy-control-group .wy-form-halves:last-child{margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(2n+1){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.3576515979%;width:31.7615656014%}.wy-control-group .wy-form-thirds:last-child{margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control{margin:6px 0 0 0;font-size:90%}.wy-control-no-input{display:inline-block;margin:6px 0 0 0;font-size:90%}.wy-control-group.fluid-input input[type="text"],.wy-control-group.fluid-input input[type="password"],.wy-control-group.fluid-input input[type="email"],.wy-control-group.fluid-input input[type="url"],.wy-control-group.fluid-input input[type="date"],.wy-control-group.fluid-input input[type="month"],.wy-control-group.fluid-input input[type="time"],.wy-control-group.fluid-input input[type="datetime"],.wy-control-group.fluid-input input[type="datetime-local"],.wy-control-group.fluid-input input[type="week"],.wy-control-group.fluid-input input[type="number"],.wy-control-group.fluid-input input[type="search"],.wy-control-group.fluid-input input[type="tel"],.wy-control-group.fluid-input input[type="color"]{width:100%}.wy-form-message-inline{display:inline-block;padding-left:.3em;color:#666;vertical-align:middle;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;*overflow:visible}input[type="text"],input[type="password"],input[type="email"],input[type="url"],input[type="date"],input[type="month"],input[type="time"],input[type="datetime"],input[type="datetime-local"],input[type="week"],input[type="number"],input[type="search"],input[type="tel"],input[type="color"]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type="datetime-local"]{padding:.34375em .625em}input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}input[type="text"]:focus,input[type="password"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus{outline:0;outline:thin dotted \9;border-color:#333}input.no-focus:focus{border-color:#ccc !important}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:1px auto #129FEA}input[type="text"][disabled],input[type="password"][disabled],input[type="email"][disabled],input[type="url"][disabled],input[type="date"][disabled],input[type="month"][disabled],input[type="time"][disabled],input[type="datetime"][disabled],input[type="datetime-local"][disabled],input[type="week"][disabled],input[type="number"][disabled],input[type="search"][disabled],input[type="tel"][disabled],input[type="color"][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#E74C3C;border:1px solid #E74C3C}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#E74C3C}input[type="file"]:focus:invalid:focus,input[type="radio"]:focus:invalid:focus,input[type="checkbox"]:focus:invalid:focus{outline-color:#E74C3C}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type="radio"][disabled],input[type="checkbox"][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:solid 1px #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{position:absolute;content:"";display:block;left:0;top:0;width:36px;height:12px;border-radius:4px;background:#ccc;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{position:absolute;content:"";display:block;width:18px;height:18px;border-radius:4px;background:#999;left:-3px;top:-3px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27AE60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#E74C3C}.wy-control-group.wy-control-group-error input[type="text"],.wy-control-group.wy-control-group-error input[type="password"],.wy-control-group.wy-control-group-error input[type="email"],.wy-control-group.wy-control-group-error input[type="url"],.wy-control-group.wy-control-group-error input[type="date"],.wy-control-group.wy-control-group-error input[type="month"],.wy-control-group.wy-control-group-error input[type="time"],.wy-control-group.wy-control-group-error input[type="datetime"],.wy-control-group.wy-control-group-error input[type="datetime-local"],.wy-control-group.wy-control-group-error input[type="week"],.wy-control-group.wy-control-group-error input[type="number"],.wy-control-group.wy-control-group-error input[type="search"],.wy-control-group.wy-control-group-error input[type="tel"],.wy-control-group.wy-control-group-error input[type="color"]{border:solid 1px #E74C3C}.wy-control-group.wy-control-group-error textarea{border:solid 1px #E74C3C}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27AE60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#E74C3C}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#E67E22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980B9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width: 480px){.wy-form button[type="submit"]{margin:.7em 0 0}.wy-form input[type="text"],.wy-form input[type="password"],.wy-form input[type="email"],.wy-form input[type="url"],.wy-form input[type="date"],.wy-form input[type="month"],.wy-form input[type="time"],.wy-form input[type="datetime"],.wy-form input[type="datetime-local"],.wy-form input[type="week"],.wy-form input[type="number"],.wy-form input[type="search"],.wy-form input[type="tel"],.wy-form input[type="color"]{margin-bottom:.3em;display:block}.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type="password"],.wy-form input[type="email"],.wy-form input[type="url"],.wy-form input[type="date"],.wy-form input[type="month"],.wy-form input[type="time"],.wy-form input[type="datetime"],.wy-form input[type="datetime-local"],.wy-form input[type="week"],.wy-form input[type="number"],.wy-form input[type="search"],.wy-form input[type="tel"],.wy-form input[type="color"]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0 0}.wy-form .wy-help-inline,.wy-form-message-inline,.wy-form-message{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width: 768px){.tablet-hide{display:none}}@media screen and (max-width: 480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.wy-table,.rst-content table.docutils,.rst-content table.field-list{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.wy-table caption,.rst-content table.docutils caption,.rst-content table.field-list caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.wy-table td,.rst-content table.docutils td,.rst-content table.field-list td,.wy-table th,.rst-content table.docutils th,.rst-content table.field-list th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.wy-table td:first-child,.rst-content table.docutils td:first-child,.rst-content table.field-list td:first-child,.wy-table th:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list th:first-child{border-left-width:0}.wy-table thead,.rst-content table.docutils thead,.rst-content table.field-list thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.wy-table thead th,.rst-content table.docutils thead th,.rst-content table.field-list thead th{font-weight:bold;border-bottom:solid 2px #e1e4e5}.wy-table td,.rst-content table.docutils td,.rst-content table.field-list td{background-color:transparent;vertical-align:middle}.wy-table td p,.rst-content table.docutils td p,.rst-content table.field-list td p{line-height:18px}.wy-table td p:last-child,.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child{margin-bottom:0}.wy-table .wy-table-cell-min,.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min{width:1%;padding-right:0}.wy-table .wy-table-cell-min input[type=checkbox],.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox],.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:gray;font-size:90%}.wy-table-tertiary{color:gray;font-size:80%}.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td,.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td{background-color:#f3f6f6}.wy-table-backed{background-color:#f3f6f6}.wy-table-bordered-all,.rst-content table.docutils{border:1px solid #e1e4e5}.wy-table-bordered-all td,.rst-content table.docutils td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.wy-table-bordered-all tbody>tr:last-child td,.rst-content table.docutils tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px 0;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0 !important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980B9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9B59B6}html{height:100%;overflow-x:hidden}body{font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;font-weight:normal;color:#404040;min-height:100%;overflow-x:hidden;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#E67E22 !important}a.wy-text-warning:hover{color:#eb9950 !important}.wy-text-info{color:#2980B9 !important}a.wy-text-info:hover{color:#409ad5 !important}.wy-text-success{color:#27AE60 !important}a.wy-text-success:hover{color:#36d278 !important}.wy-text-danger{color:#E74C3C !important}a.wy-text-danger:hover{color:#ed7669 !important}.wy-text-neutral{color:#404040 !important}a.wy-text-neutral:hover{color:#595959 !important}h1,h2,.rst-content .toctree-wrapper p.caption,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:"Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif}p{line-height:24px;margin:0;font-size:16px;margin-bottom:24px}h1{font-size:175%}h2,.rst-content .toctree-wrapper p.caption{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}code,.rst-content tt,.rst-content code{white-space:nowrap;max-width:100%;background:#fff;border:solid 1px #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",Courier,monospace;color:#E74C3C;overflow-x:auto}code.code-large,.rst-content tt.code-large{font-size:90%}.wy-plain-list-disc,.rst-content .section ul,.rst-content .toctree-wrapper ul,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.wy-plain-list-disc li,.rst-content .section ul li,.rst-content .toctree-wrapper ul li,article ul li{list-style:disc;margin-left:24px}.wy-plain-list-disc li p:last-child,.rst-content .section ul li p:last-child,.rst-content .toctree-wrapper ul li p:last-child,article ul li p:last-child{margin-bottom:0}.wy-plain-list-disc li ul,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li ul,article ul li ul{margin-bottom:0}.wy-plain-list-disc li li,.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,article ul li li{list-style:circle}.wy-plain-list-disc li li li,.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,article ul li li li{list-style:square}.wy-plain-list-disc li ol li,.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,article ul li ol li{list-style:decimal}.wy-plain-list-decimal,.rst-content .section ol,.rst-content ol.arabic,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.wy-plain-list-decimal li,.rst-content .section ol li,.rst-content ol.arabic li,article ol li{list-style:decimal;margin-left:24px}.wy-plain-list-decimal li p:last-child,.rst-content .section ol li p:last-child,.rst-content ol.arabic li p:last-child,article ol li p:last-child{margin-bottom:0}.wy-plain-list-decimal li ul,.rst-content .section ol li ul,.rst-content ol.arabic li ul,article ol li ul{margin-bottom:0}.wy-plain-list-decimal li ul li,.rst-content .section ol li ul li,.rst-content ol.arabic li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:before,.wy-breadcrumbs:after{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs li{display:inline-block}.wy-breadcrumbs li.wy-breadcrumbs-aside{float:right}.wy-breadcrumbs li a{display:inline-block;padding:5px}.wy-breadcrumbs li a:first-child{padding-left:0}.wy-breadcrumbs li code,.wy-breadcrumbs li .rst-content tt,.rst-content .wy-breadcrumbs li tt{padding:5px;border:none;background:none}.wy-breadcrumbs li code.literal,.wy-breadcrumbs li .rst-content tt.literal,.rst-content .wy-breadcrumbs li tt.literal{color:#404040}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width: 480px){.wy-breadcrumbs-extra{display:none}.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:before,.wy-menu-horiz:after{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz ul,.wy-menu-horiz li{display:inline-block}.wy-menu-horiz li:hover{background:rgba(255,255,255,0.1)}.wy-menu-horiz li.divide-left{border-left:solid 1px #404040}.wy-menu-horiz li.divide-right{border-right:solid 1px #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#3a7ca8;height:32px;display:inline-block;line-height:32px;padding:0 1.618em;margin:12px 0 0 0;display:block;font-weight:bold;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:solid 1px #404040}.wy-menu-vertical li.divide-bottom{border-bottom:solid 1px #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:gray;border-right:solid 1px #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.wy-menu-vertical li code,.wy-menu-vertical li .rst-content tt,.rst-content .wy-menu-vertical li tt{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li span.toctree-expand{display:block;float:left;margin-left:-1.2em;font-size:.8em;line-height:1.6em;color:#4d4d4d}.wy-menu-vertical li.on a,.wy-menu-vertical li.current>a{color:#404040;padding:.4045em 1.618em;font-weight:bold;position:relative;background:#fcfcfc;border:none;padding-left:1.618em -4px}.wy-menu-vertical li.on a:hover,.wy-menu-vertical li.current>a:hover{background:#fcfcfc}.wy-menu-vertical li.on a:hover span.toctree-expand,.wy-menu-vertical li.current>a:hover span.toctree-expand{color:gray}.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.current>a span.toctree-expand{display:block;font-size:.8em;line-height:1.6em;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:solid 1px #c9c9c9;border-top:solid 1px #c9c9c9}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a{color:#404040}.wy-menu-vertical li.toctree-l1.current li.toctree-l2>ul,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>ul{display:none}.wy-menu-vertical li.toctree-l1.current li.toctree-l2.current>ul,.wy-menu-vertical li.toctree-l2.current li.toctree-l3.current>ul{display:block}.wy-menu-vertical li.toctree-l2.current>a{background:#c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{display:block;background:#c9c9c9;padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l2 a:hover span.toctree-expand{color:gray}.wy-menu-vertical li.toctree-l2 span.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3{font-size:.9em}.wy-menu-vertical li.toctree-l3.current>a{background:#bdbdbd;padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{display:block;background:#bdbdbd;padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l3 a:hover span.toctree-expand{color:gray}.wy-menu-vertical li.toctree-l3 span.toctree-expand{color:#969696}.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:normal}.wy-menu-vertical a{display:inline-block;line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover span.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980B9;cursor:pointer;color:#fff}.wy-menu-vertical a:active span.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980B9;text-align:center;padding:.809em;display:block;color:#fcfcfc;margin-bottom:.809em}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em auto;height:45px;width:45px;background-color:#2980B9;padding:5px;border-radius:100%}.wy-side-nav-search>a,.wy-side-nav-search .wy-dropdown>a{color:#fcfcfc;font-size:100%;font-weight:bold;display:inline-block;padding:4px 6px;margin-bottom:.809em}.wy-side-nav-search>a:hover,.wy-side-nav-search .wy-dropdown>a:hover{background:rgba(255,255,255,0.1)}.wy-side-nav-search>a img.logo,.wy-side-nav-search .wy-dropdown>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search>a.icon img.logo,.wy-side-nav-search .wy-dropdown>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:normal;color:rgba(255,255,255,0.3)}.wy-nav .wy-menu-vertical header{color:#2980B9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980B9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980B9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:before,.wy-nav-top:after{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:bold}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980B9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,0.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:gray}footer p{margin-bottom:12px}footer span.commit code,footer span.commit .rst-content tt,.rst-content footer span.commit tt{padding:0px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",Courier,monospace;font-size:1em;background:none;border:none;color:gray}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:before,.rst-footer-buttons:after{width:100%}.rst-footer-buttons:before,.rst-footer-buttons:after{display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:before,.rst-breadcrumbs-buttons:after{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:solid 1px #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:solid 1px #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:gray;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width: 768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-side-scroll{width:auto}.wy-side-nav-search{width:auto}.wy-menu.wy-menu-vertical{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width: 1100px){.wy-nav-content-wrap{background:rgba(0,0,0,0.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,footer,.wy-nav-side{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;z-index:400}.rst-versions a{color:#2980B9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27AE60;*zoom:1}.rst-versions .rst-current-version:before,.rst-versions .rst-current-version:after{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version span.toctree-expand,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content p.caption .headerlink,.rst-content p.caption .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .icon{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#E74C3C;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#F1C40F;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:gray;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:solid 1px #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge .rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width: 768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content img{max-width:100%;height:auto}.rst-content div.figure{margin-bottom:24px}.rst-content div.figure p.caption{font-style:italic}.rst-content div.figure p:last-child.caption{margin-bottom:0px}.rst-content div.figure.align-center{text-align:center}.rst-content .section>img,.rst-content .section>a>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px 12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",Courier,monospace;display:block;overflow:auto}.rst-content pre.literal-block,.rst-content div[class^='highlight']{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px 0}.rst-content pre.literal-block div[class^='highlight'],.rst-content div[class^='highlight'] div[class^='highlight']{padding:0px;border:none;margin:0}.rst-content div[class^='highlight'] td.code{width:100%}.rst-content .linenodiv pre{border-right:solid 1px #e6e9ea;margin:0;padding:12px 12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^='highlight'] pre{white-space:pre;margin:0;padding:12px 12px;display:block;overflow:auto}.rst-content div[class^='highlight'] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content pre.literal-block,.rst-content div[class^='highlight'] pre,.rst-content .linenodiv pre{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",Courier,monospace;font-size:12px;line-height:1.4}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^='highlight'],.rst-content div[class^='highlight'] pre{white-space:pre-wrap}}.rst-content .note .last,.rst-content .attention .last,.rst-content .caution .last,.rst-content .danger .last,.rst-content .error .last,.rst-content .hint .last,.rst-content .important .last,.rst-content .tip .last,.rst-content .warning .last,.rst-content .seealso .last,.rst-content .admonition-todo .last,.rst-content .admonition .last{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,0.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent !important;border-color:rgba(0,0,0,0.1) !important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha li{list-style:upper-alpha}.rst-content .section ol p,.rst-content .section ul p{margin-bottom:12px}.rst-content .section ol p:last-child,.rst-content .section ul p:last-child{margin-bottom:24px}.rst-content .line-block{margin-left:0px;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0px}.rst-content .topic-title{font-weight:bold;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0px 0px 24px 24px}.rst-content .align-left{float:left;margin:0px 24px 24px 0px}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content .toctree-wrapper p.caption .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink,.rst-content p.caption .headerlink,.rst-content table>caption .headerlink,.rst-content .code-block-caption .headerlink{visibility:hidden;font-size:14px}.rst-content h1 .headerlink:after,.rst-content h2 .headerlink:after,.rst-content .toctree-wrapper p.caption .headerlink:after,.rst-content h3 .headerlink:after,.rst-content h4 .headerlink:after,.rst-content h5 .headerlink:after,.rst-content h6 .headerlink:after,.rst-content dl dt .headerlink:after,.rst-content p.caption .headerlink:after,.rst-content table>caption .headerlink:after,.rst-content .code-block-caption .headerlink:after{content:"";font-family:FontAwesome}.rst-content h1:hover .headerlink:after,.rst-content h2:hover .headerlink:after,.rst-content .toctree-wrapper p.caption:hover .headerlink:after,.rst-content h3:hover .headerlink:after,.rst-content h4:hover .headerlink:after,.rst-content h5:hover .headerlink:after,.rst-content h6:hover .headerlink:after,.rst-content dl dt:hover .headerlink:after,.rst-content p.caption:hover .headerlink:after,.rst-content table>caption:hover .headerlink:after,.rst-content .code-block-caption:hover .headerlink:after{visibility:visible}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:solid 1px #e1e4e5}.rst-content .sidebar p,.rst-content .sidebar ul,.rst-content .sidebar dl{font-size:90%}.rst-content .sidebar .last{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:"Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif;font-weight:bold;background:#e1e4e5;padding:6px 12px;margin:-24px;margin-bottom:24px;font-size:100%}.rst-content .highlighted{background:#F1C40F;display:inline-block;font-weight:bold;padding:0 6px}.rst-content .footnote-reference,.rst-content .citation-reference{vertical-align:baseline;position:relative;top:-0.4em;line-height:0;font-size:90%}.rst-content table.docutils.citation,.rst-content table.docutils.footnote{background:none;border:none;color:gray}.rst-content table.docutils.citation td,.rst-content table.docutils.citation tr,.rst-content table.docutils.footnote td,.rst-content table.docutils.footnote tr{border:none;background-color:transparent !important;white-space:normal}.rst-content table.docutils.citation td.label,.rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}.rst-content table.docutils.citation tt,.rst-content table.docutils.citation code,.rst-content table.docutils.footnote tt,.rst-content table.docutils.footnote code{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}.rst-content table.docutils td .last,.rst-content table.docutils td .last :last-child{margin-bottom:0}.rst-content table.field-list{border:none}.rst-content table.field-list td{border:none}.rst-content table.field-list td p{font-size:inherit;line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content tt,.rst-content tt,.rst-content code{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",Courier,monospace;padding:2px 5px}.rst-content tt big,.rst-content tt em,.rst-content tt big,.rst-content code big,.rst-content tt em,.rst-content code em{font-size:100% !important;line-height:normal}.rst-content tt.literal,.rst-content tt.literal,.rst-content code.literal{color:#E74C3C}.rst-content tt.xref,a .rst-content tt,.rst-content tt.xref,.rst-content code.xref,a .rst-content tt,a .rst-content code{font-weight:bold;color:#404040}.rst-content pre,.rst-content kbd,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",Courier,monospace}.rst-content a tt,.rst-content a tt,.rst-content a code{color:#2980B9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:bold;margin-bottom:12px}.rst-content dl p,.rst-content dl table,.rst-content dl ul,.rst-content dl ol{margin-bottom:12px !important}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl:not(.docutils){margin-bottom:24px}.rst-content dl:not(.docutils) dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980B9;border-top:solid 3px #6ab0de;padding:6px;position:relative}.rst-content dl:not(.docutils) dt:before{color:#6ab0de}.rst-content dl:not(.docutils) dt .headerlink{color:#404040;font-size:100% !important}.rst-content dl:not(.docutils) dl dt{margin-bottom:6px;border:none;border-left:solid 3px #ccc;background:#f0f0f0;color:#555}.rst-content dl:not(.docutils) dl dt .headerlink{color:#404040;font-size:100% !important}.rst-content dl:not(.docutils) dt:first-child{margin-top:0}.rst-content dl:not(.docutils) tt,.rst-content dl:not(.docutils) tt,.rst-content dl:not(.docutils) code{font-weight:bold}.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) tt.descclassname,.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) code.descname,.rst-content dl:not(.docutils) tt.descclassname,.rst-content dl:not(.docutils) code.descclassname{background-color:transparent;border:none;padding:0;font-size:100% !important}.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) code.descname{font-weight:bold}.rst-content dl:not(.docutils) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:bold}.rst-content dl:not(.docutils) .property{display:inline-block;padding-right:8px}.rst-content .viewcode-link,.rst-content .viewcode-back{display:inline-block;color:#27AE60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:bold}.rst-content tt.download,.rst-content code.download{background:inherit;padding:inherit;font-weight:normal;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content tt.download span:first-child,.rst-content code.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content tt.download span:first-child:before,.rst-content code.download span:first-child:before{margin-right:4px}.rst-content .guilabel{border:1px solid #7fbbe3;background:#e7f2fa;font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .versionmodified{font-style:italic}@media screen and (max-width: 480px){.rst-content .sidebar{width:100%}}span[id*='MathJax-Span']{color:#404040}.math{text-align:center}@font-face{font-family:"Lato";src:url("../fonts/Lato/lato-regular.eot");src:url("../fonts/Lato/lato-regular.eot?#iefix") format("embedded-opentype"),url("../fonts/Lato/lato-regular.woff2") format("woff2"),url("../fonts/Lato/lato-regular.woff") format("woff"),url("../fonts/Lato/lato-regular.ttf") format("truetype");font-weight:400;font-style:normal}@font-face{font-family:"Lato";src:url("../fonts/Lato/lato-bold.eot");src:url("../fonts/Lato/lato-bold.eot?#iefix") format("embedded-opentype"),url("../fonts/Lato/lato-bold.woff2") format("woff2"),url("../fonts/Lato/lato-bold.woff") format("woff"),url("../fonts/Lato/lato-bold.ttf") format("truetype");font-weight:700;font-style:normal}@font-face{font-family:"Lato";src:url("../fonts/Lato/lato-bolditalic.eot");src:url("../fonts/Lato/lato-bolditalic.eot?#iefix") format("embedded-opentype"),url("../fonts/Lato/lato-bolditalic.woff2") format("woff2"),url("../fonts/Lato/lato-bolditalic.woff") format("woff"),url("../fonts/Lato/lato-bolditalic.ttf") format("truetype");font-weight:700;font-style:italic}@font-face{font-family:"Lato";src:url("../fonts/Lato/lato-italic.eot");src:url("../fonts/Lato/lato-italic.eot?#iefix") format("embedded-opentype"),url("../fonts/Lato/lato-italic.woff2") format("woff2"),url("../fonts/Lato/lato-italic.woff") format("woff"),url("../fonts/Lato/lato-italic.ttf") format("truetype");font-weight:400;font-style:italic}@font-face{font-family:"Roboto Slab";font-style:normal;font-weight:400;src:url("../fonts/RobotoSlab/roboto-slab.eot");src:url("../fonts/RobotoSlab/roboto-slab-v7-regular.eot?#iefix") format("embedded-opentype"),url("../fonts/RobotoSlab/roboto-slab-v7-regular.woff2") format("woff2"),url("../fonts/RobotoSlab/roboto-slab-v7-regular.woff") format("woff"),url("../fonts/RobotoSlab/roboto-slab-v7-regular.ttf") format("truetype")}@font-face{font-family:"Roboto Slab";font-style:normal;font-weight:700;src:url("../fonts/RobotoSlab/roboto-slab-v7-bold.eot");src:url("../fonts/RobotoSlab/roboto-slab-v7-bold.eot?#iefix") format("embedded-opentype"),url("../fonts/RobotoSlab/roboto-slab-v7-bold.woff2") format("woff2"),url("../fonts/RobotoSlab/roboto-slab-v7-bold.woff") format("woff"),url("../fonts/RobotoSlab/roboto-slab-v7-bold.ttf") format("truetype")} diff --git a/docs/_build/html/_static/doctools.js b/docs/_build/html/_static/doctools.js new file mode 100644 index 0000000000..b33f87fcb2 --- /dev/null +++ b/docs/_build/html/_static/doctools.js @@ -0,0 +1,314 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for all documentation. + * + * :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/** + * select a different prefix for underscore + */ +$u = _.noConflict(); + +/** + * make the code below compatible with browsers without + * an installed firebug like debugger +if (!window.console || !console.firebug) { + var names = ["log", "debug", "info", "warn", "error", "assert", "dir", + "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", + "profile", "profileEnd"]; + window.console = {}; + for (var i = 0; i < names.length; ++i) + window.console[names[i]] = function() {}; +} + */ + +/** + * small helper function to urldecode strings + */ +jQuery.urldecode = function(x) { + return decodeURIComponent(x).replace(/\+/g, ' '); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + var bbox = node.parentElement.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} + +/** + * Small JavaScript module for the documentation. + */ +var Documentation = { + + init : function() { + this.fixFirefoxAnchorBug(); + this.highlightSearchWords(); + this.initIndexTable(); + if (DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) { + this.initOnKeyListeners(); + } + }, + + /** + * i18n support + */ + TRANSLATIONS : {}, + PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; }, + LOCALE : 'unknown', + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext : function(string) { + var translated = Documentation.TRANSLATIONS[string]; + if (typeof translated === 'undefined') + return string; + return (typeof translated === 'string') ? translated : translated[0]; + }, + + ngettext : function(singular, plural, n) { + var translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated === 'undefined') + return (n == 1) ? singular : plural; + return translated[Documentation.PLURALEXPR(n)]; + }, + + addTranslations : function(catalog) { + for (var key in catalog.messages) + this.TRANSLATIONS[key] = catalog.messages[key]; + this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); + this.LOCALE = catalog.locale; + }, + + /** + * add context elements like header anchor links + */ + addContextElements : function() { + $('div[id] > :header:first').each(function() { + $('\u00B6'). + attr('href', '#' + this.id). + attr('title', _('Permalink to this headline')). + appendTo(this); + }); + $('dt[id]').each(function() { + $('\u00B6'). + attr('href', '#' + this.id). + attr('title', _('Permalink to this definition')). + appendTo(this); + }); + }, + + /** + * workaround a firefox stupidity + * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075 + */ + fixFirefoxAnchorBug : function() { + if (document.location.hash && $.browser.mozilla) + window.setTimeout(function() { + document.location.href += ''; + }, 10); + }, + + /** + * highlight the search words provided in the url in the text + */ + highlightSearchWords : function() { + var params = $.getQueryParameters(); + var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; + if (terms.length) { + var body = $('div.body'); + if (!body.length) { + body = $('body'); + } + window.setTimeout(function() { + $.each(terms, function() { + body.highlightText(this.toLowerCase(), 'highlighted'); + }); + }, 10); + $('') + .appendTo($('#searchbox')); + } + }, + + /** + * init the domain index toggle buttons + */ + initIndexTable : function() { + var togglers = $('img.toggler').click(function() { + var src = $(this).attr('src'); + var idnum = $(this).attr('id').substr(7); + $('tr.cg-' + idnum).toggle(); + if (src.substr(-9) === 'minus.png') + $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); + else + $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); + }).css('display', ''); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { + togglers.click(); + } + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords : function() { + $('#searchbox .highlight-link').fadeOut(300); + $('span.highlighted').removeClass('highlighted'); + }, + + /** + * make the url absolute + */ + makeURL : function(relativeURL) { + return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; + }, + + /** + * get the current relative url + */ + getCurrentURL : function() { + var path = document.location.pathname; + var parts = path.split(/\//); + $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { + if (this === '..') + parts.pop(); + }); + var url = parts.join('/'); + return path.substring(url.lastIndexOf('/') + 1, path.length - 1); + }, + + initOnKeyListeners: function() { + $(document).keyup(function(event) { + var activeElementType = document.activeElement.tagName; + // don't navigate when in search box or textarea + if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT') { + switch (event.keyCode) { + case 37: // left + var prevHref = $('link[rel="prev"]').prop('href'); + if (prevHref) { + window.location.href = prevHref; + return false; + } + case 39: // right + var nextHref = $('link[rel="next"]').prop('href'); + if (nextHref) { + window.location.href = nextHref; + return false; + } + } + } + }); + } +}; + +// quick alias for translations +_ = Documentation.gettext; + +$(document).ready(function() { + Documentation.init(); +}); diff --git a/docs/_build/html/_static/documentation_options.js b/docs/_build/html/_static/documentation_options.js new file mode 100644 index 0000000000..d0b7304292 --- /dev/null +++ b/docs/_build/html/_static/documentation_options.js @@ -0,0 +1,10 @@ +var DOCUMENTATION_OPTIONS = { + URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), + VERSION: '1', + LANGUAGE: 'None', + COLLAPSE_INDEX: false, + FILE_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false +}; \ No newline at end of file diff --git a/docs/_build/html/_static/file.png b/docs/_build/html/_static/file.png new file mode 100644 index 0000000000..a858a410e4 Binary files /dev/null and b/docs/_build/html/_static/file.png differ diff --git a/docs/_build/html/_static/fonts/Inconsolata-Bold.ttf b/docs/_build/html/_static/fonts/Inconsolata-Bold.ttf new file mode 100644 index 0000000000..809c1f5828 Binary files /dev/null and b/docs/_build/html/_static/fonts/Inconsolata-Bold.ttf differ diff --git a/docs/_build/html/_static/fonts/Inconsolata-Regular.ttf b/docs/_build/html/_static/fonts/Inconsolata-Regular.ttf new file mode 100644 index 0000000000..fc981ce7ad Binary files /dev/null and b/docs/_build/html/_static/fonts/Inconsolata-Regular.ttf differ diff --git a/docs/_build/html/_static/fonts/Inconsolata.ttf b/docs/_build/html/_static/fonts/Inconsolata.ttf new file mode 100644 index 0000000000..4b8a36d249 Binary files /dev/null and b/docs/_build/html/_static/fonts/Inconsolata.ttf differ diff --git a/docs/_build/html/_static/fonts/Lato-Bold.ttf b/docs/_build/html/_static/fonts/Lato-Bold.ttf new file mode 100644 index 0000000000..1d23c7066e Binary files /dev/null and b/docs/_build/html/_static/fonts/Lato-Bold.ttf differ diff --git a/docs/_build/html/_static/fonts/Lato-Regular.ttf b/docs/_build/html/_static/fonts/Lato-Regular.ttf new file mode 100644 index 0000000000..0f3d0f837d Binary files /dev/null and b/docs/_build/html/_static/fonts/Lato-Regular.ttf differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-bold.eot b/docs/_build/html/_static/fonts/Lato/lato-bold.eot new file mode 100644 index 0000000000..3361183a41 Binary files /dev/null and b/docs/_build/html/_static/fonts/Lato/lato-bold.eot differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-bold.ttf b/docs/_build/html/_static/fonts/Lato/lato-bold.ttf new file mode 100644 index 0000000000..29f691d5ed Binary files /dev/null and b/docs/_build/html/_static/fonts/Lato/lato-bold.ttf differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-bold.woff b/docs/_build/html/_static/fonts/Lato/lato-bold.woff new file mode 100644 index 0000000000..c6dff51f06 Binary files /dev/null and b/docs/_build/html/_static/fonts/Lato/lato-bold.woff differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-bold.woff2 b/docs/_build/html/_static/fonts/Lato/lato-bold.woff2 new file mode 100644 index 0000000000..bb195043cf Binary files /dev/null and b/docs/_build/html/_static/fonts/Lato/lato-bold.woff2 differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-bolditalic.eot b/docs/_build/html/_static/fonts/Lato/lato-bolditalic.eot new file mode 100644 index 0000000000..3d4154936b Binary files /dev/null and b/docs/_build/html/_static/fonts/Lato/lato-bolditalic.eot differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-bolditalic.ttf b/docs/_build/html/_static/fonts/Lato/lato-bolditalic.ttf new file mode 100644 index 0000000000..f402040b3e Binary files /dev/null and b/docs/_build/html/_static/fonts/Lato/lato-bolditalic.ttf differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-bolditalic.woff b/docs/_build/html/_static/fonts/Lato/lato-bolditalic.woff new file mode 100644 index 0000000000..88ad05b9ff Binary files /dev/null and b/docs/_build/html/_static/fonts/Lato/lato-bolditalic.woff differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-bolditalic.woff2 b/docs/_build/html/_static/fonts/Lato/lato-bolditalic.woff2 new file mode 100644 index 0000000000..c4e3d804b5 Binary files /dev/null and b/docs/_build/html/_static/fonts/Lato/lato-bolditalic.woff2 differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-italic.eot b/docs/_build/html/_static/fonts/Lato/lato-italic.eot new file mode 100644 index 0000000000..3f826421a1 Binary files /dev/null and b/docs/_build/html/_static/fonts/Lato/lato-italic.eot differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-italic.ttf b/docs/_build/html/_static/fonts/Lato/lato-italic.ttf new file mode 100644 index 0000000000..b4bfc9b24a Binary files /dev/null and b/docs/_build/html/_static/fonts/Lato/lato-italic.ttf differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-italic.woff b/docs/_build/html/_static/fonts/Lato/lato-italic.woff new file mode 100644 index 0000000000..76114bc033 Binary files /dev/null and b/docs/_build/html/_static/fonts/Lato/lato-italic.woff differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-italic.woff2 b/docs/_build/html/_static/fonts/Lato/lato-italic.woff2 new file mode 100644 index 0000000000..3404f37e2e Binary files /dev/null and b/docs/_build/html/_static/fonts/Lato/lato-italic.woff2 differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-regular.eot b/docs/_build/html/_static/fonts/Lato/lato-regular.eot new file mode 100644 index 0000000000..11e3f2a5f0 Binary files /dev/null and b/docs/_build/html/_static/fonts/Lato/lato-regular.eot differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-regular.ttf b/docs/_build/html/_static/fonts/Lato/lato-regular.ttf new file mode 100644 index 0000000000..74decd9ebb Binary files /dev/null and b/docs/_build/html/_static/fonts/Lato/lato-regular.ttf differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-regular.woff b/docs/_build/html/_static/fonts/Lato/lato-regular.woff new file mode 100644 index 0000000000..ae1307ff5f Binary files /dev/null and b/docs/_build/html/_static/fonts/Lato/lato-regular.woff differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-regular.woff2 b/docs/_build/html/_static/fonts/Lato/lato-regular.woff2 new file mode 100644 index 0000000000..3bf9843328 Binary files /dev/null and b/docs/_build/html/_static/fonts/Lato/lato-regular.woff2 differ diff --git a/docs/_build/html/_static/fonts/RobotoSlab-Bold.ttf b/docs/_build/html/_static/fonts/RobotoSlab-Bold.ttf new file mode 100644 index 0000000000..df5d1df273 Binary files /dev/null and b/docs/_build/html/_static/fonts/RobotoSlab-Bold.ttf differ diff --git a/docs/_build/html/_static/fonts/RobotoSlab-Regular.ttf b/docs/_build/html/_static/fonts/RobotoSlab-Regular.ttf new file mode 100644 index 0000000000..eb52a79073 Binary files /dev/null and b/docs/_build/html/_static/fonts/RobotoSlab-Regular.ttf differ diff --git a/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot new file mode 100644 index 0000000000..79dc8efed3 Binary files /dev/null and b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot differ diff --git a/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf new file mode 100644 index 0000000000..df5d1df273 Binary files /dev/null and b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf differ diff --git a/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff new file mode 100644 index 0000000000..6cb6000018 Binary files /dev/null and b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff differ diff --git a/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 new file mode 100644 index 0000000000..7059e23142 Binary files /dev/null and b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 differ diff --git a/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot new file mode 100644 index 0000000000..2f7ca78a1e Binary files /dev/null and b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot differ diff --git a/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf new file mode 100644 index 0000000000..eb52a79073 Binary files /dev/null and b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf differ diff --git a/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff new file mode 100644 index 0000000000..f815f63f99 Binary files /dev/null and b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff differ diff --git a/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 new file mode 100644 index 0000000000..f2c76e5bda Binary files /dev/null and b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 differ diff --git a/docs/_build/html/_static/fonts/fontawesome-webfont.eot b/docs/_build/html/_static/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000000..e9f60ca953 Binary files /dev/null and b/docs/_build/html/_static/fonts/fontawesome-webfont.eot differ diff --git a/docs/_build/html/_static/fonts/fontawesome-webfont.svg b/docs/_build/html/_static/fonts/fontawesome-webfont.svg new file mode 100644 index 0000000000..855c845e53 --- /dev/null +++ b/docs/_build/html/_static/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/_build/html/_static/fonts/fontawesome-webfont.ttf b/docs/_build/html/_static/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000000..35acda2fa1 Binary files /dev/null and b/docs/_build/html/_static/fonts/fontawesome-webfont.ttf differ diff --git a/docs/_build/html/_static/fonts/fontawesome-webfont.woff b/docs/_build/html/_static/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000000..400014a4b0 Binary files /dev/null and b/docs/_build/html/_static/fonts/fontawesome-webfont.woff differ diff --git a/docs/_build/html/_static/fonts/fontawesome-webfont.woff2 b/docs/_build/html/_static/fonts/fontawesome-webfont.woff2 new file mode 100644 index 0000000000..4d13fc6040 Binary files /dev/null and b/docs/_build/html/_static/fonts/fontawesome-webfont.woff2 differ diff --git a/docs/_build/html/_static/jquery-3.2.1.js b/docs/_build/html/_static/jquery-3.2.1.js new file mode 100644 index 0000000000..d2d8ca4790 --- /dev/null +++ b/docs/_build/html/_static/jquery-3.2.1.js @@ -0,0 +1,10253 @@ +/*! + * jQuery JavaScript Library v3.2.1 + * https://jquery.com/ + * + * Includes Sizzle.js + * https://sizzlejs.com/ + * + * Copyright JS Foundation and other contributors + * Released under the MIT license + * https://jquery.org/license + * + * Date: 2017-03-20T18:59Z + */ +( function( global, factory ) { + + "use strict"; + + if ( typeof module === "object" && typeof module.exports === "object" ) { + + // For CommonJS and CommonJS-like environments where a proper `window` + // is present, execute the factory and get jQuery. + // For environments that do not have a `window` with a `document` + // (such as Node.js), expose a factory as module.exports. + // This accentuates the need for the creation of a real `window`. + // e.g. var jQuery = require("jquery")(window); + // See ticket #14549 for more info. + module.exports = global.document ? + factory( global, true ) : + function( w ) { + if ( !w.document ) { + throw new Error( "jQuery requires a window with a document" ); + } + return factory( w ); + }; + } else { + factory( global ); + } + +// Pass this if window is not defined yet +} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { + +// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 +// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode +// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common +// enough that all such attempts are guarded in a try block. +"use strict"; + +var arr = []; + +var document = window.document; + +var getProto = Object.getPrototypeOf; + +var slice = arr.slice; + +var concat = arr.concat; + +var push = arr.push; + +var indexOf = arr.indexOf; + +var class2type = {}; + +var toString = class2type.toString; + +var hasOwn = class2type.hasOwnProperty; + +var fnToString = hasOwn.toString; + +var ObjectFunctionString = fnToString.call( Object ); + +var support = {}; + + + + function DOMEval( code, doc ) { + doc = doc || document; + + var script = doc.createElement( "script" ); + + script.text = code; + doc.head.appendChild( script ).parentNode.removeChild( script ); + } +/* global Symbol */ +// Defining this global in .eslintrc.json would create a danger of using the global +// unguarded in another place, it seems safer to define global only for this module + + + +var + version = "3.2.1", + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + + // The jQuery object is actually just the init constructor 'enhanced' + // Need init if jQuery is called (just allow error to be thrown if not included) + return new jQuery.fn.init( selector, context ); + }, + + // Support: Android <=4.0 only + // Make sure we trim BOM and NBSP + rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, + + // Matches dashed string for camelizing + rmsPrefix = /^-ms-/, + rdashAlpha = /-([a-z])/g, + + // Used by jQuery.camelCase as callback to replace() + fcamelCase = function( all, letter ) { + return letter.toUpperCase(); + }; + +jQuery.fn = jQuery.prototype = { + + // The current version of jQuery being used + jquery: version, + + constructor: jQuery, + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + + // Return all the elements in a clean array + if ( num == null ) { + return slice.call( this ); + } + + // Return just the one element from the set + return num < 0 ? this[ num + this.length ] : this[ num ]; + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + each: function( callback ) { + return jQuery.each( this, callback ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map( this, function( elem, i ) { + return callback.call( elem, i, elem ); + } ) ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: arr.sort, + splice: arr.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[ 0 ] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // Skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction( target ) ) { + target = {}; + } + + // Extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + + // Only deal with non-null/undefined values + if ( ( options = arguments[ i ] ) != null ) { + + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject( copy ) || + ( copyIsArray = Array.isArray( copy ) ) ) ) { + + if ( copyIsArray ) { + copyIsArray = false; + clone = src && Array.isArray( src ) ? src : []; + + } else { + clone = src && jQuery.isPlainObject( src ) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend( { + + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + isFunction: function( obj ) { + return jQuery.type( obj ) === "function"; + }, + + isWindow: function( obj ) { + return obj != null && obj === obj.window; + }, + + isNumeric: function( obj ) { + + // As of jQuery 3.0, isNumeric is limited to + // strings and numbers (primitives or objects) + // that can be coerced to finite numbers (gh-2662) + var type = jQuery.type( obj ); + return ( type === "number" || type === "string" ) && + + // parseFloat NaNs numeric-cast false positives ("") + // ...but misinterprets leading-number strings, particularly hex literals ("0x...") + // subtraction forces infinities to NaN + !isNaN( obj - parseFloat( obj ) ); + }, + + isPlainObject: function( obj ) { + var proto, Ctor; + + // Detect obvious negatives + // Use toString instead of jQuery.type to catch host objects + if ( !obj || toString.call( obj ) !== "[object Object]" ) { + return false; + } + + proto = getProto( obj ); + + // Objects with no prototype (e.g., `Object.create( null )`) are plain + if ( !proto ) { + return true; + } + + // Objects with prototype are plain iff they were constructed by a global Object function + Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; + return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; + }, + + isEmptyObject: function( obj ) { + + /* eslint-disable no-unused-vars */ + // See https://github.com/eslint/eslint/issues/6125 + var name; + + for ( name in obj ) { + return false; + } + return true; + }, + + type: function( obj ) { + if ( obj == null ) { + return obj + ""; + } + + // Support: Android <=2.3 only (functionish RegExp) + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call( obj ) ] || "object" : + typeof obj; + }, + + // Evaluates a script in a global context + globalEval: function( code ) { + DOMEval( code ); + }, + + // Convert dashed to camelCase; used by the css and data modules + // Support: IE <=9 - 11, Edge 12 - 13 + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + each: function( obj, callback ) { + var length, i = 0; + + if ( isArrayLike( obj ) ) { + length = obj.length; + for ( ; i < length; i++ ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } else { + for ( i in obj ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } + + return obj; + }, + + // Support: Android <=4.0 only + trim: function( text ) { + return text == null ? + "" : + ( text + "" ).replace( rtrim, "" ); + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArrayLike( Object( arr ) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + return arr == null ? -1 : indexOf.call( arr, elem, i ); + }, + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + for ( ; j < len; j++ ) { + first[ i++ ] = second[ j ]; + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var length, value, + i = 0, + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArrayLike( elems ) ) { + length = elems.length; + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + var tmp, args, proxy; + + if ( typeof context === "string" ) { + tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + args = slice.call( arguments, 2 ); + proxy = function() { + return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || jQuery.guid++; + + return proxy; + }, + + now: Date.now, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +} ); + +if ( typeof Symbol === "function" ) { + jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; +} + +// Populate the class2type map +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), +function( i, name ) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +} ); + +function isArrayLike( obj ) { + + // Support: real iOS 8.2 only (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = !!obj && "length" in obj && obj.length, + type = jQuery.type( obj ); + + if ( type === "function" || jQuery.isWindow( obj ) ) { + return false; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v2.3.3 + * https://sizzlejs.com/ + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2016-08-08 + */ +(function( window ) { + +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + 1 * new Date(), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // Instance methods + hasOwn = ({}).hasOwnProperty, + arr = [], + pop = arr.pop, + push_native = arr.push, + push = arr.push, + slice = arr.slice, + // Use a stripped-down indexOf as it's faster than native + // https://jsperf.com/thor-indexof-vs-for/5 + indexOf = function( list, elem ) { + var i = 0, + len = list.length; + for ( ; i < len; i++ ) { + if ( list[i] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + + // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+", + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + + "*\\]", + + pseudos = ":(" + identifier + ")(?:\\((" + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), + + rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + identifier + ")" ), + "CLASS": new RegExp( "^\\.(" + identifier + ")" ), + "TAG": new RegExp( "^(" + identifier + "|[*])" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + + // CSS escapes + // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), + funescape = function( _, escaped, escapedWhitespace ) { + var high = "0x" + escaped - 0x10000; + // NaN means non-codepoint + // Support: Firefox<24 + // Workaround erroneous numeric interpretation of +"0x" + return high !== high || escapedWhitespace ? + escaped : + high < 0 ? + // BMP codepoint + String.fromCharCode( high + 0x10000 ) : + // Supplemental Plane codepoint (surrogate pair) + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // CSS string/identifier serialization + // https://drafts.csswg.org/cssom/#common-serializing-idioms + rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, + fcssescape = function( ch, asCodePoint ) { + if ( asCodePoint ) { + + // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER + if ( ch === "\0" ) { + return "\uFFFD"; + } + + // Control characters and (dependent upon position) numbers get escaped as code points + return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; + } + + // Other potentially-special ASCII characters get backslash-escaped + return "\\" + ch; + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function() { + setDocument(); + }, + + disabledAncestor = addCombinator( + function( elem ) { + return elem.disabled === true && ("form" in elem || "label" in elem); + }, + { dir: "parentNode", next: "legend" } + ); + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + (arr = slice.call( preferredDoc.childNodes )), + preferredDoc.childNodes + ); + // Support: Android<4.0 + // Detect silently failing push.apply + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + push_native.apply( target, slice.call(els) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + // Can't trust NodeList.length + while ( (target[j++] = els[i++]) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var m, i, elem, nid, match, groups, newSelector, + newContext = context && context.ownerDocument, + + // nodeType defaults to 9, since context defaults to document + nodeType = context ? context.nodeType : 9; + + results = results || []; + + // Return early from calls with invalid selector or context + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + // Try to shortcut find operations (as opposed to filters) in HTML documents + if ( !seed ) { + + if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { + setDocument( context ); + } + context = context || document; + + if ( documentIsHTML ) { + + // If the selector is sufficiently simple, try using a "get*By*" DOM method + // (excepting DocumentFragment context, where the methods don't exist) + if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { + + // ID selector + if ( (m = match[1]) ) { + + // Document context + if ( nodeType === 9 ) { + if ( (elem = context.getElementById( m )) ) { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + + // Element context + } else { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( newContext && (elem = newContext.getElementById( m )) && + contains( context, elem ) && + elem.id === m ) { + + results.push( elem ); + return results; + } + } + + // Type selector + } else if ( match[2] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Class selector + } else if ( (m = match[3]) && support.getElementsByClassName && + context.getElementsByClassName ) { + + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // Take advantage of querySelectorAll + if ( support.qsa && + !compilerCache[ selector + " " ] && + (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { + + if ( nodeType !== 1 ) { + newContext = context; + newSelector = selector; + + // qSA looks outside Element context, which is not what we want + // Thanks to Andrew Dupont for this workaround technique + // Support: IE <=8 + // Exclude object elements + } else if ( context.nodeName.toLowerCase() !== "object" ) { + + // Capture the context ID, setting it first if necessary + if ( (nid = context.getAttribute( "id" )) ) { + nid = nid.replace( rcssescape, fcssescape ); + } else { + context.setAttribute( "id", (nid = expando) ); + } + + // Prefix every selector in the list + groups = tokenize( selector ); + i = groups.length; + while ( i-- ) { + groups[i] = "#" + nid + " " + toSelector( groups[i] ); + } + newSelector = groups.join( "," ); + + // Expand context for sibling selectors + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || + context; + } + + if ( newSelector ) { + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch ( qsaError ) { + } finally { + if ( nid === expando ) { + context.removeAttribute( "id" ); + } + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {function(string, object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return (cache[ key + " " ] = value); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created element and returns a boolean result + */ +function assert( fn ) { + var el = document.createElement("fieldset"); + + try { + return !!fn( el ); + } catch (e) { + return false; + } finally { + // Remove from its parent by default + if ( el.parentNode ) { + el.parentNode.removeChild( el ); + } + // release memory in IE + el = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split("|"), + i = arr.length; + + while ( i-- ) { + Expr.attrHandle[ arr[i] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + a.sourceIndex - b.sourceIndex; + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( (cur = cur.nextSibling) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for :enabled/:disabled + * @param {Boolean} disabled true for :disabled; false for :enabled + */ +function createDisabledPseudo( disabled ) { + + // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable + return function( elem ) { + + // Only certain elements can match :enabled or :disabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled + if ( "form" in elem ) { + + // Check for inherited disabledness on relevant non-disabled elements: + // * listed form-associated elements in a disabled fieldset + // https://html.spec.whatwg.org/multipage/forms.html#category-listed + // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled + // * option elements in a disabled optgroup + // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled + // All such elements have a "form" property. + if ( elem.parentNode && elem.disabled === false ) { + + // Option elements defer to a parent optgroup if present + if ( "label" in elem ) { + if ( "label" in elem.parentNode ) { + return elem.parentNode.disabled === disabled; + } else { + return elem.disabled === disabled; + } + } + + // Support: IE 6 - 11 + // Use the isDisabled shortcut property to check for disabled fieldset ancestors + return elem.isDisabled === disabled || + + // Where there is no isDisabled, check manually + /* jshint -W018 */ + elem.isDisabled !== !disabled && + disabledAncestor( elem ) === disabled; + } + + return elem.disabled === disabled; + + // Try to winnow out elements that can't be disabled before trusting the disabled property. + // Some victims get caught in our net (label, legend, menu, track), but it shouldn't + // even exist on them, let alone have a boolean value. + } else if ( "label" in elem ) { + return elem.disabled === disabled; + } + + // Remaining elements are neither :enabled nor :disabled + return false; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction(function( argument ) { + argument = +argument; + return markFunction(function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ (j = matchIndexes[i]) ] ) { + seed[j] = !(matches[j] = seed[j]); + } + } + }); + }); +} + +/** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== "undefined" && context; +} + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ +isXML = Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = elem && (elem.ownerDocument || elem).documentElement; + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var hasCompare, subWindow, + doc = node ? node.ownerDocument || node : preferredDoc; + + // Return early if doc is invalid or already selected + if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Update global variables + document = doc; + docElem = document.documentElement; + documentIsHTML = !isXML( document ); + + // Support: IE 9-11, Edge + // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) + if ( preferredDoc !== document && + (subWindow = document.defaultView) && subWindow.top !== subWindow ) { + + // Support: IE 11, Edge + if ( subWindow.addEventListener ) { + subWindow.addEventListener( "unload", unloadHandler, false ); + + // Support: IE 9 - 10 only + } else if ( subWindow.attachEvent ) { + subWindow.attachEvent( "onunload", unloadHandler ); + } + } + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties + // (excepting IE8 booleans) + support.attributes = assert(function( el ) { + el.className = "i"; + return !el.getAttribute("className"); + }); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert(function( el ) { + el.appendChild( document.createComment("") ); + return !el.getElementsByTagName("*").length; + }); + + // Support: IE<9 + support.getElementsByClassName = rnative.test( document.getElementsByClassName ); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programmatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert(function( el ) { + docElem.appendChild( el ).id = expando; + return !document.getElementsByName || !document.getElementsByName( expando ).length; + }); + + // ID filter and find + if ( support.getById ) { + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute("id") === attrId; + }; + }; + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var elem = context.getElementById( id ); + return elem ? [ elem ] : []; + } + }; + } else { + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== "undefined" && + elem.getAttributeNode("id"); + return node && node.value === attrId; + }; + }; + + // Support: IE 6 - 7 only + // getElementById is not reliable as a find shortcut + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var node, i, elems, + elem = context.getElementById( id ); + + if ( elem ) { + + // Verify the id attribute + node = elem.getAttributeNode("id"); + if ( node && node.value === id ) { + return [ elem ]; + } + + // Fall back on getElementsByName + elems = context.getElementsByName( id ); + i = 0; + while ( (elem = elems[i++]) ) { + node = elem.getAttributeNode("id"); + if ( node && node.value === id ) { + return [ elem ]; + } + } + } + + return []; + } + }; + } + + // Tag + Expr.find["TAG"] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else if ( support.qsa ) { + return context.querySelectorAll( tag ); + } + } : + + function( tag, context ) { + var elem, + tmp = [], + i = 0, + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( (elem = results[i++]) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { + if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See https://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( (support.qsa = rnative.test( document.querySelectorAll )) ) { + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert(function( el ) { + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // https://bugs.jquery.com/ticket/12359 + docElem.appendChild( el ).innerHTML = "" + + ""; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( el.querySelectorAll("[msallowcapture^='']").length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !el.querySelectorAll("[selected]").length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ + if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push("~="); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !el.querySelectorAll(":checked").length ) { + rbuggyQSA.push(":checked"); + } + + // Support: Safari 8+, iOS 8+ + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibling-combinator selector` fails + if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push(".#.+[+~]"); + } + }); + + assert(function( el ) { + el.innerHTML = "" + + ""; + + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = document.createElement("input"); + input.setAttribute( "type", "hidden" ); + el.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( el.querySelectorAll("[name=d]").length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( el.querySelectorAll(":enabled").length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: IE9-11+ + // IE's :disabled selector does not pick up the children of disabled fieldsets + docElem.appendChild( el ).disabled = true; + if ( el.querySelectorAll(":disabled").length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Opera 10-11 does not throw on post-comma invalid pseudos + el.querySelectorAll("*,:x"); + rbuggyQSA.push(",.*:"); + }); + } + + if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector) )) ) { + + assert(function( el ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( el, "*" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( el, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + }); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test( docElem.compareDocumentPosition ); + + // Element contains another + // Purposefully self-exclusive + // As in, an element does not contain itself + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + )); + } : + function( a, b ) { + if ( b ) { + while ( (b = b.parentNode) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { + + // Choose the first element that is related to our preferred document + if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { + return -1; + } + if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function( a, b ) { + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Parentless nodes are either documents or disconnected + if ( !aup || !bup ) { + return a === document ? -1 : + b === document ? 1 : + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( (cur = cur.parentNode) ) { + ap.unshift( cur ); + } + cur = b; + while ( (cur = cur.parentNode) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[i] === bp[i] ) { + i++; + } + + return i ? + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[i], bp[i] ) : + + // Otherwise nodes in our document sort first + ap[i] === preferredDoc ? -1 : + bp[i] === preferredDoc ? 1 : + 0; + }; + + return document; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + // Make sure that attribute selectors are quoted + expr = expr.replace( rattributeQuotes, "='$1']" ); + + if ( support.matchesSelector && documentIsHTML && + !compilerCache[ expr + " " ] && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch (e) {} + } + + return Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + // Set document vars if needed + if ( ( context.ownerDocument || context ) !== document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + (val = elem.getAttributeNode(name)) && val.specified ? + val.value : + null; +}; + +Sizzle.escape = function( sel ) { + return (sel + "").replace( rcssescape, fcssescape ); +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( (elem = results[i++]) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + // If no nodeType, this is expected to be an array + while ( (node = elem[i++]) ) { + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[1] = match[1].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); + + if ( match[2] === "~=" ) { + match[3] = " " + match[3] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[1] = match[1].toLowerCase(); + + if ( match[1].slice( 0, 3 ) === "nth" ) { + // nth-* requires argument + if ( !match[3] ) { + Sizzle.error( match[0] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); + match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); + + // other types prohibit arguments + } else if ( match[3] ) { + Sizzle.error( match[0] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[6] && match[2]; + + if ( matchExpr["CHILD"].test( match[0] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[3] ) { + match[2] = match[4] || match[5] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + // Get excess from tokenize (recursively) + (excess = tokenize( unquoted, true )) && + // advance to the next closing parenthesis + (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { + + // excess is a negative index + match[0] = match[0].slice( 0, excess ); + match[2] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { return true; } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && + classCache( className, function( elem ) { + return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); + }); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + }; + }, + + "CHILD": function( type, what, argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, context, xml ) { + var cache, uniqueCache, outerCache, node, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType, + diff = false; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( (node = node[ dir ]) ) { + if ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) { + + return false; + } + } + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + + // Seek `elem` from a previously-cached index + + // ...in a gzip-friendly way + node = parent; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex && cache[ 2 ]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( (node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + (diff = nodeIndex = 0) || start.pop()) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + } else { + // Use previously-cached element index if available + if ( useCache ) { + // ...in a gzip-friendly way + node = elem; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex; + } + + // xml :nth-child(...) + // or :nth-last-child(...) or :nth(-last)?-of-type(...) + if ( diff === false ) { + // Use the same loop as above to seek `elem` from the start + while ( (node = ++nodeIndex && node && node[ dir ] || + (diff = nodeIndex = 0) || start.pop()) ) { + + if ( ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) && + ++diff ) { + + // Cache the index of each encountered element + if ( useCache ) { + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + uniqueCache[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction(function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf( seed, matched[i] ); + seed[ idx ] = !( matches[ idx ] = matched[i] ); + } + }) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + // Potentially complex pseudos + "not": markFunction(function( selector ) { + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction(function( seed, matches, context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( (elem = unmatched[i]) ) { + seed[i] = !(matches[i] = elem); + } + } + }) : + function( elem, context, xml ) { + input[0] = elem; + matcher( input, null, xml, results ); + // Don't keep the element (issue #299) + input[0] = null; + return !results.pop(); + }; + }), + + "has": markFunction(function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + }), + + "contains": markFunction(function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; + }; + }), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + // lang value must be a valid identifier + if ( !ridentifier.test(lang || "") ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( (elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); + return false; + }; + }), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); + }, + + // Boolean properties + "enabled": createDisabledPseudo( false ), + "disabled": createDisabledPseudo( true ), + + "checked": function( elem ) { + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); + }, + + "selected": function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos["empty"]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + "first": createPositionalPseudo(function() { + return [ 0 ]; + }), + + "last": createPositionalPseudo(function( matchIndexes, length ) { + return [ length - 1 ]; + }), + + "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + }), + + "even": createPositionalPseudo(function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "odd": createPositionalPseudo(function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }) + } +}; + +Expr.pseudos["nth"] = Expr.pseudos["eq"]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +tokenize = Sizzle.tokenize = function( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || (match = rcomma.exec( soFar )) ) { + if ( match ) { + // Don't consume trailing commas as valid + soFar = soFar.slice( match[0].length ) || soFar; + } + groups.push( (tokens = []) ); + } + + matched = false; + + // Combinators + if ( (match = rcombinators.exec( soFar )) ) { + matched = match.shift(); + tokens.push({ + value: matched, + // Cast descendant combinators to space + type: match[0].replace( rtrim, " " ) + }); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || + (match = preFilters[ type ]( match ))) ) { + matched = match.shift(); + tokens.push({ + value: matched, + type: type, + matches: match + }); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +}; + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[i].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + skip = combinator.next, + key = skip || dir, + checkNonElements = base && key === "parentNode", + doneName = done++; + + return combinator.first ? + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + return false; + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, uniqueCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching + if ( xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || (elem[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {}); + + if ( skip && skip === elem.nodeName.toLowerCase() ) { + elem = elem[ dir ] || elem; + } else if ( (oldCache = uniqueCache[ key ]) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return (newCache[ 2 ] = oldCache[ 2 ]); + } else { + // Reuse newcache so results back-propagate to previous elements + uniqueCache[ key ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { + return true; + } + } + } + } + } + return false; + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[i]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[0]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[i], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( (elem = unmatched[i]) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction(function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( (elem = temp[i]) ) { + matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) ) { + // Restore matcherIn since elem is not yet a final match + temp.push( (matcherIn[i] = elem) ); + } + } + postFinder( null, (matcherOut = []), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) && + (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { + + seed[temp] = !(results[temp] = elem); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + }); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[0].type ], + implicitRelative = leadingRelative || Expr.relative[" "], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + (checkContext = context).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + // Avoid hanging onto element (issue #299) + checkContext = null; + return ret; + } ]; + + for ( ; i < len; i++ ) { + if ( (matcher = Expr.relative[ tokens[i].type ]) ) { + matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; + } else { + matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[j].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), + len = elems.length; + + if ( outermost ) { + outermostContext = context === document || context || outermost; + } + + // Add elements passing elementMatchers directly to results + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id + for ( ; i !== len && (elem = elems[i]) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + if ( !context && elem.ownerDocument !== document ) { + setDocument( elem ); + xml = !documentIsHTML; + } + while ( (matcher = elementMatchers[j++]) ) { + if ( matcher( elem, context || document, xml) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + // They will have gone through all possible matchers + if ( (elem = !matcher && elem) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // `i` is now the count of elements visited above, and adding it to `matchedCount` + // makes the latter nonnegative. + matchedCount += i; + + // Apply set filters to unmatched elements + // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` + // equals `i`), unless we didn't visit _any_ elements in the above loop because we have + // no element matchers and no seed. + // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that + // case, which will result in a "00" `matchedCount` that differs from `i` but is also + // numerically zero. + if ( bySet && i !== matchedCount ) { + j = 0; + while ( (matcher = setMatchers[j++]) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !(unmatched[i] || setMatched[i]) ) { + setMatched[i] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[i] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +}; + +/** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +select = Sizzle.select = function( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( (selector = compiled.selector || selector) ); + + results = results || []; + + // Try to minimize operations if there is only one selector in the list and no seed + // (the latter of which guarantees us context) + if ( match.length === 1 ) { + + // Reduce context if the leading compound selector is an ID + tokens = match[0] = match[0].slice( 0 ); + if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && + context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) { + + context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[i]; + + // Abort if we hit a combinator + if ( Expr.relative[ (type = token.type) ] ) { + break; + } + if ( (find = Expr.find[ type ]) ) { + // Search, expanding context for leading sibling combinators + if ( (seed = find( + token.matches[0].replace( runescape, funescape ), + rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context + )) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + !context || rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +}; + +// One-time assignments + +// Sort stability +support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; + +// Support: Chrome 14-35+ +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert(function( el ) { + // Should return 1, but returns 4 (following) + return el.compareDocumentPosition( document.createElement("fieldset") ) & 1; +}); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert(function( el ) { + el.innerHTML = ""; + return el.firstChild.getAttribute("href") === "#" ; +}) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + }); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert(function( el ) { + el.innerHTML = ""; + el.firstChild.setAttribute( "value", "" ); + return el.firstChild.getAttribute( "value" ) === ""; +}) ) { + addHandle( "value", function( elem, name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + }); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert(function( el ) { + return el.getAttribute("disabled") == null; +}) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return elem[ name ] === true ? name.toLowerCase() : + (val = elem.getAttributeNode( name )) && val.specified ? + val.value : + null; + } + }); +} + +return Sizzle; + +})( window ); + + + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; + +// Deprecated +jQuery.expr[ ":" ] = jQuery.expr.pseudos; +jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; +jQuery.escapeSelector = Sizzle.escape; + + + + +var dir = function( elem, dir, until ) { + var matched = [], + truncate = until !== undefined; + + while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { + if ( elem.nodeType === 1 ) { + if ( truncate && jQuery( elem ).is( until ) ) { + break; + } + matched.push( elem ); + } + } + return matched; +}; + + +var siblings = function( n, elem ) { + var matched = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + matched.push( n ); + } + } + + return matched; +}; + + +var rneedsContext = jQuery.expr.match.needsContext; + + + +function nodeName( elem, name ) { + + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + +}; +var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); + + + +var risSimple = /^.[^:#\[\.,]*$/; + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + return !!qualifier.call( elem, i, elem ) !== not; + } ); + } + + // Single element + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + } ); + } + + // Arraylike of elements (jQuery, arguments, Array) + if ( typeof qualifier !== "string" ) { + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) > -1 ) !== not; + } ); + } + + // Simple selector that can be filtered directly, removing non-Elements + if ( risSimple.test( qualifier ) ) { + return jQuery.filter( qualifier, elements, not ); + } + + // Complex selector, compare the two sets, removing non-Elements + qualifier = jQuery.filter( qualifier, elements ); + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) > -1 ) !== not && elem.nodeType === 1; + } ); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + if ( elems.length === 1 && elem.nodeType === 1 ) { + return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; + } + + return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + } ) ); +}; + +jQuery.fn.extend( { + find: function( selector ) { + var i, ret, + len = this.length, + self = this; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + } ) ); + } + + ret = this.pushStack( [] ); + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + return len > 1 ? jQuery.uniqueSort( ret ) : ret; + }, + filter: function( selector ) { + return this.pushStack( winnow( this, selector || [], false ) ); + }, + not: function( selector ) { + return this.pushStack( winnow( this, selector || [], true ) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +} ); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + // Shortcut simple #id case for speed + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, + + init = jQuery.fn.init = function( selector, context, root ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // Method init() accepts an alternate rootjQuery + // so migrate can support jQuery.sub (gh-2101) + root = root || rootjQuery; + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector[ 0 ] === "<" && + selector[ selector.length - 1 ] === ">" && + selector.length >= 3 ) { + + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && ( match[ 1 ] || !context ) ) { + + // HANDLE: $(html) -> $(array) + if ( match[ 1 ] ) { + context = context instanceof jQuery ? context[ 0 ] : context; + + // Option to run scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[ 1 ], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + + // Properties of context are called as methods if possible + if ( jQuery.isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[ 2 ] ); + + if ( elem ) { + + // Inject the element directly into the jQuery object + this[ 0 ] = elem; + this.length = 1; + } + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || root ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this[ 0 ] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return root.ready !== undefined ? + root.ready( selector ) : + + // Execute immediately if ready is not present + selector( jQuery ); + } + + return jQuery.makeArray( selector, this ); + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + + // Methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend( { + has: function( target ) { + var targets = jQuery( target, this ), + l = targets.length; + + return this.filter( function() { + var i = 0; + for ( ; i < l; i++ ) { + if ( jQuery.contains( this, targets[ i ] ) ) { + return true; + } + } + } ); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + targets = typeof selectors !== "string" && jQuery( selectors ); + + // Positional selectors never match, since there's no _selection_ context + if ( !rneedsContext.test( selectors ) ) { + for ( ; i < l; i++ ) { + for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { + + // Always skip document fragments + if ( cur.nodeType < 11 && ( targets ? + targets.index( cur ) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector( cur, selectors ) ) ) { + + matched.push( cur ); + break; + } + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); + }, + + // Determine the position of an element within the set + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; + } + + // Index in selector + if ( typeof elem === "string" ) { + return indexOf.call( jQuery( elem ), this[ 0 ] ); + } + + // Locate the position of the desired element + return indexOf.call( this, + + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[ 0 ] : elem + ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.uniqueSort( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + } +} ); + +function sibling( cur, dir ) { + while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} + return cur; +} + +jQuery.each( { + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return siblings( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return siblings( elem.firstChild ); + }, + contents: function( elem ) { + if ( nodeName( elem, "iframe" ) ) { + return elem.contentDocument; + } + + // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only + // Treat the template element as a regular one in browsers that + // don't support it. + if ( nodeName( elem, "template" ) ) { + elem = elem.content || elem; + } + + return jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var matched = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + matched = jQuery.filter( selector, matched ); + } + + if ( this.length > 1 ) { + + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + jQuery.uniqueSort( matched ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + matched.reverse(); + } + } + + return this.pushStack( matched ); + }; +} ); +var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); + + + +// Convert String-formatted options into Object-formatted ones +function createOptions( options ) { + var object = {}; + jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { + object[ flag ] = true; + } ); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + createOptions( options ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + + // Last fire value for non-forgettable lists + memory, + + // Flag to know if list was already fired + fired, + + // Flag to prevent firing + locked, + + // Actual callback list + list = [], + + // Queue of execution data for repeatable lists + queue = [], + + // Index of currently firing callback (modified by add/remove as needed) + firingIndex = -1, + + // Fire callbacks + fire = function() { + + // Enforce single-firing + locked = locked || options.once; + + // Execute callbacks for all pending executions, + // respecting firingIndex overrides and runtime changes + fired = firing = true; + for ( ; queue.length; firingIndex = -1 ) { + memory = queue.shift(); + while ( ++firingIndex < list.length ) { + + // Run callback and check for early termination + if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && + options.stopOnFalse ) { + + // Jump to end and forget the data so .add doesn't re-fire + firingIndex = list.length; + memory = false; + } + } + } + + // Forget the data if we're done with it + if ( !options.memory ) { + memory = false; + } + + firing = false; + + // Clean up if we're done firing for good + if ( locked ) { + + // Keep an empty list if we have data for future add calls + if ( memory ) { + list = []; + + // Otherwise, this object is spent + } else { + list = ""; + } + } + }, + + // Actual Callbacks object + self = { + + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + + // If we have memory from a past run, we should fire after adding + if ( memory && !firing ) { + firingIndex = list.length - 1; + queue.push( memory ); + } + + ( function add( args ) { + jQuery.each( args, function( _, arg ) { + if ( jQuery.isFunction( arg ) ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) { + + // Inspect recursively + add( arg ); + } + } ); + } )( arguments ); + + if ( memory && !firing ) { + fire(); + } + } + return this; + }, + + // Remove a callback from the list + remove: function() { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + + // Handle firing indexes + if ( index <= firingIndex ) { + firingIndex--; + } + } + } ); + return this; + }, + + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? + jQuery.inArray( fn, list ) > -1 : + list.length > 0; + }, + + // Remove all callbacks from the list + empty: function() { + if ( list ) { + list = []; + } + return this; + }, + + // Disable .fire and .add + // Abort any current/pending executions + // Clear all callbacks and values + disable: function() { + locked = queue = []; + list = memory = ""; + return this; + }, + disabled: function() { + return !list; + }, + + // Disable .fire + // Also disable .add unless we have memory (since it would have no effect) + // Abort any pending executions + lock: function() { + locked = queue = []; + if ( !memory && !firing ) { + list = memory = ""; + } + return this; + }, + locked: function() { + return !!locked; + }, + + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( !locked ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + queue.push( args ); + if ( !firing ) { + fire(); + } + } + return this; + }, + + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + +function Identity( v ) { + return v; +} +function Thrower( ex ) { + throw ex; +} + +function adoptValue( value, resolve, reject, noValue ) { + var method; + + try { + + // Check for promise aspect first to privilege synchronous behavior + if ( value && jQuery.isFunction( ( method = value.promise ) ) ) { + method.call( value ).done( resolve ).fail( reject ); + + // Other thenables + } else if ( value && jQuery.isFunction( ( method = value.then ) ) ) { + method.call( value, resolve, reject ); + + // Other non-thenables + } else { + + // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: + // * false: [ value ].slice( 0 ) => resolve( value ) + // * true: [ value ].slice( 1 ) => resolve() + resolve.apply( undefined, [ value ].slice( noValue ) ); + } + + // For Promises/A+, convert exceptions into rejections + // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in + // Deferred#then to conditionally suppress rejection. + } catch ( value ) { + + // Support: Android 4.0 only + // Strict mode functions invoked without .call/.apply get global-object context + reject.apply( undefined, [ value ] ); + } +} + +jQuery.extend( { + + Deferred: function( func ) { + var tuples = [ + + // action, add listener, callbacks, + // ... .then handlers, argument index, [final state] + [ "notify", "progress", jQuery.Callbacks( "memory" ), + jQuery.Callbacks( "memory" ), 2 ], + [ "resolve", "done", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 0, "resolved" ], + [ "reject", "fail", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 1, "rejected" ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + "catch": function( fn ) { + return promise.then( null, fn ); + }, + + // Keep pipe for back-compat + pipe: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + + return jQuery.Deferred( function( newDefer ) { + jQuery.each( tuples, function( i, tuple ) { + + // Map tuples (progress, done, fail) to arguments (done, fail, progress) + var fn = jQuery.isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; + + // deferred.progress(function() { bind to newDefer or newDefer.notify }) + // deferred.done(function() { bind to newDefer or newDefer.resolve }) + // deferred.fail(function() { bind to newDefer or newDefer.reject }) + deferred[ tuple[ 1 ] ]( function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise() + .progress( newDefer.notify ) + .done( newDefer.resolve ) + .fail( newDefer.reject ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( + this, + fn ? [ returned ] : arguments + ); + } + } ); + } ); + fns = null; + } ).promise(); + }, + then: function( onFulfilled, onRejected, onProgress ) { + var maxDepth = 0; + function resolve( depth, deferred, handler, special ) { + return function() { + var that = this, + args = arguments, + mightThrow = function() { + var returned, then; + + // Support: Promises/A+ section 2.3.3.3.3 + // https://promisesaplus.com/#point-59 + // Ignore double-resolution attempts + if ( depth < maxDepth ) { + return; + } + + returned = handler.apply( that, args ); + + // Support: Promises/A+ section 2.3.1 + // https://promisesaplus.com/#point-48 + if ( returned === deferred.promise() ) { + throw new TypeError( "Thenable self-resolution" ); + } + + // Support: Promises/A+ sections 2.3.3.1, 3.5 + // https://promisesaplus.com/#point-54 + // https://promisesaplus.com/#point-75 + // Retrieve `then` only once + then = returned && + + // Support: Promises/A+ section 2.3.4 + // https://promisesaplus.com/#point-64 + // Only check objects and functions for thenability + ( typeof returned === "object" || + typeof returned === "function" ) && + returned.then; + + // Handle a returned thenable + if ( jQuery.isFunction( then ) ) { + + // Special processors (notify) just wait for resolution + if ( special ) { + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ) + ); + + // Normal processors (resolve) also hook into progress + } else { + + // ...and disregard older resolution values + maxDepth++; + + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ), + resolve( maxDepth, deferred, Identity, + deferred.notifyWith ) + ); + } + + // Handle all other returned values + } else { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Identity ) { + that = undefined; + args = [ returned ]; + } + + // Process the value(s) + // Default process is resolve + ( special || deferred.resolveWith )( that, args ); + } + }, + + // Only normal processors (resolve) catch and reject exceptions + process = special ? + mightThrow : + function() { + try { + mightThrow(); + } catch ( e ) { + + if ( jQuery.Deferred.exceptionHook ) { + jQuery.Deferred.exceptionHook( e, + process.stackTrace ); + } + + // Support: Promises/A+ section 2.3.3.3.4.1 + // https://promisesaplus.com/#point-61 + // Ignore post-resolution exceptions + if ( depth + 1 >= maxDepth ) { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Thrower ) { + that = undefined; + args = [ e ]; + } + + deferred.rejectWith( that, args ); + } + } + }; + + // Support: Promises/A+ section 2.3.3.3.1 + // https://promisesaplus.com/#point-57 + // Re-resolve promises immediately to dodge false rejection from + // subsequent errors + if ( depth ) { + process(); + } else { + + // Call an optional hook to record the stack, in case of exception + // since it's otherwise lost when execution goes async + if ( jQuery.Deferred.getStackHook ) { + process.stackTrace = jQuery.Deferred.getStackHook(); + } + window.setTimeout( process ); + } + }; + } + + return jQuery.Deferred( function( newDefer ) { + + // progress_handlers.add( ... ) + tuples[ 0 ][ 3 ].add( + resolve( + 0, + newDefer, + jQuery.isFunction( onProgress ) ? + onProgress : + Identity, + newDefer.notifyWith + ) + ); + + // fulfilled_handlers.add( ... ) + tuples[ 1 ][ 3 ].add( + resolve( + 0, + newDefer, + jQuery.isFunction( onFulfilled ) ? + onFulfilled : + Identity + ) + ); + + // rejected_handlers.add( ... ) + tuples[ 2 ][ 3 ].add( + resolve( + 0, + newDefer, + jQuery.isFunction( onRejected ) ? + onRejected : + Thrower + ) + ); + } ).promise(); + }, + + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 5 ]; + + // promise.progress = list.add + // promise.done = list.add + // promise.fail = list.add + promise[ tuple[ 1 ] ] = list.add; + + // Handle state + if ( stateString ) { + list.add( + function() { + + // state = "resolved" (i.e., fulfilled) + // state = "rejected" + state = stateString; + }, + + // rejected_callbacks.disable + // fulfilled_callbacks.disable + tuples[ 3 - i ][ 2 ].disable, + + // progress_callbacks.lock + tuples[ 0 ][ 2 ].lock + ); + } + + // progress_handlers.fire + // fulfilled_handlers.fire + // rejected_handlers.fire + list.add( tuple[ 3 ].fire ); + + // deferred.notify = function() { deferred.notifyWith(...) } + // deferred.resolve = function() { deferred.resolveWith(...) } + // deferred.reject = function() { deferred.rejectWith(...) } + deferred[ tuple[ 0 ] ] = function() { + deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); + return this; + }; + + // deferred.notifyWith = list.fireWith + // deferred.resolveWith = list.fireWith + // deferred.rejectWith = list.fireWith + deferred[ tuple[ 0 ] + "With" ] = list.fireWith; + } ); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( singleValue ) { + var + + // count of uncompleted subordinates + remaining = arguments.length, + + // count of unprocessed arguments + i = remaining, + + // subordinate fulfillment data + resolveContexts = Array( i ), + resolveValues = slice.call( arguments ), + + // the master Deferred + master = jQuery.Deferred(), + + // subordinate callback factory + updateFunc = function( i ) { + return function( value ) { + resolveContexts[ i ] = this; + resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( !( --remaining ) ) { + master.resolveWith( resolveContexts, resolveValues ); + } + }; + }; + + // Single- and empty arguments are adopted like Promise.resolve + if ( remaining <= 1 ) { + adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, + !remaining ); + + // Use .then() to unwrap secondary thenables (cf. gh-3000) + if ( master.state() === "pending" || + jQuery.isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { + + return master.then(); + } + } + + // Multiple arguments are aggregated like Promise.all array elements + while ( i-- ) { + adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); + } + + return master.promise(); + } +} ); + + +// These usually indicate a programmer mistake during development, +// warn about them ASAP rather than swallowing them by default. +var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; + +jQuery.Deferred.exceptionHook = function( error, stack ) { + + // Support: IE 8 - 9 only + // Console exists when dev tools are open, which can happen at any time + if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { + window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); + } +}; + + + + +jQuery.readyException = function( error ) { + window.setTimeout( function() { + throw error; + } ); +}; + + + + +// The deferred used on DOM ready +var readyList = jQuery.Deferred(); + +jQuery.fn.ready = function( fn ) { + + readyList + .then( fn ) + + // Wrap jQuery.readyException in a function so that the lookup + // happens at the time of error handling instead of callback + // registration. + .catch( function( error ) { + jQuery.readyException( error ); + } ); + + return this; +}; + +jQuery.extend( { + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + } +} ); + +jQuery.ready.then = readyList.then; + +// The ready event handler and self cleanup method +function completed() { + document.removeEventListener( "DOMContentLoaded", completed ); + window.removeEventListener( "load", completed ); + jQuery.ready(); +} + +// Catch cases where $(document).ready() is called +// after the browser event has already occurred. +// Support: IE <=9 - 10 only +// Older IE sometimes signals "interactive" too soon +if ( document.readyState === "complete" || + ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { + + // Handle it asynchronously to allow scripts the opportunity to delay ready + window.setTimeout( jQuery.ready ); + +} else { + + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed ); +} + + + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + len = elems.length, + bulk = key == null; + + // Sets many values + if ( jQuery.type( key ) === "object" ) { + chainable = true; + for ( i in key ) { + access( elems, fn, i, key[ i ], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !jQuery.isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < len; i++ ) { + fn( + elems[ i ], key, raw ? + value : + value.call( elems[ i ], i, fn( elems[ i ], key ) ) + ); + } + } + } + + if ( chainable ) { + return elems; + } + + // Gets + if ( bulk ) { + return fn.call( elems ); + } + + return len ? fn( elems[ 0 ], key ) : emptyGet; +}; +var acceptData = function( owner ) { + + // Accepts only: + // - Node + // - Node.ELEMENT_NODE + // - Node.DOCUMENT_NODE + // - Object + // - Any + return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); +}; + + + + +function Data() { + this.expando = jQuery.expando + Data.uid++; +} + +Data.uid = 1; + +Data.prototype = { + + cache: function( owner ) { + + // Check if the owner object already has a cache + var value = owner[ this.expando ]; + + // If not, create one + if ( !value ) { + value = {}; + + // We can accept data for non-element nodes in modern browsers, + // but we should not, see #8335. + // Always return an empty object. + if ( acceptData( owner ) ) { + + // If it is a node unlikely to be stringify-ed or looped over + // use plain assignment + if ( owner.nodeType ) { + owner[ this.expando ] = value; + + // Otherwise secure it in a non-enumerable property + // configurable must be true to allow the property to be + // deleted when data is removed + } else { + Object.defineProperty( owner, this.expando, { + value: value, + configurable: true + } ); + } + } + } + + return value; + }, + set: function( owner, data, value ) { + var prop, + cache = this.cache( owner ); + + // Handle: [ owner, key, value ] args + // Always use camelCase key (gh-2257) + if ( typeof data === "string" ) { + cache[ jQuery.camelCase( data ) ] = value; + + // Handle: [ owner, { properties } ] args + } else { + + // Copy the properties one-by-one to the cache object + for ( prop in data ) { + cache[ jQuery.camelCase( prop ) ] = data[ prop ]; + } + } + return cache; + }, + get: function( owner, key ) { + return key === undefined ? + this.cache( owner ) : + + // Always use camelCase key (gh-2257) + owner[ this.expando ] && owner[ this.expando ][ jQuery.camelCase( key ) ]; + }, + access: function( owner, key, value ) { + + // In cases where either: + // + // 1. No key was specified + // 2. A string key was specified, but no value provided + // + // Take the "read" path and allow the get method to determine + // which value to return, respectively either: + // + // 1. The entire cache object + // 2. The data stored at the key + // + if ( key === undefined || + ( ( key && typeof key === "string" ) && value === undefined ) ) { + + return this.get( owner, key ); + } + + // When the key is not a string, or both a key and value + // are specified, set or extend (existing objects) with either: + // + // 1. An object of properties + // 2. A key and value + // + this.set( owner, key, value ); + + // Since the "set" path can have two possible entry points + // return the expected data based on which path was taken[*] + return value !== undefined ? value : key; + }, + remove: function( owner, key ) { + var i, + cache = owner[ this.expando ]; + + if ( cache === undefined ) { + return; + } + + if ( key !== undefined ) { + + // Support array or space separated string of keys + if ( Array.isArray( key ) ) { + + // If key is an array of keys... + // We always set camelCase keys, so remove that. + key = key.map( jQuery.camelCase ); + } else { + key = jQuery.camelCase( key ); + + // If a key with the spaces exists, use it. + // Otherwise, create an array by matching non-whitespace + key = key in cache ? + [ key ] : + ( key.match( rnothtmlwhite ) || [] ); + } + + i = key.length; + + while ( i-- ) { + delete cache[ key[ i ] ]; + } + } + + // Remove the expando if there's no more data + if ( key === undefined || jQuery.isEmptyObject( cache ) ) { + + // Support: Chrome <=35 - 45 + // Webkit & Blink performance suffers when deleting properties + // from DOM nodes, so set to undefined instead + // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) + if ( owner.nodeType ) { + owner[ this.expando ] = undefined; + } else { + delete owner[ this.expando ]; + } + } + }, + hasData: function( owner ) { + var cache = owner[ this.expando ]; + return cache !== undefined && !jQuery.isEmptyObject( cache ); + } +}; +var dataPriv = new Data(); + +var dataUser = new Data(); + + + +// Implementation Summary +// +// 1. Enforce API surface and semantic compatibility with 1.9.x branch +// 2. Improve the module's maintainability by reducing the storage +// paths to a single mechanism. +// 3. Use the same single mechanism to support "private" and "user" data. +// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) +// 5. Avoid exposing implementation details on user objects (eg. expando properties) +// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /[A-Z]/g; + +function getData( data ) { + if ( data === "true" ) { + return true; + } + + if ( data === "false" ) { + return false; + } + + if ( data === "null" ) { + return null; + } + + // Only convert to a number if it doesn't change the string + if ( data === +data + "" ) { + return +data; + } + + if ( rbrace.test( data ) ) { + return JSON.parse( data ); + } + + return data; +} + +function dataAttr( elem, key, data ) { + var name; + + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = getData( data ); + } catch ( e ) {} + + // Make sure we set the data so it isn't changed later + dataUser.set( elem, key, data ); + } else { + data = undefined; + } + } + return data; +} + +jQuery.extend( { + hasData: function( elem ) { + return dataUser.hasData( elem ) || dataPriv.hasData( elem ); + }, + + data: function( elem, name, data ) { + return dataUser.access( elem, name, data ); + }, + + removeData: function( elem, name ) { + dataUser.remove( elem, name ); + }, + + // TODO: Now that all calls to _data and _removeData have been replaced + // with direct calls to dataPriv methods, these can be deprecated. + _data: function( elem, name, data ) { + return dataPriv.access( elem, name, data ); + }, + + _removeData: function( elem, name ) { + dataPriv.remove( elem, name ); + } +} ); + +jQuery.fn.extend( { + data: function( key, value ) { + var i, name, data, + elem = this[ 0 ], + attrs = elem && elem.attributes; + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = dataUser.get( elem ); + + if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE 11 only + // The attrs elements can be null (#14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = jQuery.camelCase( name.slice( 5 ) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + dataPriv.set( elem, "hasDataAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each( function() { + dataUser.set( this, key ); + } ); + } + + return access( this, function( value ) { + var data; + + // The calling jQuery object (element matches) is not empty + // (and therefore has an element appears at this[ 0 ]) and the + // `value` parameter was not undefined. An empty jQuery object + // will result in `undefined` for elem = this[ 0 ] which will + // throw an exception if an attempt to read a data cache is made. + if ( elem && value === undefined ) { + + // Attempt to get data from the cache + // The key will always be camelCased in Data + data = dataUser.get( elem, key ); + if ( data !== undefined ) { + return data; + } + + // Attempt to "discover" the data in + // HTML5 custom data-* attrs + data = dataAttr( elem, key ); + if ( data !== undefined ) { + return data; + } + + // We tried really hard, but the data doesn't exist. + return; + } + + // Set the data... + this.each( function() { + + // We always store the camelCased key + dataUser.set( this, key, value ); + } ); + }, null, value, arguments.length > 1, null, true ); + }, + + removeData: function( key ) { + return this.each( function() { + dataUser.remove( this, key ); + } ); + } +} ); + + +jQuery.extend( { + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = dataPriv.get( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || Array.isArray( data ) ) { + queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // Clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // Not public - generate a queueHooks object, or return the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { + empty: jQuery.Callbacks( "once memory" ).add( function() { + dataPriv.remove( elem, [ type + "queue", key ] ); + } ) + } ); + } +} ); + +jQuery.fn.extend( { + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[ 0 ], type ); + } + + return data === undefined ? + this : + this.each( function() { + var queue = jQuery.queue( this, type, data ); + + // Ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + } ); + }, + dequeue: function( type ) { + return this.each( function() { + jQuery.dequeue( this, type ); + } ); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +} ); +var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; + +var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); + + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var isHiddenWithinTree = function( elem, el ) { + + // isHiddenWithinTree might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + + // Inline style trumps all + return elem.style.display === "none" || + elem.style.display === "" && + + // Otherwise, check computed style + // Support: Firefox <=43 - 45 + // Disconnected elements can have computed display: none, so first confirm that elem is + // in the document. + jQuery.contains( elem.ownerDocument, elem ) && + + jQuery.css( elem, "display" ) === "none"; + }; + +var swap = function( elem, options, callback, args ) { + 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.apply( elem, args || [] ); + + // Revert the old values + for ( name in options ) { + elem.style[ name ] = old[ name ]; + } + + return ret; +}; + + + + +function adjustCSS( elem, prop, valueParts, tween ) { + var adjusted, + scale = 1, + maxIterations = 20, + currentValue = tween ? + function() { + return tween.cur(); + } : + function() { + return jQuery.css( elem, prop, "" ); + }, + initial = currentValue(), + unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), + + // Starting value computation is required for potential unit mismatches + initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && + rcssNum.exec( jQuery.css( elem, prop ) ); + + if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { + + // Trust units reported by jQuery.css + unit = unit || initialInUnit[ 3 ]; + + // Make sure we update the tween properties later on + valueParts = valueParts || []; + + // Iteratively approximate from a nonzero starting point + initialInUnit = +initial || 1; + + do { + + // If previous iteration zeroed out, double until we get *something*. + // Use string for doubling so we don't accidentally see scale as unchanged below + scale = scale || ".5"; + + // Adjust and apply + initialInUnit = initialInUnit / scale; + jQuery.style( elem, prop, initialInUnit + unit ); + + // Update scale, tolerating zero or NaN from tween.cur() + // Break the loop if scale is unchanged or perfect, or if we've just had enough. + } while ( + scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations + ); + } + + if ( valueParts ) { + initialInUnit = +initialInUnit || +initial || 0; + + // Apply relative offset (+=/-=) if specified + adjusted = valueParts[ 1 ] ? + initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : + +valueParts[ 2 ]; + if ( tween ) { + tween.unit = unit; + tween.start = initialInUnit; + tween.end = adjusted; + } + } + return adjusted; +} + + +var defaultDisplayMap = {}; + +function getDefaultDisplay( elem ) { + var temp, + doc = elem.ownerDocument, + nodeName = elem.nodeName, + display = defaultDisplayMap[ nodeName ]; + + if ( display ) { + return display; + } + + temp = doc.body.appendChild( doc.createElement( nodeName ) ); + display = jQuery.css( temp, "display" ); + + temp.parentNode.removeChild( temp ); + + if ( display === "none" ) { + display = "block"; + } + defaultDisplayMap[ nodeName ] = display; + + return display; +} + +function showHide( elements, show ) { + var display, elem, + values = [], + index = 0, + length = elements.length; + + // Determine new display value for elements that need to change + for ( ; index < length; index++ ) { + elem = elements[ index ]; + if ( !elem.style ) { + continue; + } + + display = elem.style.display; + if ( show ) { + + // Since we force visibility upon cascade-hidden elements, an immediate (and slow) + // check is required in this first loop unless we have a nonempty display value (either + // inline or about-to-be-restored) + if ( display === "none" ) { + values[ index ] = dataPriv.get( elem, "display" ) || null; + if ( !values[ index ] ) { + elem.style.display = ""; + } + } + if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { + values[ index ] = getDefaultDisplay( elem ); + } + } else { + if ( display !== "none" ) { + values[ index ] = "none"; + + // Remember what we're overwriting + dataPriv.set( elem, "display", display ); + } + } + } + + // Set the display of the elements in a second loop to avoid constant reflow + for ( index = 0; index < length; index++ ) { + if ( values[ index ] != null ) { + elements[ index ].style.display = values[ index ]; + } + } + + return elements; +} + +jQuery.fn.extend( { + show: function() { + return showHide( this, true ); + }, + hide: function() { + return showHide( this ); + }, + toggle: function( state ) { + if ( typeof state === "boolean" ) { + return state ? this.show() : this.hide(); + } + + return this.each( function() { + if ( isHiddenWithinTree( this ) ) { + jQuery( this ).show(); + } else { + jQuery( this ).hide(); + } + } ); + } +} ); +var rcheckableType = ( /^(?:checkbox|radio)$/i ); + +var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i ); + +var rscriptType = ( /^$|\/(?:java|ecma)script/i ); + + + +// We have to close these tags to support XHTML (#13200) +var wrapMap = { + + // Support: IE <=9 only + option: [ 1, "" ], + + // XHTML parsers do not magically insert elements in the + // same way that tag soup parsers do. So we cannot shorten + // this by omitting or other required elements. + thead: [ 1, "", "
" ], + col: [ 2, "", "
" ], + tr: [ 2, "", "
" ], + td: [ 3, "", "
" ], + + _default: [ 0, "", "" ] +}; + +// Support: IE <=9 only +wrapMap.optgroup = wrapMap.option; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + + +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, contains, 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 ( jQuery.type( 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; + } + + contains = jQuery.contains( elem.ownerDocument, elem ); + + // Append to fragment + tmp = getAll( fragment.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( contains ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( ( elem = tmp[ j++ ] ) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + return fragment; +} + + +( function() { + var fragment = document.createDocumentFragment(), + div = fragment.appendChild( document.createElement( "div" ) ), + input = document.createElement( "input" ); + + // Support: Android 4.0 - 4.3 only + // Check state lost if the name is set (#11217) + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (#14901) + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + + // Support: Android <=4.1 only + // Older WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE <=11 only + // Make sure textarea (and checkbox) defaultValue is properly cloned + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; +} )(); +var documentElement = document.documentElement; + + + +var + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +// Support: IE <=9 only +// See #13393 for more info +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 ); + + // Don't attach events to noData or text/comment nodes (but allow plain objects) + if ( !elemData ) { + 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 = {}; + } + 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 ) { + + // Make a writable jQuery.Event from the native event object + var event = jQuery.event.fix( nativeEvent ); + + var i, j, ret, matched, handleObj, handlerQueue, + args = new Array( arguments.length ), + handlers = ( dataPriv.get( this, "events" ) || {} )[ 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() ) { + + // Triggered event must either 1) have no namespace, or 2) have namespace(s) + // a subset or equal to those in the bound event (both can have no namespace). + if ( !event.rnamespace || 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: jQuery.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 + }, + focus: { + + // Fire native event if possible so blur/focus sequence is correct + trigger: function() { + if ( this !== safeActiveElement() && this.focus ) { + this.focus(); + return false; + } + }, + delegateType: "focusin" + }, + blur: { + trigger: function() { + if ( this === safeActiveElement() && this.blur ) { + this.blur(); + return false; + } + }, + delegateType: "focusout" + }, + click: { + + // For checkbox, fire native event so checked state will be right + trigger: function() { + if ( this.type === "checkbox" && this.click && nodeName( this, "input" ) ) { + this.click(); + return false; + } + }, + + // For cross-browser consistency, don't fire native .click() on links + _default: function( event ) { + return nodeName( event.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; + } + } + } + } +}; + +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 || jQuery.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, + 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 ); + +// 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 + + /* eslint-disable max-len */ + + // See https://github.com/eslint/eslint/issues/3229 + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi, + + /* eslint-enable */ + + // Support: IE <=10 - 11, Edge 12 - 13 + // 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( ">tbody", elem )[ 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 ) { + var match = rscriptTypeMasked.exec( elem.type ); + + if ( match ) { + elem.type = match[ 1 ]; + } else { + elem.removeAttribute( "type" ); + } + + return elem; +} + +function cloneCopyEvent( src, dest ) { + var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; + + if ( dest.nodeType !== 1 ) { + return; + } + + // 1. Copy private data: events, handlers, etc. + if ( dataPriv.hasData( src ) ) { + pdataOld = dataPriv.access( src ); + pdataCur = dataPriv.set( dest, pdataOld ); + events = pdataOld.events; + + if ( events ) { + delete pdataCur.handle; + pdataCur.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 = concat.apply( [], args ); + + var fragment, first, scripts, hasScripts, node, doc, + i = 0, + l = collection.length, + iNoClone = l - 1, + value = args[ 0 ], + isFunction = jQuery.isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( isFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return collection.each( function( index ) { + var self = collection.eq( index ); + if ( isFunction ) { + 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 ) { + + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl ) { + jQuery._evalUrl( node.src ); + } + } else { + DOMEval( node.textContent.replace( rcleanScript, "" ), 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 && jQuery.contains( node.ownerDocument, node ) ) { + setGlobalEval( getAll( node, "script" ) ); + } + node.parentNode.removeChild( node ); + } + } + + return elem; +} + +jQuery.extend( { + htmlPrefilter: function( html ) { + return html.replace( rxhtmlTag, "<$1>" ); + }, + + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var i, l, srcElements, destElements, + clone = elem.cloneNode( true ), + inPage = jQuery.contains( elem.ownerDocument, 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 rmargin = ( /^margin/ ); + +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 ); + }; + + + +( 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; + } + + div.style.cssText = + "box-sizing:border-box;" + + "position:relative;display:block;" + + "margin:auto;border:1px;padding:1px;" + + "top:1%;width:50%"; + div.innerHTML = ""; + documentElement.appendChild( container ); + + var divStyle = window.getComputedStyle( div ); + pixelPositionVal = divStyle.top !== "1%"; + + // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 + reliableMarginLeftVal = divStyle.marginLeft === "2px"; + boxSizingReliableVal = divStyle.width === "4px"; + + // Support: Android 4.0 - 4.3 only + // Some styles come back with percentage values, even though they shouldn't + div.style.marginRight = "50%"; + pixelMarginRightVal = divStyle.marginRight === "4px"; + + 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; + } + + var pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, 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"; + + container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" + + "padding:0;margin-top:1px;position:absolute"; + container.appendChild( div ); + + jQuery.extend( support, { + pixelPosition: function() { + computeStyleTests(); + return pixelPositionVal; + }, + boxSizingReliable: function() { + computeStyleTests(); + return boxSizingReliableVal; + }, + pixelMarginRight: function() { + computeStyleTests(); + return pixelMarginRightVal; + }, + reliableMarginLeft: function() { + computeStyleTests(); + return reliableMarginLeftVal; + } + } ); +} )(); + + +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 === "" && !jQuery.contains( elem.ownerDocument, 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.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.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 + + // 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" + }, + + cssPrefixes = [ "Webkit", "Moz", "ms" ], + emptyStyle = document.createElement( "div" ).style; + +// Return a css property mapped to a potentially vendor prefixed property +function vendorPropName( name ) { + + // Shortcut for names that are not vendor prefixed + if ( name in emptyStyle ) { + return 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 property mapped along what jQuery.cssProps suggests or to +// a vendor prefixed property. +function finalPropName( name ) { + var ret = jQuery.cssProps[ name ]; + if ( !ret ) { + ret = jQuery.cssProps[ name ] = vendorPropName( name ) || name; + } + return ret; +} + +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 augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) { + var i, + val = 0; + + // If we already have the right measurement, avoid augmentation + if ( extra === ( isBorderBox ? "border" : "content" ) ) { + i = 4; + + // Otherwise initialize for horizontal or vertical properties + } else { + i = name === "width" ? 1 : 0; + } + + for ( ; i < 4; i += 2 ) { + + // Both box models exclude margin, so add it if we want it + if ( extra === "margin" ) { + val += jQuery.css( elem, extra + cssExpand[ i ], true, styles ); + } + + if ( isBorderBox ) { + + // border-box includes padding, so remove it if we want content + if ( extra === "content" ) { + val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + } + + // At this point, extra isn't border nor margin, so remove border + if ( extra !== "margin" ) { + val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } else { + + // At this point, extra isn't content, so add padding + val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + + // At this point, extra isn't content nor padding, so add border + if ( extra !== "padding" ) { + val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } + } + + return val; +} + +function getWidthOrHeight( elem, name, extra ) { + + // Start with computed style + var valueIsBorderBox, + styles = getStyles( elem ), + val = curCSS( elem, name, styles ), + isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; + + // Computed unit is not pixels. Stop here and return. + if ( rnumnonpx.test( val ) ) { + return val; + } + + // Check for style in case a browser which returns unreliable values + // for getComputedStyle silently falls back to the reliable elem.style + valueIsBorderBox = isBorderBox && + ( support.boxSizingReliable() || val === elem.style[ name ] ); + + // Fall back to offsetWidth/Height when value is "auto" + // This happens for inline elements with no explicit setting (gh-3571) + if ( val === "auto" ) { + val = elem[ "offset" + name[ 0 ].toUpperCase() + name.slice( 1 ) ]; + } + + // Normalize "", auto, and prepare for extra + val = parseFloat( val ) || 0; + + // Use the active box-sizing model to add/subtract irrelevant styles + return ( val + + augmentWidthOrHeight( + elem, + name, + extra || ( isBorderBox ? "border" : "content" ), + valueIsBorderBox, + styles + ) + ) + "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, + "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: { + "float": "cssFloat" + }, + + // 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 = jQuery.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) + if ( type === "number" ) { + 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 = jQuery.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, name ) { + jQuery.cssHooks[ name ] = { + 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, name, extra ); + } ) : + getWidthOrHeight( elem, name, extra ); + } + }, + + set: function( elem, value, extra ) { + var matches, + styles = extra && getStyles( elem ), + subtract = extra && augmentWidthOrHeight( + elem, + name, + extra, + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + styles + ); + + // Convert to pixels if value adjustment is needed + if ( subtract && ( matches = rcssNum.exec( value ) ) && + ( matches[ 3 ] || "px" ) !== "px" ) { + + elem.style[ name ] = value; + value = jQuery.css( elem, name ); + } + + 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 ( !rmargin.test( prefix ) ) { + 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 && + ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || + jQuery.cssHooks[ tween.prop ] ) ) { + 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 = jQuery.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 - 13 + // Record all 3 overflow attributes because IE does not infer the shorthand + // from identically-valued overflowX and overflowY + 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 = jQuery.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 ( jQuery.isFunction( result.stop ) ) { + jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = + jQuery.proxy( result.stop, result ); + } + return result; + } + } + + jQuery.map( props, createTween, animation ); + + if ( jQuery.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 ( jQuery.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 || + jQuery.isFunction( speed ) && speed, + duration: speed, + easing: fn && easing || easing && !jQuery.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 ( jQuery.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 && type !== false ) { + 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 = jQuery.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://html.spec.whatwg.org/multipage/infrastructure.html#strip-and-collapse-whitespace + function stripAndCollapse( value ) { + var tokens = value.match( rnothtmlwhite ) || []; + return tokens.join( " " ); + } + + +function getClass( elem ) { + return elem.getAttribute && elem.getAttribute( "class" ) || ""; +} + +jQuery.fn.extend( { + addClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( jQuery.isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + if ( typeof value === "string" && value ) { + classes = value.match( rnothtmlwhite ) || []; + + 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 ( jQuery.isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + if ( !arguments.length ) { + return this.attr( "class", "" ); + } + + if ( typeof value === "string" && value ) { + classes = value.match( rnothtmlwhite ) || []; + + 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; + + if ( typeof stateVal === "boolean" && type === "string" ) { + return stateVal ? this.addClass( value ) : this.removeClass( value ); + } + + if ( jQuery.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 ( type === "string" ) { + + // Toggle individual class names + i = 0; + self = jQuery( this ); + classNames = value.match( rnothtmlwhite ) || []; + + 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, isFunction, + 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; + } + + isFunction = jQuery.isFunction( value ); + + return this.each( function( i ) { + var val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( isFunction ) { + 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 + + +var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/; + +jQuery.extend( jQuery.event, { + + trigger: function( event, data, elem, onlyHandlers ) { + + var i, cur, tmp, bubbleType, ontype, handle, special, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; + + cur = 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 && !jQuery.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() ) { + + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( dataPriv.get( cur, "events" ) || {} )[ 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 && jQuery.isFunction( elem[ type ] ) && !jQuery.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; + elem[ type ](); + 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 ); + } + } +} ); + + +jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " + + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + + "change select submit keydown keypress keyup contextmenu" ).split( " " ), + function( i, name ) { + + // Handle event binding + jQuery.fn[ name ] = function( data, fn ) { + return arguments.length > 0 ? + this.on( name, null, data, fn ) : + this.trigger( name ); + }; +} ); + +jQuery.fn.extend( { + hover: function( fnOver, fnOut ) { + return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); + } +} ); + + + + +support.focusin = "onfocusin" in window; + + +// 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() { + var doc = this.ownerDocument || 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, + 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 = jQuery.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 && jQuery.type( 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 = jQuery.isFunction( valueOrFunction ) ? + valueOrFunction() : + valueOrFunction; + + s[ s.length ] = encodeURIComponent( key ) + "=" + + encodeURIComponent( value == null ? "" : value ); + }; + + // 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 ( jQuery.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() ] = match[ 2 ]; + } + } + match = responseHeaders[ key.toLowerCase() ]; + } + return match == null ? null : match; + }, + + // 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 - 13 + // 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, append data to url + if ( s.data ) { + 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++ ) + 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 ); + } + + // 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 ( jQuery.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._evalUrl = function( url ) { + 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, + "throws": true + } ); +}; + + +jQuery.fn.extend( { + wrapAll: function( html ) { + var wrap; + + if ( this[ 0 ] ) { + if ( jQuery.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 ( jQuery.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 isFunction = jQuery.isFunction( html ); + + return this.each( function( i ) { + jQuery( this ).wrapAll( isFunction ? 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.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 = 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 requests + if ( s.crossDomain ) { + var script, callback; + return { + send: function( _, complete ) { + script = jQuery( " + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

Analysis

+

This section gives information about the last compilation. By default, a +new analysis is run at each compilation.

+

The analysis tab gives detailed information about the contract code. It +can help you avoid code mistakes and to enforce best practices.

+

images/a-analysis.png

+

Here is the list of analyzers:

+

Security:

+
    +
  • Transaction origin: Warns if tx.origin is used

  • +
  • Check effects: Avoid potential reentrancy bugs

  • +
  • Inline assembly: Use of Inline Assembly

  • +
  • Block timestamp: Semantics maybe unclear

  • +
  • Low level calls: Semantics maybe unclear

  • +
  • Block.blockhash usage: Semantics maybe unclear

  • +
+

Gas & Economy:

+
    +
  • Gas costs: Warns if the gas requirements of the functions +are too high

  • +
  • This on local calls: Invocation of local functions via +this

  • +
+

Miscellaneous:

+
    +
  • Constant functions: Checks for potentially constant +functions

  • +
  • Similar variable names: Checks if variable names are too +similar

  • +
+
+ + +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/analysis_tab.html b/docs/_build/html/analysis_tab.html new file mode 100644 index 0000000000..ee5e8c4eee --- /dev/null +++ b/docs/_build/html/analysis_tab.html @@ -0,0 +1,287 @@ + + + + + + + + + + + Analysis — Remix, Ethereum-IDE 1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

Analysis

+

This section gives information about the last compilation. By default, a +new analysis is run at each compilation.

+

The analysis tab gives detailed information about the contract code. It +can help you avoid code mistakes and to enforce best practices.

+

images/a-analysis.png

+

Here is the list of analyzers:

+

Security:

+
    +
  • Transaction origin: Warns if tx.origin is used

  • +
  • Check effects: Avoid potential reentrancy bugs

  • +
  • Inline assembly: Use of Inline Assembly

  • +
  • Block timestamp: Semantics maybe unclear

  • +
  • Low level calls: Semantics maybe unclear

  • +
  • Block.blockhash usage: Semantics maybe unclear

  • +
+

Gas & Economy:

+
    +
  • Gas costs: Warns if the gas requirements of the functions +are too high

  • +
  • This on local calls: Invocation of local functions via +this

  • +
+

Miscellaneous:

+
    +
  • Constant functions: Checks for potentially constant +functions

  • +
  • Similar variable names: Checks if variable names are too +similar

  • +
+
+ + +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/code_contribution_guide.html b/docs/_build/html/code_contribution_guide.html new file mode 100644 index 0000000000..8a472b961f --- /dev/null +++ b/docs/_build/html/code_contribution_guide.html @@ -0,0 +1,255 @@ + + + + + + + + + + + Code contribution guide — Remix, Ethereum-IDE 1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

Code contribution guide

+

Remix is an open source tool and we encourage anyone to help us improve our tool. +You can do that by opening issues, giving feedback or by contributing a pull request +to our codebase.

+

The Remix application is built with JavaScript and it doesn’t use any framework. We only +rely on selected set of npm modules, like yo-yo, csjs-inject and others. Check out the package.json files in the Remix submodules to learn more about the stack.

+

To learn more, please visit our GitHub page.

+
+ + +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/community.html b/docs/_build/html/community.html new file mode 100644 index 0000000000..dc2dedbf63 --- /dev/null +++ b/docs/_build/html/community.html @@ -0,0 +1,258 @@ + + + + + + + + + + + Community — Remix, Ethereum-IDE 1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

Community

+

We know that blockchain ecosystem is very new and that lots of information is scattered around the web. +That is why we created a community support channel where we and other users try to answer your questions if +you get stuck using Remix. Please, join the community and ask for help.

+

For anyone who is interested in developing a custom plugin for Remix or who wants to contribute to the codebase, +we opened a contributors’ channel especially for developers working on Remix tools.

+

We would kindly ask you to respect the space and to use it for +getting help with your work and the developers’ channel for discussions related to working on Remix codebase. If you have +ideas for collaborations or you want to promote your project, try to find some more appropriate channels to do so. Or you can contact +the main contributors directly on Gitter or Twitter.

+
+ + +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/compile.html b/docs/_build/html/compile.html new file mode 100644 index 0000000000..9f4f839219 --- /dev/null +++ b/docs/_build/html/compile.html @@ -0,0 +1,265 @@ + + + + + + + + + + + Compiler (Solidity) — Remix, Ethereum-IDE 1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

Compiler (Solidity)

+

Clicking the Solidity icon in the icon panel brings you to the Solidty Compiler.

+

Compiling is triggered when you click the compile button ( A. in image below). If you want the file to be compiled each time the file is saved or when another file is selected - check the auto compile checkbox ( B. in image below).

+

If the contract has a lot of dependencies it can take a while to compile - so you use autocompilation at your discretion.

+

_images/a-sol-compiler.png

+

After each compilation, a list is updated with all the newly compiled +contracts. The contract compiled can be selected with the Contract pulldown menu ( C. in image below). Multiple contracts are compiled when one contract imports other contracts. Selecting a contract will show information about that one.

+

When the “Compilation Details” button is clicked ( D. in image below), a modal opens displaying detailed information about the current selected contract.

+

From this tab, you can also publish your contract to Swarm (only non +abstract contracts can be published).

+

Published data notably contains the abi and solidity source code.

+

After a contract is published, you can find its metadata information +using the bzz URL located in the details modal dialog SWARM LOCATION.

+

Compilation Errors and Warning are displayed below the contract section. +At each compilation, the static analysis tab builds a report. It is very +valuable when addressing reported issues even if the compiler doesn’t +complain. (see more)

+
+ + +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/compile_tab.html b/docs/_build/html/compile_tab.html new file mode 100644 index 0000000000..1f17f7d5be --- /dev/null +++ b/docs/_build/html/compile_tab.html @@ -0,0 +1,262 @@ + + + + + + + + + + + Compiler (Solidity) — Remix, Ethereum-IDE 1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

Compiler (Solidity)

+

Clicking the Solidity icon in the icon panel brings you to the Solidty Compiler.

+

Compiling is triggered when you click the compile button ( A. in image below). If you want the file to be compiled each time the file is saved or when another file is selected - check the auto compile checkbox ( B. in image below).

+

If the contract has a lot of dependencies it can take a while to compile - so you use autocompilation at your discretion.

+

_images/a-sol-compiler.png

+

After each compilation, a list is updated with all the newly compiled +contracts. The contract compiled can be selected with the Contract pulldown menu ( C. in image below). Multiple contracts are compiled when one contract imports other contracts. Selecting a contract will show information about that one.

+

When the “Compilation Details” button is clicked ( D. in image below), a modal opens displaying detailed information about the current selected contract.

+

From this tab, you can also publish your contract to Swarm (only non +abstract contracts can be published).

+

Published data notably contains the abi and solidity source code.

+

After a contract is published, you can find its metadata information +using the bzz URL located in the details modal dialog SWARM LOCATION.

+

Compilation Errors and Warning are displayed below the contract section. +At each compilation, the static analysis tab builds a report. It is very +valuable when addressing reported issues even if the compiler doesn’t +complain. (see more)

+
+ + +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/contract_metadata.html b/docs/_build/html/contract_metadata.html new file mode 100644 index 0000000000..38d00a4565 --- /dev/null +++ b/docs/_build/html/contract_metadata.html @@ -0,0 +1,313 @@ + + + + + + + + + + + Build Artifact — Remix, Ethereum-IDE 1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

Build Artifact

+

As compilation succeed Remix create a JSON file for each compiled contract. +These JSON files contains several metadata

+
+

Library Deployment

+

By default Remix automatically deploy needed libraries.

+

linkReferences contains a map representing libraries which depend on the current contract. +Values are addresses of libraries used for linking the contract.

+

autoDeployLib defines if the libraries should be auto deployed by Remix or if the contract should be linked with libraries described in linkReferences

+

Note that Remix will resolve addresses corresponding to the current network. +By default, a configuration key follow the form: <network_name>:<networkd_id>, but it is also possible +to define <network_name> or <network_id> as keys.

+
{
+	"VM:-": {
+		"linkReferences": {
+			"browser/Untitled.sol": {
+				"lib": "<address>",
+				"lib2": "<address>"
+			}
+		},
+		"autoDeployLib": true
+	},
+	"main:1": {
+		"linkReferences": {
+			"browser/Untitled.sol": {
+				"lib": "<address>",
+				"lib2": "<address>"
+			}
+		},
+		"autoDeployLib": true
+	},
+	"ropsten:3": {
+		"linkReferences": {
+			"browser/Untitled.sol": {
+				"lib": "<address>",
+				"lib2": "<address>"
+			}
+		},
+		"autoDeployLib": true
+	},
+	"rinkeby:4": {
+		"linkReferences": {
+			"browser/Untitled.sol": {
+				"lib": "<address>",
+				"lib2": "<address>"
+			}
+		},
+		"autoDeployLib": true
+	},
+	"kovan:42": {
+		"linkReferences": {
+			"browser/Untitled.sol": {
+				"lib": "<address>",
+				"lib2": "<address>"
+			}
+		},
+		"autoDeployLib": true
+	}
+}
+
+
+
+
+ + +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/create_deploy.html b/docs/_build/html/create_deploy.html new file mode 100644 index 0000000000..d7d4509f67 --- /dev/null +++ b/docs/_build/html/create_deploy.html @@ -0,0 +1,335 @@ + + + + + + + + + + + Creating and Deploying a Contract — Remix, Ethereum-IDE 1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

Creating and Deploying a Contract

+

There are 3 type of environments Remix can be plugged to: +Javascript VM, Injected provider, or Web3 provider. (for details see Running transactions)

+

Both Web3 provider and Injected provider require the use of an +external tool.

+

The external tool for Web3 provider is an Ethereum node and for +Injected provider Metamask.

+

The JavaScript VM mode is convenient because each execution runs in +your browser and you don’t need any other software or Ethereum node to run it.

+

So, it is the easiest test environment - no setup required!

+

But keep in mind that reloading the browser when you are in the Javascript VM will restart Remix in an empty state.

+

For performance purposes ( which is to say - for testing in an environment that is closest to the mainnet), it might also be better to use an external node.

+
+

Selecting the VM mode

+

Make sure the VM mode is selected. All accounts displayed in Accounts +should have 100 ether.

+
+
+

Sample contract

+
{.sourceCode .none}
+pragma solidity ^0.5.1;
+
+contract testContract {
+
+    uint value;
+
+    constructor (uint _p) public {
+        value = _p;
+    }
+
+    function setP(uint _n) payable public {
+        value = _n;
+    }
+
+    function setNP(uint _n) public {
+        value = _n;
+    }
+
+    function get () view public returns (uint) {
+        return value;
+    }
+}
+
+
+

This contract is very basic. The goal is to quickly start to create and +to interact with a sample contract.

+
+
+

Deploying an instance

+

The Compile tab displays information related to the current contract +(note that there can be more than one) (see ../compile_tab).

+

Moving on, in the Run tab select, JavaScript VM to specify that you +are going to deploy an instance of the contract in the JavaScript VM +state.

+

_images/a-jvm.png

+

The constructor of Ballot.sol needs a parameter (of type uint8). +Give any value and click on Deploy.

+

The transaction which deploys the instance of Ballot is created.

+

In a “normal” blockchain, it can take several seconds to execute. This +is the time for the transaction to be mined. However, because we are +using the JavaScript VM, our execution is immediate.

+

The terminal will inform you about the transaction. You can see details +there and start debugging.

+

The newly created instance is displayed in the run tab.

+

_images/a-jvm-instance.png

+
+
+

Interacting with an instance

+

This new instance contains 3 actions which corresponds to the 3 +functions (setP, setPN, get). Clicking on SetP or SetPN will +create a new transaction.

+

Note that SetP is payable (red button) : it is possible to send +value (Ether) to the contract.

+

SetPN is not payable (orange button - depending on the theme) : it is not possible to send +value (Ether) to the contract.

+

Clicking on get will not execute a transaction (usually its a blue button - depending on the theme). It doesn’t execute a transaction because a get does not modify the state (variable +value) of this instance.

+

As get is view you can see the return value just below the +action.

+

_images/a-jvm-calling-instance.png

+
+
+ + +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/debugger.html b/docs/_build/html/debugger.html new file mode 100644 index 0000000000..7041d8ccb5 --- /dev/null +++ b/docs/_build/html/debugger.html @@ -0,0 +1,255 @@ + + + + + + + + + + + Debugger — Remix, Ethereum-IDE 1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

Debugger

+

This module allows you to debug the transaction. It can be used to +deploy transactions created from Remix and already mined transactions. +(debugging works only if the current environment provides the necessary +features).

+

To get to the debugger - you can click the debug button in the terminal when a successful or failed transaction appears there. You can also load the module from the plugin manager and then click the bug in the icon panel. Or you can get to the debugger by running the debug command in the console.

+

_images/a-debugger.png

+
+ + +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/debugger_tab.html b/docs/_build/html/debugger_tab.html new file mode 100644 index 0000000000..3eaf1bb8e0 --- /dev/null +++ b/docs/_build/html/debugger_tab.html @@ -0,0 +1,265 @@ + + + + + + + + + + + Debugger — Remix, Ethereum-IDE 1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

Debugger

+

This module allows you to debug the transaction. It can be used to +deploy transactions created from Remix and already mined transactions. +(debugging works only if the current environment provides the necessary +features).

+

To get to the debugger - you can click the debug button in the terminal when a successful or failed transaction appears there. You can also load the module from the plugin manager and then click the bug in the icon panel. Or you can get to the debugger by running the debug command in the console.

+

_images/a-debugger.png

+

For more information about debugging, see the Tutorial on debugging transactions with Remix +

+
+ + +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/faq.html b/docs/_build/html/faq.html new file mode 100644 index 0000000000..556748fa36 --- /dev/null +++ b/docs/_build/html/faq.html @@ -0,0 +1,260 @@ + + + + + + + + + + + FAQ — Remix, Ethereum-IDE 1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

FAQ

+

How to record a series of transactions for replaying in a different environment?

+

How to link files in solidity?

+

How to deploy optimized code?

+
+ + +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/file_explorer.html b/docs/_build/html/file_explorer.html new file mode 100644 index 0000000000..a6a247cb2c --- /dev/null +++ b/docs/_build/html/file_explorer.html @@ -0,0 +1,295 @@ + + + + + + + + + + + File Explorer — Remix, Ethereum-IDE 1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

File Explorer

+

To get to the file explorers - click the file explorers icon.

+

_images/a-file-explorer1.png

+

The file explorer lists by default all the files stored in your browser. +You can see them in the browser folder. You can always rename, remove or +add new files to the file explorer.

+

Note that clearing the browser storage will permanently delete all the +solidity files you wrote. To avoid this, you can use Remixd, which +enables you to store and sync files in the browser with your local +computer ( for more information see remixd ).

+

_images/a-file-explorer-buttons.png

+

We will start by reviewing at the icons at the top left - from left to +the right:

+
+

Create new File

+

Creates a new untitled.sol file in Remix.

+
+
+

Add Local File

+

Allows you to select files from the local file system and import them to +the Remix browser storage.

+
+
+

Publish to Gist

+

Publishes all files from the browser folder to a gist. +Gist API has changed in 2018 and it unfortunately requires users to be authenticated to be able to publish a gist.

+

Click this link to Github tokens setup and select Generate new token. +Then check only Create gists checkbox and generate a new token.

+

Then paste it in Remix (right panel/Settings tab) and click Save. Now you should be able to use the feature.

+
+
+

Copy to another Remix instance

+

Enables you to copy files from the browser storage to another instance +(URL) of Remix.

+
+
+

Connect your filesystem to Remix

+

Allows to sync between Remix and your local file system (see +more about RemixD).

+
+
+ + +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/genindex.html b/docs/_build/html/genindex.html new file mode 100644 index 0000000000..b6da62ea02 --- /dev/null +++ b/docs/_build/html/genindex.html @@ -0,0 +1,240 @@ + + + + + + + + + + + + Index — Remix, Ethereum-IDE 1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ +
    + +
  • Docs »
  • + +
  • Index
  • + + +
  • + + + +
  • + +
+ + +
+
+
+
+ + +

Index

+ +
+ +
+ + +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/glossary.html b/docs/_build/html/glossary.html new file mode 100644 index 0000000000..b60441c0ce --- /dev/null +++ b/docs/_build/html/glossary.html @@ -0,0 +1,275 @@ + + + + + + + + + + + Glossary — Remix, Ethereum-IDE 1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

Glossary

+

ABI

+

Environment

+
    +
  • Where the transaction is happening +– as in Javascript Virtual Machine, Injected Provider, or Injected Web3 Provider

  • +
  • An ecosystem - as in the Solidity world or the Vyper / Python World

  • +
+

Context

+

Provider

+

IPFS

+

Swarm

+

Gas & Gas Estimation

+

compilation result

+

remixd

+

payable functions

+

pure functions

+

constant functions

+

compilation result

+
+ + +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/homepage.html b/docs/_build/html/homepage.html new file mode 100644 index 0000000000..8b878ac6d9 --- /dev/null +++ b/docs/_build/html/homepage.html @@ -0,0 +1,253 @@ + + + + + + + + + + + Homepage — Remix, Ethereum-IDE 1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

Homepage

+
+

Environment

+

Click the solidity button to load the modules related to solidity.

+
+
+ + +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/import.html b/docs/_build/html/import.html new file mode 100644 index 0000000000..ae0000ca70 --- /dev/null +++ b/docs/_build/html/import.html @@ -0,0 +1,281 @@ + + + + + + + + + + + Importing Source Files in Solidity — Remix, Ethereum-IDE 1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

Importing Source Files in Solidity

+

It is essential to know all many techniques for importing files.

+

For a tutorial about importing files see this tutorial.

+

For a detailed explanation of the import keyword see the +Solidity documentation

+

Here are a some of the main methods of importing a file:

+
+

Importing a file from the browser’s local storage

+

Files in Remix can be imported just by specifying their path. Please use ./ for relative paths to increase portability. +_images/a-old-tuto_basicimport.png

+
+
+

Importing a file from your computer’s filesystem

+

This method uses remixd - the remix daemon. Please go to the remixd tutorial for instructions about how to bridge the divide between the browser and your computers filesystem.

+
+
+

Importing from GitHub

+

It is possible to import files directly from GitHub with URLs like +https://github.com/<owner>/<repo>/<path to the file>.

+

_images/a-old-tuto_importgit.png

+
+
+

Importing from Swarm

+

Files can be imported using all URLs supported by swarm. If you do not +have a swarm node, then use swarm-gateways.net.

+

_images/a-old-tuto_importswarm.png

+
+
+ + +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/index.html b/docs/_build/html/index.html new file mode 100644 index 0000000000..ac846b4ae7 --- /dev/null +++ b/docs/_build/html/index.html @@ -0,0 +1,371 @@ + + + + + + + + + + + Welcome to Remix documentation! — Remix, Ethereum-IDE 1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

Welcome to Remix documentation!

+

Remix is a powerful, open source tool that helps you write Solidity contracts straight from the browser. +Written in JavaScript, Remix supports both usage in the browser and locally.

+

Remix also supports testing, debugging and deploying of smart contracts and much more.

+

Our Remix project with all its features is available +at remix.ethereum.org and more information can be found in these +docs. Our IDE tool is available at our GitHub repository.

+

This set of documents covers instructions on how to use Remix and some tutorials to help you get started.

+

Useful links:

+ + + + + +
+

Building Plugins

+ +
+
+

URLs & Downloads

+ +
+
+

Tutorials and workshops slides

+ +
+
+

Code contribution guide

+ +
+
+ + +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/javascript_vm.html b/docs/_build/html/javascript_vm.html new file mode 100644 index 0000000000..25c1e37437 --- /dev/null +++ b/docs/_build/html/javascript_vm.html @@ -0,0 +1,344 @@ + + + + + + + + + + + Using the JavaScript VM — Remix, Ethereum-IDE 1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

Using the JavaScript VM

+

There are 3 type of environments Remix can be plugged to: +Javascript VM, Injected provider, or Web3 provider. (for details see Running transactions)

+

Both Web3 provider and Injected provider require the use of an +external tool.

+

The external tool for Web3 provider is an Ethereum node and for +Injected provider Metamask.

+

The JavaScript VM mode is convenient because each execution runs in +your browser and you don’t need any other software or Ethereum node to run it.

+

So, it is the easiest test environment - no setup required!

+

But keep in mind that reloading the browser when you are in the Javascript VM will restart Remix in an empty state.

+

For performance purposes ( which is to say - for testing in an environment that is closest to the mainnet), it might also be better to use an external node.

+
+

Selecting the VM mode

+

Make sure the VM mode is selected. All accounts displayed in Accounts +should have 100 ether.

+
+
+

Sample contract

+
{.sourceCode .none}
+pragma solidity ^0.5.1;
+
+contract testContract {
+
+    uint value;
+
+    constructor (uint _p) public {
+        value = _p;
+    }
+
+    function setP(uint _n) payable public {
+        value = _n;
+    }
+
+    function setNP(uint _n) public {
+        value = _n;
+    }
+
+    function get () view public returns (uint) {
+        return value;
+    }
+}
+
+
+

This contract is very basic. The goal is to quickly start to create and +to interact with a sample contract.

+
+
+

Deploying an instance

+

The Compile tab displays information related to the current contract +(note that there can be more than one) (see ../compile_tab).

+

Moving on, in the Run tab select, JavaScript VM to specify that you +are going to deploy an instance of the contract in the JavaScript VM +state.

+

_images/a-jvm.png

+

The constructor of Ballot.sol needs a parameter (of type uint8). +Give any value and click on Deploy.

+

The transaction which deploys the instance of Ballot is created.

+

In a “normal” blockchain, it can take several seconds to execute. This +is the time for the transaction to be mined. However, because we are +using the JavaScript VM, our execution is immediate.

+

The terminal will inform you about the transaction. You can see details +there and start debugging.

+

The newly created instance is displayed in the run tab.

+

_images/a-jvm-instance.png

+
+
+

Interacting with an instance

+

This new instance contains 3 actions which corresponds to the 3 +functions (setP, setPN, get). Clicking on SetP or SetPN will +create a new transaction.

+

Note that SetP is payable (red button) : it is possible to send +value (Ether) to the contract.

+

SetPN is not payable (orange button - depending on the theme) : it is not possible to send +value (Ether) to the contract.

+

Clicking on get will not execute a transaction (usually its a blue button - depending on the theme). It doesn’t execute a transaction because a get does not modify the state (variable +value) of this instance.

+

As get is view you can see the return value just below the +action.

+

_images/a-jvm-calling-instance.png

+
+
+ + +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/layout.html b/docs/_build/html/layout.html new file mode 100644 index 0000000000..6b1cc9057c --- /dev/null +++ b/docs/_build/html/layout.html @@ -0,0 +1,300 @@ + + + + + + + + + + + Remix-IDE Layout — Remix, Ethereum-IDE 1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

Remix-IDE Layout

+
+

The new structure

+

_images/a-layout1b.png

+
    +
  1. Icon Panel - click to change which plugin appears in the Swap Panel

  2. +
  3. Swap Panel - Most but not all plugins will have their GUI here.

  4. +
  5. Main Panel - In the old layout this was just for editing files. In the tabs can be plugins or files for the IDE to compile.

  6. +
  7. Terminal - where you will see the results of your interactions with the GUI’s. Also you can run scripts here.

  8. +
+
+
+

Icon Panel at Page Load

+

When you load remix - the icon panel show these icons by default.

+

_images/a-icons-at-load.png

+

Everything in remix is now a plugin… so the Plugin Manager is very important. +In the old layout, each basic task in remix was separated into the tabs. Now these tabs are plugins.

+

But to activate a half a dozen plugins - (or however many you are using) each time the page load is tedious. So learn about the Environments.

+
+
+

Homepage

+

_images/a-hometab.png

+

The homepage is located in a tab in the Main Panel.

+

You can also get there by clicking the remix logo at the top of the icon panel.

+
+

Environments

+

Clicking on one of the environment buttons loads up a collection of plugins. We currently have a Solidity Button and a Vyper button. In the future you will be able to save your own environment.

+

To see all the plugins go to the plugin manager - by selecting the plug in the icon panel. +_images/a-plug.png

+

The environment buttons are time & sanity savers - so you don’t need to go to the plugin manager to get started everytime you load the page.

+
+
+
+

Plugin Manager

+

In order to make Remix flexible for integrating changes into its functionality and for integrating remix into other projects (your’s for example), we’ve now made everything a plugin. This means that you only load the functionality you need. It also means that you need a place to turn off and on plugins - as your needs change. This all happens in the plug manager.

+

The Plugin Manager is also the place you go when you are creating your own plugin and you want to load your local plugin into Remix. In that case you’d click on the “Connect to a Local Plugin” link at the top of the Plugin Manager panel.

+
+
+

Themes

+

So you want to work on Remix with a dark theme or a gray theme or just a different theme that the one you are currently looking at? Go to the settings tab and at the bottom is a choice of lots of bootstrap based themes.

+

_images/a-themes.png

+
+
+ + +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/locations.html b/docs/_build/html/locations.html new file mode 100644 index 0000000000..d44ed4c3f8 --- /dev/null +++ b/docs/_build/html/locations.html @@ -0,0 +1,257 @@ + + + + + + + + + + + Finding Remix — Remix, Ethereum-IDE 1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

Finding Remix

+

So if you’ve found the documentation to Remix but don’t know where to find Remix or if you want to run the remix-ide locally and want to find out where to download it - this page is here to help.

+ +
+ + +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/locationss.html b/docs/_build/html/locationss.html new file mode 100644 index 0000000000..ca69601bf1 --- /dev/null +++ b/docs/_build/html/locationss.html @@ -0,0 +1,253 @@ + + + + + + + + + + + Locations — Remix, Ethereum-IDE 1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

Locations

+

This part focuses on using Remix IDE, which is a browser based smart contract IDE. We will basically answer the question: +Where can I find or download Remix IDE, and what is the difference between packages?

+ +
+ + +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/objects.inv b/docs/_build/html/objects.inv new file mode 100644 index 0000000000..1ede2f0365 Binary files /dev/null and b/docs/_build/html/objects.inv differ diff --git a/docs/_build/html/packages.html b/docs/_build/html/packages.html new file mode 100644 index 0000000000..0c529a3272 --- /dev/null +++ b/docs/_build/html/packages.html @@ -0,0 +1,264 @@ + + + + + + + + + + + Locations — Remix, Ethereum-IDE 1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

Locations

+

This part focuses on using Remix IDE, which is a browser based smart contract IDE. We will basically answer the question: +Where can I find or download Remix IDE, and what is the difference between packages?

+ +
+ + +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/plugin-manager.html b/docs/_build/html/plugin-manager.html new file mode 100644 index 0000000000..3d93e1c725 --- /dev/null +++ b/docs/_build/html/plugin-manager.html @@ -0,0 +1,252 @@ + + + + + + + + + + + Plugin Manager — Remix, Ethereum-IDE 1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

Plugin Manager

+

lallallalal By default Remix triggers a compilation each time the current file is +changed or another file is selected. If the contract has a lot of +dependencies and takes a long time to compile, it is possible to disable +the autocompilation.

+

_images/a-sol-compiler.png

+

After each compilation, a list is updated with all the newly compiled +contracts.

+

Details modal dialog displays detailed information about the current +selected contract.

+

From this tab, you can also publish your contract to Swarm (only non +abstract contracts can be published).

+

Published data notably contains the abi and solidity source code.

+

After a contract is published, you can find its metadata information +using the bzz URL located in the details modal dialog SWARM LOCATION.

+

Compilation Errors and Warning are displayed below the contract section. +At each compilation, the static analysis tab builds a report. It is very +valuable when addressing reported issues even if the compiler doesn’t +complain. (see more)

+
+ + +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/plugin_manager.html b/docs/_build/html/plugin_manager.html new file mode 100644 index 0000000000..ecc0c3b7c4 --- /dev/null +++ b/docs/_build/html/plugin_manager.html @@ -0,0 +1,265 @@ + + + + + + + + + + + Plugin Manager — Remix, Ethereum-IDE 1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

Plugin Manager

+
+

Everything is a PLUGIN in Remix

+

In order to integrate new tools made by us and by …you into Remix, we’ve now made everything a plugin. +This architcture will also allow Remix or just parts of Remix to be integrated into other projects (your’s for example).

+

This means that you only load the functionality you need.

+

It also means that you can turn off and on plugins - as your needs change.

+

This all happens in the plug manager.

+

The Plugin Manager is also the place you go when you are creating your own plugin and you want to load your local plugin into Remix.

+

To load your local plugin, you’d click on the “Connect to a Local Plugin” link at the top of the Plugin Manager panel.

+

_images/a-plugin-man-local.png

+

To learn more about how to create your own plugin, go to +the README of remix-plugin repo.

+
+
+ + +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/quickstart_javascript_vm.html b/docs/_build/html/quickstart_javascript_vm.html new file mode 100644 index 0000000000..37af13fee0 --- /dev/null +++ b/docs/_build/html/quickstart_javascript_vm.html @@ -0,0 +1,321 @@ + + + + + + + + + + + Using the JavaScript VM — Remix, Ethereum-IDE 1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

Using the JavaScript VM

+

There are 3 type of environments Remix can be plugged to: +Javascript VM, Injected provider, or Web3 provider. (for details see Running transactions)

+

Both Web3 provider and Injected provider require the use of an +external tool.

+

The external tool for Web3 provider is an Ethereum node the tools for +Injected provider are Mist or Metamask.

+

The JavaScript VM mode is convenient because each execution runs in +your browser. Thus reloading the page will restart Remix with an empty +state.

+

So for performance purposes, it might also be better to use an external +node.

+
+

Selecting the VM mode

+

Make sure the VM mode is selected. All accounts displayed in Accounts +should have 100 ether.

+
+
+

Sample contract

+
pragma solidity ^0.4.16;
+
+contract testContract {
+
+    uint value;
+    function testContract(uint _p) {
+        value = _p;
+    }
+
+    function setP(uint _n) payable {
+        value = _n;
+    }
+
+    function setNP(uint _n) {
+        value = _n;
+    }
+
+    function get () constant returns (uint) {
+        return value;
+    }
+}
+
+
+

This contract is very basic. The goal is to quickly start to create and +to interact with a sample contract.

+
+
+

Deploying an instance

+

The Compile tab displays information related to the current contract +(note that there can be more than one) (see ../compile_tab).

+

Moving on, in the Run tab select, JavaScript VM to specify that you +are going to deploy an instance of the contract in the JavaScript VM +state.

+

_images/remix_quickstart_javascriptvm_creation.pngimage

+

The constructor of testContract needs a parameter (of type uint). +Give any value and click on Create.

+

The transaction which deploys the instance of testContract is created.

+

In a “normal” blockchain, it can take several seconds to execute. This +is the time for the transaction to be mined. However, because we are +using the JavaScript VM, our execution is immediate.

+

The terminal will inform you about the transaction. You can see details +there and start debugging.

+

The newly created instance is displayed in the run tab.

+

_images/remix_quickstart_javascriptvm_creationTransaction.pngimage

+
+
+

Interacting with an instance

+

This new instance contains 3 actions which corresponds to the 3 +functions (setP, setPN, get). Clicking on SetP or SetPN will +create a new transaction.

+

Note that SetP is payable (red action) : it is possible to send +value (Ether) to the contract.

+

SetPN is not payable (light red action) : it is not possible to send +value (Ether) to the contract.

+

Clicking on get will not execute a transaction (blue action). It is +not necessary to do so because get does not modify the state (variable +value) of this instance.

+

As get is constant you can see the return value just below the +action.

+

_images/remix_quickstart_javascriptvm_callinginstance.pngimage

+
+
+ + +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/remix-tutorials-github.html b/docs/_build/html/remix-tutorials-github.html new file mode 100644 index 0000000000..6e2c4c7ffc --- /dev/null +++ b/docs/_build/html/remix-tutorials-github.html @@ -0,0 +1,257 @@ + + + + + + + + + + + Remix Tutorials — Remix, Ethereum-IDE 1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

Remix Tutorials

+

There are a series of tutorials in our github repo [remix-workshops] (https://github.com/ethereum/remix-workshops). We are in the process of upgrading these tutorials to use the new Remix layout.

+

There are beginner tutorials as well as advanced ones.

+
+ + +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/remix_plugin.html b/docs/_build/html/remix_plugin.html new file mode 100644 index 0000000000..51749b9523 --- /dev/null +++ b/docs/_build/html/remix_plugin.html @@ -0,0 +1,250 @@ + + + + + + + + + + + Remix Plugin — Remix, Ethereum-IDE 1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

Remix Plugin

+

The best documentation about how to build a plugin is currently in the readme of remix-plugin repo. Please go here to learn all about it.

+
+ + +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/remix_plugin_api.html b/docs/_build/html/remix_plugin_api.html new file mode 100644 index 0000000000..51a5821fbb --- /dev/null +++ b/docs/_build/html/remix_plugin_api.html @@ -0,0 +1,311 @@ + + + + + + + + + + + Remix Plugin API usage — Remix, Ethereum-IDE 1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

Remix Plugin API usage

+

This section list all the available key and value pair which define this API:

+
+

1) notifications

+
+

app (key: app)

+
    +
  • unfocus []

  • +
  • focus []

  • +
+
+
+

compiler (key: compiler)

+
    +
  • compilationFinished [success (bool), data (obj), source (obj)]

  • +
  • compilationData [compilationResult (obj)]

  • +
+
+
+

transaction listener (key: txlistener)

+
    +
  • newTransaction [tx (obj)]

  • +
+
+
+

addendum

+

newTransaction is broadcasted to all loaded plugins. +compilationFinished is sent to the plugin that currently has the focus. +focus / unfocus is sent to the plugin which currently has the focus or is unfocused. +compilationData is sent always just upon the focus event and gives the last compilation result.

+
+
+
+

2) requests

+
+

app

+
    +
  • getExecutionContextProvider @return {String} provider (injected | web3 | vm)

  • +
  • getProviderEndpoint @return {String} provider endpoint url if web3, returns an error if injected or javascript VM

  • +
  • updateTitle @param {String} title

  • +
+
+
+

config

+
    +
  • setConfig @param {String} path, @param {String} content

  • +
  • getConfig @param {String} path

  • +
  • removeConfig @param {String} path

  • +
+
+
+

compiler

+
    +
  • getCompilationResult @return {Object} compilation result

  • +
+
+
+

udapp (only VM)

+
    +
  • runTx @param {Object} tx

  • +
  • getAccounts @return {Array} acccounts

  • +
  • createVMAccount @param {String} privateKey, @param {String} balance (hex)

  • +
+
+
+

editor

+
    +
  • getCurrentFile @return {String} current file path displayed in the editor

  • +
  • getFile @param {String} path

  • +
  • setFile @param {String} path, @param {String} content

  • +
  • highlight @param {Object} lineColumnPos, @param {String} filePath, @param {String} hexColor

  • +
+
+
+
+ + +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/remix_plugin_old.html b/docs/_build/html/remix_plugin_old.html new file mode 100644 index 0000000000..9f43e34651 --- /dev/null +++ b/docs/_build/html/remix_plugin_old.html @@ -0,0 +1,329 @@ + + + + + + + + + + + Remix Plugin API — Remix, Ethereum-IDE 1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

Remix Plugin API

+

This section provides informations about developing plugin for Remix.

+
+

Introduction

+

A plugin is basically a front end interface loaded through an iframe. Plugins have access to remix main features through an API. +This API consist of notification and request messages built over iframe messages (https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage) +plugin resources (html, js, img, …) needs to have their own hosting, either using normal web or using decentralized infrastructure like Swarm and IPFS.

+

A plugin declaration is a JSON value which contains the properties url and title.

+
{
+    "title": "<plugin name>",
+    "url": "<plugin url>"
+}
+
+
+

Loading / Registering a plugin in Remix IDE can be done:

+
    +
  • Creating a PR which add a new entry: https://github.com/ethereum/remix-ide/blob/master/src/app/plugin/plugins.js , the plugin can then be loaded directly from remix IDE with a single click.

  • +
  • In the settings tab, paste a plugin declaration in the plugin section and hit load.

  • +
  • Load Remix IDE with the following url parameters: pluginurl and plugintitle

  • +
+
+
+

Using the API with iframe post message

+

A message (either received by the plugin or sent to it) is defined as follow:

+
    {
+      action: <request, response or notification>,
+      key: '<key>',
+      type: '<type>',
+      value: [<value1>, <value2>, ...],
+      id: <call id> <used to track response>
+    }
+
+
+

example:

+
    window.parent.postMessage(JSON.stringify({
+        action: 'request',
+        key: 'config',
+        type: 'setConfig',
+        value: [document.getElementById('filename').value, document.getElementById('valuetosend').value],
+        id: 34
+    }), '*')
+
+
+

There are 2 ways for interacting with the API, listening on notification and sending request

+
    function receiveMessage (event) {
+        if (event.data.action === 'notification') {
+            ...
+        }
+        if (event.data.action === 'response') {
+            < listen on the response of the request app / updateTitle >
+            < contain event.data.error if any >
+            ...
+        }
+    }
+    window.addEventListener('message', receiveMessage, false)
+    
+    window.parent.postMessage(JSON.stringify({
+      action: 'request',
+      key: 'app',
+      type: 'updateTitle',
+      value: ['changed title ' + k++],
+      id: 39
+    }), '*')
+
+
+

from a response point of view, The error property is undefined if no error happened. In case of error (due to permission, system error, API error, etc…), error contains a string describing the error

+

see Remix Plugin API usage for a list of available key / value describing the API.

+
+
+

Using the API with remix extension NPM package

+

The remix-plugin NPM package can be used to abstract the iframe layer:

+
    var extension = require('remix-plugin')
+    
+    extension.listen('<key>', '<type>', function () {})
+    extension.call('<key>', '<type>', '<array of parameters>', function (error, result) {})
+    
+    // examples
+    extension.listen('compiler', 'compilationFinished', function () {})
+    extension.call('app', 'detectNetWork', [], function (error, result) {})
+    extension.call('config', 'setConfig', ['<filename>', '<content>'], function (error, result) {})
+
+
+

error is either null or a string, result is an array.

+
+
+ + +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/remix_tutorials_github.html b/docs/_build/html/remix_tutorials_github.html new file mode 100644 index 0000000000..489641189a --- /dev/null +++ b/docs/_build/html/remix_tutorials_github.html @@ -0,0 +1,280 @@ + + + + + + + + + + + Remix Tutorials — Remix, Ethereum-IDE 1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

Remix Tutorials

+

There are a series of tutorials in our github repo remix-workshops.

+

We are in the process of upgrading these tutorials to use the new Remix layout.

+

In this repo there tutorials for all levels.

+

There are tutorials for specific remix functionalities like:

+

Deploying

+
Multiple ways of loading files in Remix
+Deploying with libraries
+Deploying a proxy contract
+
+
+

Testing

+
Testing Examples
+Continuous integration
+
+
+

Remix Plugin Development

+
Developing a plugin for Remix and deploying it to swarm
+
+
+

Other

+
EtherAtom (walkthrough slides + screencast)
+Debugging transactions with Remix IDE
+Recording and replaying transactions
+Using a Pipeline plugin for developing Solidity contracts with demo video
+Running scripts in the Remix terminal (batch deployment) (proxy deployment)
+
+
+

Additional external workshops

+
Using Oraclize plugin in Remix
+
+
+
+ + +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/remixd.html b/docs/_build/html/remixd.html new file mode 100644 index 0000000000..54c308aa46 --- /dev/null +++ b/docs/_build/html/remixd.html @@ -0,0 +1,280 @@ + + + + + + + + + + + Remixd: Get access your local filesystem — Remix, Ethereum-IDE 1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

Remixd: Get access your local filesystem

+

remixd is an npm module. Its purpose is to give the remix web +application access to a folder on your local computer.

+

The code of remixd is +here .

+

remixd can be globally installed using the following command: +npm install -g remixd

+

You can install it just in the directory of your choice using this command: +npm install remixd

+

Then remixd -s <absolute-path-to-the-shared-folder> --remix-ide <your-remix-ide-URL-instance> will start remixd and will share the given folder.

+

For example, to sync your local folder to the official Remix IDE, +remixd -s <absolute-path-to-the-shared-folder> --remix-ide https://remix.ethereum.org

+

The folder is shared using a websocket connection between Remix IDE +and remixd.

+

Be sure the user executing remixd has read/write permission on the +folder.

+

There is an option to run remixd in read-only mode, use --read-only flag.

+

Warning!

+

remixd provides full read and write access to the given folder for any application that can access the TCP port 65520 on your local host.

+

From Remix IDE, in the Plugin Manager you need to activate the remixd plugin.

+

A modal dialog will ask confirmation

+

Accepting this dialog will start a session.

+

If you do not have remixd running in the background - another modal will open up and it will say:

+
Cannot connect to the remixd daemon. 
+Please make sure you have the remixd running in the background.
+
+
+

Assuming you don’t get the 2nd modal, your connection to the remixd daemon is successful. The shared folder will be available in the file explorer.

+

When you click the activation of remixd is successful - there will NOT be an icon that loads in the icon panel.

+

Click the File Explorers icon and in the swap panel you should now see the folder for localhost.

+

Click on the localhost connection icon:

+

_images/a-remixd-success.png

+
+ + +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/run.html b/docs/_build/html/run.html new file mode 100644 index 0000000000..87eef2e892 --- /dev/null +++ b/docs/_build/html/run.html @@ -0,0 +1,510 @@ + + + + + + + + + + + Run & Deploy — Remix, Ethereum-IDE 1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

Run & Deploy

+

The Run tab allows you to send transactions to the current environment.

+

To get to the Run & Deploy module - click the run icon in the icon panel.

+

In order to use this module you need to have a contract compiled. So if there is file name in the contract pulldown menu ( in the image below it’s the pulldown that says Ballot), then you can interact with this contract. If nothing is there - then you need to select a contract - make it the active contract in the main panel, ( in the image below - on the right side of the page - in the main panel - you see the ballot.sol so it is the active contract) then go to the compiler module and compile it.

+

_images/a-runtab1.png

+
+

Run Setup

+

The following settings allow you to directly influence the transaction +execution:

+

Environment:

+
    +
  • JavaScript VM: All the transactions will be executed in +a sandbox blockchain in the browser. This means nothing +will be persisted and a page reload will restart a new +blockchain from scratch, the old one will not be saved.

  • +
  • Injected Provider: Remix will connect to an injected +web3 provider. Metamask is an example of +providers that inject web3, thus can be used with this +option.

  • +
  • Web3 Provider: Remix will connect to a remote node. You +will need to provide the URL address to the selected +provider: geth, parity or any Ethereum client.

  • +
  • Account: the list of accounts associated with the current +environment (and their associated balances).

  • +
  • Gas Limit: the maximum amount of gas that can be set for all the +transactions created in Remix.

  • +
  • Value: the amount of value for the next created transaction (this +value is always reset to 0 after each transaction execution).

  • +
+

_images/a-Runtab-deploy-atAddress.png

+
+
+

Initiate Instance

+

This section contains the list of compiled contracts and 2 actions:

+
    +
  • At Address assumes the given address is an instance of the +selected contract. It is then possible to interact with an already +deployed contract. There’s no check at this point, so be careful +when using this feature, and be sure you trust the contract at that +address.

  • +
  • Deploy send a transaction that deploys the selected contract. When +the transaction is mined, the newly created instance will be added +(this might take several seconds). Note that if the constructor +has parameters, you need to specify them.

  • +
+
+
+

Pending Instances

+

Validating a transaction take several seconds. During this time, the GUI +shows it in a pending mode. When transaction is mined the number of +pending transactions is updated and the transaction is added to the log +(see ../terminal)

+
+
+

Using the ABI

+

Using Deploy or At Address is a classic use case of Remix. It is +possible though to interact with a contract by using its ABI. The ABI is +a JSON array which describe its interface.

+

To interact with a contract using the ABI, create a new file in Remix +with extension *.abi and copy the ABI content to it. Then in the input +next to At Address, put the Address of the contract you want to +interact with. Click on At Address, a new “connection” with the +contract will popup below.

+
+
+

Using the Recorder

+

The Recorder allows to save a bunch of transactions in a JSON file and +rerun them later either in the same environment or in another.

+

Saving to JSON allows to easily check the transaction list, tweak input +parameters, change linked library, etc…

+

We can find many use cases for the recorder, for instance: +: - After having coded and tested contracts in a constrained +environment (like the JavaScript VM), it could be interesting to +redeploy them easily in a more persisted environment (like a +Geth node) in order to check whether everything behaves normally +in a classic environment. +- Deploying contract does often require more than creating one +transaction. +- Working in a dev environment does often require to setup the +state in a first place.

+

_images/a-runtab-recorder.png

+

Saving a record ends up with the creation of this type of content (see +below):

+

In that specific record, 3 transactions are executed:

+

The first corresponds to the deployment of the lib testLib.

+

The second corresponds to the deployment of the contract test, the +first parameter of the constructor is set to 11. That contract depends +on a library. The linkage is done using the property linkReferences. +In that case we use the addres of the previously created library : +created{1512830014773}. the number is the id (timestamp) of the +transaction that leads to the creation of the library.

+

The third parameter corresponds to the call to the function set of the +contract test (the property to is set to: created{1512830015080}) . +Input parameters are 1 and +0xca35b7d915458ef540ade6068dfe2f44e8fa733c

+

all these transactions are created using the value of the accounts +account{0}.

+
{.sourceCode .none}
+{
+"accounts": {
+    "account{0}": "0xca35b7d915458ef540ade6068dfe2f44e8fa733c"
+},
+"linkReferences": {
+    "testLib": "created{1512830014773}"
+},
+"transactions": [
+    {
+    "timestamp": 1512830014773,
+    "record": {
+        "value": "0",
+        "parameters": [],
+        "abi": "0xbc36789e7a1e281436464229828f817d6612f7b477d66591ff96a9e064bcc98a",
+        "contractName": "testLib",
+        "bytecode": "60606040523415600e57600080fd5b60968061001c6000396000f300606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680636d4ce63c146044575b600080fd5b604a6060565b6040518082815260200191505060405180910390f35b6000610d809050905600a165627a7a7230582022d123b15248b8176151f8d45c2dc132063bcc9bb8d5cd652aea7efae362c8050029",
+        "linkReferences": {},
+        "type": "constructor",
+        "from": "account{0}"
+    }
+    },
+    {
+    "timestamp": 1512830015080,
+    "record": {
+        "value": "100",
+        "parameters": [
+        11
+        ],
+        "abi": "0xc41589e7559804ea4a2080dad19d876a024ccb05117835447d72ce08c1d020ec",
+        "contractName": "test",
+        "bytecode": "60606040526040516020806102b183398101604052808051906020019091905050806000819055505061027a806100376000396000f300606060405260043610610062576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680632f30c6f61461006757806338cc48311461009e57806362738998146100f357806387cc10e11461011c575b600080fd5b61009c600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610145565b005b34156100a957600080fd5b6100b1610191565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156100fe57600080fd5b6101066101bb565b6040518082815260200191505060405180910390f35b341561012757600080fd5b61012f6101c4565b6040518082815260200191505060405180910390f35b8160008190555080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008054905090565b600073__browser/ballot.sol:testLib____________636d4ce63c6000604051602001526040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b151561022e57600080fd5b6102c65a03f4151561023f57600080fd5b505050604051805190509050905600a165627a7a72305820e0b2510bb2890a0334bfe5613d96db3e72442e63b514cdeaee8fc2c6bbd19d3a0029",
+        "linkReferences": {
+        "browser/ballot.sol": {
+            "testLib": [
+            {
+                "length": 20,
+                "start": 511
+            }
+            ]
+        }
+        },
+        "name": "",
+        "type": "constructor",
+        "from": "account{0}"
+    }
+    },
+    {
+    "timestamp": 1512830034180,
+    "record": {
+        "value": "1000000000000000000",
+        "parameters": [
+        1,
+        "0xca35b7d915458ef540ade6068dfe2f44e8fa733c"
+        ],
+        "to": "created{1512830015080}",
+        "abi": "0xc41589e7559804ea4a2080dad19d876a024ccb05117835447d72ce08c1d020ec",
+        "name": "set",
+        "type": "function",
+        "from": "account{0}"
+    }
+    }
+],
+"abis": {
+    "0xbc36789e7a1e281436464229828f817d6612f7b477d66591ff96a9e064bcc98a": [
+    {
+        "constant": true,
+        "inputs": [],
+        "name": "get",
+        "outputs": [
+        {
+            "name": "",
+            "type": "uint256"
+        }
+        ],
+        "payable": false,
+        "stateMutability": "view",
+        "type": "function"
+    }
+    ],
+    "0xc41589e7559804ea4a2080dad19d876a024ccb05117835447d72ce08c1d020ec": [
+    {
+        "constant": true,
+        "inputs": [],
+        "name": "getInt",
+        "outputs": [
+        {
+            "name": "",
+            "type": "uint256"
+        }
+        ],
+        "payable": false,
+        "stateMutability": "view",
+        "type": "function"
+    },
+    {
+        "constant": true,
+        "inputs": [],
+        "name": "getFromLib",
+        "outputs": [
+        {
+            "name": "",
+            "type": "uint256"
+        }
+        ],
+        "payable": false,
+        "stateMutability": "view",
+        "type": "function"
+    },
+    {
+        "constant": true,
+        "inputs": [],
+        "name": "getAddress",
+        "outputs": [
+        {
+            "name": "",
+            "type": "address"
+        }
+        ],
+        "payable": false,
+        "stateMutability": "view",
+        "type": "function"
+    },
+    {
+        "constant": false,
+        "inputs": [
+        {
+            "name": "_t",
+            "type": "uint256"
+        },
+        {
+            "name": "_add",
+            "type": "address"
+        }
+        ],
+        "name": "set",
+        "outputs": [],
+        "payable": true,
+        "stateMutability": "payable",
+        "type": "function"
+    },
+    {
+        "inputs": [
+        {
+            "name": "_r",
+            "type": "uint256"
+        }
+        ],
+        "payable": true,
+        "stateMutability": "payable",
+        "type": "constructor"
+    }
+    ]
+}
+}
+
+
+
+
+ + +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/run_tab.html b/docs/_build/html/run_tab.html new file mode 100644 index 0000000000..aea9c32983 --- /dev/null +++ b/docs/_build/html/run_tab.html @@ -0,0 +1,518 @@ + + + + + + + + + + + Run & Deploy — Remix, Ethereum-IDE 1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

Run & Deploy

+

The Run tab allows you to send transactions to the current environment.

+

To get to the Run & Deploy module - click the run icon in the icon panel.

+

In order to use this module you need to have a contract compiled. So if there is file name in the contract pulldown menu ( in the image below it’s the pulldown that says Ballot), then you can interact with this contract. If nothing is there - then you need to select a contract - make it the active contract in the main panel, ( in the image below - on the right side of the page - in the main panel - you see the ballot.sol so it is the active contract) then go to the compiler module and compile it.

+

_images/a-runtab1.png

+
+

Run Setup

+

The following settings allow you to directly influence the transaction +execution:

+

Environment:

+
    +
  • JavaScript VM: All the transactions will be executed in +a sandbox blockchain in the browser. This means nothing +will be persisted and a page reload will restart a new +blockchain from scratch, the old one will not be saved.

  • +
  • Injected Provider: Remix will connect to an injected +web3 provider. Metamask is an example of +providers that inject web3, thus can be used with this +option.

  • +
  • Web3 Provider: Remix will connect to a remote node. You +will need to provide the URL address to the selected +provider: geth, parity or any Ethereum client.

  • +
  • Account: the list of accounts associated with the current +environment (and their associated balances).

  • +
  • Gas Limit: the maximum amount of gas that can be set for all the +transactions created in Remix.

  • +
  • Value: the amount of value for the next created transaction (this +value is always reset to 0 after each transaction execution).

  • +
+

_images/a-Runtab-deploy-atAddress.png

+
+
+

Initiate Instance

+

This section contains the list of compiled contracts and 2 actions:

+
    +
  • At Address assumes the given address is an instance of the +selected contract. It is then possible to interact with an already +deployed contract. There’s no check at this point, so be careful +when using this feature, and be sure you trust the contract at that +address.

  • +
  • Deploy send a transaction that deploys the selected contract. When +the transaction is mined, the newly created instance will be added +(this might take several seconds). Note that if the constructor +has parameters, you need to specify them.

  • +
+
+
+

Pending Instances

+

Validating a transaction take several seconds. During this time, the GUI +shows it in a pending mode. When transaction is mined the number of +pending transactions is updated and the transaction is added to the log +(see ../terminal)

+
+
+

Using the ABI

+

Using Deploy or At Address is a classic use case of Remix. It is +possible though to interact with a contract by using its ABI. The ABI is +a JSON array which describe its interface.

+

To interact with a contract using the ABI, create a new file in Remix +with extension *.abi and copy the ABI content to it. Then in the input +next to At Address, put the Address of the contract you want to +interact with. Click on At Address, a new “connection” with the +contract will popup below.

+
+
+

Using the Recorder

+

The Recorder allows to save a bunch of transactions in a JSON file and +rerun them later either in the same environment or in another.

+

Saving to JSON allows to easily check the transaction list, tweak input +parameters, change linked library, etc…

+

We can find many use cases for the recorder, for instance: +: - After having coded and tested contracts in a constrained +environment (like the JavaScript VM), it could be interesting to +redeploy them easily in a more persisted environment (like a +Geth node) in order to check whether everything behaves normally +in a classic environment. +- Deploying contract does often require more than creating one +transaction. +- Working in a dev environment does often require to setup the +state in a first place.

+

_images/a-runtab-recorder.png

+

Saving a record ends up with the creation of this type of content (see +below):

+

In that specific record, 3 transactions are executed:

+

The first corresponds to the deployment of the lib testLib.

+

The second corresponds to the deployment of the contract test, the +first parameter of the constructor is set to 11. That contract depends +on a library. The linkage is done using the property linkReferences. +In that case we use the addres of the previously created library : +created{1512830014773}. the number is the id (timestamp) of the +transaction that leads to the creation of the library.

+

The third parameter corresponds to the call to the function set of the +contract test (the property to is set to: created{1512830015080}) . +Input parameters are 1 and +0xca35b7d915458ef540ade6068dfe2f44e8fa733c

+

all these transactions are created using the value of the accounts +account{0}.

+
{.sourceCode .none}
+{
+"accounts": {
+    "account{0}": "0xca35b7d915458ef540ade6068dfe2f44e8fa733c"
+},
+"linkReferences": {
+    "testLib": "created{1512830014773}"
+},
+"transactions": [
+    {
+    "timestamp": 1512830014773,
+    "record": {
+        "value": "0",
+        "parameters": [],
+        "abi": "0xbc36789e7a1e281436464229828f817d6612f7b477d66591ff96a9e064bcc98a",
+        "contractName": "testLib",
+        "bytecode": "60606040523415600e57600080fd5b60968061001c6000396000f300606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680636d4ce63c146044575b600080fd5b604a6060565b6040518082815260200191505060405180910390f35b6000610d809050905600a165627a7a7230582022d123b15248b8176151f8d45c2dc132063bcc9bb8d5cd652aea7efae362c8050029",
+        "linkReferences": {},
+        "type": "constructor",
+        "from": "account{0}"
+    }
+    },
+    {
+    "timestamp": 1512830015080,
+    "record": {
+        "value": "100",
+        "parameters": [
+        11
+        ],
+        "abi": "0xc41589e7559804ea4a2080dad19d876a024ccb05117835447d72ce08c1d020ec",
+        "contractName": "test",
+        "bytecode": "60606040526040516020806102b183398101604052808051906020019091905050806000819055505061027a806100376000396000f300606060405260043610610062576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680632f30c6f61461006757806338cc48311461009e57806362738998146100f357806387cc10e11461011c575b600080fd5b61009c600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610145565b005b34156100a957600080fd5b6100b1610191565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156100fe57600080fd5b6101066101bb565b6040518082815260200191505060405180910390f35b341561012757600080fd5b61012f6101c4565b6040518082815260200191505060405180910390f35b8160008190555080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008054905090565b600073__browser/ballot.sol:testLib____________636d4ce63c6000604051602001526040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b151561022e57600080fd5b6102c65a03f4151561023f57600080fd5b505050604051805190509050905600a165627a7a72305820e0b2510bb2890a0334bfe5613d96db3e72442e63b514cdeaee8fc2c6bbd19d3a0029",
+        "linkReferences": {
+        "browser/ballot.sol": {
+            "testLib": [
+            {
+                "length": 20,
+                "start": 511
+            }
+            ]
+        }
+        },
+        "name": "",
+        "type": "constructor",
+        "from": "account{0}"
+    }
+    },
+    {
+    "timestamp": 1512830034180,
+    "record": {
+        "value": "1000000000000000000",
+        "parameters": [
+        1,
+        "0xca35b7d915458ef540ade6068dfe2f44e8fa733c"
+        ],
+        "to": "created{1512830015080}",
+        "abi": "0xc41589e7559804ea4a2080dad19d876a024ccb05117835447d72ce08c1d020ec",
+        "name": "set",
+        "type": "function",
+        "from": "account{0}"
+    }
+    }
+],
+"abis": {
+    "0xbc36789e7a1e281436464229828f817d6612f7b477d66591ff96a9e064bcc98a": [
+    {
+        "constant": true,
+        "inputs": [],
+        "name": "get",
+        "outputs": [
+        {
+            "name": "",
+            "type": "uint256"
+        }
+        ],
+        "payable": false,
+        "stateMutability": "view",
+        "type": "function"
+    }
+    ],
+    "0xc41589e7559804ea4a2080dad19d876a024ccb05117835447d72ce08c1d020ec": [
+    {
+        "constant": true,
+        "inputs": [],
+        "name": "getInt",
+        "outputs": [
+        {
+            "name": "",
+            "type": "uint256"
+        }
+        ],
+        "payable": false,
+        "stateMutability": "view",
+        "type": "function"
+    },
+    {
+        "constant": true,
+        "inputs": [],
+        "name": "getFromLib",
+        "outputs": [
+        {
+            "name": "",
+            "type": "uint256"
+        }
+        ],
+        "payable": false,
+        "stateMutability": "view",
+        "type": "function"
+    },
+    {
+        "constant": true,
+        "inputs": [],
+        "name": "getAddress",
+        "outputs": [
+        {
+            "name": "",
+            "type": "address"
+        }
+        ],
+        "payable": false,
+        "stateMutability": "view",
+        "type": "function"
+    },
+    {
+        "constant": false,
+        "inputs": [
+        {
+            "name": "_t",
+            "type": "uint256"
+        },
+        {
+            "name": "_add",
+            "type": "address"
+        }
+        ],
+        "name": "set",
+        "outputs": [],
+        "payable": true,
+        "stateMutability": "payable",
+        "type": "function"
+    },
+    {
+        "inputs": [
+        {
+            "name": "_r",
+            "type": "uint256"
+        }
+        ],
+        "payable": true,
+        "stateMutability": "payable",
+        "type": "constructor"
+    }
+    ]
+}
+}
+
+
+
+
+ + +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/search.html b/docs/_build/html/search.html new file mode 100644 index 0000000000..d61b77e873 --- /dev/null +++ b/docs/_build/html/search.html @@ -0,0 +1,253 @@ + + + + + + + + + + + Search — Remix, Ethereum-IDE 1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ +
    + +
  • Docs »
  • + +
  • Search
  • + + +
  • + + + +
  • + +
+ + +
+
+
+
+ + + + +
+ +
+ +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/searchindex.js b/docs/_build/html/searchindex.js new file mode 100644 index 0000000000..82b20093fa --- /dev/null +++ b/docs/_build/html/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({docnames:["code_contribution_guide","community","compile","contract_metadata","create_deploy","debugger","file_explorer","import","index","layout","locations","plugin_manager","remix_plugin","remix_plugin_api","remix_tutorials_github","remixd","run","settings","solidity_editor","static_analysis","support","terminal","tutorial_debug","tutorial_geth-remix","udapp","unittesting"],envversion:{"sphinx.domains.c":1,"sphinx.domains.changeset":1,"sphinx.domains.cpp":1,"sphinx.domains.javascript":1,"sphinx.domains.math":2,"sphinx.domains.python":1,"sphinx.domains.rst":1,"sphinx.domains.std":1,sphinx:56},filenames:["code_contribution_guide.md","community.md","compile.md","contract_metadata.md","create_deploy.md","debugger.md","file_explorer.md","import.md","index.rst","layout.md","locations.md","plugin_manager.md","remix_plugin.md","remix_plugin_api.md","remix_tutorials_github.md","remixd.md","run.md","settings.md","solidity_editor.md","static_analysis.md","support.md","terminal.md","tutorial_debug.md","tutorial_geth-remix.md","udapp.md","unittesting.md"],objects:{},objnames:{},objtypes:{},terms:{"0xbc36789e7a1e281436464229828f817d6612f7b477d66591ff96a9e064bcc98a":16,"0xc41589e7559804ea4a2080dad19d876a024ccb05117835447d72ce08c1d020ec":16,"0xca35b7d915458ef540ade6068dfe2f44e8fa733c":16,"2nd":15,"30s":23,"5th":[],"60606040523415600e57600080fd5b60968061001c6000396000f300606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680636d4ce63c146044575b600080fd5b604a6060565b6040518082815260200191505060405180910390f35b6000610d809050905600a165627a7a7230582022d123b15248b8176151f8d45c2dc132063bcc9bb8d5cd652aea7efae362c8050029":16,"60606040526040516020806102b183398101604052808051906020019091905050806000819055505061027a806100376000396000f300606060405260043610610062576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680632f30c6f61461006757806338cc48311461009e57806362738998146100f357806387cc10e11461011c575b600080fd5b61009c600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610145565b005b34156100a957600080fd5b6100b1610191565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156100fe57600080fd5b6101066101bb565b6040518082815260200191505060405180910390f35b341561012757600080fd5b61012f6101c4565b6040518082815260200191505060405180910390f35b8160008190555080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008054905090565b600073__brows":16,"60s":23,"\u00f0app":8,"abstract":2,"break":23,"case":[9,16,22],"default":[3,6,8,9,19],"function":[4,9,11,14,16,19,22,23,24,25],"import":[2,6,8,9,17,18,21,22],"int":25,"long":[],"new":[1,4,8,10,11,14,16,19,20,21,23,24,25],"null":[],"public":[4,22],"return":[4,13,22,24],"static":2,"switch":23,"throw":[22,23],"true":[3,16,23],"try":[1,20,23],"var":23,"while":[2,21],And:22,But:[4,9,23,24],For:[1,4,7,15,20,22,24],Gas:[16,19,24],IDE:[8,10,14,15,21,23],Its:15,NOT:15,That:[1,16,20],The:[0,2,4,6,8,10,11,12,15,16,18,19,22,23,24,25],Then:[6,15,16,22,23],There:[4,14,15,16,22,23],These:[3,22],Use:[19,23],Useful:8,Using:[8,14],_add:16,_amount:[22,23],_giver:[22,23],_test:25,_to:[22,23],_valu:[22,23],abi:[2,8,23],abl:[6,9],about:[0,2,4,6,7,9,10,11,12,19,22,24],abov:[23,24],absolut:15,acccount:13,accept:[15,24],access:8,account:[4,16,23],achiev:23,action:[4,16,21],activ:[9,15,16,22,23],actual:[22,23],add:[8,22,23],added:[16,22],addeventlisten:[],addgiv:[22,23],addit:14,addr:16,address:[2,3,16,22,23,24,25],advanc:[],aesthet:17,after:[2,16,18,21,23],again:23,aiaiaaiaiaiaiai:[],aka:22,alert:23,all:[2,4,6,7,8,9,11,12,13,14,16,21,23],allow:[5,6,11,16,21,22,23],almost:[10,22],alpha:[8,10],alreadi:[5,16],also:[2,3,4,5,8,9,11,18,23,24,25],alt:[],although:23,alwai:[6,13,16],amount:[16,22,23],amounttomov:23,analysi:[2,8],analyz:19,ani:[0,4,15,16,23],anonym:23,anoth:[2,8,15,16,17,18,20],answer:[1,20],anyon:[0,1,20],anyth:[22,24],api:6,app:23,appear:[5,9,24],appendchild:23,appli:[],applic:[0,15],appropri:1,approv:22,architctur:11,area:22,argument:[],around:[1,20],arrai:[13,16],artifact:8,ask:[1,15,20,23],assembl:19,assert:25,assign:22,associ:[16,22],assum:[15,16,22],authent:6,auto:[2,3],autocompil:2,autodeploylib:3,autogener:24,automat:[3,10],avail:[8,10,13,15,21,25],avoid:[6,19],awar:22,awardtoken:[],back:22,backend:[22,23],background:15,balanc:[13,16,22,23],ballot:[4,16,23],base:9,basic:[4,9,22,23],batch:14,becaus:[4,22,23],been:[22,23,24],befor:22,beginn:[],behav:16,below:[2,4,16,22,23,25],best:[12,19],better:4,between:[6,7,15,23],bit:23,blank:22,blob:25,block:[19,22,23],blockchain:[1,4,16,20,22,23],blockhash:19,blocknumb:[],blue:[4,24],bool:[13,25],bootstrap:9,both:[4,8],bottom:[9,17,21],boundari:22,box:[22,24],breakpoint:23,bridg:7,bring:[2,24],broadcast:13,brows:23,browser:[3,4,6,8,16],bug:[5,19,22,23],build:[2,8,10,12,25],built:[0,10],bunch:16,button:[2,4,5,9,22,23,24],bytecod:[16,22],bytes32:25,bzz:2,call:[16,19,22,23,24],can:[0,1,2,4,5,6,7,8,9,11,15,16,17,19,21,22,23,24,25],cannot:15,care:16,caret:[22,24],caus:24,center:23,chain:23,chang:[6,9,11,16,18,22,23,24],channel:[1,8,17,20],chat:8,check:[0,2,6,16,19,22,23,25],checkbox:[2,6],checkout:[],choic:[9,15],choos:21,chrome:23,classic:16,clear:[6,21],cli:25,click:[2,4,5,6,9,11,15,16,17,22,23,24,25],client:[16,23],clipboard:24,close:[17,23],closest:4,code:[2,8,10,15,16,18,19,22,23,25],codebas:[0,1,20],collabor:1,collaps:24,collect:9,color:24,com:[7,10,23,25],comma:24,command:[5,15,23],common:23,commun:[8,20],compil:[3,4,8,9,16,17,18,19,22],compilationdata:13,compilationfinish:13,compilationresult:13,complain:2,complex:23,comput:[6,8,15],config:[],configur:3,confirm:15,connect:[8,9,10,11,15,16,23],consist:[],consol:[5,23],constant:[16,19,23,24],constrain:16,constructor:[4,16,22,23],contact:1,contain:[2,3,4,16,22,23,24,25],content:[13,16],context:[21,22],continu:[8,14,18],contract:[2,3,8,14,16,17,19,21,22,25],contractaddress:23,contractnam:16,contractspec:23,contribut:[1,8,20],contributor:1,control:17,conveni:4,copi:[8,16,22,23,24],corner:18,correspond:[3,4,16,22],cost:[19,24],could:[16,17,22,23],courser:22,cover:8,creat:[1,3,5,8,9,10,11,16,20,21,22,23,24,25],createel:23,createvmaccount:13,creation:[16,23],csj:0,ctr:22,current:[2,3,4,5,9,10,12,13,16,18,21,22,23,25],curret:23,custom:[1,20,22],daemon:[7,15],dapp:[],dapp_front_end:23,dappcon:[],dark:9,data:[2,13,21,22,23],datadir:23,debug:[4,5,8,14,17],debugg:[8,23],decentr:[],declar:[22,23],decreas:18,defin:[3,13,17,23],delai:23,deleg:24,delet:6,demo:14,depend:[2,3,4,16],deploi:[3,5,8,14,17,22],deploy:[8,14,16],depoli:[],describ:[3,16],detail:[2,4,7,19,22],detectnetwork:[],dev:[16,23],develop:[1,8,14,20],diagram:[],dialog:[2,15],did:22,differ:[9,22,24],directli:[1,7,16],directori:[15,23],disabl:[],discret:2,discuss:1,displai:[2,4,13,18,21,22,23,24,25],div:23,divid:7,doc:8,document:[7,10,12,23],doe:[4,16,24],doesn:[0,2,4],doing:22,don:[4,9,10,15,22,23,25],donat:22,done:[16,23],doubl:[24,25],down:24,download:[8,10],dozen:9,due:[],dure:[16,17],each:[2,3,4,9,16,18,19,22,24],easi:23,easier:23,easiest:4,easili:16,eat:[],economi:19,ecosystem:[1,20],edcon:[],edit:9,editor:[8,17,22,23],effect:19,either:[16,22],electron:[],els:[22,23],emit:22,empti:[4,23],enabl:[6,17,18,21],encod:24,encount:22,encourag:0,end:[16,22],endpoint:13,enforc:19,enter:23,entri:[],environ:[4,5,16,25],environments:[],equal:25,err:23,error:[2,13,18,23,24],especi:1,essenti:7,estim:[],etc:[16,23],eth:23,ethcc:[],ether:[4,22,23,24],etheratom:14,ethereum:[4,8,10,15,16,23,25],even:[2,22],event:[13,22,23],everi:[10,22],everyth:[8,9,16,22],everytim:9,evm:22,exampl:[9,11,14,15,16,22,23,24,25],exand:22,except:22,execut:[4,15,16,17,21,22,23,25],expand:23,explain:[],explan:7,explor:[8,15,22,23],express:22,extens:16,extern:[4,14],fail:5,fallbackbtn:23,fals:[16,23],faq:[],featur:[5,6,8,16,18,21],fee:24,feedback:0,field:[23,24],fifth:23,file:[0,2,3,8,9,10,13,14,15,16,18,22,23],filenam:[],filepath:13,filesystem:8,fill:23,find:[1,2,8,16,17,22,25],fine:23,first:[16,22,23],flag:[15,23],flexibl:9,focu:13,focus:[],folder:[6,10,15,23,25],follow:[3,15,16,22,23],font:18,forget:23,form:[3,24],forward:22,found:[8,10],four:23,framework:0,freeli:23,from:[2,5,6,8,15,16,21,23],fromgiv:23,frommovefund:23,front:[],frontend:[],full:[15,22],fundmov:[22,23],futur:9,game:[],gas:[16,17,19,22,24],gatewai:7,gdb:23,gear:17,gener:[6,8,23],get:[1,4,5,6,8,9,16,17,20,22,25],getaccount:13,getaddress:16,getcompilationresult:13,getconfig:13,getcurrentfil:13,getelementbyid:23,getexecutioncontextprovid:13,getfil:13,getfromlib:16,geth:16,getint:16,getproviderendpoint:13,gettransactionreceipt:23,gist:8,github:[0,6,8,10,14,23,25],gitter:[1,17],give:[0,4,13,15,19,22,23,24],given:[15,16,22],global:15,glossari:[],goal:[4,23],goe:[],going:[4,22,23],grai:9,granular:22,greaterthan:25,green:[],gui:[9,16,23],guid:8,gutter:18,had:22,half:9,happen:[9,11,22],has:[2,6,13,15,16,22,24],hash:[22,23],have:[1,4,7,9,15,16,17,22,23,24],help:[0,1,8,10,19,20],here:[7,9,10,12,15,18,19,22,23,24],hex:13,hexcolor:13,hid:22,hidden:22,high:19,highlight:[13,18,22],hit:[],homepag:[8,17],horizon:[],host:15,hover:[],how:[7,8,11,12],howev:[4,9,23],html:23,http:[7,10,15,23,25],icon:[2,5,6,8,15,16,17,22,23,24,25],ide:[10,15],idea:1,ifram:[],imag:[2,16,22,23],img:[],immedi:4,implement:[],improv:0,inconsist:17,increas:[7,18],index:[22,23],influenc:16,info:[],inform:[1,2,4,6,8,10,19,20,22,24,25],infrastructur:[],initi:[8,22],inject:[0,4,13,16,21,22,23],inlin:19,innerhtml:23,input:[8,16,21,22,23],insid:23,instal:[10,15],instanc:[8,10,15,22],instantli:22,instead:[],instruct:[7,8],integr:[8,9,11,14,21],interact:[8,9,16,21,24],interest:[1,16,20],interfac:[16,23],intern:[22,23],interpret:21,intput:[],intro:8,introduct:[],invoc:19,ipc:23,ipcpath:23,ipf:[],issu:[0,2,23],its:[2,4,8,9,16,23,24],javascript:[0,4,8,13,16,21,22,23],join:[1,20],json:[0,3,16,23],jump:22,just:[4,7,9,11,13,15,22,23],jvm:[],keep:[4,23],kei:[3,23],keyword:[7,18],kindli:1,know:[1,7,10,20,21],kovan:3,label:23,lallallal:[],larg:17,last:[13,18,19,22],later:[16,23],latest:[],layer:[],layout1a:[],layout:[8,14],lead:[16,17],learn:[0,9,11,12],least:[],left:[6,18,22,23],length:16,lesserthan:25,let:[22,23],level:[14,19],lib2:3,lib:[3,16],librari:[8,14,16],light:[],like:[0,7,14,16,22,23],limit:[16,24],line:22,linecolumnpo:13,link:[3,6,8,9,11,16,17],linkag:16,linkrefer:[3,16],list:[2,6,13,16,17,18,19,24],listen:[],load:[5,8,11,13,14,15,23,25],local:[8,9,10,11,19,23],localhost:15,locat:[2,9,22],log:[16,21,22,23],logo:9,look:9,lot:[1,2,9,20],low:19,ltfschoen:23,machin:[],made:[9,11,21,22,24],mai:[],main:[1,3,7,9,16,23],mainnet:4,make:[4,9,10,15,16],manag:[5,8,15,22,24,25],mani:[7,9,16],map:[3,18],master:25,maximum:16,mayb:19,mean:[9,11,16,23],mechan:23,memori:22,menu:[2,16],messag:[],metadata:[2,3],metamask:[4,16],method:7,might:[4,16,22],mind:4,mine:[4,5,16,21,22,23],miner:23,minimun:25,miscellan:19,mist:23,mistak:[19,24],modal:[2,15],mode:[8,15,16,21,23],modifi:[4,22,23,24],modul:[0,5,8,15,16],more:[0,1,2,4,6,8,10,11,16,23,24,25],most:9,move:[4,23],movefund:[22,23],movefundbtn:23,movefundto:23,mozilla:[],msg:[22,23],much:8,multi:24,multipl:[2,14,22],name:[16,19,22,23],navig:22,necessari:5,need:[3,4,9,10,11,15,16,22,23,24,25],net:7,network:[3,23],network_id:3,network_nam:3,networkd_id:3,newaccount:23,newli:[2,4,16,23],newtransact:13,next:[16,22,23],node:[4,7,16,22,23,25],non:2,none:[4,16,22,23],normal:[4,16],notabl:2,note:[3,4,6,16,21,22],notequ:25,noth:16,notif:[],now:[6,9,11,15,17,23],npm:[0,10,15],number:[16,22,24],obj:13,object:[13,21],oct:[],off:[9,11],offici:[15,23],often:16,old:[9,16],onc:[22,23],onclick:23,one:[2,4,9,16,22,23,24],ones:[],onli:[0,2,5,6,9,11,15,21,22,23,24],onlin:10,onlyown:[22,23],opcod:22,open:[0,1,2,8,15,18,20,22,23,24],optim:17,option:[15,16,17],oracl:14,orang:[4,24],order:[9,11,16,22,23],org:[8,10,15],origin:[19,23],other:[0,1,2,4,9,11,14,20,23],our:[0,4,8,14,17,23],out:[0,10,17,22],output:[16,23],outsid:23,over:22,own:[9,11,22,23],owner:[7,22,23],packag:[0,10],page:[0,8,10,16],pai:22,pair:13,panel:[2,5,6,8,11,15,16,17,23],param:[13,24],paramet:[4,8,16,23],parent:[],pariti:16,part:[8,11,22],passphras:23,past:[6,23],path:[7,13,15],payabl:[4,16,22,23,24],pend:8,perform:4,perman:6,permiss:15,persist:16,person:23,piec:23,pipelin:14,place:[9,11,16],placehold:23,plai:23,pleas:[0,1,7,12,15,20,23,25],plug:[4,9,11],plugin:[1,5,8,14,15,20,22,23,25],plugintitl:[],pluginurl:[],png:[],point:[16,23],popup:16,port:15,portabl:7,possibl:[3,4,7,16,22],post:[],postmessag:[],potenti:19,power:8,practic:19,pragma:[4,22],prepar:[],present:[],previou:22,previous:[16,23],privat:23,privatekei:13,process:14,product:17,project:[1,8,9,11],promot:1,proper:22,properti:16,provid:[4,5,13,15,16,18,21,22,23],proxi:14,publish:[2,8],pull:0,pulldown:[2,16],pure:24,purpos:[4,15,22,23],push:[22,23],put:[16,22,23,24],python:[],question:[1,20],quick:[],quickli:[4,23],quot:24,rather:17,read:15,readi:17,readm:[11,12],realli:22,receipt:23,receiv:[],receivemessag:[],recompil:18,record:[8,14],recreat:23,red:[4,23,24],redeploi:16,reentranc:19,refer:[21,22],regist:[],rel:7,relat:[1,4,22],releas:[8,10],reli:0,reload:[4,16],remix:[0,1,3,4,5,7,15,16,18,20,21,22,25],remixd:[6,7,8,10],remot:16,remov:[6,22],removeconfig:13,renam:6,replac:22,replai:14,repo:[7,11,12,14],report:2,repositori:[8,25],repres:3,request:0,requir:[4,6,16,19,23,24],rerun:16,reset:16,resolv:3,resourc:8,respect:1,respons:[],restart:[4,16],result:[9,13,22,23,25],retriev:23,review:6,rewrit:[],right:[6,16,22,23],rinkebi:3,ropsten:[3,23],rpc:[],run:[4,5,8,9,10,14,15,19,21,22],runtx:13,safemath:25,sai:[4,15,16,22],same:[16,22],sampl:[8,23,25],sandbox:16,saniti:9,save:[2,6,9,16,17,18,23],saver:9,scatter:[1,20],scratch:16,screen:[],screencast:14,script:[9,14,21,23],search:21,second:[4,16,22,23],section:[2,13,16,19,23,24],secur:19,see:[2,4,6,7,9,10,15,16,22,24,25],select:[0,2,6,8,9,16,18,21,22],semant:19,send:[4,16,21,22,23],sender:[22,23],sent:13,separ:[9,24,25],seri:14,serv:23,server:23,session:[15,22,23],set:[0,6,8,9,16,22,23,24],setconfig:13,setfil:13,setnp:4,setp:4,setpn:4,settimeout:23,setup:[4,6,8],sever:[3,4,16,23],share:[10,15],should:[3,4,6,15,17,23,24],show:[2,9,16,23],side:[16,22,23],sidewai:24,similar:19,simul:22,singl:[],size:18,slide:[8,14],slider:[22,23],small:23,smart:8,softwar:4,sol:[3,4,6,16,25],solid:[4,6,8,9,14,23,24,25],solidti:2,some:[1,7,8,17,18,23,25],someth:23,sourc:[0,2,8,10,13,22],sourcecod:[4,16,22,23],space:1,special:20,specif:[14,16],specifi:[4,7,16,23],squar:25,src:[],stabl:[8,10],stack:[0,22],stackexchang:8,start:[4,6,8,9,10,15,16,22],state:[4,16,23,24],statement:22,statemut:16,statu:[],step:[22,23],still:[10,23],stop:[22,23],storag:[6,8,22,23],store:[6,23,24],straight:8,string:[13,24,25],stringifi:23,structur:8,stuck:[1,20],submodul:0,succe:3,success:[5,13,15],sucess:22,suffix:25,suggest:23,support:[1,7,8,25],sure:[4,15,16],swap:[9,15],swarm:[2,8,14],sync:[6,15,23],syntax:18,system:6,tab:[2,4,6,9,16,18,19,23,24],take:[2,4,16],talk:23,task:9,tcp:15,techniqu:7,tediou:9,tell:24,term:[],termin:[4,5,8,9,14,16,22],test:[4,8,14,16,23],testcontract:4,testlib:16,testlib____________636d4ce63c6000604051602001526040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b151561022e57600080fd5b6102c65a03f4151561023f57600080fd5b505050604051805190509050905600a165627a7a72305820e0b2510bb2890a0334bfe5613d96db3e72442e63b514cdeaee8fc2c6bbd19d3a0029:16,text:[17,23],than:[4,16,23],thei:[22,24],them:[6,16,21,23,24],theme:[4,8,17],thi:[2,4,5,6,7,8,9,10,11,13,14,15,16,17,19,22,23,24,25],think:[],third:[16,23],those:[22,23],though:16,through:[22,24],thu:16,time:[2,4,9,16,18,22,23,24],timestamp:[16,19],titl:13,token:6,too:19,tool:[0,1,4,8,11,20,23],top:[6,9,11,18],tour:8,track:[],transact:[4,5,14,16,19,21,23,24],transactionhash:23,travi:25,trigger:[2,22],trust:16,trytillrespons:23,turn:[9,11],tutori:[7,8,22,23],tweak:16,twice:22,twitter:1,two:22,txhash:23,type:[4,16,23,24,25],typic:8,udapp:[22,24],uint256:[16,23],uint8:[4,24],uint:[4,22,23,25],ultim:23,unclear:19,undefin:[],under:24,unfocu:13,unfocus:13,unfortun:6,unit:[8,22,23],untitl:[3,6],updat:[2,10,16],updatetitl:13,upgrad:14,upon:13,url:[2,6,7,8,13,15,16],usag:[8,19],use:[0,1,2,4,6,7,8,14,15,16,22,23],used:[3,5,16,19,22,25],useful:17,user:[1,6,15,20],uses:[7,22,25],using:[1,2,4,7,9,10,15,16,20,22,24],usual:[4,23],valid:[16,24],valu:[3,4,13,16,22,23,24],valuabl:2,value1:[],value2:[],valueg:23,valuetosend:[],variabl:[4,19,22,23],veri:[1,2,4,9,17,20],verifi:[],version:[8,10],via:19,video:14,view:[4,16],virtual:[],visit:0,vyper:9,wai:[14,22],wait:[22,23],walkthrough:14,wallet:23,want:[1,2,9,10,11,16,20,22,23],warn:[2,15,18,19,22],watch:[],web3:[4,13,16,21,23],web:[1,15,20,21,22,23],websocket:15,wei:[22,23],well:[17,22,23,24],were:[],what:[22,23,24],when:[2,4,5,9,11,15,16,17,22,23,24],where:[1,8,9,10,20,22,23,24],whether:16,which:[3,4,6,9,13,16,21,24,25],who:[1,20],why:[1,20,22],wiki:8,window:23,without:[],won:[22,24],work:[1,5,9,16,20,23],workaround:23,workshop:[8,14],world:[],would:[1,22,23],wrap:[17,24],write:[8,15,23],written:8,wrote:6,yann:[],yes:[],you:[0,1,2,4,5,6,7,8,9,10,11,15,16,17,18,19,20,21,22,23,24,25],your:[1,2,4,8,9,11,20,22,23],youtub:[],zero:22},titles:["Code contribution guide","Community","Compiler (Solidity)","Build Artifact","Creating and Deploying a Contract","Debugger","File Explorer","Importing Source Files in Solidity","Welcome to Remix documentation!","Remix-IDE Layout","Finding Remix","Plugin Manager","Remix Plugin","Remix Plugin API usage","Remix Tutorials","Remixd: Get access your local filesystem","Run & Deploy","Settings","Solidity Editor","Analysis","Support chat","Terminal","Debugging transactions","Debugging a Dapp using Remix & Geth","Run & Deploy (part 2)","Unit Testing"],titleterms:{"import":[7,23],"new":[6,9],IDE:9,The:9,Using:[16,22],abi:16,access:15,add:6,addendum:13,addit:[],aiaiaaiaiaiaiai:[],analysi:19,anoth:6,api:13,app:13,artifact:3,back:23,block:[],breakpoint:22,browser:7,build:3,chat:20,code:0,commun:1,compil:[2,13],comput:7,config:13,connect:6,continu:25,contract:[4,23,24],contribut:0,copi:6,creat:[4,6],dapp:23,debug:[22,23],debugg:[5,22],deploi:[4,16,23,24],deploy:3,depoli:[],develop:23,document:8,donat:23,download:[],eat:[],editor:[13,18],end:23,environ:[9,23],everyth:11,explor:6,extens:[],extern:[],faq:[],file:[6,7,25],filesystem:[6,7,15],find:10,from:[7,22],front:23,gener:25,get:15,geth:23,gist:6,github:7,glossari:[],gui:22,guid:0,homepag:9,icon:9,ifram:[],initi:16,input:24,instal:23,instanc:[4,6,16],instruct:22,integr:25,interact:4,introduct:[],javascript:[],kei:13,layout:9,let:[],level:22,librari:3,like:[],listen:13,load:9,local:[6,7,15,22],locat:[],low:22,manag:[9,11],messag:[],metamask:23,mist:[],mode:4,notic:23,notif:13,npm:[],onli:13,other:[],packag:[],page:9,panel:[9,22],paramet:24,part:24,pend:16,plugin:[9,11,12,13],post:[],publish:6,quick:[],record:16,remix:[6,8,9,10,11,12,13,14,23],remixd:15,request:13,revert:22,run:[16,23,24,25],sampl:4,select:4,set:17,setup:16,smart:[],solid:[2,7,18,22],sourc:7,start:23,state:22,storag:7,structur:9,support:20,swarm:7,tab:[],termin:21,test:25,theme:9,transact:[13,22],tutori:14,txlisten:13,udapp:13,unit:25,url:[],usag:13,using:23,welcom:8,workshop:[],write:[],your:[6,7,15]}}) \ No newline at end of file diff --git a/docs/_build/html/settings.html b/docs/_build/html/settings.html new file mode 100644 index 0000000000..07a796f083 --- /dev/null +++ b/docs/_build/html/settings.html @@ -0,0 +1,257 @@ + + + + + + + + + + + Settings — Remix, Ethereum-IDE 1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

Settings

+

To get to Settings click the gear a the very bottom of the icon panel.

+

You can find a link to the homepage (if you closed it) as well as a link to our Gitter Channel and for you aesthetes out there, we now have a rather large list of themes.

+

_images/a-themes.png

+

Another important settings:

+
    +
  • Text wrap: controls if the text in the editor should be wrapped.

  • +
  • Enable optimization: defines if the compiler should enable optimization during compilation. Enabling this option saves execution gas. It is useful to enable optimization for contracts ready to be deployed in production but could lead to some inconsistencies when debugging such a contract.

  • +
+
+ + +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/settings_tab.html b/docs/_build/html/settings_tab.html new file mode 100644 index 0000000000..f9c13b2dc4 --- /dev/null +++ b/docs/_build/html/settings_tab.html @@ -0,0 +1,266 @@ + + + + + + + + + + + Settings — Remix, Ethereum-IDE 1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

Settings

+

To get to Settings click the gear a the very bottom of the icon panel.

+

You can find a link to the homepage (if you closed it) as well as a link to our Gitter Channel and for you aesthetes out there, we now have a rather large list of themes.

+

images/a-settings.png

+

Another important settings:

+
    +
  • Text wrap: controls if the text in the editor should be wrapped.

  • +
  • Enable optimization: defines if the compiler should enable optimization during compilation. Enabling this option saves execution gas. It is useful to enable optimization for contracts ready to be deployed in production but could lead to some inconsistencies when debugging such a contract.

  • +
+
+ + +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/solidity_editor.html b/docs/_build/html/solidity_editor.html new file mode 100644 index 0000000000..75ab85d4f5 --- /dev/null +++ b/docs/_build/html/solidity_editor.html @@ -0,0 +1,262 @@ + + + + + + + + + + + Solidity Editor — Remix, Ethereum-IDE 1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

Solidity Editor

+

The Remix editor recompiles the code each time the current file is +changed or another file is selected. It also provides syntax +highlighting mapped to solidity keywords.

+

_images/a-sol-editor.png

+

Here’s the list of some important features:

+
    +
  • It display opened files as tabs.

  • +
  • Compilation Warning and Error are displayed in the gutter

  • +
  • Remix saves the current file continuously (5s after the last +changes)

  • +
  • +/- on the top left corner enable you to increase/decrease the font +size of the editor

  • +
+
+ + +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/static_analysis.html b/docs/_build/html/static_analysis.html new file mode 100644 index 0000000000..5e7e96d1b2 --- /dev/null +++ b/docs/_build/html/static_analysis.html @@ -0,0 +1,278 @@ + + + + + + + + + + + Analysis — Remix, Ethereum-IDE 1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

Analysis

+

This section gives information about the last compilation. By default, a +new analysis is run at each compilation.

+

The analysis tab gives detailed information about the contract code. It +can help you avoid code mistakes and to enforce best practices.

+

_images/a-static-analysis.png

+

Here is the list of analyzers:

+

Security:

+
    +
  • Transaction origin: Warns if tx.origin is used

  • +
  • Check effects: Avoid potential reentrancy bugs

  • +
  • Inline assembly: Use of Inline Assembly

  • +
  • Block timestamp: Semantics maybe unclear

  • +
  • Low level calls: Semantics maybe unclear

  • +
  • Block.blockhash usage: Semantics maybe unclear

  • +
+

Gas & Economy:

+
    +
  • Gas costs: Warns if the gas requirements of the functions +are too high

  • +
  • This on local calls: Invocation of local functions via +this

  • +
+

Miscellaneous:

+
    +
  • Constant functions: Checks for potentially constant +functions

  • +
  • Similar variable names: Checks if variable names are too +similar

  • +
+
+ + +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/support.html b/docs/_build/html/support.html new file mode 100644 index 0000000000..ad4d0eb8a0 --- /dev/null +++ b/docs/_build/html/support.html @@ -0,0 +1,251 @@ + + + + + + + + + + + Support chat — Remix, Ethereum-IDE 1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

Support chat

+

We know that blockchain ecosystem is very new and that lots of information is scattered around the web. +That is why we created a community support chat where we and other users try to answer your questions if +you get stuck using Remix. Please, join the Remix channel and ask the community for help.

+

For anyone who is interested in developing a custom plugin for Remix or who wants to contribute to the codebase, +we’ve opened another channel specially for developers working on Remix tool.

+
+ + +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/support_tab.html b/docs/_build/html/support_tab.html new file mode 100644 index 0000000000..2975e83855 --- /dev/null +++ b/docs/_build/html/support_tab.html @@ -0,0 +1,246 @@ + + + + + + + + + + + Support tab in Remix — Remix, Ethereum-IDE 1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

Support tab in Remix

+

This section provides a link to Remix Issues where users can report a +bug or suggest a feature, as well as providing other useful links. It +also displays a Remix support +channel

+

_images/remix_supporttab.pngimage

+
+ + +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/terminal.html b/docs/_build/html/terminal.html new file mode 100644 index 0000000000..64dc8abba8 --- /dev/null +++ b/docs/_build/html/terminal.html @@ -0,0 +1,266 @@ + + + + + + + + + + + Terminal — Remix, Ethereum-IDE 1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

Terminal

+

_images/a-terminal-and-more.png

+

Features, available in the terminal:

+
    +
  • It integrates a JavaScript interpreter and the web3 object. It +enables the execution of the JavaScript script which interacts with +the current context. (note that web3 is only available if the +web provider or injected provider mode is selected).

  • +
  • It displays important actions made while interacting with the Remix +IDE (i.e. sending a new transaction).

  • +
  • It displays transactions that are mined in the current context. You +can choose to display all transactions or only transactions that +refers to the contracts Remix knows (e.g transaction created from +the Remix IDE).

  • +
  • It allows searching for the data and clearing the logs from the +terminal.

  • +
  • You can run scripts by inputting them at the bottom after the >.

  • +
+
+ + +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/tutorial_debug.html b/docs/_build/html/tutorial_debug.html new file mode 100644 index 0000000000..2d02718074 --- /dev/null +++ b/docs/_build/html/tutorial_debug.html @@ -0,0 +1,431 @@ + + + + + + + + + + + Debugging transactions — Remix, Ethereum-IDE 1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

Debugging transactions

+

There are two ways to start debugging, each one corresponds to a different use case.

+
    +
  • from the transaction log in the Terminal - use this when you are want to debug a “sucessful” transaction.

  • +
  • from the Debugger - use this if you have a transaction hash or a block number with a transaction index.

  • +
+
+

Debug from the Transaction GUI -

+

Let’s start with a basic contract (or replace this one by your own):

+
    +
  • create a blank file in the file explorer (by clicking the + icon) and give it a name.

  • +
  • copy the code below.

  • +
  • compile the code.

  • +
  • click the Run & Deploy icon in the icon panel.

  • +
+
{.sourceCode .none}  - RS why is this here?
+pragma solidity >=0.5.1 <0.6.0;
+contract Donation {
+    address owner;
+    event fundMoved(address _to, uint _amount);
+    modifier onlyowner { if (msg.sender == owner) _; }
+    address[] _giver;
+    uint[] _values;
+
+    constructor() public {
+        owner = msg.sender;
+    }
+
+    function donate() payable  public {
+        addGiver(msg.value);
+    }
+
+    function moveFund(address payable _to, uint _amount) onlyowner  public {
+        uint balance = address(this).balance;
+        uint amount = _amount;
+        if (_amount <= balance) {
+            if (_to.send(balance)) {
+                emit fundMoved(_to, _amount);    
+            } else {
+               revert();
+            }
+        } else {
+            revert();
+        }
+    }
+
+    function addGiver(uint _amount) internal {
+        _giver.push(msg.sender);
+        _values.push(_amount);
+    }
+}
+
+
+

For the purpose of this tutorial, we will run the JavaScript VM. +This simulates a custom blockchain. You could do the same using a proper backend node.

+

Let’s deploy the contract:

+

Click the Deploy button

+

_images/a-debug1-deploy.png

+

You’ll see the deployed instance (AKA the udapp).

+

_images/a-debug2-udapp1a.png

+

Then open it up (by clicking the caret).

+

_images/a-debug3-udapp2.png

+

We are going to call the Donate function and will send it ether.

+

To do this: in the value input box put in 2 and select Ether as the unit (and not wei like I did in the image below - well you could - it won’t really change anything).

+

_images/a-debug4-value-loc.png

+

Then click the Donate button.

+

This will send Ether to the this function.

+

Because we are using the JavaScript VM, everything happens almost instantly. (If we had been using Injected Web 3, then we would have to need to approve the transaction, pay for gas and wait for the transaction to get mined.)

+

Remix displays information related to each transaction result in the terminal.

+

Check in the terminal where the transaction you just made is logged.

+

Click the debug button to start debugging it.

+

_images/a-debug5-term-debug-but.png

+
+
+

From the Debugger

+

Click the bug icon in the icon panel to get to the debugger in the side panel. If you don’t see the bug icon go to the plugin manager and activate the debugger.

+

You can start a debug session by providing either a transaction hash +or a block number and transaction index.

+

To find a transaction hash

+
    +
  1. go to a transaction in the terminal.

  2. +
  3. Click a line with a transaction - to exand the log.

  4. +
  5. Copy the transaction has locate there.

  6. +
+

_images/remix3.pngimage

+

Then click on the start debugging button.

+
+
+

Using the debugger

+

The debugger allows one to see detailed informations about the +transaction’s execution. It uses the editor to display the +location in the source code where the current execution is.

+

The transaction panel displays basic information about the current +transaction.

+

_images/remix_debugtransactioninfo.pngimage

+

The navigation part contains a slider and buttons that can be used to +step through the transaction execution.

+

From the left to the right:

+

step over back, step into back, step into forward, step over forward, +jump out (jump out of the current call), jump to the previous +breakpoint, jump to the next breakpoint.

+

_images/remix_navigation.pngimage

+

11 panels give detailed information about the execution:

+
+

Instructions

+

_images/remix_debuginstructions.pngimage

+

The Instructions panel displays the bytecode of the current executing +contract- with the current step highlighted.

+

Important note: When this panel is hidden, the slider will have a +courser granularity and only stop at expression boundaries, even if they +are compiled into multiple EVM instructions. When the panel is +displayed, it will be possible to step over every instruction, even +those that refers to the same expression.

+
+
+

Solidity Locals

+

_images/remix_soliditylocals.pngimage

+

The Solidity Locals panel displays local variables associated with the +current context.

+
+
+

Solidity State

+

_images/remix_soliditystate.pngimage

+

The Solidity State panel displays state variables of the current +executing contract.

+
+
+

Low level panels

+

These panels display low level informations about the execution:

+
+
    +
  • Stack

  • +
  • Storages Changes

  • +
  • Memory

  • +
  • Call Data

  • +
  • Call Stack

  • +
  • Return Value (only if the current step is a RETURN opcode)

  • +
  • Full Storages Changes (only at the end of the execution - display +every storage change of every modified contract)

  • +
+
+
+
+

Reverted Transaction

+

A transaction could be reverted (because of an out of gas exception or +Solidity revert statement or because of a low level exception).

+

It is important to be aware of the exception and to locate +where the exception is in the source code.

+

Remix will warn you when the execution throws an exception. The +warning button will jump to the last opcode before the exception +happened.

+

_images/remix_executionexception.pngimage

+
+
+

Breakpoints

+

The two last buttons from the navigation area are used to jump either +back to the previous breakpoint or forward to the next breakpoint.

+

Breakpoints can be added and removed by clicking on the line number in the Editor.

+

_images/remix_breakpoint.pngimage

+

When using debug session with breakpoints, the execution will jump to the first +encountered breakpoint.

+

Important note: If you add a breakpoint to a line that declares a +variable, it might be triggered twice: Once for initializing the +variable to zero and second time for assigning the actual value. As an +example, assume you are debugging the following contract:

+

(RS - what is the {.sourceCode .none} doing?)

+
{.sourceCode .none}
+pragma solidity >=0.5.1 <0.6.0;
+
+contract ctr {
+    function hid () public {
+        uint p = 45;
+        uint m;
+        m = 89;
+        uint l = 34;
+    }
+}
+
+
+

And let’s says that breakpoints are set for the lines

+

uint p = 45;

+

m = 89;

+

uint l = 34;

+

then clicking on Jump to next breakpoint will stop at the following +lines in the given order:

+
+

uint p = 45; (declaration of p)

+

uint l = 34; (declaration of l)

+

uint p = 45; (45 assigned to p)

+

m = 89; (89 assigned to m)

+

uint l = 34; (34 assigned to l)

+
+
+
+
+ + +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/tutorial_eattheblock.html b/docs/_build/html/tutorial_eattheblock.html new file mode 100644 index 0000000000..9c4f68a73d --- /dev/null +++ b/docs/_build/html/tutorial_eattheblock.html @@ -0,0 +1,261 @@ + + + + + + + + + + + Eat the Block tutorials — Remix, Ethereum-IDE 1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

Eat the Block tutorials

+

This section list Remix related tutorials:

+

Youtube channel

+

Introduction

+

Remix File explorer

+
+ + +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/tutorial_geth-remix.html b/docs/_build/html/tutorial_geth-remix.html new file mode 100644 index 0000000000..2254f9ebe4 --- /dev/null +++ b/docs/_build/html/tutorial_geth-remix.html @@ -0,0 +1,480 @@ + + + + + + + + + + + Debugging a Dapp using Remix & Geth — Remix, Ethereum-IDE 1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

Debugging a Dapp using Remix & Geth

+

The ultimate goal of this tutorial is to debug transactions that have +been created by a dapp front end.

+

It is easy in Remix to debug a transaction created from its own GUI. +However, setting up an environment that allows you to debug transactions +created outside of Remix, require a bit more of complexity.

+

We will need four tools for that :

+
+
    +
  • Geth - this is the center piece and provides the blockchain +environment. We will basically run geth in a dev mode.

  • +
  • Remix - this is the Ethereum IDE. We will use it to develop our +Solidity contract.

  • +
  • Any code editor you want - in order to write your front end :)

  • +
+
+
+

Install the environment

+
+

Install Metamask

+

Basically we will run our front end in the Metamask Chrome plugin (Metamask).

+
+
+

Install Geth

+

Geth is the official +Ethereum client.

+
+
+
+

Running the environment

+
+

Run Geth

+

We will run a test node. This node will have a new empty state and will +not be synced to the main or ropsten network.

+
geth --ipcpath <test-chain-directory>/geth.ipc --datadir <test-chain-directory> --dev console
+
+
+

<test-chain-directory> is the folder where keys and chain data will be +stored.

+

--ipcpath defines the end point that other apps (like Metamask) use to +talk to geth.

+

--datadir specifies the data directory.

+

--dev sets the node into private chain mode and adds some debugging +flags.

+

Then we need to create accounts and mine a bit to generate some Ether:

+
// from the geth console :
+personal.newAccount() // You can execute this command several time if you need more than one account.
+miner.start()  // generate some Ether.
+miner.stop() // stop mining after 30s-60s - we could also keep mining.
+
+
+

Next time we run Geth, we will only need to mine transactions (no need +to recreate account).

+
+
+

Starting Remix

+

In Mist click on Develop / Open Remix IDE

+

Remix will open in a new window. If this is the first time it is run, +the Ballot contract will be loaded.

+

Now, we need to check if Remix is connected to Mist:

+

Right panel / third tab from the left, Injected Provider should be +checked.

+

_images/remix4.pngimage

+

Right panel / second tab from the left, Transaction Origin should +contain accounts we have previously created in Geth.

+

_images/remix5.pngimage

+
+
+
+

Developing contract / front end

+
+

Donation contract - Dapp Back end

+

Here is a sample solidity contract.

+

Copy and paste the following inside remix:

+
{.sourceCode .none}
+contract Donation {
+    address owner;
+    event fundMoved(address _to, uint _amount);
+    modifier onlyowner { if (msg.sender == owner) _; }
+    address[] _giver;
+    uint[] _values;
+
+    function Donation() {
+        owner = msg.sender;
+    }
+
+    function donate() payable {
+        addGiver(msg.value);
+    }
+
+    function moveFund(address _to, uint _amount) onlyowner {
+        uint balance = this.balance;
+        uint amount = _amount;
+        if (_amount <= this.balance) {
+            if (_to.send(this.balance)) {
+                fundMoved(_to, _amount);    
+            } else {
+                throw;
+            }
+        } else {
+            throw;
+        }
+    }
+
+    function addGiver(uint _amount) internal {
+        _giver.push(msg.sender);
+        _values.push(_amount);
+    }
+}
+
+
+
+
+

Dapp Front end

+

and here is the front end:

+
<div>    
+    <div>Donation Contract</div>
+    <br/>
+    <input id='contractaddress' placeholder='contract address' />
+    <br/>
+    <div>
+        <br/>
+        <input id='fromGive' placeholder='from' /><input placeholder='amount' id='valueGive' /><button id="fallbackbtn" onclick="donate()">give</button>
+        <br/>
+        <br/>
+        <input id='fromMoveFund' placeholder='from' /><input id='moveFundTo' placeholder='move to' /><input id='amountToMove' placeholder='amount' /><button id="movefundbtn" onclick="movefund()">moveFund</button>
+        <br/>
+        <br/>
+        <div id='wait' ></div>
+    </div>
+    <br/>
+    <br/>
+    <div id='log'>
+    </div>
+</div>
+
+<script type="text/javascript">
+function donate () {
+    var donation = contractspec.at(document.getElementById('contractaddress').value)
+    donation.donate({
+        from: document.getElementById('fromGive').value,
+        value: document.getElementById('valueGive').value
+    }, function (error, txHash) {       
+        tryTillResponse(txHash, function (error, receipt) {
+            alert('done ' + txHash)
+        })
+    })
+}
+
+function movefund () {
+    var donation = contractspec.at(document.getElementById('contractaddress').value)
+    donation.moveFund(
+        document.getElementById('moveFundTo').value,
+        document.getElementById('amountToMove').value,
+        function (error, txHash) {
+            tryTillResponse(txHash, function (error, receipt) {
+                alert('done ' + txHash)
+            })
+        })
+}
+
+var contractspec = web3.eth.contract([{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"moveFund","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"donate","outputs":[],"payable":true,"type":"function"},{"inputs":[],"payable":false,"type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_to","type":"address"},{"indexed":false,"name":"_amount","type":"uint256"}],"name":"fundMoved","type":"event"}]);
+
+function tryTillResponse (txhash, done) {
+    document.getElementById('wait').innerHTML = 'waiting for the transaction to be mined ...'
+    web3.eth.getTransactionReceipt(txhash, function (err, result) {
+        if (!err && !result) {
+            // Try again with a bit of delay
+            setTimeout(function () { tryTillResponse(txhash, done) }, 500)
+        } else {
+            document.getElementById('wait').innerHTML = ''
+            var log = document.createElement("div")
+            log.innerHTML = JSON.stringify(result)
+            document.getElementById('log').appendChild(log)
+            done(err,result)
+        }
+    })
+}
+</script>
+
+
+

I would suggest serving this file using http-serve, but you can use +any web server you like.

+

Example: Dapp Front End https://github.com/ltfschoen/dapp_front_end

+
+
+

Important notice !

+

The variable contractspec contains the abi of the donation contract. +This means that if you change something in the contract interface +(function names, parameters, …) you need to copy the new abi from +remix to the front end.

+
+
+
+

Deploying

+

Right panel / Red button Create

+

_images/remix1.pngimage

+

This creates a new transaction that deploys the Donation contract +(Mist will ask for the usual passphrase check).

+

Wait for the transaction to be mined (don’t forget to activate mining +miner.start()). Once this is done, you can use it by executing the +moveFund and donate function. But this is not what we want to +achieve. We want to run and debug those functions from the front end.

+

Remix also display the address of the contract. Save it, we’ll need this +address later.

+

_images/remix2.pngimage

+
+
+

Debugging

+

From Mist, browse the above front end. In the first field, paste the +address of the newly created contract. Now, let’s call the first +function (label give).

+

You will need an account and a value.

+

The account could be any account that is declared in the Wallet section +of Mist. This is the sender of the transaction that we are going to +create. The value should be no more than the actual balance of the +account - the unit is in wei, so just put 100 (100 wei), that should +be fine.

+

Click on Give and wait for the transaction to be mined.

+

The HTML block with id log is filled by all the transactions created +from the front end. It was easier for the purpose of this tutorial to +just log transactions in a div but you can have your own logging +mechanism.

+

There is only one field that we need, this is the transactionHash.

+

Copy it and switch to Remix. On the right side, the fifth panel shows a +small “bug” icon, that is the debugger.

+

Paste the hash into the transaction field and click on the play +button.

+

_images/remix3.pngimage

+

You are now entering a debug session for the call to donate.

+

Debugging in Remix is easier than with common tools like gdb because you +can freely move in time. Use the slider to change the current step and +click on the panels below to expand them and explore the curret state, +local variables, etc. There are also breakpoints to move between +sections of the code quickly, but more on all that later.

+

At the time of this writing, there is an issue that could break the +contract creation. The a workaround for that at +https://github.com/ethereum/go-ethereum/issues/3653 . Please follow +the workaround or wait for this issue to be closed.

+

Also, although retrieving a contract’s storage when Remix is using the +JavaScript VM is working well, there is still work to be done when Remix +is using eth or geth as backend.

+
+
+ + +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/tutorial_import.html b/docs/_build/html/tutorial_import.html new file mode 100644 index 0000000000..0fa4e5fe88 --- /dev/null +++ b/docs/_build/html/tutorial_import.html @@ -0,0 +1,287 @@ + + + + + + + + + + + Importing Source Files in Solidity — Remix, Ethereum-IDE 1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

Importing Source Files in Solidity

+

This tutorial will show you how to import local and external files.

+

The compilation result will also contain contracts implemented in the +imported files.

+

For a detailed explanation of the import keyword see the +Solidity documentation

+
+

Importing a file from the browser’s local storage

+

Files in Remix can be imported just by specifying their path. Please use ./ for relative paths to increase portability. +_images/a-old-tuto_basicimport.png

+
+
+

Importing a file from your computer’s filesystem

+

This method uses remixd - the remix daemon. Please go to the remixd tutorial for instructions about how to bridge the divide between the browser and your computers filesystem.

+
+
+

Importing from GitHub

+

It is possible to import files directly from GitHub with URLs like +https://github.com/<owner>/<repo>/<path to the file>.

+

_images/a-old-tuto_importgit.png

+
+
+

Importing from Swarm

+

Files can be imported using all URLs supported by swarm. If you do not +have a swarm node, swarm-gateways.net will be used instead.

+

_images/a-old-tuto_importswarm.png

+
+
+ + +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/tutorial_mist.html b/docs/_build/html/tutorial_mist.html new file mode 100644 index 0000000000..e28ac483b1 --- /dev/null +++ b/docs/_build/html/tutorial_mist.html @@ -0,0 +1,541 @@ + + + + + + + + + + + Debugging a Dapp using Remix - Mist - Geth — Remix, Ethereum-IDE 1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

Debugging a Dapp using Remix - Mist - Geth

+

The ultimate goal of this tutorial is to debug transactions that have +been created by a dapp front end.

+

It is easy in Remix to debug a transaction created from its own GUI. +However, setting up an environment that allows you to debug transactions +created outside of Remix, require a bit more of complexity.

+

We will need four tools for that :

+
+
    +
  • Geth - this is the center piece and provides the blockchain +environment. We will basically run geth in a dev mode.

  • +
  • Mist - this is the Ethereum dapp browser. We will use it to browse +our front end.

  • +
  • Remix - this is the Ethereum IDE. We will use it to develop our +Solidity contract.

  • +
  • Any code editor you want - in order to write your front end :)

  • +
+
+
+

Install the environment

+
+

Install Mist

+

Mist is the Ethereum browser and the entry point of a Dapp.

+

Please download the latest +version (at least 0.8.9).

+

Basically we will always run our front end in Mist (note that it is also +possible to use Metamask).

+
+
+

Install Geth

+

Geth is the official +Ethereum client.

+
+
+
+

Running the environment

+
+

Run Geth

+

We will run a test node. This node will have a new empty state and will +not be synced to the main or ropsten network.

+
geth --ipcpath <test-chain-directory>/geth.ipc --datadir <test-chain-directory> --dev console
+
+
+

<test-chain-directory> is the folder where keys and chain data will be +stored.

+

--ipcpath defines the end point that other apps (like Mist) use to +talk to geth.

+

--datadir specifies the data directory.

+

--dev sets the node into private chain mode and adds some debugging +flags.

+

Then we need to create accounts and mine a bit to generate some Ether:

+
// from the geth console :
+personal.newAccount() // You can execute this command several time if you need more than one account.
+miner.start()  // generate some Ether.
+miner.stop() // stop mining after 30s-60s - we could also keep mining.
+
+
+

Next time we run Geth, we will only need to mine transactions (no need +to recreate account).

+
+
+

Run Mist

+

If we run Mist without any argument, its internal Geth node will run. As +we have our own we need to specify the ipc path of the node installed +above.

+
mist --rpc <test-chain-directory>/geth.ipc
+
+
+

(yes the option is –rpc)

+

Once Mist is started, verify that it is connected to the test node +(that’s very important!!).

+

On the bottom left, check that the network is Private-net and that the +block number is the same as reported by the test node we are currently +running. Run the following command in the Geth Console to check: +web3.eth.blockNumber.

+

_images/mist1.pngimage

+

Clicking on Wallet will allow you to send transactions and check account +balances (if you are currently mining you should see the balance +increasing).

+
+
+

Starting Remix

+

In Mist click on Develop / Open Remix IDE

+

Remix will open in a new window. If this is the first time it is run, +the Ballot contract will be loaded.

+

Now, we need to check if Remix is connected to Mist:

+

Right panel / third tab from the left, Injected Provider should be +checked.

+

_images/remix4.pngimage

+

Right panel / second tab from the left, Transaction Origin should +contain accounts we have previously created in Geth.

+

_images/remix5.pngimage

+
+
+
+

Developing contract / front end

+
+

Donation contract - Dapp Back end

+

Here is a sample solidity contract.

+

Copy and paste the following inside remix:

+
contract Donation {
+    address owner;
+    event fundMoved(address _to, uint _amount);
+    modifier onlyowner { if (msg.sender == owner) _; }
+    address[] _giver;
+    uint[] _values;
+
+    function Donation() {
+        owner = msg.sender;
+    }
+
+    function donate() payable {
+        addGiver(msg.value);
+    }
+
+    function moveFund(address _to, uint _amount) onlyowner {
+        uint balance = this.balance;
+        uint amount = _amount;
+        if (_amount <= this.balance) {
+            if (_to.send(this.balance)) {
+                fundMoved(_to, _amount);    
+            } else {
+                throw;
+            }
+        } else {
+            throw;
+        }
+    }
+
+    function addGiver(uint _amount) internal {
+        _giver.push(msg.sender);
+        _values.push(_amount);
+    }
+}
+
+
+
+
+

Dapp Front end

+

and here is the front end:

+
<div>    
+    <div>Donation Contract</div>
+    <br/>
+    <input id='contractaddress' placeholder='contract address'></intput>
+    <br/>
+    <div>
+        <br/>
+        <input id='fromGive' placeholder='from' ></intput><input placeholder='amount' id='valueGive'></intput><button id="fallbackbtn" onclick="donate()">give</button>
+        <br/>
+        <br/>
+        <input id='fromMoveFund' placeholder='from' ></intput><input id='moveFundTo' placeholder='move to' ></intput><input id='amountToMove' placeholder='amount' ></intput><button id="movefundbtn" onclick="movefund()">moveFund</button>
+        <br/>
+        <br/>
+        <div id='wait' ></div>
+    </div>
+    <br/>
+    <br/>
+    <div id='log'>
+    </div>
+</div>
+
+<script type="text/javascript">
+function donate () {
+    var donation = contractspec.at(document.getElementById('contractaddress').value)
+    donation.donate({
+        from: document.getElementById('fromGive').value,
+        value: document.getElementById('valueGive').value
+    }, function (error, txHash) {       
+        tryTillResponse(txHash, function (error, receipt) {
+            alert('done ' + txHash)
+        })
+    })
+}
+
+function movefund () {
+    var donation = contractspec.at(document.getElementById('contractaddress').value)
+    donation.moveFund(
+        document.getElementById('moveFundTo').value,
+        document.getElementById('amountToMove').value,
+        function (error, txHash) {
+            tryTillResponse(txHash, function (error, receipt) {
+                alert('done ' + txHash)
+            })
+        })
+}
+
+var contractspec = web3.eth.contract([{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"moveFund","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"donate","outputs":[],"payable":true,"type":"function"},{"inputs":[],"payable":false,"type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_to","type":"address"},{"indexed":false,"name":"_amount","type":"uint256"}],"name":"fundMoved","type":"event"}]);
+
+function tryTillResponse (txhash, done) {
+    document.getElementById('wait').innerHTML = 'waiting for the transaction to be mined ...'
+    web3.eth.getTransactionReceipt(txhash, function (err, result) {
+        if (!err && !result) {
+            // Try again with a bit of delay
+            setTimeout(function () { tryTillResponse(txhash, done) }, 500)
+        } else {
+            document.getElementById('wait').innerHTML = ''
+            var log = document.createElement("div")
+            log.innerHTML = JSON.stringify(result)
+            document.getElementById('log').appendChild(log)
+            done(err,result)
+        }
+    })
+}
+</script>
+
+
+

I would suggest serving this file using http-serve, but you can use +any web server you like.

+

Example: Dapp Front End https://github.com/ltfschoen/dapp_front_end

+
+
+

Important notice !

+

The variable contractspec contains the abi of the donation contract. +This means that if you change something in the contract interface +(function names, parameters, …) you need to copy the new abi from +remix to the front end.

+
+
+
+

Deploying

+

Right panel / Red button Create

+

_images/remix1.pngimage

+

This creates a new transaction that deploys the Donation contract +(Mist will ask for the usual passphrase check).

+

Wait for the transaction to be mined (don’t forget to activate mining +miner.start()). Once this is done, you can use it by executing the +moveFund and donate function. But this is not what we want to +achieve. We want to run and debug those functions from the front end.

+

Remix also display the address of the contract. Save it, we’ll need this +address later.

+

_images/remix2.pngimage

+
+
+

Debugging

+

From Mist, browse the above front end. In the first field, paste the +address of the newly created contract. Now, let’s call the first +function (label give).

+

You will need an account and a value.

+

The account could be any account that is declared in the Wallet section +of Mist. This is the sender of the transaction that we are going to +create. The value should be no more than the actual balance of the +account - the unit is in wei, so just put 100 (100 wei), that should +be fine.

+

Click on Give and wait for the transaction to be mined.

+

The HTML block with id log is filled by all the transactions created +from the front end. It was easier for the purpose of this tutorial to +just log transactions in a div but you can have your own logging +mechanism.

+

There is only one field that we need, this is the transactionHash.

+

Copy it and switch to Remix. On the right side, the fifth panel shows a +small “bug” icon, that is the debugger.

+

Paste the hash into the transaction field and click on the play +button.

+

_images/remix3.pngimage

+

You are now entering a debug session for the call to donate.

+

Debugging in Remix is easier than with common tools like gdb because you +can freely move in time. Use the slider to change the current step and +click on the panels below to expand them and explore the curret state, +local variables, etc. There are also breakpoints to move between +sections of the code quickly, but more on all that later.

+

At the time of this writing, there is an issue that could break the +contract creation. The a workaround for that at +https://github.com/ethereum/go-ethereum/issues/3653 . Please follow +the workaround or wait for this issue to be closed.

+

Also, although retrieving a contract’s storage when Remix is using the +JavaScript VM is working well, there is still work to be done when Remix +is using eth or geth as backend.

+
+
+ + +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/tutorial_remixd_filesystem.html b/docs/_build/html/tutorial_remixd_filesystem.html new file mode 100644 index 0000000000..17e5755b1a --- /dev/null +++ b/docs/_build/html/tutorial_remixd_filesystem.html @@ -0,0 +1,283 @@ + + + + + + + + + + + Access your local filesystem by using remixd — Remix, Ethereum-IDE 1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

Access your local filesystem by using remixd

+

remixd is an npm module. Its purpose is to give the remix web +application access to a folder from your local computer.

+

The code of remixd can be checked out +here .

+

remixd can be globally installed using the following command: +npm install -g remixd.

+

Then remixd -s <absolute-path-to-the-shared-folder> --remix-ide <your-remix-ide-URL-instance> will start remixd +and share the given folder.

+

For example, to sync your local folder to the official Remix IDE, +remixd -s <absolute-path-to-the-shared-folder> --remix-ide https://remix.ethereum.org

+

The folder is shared using a websocket connection between Remix IDE +and remixd.

+

Be sure the user executing remixd has read/write permission on the +folder.

+

There is an option to run remixd in read-only mode, use --read-only flag.

+

Warning!

+

remixd provides full read and write access to the given folder for any application that can access the TCP port 65520 on your local host.

+

From Remix IDE, you will need to activate the connection.

+

Click on the localhost connection icon:

+

_images/remixd_noconnection.pngimage

+

A modal dialog will ask confirmation

+

_images/remixd_alert.pngimage

+

Accepting this dialog will start a session. Once the connection is made, +the status will update and the connection icon should shows up in green.

+

Hovering the icon will give more connection status information.

+

At this point if the connection is successful, the shared folder will be +available in the file explorer.

+

_images/remixd_connectionok.pngimage

+
+ + +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/udapp.html b/docs/_build/html/udapp.html new file mode 100644 index 0000000000..c9979c50e1 --- /dev/null +++ b/docs/_build/html/udapp.html @@ -0,0 +1,285 @@ + + + + + + + + + + + Run & Deploy (part 2) — Remix, Ethereum-IDE 1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

Run & Deploy (part 2)

+
+

Deployed contracts

+

This section in the Run tab contains a list of deployed contracts to interact with through autogenerated UI of the deployed contract (also called udapp).

+

The deployed contract appears but is in its collapsed form.

+

_images/a-debug2-udapp1a.png

+

Click the sideways caret to open it up.

+

_images/a-debug3-udapp2.png

+

You will see the functions in the contract. The functions buttons can have different color buttons.

+
    +
  • Functions that are constant or pure functions in Solidity have a blue buttons. Clicking one of this type does not create a new transaction. So clicking will not cause state changes - it will only return a value stored in the contract - so it won’t cost you anything in gas fees.

  • +
  • Functions that changes the state of the contract are orange, clicking this type of function will cost gas and they do change the state of the contract and so they do create a new transaction. +But this transaction does not accept Ether.

  • +
  • Functions that have red buttons are payable functions in Solidity. Clicking one of these will create a new transaction and this transaction can accept a value. The value is put in in the Value field which is under the Gas Limit field.

  • +
+

_images/a-jvm-calling-instance.png

+

For more information see more about Solidity +modifier +.

+

If a function requires input parameters, well, you have to put them in.

+
+
+

Inputting parameters

+

_images/a-udapp-inputs.png

+

The input box tells you what type each parameter needs to be.

+

Numbers and addresses do not need to be wrapped in double quotes. Strings need to be wrapped.

+

When using the input box for parameters in its “up” display, the parameters need to be separated by a comma. In the example above the “delegate” function has 3 parameters.

+

Clicking the ‘down’ caret brings you to the Multi-param Manager - where you can input the parameters one at a time.

+

_images/a-udapp-multi-param-man.png

+

In the Multi-param Manager, strings do not need to be wrapped.

+

Clicking the clipboard icon will encode the inputs and will copy them. Only a valid set of inputs can be encoded.

+

So if you made a mistake and put a uint8 where an address should have been, clicking the clipboard here will give you an error.

+
+
+ + +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/unittesting.html b/docs/_build/html/unittesting.html new file mode 100644 index 0000000000..542c86bc6d --- /dev/null +++ b/docs/_build/html/unittesting.html @@ -0,0 +1,279 @@ + + + + + + + + + + + Unit Testing — Remix, Ethereum-IDE 1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

Unit Testing

+

Click the “double check” icon to get to the unit testing plugin. If you don’t see this icon, go to the plugin manager and load up the unit testing plugin.

+

_images/a-unit-testing1.png

+
+

Generate test File

+

This create a new solidity file in the current folder suffixed with _test. +This file contains the minimun you need for running unit testing.

+
+
+

Run Tests

+

This execute tests. The execution is run in a separate environment and the result is displayed below.

+

| Available functions | Supported types |

+

| ————- | ————- |

+

| Assert.ok() | bool |

+

| Assert.equal() | uint, int, bool, address, bytes32, string |

+

| Assert.notEqual() | uint, int, bool, address, bytes32, string |

+

| Assert.greaterThan() | uint, int |

+

| Assert.lesserThan() | uint, int |

+

see https://github.com/ethereum/remix/blob/master/remix-tests/tests/examples_4/SafeMath_test.sol for some code sample

+
+
+

Continuous integration

+

remix-tests is also a CLI, it can be used in a continuous integration environement which support node.js. +Please find more information in the remix-test repository

+

See also: example Su Squares contract and Travis build that uses remix-tests for continuous integration testing.

+
+
+ + +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/unittesting_tab.html b/docs/_build/html/unittesting_tab.html new file mode 100644 index 0000000000..f5c0bae09e --- /dev/null +++ b/docs/_build/html/unittesting_tab.html @@ -0,0 +1,283 @@ + + + + + + + + + + + Unit Testing — Remix, Ethereum-IDE 1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

Unit Testing

+

Click the “double check” icon to get to the unit testing plugin. If you don’t see this icon, go to the plugin manager and load up the unit testing plugin.

+

_images/a-unit-testing1.png

+
+

Generate test File

+

This create a new solidity file in the current folder suffixed with _test. +This file contains the minimun you need for running unit testing.

+
+
+

Run Tests

+

This execute tests. The execution is run in a separate environment and the result is displayed below.

+

| Available functions | Supported types |

+

| ————- | ————- |

+

| Assert.ok() | bool |

+

| Assert.equal() | uint, int, bool, address, bytes32, string |

+

| Assert.notEqual() | uint, int, bool, address, bytes32, string |

+

| Assert.greaterThan() | uint, int |

+

| Assert.lesserThan() | uint, int |

+

see https://github.com/ethereum/remix/blob/master/remix-tests/tests/examples_4/SafeMath_test.sol for some code sample

+
+
+

Continuous integration

+

remix-tests is also a CLI, it can be used in a continuous integration environement which support node.js. +Please find more information in the remix-test repository

+

See also: example Su Squares contract and Travis build that uses remix-tests for continuous integration testing.

+
+
+ + +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/workshop_Building_smart_contracts_with_Remix.html b/docs/_build/html/workshop_Building_smart_contracts_with_Remix.html new file mode 100644 index 0000000000..31655a4920 --- /dev/null +++ b/docs/_build/html/workshop_Building_smart_contracts_with_Remix.html @@ -0,0 +1,255 @@ + + + + + + + + + + + Building Smart Contracts with Remix — Remix, Ethereum-IDE 1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

Building Smart Contracts with Remix

+

We prepared a tutorial that will help you build DApps with Remix. In this tutorial, you learn how to build smart contracts, how to deploy them and how to interact with them. Then we show you how to connect your frontend with the blockchain by using web3.js.

+
+

Let’s get started

+

These tutorials were used in workshops at ethCC, Edcon, and DappCon. They are using the old interface. We will be updating these slides in the near future.

+

You can watch the Edcon presentation talk and here are the workshop slides. +(May 3, 2018)

+

Here are the latest slides (hosted on swarm) and here are the latest slides (not on swarm). +(Oct 16, 2018)

+
+
+ + +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/code_contribution_guide.md b/docs/code_contribution_guide.md new file mode 100644 index 0000000000..3ff6334308 --- /dev/null +++ b/docs/code_contribution_guide.md @@ -0,0 +1,11 @@ +Code contribution guide +======================= + +Remix is an open source tool and we encourage anyone to help us improve our tool. +You can do that by opening issues, giving feedback or by contributing a pull request +to our codebase. + +The Remix application is built with JavaScript and it doesn't use any framework. We only +rely on selected set of npm modules, like `yo-yo`, `csjs-inject` and others. Check out the `package.json` files in the Remix submodules to learn more about the stack. + +To learn more, please visit our [GitHub page](https://github.com/ethereum/remix-ide). diff --git a/docs/community.md b/docs/community.md new file mode 100644 index 0000000000..a76c8fd09d --- /dev/null +++ b/docs/community.md @@ -0,0 +1,14 @@ +Community +======================= + +We know that blockchain ecosystem is very new and that lots of information is scattered around the web. +That is why we created a community support channel where we and other users try to answer your questions if +you get stuck using Remix. Please, join [the community](https://gitter.im/ethereum/remix) and ask for help. + +For anyone who is interested in developing a custom plugin for Remix or who wants to contribute to the codebase, +we opened a [contributors' channel](https://gitter.im/ethereum/remix-dev) especially for developers working on Remix tools. + +We would kindly ask you to respect the space and to use it for +getting help with your work and the developers' channel for discussions related to working on Remix codebase. If you have +ideas for collaborations or you want to promote your project, try to find some more appropriate channels to do so. Or you can contact +the main contributors directly on Gitter or Twitter. diff --git a/docs/compile.md b/docs/compile.md new file mode 100644 index 0000000000..8123ade117 --- /dev/null +++ b/docs/compile.md @@ -0,0 +1,28 @@ +Compiler (Solidity) +=================== + +Clicking the Solidity icon in the icon panel brings you to the Solidty Compiler. + +Compiling is triggered when you click the compile button ( **A. in image below**). If you want the file to be compiled each time the file is saved or when another file is selected - check the auto compile checkbox ( **B. in image below**). + +If the contract has a lot of dependencies it can take a while to compile - so you use autocompilation at your discretion. + +![](images/a-sol-compiler.png) + +After each compilation, a list is updated with all the newly compiled +contracts. The contract compiled can be selected with the Contract pulldown menu ( **C. in image below**). Multiple contracts are compiled when one contract imports other contracts. Selecting a contract will show information about that one. + +When the "Compilation Details" button is clicked ( **D. in image below**), a modal opens displaying detailed information about the current selected contract. + +From this tab, you can also publish your contract to Swarm (only non +abstract contracts can be published). + +Published data notably contains the `abi` and solidity source code. + +After a contract is published, you can find its metadata information +using the bzz URL located in the details modal dialog `SWARM LOCATION`. + +Compilation Errors and Warning are displayed below the contract section. +At each compilation, the static analysis tab builds a report. It is very +valuable when addressing reported issues even if the compiler doesn't +complain. ([see more](static_analysis.html)) diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 0000000000..4e5b322071 --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,305 @@ +# -*- coding: utf-8 -*- +# +# Remix documentation build configuration file, created by +# sphinx-quickstart on Mon Feb 20 12:16:16 2017. +# +# This file is execfile()d with the current directory set to its +# containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +import sys +import os + + + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# sys.path.insert(0, os.path.abspath('.')) + +# -- General configuration ------------------------------------------------ + +# If your documentation needs a minimal Sphinx version, state it here. +#needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# source_suffix = ['.rst', '.md'] + + +# The encoding of source files. +#source_encoding = 'utf-8-sig' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = u'Remix, Ethereum-IDE' +copyright = u'2018, Remix' +author = u'Remix team' + +github_doc_root = 'https://github.com/ethereum/remix/tree/master/docs/' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = u'1' +# The full version, including alpha/beta/rc tags. +release = u'1' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# +# This is also used if you do content translation via gettext catalogs. +# Usually you set "language" from the command line for these cases. +language = None + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +#today = '' +# Else, today_fmt is used as the format for a strftime call. +#today_fmt = '%B %d, %Y' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +exclude_patterns = ['_build'] + +# The reST default role (used for this markup: `text`) to use for all +# documents. +#default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +#add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +#add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +#show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +highlight_language = 'JavaScript' + +# A list of ignored prefixes for module index sorting. +#modindex_common_prefix = [] + +# If true, keep warnings as "system message" paragraphs in the built documents. +#keep_warnings = False + +# If true, `todo` and `todoList` produce output, else they produce nothing. +todo_include_todos = False + + +# -- Options for HTML output ---------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +html_theme = 'sphinx_rtd_theme' + + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +#html_theme_options = {} + +# Add any paths that contain custom themes here, relative to this directory. +#html_theme_path = [] + +# The name for this set of Sphinx documents. If None, it defaults to +# " v documentation". +#html_title = None + +# A shorter title for the navigation bar. Default is the same as html_title. +#html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +#html_logo = None + +# The name of an image file (relative to this directory) to use as a favicon of +# the docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +#html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# Add any extra paths that contain custom files (such as robots.txt or +# .htaccess) here, relative to this directory. These files are copied +# directly to the root of the documentation. +#html_extra_path = [] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +#html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +#html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +#html_additional_pages = {} + +# If false, no module index is generated. +#html_domain_indices = True + +# If false, no index is generated. +#html_use_index = True + +# If true, the index is split into individual pages for each letter. +#html_split_index = False + +# If true, links to the reST sources are added to the pages. +#html_show_sourcelink = True + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +#html_show_sphinx = True + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +#html_show_copyright = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +#html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +#html_file_suffix = None + +# Language to be used for generating the HTML full-text search index. +# Sphinx supports the following languages: +# 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja' +# 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr' +#html_search_language = 'en' + +# A dictionary with options for the search language support, empty by default. +# Now only 'ja' uses this config value +#html_search_options = {'type': 'default'} + +# The name of a javascript file (relative to the configuration directory) that +# implements a search results scorer. If empty, the default will be used. +#html_search_scorer = 'scorer.js' + +# Output file base name for HTML help builder. +htmlhelp_basename = 'Remixdoc' + +# -- Options for LaTeX output --------------------------------------------- + +latex_elements = { +# The paper size ('letterpaper' or 'a4paper'). +#'papersize': 'letterpaper', + +# The font size ('10pt', '11pt' or '12pt'). +#'pointsize': '10pt', + +# Additional stuff for the LaTeX preamble. +#'preamble': '', + +# Latex figure (float) alignment +#'figure_align': 'htbp', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + (master_doc, 'Remix.tex', u'Remix Documentation', + u'yann300', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +#latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +#latex_use_parts = False + +# If true, show page references after internal links. +#latex_show_pagerefs = False + +# If true, show URL addresses after external links. +#latex_show_urls = False + +# Documents to append as an appendix to all manuals. +#latex_appendices = [] + +# If false, no module index is generated. +#latex_domain_indices = True + + +# -- Options for manual page output --------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + (master_doc, 'remix', u'Remix Documentation', + [author], 1) +] + +# If true, show URL addresses after external links. +#man_show_urls = False + + +# -- Options for Texinfo output ------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + (master_doc, 'Remix', u'Remix Documentation', + author, 'Remix', 'One line description of project.', + 'Miscellaneous'), +] + +# Documents to append as an appendix to all manuals. +#texinfo_appendices = [] + +# If false, no module index is generated. +#texinfo_domain_indices = True + +# How to display URL addresses: 'footnote', 'no', or 'inline'. +#texinfo_show_urls = 'footnote' + +# If true, do not generate a @detailmenu in the "Top" node's menu. +#texinfo_no_detailmenu = False + +from recommonmark.parser import CommonMarkParser +source_suffix = ['.rst', '.md'] +source_parsers = {'.md': CommonMarkParser} + + +# app setup hook +# def setup(app): +# app.add_config_value('recommonmark_config', { +# 'url_resolver': lambda url: github_doc_root + url, +# 'enable_auto_toc_tree': True, +# 'enable_eval_rst': True, +# 'enable_auto_doc_ref': True, +# }, True) +# app.add_transform(AutoStructify) diff --git a/docs/contract_metadata.md b/docs/contract_metadata.md new file mode 100644 index 0000000000..4806e30cd3 --- /dev/null +++ b/docs/contract_metadata.md @@ -0,0 +1,69 @@ +Build Artifact +============== + +As compilation succeed Remix create a JSON file for each compiled contract. +These JSON files contains several metadata + +Library Deployment +------------------ + +By default Remix automatically deploy needed libraries. + +`linkReferences` contains a map representing libraries which depend on the current contract. +Values are addresses of libraries used for linking the contract. + +`autoDeployLib` defines if the libraries should be auto deployed by Remix or if the contract should be linked with libraries described in `linkReferences` + +Note that Remix will resolve addresses corresponding to the current network. +By default, a configuration key follow the form: `:`, but it is also possible +to define `` or `` as keys. + +``` +{ + "VM:-": { + "linkReferences": { + "browser/Untitled.sol": { + "lib": "
", + "lib2": "
" + } + }, + "autoDeployLib": true + }, + "main:1": { + "linkReferences": { + "browser/Untitled.sol": { + "lib": "
", + "lib2": "
" + } + }, + "autoDeployLib": true + }, + "ropsten:3": { + "linkReferences": { + "browser/Untitled.sol": { + "lib": "
", + "lib2": "
" + } + }, + "autoDeployLib": true + }, + "rinkeby:4": { + "linkReferences": { + "browser/Untitled.sol": { + "lib": "
", + "lib2": "
" + } + }, + "autoDeployLib": true + }, + "kovan:42": { + "linkReferences": { + "browser/Untitled.sol": { + "lib": "
", + "lib2": "
" + } + }, + "autoDeployLib": true + } +} +``` diff --git a/docs/create_deploy.md b/docs/create_deploy.md new file mode 100644 index 0000000000..77279ca5cf --- /dev/null +++ b/docs/create_deploy.md @@ -0,0 +1,108 @@ +Creating and Deploying a Contract +================================ + +There are 3 type of environments Remix can be plugged to: +`Javascript VM`, `Injected provider`, or `Web3 provider`. (for details see [Running transactions](http://remix.readthedocs.io/en/latest/run_tab.html)) + +Both `Web3 provider` and `Injected provider` require the use of an +external tool. + +The external tool for `Web3 provider` is an Ethereum node and for +`Injected provider` Metamask. + +The `JavaScript VM` mode is convenient because each execution runs in +your browser and you don't need any other software or Ethereum node to run it. + +So, it is the easiest test environment - **no setup required!** + +But keep in mind that reloading the browser when you are in the Javascript VM will restart Remix in an empty state. + +For performance purposes ( which is to say - for testing in an environment that is closest to the mainnet), it might also be better to use an external node. + +Selecting the VM mode +--------------------- + +Make sure the VM mode is selected. All accounts displayed in `Accounts` +should have 100 ether. + +Sample contract +--------------- + +``` +{.sourceCode .none} +pragma solidity ^0.5.1; + +contract testContract { + + uint value; + + constructor (uint _p) public { + value = _p; + } + + function setP(uint _n) payable public { + value = _n; + } + + function setNP(uint _n) public { + value = _n; + } + + function get () view public returns (uint) { + return value; + } +} + +``` + +This contract is very basic. The goal is to quickly start to create and +to interact with a sample contract. + +Deploying an instance +--------------------- + +The `Compile tab` displays information related to the current contract +(note that there can be more than one) (see ../compile\_tab). + +Moving on, in the `Run tab` select, `JavaScript VM` to specify that you +are going to deploy an instance of the contract in the `JavaScript VM` +state. + +![](images/a-jvm.png) + +The constructor of `Ballot.sol` needs a parameter (of type `uint8`). +Give any value and click on `Deploy`. + +The transaction which deploys the instance of `Ballot` is created. + +In a "normal" blockchain, it can take several seconds to execute. This +is the time for the transaction to be mined. However, because we are +using the `JavaScript VM`, our execution is immediate. + +The terminal will inform you about the transaction. You can see details +there and start debugging. + +The newly created instance is displayed in the `run tab`. + +![](images/a-jvm-instance.png) + +Interacting with an instance +---------------------------- + +This new instance contains 3 actions which corresponds to the 3 +functions (`setP`, `setPN`, `get`). Clicking on `SetP` or `SetPN` will +create a new transaction. + +Note that `SetP` is `payable` (red button) : it is possible to send +value (Ether) to the contract. + +`SetPN` is not payable (orange button - depending on the theme) : it is not possible to send +value (Ether) to the contract. + +Clicking on `get` will not execute a transaction (usually its a blue button - depending on the theme). It doesn't execute a transaction because a `get` does not modify the state (variable +`value`) of this instance. + +As `get` is `view` you can see the return value just below the +action. + +![](images/a-jvm-calling-instance.png) diff --git a/docs/debugger.md b/docs/debugger.md new file mode 100644 index 0000000000..8a5c0959ff --- /dev/null +++ b/docs/debugger.md @@ -0,0 +1,12 @@ +Debugger +======== + +This module allows you to debug the transaction. It can be used to +deploy transactions created from Remix and already mined transactions. +(debugging works only if the current environment provides the necessary +features). + +To get to the debugger - you can click the debug button in the terminal when a successful or failed transaction appears there. You can also load the module from the plugin manager and then click the bug in the icon panel. Or you can get to the debugger by running the debug command in the console. + + +![](images/a-debugger.png) diff --git a/docs/file_explorer.md b/docs/file_explorer.md new file mode 100644 index 0000000000..8f09b973ea --- /dev/null +++ b/docs/file_explorer.md @@ -0,0 +1,54 @@ +File Explorer +============= + +To get to the file explorers - click the file explorers icon. + +![](images/a-file-explorer1.png) + +The file explorer lists by default all the files stored in your browser. +You can see them in the browser folder. You can always rename, remove or +add new files to the file explorer. + +Note that clearing the browser storage will permanently delete all the +solidity files you wrote. To avoid this, you can use Remixd, which +enables you to store and sync files in the browser with your local +computer ( for more information see [remixd](remixd.html) ). + +![](images/a-file-explorer-buttons.png) + +We will start by reviewing at the icons at the top left - from left to +the right: + +Create new File +--------------- + +Creates a new `untitled.sol` file in Remix. + +Add Local File +-------------- + +Allows you to select files from the local file system and import them to +the Remix browser storage. + +Publish to Gist +--------------- + +Publishes all files from the browser folder to a gist. +Gist API has changed in 2018 and it unfortunately requires users to be authenticated to be able to publish a gist. + +Click [this link](https://github.com/settings/tokens) to Github tokens setup and select Generate new token. +Then check only Create gists checkbox and generate a new token. + +Then paste it in Remix (right panel/Settings tab) and click Save. Now you should be able to use the feature. + +Copy to another Remix instance +------------------------ + +Enables you to copy files from the browser storage to another instance +(URL) of Remix. + +Connect your filesystem to Remix +-------------------- + +Allows to sync between Remix and your local file system (see +[more about RemixD](remixd.html)). diff --git a/docs/images/a-Runtab-deploy-atAddress.png b/docs/images/a-Runtab-deploy-atAddress.png new file mode 100644 index 0000000000..89d3e77ef6 Binary files /dev/null and b/docs/images/a-Runtab-deploy-atAddress.png differ diff --git a/docs/images/a-contract-inputs.png b/docs/images/a-contract-inputs.png new file mode 100644 index 0000000000..abf2a1aeae Binary files /dev/null and b/docs/images/a-contract-inputs.png differ diff --git a/docs/images/a-debug1-deploy.png b/docs/images/a-debug1-deploy.png new file mode 100644 index 0000000000..f2dedaf456 Binary files /dev/null and b/docs/images/a-debug1-deploy.png differ diff --git a/docs/images/a-debug2-udapp1.png b/docs/images/a-debug2-udapp1.png new file mode 100644 index 0000000000..e2f35b3b56 Binary files /dev/null and b/docs/images/a-debug2-udapp1.png differ diff --git a/docs/images/a-debug2-udapp1a.png b/docs/images/a-debug2-udapp1a.png new file mode 100644 index 0000000000..0b57f61709 Binary files /dev/null and b/docs/images/a-debug2-udapp1a.png differ diff --git a/docs/images/a-debug3-udapp2.png b/docs/images/a-debug3-udapp2.png new file mode 100644 index 0000000000..56ae6a0dc7 Binary files /dev/null and b/docs/images/a-debug3-udapp2.png differ diff --git a/docs/images/a-debug4-value-loc.png b/docs/images/a-debug4-value-loc.png new file mode 100644 index 0000000000..61cdcab9ac Binary files /dev/null and b/docs/images/a-debug4-value-loc.png differ diff --git a/docs/images/a-debug5-term-debug-but.png b/docs/images/a-debug5-term-debug-but.png new file mode 100644 index 0000000000..96bf3ca56e Binary files /dev/null and b/docs/images/a-debug5-term-debug-but.png differ diff --git a/docs/images/a-debugger.png b/docs/images/a-debugger.png new file mode 100644 index 0000000000..2756ab6c47 Binary files /dev/null and b/docs/images/a-debugger.png differ diff --git a/docs/images/a-file-explorer-buttons-big.png b/docs/images/a-file-explorer-buttons-big.png new file mode 100644 index 0000000000..5f16de4d01 Binary files /dev/null and b/docs/images/a-file-explorer-buttons-big.png differ diff --git a/docs/images/a-file-explorer-buttons.png b/docs/images/a-file-explorer-buttons.png new file mode 100644 index 0000000000..9c6ee3f795 Binary files /dev/null and b/docs/images/a-file-explorer-buttons.png differ diff --git a/docs/images/a-file-explorer1.png b/docs/images/a-file-explorer1.png new file mode 100644 index 0000000000..fbc53896fc Binary files /dev/null and b/docs/images/a-file-explorer1.png differ diff --git a/docs/images/a-home-page.png b/docs/images/a-home-page.png new file mode 100644 index 0000000000..f4ca8b0537 Binary files /dev/null and b/docs/images/a-home-page.png differ diff --git a/docs/images/a-hometab.png b/docs/images/a-hometab.png new file mode 100644 index 0000000000..a48d9f61c0 Binary files /dev/null and b/docs/images/a-hometab.png differ diff --git a/docs/images/a-icon-swap.png b/docs/images/a-icon-swap.png new file mode 100644 index 0000000000..53cf741bd1 Binary files /dev/null and b/docs/images/a-icon-swap.png differ diff --git a/docs/images/a-icons-at-load.png b/docs/images/a-icons-at-load.png new file mode 100644 index 0000000000..ce859729ed Binary files /dev/null and b/docs/images/a-icons-at-load.png differ diff --git a/docs/images/a-jvm-calling-instance.png b/docs/images/a-jvm-calling-instance.png new file mode 100644 index 0000000000..7dc9a7adf1 Binary files /dev/null and b/docs/images/a-jvm-calling-instance.png differ diff --git a/docs/images/a-jvm-instance.png b/docs/images/a-jvm-instance.png new file mode 100644 index 0000000000..5ed6615c9d Binary files /dev/null and b/docs/images/a-jvm-instance.png differ diff --git a/docs/images/a-jvm.png b/docs/images/a-jvm.png new file mode 100644 index 0000000000..851236b457 Binary files /dev/null and b/docs/images/a-jvm.png differ diff --git a/docs/images/a-layout1.png b/docs/images/a-layout1.png new file mode 100644 index 0000000000..bb8ebbeda0 Binary files /dev/null and b/docs/images/a-layout1.png differ diff --git a/docs/images/a-layout1a.png b/docs/images/a-layout1a.png new file mode 100644 index 0000000000..cee0ffe747 Binary files /dev/null and b/docs/images/a-layout1a.png differ diff --git a/docs/images/a-layout1b.png b/docs/images/a-layout1b.png new file mode 100644 index 0000000000..18e9aabc7c Binary files /dev/null and b/docs/images/a-layout1b.png differ diff --git a/docs/images/a-old-tuto_basicimport.png b/docs/images/a-old-tuto_basicimport.png new file mode 100644 index 0000000000..81a8009336 Binary files /dev/null and b/docs/images/a-old-tuto_basicimport.png differ diff --git a/docs/images/a-old-tuto_importgit.png b/docs/images/a-old-tuto_importgit.png new file mode 100644 index 0000000000..022eb4b011 Binary files /dev/null and b/docs/images/a-old-tuto_importgit.png differ diff --git a/docs/images/a-old-tuto_importswarm.png b/docs/images/a-old-tuto_importswarm.png new file mode 100644 index 0000000000..01fba3e646 Binary files /dev/null and b/docs/images/a-old-tuto_importswarm.png differ diff --git a/docs/images/a-plug.png b/docs/images/a-plug.png new file mode 100644 index 0000000000..3161fe3a78 Binary files /dev/null and b/docs/images/a-plug.png differ diff --git a/docs/images/a-plugin-man-local.png b/docs/images/a-plugin-man-local.png new file mode 100644 index 0000000000..b760bab001 Binary files /dev/null and b/docs/images/a-plugin-man-local.png differ diff --git a/docs/images/a-remixd-success.png b/docs/images/a-remixd-success.png new file mode 100644 index 0000000000..bef13de555 Binary files /dev/null and b/docs/images/a-remixd-success.png differ diff --git a/docs/images/a-runtab-recorder.png b/docs/images/a-runtab-recorder.png new file mode 100644 index 0000000000..36d6b0528b Binary files /dev/null and b/docs/images/a-runtab-recorder.png differ diff --git a/docs/images/a-runtab1.png b/docs/images/a-runtab1.png new file mode 100644 index 0000000000..138a93305f Binary files /dev/null and b/docs/images/a-runtab1.png differ diff --git a/docs/images/a-sol-compiler.png b/docs/images/a-sol-compiler.png new file mode 100644 index 0000000000..87f90586e0 Binary files /dev/null and b/docs/images/a-sol-compiler.png differ diff --git a/docs/images/a-sol-editor.png b/docs/images/a-sol-editor.png new file mode 100644 index 0000000000..b6c0cd5c58 Binary files /dev/null and b/docs/images/a-sol-editor.png differ diff --git a/docs/images/a-static-analysis.png b/docs/images/a-static-analysis.png new file mode 100644 index 0000000000..e3d2cfe46e Binary files /dev/null and b/docs/images/a-static-analysis.png differ diff --git a/docs/images/a-terminal-and-more.png b/docs/images/a-terminal-and-more.png new file mode 100644 index 0000000000..45d41644ca Binary files /dev/null and b/docs/images/a-terminal-and-more.png differ diff --git a/docs/images/a-themes.png b/docs/images/a-themes.png new file mode 100644 index 0000000000..bc48776de1 Binary files /dev/null and b/docs/images/a-themes.png differ diff --git a/docs/images/a-udapp-inputs.png b/docs/images/a-udapp-inputs.png new file mode 100644 index 0000000000..ec68350135 Binary files /dev/null and b/docs/images/a-udapp-inputs.png differ diff --git a/docs/images/a-udapp-multi-param-man.png b/docs/images/a-udapp-multi-param-man.png new file mode 100644 index 0000000000..afb7e4f3a8 Binary files /dev/null and b/docs/images/a-udapp-multi-param-man.png differ diff --git a/docs/images/a-unit-testing1.png b/docs/images/a-unit-testing1.png new file mode 100644 index 0000000000..5e1b167584 Binary files /dev/null and b/docs/images/a-unit-testing1.png differ diff --git a/docs/images/file-explorer-buttons.png b/docs/images/file-explorer-buttons.png new file mode 100644 index 0000000000..9c6ee3f795 Binary files /dev/null and b/docs/images/file-explorer-buttons.png differ diff --git a/docs/images/layout1b.png b/docs/images/layout1b.png new file mode 100644 index 0000000000..18e9aabc7c Binary files /dev/null and b/docs/images/layout1b.png differ diff --git a/docs/images/remix_analysistab.png b/docs/images/remix_analysistab.png new file mode 100755 index 0000000000..e43143962c Binary files /dev/null and b/docs/images/remix_analysistab.png differ diff --git a/docs/images/remix_compiletab.png b/docs/images/remix_compiletab.png new file mode 100755 index 0000000000..cd51b11574 Binary files /dev/null and b/docs/images/remix_compiletab.png differ diff --git a/docs/images/remix_debuggertab.png b/docs/images/remix_debuggertab.png new file mode 100755 index 0000000000..104d9744b2 Binary files /dev/null and b/docs/images/remix_debuggertab.png differ diff --git a/docs/images/remix_editor.png b/docs/images/remix_editor.png new file mode 100755 index 0000000000..9260f05fe4 Binary files /dev/null and b/docs/images/remix_editor.png differ diff --git a/docs/images/remix_file_explorer_browser.png b/docs/images/remix_file_explorer_browser.png new file mode 100755 index 0000000000..3f09c0c752 Binary files /dev/null and b/docs/images/remix_file_explorer_browser.png differ diff --git a/docs/images/remix_file_explorer_menu.png b/docs/images/remix_file_explorer_menu.png new file mode 100755 index 0000000000..2140e9b36c Binary files /dev/null and b/docs/images/remix_file_explorer_menu.png differ diff --git a/docs/images/remix_quickstart_javascriptvm_callinginstance.png b/docs/images/remix_quickstart_javascriptvm_callinginstance.png new file mode 100644 index 0000000000..fe11a2cb06 Binary files /dev/null and b/docs/images/remix_quickstart_javascriptvm_callinginstance.png differ diff --git a/docs/images/remix_quickstart_javascriptvm_creation.png b/docs/images/remix_quickstart_javascriptvm_creation.png new file mode 100644 index 0000000000..fc7598aea7 Binary files /dev/null and b/docs/images/remix_quickstart_javascriptvm_creation.png differ diff --git a/docs/images/remix_quickstart_javascriptvm_creationTransaction.png b/docs/images/remix_quickstart_javascriptvm_creationTransaction.png new file mode 100644 index 0000000000..0b27bc105f Binary files /dev/null and b/docs/images/remix_quickstart_javascriptvm_creationTransaction.png differ diff --git a/docs/images/remix_recorder.png b/docs/images/remix_recorder.png new file mode 100644 index 0000000000..1f7abc7363 Binary files /dev/null and b/docs/images/remix_recorder.png differ diff --git a/docs/images/remix_runtab.png b/docs/images/remix_runtab.png new file mode 100755 index 0000000000..c636298493 Binary files /dev/null and b/docs/images/remix_runtab.png differ diff --git a/docs/images/remix_runtab_example.png b/docs/images/remix_runtab_example.png new file mode 100755 index 0000000000..78fba7e994 Binary files /dev/null and b/docs/images/remix_runtab_example.png differ diff --git a/docs/images/remix_settingstab.png b/docs/images/remix_settingstab.png new file mode 100755 index 0000000000..bfd50332e1 Binary files /dev/null and b/docs/images/remix_settingstab.png differ diff --git a/docs/images/remix_supporttab.png b/docs/images/remix_supporttab.png new file mode 100755 index 0000000000..b62ead496b Binary files /dev/null and b/docs/images/remix_supporttab.png differ diff --git a/docs/images/remix_terminal.png b/docs/images/remix_terminal.png new file mode 100755 index 0000000000..3f096a2490 Binary files /dev/null and b/docs/images/remix_terminal.png differ diff --git a/docs/images/remix_unittest.png b/docs/images/remix_unittest.png new file mode 100644 index 0000000000..c94077524c Binary files /dev/null and b/docs/images/remix_unittest.png differ diff --git a/docs/import.md b/docs/import.md new file mode 100644 index 0000000000..a576d24586 --- /dev/null +++ b/docs/import.md @@ -0,0 +1,39 @@ +Importing Source Files in Solidity +================================== + +It is essential to know all many techniques for importing files. + +For a tutorial about importing files see this [tutorial](https://github.com/ethereum/remix-workshops/tree/master/loading_via_npm_github_plugin). + +For a detailed explanation of the `import` keyword see the +[Solidity documentation](https://solidity.readthedocs.io/en/develop/layout-of-source-files.html?highlight=import#importing-other-source-files) + +Here are a some of the main methods of importing a file: + +Importing a file from the browser's local storage +------------------------------------------------- + +Files in Remix can be imported just by specifying their path. Please use ./ for relative paths to increase portability. +![](images/a-old-tuto_basicimport.png) + +Importing a file from your computer's filesystem +------------------------------------------------- + +This method uses **remixd** - the remix daemon. Please go to the [remixd tutorial](remixd.html) for instructions about how to bridge the divide between the browser and your computers filesystem. + + +Importing from GitHub +--------------------- + +It is possible to import files directly from GitHub with URLs like +`https://github.com///`. + +![](images/a-old-tuto_importgit.png) + +Importing from Swarm +-------------------- + +Files can be imported using all URLs supported by swarm. If you do not +have a swarm node, then use swarm-gateways.net. + +![](images/a-old-tuto_importswarm.png) diff --git a/docs/index.rst b/docs/index.rst new file mode 100644 index 0000000000..a2b8905151 --- /dev/null +++ b/docs/index.rst @@ -0,0 +1,88 @@ +Welcome to Remix documentation! +=============================== + +Remix is a powerful, open source tool that helps you write Solidity contracts straight from the browser. +Written in JavaScript, Remix supports both usage in the browser and locally. + +Remix also supports testing, debugging and deploying of smart contracts and much more. + +Our Remix project with all its features is available +at `remix.ethereum.org `__ and more information can be found in these +docs. Our IDE tool is available at `our GitHub repository +`__. + +This set of documents covers instructions on how to use Remix and some tutorials to help you get started. + +Useful links: + +- `Solidity documentation `__ + +- `Remix alpha `__ - The version where we test new Remix release (not stable!). + +- `Ethereum StackExchange for Remix `__ + +- `Community support channel `__ + +- `Ðapp Developer resources (Ethereum wiki) `__ + +.. toctree:: + :maxdepth: 2 + :caption: New Layout Intro + + layout + +.. toctree:: + :maxdepth: 2 + :caption: Tour of default modules + + file_explorer + plugin_manager + settings + solidity_editor + terminal + +.. toctree:: + :maxdepth: 2 + :caption: Tour of typical solidity modules + + compile + run + udapp + debugger + static_analysis + +.. toctree:: + :maxdepth: 2 + :caption: Using Remix + + contract_metadata + create_deploy + import + remixd + unittesting + +.. toctree:: + :maxdepth: 2 + :caption: Building Plugins + + remix_plugin.md + +.. toctree:: + :maxdepth: 2 + :caption: URLs & Downloads + + locations + +.. toctree:: + :maxdepth: 2 + :caption: Tutorials and workshops slides + + remix_tutorials_github + +.. toctree:: + :maxdepth: 2 + :caption: Code contribution guide + + code_contribution_guide + community + support diff --git a/docs/layout.md b/docs/layout.md new file mode 100644 index 0000000000..2cbeed1066 --- /dev/null +++ b/docs/layout.md @@ -0,0 +1,54 @@ +Remix-IDE Layout +============== + +The new structure +-------------------- +![](images/a-layout1b.png) + +1. Icon Panel - click to change which plugin appears in the Swap Panel +2. Swap Panel - Most but not all plugins will have their GUI here. +3. Main Panel - In the old layout this was just for editing files. In the tabs can be plugins or files for the IDE to compile. +4. Terminal - where you will see the results of your interactions with the GUI's. Also you can run scripts here. + +Icon Panel at Page Load +----------------------- +When you load remix - the icon panel show these icons by default. + +![](images/a-icons-at-load.png) + +Everything in remix is now a plugin... so the **[Plugin Manager](#plugin-manager)** is very important. +In the old layout, each basic task in remix was separated into the tabs. Now these tabs are plugins. + +But to activate a half a dozen plugins - (or however many you are using) each time the page load is **tedious**. So learn about the **[Environments](#environments)**. + +Homepage +-------- + +![](images/a-hometab.png) + +The homepage is located in a tab in the Main Panel. + +You can also get there by clicking the remix logo at the top of the icon panel. + +### Environments +Clicking on one of the environment buttons loads up a collection of plugins. We currently have a **Solidity** Button and a **Vyper** button. In the future you will be able to save your own environment. + +To see all the plugins go to the **plugin manager** - by selecting the plug in the icon panel. +![](images/a-plug.png) + +The environment buttons are time & sanity savers - so you don't need to go to the plugin manager to get started everytime you load the page. + + +Plugin Manager +--------------- + +In order to make Remix flexible for integrating changes into its functionality and for integrating remix into other projects (your's for example), we've now made everything a plugin. This means that you only load the functionality you need. It also means that you need a place to turn off and on plugins - as your needs change. This all happens in the plug manager. + +The Plugin Manager is also the place you go when you are creating your own plugin and you want to load your local plugin into Remix. In that case you'd click on the "Connect to a Local Plugin" link at the top of the Plugin Manager panel. + +Themes +--------------- + +So you want to work on Remix with a dark theme or a gray theme or just a different theme that the one you are currently looking at? Go to the settings tab and at the bottom is a choice of lots of bootstrap based themes. + +![](images/a-themes.png) diff --git a/docs/locations.md b/docs/locations.md new file mode 100644 index 0000000000..51e50e8a7a --- /dev/null +++ b/docs/locations.md @@ -0,0 +1,10 @@ +Finding Remix +============= + +So if you've found the documentation to Remix but don't know where to find Remix or if you want to run the remix-ide locally and want to find out where to download it - this page is here to help. + +- An online version is available at [https://remix.ethereum.org](https://remix.ethereum.org). This version is stable and is updated at almost every release. +- An alpha online version is available at [https://remix-alpha.ethereum.org](https://remix-alpha.ethereum.org). This is not a stable version. +- npm `remix-ide` package `npm install remix-ide -g`. `remix-ide` create a new instance of `Remix IDE` available at [http://127.0.0.1:8080](http://127.0.0.1:8080) and make the current folder available to Remix IDE by automatically starting `remixd`. +see [Connection to `remixd`](http://remix.readthedocs.io/en/latest/tutorial_remixd_filesystem.html) for more information about sharing local file with `Remix IDE`. +- Github release: [https://github.com/ethereum/remix-ide/releases](https://github.com/ethereum/remix-ide/releases) . The source code is packaged at every release but still need to be built using `npm run build`. diff --git a/docs/make.bat b/docs/make.bat new file mode 100755 index 0000000000..963594cac0 --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,263 @@ +@ECHO OFF + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set BUILDDIR=_build +set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% . +set I18NSPHINXOPTS=%SPHINXOPTS% . +if NOT "%PAPER%" == "" ( + set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% + set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% +) + +if "%1" == "" goto help + +if "%1" == "help" ( + :help + echo.Please use `make ^` where ^ is one of + echo. html to make standalone HTML files + echo. dirhtml to make HTML files named index.html in directories + echo. singlehtml to make a single large HTML file + echo. pickle to make pickle files + echo. json to make JSON files + echo. htmlhelp to make HTML files and a HTML help project + echo. qthelp to make HTML files and a qthelp project + echo. devhelp to make HTML files and a Devhelp project + echo. epub to make an epub + echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter + echo. text to make text files + echo. man to make manual pages + echo. texinfo to make Texinfo files + echo. gettext to make PO message catalogs + echo. changes to make an overview over all changed/added/deprecated items + echo. xml to make Docutils-native XML files + echo. pseudoxml to make pseudoxml-XML files for display purposes + echo. linkcheck to check all external links for integrity + echo. doctest to run all doctests embedded in the documentation if enabled + echo. coverage to run coverage check of the documentation if enabled + goto end +) + +if "%1" == "clean" ( + for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i + del /q /s %BUILDDIR%\* + goto end +) + + +REM Check if sphinx-build is available and fallback to Python version if any +%SPHINXBUILD% 1>NUL 2>NUL +if errorlevel 9009 goto sphinx_python +goto sphinx_ok + +:sphinx_python + +set SPHINXBUILD=python -m sphinx.__init__ +%SPHINXBUILD% 2> nul +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +:sphinx_ok + + +if "%1" == "html" ( + %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/html. + goto end +) + +if "%1" == "dirhtml" ( + %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. + goto end +) + +if "%1" == "singlehtml" ( + %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. + goto end +) + +if "%1" == "pickle" ( + %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can process the pickle files. + goto end +) + +if "%1" == "json" ( + %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can process the JSON files. + goto end +) + +if "%1" == "htmlhelp" ( + %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can run HTML Help Workshop with the ^ +.hhp project file in %BUILDDIR%/htmlhelp. + goto end +) + +if "%1" == "qthelp" ( + %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can run "qcollectiongenerator" with the ^ +.qhcp project file in %BUILDDIR%/qthelp, like this: + echo.^> qcollectiongenerator %BUILDDIR%\qthelp\Remix.qhcp + echo.To view the help file: + echo.^> assistant -collectionFile %BUILDDIR%\qthelp\Remix.ghc + goto end +) + +if "%1" == "devhelp" ( + %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. + goto end +) + +if "%1" == "epub" ( + %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The epub file is in %BUILDDIR%/epub. + goto end +) + +if "%1" == "latex" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "latexpdf" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + cd %BUILDDIR%/latex + make all-pdf + cd %~dp0 + echo. + echo.Build finished; the PDF files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "latexpdfja" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + cd %BUILDDIR%/latex + make all-pdf-ja + cd %~dp0 + echo. + echo.Build finished; the PDF files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "text" ( + %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The text files are in %BUILDDIR%/text. + goto end +) + +if "%1" == "man" ( + %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The manual pages are in %BUILDDIR%/man. + goto end +) + +if "%1" == "texinfo" ( + %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. + goto end +) + +if "%1" == "gettext" ( + %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The message catalogs are in %BUILDDIR%/locale. + goto end +) + +if "%1" == "changes" ( + %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes + if errorlevel 1 exit /b 1 + echo. + echo.The overview file is in %BUILDDIR%/changes. + goto end +) + +if "%1" == "linkcheck" ( + %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck + if errorlevel 1 exit /b 1 + echo. + echo.Link check complete; look for any errors in the above output ^ +or in %BUILDDIR%/linkcheck/output.txt. + goto end +) + +if "%1" == "doctest" ( + %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest + if errorlevel 1 exit /b 1 + echo. + echo.Testing of doctests in the sources finished, look at the ^ +results in %BUILDDIR%/doctest/output.txt. + goto end +) + +if "%1" == "coverage" ( + %SPHINXBUILD% -b coverage %ALLSPHINXOPTS% %BUILDDIR%/coverage + if errorlevel 1 exit /b 1 + echo. + echo.Testing of coverage in the sources finished, look at the ^ +results in %BUILDDIR%/coverage/python.txt. + goto end +) + +if "%1" == "xml" ( + %SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The XML files are in %BUILDDIR%/xml. + goto end +) + +if "%1" == "pseudoxml" ( + %SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml. + goto end +) + +:end diff --git a/docs/mist1.png b/docs/mist1.png new file mode 100644 index 0000000000..cd2991e2fd Binary files /dev/null and b/docs/mist1.png differ diff --git a/docs/plugin_manager.md b/docs/plugin_manager.md new file mode 100644 index 0000000000..9c95b45661 --- /dev/null +++ b/docs/plugin_manager.md @@ -0,0 +1,22 @@ +Plugin Manager +=================== + +## Everything is a PLUGIN in Remix + +In order to integrate new tools made by us and by ...you into Remix, we've now made everything a plugin. +This architcture will also allow Remix or just parts of Remix to be integrated into other projects (your's for example). + +This means that you only load the functionality you need. + +It also means that you can turn off and on plugins - as your needs change. + +This all happens in the plug manager. + +The Plugin Manager is also the place you go when you are creating your own plugin and you want to load your local plugin into Remix. + +To load your local plugin, you'd click on the "Connect to a Local Plugin" link at the top of the Plugin Manager panel. + +![](images/a-plugin-man-local.png) + +To learn more about how to create your own plugin, go to +[the README of remix-plugin repo](https://github.com/ethereum/remix-plugin). diff --git a/docs/remix1.png b/docs/remix1.png new file mode 100644 index 0000000000..7575d34f6c Binary files /dev/null and b/docs/remix1.png differ diff --git a/docs/remix2.png b/docs/remix2.png new file mode 100644 index 0000000000..17a53affd9 Binary files /dev/null and b/docs/remix2.png differ diff --git a/docs/remix3.png b/docs/remix3.png new file mode 100644 index 0000000000..060352a755 Binary files /dev/null and b/docs/remix3.png differ diff --git a/docs/remix4.png b/docs/remix4.png new file mode 100644 index 0000000000..404ed50572 Binary files /dev/null and b/docs/remix4.png differ diff --git a/docs/remix5.png b/docs/remix5.png new file mode 100644 index 0000000000..4297d58adc Binary files /dev/null and b/docs/remix5.png differ diff --git a/docs/remix_breakpoint.png b/docs/remix_breakpoint.png new file mode 100644 index 0000000000..c755f61348 Binary files /dev/null and b/docs/remix_breakpoint.png differ diff --git a/docs/remix_debuginstructions.png b/docs/remix_debuginstructions.png new file mode 100644 index 0000000000..bb36decbaf Binary files /dev/null and b/docs/remix_debuginstructions.png differ diff --git a/docs/remix_debugtransactioninfo.png b/docs/remix_debugtransactioninfo.png new file mode 100644 index 0000000000..92d2e33100 Binary files /dev/null and b/docs/remix_debugtransactioninfo.png differ diff --git a/docs/remix_enterdebugsession.png b/docs/remix_enterdebugsession.png new file mode 100644 index 0000000000..77acc520ee Binary files /dev/null and b/docs/remix_enterdebugsession.png differ diff --git a/docs/remix_executionexception.png b/docs/remix_executionexception.png new file mode 100644 index 0000000000..9f28396b8a Binary files /dev/null and b/docs/remix_executionexception.png differ diff --git a/docs/remix_navigation.png b/docs/remix_navigation.png new file mode 100644 index 0000000000..d4187a462a Binary files /dev/null and b/docs/remix_navigation.png differ diff --git a/docs/remix_plugin.md b/docs/remix_plugin.md new file mode 100644 index 0000000000..95ccd300f7 --- /dev/null +++ b/docs/remix_plugin.md @@ -0,0 +1,4 @@ +Remix Plugin +============ + +The best documentation about how to build a plugin is currently in [the readme of remix-plugin repo](https://github.com/ethereum/remix-plugin). Please go [here](https://github.com/ethereum/remix-plugin) to learn all about it. diff --git a/docs/remix_plugin_api.md b/docs/remix_plugin_api.md new file mode 100644 index 0000000000..1c6f66e1ba --- /dev/null +++ b/docs/remix_plugin_api.md @@ -0,0 +1,60 @@ +Remix Plugin API usage +====================== + +This section list all the available key and value pair which define this API: + +## 1) notifications + +### app (key: app) + + - unfocus `[]` + - focus `[]` + +### compiler (key: compiler) + + - compilationFinished `[success (bool), data (obj), source (obj)]` + - compilationData `[compilationResult (obj)]` + +### transaction listener (key: txlistener) + + - newTransaction `[tx (obj)]` + +### addendum + +`newTransaction` is broadcasted to all loaded plugins. +`compilationFinished` is sent to the plugin that currently has the focus. +`focus / unfocus` is sent to the plugin which currently has the focus or is unfocused. +`compilationData` is sent always just upon the `focus` event and gives the last compilation result. + +## 2) requests + +### app + + - getExecutionContextProvider `@return {String} provider (injected | web3 | vm)` + - getProviderEndpoint `@return {String} provider endpoint url if web3, returns an error if injected or javascript VM` + - updateTitle `@param {String} title` + +### config + + - setConfig `@param {String} path, @param {String} content` + - getConfig `@param {String} path` + - removeConfig `@param {String} path` + +### compiler + - getCompilationResult `@return {Object} compilation result` + +### udapp (only VM) + - runTx `@param {Object} tx` + - getAccounts `@return {Array} acccounts` + - createVMAccount `@param {String} privateKey, @param {String} balance (hex)` + +### editor + - getCurrentFile `@return {String} current file path displayed in the editor` + - getFile `@param {String} path` + - setFile `@param {String} path, @param {String} content` + - highlight `@param {Object} lineColumnPos, @param {String} filePath, @param {String} hexColor` + + + + + diff --git a/docs/remix_soliditylocals.png b/docs/remix_soliditylocals.png new file mode 100644 index 0000000000..bfa627d1a4 Binary files /dev/null and b/docs/remix_soliditylocals.png differ diff --git a/docs/remix_soliditystate.png b/docs/remix_soliditystate.png new file mode 100644 index 0000000000..789df079e2 Binary files /dev/null and b/docs/remix_soliditystate.png differ diff --git a/docs/remix_startdebugging.png b/docs/remix_startdebugging.png new file mode 100644 index 0000000000..bf5287a5c3 Binary files /dev/null and b/docs/remix_startdebugging.png differ diff --git a/docs/remix_stepdetail.png b/docs/remix_stepdetail.png new file mode 100644 index 0000000000..efde21304e Binary files /dev/null and b/docs/remix_stepdetail.png differ diff --git a/docs/remix_tutorials_github.md b/docs/remix_tutorials_github.md new file mode 100644 index 0000000000..5373c23029 --- /dev/null +++ b/docs/remix_tutorials_github.md @@ -0,0 +1,37 @@ +Remix Tutorials +======================= + +There are a series of tutorials in our github repo [remix-workshops](https://github.com/ethereum/remix-workshops). + +We are in the process of upgrading these tutorials to use the new Remix layout. + +In this repo there tutorials for all levels. + +There are tutorials for specific remix functionalities like: + +***Deploying*** + + Multiple ways of loading files in Remix + Deploying with libraries + Deploying a proxy contract + +***Testing*** + + Testing Examples + Continuous integration + +***Remix Plugin Development*** + + Developing a plugin for Remix and deploying it to swarm + +***Other*** + + EtherAtom (walkthrough slides + screencast) + Debugging transactions with Remix IDE + Recording and replaying transactions + Using a Pipeline plugin for developing Solidity contracts with demo video + Running scripts in the Remix terminal (batch deployment) (proxy deployment) + +***Additional external workshops*** + + Using Oraclize plugin in Remix diff --git a/docs/remix_valueinput.png b/docs/remix_valueinput.png new file mode 100644 index 0000000000..381ebfc86a Binary files /dev/null and b/docs/remix_valueinput.png differ diff --git a/docs/remixd.md b/docs/remixd.md new file mode 100644 index 0000000000..f96e6f5d44 --- /dev/null +++ b/docs/remixd.md @@ -0,0 +1,57 @@ +Remixd: Get access your local filesystem +========================================= + +`remixd` is an npm module. Its purpose is to give the remix web +application access to a folder on your local computer. + +The code of `remixd` is +[here](https://github.com/ethereum/remixd) . + +`remixd` can be globally installed using the following command: +`npm install -g remixd` + +You can install it just in the directory of your choice using this command: +`npm install remixd` + +Then `remixd -s --remix-ide ` will start `remixd` and will share the given folder. + +For example, to sync your local folder to the official Remix IDE, +`remixd -s --remix-ide https://remix.ethereum.org` + +The folder is shared using a websocket connection between `Remix IDE` +and `remixd`. + +Be sure the user executing `remixd` has read/write permission on the +folder. + +There is an option to run remixd in read-only mode, use `--read-only` flag. + +**Warning!** + +`remixd` provides `full read and write access` to the given folder for `any +application` that can access the `TCP port 65520` on your local host. + +From `Remix IDE`, in the Plugin Manager you need to activate the remixd plugin. + +A modal dialog will ask confirmation + +Accepting this dialog will start a session. + +If you do not have `remixd` running in the background - another modal will open up and it will say: + +``` +Cannot connect to the remixd daemon. +Please make sure you have the remixd running in the background. +``` + +Assuming you don't get the 2nd modal, your connection to the remixd daemon is successful. The shared folder will be available in the file explorer. + +**When you click the activation of remixd is successful - there will NOT be an icon that loads in the icon panel.** + +Click the File Explorers icon and in the swap panel you should now see the folder for `localhost`. + +Click on the `localhost connection` icon: + +![](images/a-remixd-success.png) + + diff --git a/docs/remixd_alert.png b/docs/remixd_alert.png new file mode 100644 index 0000000000..d64e6f7214 Binary files /dev/null and b/docs/remixd_alert.png differ diff --git a/docs/remixd_connectionok.png b/docs/remixd_connectionok.png new file mode 100644 index 0000000000..e8381f55df Binary files /dev/null and b/docs/remixd_connectionok.png differ diff --git a/docs/remixd_noconnection.png b/docs/remixd_noconnection.png new file mode 100644 index 0000000000..b6cd6f5b40 Binary files /dev/null and b/docs/remixd_noconnection.png differ diff --git a/docs/run.md b/docs/run.md new file mode 100644 index 0000000000..62a8e8fd1c --- /dev/null +++ b/docs/run.md @@ -0,0 +1,282 @@ +Run & Deploy +============ + +The Run tab allows you to send transactions to the current environment. + +To get to the Run & Deploy module - click the run icon in the icon panel. + +In order to use this module you need to have a contract compiled. So if there is file name in the contract pulldown menu ( in the image below it's the pulldown that says **Ballot**), then you can interact with this contract. If nothing is there - then you need to select a contract - make it the active contract in the main panel, ( in the image below - on the right side of the page - in the main panel - you see the ballot.sol so it is the active contract) then go to the compiler module and compile it. + +![](images/a-runtab1.png) + +Run Setup +--------- + +The following settings allow you to directly influence the transaction +execution: + +Environment: + +- `JavaScript VM`: All the transactions will be executed in + a sandbox blockchain in the browser. This means nothing + will be persisted and a page reload will restart a new + blockchain from scratch, the old one will not be saved. + +- `Injected Provider`: Remix will connect to an injected + web3 provider. `Metamask` is an example of + providers that inject web3, thus can be used with this + option. + +- `Web3 Provider`: Remix will connect to a remote node. You + will need to provide the URL address to the selected + provider: geth, parity or any Ethereum client. + +- Account: the list of accounts associated with the current + environment (and their associated balances). + +- Gas Limit: the maximum amount of gas that can be set for all the + transactions created in Remix. + +- Value: the amount of value for the next created transaction (this + value is always reset to 0 after each transaction execution). + + ![](images/a-Runtab-deploy-atAddress.png) + +Initiate Instance +----------------- + +This section contains the list of compiled contracts and 2 actions: + +- `At Address` assumes the given address is an instance of the + selected contract. It is then possible to interact with an already + deployed contract. There's no check at this point, so be careful + when using this feature, and be sure you trust the contract at that + address. + +- `Deploy` send a transaction that deploys the selected contract. When + the transaction is mined, the newly created instance will be added + (this might take several seconds). Note that if the `constructor` + has parameters, you need to specify them. + +Pending Instances +----------------- + +Validating a transaction take several seconds. During this time, the GUI +shows it in a pending mode. When transaction is mined the number of +pending transactions is updated and the transaction is added to the log +(see ../terminal) + +Using the ABI +------------ + +Using `Deploy` or `At Address` is a classic use case of Remix. It is +possible though to interact with a contract by using its ABI. The ABI is +a JSON array which describe its interface. + +To interact with a contract using the ABI, create a new file in Remix +with extension `*.abi` and copy the ABI content to it. Then in the input +next to `At Address`, put the Address of the contract you want to +interact with. Click on `At Address`, a new "connection" with the +contract will popup below. + +Using the Recorder +------------------ + +The Recorder allows to save a bunch of transactions in a JSON file and +rerun them later either in the same environment or in another. + +Saving to JSON allows to easily check the transaction list, tweak input +parameters, change linked library, etc... + +We can find many use cases for the recorder, for instance: +: - After having coded and tested contracts in a constrained + environment (like the JavaScript VM), it could be interesting to + redeploy them easily in a more persisted environment (like a + Geth node) in order to check whether everything behaves normally + in a classic environment. + - Deploying contract does often require more than creating one + transaction. + - Working in a dev environment does often require to setup the + state in a first place. + +![](images/a-runtab-recorder.png) + +Saving a record ends up with the creation of this type of content (see +below): + +In that specific record, 3 transactions are executed: + +The first corresponds to the deployment of the lib `testLib`. + +The second corresponds to the deployment of the contract `test`, the +first parameter of the constructor is set to 11. That contract depends +on a library. The linkage is done using the property `linkReferences`. +In that case we use the addres of the previously created library : +`created{1512830014773}`. the number is the id (timestamp) of the +transaction that leads to the creation of the library. + +The third parameter corresponds to the call to the function `set` of the +contract `test` (the property to is set to: `created{1512830015080}`) . +Input parameters are `1` and +`0xca35b7d915458ef540ade6068dfe2f44e8fa733c` + +all these transactions are created using the value of the accounts +`account{0}`. + +``` +{.sourceCode .none} +{ +"accounts": { + "account{0}": "0xca35b7d915458ef540ade6068dfe2f44e8fa733c" +}, +"linkReferences": { + "testLib": "created{1512830014773}" +}, +"transactions": [ + { + "timestamp": 1512830014773, + "record": { + "value": "0", + "parameters": [], + "abi": "0xbc36789e7a1e281436464229828f817d6612f7b477d66591ff96a9e064bcc98a", + "contractName": "testLib", + "bytecode": "60606040523415600e57600080fd5b60968061001c6000396000f300606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680636d4ce63c146044575b600080fd5b604a6060565b6040518082815260200191505060405180910390f35b6000610d809050905600a165627a7a7230582022d123b15248b8176151f8d45c2dc132063bcc9bb8d5cd652aea7efae362c8050029", + "linkReferences": {}, + "type": "constructor", + "from": "account{0}" + } + }, + { + "timestamp": 1512830015080, + "record": { + "value": "100", + "parameters": [ + 11 + ], + "abi": "0xc41589e7559804ea4a2080dad19d876a024ccb05117835447d72ce08c1d020ec", + "contractName": "test", + "bytecode": "60606040526040516020806102b183398101604052808051906020019091905050806000819055505061027a806100376000396000f300606060405260043610610062576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680632f30c6f61461006757806338cc48311461009e57806362738998146100f357806387cc10e11461011c575b600080fd5b61009c600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610145565b005b34156100a957600080fd5b6100b1610191565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156100fe57600080fd5b6101066101bb565b6040518082815260200191505060405180910390f35b341561012757600080fd5b61012f6101c4565b6040518082815260200191505060405180910390f35b8160008190555080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008054905090565b600073__browser/ballot.sol:testLib____________636d4ce63c6000604051602001526040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b151561022e57600080fd5b6102c65a03f4151561023f57600080fd5b505050604051805190509050905600a165627a7a72305820e0b2510bb2890a0334bfe5613d96db3e72442e63b514cdeaee8fc2c6bbd19d3a0029", + "linkReferences": { + "browser/ballot.sol": { + "testLib": [ + { + "length": 20, + "start": 511 + } + ] + } + }, + "name": "", + "type": "constructor", + "from": "account{0}" + } + }, + { + "timestamp": 1512830034180, + "record": { + "value": "1000000000000000000", + "parameters": [ + 1, + "0xca35b7d915458ef540ade6068dfe2f44e8fa733c" + ], + "to": "created{1512830015080}", + "abi": "0xc41589e7559804ea4a2080dad19d876a024ccb05117835447d72ce08c1d020ec", + "name": "set", + "type": "function", + "from": "account{0}" + } + } +], +"abis": { + "0xbc36789e7a1e281436464229828f817d6612f7b477d66591ff96a9e064bcc98a": [ + { + "constant": true, + "inputs": [], + "name": "get", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + } + ], + "0xc41589e7559804ea4a2080dad19d876a024ccb05117835447d72ce08c1d020ec": [ + { + "constant": true, + "inputs": [], + "name": "getInt", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getFromLib", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getAddress", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_t", + "type": "uint256" + }, + { + "name": "_add", + "type": "address" + } + ], + "name": "set", + "outputs": [], + "payable": true, + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "name": "_r", + "type": "uint256" + } + ], + "payable": true, + "stateMutability": "payable", + "type": "constructor" + } + ] +} +} +``` diff --git a/docs/settings.md b/docs/settings.md new file mode 100644 index 0000000000..2f78eb52f0 --- /dev/null +++ b/docs/settings.md @@ -0,0 +1,14 @@ +Settings +======== + +To get to **Settings** click the gear a the very bottom of the icon panel. + +You can find a link to the homepage (if you closed it) as well as a link to our Gitter Channel and for you aesthetes out there, we now have a rather large list of themes. + +![](images/a-themes.png) + +Another important settings: + +- Text wrap: controls if the text in the editor should be wrapped. + +- Enable optimization: defines if the compiler should enable optimization during compilation. Enabling this option saves execution gas. It is useful to enable optimization for contracts ready to be deployed in production but could lead to some inconsistencies when debugging such a contract. diff --git a/docs/solidity_editor.md b/docs/solidity_editor.md new file mode 100644 index 0000000000..f492dab9a9 --- /dev/null +++ b/docs/solidity_editor.md @@ -0,0 +1,18 @@ +Solidity Editor +=============== + +The Remix editor recompiles the code each time the current file is +changed or another file is selected. It also provides syntax +highlighting mapped to solidity keywords. + +![](images/a-sol-editor.png) + +Here's the list of some important features: + +- It display opened files as tabs. +- Compilation Warning and Error are displayed in the gutter +- Remix saves the current file continuously (5s after the last + changes) +- +/- on the top left corner enable you to increase/decrease the font + size of the editor + diff --git a/docs/static_analysis.md b/docs/static_analysis.md new file mode 100644 index 0000000000..ac3de2ed7e --- /dev/null +++ b/docs/static_analysis.md @@ -0,0 +1,33 @@ +Analysis +======== + +This section gives information about the last compilation. By default, a +new analysis is run at each compilation. + +The analysis tab gives detailed information about the contract code. It +can help you avoid code mistakes and to enforce best practices. + +![](images/a-static-analysis.png) + +Here is the list of analyzers: + +Security: +- Transaction origin: Warns if tx.origin is used +- Check effects: Avoid potential reentrancy bugs +- Inline assembly: Use of Inline Assembly +- Block timestamp: Semantics maybe unclear +- Low level calls: Semantics maybe unclear +- Block.blockhash usage: Semantics maybe unclear + + +Gas & Economy: +- Gas costs: Warns if the gas requirements of the functions + are too high +- This on local calls: Invocation of local functions via + this + +Miscellaneous: +- Constant functions: Checks for potentially constant + functions +- Similar variable names: Checks if variable names are too + similar diff --git a/docs/support.md b/docs/support.md new file mode 100644 index 0000000000..85dfb873c5 --- /dev/null +++ b/docs/support.md @@ -0,0 +1,9 @@ +Support chat +======================= + +We know that blockchain ecosystem is very new and that lots of information is scattered around the web. +That is why we created a community support chat where we and other users try to answer your questions if +you get stuck using Remix. Please, join [the Remix channel](https://gitter.im/ethereum/remix) and ask the community for help. + +For anyone who is interested in developing a custom plugin for Remix or who wants to contribute to the codebase, +we've opened [another channel](https://gitter.im/ethereum/remix-dev) specially for developers working on Remix tool. diff --git a/docs/terminal.md b/docs/terminal.md new file mode 100644 index 0000000000..56fdb7c2fd --- /dev/null +++ b/docs/terminal.md @@ -0,0 +1,21 @@ +Terminal +======== + +![](images/a-terminal-and-more.png) + +Features, available in the terminal: + +- It integrates a JavaScript interpreter and the `web3` object. It + enables the execution of the JavaScript script which interacts with + the current context. (note that `web3` is only available if the + `web provider` or `injected provider` mode is selected). +- It displays important actions made while interacting with the Remix + IDE (i.e. sending a new transaction). +- It displays transactions that are mined in the current context. You + can choose to display all transactions or only transactions that + refers to the contracts Remix knows (e.g transaction created from + the Remix IDE). +- It allows searching for the data and clearing the logs from the + terminal. +- You can run scripts by inputting them at the bottom after the `>`. + diff --git a/docs/tutorial_debug.md b/docs/tutorial_debug.md new file mode 100644 index 0000000000..f85712faa0 --- /dev/null +++ b/docs/tutorial_debug.md @@ -0,0 +1,239 @@ +Debugging transactions +====================== + +There are two ways to start debugging, each one corresponds to a different use case. +* from the transaction log in the Terminal - use this when you are want to debug a "sucessful" transaction. +* from the Debugger - use this if you have a *transaction hash* or a *block number* with a *transaction index*. + +### Debug from the Transaction GUI - + +Let's start with a basic contract (or replace this one by your own): +- create a blank file in the file explorer (by clicking the + icon) and give it a name. +- copy the code below. +- compile the code. +- click the Run & Deploy icon in the icon panel. + +``` +{.sourceCode .none} - RS why is this here? +pragma solidity >=0.5.1 <0.6.0; +contract Donation { + address owner; + event fundMoved(address _to, uint _amount); + modifier onlyowner { if (msg.sender == owner) _; } + address[] _giver; + uint[] _values; + + constructor() public { + owner = msg.sender; + } + + function donate() payable public { + addGiver(msg.value); + } + + function moveFund(address payable _to, uint _amount) onlyowner public { + uint balance = address(this).balance; + uint amount = _amount; + if (_amount <= balance) { + if (_to.send(balance)) { + emit fundMoved(_to, _amount); + } else { + revert(); + } + } else { + revert(); + } + } + + function addGiver(uint _amount) internal { + _giver.push(msg.sender); + _values.push(_amount); + } +} +``` + +For the purpose of this tutorial, we will run the `JavaScript VM`. +This simulates a custom blockchain. You could do the same using a proper backend node. + +Let's deploy the contract: + +Click the `Deploy` button + +![](images/a-debug1-deploy.png) + +You'll see the deployed instance (AKA the udapp). + +![](images/a-debug2-udapp1a.png) + +Then open it up (by clicking the caret). + +![](images/a-debug3-udapp2.png) + + +We are going to call the `Donate` function and will send it ether. + +To do this: in the value input box put in **2** and select Ether as the unit (and not wei like I did in the image below - well you could - it won't really change anything). + +![](images/a-debug4-value-loc.png) + +Then click the `Donate` button. + +This will send Ether to the this function. + +Because we are using the `JavaScript VM`, everything happens almost instantly. (If we had been using Injected Web 3, then we would have to need to approve the transaction, pay for gas and wait for the transaction to get mined.) + +Remix displays information related to each transaction result in the terminal. + +Check in the **terminal** where the transaction you just made is logged. + +Click the debug button to start debugging it. + +![](images/a-debug5-term-debug-but.png) + +### From the Debugger + +Click the bug icon in the icon panel to get to the debugger in the side panel. If you don't see the bug icon go to the plugin manager and activate the debugger. + +You can start a debug session by providing either a `transaction hash` +or a `block number` and `transaction index`. + +To find a transaction hash +1. go to a transaction in the terminal. +2. Click a line with a transaction - to exand the log. +3. Copy the transaction has locate there. + +![image](remix3.png) + +Then click on the `start debugging` button. + +Using the debugger +------------------ + +The debugger allows one to see detailed informations about the +transaction's execution. It uses the editor to display the +location in the source code where the current execution is. + +The transaction panel displays basic information about the current +transaction. + +![image](remix_debugtransactioninfo.png) + +The navigation part contains a slider and buttons that can be used to +step through the transaction execution. + +From the left to the right: + +step over back, step into back, step into forward, step over forward, +jump out (jump out of the current call), jump to the previous +breakpoint, jump to the next breakpoint. + +![image](remix_navigation.png) + +11 panels give detailed information about the execution: + +### Instructions + +![image](remix_debuginstructions.png) + +The Instructions panel displays the bytecode of the current executing +contract- with the current step highlighted. + +Important note: When this panel is hidden, the slider will have a +courser granularity and only stop at *expression boundaries*, even if they +are compiled into multiple EVM instructions. When the panel is +displayed, it will be possible to step over every instruction, even +those that refers to the same expression. + +### Solidity Locals + +![image](remix_soliditylocals.png) + +The Solidity Locals panel displays local variables associated with the +current context. + +### Solidity State + +![image](remix_soliditystate.png) + +The Solidity State panel displays state variables of the current +executing contract. + +### Low level panels + +These panels display low level informations about the execution: + +> - Stack +> - Storages Changes +> - Memory +> - Call Data +> - Call Stack +> - Return Value (only if the current step is a RETURN opcode) +> - Full Storages Changes (only at the end of the execution - display +> every storage change of every modified contract) + +### Reverted Transaction + +A transaction could be `reverted` (because of an *out of gas exception* or +Solidity `revert` statement or because of a low level exception). + +It is important to be aware of the exception and to locate +where the exception is in the source code. + +Remix will warn you when the execution throws an exception. The +`warning` button will jump to the last opcode before the exception +happened. + +![image](remix_executionexception.png) + +### Breakpoints + +The two last buttons from the navigation area are used to jump either +back to the previous breakpoint or forward to the next breakpoint. + +Breakpoints can be added and removed by clicking on the line number in the *Editor*. + +![image](remix_breakpoint.png) + +When using debug session with breakpoints, the execution will jump to the first +encountered breakpoint. + +**Important note:** If you add a breakpoint to a line that declares a +variable, it might be triggered twice: Once for initializing the +variable to zero and second time for assigning the actual value. As an +example, assume you are debugging the following contract: + +(RS - what is the {.sourceCode .none} doing?) +``` +{.sourceCode .none} +pragma solidity >=0.5.1 <0.6.0; + +contract ctr { + function hid () public { + uint p = 45; + uint m; + m = 89; + uint l = 34; + } +} +``` + +And let's says that breakpoints are set for the lines + +`uint p = 45;` + +`m = 89;` + +`uint l = 34;` + +then clicking on `Jump to next breakpoint` will stop at the following +lines in the given order: + +> `uint p = 45;` (declaration of p) +> +> `uint l = 34;` (declaration of l) +> +> `uint p = 45;` (45 assigned to p) +> +> `m = 89;` (89 assigned to m) +> +> `uint l = 34;` (34 assigned to l) diff --git a/docs/tutorial_geth-remix.md b/docs/tutorial_geth-remix.md new file mode 100644 index 0000000000..ec096a1fda --- /dev/null +++ b/docs/tutorial_geth-remix.md @@ -0,0 +1,279 @@ +Debugging a Dapp using Remix & Geth +========================================== + +The ultimate goal of this tutorial is to debug transactions that have +been created by a dapp front end. + +It is easy in Remix to debug a transaction created from its own GUI. +However, setting up an environment that allows you to debug transactions +created outside of Remix, require a bit more of complexity. + +We will need four tools for that : + +> - Geth - this is the center piece and provides the blockchain +> environment. We will basically run geth in a dev mode. +> - Remix - this is the Ethereum IDE. We will use it to develop our +> Solidity contract. +> - Any code editor you want - in order to write your front end :) + +Install the environment +----------------------- + +### Install Metamask + +Basically we will run our front end in the Metamask Chrome plugin ([Metamask](http://metamask.io)). + +### Install Geth + +[Geth](http://github.com/ethereum/go-ethereum/releases) is the official +Ethereum client. + +Running the environment +----------------------- + +### Run Geth + +We will run a test node. This node will have a new empty state and will +not be synced to the main or ropsten network. + + geth --ipcpath /geth.ipc --datadir --dev console + +`` is the folder where keys and chain data will be +stored. + +`--ipcpath` defines the end point that other apps (like Metamask) use to +talk to geth. + +`--datadir` specifies the data directory. + +`--dev` sets the node into private chain mode and adds some debugging +flags. + +Then we need to create accounts and mine a bit to generate some Ether: + + // from the geth console : + personal.newAccount() // You can execute this command several time if you need more than one account. + miner.start() // generate some Ether. + miner.stop() // stop mining after 30s-60s - we could also keep mining. + +Next time we run Geth, we will only need to mine transactions (no need +to recreate account). + + +### Starting Remix + +In Mist click on `Develop` / `Open Remix IDE` + +Remix will open in a new window. If this is the first time it is run, +the `Ballot` contract will be loaded. + +Now, we need to check if Remix is connected to Mist: + +Right panel / third tab from the left, `Injected Provider` should be +checked. + +![image](remix4.png) + +Right panel / second tab from the left, `Transaction Origin` should +contain accounts we have previously created in Geth. + +![image](remix5.png) + +Developing contract / front end +------------------------------- + +### Donation contract - Dapp Back end + +Here is a sample solidity contract. + +Copy and paste the following inside remix: + +``` +{.sourceCode .none} +contract Donation { + address owner; + event fundMoved(address _to, uint _amount); + modifier onlyowner { if (msg.sender == owner) _; } + address[] _giver; + uint[] _values; + + function Donation() { + owner = msg.sender; + } + + function donate() payable { + addGiver(msg.value); + } + + function moveFund(address _to, uint _amount) onlyowner { + uint balance = this.balance; + uint amount = _amount; + if (_amount <= this.balance) { + if (_to.send(this.balance)) { + fundMoved(_to, _amount); + } else { + throw; + } + } else { + throw; + } + } + + function addGiver(uint _amount) internal { + _giver.push(msg.sender); + _values.push(_amount); + } +} +``` + +### Dapp Front end + +and here is the front end: + +```html +
+
Donation Contract
+
+ +
+
+
+ +
+
+ +
+
+
+
+
+
+
+
+
+ + +``` + +I would suggest serving this file using `http-serve`, but you can use +any web server you like. + +Example: Dapp Front End + +### Important notice ! + +The variable `contractspec` contains the abi of the `donation` contract. +This means that if you change something in the contract interface +(function names, parameters, ...) you need to copy the new abi from +remix to the front end. + +Deploying +--------- + +Right panel / Red button `Create` + +![image](remix1.png) + +This creates a new transaction that deploys the `Donation` contract +(Mist will ask for the usual passphrase check). + +Wait for the transaction to be mined (don't forget to activate mining +`miner.start()`). Once this is done, you can use it by executing the +`moveFund` and `donate` function. But this is not what we want to +achieve. We want to run and debug those functions from the front end. + +Remix also display the address of the contract. Save it, we'll need this +address later. + +![image](remix2.png) + +Debugging +--------- + +From Mist, browse the above front end. In the first field, paste the +address of the newly created contract. Now, let's call the first +function (label `give`). + +You will need an account and a value. + +The account could be any account that is declared in the Wallet section +of Mist. This is the sender of the transaction that we are going to +create. The value should be no more than the actual balance of the +account - the unit is in wei, so just put `100` (100 wei), that should +be fine. + +Click on `Give` and wait for the transaction to be mined. + +The HTML block with id `log` is filled by all the transactions created +from the front end. It was easier for the purpose of this tutorial to +just log transactions in a div but you can have your own logging +mechanism. + +There is only one field that we need, this is the `transactionHash`. + +Copy it and switch to Remix. On the right side, the fifth panel shows a +small "bug" icon, that is the debugger. + +Paste the hash into the transaction field and click on the `play` +button. + +![image](remix3.png) + +You are now entering a debug session for the call to `donate`. + +Debugging in Remix is easier than with common tools like gdb because you +can freely move in time. Use the slider to change the current step and +click on the panels below to expand them and explore the curret state, +local variables, etc. There are also breakpoints to move between +sections of the code quickly, but more on all that later. + +At the time of this writing, there is an issue that could break the +contract creation. The a workaround for that at + . Please follow +the workaround or wait for this issue to be closed. + +Also, although retrieving a contract's storage when Remix is using the +JavaScript VM is working well, there is still work to be done when Remix +is using eth or geth as backend. diff --git a/docs/udapp.md b/docs/udapp.md new file mode 100644 index 0000000000..2332a30202 --- /dev/null +++ b/docs/udapp.md @@ -0,0 +1,52 @@ +Run & Deploy (part 2) +===================== + +## Deployed contracts + +This section in the Run tab contains a list of deployed contracts to interact with through autogenerated UI of the deployed contract (also called udapp). + +The deployed contract appears but is in its collapsed form. + +![](images/a-debug2-udapp1a.png) + +Click the sideways caret to open it up. + +![](images/a-debug3-udapp2.png) + +You will see the functions in the contract. The functions buttons can have different color buttons. + +- Functions that are `constant` or `pure` functions in Solidity have a blue buttons. Clicking one of this type does not create a new transaction. So clicking will not cause state changes - it will only return a value stored in the contract - so it won't cost you anything in gas fees. + +- Functions that changes the state of the contract are orange, clicking this type of function will cost gas and they do change the state of the contract and so they do create a new transaction. +But this transaction does not accept Ether. + +- Functions that have red buttons are `payable` functions in Solidity. Clicking one of these will create a new transaction and this transaction can accept a **value**. The **value** is put in in the Value field which is under the Gas Limit field. + +![](images/a-jvm-calling-instance.png) + + +For more information see more about [Solidity +modifier](http://solidity.readthedocs.io/en/develop/miscellaneous.html?highlight=pure#modifiers) +. + +If a function requires input parameters, well, you have to put them in. + +## Inputting parameters + +![](images/a-udapp-inputs.png) + +The input box tells you what type each parameter needs to be. + +Numbers and addresses do not need to be wrapped in double quotes. Strings need to be wrapped. + +When using the input box for parameters in its "up" display, the parameters need to be separated by a comma. In the example above the "delegate" function has 3 parameters. + +Clicking the 'down' caret brings you to the *Multi-param Manager* - where you can input the parameters one at a time. **Much less confusing!** + +![](images/a-udapp-multi-param-man.png) + +In the *Multi-param Manager*, strings do not need to be wrapped. + +Clicking the clipboard icon will encode the inputs and will copy them. Only a valid set of inputs can be encoded. + +So if you made a mistake and put a uint8 where an address should have been, clicking the clipboard here will give you an error. diff --git a/docs/unittesting.md b/docs/unittesting.md new file mode 100644 index 0000000000..27720f7f38 --- /dev/null +++ b/docs/unittesting.md @@ -0,0 +1,41 @@ +Unit Testing +============ + +Click the "double check" icon to get to the unit testing plugin. If you don't see this icon, go to the plugin manager and load up the unit testing plugin. + +![](images/a-unit-testing1.png) + +Generate test File +------------------ + +This create a new solidity file in the current folder suffixed with `_test`. +This file contains the minimun you need for running unit testing. + +Run Tests +--------- + +This execute tests. The execution is run in a separate environment and the result is displayed below. + +| Available functions | Supported types | + +| ------------- | ------------- | + +| `Assert.ok()` | `bool` | + +| `Assert.equal()` | `uint`, `int`, `bool`, `address`, `bytes32`, `string` | + +| `Assert.notEqual()` | `uint`, `int`, `bool`, `address`, `bytes32`, `string` | + +| `Assert.greaterThan()` | `uint`, `int` | + +| `Assert.lesserThan()` | `uint`, `int` | + +see [https://github.com/ethereum/remix/blob/master/remix-tests/tests/examples_4/SafeMath_test.sol](https://github.com/ethereum/remix/blob/master/remix-tests/tests/examples_4/SafeMath_test.sol) for some code sample + +Continuous integration +---------------------- + +remix-tests is also a CLI, it can be used in a continuous integration environement which support node.js. +Please find more information in the [remix-test repository](https://github.com/ethereum/remix/tree/master/remix-tests) + +See also: example [Su Squares contract](https://github.com/su-squares/ethereum-contract/tree/e542f37d4f8f6c7b07d90a6554424268384a4186) and [Travis build](https://travis-ci.org/su-squares/ethereum-contract/builds/446186067) that uses remix-tests for continuous integration testing.