diff --git a/.gitignore b/.gitignore index 4c0e6662..c0ab5df0 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ lib/linguist/samples.json /grammars /node_modules test/fixtures/ace_modes.json +/vendor/gems/ diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..d9d11dee --- /dev/null +++ b/.gitmodules @@ -0,0 +1,525 @@ +[submodule "vendor/grammars/go-tmbundle"] + path = vendor/grammars/go-tmbundle + url = https://github.com/AlanQuatermain/go-tmbundle +[submodule "vendor/grammars/PHP-Twig.tmbundle"] + path = vendor/grammars/PHP-Twig.tmbundle + url = https://github.com/Anomareh/PHP-Twig.tmbundle +[submodule "vendor/grammars/sublime-cirru"] + path = vendor/grammars/sublime-cirru + url = https://github.com/Cirru/sublime-cirru +[submodule "vendor/grammars/Sublime-Logos"] + path = vendor/grammars/Sublime-Logos + url = https://github.com/Cykey/Sublime-Logos +[submodule "vendor/grammars/SublimeBrainfuck"] + path = vendor/grammars/SublimeBrainfuck + url = https://github.com/Drako/SublimeBrainfuck +[submodule "vendor/grammars/awk-sublime"] + path = vendor/grammars/awk-sublime + url = https://github.com/JohnNilsson/awk-sublime +[submodule "vendor/grammars/Sublime-SQF-Language"] + path = vendor/grammars/Sublime-SQF-Language + url = https://github.com/JonBons/Sublime-SQF-Language +[submodule "vendor/grammars/SCSS.tmbundle"] + path = vendor/grammars/SCSS.tmbundle + url = https://github.com/MarioRicalde/SCSS.tmbundle +[submodule "vendor/grammars/Sublime-REBOL"] + path = vendor/grammars/Sublime-REBOL + url = https://github.com/Oldes/Sublime-REBOL +[submodule "vendor/grammars/Sublime-Inform"] + path = vendor/grammars/Sublime-Inform + url = https://github.com/PogiNate/Sublime-Inform +[submodule "vendor/grammars/autoitv3-tmbundle"] + path = vendor/grammars/autoitv3-tmbundle + url = https://github.com/Red-Nova-Technologies/autoitv3-tmbundle +[submodule "vendor/grammars/Sublime-VimL"] + path = vendor/grammars/Sublime-VimL + url = https://github.com/SalGnt/Sublime-VimL +[submodule "vendor/grammars/boo-sublime"] + path = vendor/grammars/boo-sublime + url = https://github.com/Shammah/boo-sublime +[submodule "vendor/grammars/ColdFusion"] + path = vendor/grammars/ColdFusion + url = https://github.com/SublimeText/ColdFusion +[submodule "vendor/grammars/NSIS"] + path = vendor/grammars/NSIS + url = https://github.com/SublimeText/NSIS +[submodule "vendor/grammars/NimLime"] + path = vendor/grammars/NimLime + url = https://github.com/Varriount/NimLime +[submodule "vendor/grammars/gradle.tmbundle"] + path = vendor/grammars/gradle.tmbundle + url = https://github.com/alkemist/gradle.tmbundle +[submodule "vendor/grammars/Sublime-Loom"] + path = vendor/grammars/Sublime-Loom + url = https://github.com/ambethia/Sublime-Loom +[submodule "vendor/grammars/VBDotNetSyntax"] + path = vendor/grammars/VBDotNetSyntax + url = https://github.com/angryant0007/VBDotNetSyntax +[submodule "vendor/grammars/cool-tmbundle"] + path = vendor/grammars/cool-tmbundle + url = https://github.com/anunayk/cool-tmbundle +[submodule "vendor/grammars/Docker.tmbundle"] + path = vendor/grammars/Docker.tmbundle + url = https://github.com/asbjornenge/Docker.tmbundle +[submodule "vendor/grammars/jasmin-sublime"] + path = vendor/grammars/jasmin-sublime + url = https://github.com/atmarksharp/jasmin-sublime +[submodule "vendor/grammars/language-clojure"] + path = vendor/grammars/language-clojure + url = https://github.com/atom/language-clojure +[submodule "vendor/grammars/language-coffee-script"] + path = vendor/grammars/language-coffee-script + url = https://github.com/atom/language-coffee-script +[submodule "vendor/grammars/language-csharp"] + path = vendor/grammars/language-csharp + url = https://github.com/atom/language-csharp +[submodule "vendor/grammars/language-gfm"] + path = vendor/grammars/language-gfm + url = https://github.com/atom/language-gfm +[submodule "vendor/grammars/language-javascript"] + path = vendor/grammars/language-javascript + url = https://github.com/atom/language-javascript +[submodule "vendor/grammars/language-python"] + path = vendor/grammars/language-python + url = https://github.com/atom/language-python +[submodule "vendor/grammars/language-sass"] + path = vendor/grammars/language-sass + url = https://github.com/atom/language-sass +[submodule "vendor/grammars/language-shellscript"] + path = vendor/grammars/language-shellscript + url = https://github.com/atom/language-shellscript +[submodule "vendor/grammars/language-yaml"] + path = vendor/grammars/language-yaml + url = https://github.com/atom/language-yaml +[submodule "vendor/grammars/sublime-sourcepawn"] + path = vendor/grammars/sublime-sourcepawn + url = https://github.com/austinwagner/sublime-sourcepawn +[submodule "vendor/grammars/Sublime-Lasso"] + path = vendor/grammars/Sublime-Lasso + url = https://github.com/bfad/Sublime-Lasso +[submodule "vendor/grammars/chapel-tmbundle"] + path = vendor/grammars/chapel-tmbundle + url = https://github.com/bholt/chapel-tmbundle +[submodule "vendor/grammars/sublime-nginx"] + path = vendor/grammars/sublime-nginx + url = https://github.com/brandonwamboldt/sublime-nginx +[submodule "vendor/grammars/bro-sublime"] + path = vendor/grammars/bro-sublime + url = https://github.com/bro/bro-sublime +[submodule "vendor/grammars/sublime_man_page_support"] + path = vendor/grammars/sublime_man_page_support + url = https://github.com/carsonoid/sublime_man_page_support +[submodule "vendor/grammars/sublime-MuPAD"] + path = vendor/grammars/sublime-MuPAD + url = https://github.com/ccreutzig/sublime-MuPAD +[submodule "vendor/grammars/nesC.tmbundle"] + path = vendor/grammars/nesC.tmbundle + url = https://github.com/cdwilson/nesC.tmbundle +[submodule "vendor/grammars/racket-tmbundle"] + path = vendor/grammars/racket-tmbundle + url = https://github.com/christophevg/racket-tmbundle +[submodule "vendor/grammars/haxe-sublime-bundle"] + path = vendor/grammars/haxe-sublime-bundle + url = https://github.com/clemos/haxe-sublime-bundle +[submodule "vendor/grammars/cucumber-tmbundle"] + path = vendor/grammars/cucumber-tmbundle + url = https://github.com/cucumber/cucumber-tmbundle +[submodule "vendor/grammars/Handlebars"] + path = vendor/grammars/Handlebars + url = https://github.com/daaain/Handlebars +[submodule "vendor/grammars/powershell.tmbundle"] + path = vendor/grammars/powershell.tmbundle + url = https://github.com/davidpeckham/powershell.tmbundle +[submodule "vendor/grammars/jade-tmbundle"] + path = vendor/grammars/jade-tmbundle + url = https://github.com/davidrios/jade-tmbundle +[submodule "vendor/grammars/elixir-tmbundle"] + path = vendor/grammars/elixir-tmbundle + url = https://github.com/elixir-lang/elixir-tmbundle +[submodule "vendor/grammars/sublime-glsl"] + path = vendor/grammars/sublime-glsl + url = https://github.com/euler0/sublime-glsl +[submodule "vendor/grammars/fancy-tmbundle"] + path = vendor/grammars/fancy-tmbundle + url = https://github.com/fancy-lang/fancy-tmbundle +[submodule "vendor/grammars/fsharpbinding"] + path = vendor/grammars/fsharpbinding + url = https://github.com/fsharp/fsharpbinding +[submodule "vendor/grammars/monkey.tmbundle"] + path = vendor/grammars/monkey.tmbundle + url = https://github.com/gingerbeardman/monkey.tmbundle +[submodule "vendor/grammars/dart-sublime-bundle"] + path = vendor/grammars/dart-sublime-bundle + url = https://github.com/guillermooo/dart-sublime-bundle +[submodule "vendor/grammars/sublimetext-cuda-cpp"] + path = vendor/grammars/sublimetext-cuda-cpp + url = https://github.com/harrism/sublimetext-cuda-cpp +[submodule "vendor/grammars/pike-textmate"] + path = vendor/grammars/pike-textmate + url = https://github.com/hww3/pike-textmate +[submodule "vendor/grammars/ceylon-sublimetext"] + path = vendor/grammars/ceylon-sublimetext + url = https://github.com/jeancharles-roger/ceylon-sublimetext +[submodule "vendor/grammars/Sublime-Text-2-OpenEdge-ABL"] + path = vendor/grammars/Sublime-Text-2-OpenEdge-ABL + url = https://github.com/jfairbank/Sublime-Text-2-OpenEdge-ABL +[submodule "vendor/grammars/sublime-rust"] + path = vendor/grammars/sublime-rust + url = https://github.com/jhasse/sublime-rust +[submodule "vendor/grammars/sublime-befunge"] + path = vendor/grammars/sublime-befunge + url = https://github.com/johanasplund/sublime-befunge +[submodule "vendor/grammars/RDoc.tmbundle"] + path = vendor/grammars/RDoc.tmbundle + url = https://github.com/joshaven/RDoc.tmbundle +[submodule "vendor/grammars/Textmate-Gosu-Bundle"] + path = vendor/grammars/Textmate-Gosu-Bundle + url = https://github.com/jpcamara/Textmate-Gosu-Bundle +[submodule "vendor/grammars/jquery-tmbundle"] + path = vendor/grammars/jquery-tmbundle + url = https://github.com/kswedberg/jquery-tmbundle +[submodule "vendor/grammars/fish-tmbundle"] + path = vendor/grammars/fish-tmbundle + url = https://github.com/l15n/fish-tmbundle +[submodule "vendor/grammars/sublime-idris"] + path = vendor/grammars/sublime-idris + url = https://github.com/laughedelic/sublime-idris +[submodule "vendor/grammars/sublime-better-typescript"] + path = vendor/grammars/sublime-better-typescript + url = https://github.com/lavrton/sublime-better-typescript +[submodule "vendor/grammars/moonscript-tmbundle"] + path = vendor/grammars/moonscript-tmbundle + url = https://github.com/leafo/moonscript-tmbundle +[submodule "vendor/grammars/Isabelle.tmbundle"] + path = vendor/grammars/Isabelle.tmbundle + url = https://github.com/lsf37/Isabelle.tmbundle +[submodule "vendor/grammars/x86-assembly-textmate-bundle"] + path = vendor/grammars/x86-assembly-textmate-bundle + url = https://github.com/lunixbochs/x86-assembly-textmate-bundle +[submodule "vendor/grammars/Alloy.tmbundle"] + path = vendor/grammars/Alloy.tmbundle + url = https://github.com/macekond/Alloy.tmbundle +[submodule "vendor/grammars/opa.tmbundle"] + path = vendor/grammars/opa.tmbundle + url = https://github.com/mads379/opa.tmbundle +[submodule "vendor/grammars/scala.tmbundle"] + path = vendor/grammars/scala.tmbundle + url = https://github.com/mads379/scala.tmbundle +[submodule "vendor/grammars/mako-tmbundle"] + path = vendor/grammars/mako-tmbundle + url = https://github.com/marconi/mako-tmbundle +[submodule "vendor/grammars/gnuplot-tmbundle"] + path = vendor/grammars/gnuplot-tmbundle + url = https://github.com/mattfoster/gnuplot-tmbundle +[submodule "vendor/grammars/idl.tmbundle"] + path = vendor/grammars/idl.tmbundle + url = https://github.com/mgalloy/idl.tmbundle +[submodule "vendor/grammars/protobuf-tmbundle"] + path = vendor/grammars/protobuf-tmbundle + url = https://github.com/michaeledgar/protobuf-tmbundle +[submodule "vendor/grammars/Sublime-Coq"] + path = vendor/grammars/Sublime-Coq + url = https://github.com/mkolosick/Sublime-Coq +[submodule "vendor/grammars/Agda.tmbundle"] + path = vendor/grammars/Agda.tmbundle + url = https://github.com/mokus0/Agda.tmbundle +[submodule "vendor/grammars/Julia.tmbundle"] + path = vendor/grammars/Julia.tmbundle + url = https://github.com/nanoant/Julia.tmbundle +[submodule "vendor/grammars/assembly.tmbundle"] + path = vendor/grammars/assembly.tmbundle + url = https://github.com/nanoant/assembly.tmbundle +[submodule "vendor/grammars/ooc.tmbundle"] + path = vendor/grammars/ooc.tmbundle + url = https://github.com/nilium/ooc.tmbundle +[submodule "vendor/grammars/LiveScript.tmbundle"] + path = vendor/grammars/LiveScript.tmbundle + url = https://github.com/paulmillr/LiveScript.tmbundle +[submodule "vendor/grammars/sublime-tea"] + path = vendor/grammars/sublime-tea + url = https://github.com/pferruggiaro/sublime-tea +[submodule "vendor/grammars/puppet-textmate-bundle"] + path = vendor/grammars/puppet-textmate-bundle + url = https://github.com/puppet-textmate-bundle/puppet-textmate-bundle +[submodule "vendor/grammars/abap.tmbundle"] + path = vendor/grammars/abap.tmbundle + url = https://github.com/pvl/abap.tmbundle +[submodule "vendor/grammars/Scalate.tmbundle"] + path = vendor/grammars/Scalate.tmbundle + url = https://github.com/scalate/Scalate.tmbundle +[submodule "vendor/grammars/mercury-tmlanguage"] + path = vendor/grammars/mercury-tmlanguage + url = https://github.com/sebgod/mercury-tmlanguage +[submodule "vendor/grammars/mathematica-tmbundle"] + path = vendor/grammars/mathematica-tmbundle + url = https://github.com/shadanan/mathematica-tmbundle +[submodule "vendor/grammars/sublime-robot-plugin"] + path = vendor/grammars/sublime-robot-plugin + url = https://github.com/shellderp/sublime-robot-plugin +[submodule "vendor/grammars/actionscript3-tmbundle"] + path = vendor/grammars/actionscript3-tmbundle + url = https://github.com/simongregory/actionscript3-tmbundle +[submodule "vendor/grammars/Sublime-QML"] + path = vendor/grammars/Sublime-QML + url = https://github.com/skozlovf/Sublime-QML +[submodule "vendor/grammars/Slash.tmbundle"] + path = vendor/grammars/Slash.tmbundle + url = https://github.com/slash-lang/Slash.tmbundle +[submodule "vendor/grammars/factor"] + path = vendor/grammars/factor + url = https://github.com/slavapestov/factor +[submodule "vendor/grammars/ruby-slim.tmbundle"] + path = vendor/grammars/ruby-slim.tmbundle + url = https://github.com/slim-template/ruby-slim.tmbundle +[submodule "vendor/grammars/SublimeXtend"] + path = vendor/grammars/SublimeXtend + url = https://github.com/staltz/SublimeXtend +[submodule "vendor/grammars/Stata.tmbundle"] + path = vendor/grammars/Stata.tmbundle + url = https://github.com/statatmbundle/Stata.tmbundle +[submodule "vendor/grammars/Vala-TMBundle"] + path = vendor/grammars/Vala-TMBundle + url = https://github.com/technosophos/Vala-TMBundle +[submodule "vendor/grammars/ant.tmbundle"] + path = vendor/grammars/ant.tmbundle + url = https://github.com/textmate/ant.tmbundle +[submodule "vendor/grammars/antlr.tmbundle"] + path = vendor/grammars/antlr.tmbundle + url = https://github.com/textmate/antlr.tmbundle +[submodule "vendor/grammars/apache.tmbundle"] + path = vendor/grammars/apache.tmbundle + url = https://github.com/textmate/apache.tmbundle +[submodule "vendor/grammars/applescript.tmbundle"] + path = vendor/grammars/applescript.tmbundle + url = https://github.com/textmate/applescript.tmbundle +[submodule "vendor/grammars/asp.tmbundle"] + path = vendor/grammars/asp.tmbundle + url = https://github.com/textmate/asp.tmbundle +[submodule "vendor/grammars/bison.tmbundle"] + path = vendor/grammars/bison.tmbundle + url = https://github.com/textmate/bison.tmbundle +[submodule "vendor/grammars/capnproto.tmbundle"] + path = vendor/grammars/capnproto.tmbundle + url = https://github.com/textmate/capnproto.tmbundle +[submodule "vendor/grammars/cmake.tmbundle"] + path = vendor/grammars/cmake.tmbundle + url = https://github.com/textmate/cmake.tmbundle +[submodule "vendor/grammars/cpp-qt.tmbundle"] + path = vendor/grammars/cpp-qt.tmbundle + url = https://github.com/textmate/cpp-qt.tmbundle +[submodule "vendor/grammars/css.tmbundle"] + path = vendor/grammars/css.tmbundle + url = https://github.com/textmate/css.tmbundle +[submodule "vendor/grammars/d.tmbundle"] + path = vendor/grammars/d.tmbundle + url = https://github.com/textmate/d.tmbundle +[submodule "vendor/grammars/diff.tmbundle"] + path = vendor/grammars/diff.tmbundle + url = https://github.com/textmate/diff.tmbundle +[submodule "vendor/grammars/dylan.tmbundle"] + path = vendor/grammars/dylan.tmbundle + url = https://github.com/textmate/dylan.tmbundle +[submodule "vendor/grammars/eiffel.tmbundle"] + path = vendor/grammars/eiffel.tmbundle + url = https://github.com/textmate/eiffel.tmbundle +[submodule "vendor/grammars/erlang.tmbundle"] + path = vendor/grammars/erlang.tmbundle + url = https://github.com/textmate/erlang.tmbundle +[submodule "vendor/grammars/fortran.tmbundle"] + path = vendor/grammars/fortran.tmbundle + url = https://github.com/textmate/fortran.tmbundle +[submodule "vendor/grammars/gettext.tmbundle"] + path = vendor/grammars/gettext.tmbundle + url = https://github.com/textmate/gettext.tmbundle +[submodule "vendor/grammars/graphviz.tmbundle"] + path = vendor/grammars/graphviz.tmbundle + url = https://github.com/textmate/graphviz.tmbundle +[submodule "vendor/grammars/groovy.tmbundle"] + path = vendor/grammars/groovy.tmbundle + url = https://github.com/textmate/groovy.tmbundle +[submodule "vendor/grammars/haskell.tmbundle"] + path = vendor/grammars/haskell.tmbundle + url = https://github.com/textmate/haskell.tmbundle +[submodule "vendor/grammars/html.tmbundle"] + path = vendor/grammars/html.tmbundle + url = https://github.com/textmate/html.tmbundle +[submodule "vendor/grammars/ini.tmbundle"] + path = vendor/grammars/ini.tmbundle + url = https://github.com/textmate/ini.tmbundle +[submodule "vendor/grammars/io.tmbundle"] + path = vendor/grammars/io.tmbundle + url = https://github.com/textmate/io.tmbundle +[submodule "vendor/grammars/java.tmbundle"] + path = vendor/grammars/java.tmbundle + url = https://github.com/textmate/java.tmbundle +[submodule "vendor/grammars/javadoc.tmbundle"] + path = vendor/grammars/javadoc.tmbundle + url = https://github.com/textmate/javadoc.tmbundle +[submodule "vendor/grammars/javascript-objective-j.tmbundle"] + path = vendor/grammars/javascript-objective-j.tmbundle + url = https://github.com/textmate/javascript-objective-j.tmbundle +[submodule "vendor/grammars/json.tmbundle"] + path = vendor/grammars/json.tmbundle + url = https://github.com/textmate/json.tmbundle +[submodule "vendor/grammars/latex.tmbundle"] + path = vendor/grammars/latex.tmbundle + url = https://github.com/textmate/latex.tmbundle +[submodule "vendor/grammars/less.tmbundle"] + path = vendor/grammars/less.tmbundle + url = https://github.com/textmate/less.tmbundle +[submodule "vendor/grammars/lilypond.tmbundle"] + path = vendor/grammars/lilypond.tmbundle + url = https://github.com/textmate/lilypond.tmbundle +[submodule "vendor/grammars/lisp.tmbundle"] + path = vendor/grammars/lisp.tmbundle + url = https://github.com/textmate/lisp.tmbundle +[submodule "vendor/grammars/logtalk.tmbundle"] + path = vendor/grammars/logtalk.tmbundle + url = https://github.com/textmate/logtalk.tmbundle +[submodule "vendor/grammars/lua.tmbundle"] + path = vendor/grammars/lua.tmbundle + url = https://github.com/textmate/lua.tmbundle +[submodule "vendor/grammars/make.tmbundle"] + path = vendor/grammars/make.tmbundle + url = https://github.com/textmate/make.tmbundle +[submodule "vendor/grammars/matlab.tmbundle"] + path = vendor/grammars/matlab.tmbundle + url = https://github.com/textmate/matlab.tmbundle +[submodule "vendor/grammars/maven.tmbundle"] + path = vendor/grammars/maven.tmbundle + url = https://github.com/textmate/maven.tmbundle +[submodule "vendor/grammars/nemerle.tmbundle"] + path = vendor/grammars/nemerle.tmbundle + url = https://github.com/textmate/nemerle.tmbundle +[submodule "vendor/grammars/ninja.tmbundle"] + path = vendor/grammars/ninja.tmbundle + url = https://github.com/textmate/ninja.tmbundle +[submodule "vendor/grammars/objective-c.tmbundle"] + path = vendor/grammars/objective-c.tmbundle + url = https://github.com/textmate/objective-c.tmbundle +[submodule "vendor/grammars/ocaml.tmbundle"] + path = vendor/grammars/ocaml.tmbundle + url = https://github.com/textmate/ocaml.tmbundle +[submodule "vendor/grammars/pascal.tmbundle"] + path = vendor/grammars/pascal.tmbundle + url = https://github.com/textmate/pascal.tmbundle +[submodule "vendor/grammars/perl.tmbundle"] + path = vendor/grammars/perl.tmbundle + url = https://github.com/textmate/perl.tmbundle +[submodule "vendor/grammars/php-smarty.tmbundle"] + path = vendor/grammars/php-smarty.tmbundle + url = https://github.com/textmate/php-smarty.tmbundle +[submodule "vendor/grammars/php.tmbundle"] + path = vendor/grammars/php.tmbundle + url = https://github.com/textmate/php.tmbundle +[submodule "vendor/grammars/postscript.tmbundle"] + path = vendor/grammars/postscript.tmbundle + url = https://github.com/textmate/postscript.tmbundle +[submodule "vendor/grammars/processing.tmbundle"] + path = vendor/grammars/processing.tmbundle + url = https://github.com/textmate/processing.tmbundle +[submodule "vendor/grammars/prolog.tmbundle"] + path = vendor/grammars/prolog.tmbundle + url = https://github.com/textmate/prolog.tmbundle +[submodule "vendor/grammars/python-django.tmbundle"] + path = vendor/grammars/python-django.tmbundle + url = https://github.com/textmate/python-django.tmbundle +[submodule "vendor/grammars/r.tmbundle"] + path = vendor/grammars/r.tmbundle + url = https://github.com/textmate/r.tmbundle +[submodule "vendor/grammars/restructuredtext.tmbundle"] + path = vendor/grammars/restructuredtext.tmbundle + url = https://github.com/textmate/restructuredtext.tmbundle +[submodule "vendor/grammars/ruby-haml.tmbundle"] + path = vendor/grammars/ruby-haml.tmbundle + url = https://github.com/textmate/ruby-haml.tmbundle +[submodule "vendor/grammars/ruby-on-rails-tmbundle"] + path = vendor/grammars/ruby-on-rails-tmbundle + url = https://github.com/textmate/ruby-on-rails-tmbundle +[submodule "vendor/grammars/scheme.tmbundle"] + path = vendor/grammars/scheme.tmbundle + url = https://github.com/textmate/scheme.tmbundle +[submodule "vendor/grammars/scilab.tmbundle"] + path = vendor/grammars/scilab.tmbundle + url = https://github.com/textmate/scilab.tmbundle +[submodule "vendor/grammars/sql.tmbundle"] + path = vendor/grammars/sql.tmbundle + url = https://github.com/textmate/sql.tmbundle +[submodule "vendor/grammars/standard-ml.tmbundle"] + path = vendor/grammars/standard-ml.tmbundle + url = https://github.com/textmate/standard-ml.tmbundle +[submodule "vendor/grammars/swift.tmbundle"] + path = vendor/grammars/swift.tmbundle + url = https://github.com/textmate/swift.tmbundle +[submodule "vendor/grammars/tcl.tmbundle"] + path = vendor/grammars/tcl.tmbundle + url = https://github.com/textmate/tcl.tmbundle +[submodule "vendor/grammars/text.tmbundle"] + path = vendor/grammars/text.tmbundle + url = https://github.com/textmate/text.tmbundle +[submodule "vendor/grammars/textile.tmbundle"] + path = vendor/grammars/textile.tmbundle + url = https://github.com/textmate/textile.tmbundle +[submodule "vendor/grammars/textmate.tmbundle"] + path = vendor/grammars/textmate.tmbundle + url = https://github.com/textmate/textmate.tmbundle +[submodule "vendor/grammars/thrift.tmbundle"] + path = vendor/grammars/thrift.tmbundle + url = https://github.com/textmate/thrift.tmbundle +[submodule "vendor/grammars/toml.tmbundle"] + path = vendor/grammars/toml.tmbundle + url = https://github.com/textmate/toml.tmbundle +[submodule "vendor/grammars/verilog.tmbundle"] + path = vendor/grammars/verilog.tmbundle + url = https://github.com/textmate/verilog.tmbundle +[submodule "vendor/grammars/xml.tmbundle"] + path = vendor/grammars/xml.tmbundle + url = https://github.com/textmate/xml.tmbundle +[submodule "vendor/grammars/smalltalk-tmbundle"] + path = vendor/grammars/smalltalk-tmbundle + url = https://github.com/tomas-stefano/smalltalk-tmbundle +[submodule "vendor/grammars/ioke-outdated"] + path = vendor/grammars/ioke-outdated + url = https://github.com/vic/ioke-outdated +[submodule "vendor/grammars/kotlin-sublime-package"] + path = vendor/grammars/kotlin-sublime-package + url = https://github.com/vkostyukov/kotlin-sublime-package +[submodule "vendor/grammars/c.tmbundle"] + path = vendor/grammars/c.tmbundle + url = https://github.com/vmg/c.tmbundle +[submodule "vendor/grammars/zephir-sublime"] + path = vendor/grammars/zephir-sublime + url = https://github.com/vmg/zephir-sublime +[submodule "vendor/grammars/llvm.tmbundle"] + path = vendor/grammars/llvm.tmbundle + url = https://github.com/whitequark/llvm.tmbundle +[submodule "vendor/grammars/sublime-nix"] + path = vendor/grammars/sublime-nix + url = https://github.com/wmertens/sublime-nix +[submodule "vendor/grammars/ada.tmbundle"] + path = vendor/grammars/ada.tmbundle + url = https://github.com/aroben/ada.tmbundle + branch = better-with-highlighting +[submodule "vendor/grammars/oz-tmbundle"] + path = vendor/grammars/oz-tmbundle + url = https://github.com/eregon/oz-tmbundle +[submodule "vendor/grammars/ebundles"] + path = vendor/grammars/ebundles + url = https://github.com/ericzou/ebundles +[submodule "vendor/grammars/sublime-mask"] + path = vendor/grammars/sublime-mask + url = https://github.com/tenbits/sublime-mask + branch = release +[submodule "vendor/grammars/sublime_cobol"] + path = vendor/grammars/sublime_cobol + url = https://bitbucket.org/bitlang/sublime_cobol +[submodule "vendor/grammars/ruby.tmbundle"] + path = vendor/grammars/ruby.tmbundle + url = https://github.com/aroben/ruby.tmbundle + branch = pl +[submodule "vendor/grammars/IDL-Syntax"] + path = vendor/grammars/IDL-Syntax + url = https://github.com/andik/IDL-Syntax +[submodule "vendor/grammars/sas.tmbundle"] + path = vendor/grammars/sas.tmbundle + url = https://github.com/rpardee/sas.tmbundle diff --git a/.travis.yml b/.travis.yml index 7b013349..e49ae8a6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,6 +4,9 @@ before_install: - git fetch origin test/attributes:test/attributes - git fetch origin test/master:test/master - sudo apt-get install libicu-dev -y + - git submodule init + - git submodule sync --quiet + - script/fast-submodule-update rvm: - 1.9.3 - 2.0.0 @@ -11,3 +14,5 @@ rvm: - 2.2 notifications: disabled: true +git: + submodules: false diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d0884dab..697f2b2f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -10,7 +10,7 @@ This can usually be solved either by adding a new filename or file name extensio ### Syntax highlighting looks wrong -Assuming your code is being detected as the right language (see above), in most cases this is due to a bug in the language grammar rather than a bug in Linguist. [`grammars.yml`][grammars] lists all the grammars we use for syntax highlighting on github.com. Find the one corresponding to your code's programming language and submit a bug report upstream. +Assuming your code is being detected as the right language (see above), in most cases this is due to a bug in the language grammar rather than a bug in Linguist. [`grammars.yml`][grammars] lists all the grammars we use for syntax highlighting on github.com. Find the one corresponding to your code's programming language and submit a bug report upstream. If you can, try to reproduce the highlighting problem in the text editor that the grammar is designed for (TextMate, Sublime Text, or Atom) and include that information in your bug report. You can also try to fix the bug yourself and submit a Pull Request. [This piece from TextMate's documentation](http://manual.macromates.com/en/language_grammars) offers a good introduction on how to work with TextMate-compatible grammars. You can test grammars using [Lightshow](https://lightshow.githubapp.com). @@ -21,7 +21,9 @@ Once the bug has been fixed upstream, please let us know and we'll pick it up fo Great! You'll need to: 0. Add an entry for your language to [`languages.yml`][languages]. -0. Add a grammar for your language to [`grammars.yml`][grammars] by running `script/download-grammars --add URL`. Please only add grammars that have a license that permits redistribution. +0. Add a grammar for your language. Please only add grammars that have a license that permits redistribution. + 0. Add your grammar as a submodule: `git submodule add https://github.com/JaneSmith/MyGrammar vendor/grammars/MyGrammar`. + 0. Add your grammar to [`grammars.yml`][grammars] by running `script/download-grammars --add vendor/grammars/MyGrammar`. 0. Add samples for your language to the [samples directory][samples]. We try only to add languages once they have some usage on GitHub, so please note in-the-wild usage examples in your pull request. In most cases we prefer that languages already be in use in hundreds of repositories before supporting them in Linguist. diff --git a/README.md b/README.md index 5eaa2f20..c2c803a8 100644 --- a/README.md +++ b/README.md @@ -141,7 +141,7 @@ But for development you are going to want to checkout out the source. To get it, git clone https://github.com/github/linguist.git cd linguist/ - bundle install + script/bootstrap To run the tests: @@ -181,7 +181,7 @@ Here's our current build status, which is hopefully green: [![Build Status](http If you are the current maintainer of this gem: 0. Create a branch for the release: `git checkout -b cut-release-vxx.xx.xx` - 0. Make sure your local dependencies are up to date: `bundle install` + 0. Make sure your local dependencies are up to date: `script/bootstrap` 0. Ensure that samples are updated: `bundle exec rake samples` 0. Ensure that tests are green: `bundle exec rake test` 0. Bump gem version in `lib/linguist/version.rb`. For example, [like this](https://github.com/github/linguist/commit/8d2ea90a5ba3b2fe6e1508b7155aa4632eea2985). diff --git a/grammars.yml b/grammars.yml index 62dfcb26..953e83b9 100644 --- a/grammars.yml +++ b/grammars.yml @@ -9,8 +9,6 @@ http://svn.textmate.org/trunk/Review/Bundles/Forth.tmbundle: - source.forth http://svn.textmate.org/trunk/Review/Bundles/Parrot.tmbundle: - source.parrot.pir -http://svn.textmate.org/trunk/Review/Bundles/Ruby%20Sass.tmbundle: -- source.sass http://svn.textmate.org/trunk/Review/Bundles/SecondLife%20LSL.tmbundle: - source.lsl http://svn.textmate.org/trunk/Review/Bundles/VHDL.tmbundle: @@ -20,187 +18,29 @@ http://svn.textmate.org/trunk/Review/Bundles/XQuery.tmbundle: https://bitbucket.org/Clams/sublimesystemverilog/get/default.tar.gz: - source.systemverilog - source.ucfconstraints -https://bitbucket.org/bitlang/sublime_cobol/raw/b0e9c44ac5f7a2fb553421aa986b35854cbfda4a/COBOL.tmLanguage: -- source.cobol https://fan.googlecode.com/hg-history/Build%201.0.55/adm/tools/textmate/Fan.tmbundle/Syntaxes/Fan.tmLanguage: - source.fan -https://github.com/AlanQuatermain/go-tmbundle: -- source.go -https://github.com/Anomareh/PHP-Twig.tmbundle: -- text.html.twig -https://github.com/Cirru/sublime-cirru/raw/master/Cirru.tmLanguage: -- source.cirru -https://github.com/Cykey/Sublime-Logos: -- source.logos -https://github.com/Drako/SublimeBrainfuck/raw/master/Brainfuck.tmLanguage: -- source.bf -https://github.com/JohnNilsson/awk-sublime/raw/master/AWK.tmLanguage: -- source.awk -https://github.com/JonBons/Sublime-SQF-Language: -- source.sqf -https://github.com/MarioRicalde/SCSS.tmbundle: -- source.scss -https://github.com/Oldes/Sublime-REBOL: -- source.rebol -https://github.com/PogiNate/Sublime-Inform: -- source.Inform7 -https://github.com/Red-Nova-Technologies/autoitv3-tmbundle: -- source.autoit.3 -https://github.com/SalGnt/Sublime-VimL: -- source.viml -https://github.com/Shammah/boo-sublime/raw/master/Boo.tmLanguage: -- source.boo -https://github.com/SublimeText/ColdFusion: +vendor/grammars/Agda.tmbundle: +- source.agda +vendor/grammars/Alloy.tmbundle: +- source.alloy +vendor/grammars/ColdFusion: - source.cfscript - source.cfscript.cfc - text.cfml.basic - text.html.cfm -https://github.com/SublimeText/NSIS: -- source.nsis -https://github.com/Varriount/NimLime: -- source.nimrod -- source.nimrod_filter -- source.nimrodcfg -https://github.com/alkemist/gradle.tmbundle: -- source.groovy.gradle -https://github.com/ambethia/Sublime-Loom: -- source.loomscript -https://github.com/angryant0007/VBDotNetSyntax: -- source.vbnet -https://github.com/anunayk/cool-tmbundle: -- source.cool -https://github.com/aroben/ada.tmbundle/raw/c45eed4d5f98fe3bcbbffbb9e436601ab5bbde4b/Syntaxes/Ada.plist: -- source.ada -https://github.com/aroben/ruby.tmbundle@4636a3023153c3034eb6ffc613899ba9cf33b41f: -- source.ruby -- text.html.erb -https://github.com/asbjornenge/Docker.tmbundle: +vendor/grammars/Docker.tmbundle: - source.dockerfile -https://github.com/atom/language-clojure: -- source.clojure -https://github.com/atom/language-coffee-script: -- source.coffee -- source.litcoffee -https://github.com/atom/language-csharp: -- source.cs -- source.csx -- source.nant-build -https://github.com/atom/language-javascript: -- source.js -- source.js.regexp -https://github.com/atom/language-python: -- source.python -- source.regexp.python -- text.python.traceback -https://github.com/atom/language-shellscript: -- source.shell -- text.shell-session -https://github.com/austinwagner/sublime-sourcepawn: -- source.sp -https://github.com/bfad/Sublime-Lasso: -- file.lasso -https://github.com/bholt/chapel-tmbundle: -- source.chapel -https://github.com/brandonwamboldt/sublime-nginx: -- source.nginx -https://github.com/bro/bro-sublime: -- source.bro -https://github.com/carsonoid/sublime_man_page_support/raw/master/man-groff.tmLanguage: -- text.groff -https://github.com/ccreutzig/sublime-MuPAD: -- source.mupad -https://github.com/cdwilson/nesC.tmbundle: -- source.nesc -https://github.com/christophevg/racket-tmbundle: -- source.racket -https://github.com/clemos/haxe-sublime-bundle: -- source.erazor -- source.haxe.2 -- source.hss.1 -- source.hxml -- source.nmml -https://github.com/cucumber/cucumber-tmbundle: -- source.ruby.rspec.cucumber.steps -- text.gherkin.feature -https://github.com/daaain/Handlebars/raw/master/Handlebars.tmLanguage: +vendor/grammars/Handlebars: - text.html.handlebars -https://github.com/davidpeckham/powershell.tmbundle: -- source.powershell -https://github.com/davidrios/jade-tmbundle: -- source.jade -- source.pyjade -https://github.com/elixir-lang/elixir-tmbundle: -- source.elixir -- text.elixir -- text.html.elixir -https://github.com/ericzou/ebundles/raw/master/Bundles/MSDOS%20batch%20file.tmbundle/Syntaxes/MSDOS%20batch%20file.tmLanguage: -- source.dosbatch -https://github.com/euler0/sublime-glsl/raw/master/GLSL.tmLanguage: -- source.glsl -https://github.com/fancy-lang/fancy-tmbundle: -- source.fancy -https://github.com/fsharp/fsharpbinding: -- source.fsharp -https://github.com/gingerbeardman/monkey.tmbundle: -- source.monkey -https://github.com/guillermooo/dart-sublime-bundle/raw/master/Dart.tmLanguage: -- source.dart -https://github.com/harrism/sublimetext-cuda-cpp/raw/master/cuda-c%2B%2B.tmLanguage: -- source.cuda-c++ -https://github.com/hww3/pike-textmate: -- source.pike -https://github.com/jeancharles-roger/ceylon-sublimetext/raw/master/Ceylon.tmLanguage: -- source.ceylon -https://github.com/jfairbank/Sublime-Text-2-OpenEdge-ABL: -- source.abl -https://github.com/jhasse/sublime-rust: -- source.rust -https://github.com/johanasplund/sublime-befunge/raw/master/Befunge-93.tmLanguage: -- source.befunge -https://github.com/joshaven/RDoc.tmbundle: -- text.rdoc -https://github.com/jpcamara/Textmate-Gosu-Bundle/raw/master/Gosu.tmbundle/Syntaxes/Gosu.tmLanguage: -- source.gosu.2 -https://github.com/kswedberg/jquery-tmbundle: -- source.js.jquery -https://github.com/laughedelic/sublime-idris/raw/master/Idris.tmLanguage: -- source.idris -https://github.com/lavrton/sublime-better-typescript: -- source.ts -https://github.com/leafo/moonscript-tmbundle: -- source.moonscript -https://github.com/lsf37/Isabelle.tmbundle: +vendor/grammars/IDL-Syntax: +- source.webidl +vendor/grammars/Isabelle.tmbundle: +- source.isabelle.root - source.isabelle.theory -https://github.com/lunixbochs/x86-assembly-textmate-bundle: -- source.asm.x86 -https://github.com/macekond/Alloy.tmbundle: -- source.alloy -https://github.com/mads379/opa.tmbundle: -- source.opa -https://github.com/mads379/scala.tmbundle: -- source.sbt -- source.scala -https://github.com/marconi/mako-tmbundle: -- text.html.mako -https://github.com/mattfoster/gnuplot-tmbundle: -- source.gnuplot -https://github.com/mgalloy/idl.tmbundle: -- source.idl -- source.idl-dlm -- text.idl-idldoc -https://github.com/michaeledgar/protobuf-tmbundle: -- source.protobuf -https://github.com/mkolosick/Sublime-Coq/raw/master/Coq.tmLanguage: -- source.coq -https://github.com/mokus0/Agda.tmbundle: -- source.agda -https://github.com/nanoant/Julia.tmbundle: +vendor/grammars/Julia.tmbundle: - source.julia -https://github.com/nanoant/assembly.tmbundle/raw/master/Syntaxes/objdump%20C%2B%2B.tmLanguage: -- objdump.x86asm -https://github.com/nilium/ooc.tmbundle: -- source.ooc -https://github.com/paulmillr/LiveScript.tmbundle: +vendor/grammars/LiveScript.tmbundle: - source.livescript https://github.com/pferruggiaro/sublime-tea: - source.tea @@ -208,218 +48,408 @@ https://github.com/puppet-textmate-bundle/puppet-textmate-bundle: - source.puppet https://github.com/pvl/abap.tmbundle: - source.abap +vendor/grammars/NSIS: +- source.nsis +vendor/grammars/NimLime: +- source.nimrod +- source.nimrod_filter +- source.nimrodcfg +vendor/grammars/PHP-Twig.tmbundle: +- text.html.twig +vendor/grammars/RDoc.tmbundle: +- text.rdoc https://github.com/saltstack/atom-salt: - source.python.salt - source.yaml.salt https://github.com/scalate/Scalate.tmbundle: - source.scaml - text.html.ssp -https://github.com/shadanan/mathematica-tmbundle: -- source.mathematica -https://github.com/shellderp/sublime-robot-plugin: -- text.robot -https://github.com/simongregory/actionscript3-tmbundle: +vendor/grammars/SCSS.tmbundle: +- source.scss +vendor/grammars/Slash.tmbundle: +- text.html.slash +vendor/grammars/Stata.tmbundle: +- source.mata +- source.stata +vendor/grammars/Sublime-Coq: +- source.coq +vendor/grammars/Sublime-Inform: +- source.Inform7 +vendor/grammars/Sublime-Lasso: +- file.lasso +vendor/grammars/Sublime-Logos: +- source.logos +vendor/grammars/Sublime-Loom: +- source.loomscript +vendor/grammars/Sublime-QML: +- source.qml +vendor/grammars/Sublime-REBOL: +- source.rebol +vendor/grammars/Sublime-SQF-Language: +- source.sqf +vendor/grammars/Sublime-Text-2-OpenEdge-ABL: +- source.abl +vendor/grammars/Sublime-VimL: +- source.viml +vendor/grammars/SublimeBrainfuck: +- source.bf +vendor/grammars/SublimeXtend: +- source.xtend +vendor/grammars/Textmate-Gosu-Bundle: +- source.gosu.2 +vendor/grammars/VBDotNetSyntax: +- source.vbnet +vendor/grammars/Vala-TMBundle: +- source.vala +vendor/grammars/abap.tmbundle: +- source.abap +vendor/grammars/actionscript3-tmbundle: - source.actionscript.3 - text.html.asdoc - text.xml.flex-config -https://github.com/skozlovf/Sublime-QML: -- source.qml -https://github.com/slash-lang/Slash.tmbundle: -- text.html.slash -https://github.com/slavapestov/factor/raw/master/misc/Factor.tmbundle/Syntaxes/Factor.tmLanguage: -- source.factor -https://github.com/slim-template/ruby-slim.tmbundle: -- text.slim -https://github.com/staltz/SublimeXtend: -- source.xtend -https://github.com/statatmbundle/Stata.tmbundle: -- source.mata -- source.stata -https://github.com/technosophos/Vala-TMBundle: -- source.vala -https://github.com/textmate/ant.tmbundle: +vendor/grammars/ada.tmbundle: +- source.ada +vendor/grammars/ant.tmbundle: - text.xml.ant -https://github.com/textmate/antlr.tmbundle: +vendor/grammars/antlr.tmbundle: - source.antlr -https://github.com/textmate/apache.tmbundle: +vendor/grammars/apache.tmbundle: - source.apache-config - source.apache-config.mod_perl -https://github.com/textmate/applescript.tmbundle: +vendor/grammars/applescript.tmbundle: - source.applescript -https://github.com/textmate/asp.tmbundle: +vendor/grammars/asp.tmbundle: - source.asp - text.html.asp -https://github.com/textmate/bison.tmbundle: +vendor/grammars/assembly.tmbundle: +- objdump.x86asm +- source.x86asm +vendor/grammars/autoitv3-tmbundle: +- source.autoit.3 +vendor/grammars/awk-sublime: +- source.awk +vendor/grammars/bison.tmbundle: - source.bison -https://github.com/textmate/c.tmbundle: +vendor/grammars/boo-sublime: +- source.boo +vendor/grammars/bro-sublime: +- source.bro +vendor/grammars/c.tmbundle: - source.c - source.c++ - source.c.platform -https://github.com/textmate/capnproto.tmbundle: +vendor/grammars/capnproto.tmbundle: - source.capnp -https://github.com/textmate/cmake.tmbundle: +vendor/grammars/ceylon-sublimetext: +- module.ceylon +- source.ceylon +vendor/grammars/chapel-tmbundle: +- source.chapel +vendor/grammars/cmake.tmbundle: - source.cache.cmake - source.cmake -https://github.com/textmate/cpp-qt.tmbundle: +vendor/grammars/cool-tmbundle: +- source.cool +vendor/grammars/cpp-qt.tmbundle: - source.c++.qt - source.qmake -https://github.com/textmate/css.tmbundle: +vendor/grammars/css.tmbundle: - source.css -https://github.com/textmate/d.tmbundle: +vendor/grammars/cucumber-tmbundle: +- source.ruby.rspec.cucumber.steps +- text.gherkin.feature +vendor/grammars/d.tmbundle: - source.d -https://github.com/textmate/diff.tmbundle: +vendor/grammars/dart-sublime-bundle: +- source.dart +- source.pubspec +- text.dart-doccomments +vendor/grammars/diff.tmbundle: - source.diff -https://github.com/textmate/dylan.tmbundle: +vendor/grammars/dylan.tmbundle: - source.dylan - source.lid - source.makegen -https://github.com/textmate/eiffel.tmbundle: +vendor/grammars/ebundles/Bundles/MSDOS batch file.tmbundle: +- source.dosbatch +vendor/grammars/eiffel.tmbundle: - source.eiffel -https://github.com/textmate/erlang.tmbundle: +vendor/grammars/elixir-tmbundle: +- source.elixir +- text.elixir +- text.html.elixir +vendor/grammars/erlang.tmbundle: - source.erlang - text.html.erlang.yaws -https://github.com/textmate/fortran.tmbundle: +vendor/grammars/factor: +- source.factor +- text.html.factor +vendor/grammars/fancy-tmbundle: +- source.fancy +vendor/grammars/fish-tmbundle: +- source.fish +vendor/grammars/fortran.tmbundle: - source.fortran - source.fortran.modern -https://github.com/textmate/gettext.tmbundle: +vendor/grammars/fsharpbinding: +- source.fsharp +vendor/grammars/gettext.tmbundle: - source.po -https://github.com/textmate/graphviz.tmbundle: +vendor/grammars/gnuplot-tmbundle: +- source.gnuplot +vendor/grammars/go-tmbundle: +- source.go +vendor/grammars/gradle.tmbundle: +- source.groovy.gradle +vendor/grammars/graphviz.tmbundle: - source.dot -https://github.com/textmate/groovy.tmbundle: +vendor/grammars/groovy.tmbundle: - source.groovy -https://github.com/textmate/haskell.tmbundle: +vendor/grammars/haskell.tmbundle: - source.haskell - text.tex.latex.haskell -https://github.com/textmate/html.tmbundle: +vendor/grammars/haxe-sublime-bundle: +- source.erazor +- source.haxe.2 +- source.hss.1 +- source.hxml +- source.nmml +vendor/grammars/html.tmbundle: - text.html.basic -https://github.com/textmate/ini.tmbundle: +vendor/grammars/idl.tmbundle: +- source.idl +- source.idl-dlm +- text.idl-idldoc +vendor/grammars/ini.tmbundle: - source.ini -https://github.com/textmate/io.tmbundle: +vendor/grammars/io.tmbundle: - source.io -https://github.com/textmate/java.tmbundle: +vendor/grammars/ioke-outdated: +- source.ioke +vendor/grammars/jade-tmbundle: +- source.jade +- source.pyjade +vendor/grammars/jasmin-sublime: +- source.jasmin +vendor/grammars/java.tmbundle: - source.java - source.java-properties - text.html.jsp - text.junit-test-report -https://github.com/textmate/javadoc.tmbundle: +vendor/grammars/javadoc.tmbundle: - text.html.javadoc -https://github.com/textmate/javascript-objective-j.tmbundle: +vendor/grammars/javascript-objective-j.tmbundle: - source.js.objj -https://github.com/textmate/json.tmbundle: +vendor/grammars/jquery-tmbundle: +- source.js.jquery +vendor/grammars/json.tmbundle: - source.json -https://github.com/textmate/latex.tmbundle: +vendor/grammars/kotlin-sublime-package: +- source.Kotlin +vendor/grammars/language-clojure: +- source.clojure +vendor/grammars/language-coffee-script: +- source.coffee +- source.litcoffee +vendor/grammars/language-csharp: +- source.cs +- source.csx +- source.nant-build +vendor/grammars/language-gfm: +- source.gfm +vendor/grammars/language-javascript: +- source.js +- source.js.regexp +vendor/grammars/language-python: +- source.python +- source.regexp.python +- text.python.traceback +vendor/grammars/language-sass: +- source.css.scss +- source.sass +vendor/grammars/language-shellscript: +- source.shell +- text.shell-session +vendor/grammars/language-yaml: +- source.yaml +vendor/grammars/latex.tmbundle: - text.bibtex - text.log.latex - text.tex - text.tex.latex - text.tex.latex.beamer - text.tex.latex.memoir -https://github.com/textmate/less.tmbundle: +vendor/grammars/less.tmbundle: - source.css.less -https://github.com/textmate/lilypond.tmbundle: +vendor/grammars/lilypond.tmbundle: - source.lilypond -https://github.com/textmate/lisp.tmbundle: +vendor/grammars/lisp.tmbundle: - source.lisp -https://github.com/textmate/logtalk.tmbundle: +vendor/grammars/llvm.tmbundle: +- source.llvm +vendor/grammars/logtalk.tmbundle: - source.logtalk -https://github.com/textmate/lua.tmbundle: +vendor/grammars/lua.tmbundle: - source.lua -https://github.com/textmate/make.tmbundle: +vendor/grammars/make.tmbundle: - source.makefile -https://github.com/textmate/markdown.tmbundle: -- text.html.markdown -https://github.com/textmate/matlab.tmbundle: +vendor/grammars/mako-tmbundle: +- text.html.mako +vendor/grammars/mathematica-tmbundle: +- source.mathematica +vendor/grammars/matlab.tmbundle: - source.matlab - source.octave -https://github.com/textmate/maven.tmbundle: +vendor/grammars/maven.tmbundle: - text.xml.pom -https://github.com/textmate/nemerle.tmbundle: +vendor/grammars/mercury-tmlanguage: +- source.mercury +vendor/grammars/monkey.tmbundle: +- source.monkey +vendor/grammars/moonscript-tmbundle: +- source.moonscript +vendor/grammars/nemerle.tmbundle: - source.nemerle -https://github.com/textmate/ninja.tmbundle: +vendor/grammars/nesC.tmbundle: +- source.nesc +vendor/grammars/ninja.tmbundle: - source.ninja -https://github.com/textmate/objective-c.tmbundle: +vendor/grammars/objective-c.tmbundle: - source.objc - source.objc++ - source.objc.platform - source.strings -https://github.com/textmate/ocaml.tmbundle: +vendor/grammars/ocaml.tmbundle: - source.camlp4.ocaml - source.ocaml - source.ocamllex - source.ocamlyacc -https://github.com/textmate/pascal.tmbundle: +vendor/grammars/ooc.tmbundle: +- source.ooc +vendor/grammars/opa.tmbundle: +- source.opa +vendor/grammars/oz-tmbundle/Syntaxes/Oz.tmLanguage: +- source.oz +vendor/grammars/pascal.tmbundle: - source.pascal -https://github.com/textmate/perl.tmbundle: +vendor/grammars/perl.tmbundle: - source.perl -https://github.com/textmate/php-smarty.tmbundle: +vendor/grammars/php-smarty.tmbundle: - source.smarty -https://github.com/textmate/php.tmbundle: +vendor/grammars/php.tmbundle: - text.html.php -https://github.com/textmate/postscript.tmbundle: +vendor/grammars/pike-textmate: +- source.pike +vendor/grammars/postscript.tmbundle: - source.postscript -https://github.com/textmate/processing.tmbundle: +vendor/grammars/powershell.tmbundle: +- source.powershell +vendor/grammars/processing.tmbundle: - source.processing -https://github.com/textmate/prolog.tmbundle: +vendor/grammars/prolog.tmbundle: - source.prolog -https://github.com/textmate/python-django.tmbundle: +vendor/grammars/protobuf-tmbundle: +- source.protobuf +vendor/grammars/puppet-textmate-bundle: +- source.puppet +vendor/grammars/python-django.tmbundle: - source.python.django - text.html.django -https://github.com/textmate/r.tmbundle: +vendor/grammars/r.tmbundle: - source.r - text.tex.latex.rd -https://github.com/textmate/restructuredtext.tmbundle: +vendor/grammars/racket-tmbundle: +- source.racket +vendor/grammars/restructuredtext.tmbundle: - text.restructuredtext -https://github.com/textmate/ruby-haml.tmbundle: +vendor/grammars/ruby-haml.tmbundle: - text.haml -https://github.com/textmate/ruby-on-rails-tmbundle: +vendor/grammars/ruby-on-rails-tmbundle: - source.js.erb.rails - source.ruby.rails - source.ruby.rails.rjs - source.sql.ruby - text.html.erb.rails -https://github.com/textmate/scheme.tmbundle: +vendor/grammars/ruby-slim.tmbundle: +- text.slim +vendor/grammars/ruby.tmbundle: +- source.ruby +- text.html.erb +vendor/grammars/sas.tmbundle: +- source.SASLog +- source.sas +vendor/grammars/scala.tmbundle: +- source.sbt +- source.scala +vendor/grammars/scheme.tmbundle: - source.scheme -https://github.com/textmate/scilab.tmbundle: +vendor/grammars/scilab.tmbundle: - source.scilab -https://github.com/textmate/sql.tmbundle: +vendor/grammars/smalltalk-tmbundle: +- source.smalltalk +vendor/grammars/sql.tmbundle: - source.sql -https://github.com/textmate/standard-ml.tmbundle: +vendor/grammars/standard-ml.tmbundle: - source.cm - source.ml -https://github.com/textmate/swift.tmbundle: +vendor/grammars/sublime-MuPAD: +- source.mupad +vendor/grammars/sublime-befunge: +- source.befunge +vendor/grammars/sublime-better-typescript: +- source.ts +vendor/grammars/sublime-cirru: +- source.cirru +vendor/grammars/sublime-glsl: +- source.essl +- source.glsl +vendor/grammars/sublime-idris: +- source.idris +vendor/grammars/sublime-mask: +- source.mask +vendor/grammars/sublime-nginx: +- source.nginx +vendor/grammars/sublime-nix: +- source.nix +vendor/grammars/sublime-robot-plugin: +- text.robot +vendor/grammars/sublime-rust: +- source.rust +vendor/grammars/sublime-sourcepawn: +- source.sp +vendor/grammars/sublime-tea: +- source.tea +vendor/grammars/sublime_cobol: +- source.acucobol +- source.cobol +- source.opencobol +vendor/grammars/sublime_man_page_support: +- source.man +- text.groff +vendor/grammars/sublimetext-cuda-cpp: +- source.cuda-c++ +vendor/grammars/swift.tmbundle: - source.swift -https://github.com/textmate/tcl.tmbundle: +vendor/grammars/tcl.tmbundle: - source.tcl - text.html.tcl -https://github.com/textmate/text.tmbundle: +vendor/grammars/text.tmbundle: - text.plain -https://github.com/textmate/textile.tmbundle: +vendor/grammars/textile.tmbundle: - text.html.textile -https://github.com/textmate/textmate.tmbundle: +vendor/grammars/textmate.tmbundle: - source.regexp.oniguruma - source.tm-properties -https://github.com/textmate/thrift.tmbundle: +vendor/grammars/thrift.tmbundle: - source.thrift -https://github.com/textmate/toml.tmbundle: +vendor/grammars/toml.tmbundle: - source.toml -https://github.com/textmate/verilog.tmbundle: +vendor/grammars/verilog.tmbundle: - source.verilog -https://github.com/textmate/xml.tmbundle: +vendor/grammars/x86-assembly-textmate-bundle: +- source.asm.x86 +vendor/grammars/xml.tmbundle: - text.xml - text.xml.xsl -https://github.com/textmate/yaml.tmbundle: -- source.yaml -https://github.com/tomas-stefano/smalltalk-tmbundle: -- source.smalltalk -https://github.com/vic/ioke-outdated/raw/master/share/TextMate/Ioke.tmbundle/Syntaxes/Ioke.tmLanguage: -- source.ioke -https://github.com/vkostyukov/kotlin-sublime-package: -- source.Kotlin -https://github.com/vmg/zephir-sublime: +vendor/grammars/zephir-sublime: - source.php.zephir -https://github.com/whitequark/llvm.tmbundle: -- source.llvm -https://github.com/wmertens/sublime-nix: -- source.nix -https://raw.githubusercontent.com/eregon/oz-tmbundle/master/Syntaxes/Oz.tmLanguage: -- source.oz diff --git a/lib/linguist/heuristics.rb b/lib/linguist/heuristics.rb index c496b8f8..c96a93f0 100644 --- a/lib/linguist/heuristics.rb +++ b/lib/linguist/heuristics.rb @@ -61,6 +61,14 @@ module Linguist @heuristic.call(data) end + disambiguate "BitBake", "BlitzBasic" do |data| + if /^\s*; /.match(data) || data.include?("End Function") + Language["BlitzBasic"] + elsif /^\s*(# |include|require)\b/.match(data) + Language["BitBake"] + end + end + disambiguate "Objective-C", "C++", "C" do |data| if (/@(interface|class|protocol|property|end|synchronised|selector|implementation)\b/.match(data)) Language["Objective-C"] @@ -129,7 +137,7 @@ module Linguist disambiguate "FORTRAN", "Forth" do |data| if /^: /.match(data) Language["Forth"] - elsif /^([c*][^a-z]| subroutine\s)/i.match(data) + elsif /^([c*][^a-z]| (subroutine|program)\s|!)/i.match(data) Language["FORTRAN"] end end @@ -156,5 +164,22 @@ module Linguist end end + disambiguate "TypeScript", "XML" do |data| + if data.include?(" "python2" - script.sub! $1, '' if script =~ /(\.\d+)$/ + script.sub! /(\.\d+)$/, '' # Check for multiline shebang hacks that call `exec` if script == 'sh' && - lines.first(5).any? { |l| l.match(/exec (\w+).+\$0.+\$@/) } + data.lines.first(5).any? { |l| l.match(/exec (\w+).+\$0.+\$@/) } script = $1 end diff --git a/lib/linguist/vendor.yml b/lib/linguist/vendor.yml index a68f0a81..4b8299f4 100644 --- a/lib/linguist/vendor.yml +++ b/lib/linguist/vendor.yml @@ -32,6 +32,7 @@ # Erlang bundles - ^rebar$ +- erlang.mk # Go dependencies - Godeps/_workspace/ diff --git a/lib/linguist/version.rb b/lib/linguist/version.rb index 45fb0292..bce0aef5 100644 --- a/lib/linguist/version.rb +++ b/lib/linguist/version.rb @@ -1,3 +1,3 @@ module Linguist - VERSION = "4.2.3" + VERSION = "4.2.5" end diff --git a/samples/BitBake/gstreamer-libav.bb b/samples/BitBake/gstreamer-libav.bb new file mode 100644 index 00000000..803bcf2f --- /dev/null +++ b/samples/BitBake/gstreamer-libav.bb @@ -0,0 +1,25 @@ +include gstreamer1.0-libav.inc + +LIC_FILES_CHKSUM = "file://COPYING;md5=b234ee4d69f5fce4486a80fdaf4a4263 \ + file://COPYING.LIB;md5=6762ed442b3822387a51c92d928ead0d \ + file://ext/libav/gstav.h;beginline=1;endline=18;md5=a752c35267d8276fd9ca3db6994fca9c \ + file://gst-libs/ext/libav/LICENSE;md5=23a54f59b82572c203a559346e89ed57 \ + file://gst-libs/ext/libav/COPYING.GPLv2;md5=b234ee4d69f5fce4486a80fdaf4a4263 \ + file://gst-libs/ext/libav/COPYING.GPLv3;md5=d32239bcb673463ab874e80d47fae504 \ + file://gst-libs/ext/libav/COPYING.LGPLv2.1;md5=bd7a443320af8c812e4c18d1b79df004 \ + file://gst-libs/ext/libav/COPYING.LGPLv3;md5=e6a600fd5e1d9cbde2d983680233ad02" + +SRC_URI = " \ + http://gstreamer.freedesktop.org/src/gst-libav/gst-libav-${PV}.tar.xz \ + file://0001-Disable-yasm-for-libav-when-disable-yasm.patch \ + " +SRC_URI[md5sum] = "86540dee14d31daf976eb2713f2294f3" +SRC_URI[sha256sum] = "585eb7971006100ad771a852e07bd2f3e23bcc6eb0b1253a40b5a0e40e4e7418" + +LIBAV_EXTRA_CONFIGURE_COMMON_ARG = "--target-os=linux \ + --cc='${CC}' --as='${CC}' --ld='${CC}' --nm='${NM}' --ar='${AR}' \ + --ranlib='${RANLIB}' \ + ${GSTREAMER_1_0_DEBUG}" + +S = "${WORKDIR}/gst-libav-${PV}" + diff --git a/samples/BitBake/qtbase-native.bb b/samples/BitBake/qtbase-native.bb new file mode 100644 index 00000000..5d24f48a --- /dev/null +++ b/samples/BitBake/qtbase-native.bb @@ -0,0 +1,13 @@ +require qt5-git.inc +require ${PN}.inc + +do_install_append() { + # for modules which are still using syncqt and call qtPrepareTool(QMAKE_SYNCQT, syncqt) + # e.g. qt3d, qtwayland + ln -sf syncqt.pl ${D}${OE_QMAKE_PATH_QT_BINS}/syncqt +} + +QT_MODULE_BRANCH = "release" +# v5.2.1 + 168 commits +SRCREV = "08cbbde61778276ccdda73d89fd64d02c623779f" + diff --git a/samples/C#/AssemblyInfo.cs b/samples/C#/AssemblyInfo.cs new file mode 100644 index 00000000..1ef68427 --- /dev/null +++ b/samples/C#/AssemblyInfo.cs @@ -0,0 +1,26 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// Information about this assembly is defined by the following attributes. +// Change them to the values specific to your project. + +[assembly: AssemblyTitle("Simple")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}". +// The form "{Major}.{Minor}.*" will automatically update the build and revision, +// and "{Major}.{Minor}.{Build}.*" will update just the revision. + +[assembly: AssemblyVersion("1.0.*")] + +// The following attributes are used to specify the signing key for the assembly, +// if desired. See the Mono documentation for more information about signing. + +//[assembly: AssemblyDelaySign(false)] +//[assembly: AssemblyKeyFile("")] diff --git a/samples/C#/BsonPropertyValue.cs b/samples/C#/BsonPropertyValue.cs new file mode 100644 index 00000000..94d27c88 --- /dev/null +++ b/samples/C#/BsonPropertyValue.cs @@ -0,0 +1,20 @@ +using System; + +namespace MongoDB.Serialization.Descriptors +{ + internal class BsonPropertyValue + { + public bool IsDictionary { get; private set; } + + public Type Type { get; private set; } + + public object Value { get; private set; } + + public BsonPropertyValue(Type type, object value, bool isDictionary) + { + Type = type; + Value = value; + IsDictionary = isDictionary; + } + } +} \ No newline at end of file diff --git a/samples/C#/MongoExpressionVisitor.cs b/samples/C#/MongoExpressionVisitor.cs new file mode 100644 index 00000000..b7a1effe --- /dev/null +++ b/samples/C#/MongoExpressionVisitor.cs @@ -0,0 +1,153 @@ +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Linq.Expressions; + +namespace MongoDB.Linq.Expressions +{ + internal class MongoExpressionVisitor : ExpressionVisitor + { + protected override Expression Visit(Expression exp) + { + if (exp == null) + return null; + switch ((MongoExpressionType)exp.NodeType) + { + case MongoExpressionType.Collection: + return VisitCollection((CollectionExpression)exp); + case MongoExpressionType.Field: + return VisitField((FieldExpression)exp); + case MongoExpressionType.Projection: + return VisitProjection((ProjectionExpression)exp); + case MongoExpressionType.Select: + return VisitSelect((SelectExpression)exp); + case MongoExpressionType.Aggregate: + return VisitAggregate((AggregateExpression)exp); + case MongoExpressionType.AggregateSubquery: + return VisitAggregateSubquery((AggregateSubqueryExpression)exp); + case MongoExpressionType.Scalar: + return VisitScalar((ScalarExpression)exp); + default: + return base.Visit(exp); + } + } + + protected virtual Expression VisitAggregate(AggregateExpression aggregate) + { + var exp = Visit(aggregate.Argument); + if (exp != aggregate.Argument) + return new AggregateExpression(aggregate.Type, aggregate.AggregateType, exp, aggregate.Distinct); + + return aggregate; + } + + protected virtual Expression VisitAggregateSubquery(AggregateSubqueryExpression aggregateSubquery) + { + Expression e = Visit(aggregateSubquery.AggregateAsSubquery); + ScalarExpression subquery = (ScalarExpression)e; + if (subquery != aggregateSubquery.AggregateAsSubquery) + return new AggregateSubqueryExpression(aggregateSubquery.GroupByAlias, aggregateSubquery.AggregateInGroupSelect, subquery); + return aggregateSubquery; + } + + protected virtual Expression VisitCollection(CollectionExpression collection) + { + return collection; + } + + protected virtual Expression VisitField(FieldExpression field) + { + var e = Visit(field.Expression); + if (field.Expression != e) + field = new FieldExpression(e, field.Alias, field.Name); + + return field; + } + + protected virtual Expression VisitProjection(ProjectionExpression projection) + { + var source = (SelectExpression)Visit(projection.Source); + var projector = Visit(projection.Projector); + if (source != projection.Source || projector != projection.Projector) + return new ProjectionExpression(source, projector, projection.Aggregator); + return projection; + } + + protected ReadOnlyCollection VisitOrderBy(ReadOnlyCollection orderBys) + { + if (orderBys != null) + { + List alternate = null; + for (int i = 0, n = orderBys.Count; i < n; i++) + { + OrderExpression expr = orderBys[i]; + Expression e = this.Visit(expr.Expression); + if (alternate == null && e != expr.Expression) + alternate = orderBys.Take(i).ToList(); + if (alternate != null) + alternate.Add(new OrderExpression(expr.OrderType, e)); + } + if (alternate != null) + return alternate.AsReadOnly(); + } + return orderBys; + } + + protected virtual Expression VisitScalar(ScalarExpression scalar) + { + SelectExpression select = (SelectExpression)Visit(scalar.Select); + if (select != scalar.Select) + return new ScalarExpression(scalar.Type, select); + return scalar; + } + + protected virtual Expression VisitSelect(SelectExpression select) + { + var from = VisitSource(select.From); + var where = Visit(select.Where); + var groupBy = Visit(select.GroupBy); + var orderBy = VisitOrderBy(select.OrderBy); + var skip = Visit(select.Skip); + var take = Visit(select.Take); + var fields = VisitFieldDeclarationList(select.Fields); + if (from != select.From || where != select.Where || orderBy != select.OrderBy || groupBy != select.GroupBy || skip != select.Skip || take != select.Take || fields != select.Fields) + return new SelectExpression(select.Alias, fields, from, where, orderBy, groupBy, select.IsDistinct, skip, take); + return select; + } + + protected virtual Expression VisitSource(Expression source) + { + return Visit(source); + } + + protected virtual Expression VisitSubquery(SubqueryExpression subquery) + { + switch ((MongoExpressionType)subquery.NodeType) + { + case MongoExpressionType.Scalar: + return VisitScalar((ScalarExpression)subquery); + } + return subquery; + } + + protected virtual ReadOnlyCollection VisitFieldDeclarationList(ReadOnlyCollection fields) + { + if (fields == null) + return fields; + + List alternate = null; + for (int i = 0, n = fields.Count; i < n; i++) + { + var f = fields[i]; + var e = Visit(f.Expression); + if (f.Expression != e && alternate == null) + alternate = fields.Take(i).ToList(); + if (alternate != null) + alternate.Add(new FieldDeclaration(f.Name, e)); + } + if (alternate != null) + return alternate.AsReadOnly(); + return fields; + } + } +} \ No newline at end of file diff --git a/samples/C/bitmap.h b/samples/C/bitmap.h new file mode 100644 index 00000000..30ab99ea --- /dev/null +++ b/samples/C/bitmap.h @@ -0,0 +1,47 @@ +#pragma once + +/* Copyright © 2010 Christoph Sünderhauf + * + * This file is part of Xelix. + * + * Xelix is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Xelix is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Xelix. If not, see . + */ + +#include "generic.h" + +typedef struct { + uint32_t numbits; + /* an array large enough for numbits to fit in. Might + * (if numbits%8!=0) have some spare bits at the end + */ + uint32_t* bits; +} bitmap_t; + + +// creates a new bitmap. +// CONTENT IS RANDOM! - use bitmap_clearall() to clear the bitmap. +bitmap_t bitmap_init(uint32_t numbits); + +// returns 1 or 0 +uint8_t bitmap_get(bitmap_t bitmap, uint32_t bitnum); +// sets a bit (to 1) +void bitmap_set(bitmap_t bitmap, uint32_t bitnum); +// clears a bit (to 0) +void bitmap_clear(bitmap_t bitmap, uint32_t bitnum); + +// clears every bit to 0 +void bitmap_clearAll(bitmap_t bitmap); + +// finds the first bit set to 0 returns 0 if no cleared bit found (0 is also returned if the first bit is cleared) +uint32_t bitmap_findFirstClear(bitmap_t bitmap); diff --git a/samples/C/color.h b/samples/C/color.h new file mode 100644 index 00000000..5c60b480 --- /dev/null +++ b/samples/C/color.h @@ -0,0 +1,44 @@ +#pragma once + +/* Copyright © 2011 Fritz Grimpen + * + * This file is part of Xelix. + * + * Xelix is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Xelix is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Xelix. If not, see . + */ + +#include + +typedef struct { + uint32_t background; + uint32_t foreground; +} console_color_t; + +#define CONSOLE_COLOR_BLACK 0x0 +#define CONSOLE_COLOR_BLUE 0x1 +#define CONSOLE_COLOR_GREEN 0x2 +#define CONSOLE_COLOR_CYAN 0x3 +#define CONSOLE_COLOR_RED 0x4 +#define CONSOLE_COLOR_MAGENTA 0x5 +#define CONSOLE_COLOR_BROWN 0x6 +#define CONSOLE_COLOR_LGREY 0x7 +#define CONSOLE_COLOR_DGREY 0x8 +#define CONSOLE_COLOR_LBLUE 0x9 +#define CONSOLE_COLOR_LGREEN 0xa +#define CONSOLE_COLOR_LCYAN 0xb +#define CONSOLE_COLOR_LRED 0xc +#define CONSOLE_COLOR_LMAGENTA 0xd +#define CONSOLE_COLOR_YELLOW 0xe +#define CONSOLE_COLOR_WHITE 0xf + diff --git a/samples/C/driver.h b/samples/C/driver.h new file mode 100644 index 00000000..e376c97d --- /dev/null +++ b/samples/C/driver.h @@ -0,0 +1,52 @@ +#pragma once + +/* Copyright © 2011 Fritz Grimpen + * + * This file is part of Xelix. + * + * Xelix is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Xelix is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Xelix. If not, see . + */ + +#include +#include + +#define CONSOLE_DRV_CAP_CLEAR 0x01 +#define CONSOLE_DRV_CAP_SCROLL 0x02 +#define CONSOLE_DRV_CAP_SET_CURSOR 0x04 + +// Input modifier keys +typedef struct { + bool shift_left:1; + bool shift_right:1; + bool control_left:1; + bool control_right:1; + bool alt:1; + bool super:1; +} console_modifiers_t; + +typedef struct { + char character; + console_modifiers_t* modifiers; +} console_read_t; + +typedef struct { + int (*write)(console_info_t*, char); + console_read_t* (*read)(console_info_t*); + + int capabilities; + + int (*_clear)(console_info_t*); + int (*scroll)(console_info_t*, int32_t); + void (*setCursor)(console_info_t*, uint32_t, uint32_t); +} console_driver_t; diff --git a/samples/C/elf.h b/samples/C/elf.h new file mode 100644 index 00000000..a270eb14 --- /dev/null +++ b/samples/C/elf.h @@ -0,0 +1,70 @@ +#pragma once + +/* Copyright © 2011 Lukas Martini + * + * This file is part of Xelix. + * + * Xelix is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Xelix is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Xelix. If not, see . + */ + +#include +#include + +#define ELF_TYPE_NONE 0 +#define ELF_TYPE_REL 1 +#define ELF_TYPE_EXEC 2 +#define ELF_TYPE_DYN 3 +#define ELF_TYPE_CORE 4 + +#define ELF_ARCH_NONE 0 +#define ELF_ARCH_386 3 + +#define ELF_VERSION_CURRENT 1 + +typedef struct { + unsigned char magic[4]; + /* Note: There _is_ other stuff in here, but we don't need it */ + unsigned char pad[12]; +} __attribute__((packed)) elf_ident_t; + +typedef struct { + uint32_t type; + uint32_t offset; + void* virtaddr; + void* physaddr; + uint32_t filesize; + uint32_t memsize; + uint32_t flags; + uint32_t alignment; +} __attribute__((packed)) elf_program_t; + +typedef struct { + elf_ident_t ident; + uint16_t type; /* Object file type */ + uint16_t machine; /* Architecture */ + uint32_t version; /* Object file version */ + void* entry; /* Entry point virtual address */ + uint32_t phoff; /* Program header table file offset */ + uint32_t shoff; /* Section header table file offset */ + uint32_t flags; /* Processor-specific flags */ + uint16_t ehsize; /* ELF header size in bytes */ + uint16_t phentsize; /* Program header table entry size */ + uint16_t phnum; /* Program header table entry count */ + uint16_t shentsize; /* Section header table entry size */ + uint16_t shnum; /* Section header table entry count */ + uint16_t shstrndx; /* Section header string table index */ +} __attribute__((packed)) elf_t; + +task_t* elf_load(elf_t* bin, char* name, char** environ, char** argv, int argc); +task_t* elf_load_file(char* path, char** environ, char** argv, int argc); diff --git a/samples/C/filter.h b/samples/C/filter.h new file mode 100644 index 00000000..a1a13c9f --- /dev/null +++ b/samples/C/filter.h @@ -0,0 +1,45 @@ +#pragma once + +/* Copyright © 2011 Fritz Grimpen + * + * This file is part of Xelix. + * + * Xelix is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Xelix is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Xelix. If not, see . + */ + +#include +#include +#include + +struct console_filter { + // General callback for all actions etc. + // Preferred prototype: + // char (char c, console_info_t *info, console_driver_t *input, console_driver_t *output); + char (*callback)(char, console_info_t*, console_driver_t*, console_driver_t*); + + // Specific callbacks for read and write + // Preferred prototype: + // char (char c, console_info_t *info, console_driver_t *input); + char (*read_callback)(char, console_info_t*, console_driver_t*); + + // Preferred prototype: + // char (char c, console_info_t *info, console_driver_t *output); + char (*write_callback)(char, console_info_t*, console_driver_t*); + + // The next filter in the filter chain + struct console_filter* next; +}; + +typedef struct console_filter console_filter_t; + diff --git a/samples/C/info.h b/samples/C/info.h new file mode 100644 index 00000000..50be7b69 --- /dev/null +++ b/samples/C/info.h @@ -0,0 +1,44 @@ +#pragma once + +/* Copyright © 2011 Fritz Grimpen + * + * This file is part of Xelix. + * + * Xelix is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Xelix is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Xelix. If not, see . + */ + +#include +#include + +typedef struct { + uint32_t cursor_x; + uint32_t cursor_y; + + uint32_t rows; + uint32_t columns; + + uint32_t tabstop; + + console_color_t default_color; + console_color_t current_color; + + uint8_t nonblocking; + uint8_t reverse_video; + uint8_t bold; + uint8_t blink; + uint8_t underline; + uint8_t newline_mode; + uint8_t auto_echo; + uint8_t handle_backspace; +} console_info_t; diff --git a/samples/C/interface.h b/samples/C/interface.h new file mode 100644 index 00000000..2c3bfeff --- /dev/null +++ b/samples/C/interface.h @@ -0,0 +1,47 @@ +#pragma once + +/* Copyright © 2011 Fritz Grimpen + * + * This file is part of Xelix. + * + * Xelix is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Xelix is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Xelix. If not, see . + */ + +#include +#include +#include +#include + +typedef struct { + console_info_t info; + + console_filter_t* input_filter; + console_filter_t* output_filter; + + console_driver_t* input_driver; + console_driver_t* output_driver; +} console_t; + +console_t* default_console; + +// Generate raw console, connected to the Display, Keyboard and the +// ECMA-48-Filter +void console_init(); + +size_t console_write(console_t* console, const char* buffer, int32_t length); +#define console_write2(console, buffer) console_write(console, buffer, strlen(buffer)) +size_t console_read(console_t* console, char* buffer, size_t length); +size_t console_scroll(console_t* console, int32_t pages); + +void console_clear(console_t* console); diff --git a/samples/C/ip4.h b/samples/C/ip4.h new file mode 100644 index 00000000..b2c8a2a8 --- /dev/null +++ b/samples/C/ip4.h @@ -0,0 +1,50 @@ +#pragma once + +/* Copyright © 2011 Lukas Martini + * + * This file is part of Xelix. + * + * Xelix is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Xelix is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Xelix. If not, see . + */ + +#include +#include + +#define IP4_TOS_ICMP 0 + +typedef uint32_t ip4_addr_t; + +typedef struct { + unsigned int hl:4; /* both fields are 4 bits */ + unsigned int version:4; + uint8_t tos; + uint16_t len; + uint16_t id; + uint16_t off; + uint8_t ttl; + uint8_t p; + uint16_t checksum; + ip4_addr_t src; + ip4_addr_t dst; +} ip4_header_t; + +typedef struct { + uint8_t type; + uint8_t code; + uint16_t checksum; + uint16_t id; + uint16_t sequence; +} ip4_icmp_header_t; + +void ip4_receive(net_device_t* origin, net_l2proto_t proto, size_t size, void* raw); diff --git a/samples/C/multiboot.h b/samples/C/multiboot.h new file mode 100644 index 00000000..fcbc13e1 --- /dev/null +++ b/samples/C/multiboot.h @@ -0,0 +1,110 @@ +#pragma once + +/* Copyright © 2010, 2011 Lukas Martini + * + * This file is part of Xelix. + * + * Xelix is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Xelix is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Xelix. If not, see . + */ + +#include + +#define MULTIBOOT_KERNELMAGIC 0x2BADB002 + +#define MULTIBOOT_FLAG_MEM 0x001 +#define MULTIBOOT_FLAG_DEVICE 0x002 +#define MULTIBOOT_FLAG_CMDLINE 0x004 +#define MULTIBOOT_FLAG_MODS 0x008 +#define MULTIBOOT_FLAG_AOUT 0x010 +#define MULTIBOOT_FLAG_ELF 0x020 +#define MULTIBOOT_FLAG_MMAP 0x040 +#define MULTIBOOT_FLAG_CONFIG 0x080 +#define MULTIBOOT_FLAG_LOADER 0x100 +#define MULTIBOOT_FLAG_APM 0x200 +#define MULTIBOOT_FLAG_VBE 0x400 + +// The symbol table for a.out. +typedef struct +{ + uint32_t tabSize; + uint32_t strSize; + uint32_t addr; + uint32_t reserved; +} __attribute__((packed)) multiboot_aoutSymbolTable_t; + +// The section header table for ELF. +typedef struct +{ + uint32_t num; + uint32_t size; + uint32_t addr; + uint32_t shndx; +} __attribute__((packed)) multiboot_elfSectionHeaderTable_t; + +typedef struct +{ + uint32_t size; + uint64_t addr; + uint64_t length; + uint32_t type; +} __attribute__((packed)) multiboot_memoryMap_t; + +typedef struct +{ + uint32_t start; + uint32_t end; + char* cmdLine; + uint32_t reserved; +} __attribute__((packed)) multiboot_module_t; + +typedef struct +{ + uint32_t flags; + uint32_t memLower; + uint32_t memUpper; + uint32_t bootDevice; + char* cmdLine; + uint32_t modsCount; + multiboot_module_t* modsAddr; + + union + { + multiboot_aoutSymbolTable_t aoutSym; + multiboot_elfSectionHeaderTable_t elfSec; + } u; + + uint32_t mmapLength; + uint32_t mmapAddr; + + uint32_t drivesLength; + uint32_t drivesAddr; + + // ROM configuration table + uint32_t configTable; + + char* bootLoaderName; + uint32_t apmTable; + + // Video + uint32_t vbeControlInfo; + uint32_t vbeModeInfo; + uint16_t vbeMode; + uint16_t vbeInterfaceSeg; + uint16_t vbeInterfaceOff; + uint16_t vbeInterfaceLen; +} __attribute__((packed)) multiboot_info_t; + +multiboot_info_t* multiboot_info; + +void arch_multiboot_printInfo(); diff --git a/samples/C/portio.h b/samples/C/portio.h new file mode 100644 index 00000000..8a805680 --- /dev/null +++ b/samples/C/portio.h @@ -0,0 +1,43 @@ +#pragma once + +/* Copyright © 2011 Lukas Martini + * + * This file is part of Xelix. + * + * Xelix is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Xelix is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Xelix. If not, see . + */ + +#include +#include + +// Legacy +#define outb(args...) portio_out8(args) +#define outw(args...) portio_out16(args) +#define outl(args...) portio_out32(args) +#define outq(args...) portio_out64(args) + +#define inb(args...) portio_in8(args) +#define inw(args...) portio_in16(args) +#define inl(args...) portio_in32(args) +#define inq(args...) portio_in64(args) + +void portio_out8(uint16_t port, uint8_t value); +void portio_out16(uint16_t port, uint16_t value); +void portio_out32(uint16_t port, uint32_t value); +void portio_out64(uint16_t port, uint64_t value); + +uint8_t portio_in8(uint16_t port); +uint16_t portio_in16(uint16_t port); +uint32_t portio_in32(uint16_t port); +uint64_t portio_in64(uint16_t port); diff --git a/samples/C/scheduler.h b/samples/C/scheduler.h new file mode 100644 index 00000000..a886003c --- /dev/null +++ b/samples/C/scheduler.h @@ -0,0 +1,69 @@ +#pragma once + +/* Copyright © 2011 Lukas Martini + * + * This file is part of Xelix. + * + * Xelix is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Xelix is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Xelix. If not, see . + */ + +#include +#include +#include + +#define SCHEDULER_MAXNAME 256 +#define SCHEDULER_TASK_PATH_MAX 256 + +// Single linked list +typedef struct task { + uint32_t pid; + char name[SCHEDULER_MAXNAME]; + struct task *parent; + cpu_state_t* state; + struct task* next; + struct task* previous; + + void* stack; + void* entry; + struct vmem_context *memory_context; + + // Current task state + enum { + TASK_STATE_KILLED, + TASK_STATE_TERMINATED, + TASK_STATE_BLOCKING, + TASK_STATE_STOPPED, + TASK_STATE_RUNNING + } task_state; + + char** environ; + char** argv; + int argc; + + // TODO Is this actually the same as PATH_MAX in our toolchain? + char cwd[SCHEDULER_TASK_PATH_MAX + 1]; +} task_t; + +int scheduler_state; + +task_t* scheduler_new(void* entry, task_t* parent, char name[SCHEDULER_MAXNAME], + char** environ, char** argv, int argc, struct vmem_context* memory_context, bool map_structs); +void scheduler_add(task_t *task); +void scheduler_terminate_current(); +task_t* scheduler_get_current(); +task_t* scheduler_select(cpu_state_t* lastRegs); +void scheduler_init(); +void scheduler_yield(); +void scheduler_remove(task_t *t); +task_t* scheduler_fork(task_t* to_fork, cpu_state_t* state); \ No newline at end of file diff --git a/samples/C/syscalls.h b/samples/C/syscalls.h new file mode 100644 index 00000000..dc054e2b --- /dev/null +++ b/samples/C/syscalls.h @@ -0,0 +1,95 @@ +#pragma once + +/* Copyright © 2011 Fritz Grimpen + * + * This file is part of Xelix. + * + * Xelix is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Xelix is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Xelix. If not, see . + */ + +#include +#include + +#include "syscalls/write.h" +#include "syscalls/exit.h" +#include "syscalls/getpid.h" +#include "syscalls/getppid.h" +#include "syscalls/read.h" +#include "syscalls/brk.h" +#include "syscalls/mmap.h" +#include "syscalls/munmap.h" +#include "syscalls/test.h" +#include "syscalls/hostname.h" +#include "syscalls/uname.h" +#include "syscalls/open.h" +#include "syscalls/execve.h" +#include "syscalls/seek.h" +#include "syscalls/opendir.h" +#include "syscalls/readdir.h" +#include "syscalls/kill.h" +#include "syscalls/getexecdata.h" +#include "syscalls/cwd.h" +#include "syscalls/fork.h" + +syscall_t syscall_table[] = { + NULL, + sys_exit, // 1 + sys_read, // 2 + sys_write, // 3 + sys_getpid, // 4 + sys_brk, // 5 + sys_getppid, // 6 + sys_mmap, // 7 + sys_munmap, // 8 + sys_test, // 9 + sys_get_hostname, // 10 + sys_set_hostname, // 11 + sys_uname, // 12 + sys_open, // 13 + sys_execve, // 14 + sys_seek, // 15 + sys_opendir, // 16 + sys_readdir, // 17 + sys_kill, // 18 + sys_getexecdata, // 19 + sys_chdir, // 20 + sys_getcwd, // 21 + sys_fork, // 22 +}; + +char* syscall_name_table[] = { + NULL, + "exit", // 1 + "read", // 2 + "write", // 3 + "getpid", // 4 + "brk", // 5 + "getppid", // 6 + "mmap", // 7 + "munmap", // 8 + "test", // 9 + "get_hostname", // 10 + "set_hostname", // 11 + "uname", // 12 + "open", // 13 + "execve", // 14 + "seek", // 15 + "opendir", // 16 + "readdir", // 17 + "kill", // 18 + "getexecdata", // 19 + "chdir", // 20 + "getcwd", // 21 + "fork", // 22 +}; diff --git a/samples/C/vfs.h b/samples/C/vfs.h new file mode 100644 index 00000000..3502460d --- /dev/null +++ b/samples/C/vfs.h @@ -0,0 +1,56 @@ +#pragma once + +/* Copyright © 2010, 2011 Lukas Martini + * + * This file is part of Xelix. + * + * Xelix is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Xelix is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Xelix. If not, see . + */ + +#include + +#define VFS_SEEK_SET 0 +#define VFS_SEEK_CUR 1 +#define VFS_SEEK_END 2 + +typedef struct { + uint64_t num; + char path[512]; + char mount_path[512]; + uint32_t offset; + uint32_t mountpoint; +} vfs_file_t; + +typedef struct { + uint64_t num; + char path[512]; + char mount_path[512]; + uint32_t mountpoint; +} vfs_dir_t; + +typedef void* (*vfs_read_callback_t)(char* path, uint32_t offset, uint32_t size); +typedef char* (*vfs_read_dir_callback_t)(char* path, uint32_t offset); + + +// Used to always store the last read/write attempt (used for kernel panic debugging) +char vfs_last_read_attempt[512]; + +vfs_file_t* vfs_get_from_id(uint32_t id); +vfs_dir_t* vfs_get_dir_from_id(uint32_t id); +void* vfs_read(vfs_file_t* fp, uint32_t size); +char* vfs_dir_read(vfs_dir_t* dir, uint32_t offset); +void vfs_seek(vfs_file_t* fp, uint32_t offset, int origin); +vfs_file_t* vfs_open(char* path); +vfs_dir_t* vfs_dir_open(char* path); +int vfs_mount(char* path, vfs_read_callback_t read_callback, vfs_read_dir_callback_t read_dir_callback); diff --git a/samples/C/vmem.h b/samples/C/vmem.h new file mode 100644 index 00000000..82bd29be --- /dev/null +++ b/samples/C/vmem.h @@ -0,0 +1,94 @@ +#pragma once + +/* Copyright © 2011 Fritz Grimpen + * Copyright © 2013 Lukas Martini + * + * This file is part of Xelix. + * + * Xelix is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Xelix is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Xelix. If not, see . + */ + +#include + +struct vmem_context; + +struct vmem_page +{ + enum + { + VMEM_SECTION_STACK, /* Initial stack */ + VMEM_SECTION_CODE, /* Contains program code and is read-only */ + VMEM_SECTION_DATA, /* Contains static data */ + VMEM_SECTION_HEAP, /* Allocated by brk(2) at runtime */ + VMEM_SECTION_MMAP, /* Allocated by mmap(2) at runtime */ + VMEM_SECTION_KERNEL, /* Contains kernel-internal data */ + VMEM_SECTION_UNMAPPED /* Unmapped */ + } section; + + bool readonly:1; + bool cow:1; /* Copy-on-Write mechanism */ + bool allocated:1; + + void *cow_src_addr; + void *virt_addr; + void *phys_addr; +}; + +typedef void (*vmem_iterator_t)(struct vmem_context *, struct vmem_page *, uint32_t); + +/* Initialize vmem_kernelContext for paging_init() */ +void vmem_init(); +struct vmem_context *vmem_kernelContext; +struct vmem_context *vmem_currentContext; +struct vmem_context *vmem_processContext; +void *vmem_faultAddress; + +/* Some callbacks for magic functions */ +void (*vmem_applyPage)(struct vmem_context *, struct vmem_page *); + +/* Generate new page context */ +struct vmem_context *vmem_new(); +struct vmem_page *vmem_new_page(); + +int vmem_add_page(struct vmem_context *ctx, struct vmem_page *pg); + +struct vmem_page *vmem_get_page_phys(struct vmem_context *ctx, void *phys_addr); +struct vmem_page *vmem_get_page_virt(struct vmem_context *ctx, void *virt_addr); +struct vmem_page *vmem_get_page(struct vmem_context *ctx, uint32_t offset); + +/* Remove pages in a specific context by physical or virtual address */ +struct vmem_page *vmem_rm_page_phys(struct vmem_context *ctx, void *phys_addr); +struct vmem_page *vmem_rm_page_virt(struct vmem_context *ctx, void *virt_addr); + +/* Iterator */ +int vmem_iterate(struct vmem_context *ctx, vmem_iterator_t callback); + +uint32_t vmem_count_pages(struct vmem_context *ctx); +void vmem_dump_page(struct vmem_page *pg); +void vmem_dump(struct vmem_context *ctx); +void vmem_handle_fault(uint32_t code, void *addr, void *instruction); + +/* Get/Set cached paging context */ +void vmem_set_cache(struct vmem_context *ctx, void *cache); +void *vmem_get_cache(struct vmem_context *ctx); + +#ifdef __i386__ + #define PAGE_SIZE 4096 + #define VMEM_ALIGN(x) (typeof(x))(((intptr_t)(x) & 0xFFFFF000) + 0x1000) + #define VMEM_ALIGN_DOWN(x) (typeof(x))( \ + ((intptr_t)(x) - ((intptr_t)(x) % PAGE_SIZE))) +#else + #define PAGE_SIZE 0 + #define VMEM_ALIGN(x) (x) +#endif diff --git a/samples/CMake/filenames/CMakeLists.txt b/samples/CMake/filenames/CMakeLists.txt new file mode 100644 index 00000000..27f3b3a7 --- /dev/null +++ b/samples/CMake/filenames/CMakeLists.txt @@ -0,0 +1,12 @@ +cmake_minimum_required(VERSION 2.8) + +project(Foo) + +set(CMAKE_SKIP_RPATH TRUE) +set(CMAKE_INSTALL_PREFIX "/usr/local") + +add_subdirectory(bar) + +add_executable(foo foo.c) +target_link_libraries(foo pthread) +install(TARGETS foo DESTINATION bin) diff --git a/samples/Forth/asm.fr b/samples/Forth/asm.fr new file mode 100644 index 00000000..73faf776 --- /dev/null +++ b/samples/Forth/asm.fr @@ -0,0 +1,244 @@ +\ Copyright 2013-2014 Lars Brinkhoff + +\ Assembler for x86. + +\ Adds to FORTH vocabulary: ASSEMBLER CODE ;CODE. +\ Creates ASSEMBLER vocabulary with: END-CODE and x86 opcodes. + +\ Conventional prefix syntax: " ,". +\ Addressing modes: +\ - immediate: "n #" +\ - direct: n +\ - register: +\ - indirect: " )" +\ - indirect with displacement: "n )#" +\ - indexed: not supported yet + +require lib/common.fth +require search.fth + +vocabulary assembler +also assembler definitions + +\ Access to the target image. +' header, defer header, is header, +' cell defer cell is cell +' dp defer dp is dp +0 value delta + +: aligned cell + 1 - cell negate nand invert ; +: align dp @ aligned dp ! ; +: allot dp +! ; +: here dp @ ; +: cells cell * ; +: c! delta + c! ; +: c, here c! 1 allot ; +: h, dup c, 8 rshift c, ; +: , dup h, 16 rshift h, ; + +base @ hex + +\ This constant signals that an operand is not a direct address. +deadbeef constant -addr + +\ Assembler state. +variable opcode +variable d +variable s +variable dir? +variable mrrm defer ?mrrm, +variable sib defer ?sib, +variable disp defer ?disp, +variable imm defer ?imm, +defer imm, +defer immediate-opcode +defer reg +defer ?opsize + +\ Set opcode. And destination: register or memory. +: opcode! 3@ is immediate-opcode >r opcode ! ; +: !reg dir? @ if 2 d ! then dir? off ; +: !mem dir? off ; + +\ Set bits in mod/reg/rm byte. +: -mrrm ['] nop is ?mrrm, ; +: mod! mrrm c0 !bits ; +: reg@ mrrm 38 @bits ; +: reg! mrrm 38 !bits ; +: rm@ mrrm 7 @bits ; +: rm! rm@ 3 lshift reg! mrrm 7 !bits ; +: reg>opcode rm@ opcode 07 !bits ; +: opcode>reg opcode @ dup 3 rshift rm! 8 rshift opcode ! ; + +\ Write parts of instruction to memory. +: ds d @ s @ + ; +: ?twobyte dup FF > if dup 8 rshift c, then ; +: opcode, opcode @ ?twobyte ds + c, ; +: mrrm, mrrm @ c, ; +: sib, sib @ c, ; +: imm8, imm @ c, ; +: imm16, imm @ h, ; +: imm32, imm @ , ; +: disp8, disp @ c, ; +: disp32, disp @ , ; + +\ Set operand size. +: -opsize 2drop r> drop ; +: opsize! is imm, s ! ['] -opsize is ?opsize ; +: !op8 0 ['] imm8, ?opsize ; +: !op32 1 ['] imm32, ?opsize ; +: !op16 1 ['] imm16, ?opsize 66 c, ; + +\ Set SIB byte. +: !sib ['] sib, is ?sib, ; +: sib! 3 lshift + sib ! !sib ; + +\ Set displacement. +: byte? -80 80 within ; +: disp! is ?disp, disp ! ; +: !disp8 ['] disp8, disp! ; +: !disp32 ['] disp32, disp! ; +: !disp ( a -- u ) dup byte? if !disp8 40 else !disp32 80 then ; +: -pc here 5 + negate ; +: relative -pc disp +! ; + +\ Set immediate operand. +: imm! imm ! ['] imm, is ?imm, ; + +\ Implements addressing modes: register, indirect, indexed, and direct. +: reg1 rm! !reg ; +: reg2 3 lshift reg! ; +: !reg2 ['] reg2 is reg ; +: ind dup mod! rm! !mem !reg2 ; +: ind# swap !disp + ind ; +: idx 04 ind sib! ; +: idx# rot !disp 04 + ind sib! ; +: addr !disp32 05 ind ; + +\ Reset assembler state. +: 0opsize ['] opsize! is ?opsize ; +: 0ds d off s off ; +: 0reg ['] reg1 is reg ; +: 0mrrm c0 mrrm ! ['] mrrm, is ?mrrm, ; +: 0sib ['] nop is ?sib, ; +: 0disp ['] nop is ?disp, ; +: 0imm imm off ['] nop is ?imm, 0 is imm, ; +: 0asm 0imm 0disp 0reg 0ds 0mrrm 0sib 0opsize dir? on ; + +\ Enter and exit assembler mode. +: start-code also assembler 0asm ; +: end-code align previous ; + +\ Implements addressing mode: immediate. +: imm8? imm @ byte? ; +: ?sign-extend d off imm8? if 2 d ! ['] imm8, is ?imm, then ; +: alu# opcode @ reg! 80 opcode ! ?sign-extend ; +: mov# B0 s @ 3 lshift + rm@ + opcode ! 0ds -mrrm ; +: push# imm8? if ['] imm8, 6A else ['] imm32, 68 then dup opcode ! rm! is ?imm, ; +: test# F6 opcode ! ; +: imm-op imm! immediate-opcode ; + +\ Process one operand. All operands except a direct address +\ have the stack picture ( n*x xt -addr ). +: addr? dup -addr <> ; +: op addr? if addr else drop execute then ; + +\ Define instruction formats. +: instruction, opcode! opcode, ?mrrm, ?sib, ?disp, ?imm, 0asm ; +: mnemonic ( u a "name" -- ) create ['] nop 3, does> instruction, ; +: format: create ] !csp does> mnemonic ; +: immediate: ' latestxt >body ! ; + +\ Instruction formats. +format: 0op -mrrm ; +format: 1reg op reg>opcode 0ds -mrrm ; +format: 1op opcode>reg op d off ; +format: 2op op op ; +format: 2op-d op op d off ; +format: 2op-ds op op 0ds ; +format: 1addr op relative -mrrm ; +format: 1imm8 !op8 op -mrrm ; + +\ Instruction mnemonics. +00 2op add, immediate: alu# +08 2op or, immediate: alu# +0F44 2op-ds cmove, \ Todo: other condition codes. +0FB6 2op-ds movzx, +0FBE 2op-ds movsx, +10 2op adc, immediate: alu# +18 2op sbb, immediate: alu# +20 2op and, immediate: alu# +26 0op es, +28 2op sub, immediate: alu# +2E 0op cs, +30 2op xor, immediate: alu# +36 0op ss, +38 2op cmp, immediate: alu# +3E 0op ds, +50 1reg push, immediate: push# +58 1reg pop, +64 0op fs, +65 0op gs, +\ 70 jcc +84 2op-d test, immediate: test# +86 2op-d xchg, +88 2op mov, immediate: mov# +8D 2op-ds lea, +\ 8F/0 pop, rm +90 0op nop, +C3 0op ret, +\ C6/0 immediate mov to r/m +\ C7/0 immediate mov to r/m +CD 1imm8 int, +E8 1addr call, +E9 1addr jmp, +\ EB jmp rel8 +F0 0op lock, +F2 0op rep, +F3 0op repz, +F4 0op hlt, +F5 0op cmc, +F610 1op not, +F618 1op neg, +F8 0op clc, +F9 0op stc, +FA 0op cli, +FB 0op sti, +FC 0op cld, +FD 0op std, +\ FE 0 inc rm +\ FF 1 dec rm +\ FF 2 call rm +\ FF 4 jmp rm +\ FF 6 push rm + +: sp? dup 4 = ; + +\ Addressing mode syntax: immediate, indirect, and displaced indirect. +: # ['] imm-op -addr ; +: ) 2drop sp? if 4 ['] idx else ['] ind then -addr 0reg 0opsize ; +: )# 2drop sp? if 4 ['] idx# else ['] ind# then -addr 0reg 0opsize ; + +\ Define registers. +: reg8 create , does> @ ['] reg -addr !op8 ; +: reg16 create , does> @ ['] reg -addr !op16 ; +: reg32 create , does> @ ['] reg -addr !op32 ; +: reg: dup reg8 dup reg16 dup reg32 1+ ; + +\ Register names. +0 +reg: al ax eax reg: cl cx ecx reg: dl dx edx reg: bl bx ebx +reg: ah sp esp reg: ch bp ebp reg: dh si esi reg: bh di edi +drop + +\ Runtime for ;CODE. CODE! is defined elsewhere. +: (;code) r> code! ; + +base ! only forth definitions also assembler + +\ Standard assembler entry points. +: code parse-name header, ?code, start-code ; +: ;code postpone (;code) reveal postpone [ ?csp start-code ; immediate + +0asm +previous diff --git a/samples/Jasmin/if1.j b/samples/Jasmin/if1.j new file mode 100644 index 00000000..dc46a541 --- /dev/null +++ b/samples/Jasmin/if1.j @@ -0,0 +1,56 @@ +.class public if1 +.super java/lang/Object +; +; standard initializer (calls java.lang.Object's initializer) +; +.method public ()V +aload_0 +invokenonvirtual java/lang/Object/()V +return +.end method + +.method public static main([Ljava/lang/String;)V + +.limit locals 1 +.limit stack 5 +BeginGlobal: + .line 2 + ldc 0x1 + ldc 0x1 + if_icmpeq If556261059 + goto IfElse556261059 + If556261059: + .line 3 + .line 3 + getstatic java/lang/System/out Ljava/io/PrintStream; + ldc 0x1 + invokevirtual java/io/PrintStream/print(I)V + goto IfDone556261059 + IfElse556261059: + .line 5 + .line 5 + getstatic java/lang/System/out Ljava/io/PrintStream; + ldc 0x2 + invokevirtual java/io/PrintStream/print(I)V + IfDone556261059: + + .line 6 + getstatic java/lang/System/out Ljava/io/PrintStream; + ldc 0x3 + invokevirtual java/io/PrintStream/print(I)V + + .line 7 + ldc 0x1 + ldc 0x1 + if_icmpne IfNot-920218690 + .line 8 + .line 8 + getstatic java/lang/System/out Ljava/io/PrintStream; + ldc 0x4 + invokevirtual java/io/PrintStream/print(I)V + IfNot-920218690: + +EndGlobal: +return +.end method + diff --git a/samples/Jasmin/if2.j b/samples/Jasmin/if2.j new file mode 100644 index 00000000..e6121c18 --- /dev/null +++ b/samples/Jasmin/if2.j @@ -0,0 +1,167 @@ +.class public if2 +.super java/lang/Object +; +; standard initializer (calls java.lang.Object's initializer) +; +.method public ()V +aload_0 +invokenonvirtual java/lang/Object/()V +return +.end method + +.method public static main([Ljava/lang/String;)V + +.limit locals 1 +.limit stack 5 +BeginGlobal: + .line 2 + ldc 0x1 + ldc 0x1 + if_icmpeq Cmp1893841232 + ldc 0x0 + goto CmpDone1893841232 + Cmp1893841232: + ldc 0x1 + CmpDone1893841232: + ldc 0x1 + if_icmpeq If-1736765035 + goto IfElse-1736765035 + If-1736765035: + .line 2 + .line 3 + getstatic java/lang/System/out Ljava/io/PrintStream; + ldc 0x1 + invokevirtual java/io/PrintStream/print(I)V + goto IfDone-1736765035 + IfElse-1736765035: + .line 4 + .line 4 + ldc 0x2 + ldc 0x1 + if_icmpeq Cmp-1460884369 + ldc 0x0 + goto CmpDone-1460884369 + Cmp-1460884369: + ldc 0x1 + CmpDone-1460884369: + ldc 0x1 + if_icmpeq If-247349760 + goto IfElse-247349760 + If-247349760: + .line 4 + .line 5 + getstatic java/lang/System/out Ljava/io/PrintStream; + ldc 0x2 + invokevirtual java/io/PrintStream/print(I)V + goto IfDone-247349760 + IfElse-247349760: + .line 6 + .line 7 + getstatic java/lang/System/out Ljava/io/PrintStream; + ldc 0x3 + invokevirtual java/io/PrintStream/print(I)V + IfDone-247349760: + IfDone-1736765035: + + .line 10 + ldc 0x1 + ldc 0x2 + if_icmpeq Cmp933554851 + ldc 0x0 + goto CmpDone933554851 + Cmp933554851: + ldc 0x1 + CmpDone933554851: + ldc 0x1 + if_icmpeq If1623625546 + goto IfElse1623625546 + If1623625546: + .line 10 + .line 11 + getstatic java/lang/System/out Ljava/io/PrintStream; + ldc 0x1 + invokevirtual java/io/PrintStream/print(I)V + goto IfDone1623625546 + IfElse1623625546: + .line 12 + .line 12 + ldc 0x2 + ldc 0x2 + if_icmpeq Cmp1572138409 + ldc 0x0 + goto CmpDone1572138409 + Cmp1572138409: + ldc 0x1 + CmpDone1572138409: + ldc 0x1 + if_icmpeq If126354425 + goto IfElse126354425 + If126354425: + .line 12 + .line 13 + getstatic java/lang/System/out Ljava/io/PrintStream; + ldc 0x2 + invokevirtual java/io/PrintStream/print(I)V + goto IfDone126354425 + IfElse126354425: + .line 14 + .line 15 + getstatic java/lang/System/out Ljava/io/PrintStream; + ldc 0x3 + invokevirtual java/io/PrintStream/print(I)V + IfDone126354425: + IfDone1623625546: + + .line 18 + ldc 0x1 + ldc 0x2 + if_icmpeq Cmp126493150 + ldc 0x0 + goto CmpDone126493150 + Cmp126493150: + ldc 0x1 + CmpDone126493150: + ldc 0x1 + if_icmpeq If1522284422 + goto IfElse1522284422 + If1522284422: + .line 18 + .line 19 + getstatic java/lang/System/out Ljava/io/PrintStream; + ldc 0x1 + invokevirtual java/io/PrintStream/print(I)V + goto IfDone1522284422 + IfElse1522284422: + .line 20 + .line 20 + ldc 0x2 + ldc 0x1 + if_icmpeq Cmp-906666545 + ldc 0x0 + goto CmpDone-906666545 + Cmp-906666545: + ldc 0x1 + CmpDone-906666545: + ldc 0x1 + if_icmpeq If1083939031 + goto IfElse1083939031 + If1083939031: + .line 20 + .line 21 + getstatic java/lang/System/out Ljava/io/PrintStream; + ldc 0x2 + invokevirtual java/io/PrintStream/print(I)V + goto IfDone1083939031 + IfElse1083939031: + .line 22 + .line 23 + getstatic java/lang/System/out Ljava/io/PrintStream; + ldc 0x3 + invokevirtual java/io/PrintStream/print(I)V + IfDone1083939031: + IfDone1522284422: + +EndGlobal: +return +.end method + diff --git a/samples/Jasmin/if3.j b/samples/Jasmin/if3.j new file mode 100644 index 00000000..3d687392 --- /dev/null +++ b/samples/Jasmin/if3.j @@ -0,0 +1,55 @@ +.class public if3 +.super java/lang/Object +; +; standard initializer (calls java.lang.Object's initializer) +; +.method public ()V +aload_0 +invokenonvirtual java/lang/Object/()V +return +.end method + +.method public static main([Ljava/lang/String;)V + +.limit locals 1 +.limit stack 5 +BeginGlobal: + .line 2 + ldc 0x1 + ldc 0x1 + if_icmpeq If-811796083 + goto IfElse-811796083 + If-811796083: + .line 3 + .line 3 + ldc 0x0 + ldc 0x1 + if_icmpeq If-1001319390 + goto IfElse-1001319390 + If-1001319390: + .line 4 + .line 4 + getstatic java/lang/System/out Ljava/io/PrintStream; + ldc 0x1 + invokevirtual java/io/PrintStream/print(I)V + goto IfDone-1001319390 + IfElse-1001319390: + .line 6 + .line 6 + getstatic java/lang/System/out Ljava/io/PrintStream; + ldc 0x2 + invokevirtual java/io/PrintStream/print(I)V + IfDone-1001319390: + goto IfDone-811796083 + IfElse-811796083: + .line 8 + .line 8 + getstatic java/lang/System/out Ljava/io/PrintStream; + ldc 0x3 + invokevirtual java/io/PrintStream/print(I)V + IfDone-811796083: + +EndGlobal: +return +.end method + diff --git a/samples/Jasmin/if4.j b/samples/Jasmin/if4.j new file mode 100644 index 00000000..f79a090b --- /dev/null +++ b/samples/Jasmin/if4.j @@ -0,0 +1,37 @@ +.class public if4 +.super java/lang/Object +; +; standard initializer (calls java.lang.Object's initializer) +; +.method public ()V +aload_0 +invokenonvirtual java/lang/Object/()V +return +.end method + +.method public static main([Ljava/lang/String;)V + +.limit locals 1 +.limit stack 5 +BeginGlobal: + .line 2 + ldc 0x1 + ldc 0x1 + if_icmpne IfNot1919266740 + .line 2 + .line 2 + ldc 0x1 + ldc 0x1 + if_icmpne IfNot613368541 + .line 2 + .line 2 + getstatic java/lang/System/out Ljava/io/PrintStream; + ldc 0x1 + invokevirtual java/io/PrintStream/print(I)V + IfNot613368541: + IfNot1919266740: + +EndGlobal: +return +.end method + diff --git a/samples/Jasmin/op1.j b/samples/Jasmin/op1.j new file mode 100644 index 00000000..d8344913 --- /dev/null +++ b/samples/Jasmin/op1.j @@ -0,0 +1,54 @@ +.class public op1 +.super java/lang/Object +; +; standard initializer (calls java.lang.Object's initializer) +; +.method public ()V +aload_0 +invokenonvirtual java/lang/Object/()V +return +.end method + +.method public static main([Ljava/lang/String;)V + +.limit locals 1 +.limit stack 5 +BeginGlobal: + .line 2 + getstatic java/lang/System/out Ljava/io/PrintStream; + ldc 0x1 + ldc 0x1 + iadd + invokevirtual java/io/PrintStream/println(I)V + + .line 3 + getstatic java/lang/System/out Ljava/io/PrintStream; + ldc 0xa + ldc 0x5 + isub + invokevirtual java/io/PrintStream/println(I)V + + .line 4 + getstatic java/lang/System/out Ljava/io/PrintStream; + ldc 0x15 + ldc 0x3 + idiv + invokevirtual java/io/PrintStream/println(I)V + + .line 5 + getstatic java/lang/System/out Ljava/io/PrintStream; + ldc 0x159 + ldc 0x38 + imul + invokevirtual java/io/PrintStream/println(I)V + + .line 6 + getstatic java/lang/System/out Ljava/io/PrintStream; + ldc 0x52 + ldc 0x9 + irem + invokevirtual java/io/PrintStream/println(I)V + +EndGlobal: +return +.end method \ No newline at end of file diff --git a/samples/Jasmin/op2.j b/samples/Jasmin/op2.j new file mode 100644 index 00000000..4463a5ca --- /dev/null +++ b/samples/Jasmin/op2.j @@ -0,0 +1,34 @@ +.class public op2 +.super java/lang/Object +; +; standard initializer (calls java.lang.Object's initializer) +; +.method public ()V +aload_0 +invokenonvirtual java/lang/Object/()V +return +.end method + +.method public static main([Ljava/lang/String;)V + +.limit locals 1 +.limit stack 5 +BeginGlobal: + .line 2 + getstatic java/lang/System/out Ljava/io/PrintStream; + ldc 0x1 + ldc 0x0 + iand + invokevirtual java/io/PrintStream/println(Z)V + + .line 3 + getstatic java/lang/System/out Ljava/io/PrintStream; + ldc 0x1 + ldc 0x0 + ior + invokevirtual java/io/PrintStream/println(Z)V + +EndGlobal: +return +.end method + diff --git a/samples/Jasmin/op3.j b/samples/Jasmin/op3.j new file mode 100644 index 00000000..10dd6897 --- /dev/null +++ b/samples/Jasmin/op3.j @@ -0,0 +1,68 @@ +.class public op3 +.super java/lang/Object +; +; standard initializer (calls java.lang.Object's initializer) +; +.method public ()V +aload_0 +invokenonvirtual java/lang/Object/()V +return +.end method + +.method public static main([Ljava/lang/String;)V + +.limit locals 1 +.limit stack 5 +BeginGlobal: + .line 2 + getstatic java/lang/System/out Ljava/io/PrintStream; + ldc 0x0 + ldc 0x1 + if_icmpeq Cmp-1307183590 + ldc 0x0 + goto CmpDone-1307183590 + Cmp-1307183590: + ldc 0x1 + CmpDone-1307183590: + invokevirtual java/io/PrintStream/println(Z)V + + .line 3 + getstatic java/lang/System/out Ljava/io/PrintStream; + ldc 0x0 + ldc 0x0 + if_icmpeq Cmp-1443270821 + ldc 0x0 + goto CmpDone-1443270821 + Cmp-1443270821: + ldc 0x1 + CmpDone-1443270821: + invokevirtual java/io/PrintStream/println(Z)V + + .line 4 + getstatic java/lang/System/out Ljava/io/PrintStream; + ldc 0x1 + ldc 0x1 + if_icmpeq Cmp1759327329 + ldc 0x0 + goto CmpDone1759327329 + Cmp1759327329: + ldc 0x1 + CmpDone1759327329: + invokevirtual java/io/PrintStream/println(Z)V + + .line 5 + getstatic java/lang/System/out Ljava/io/PrintStream; + ldc 0x1 + ldc 0x0 + if_icmpeq Cmp-678570146 + ldc 0x0 + goto CmpDone-678570146 + Cmp-678570146: + ldc 0x1 + CmpDone-678570146: + invokevirtual java/io/PrintStream/println(Z)V + +EndGlobal: +return +.end method + diff --git a/samples/Jasmin/op4.j b/samples/Jasmin/op4.j new file mode 100644 index 00000000..47644392 --- /dev/null +++ b/samples/Jasmin/op4.j @@ -0,0 +1,68 @@ +.class public op4 +.super java/lang/Object +; +; standard initializer (calls java.lang.Object's initializer) +; +.method public ()V +aload_0 +invokenonvirtual java/lang/Object/()V +return +.end method + +.method public static main([Ljava/lang/String;)V + +.limit locals 1 +.limit stack 5 +BeginGlobal: + .line 2 + getstatic java/lang/System/out Ljava/io/PrintStream; + ldc 0x0 + ldc 0x1 + if_icmpne Cmp-191731100 + ldc 0x0 + goto CmpDone-191731100 + Cmp-191731100: + ldc 0x1 + CmpDone-191731100: + invokevirtual java/io/PrintStream/println(Z)V + + .line 3 + getstatic java/lang/System/out Ljava/io/PrintStream; + ldc 0x0 + ldc 0x0 + if_icmpne Cmp-901585603 + ldc 0x0 + goto CmpDone-901585603 + Cmp-901585603: + ldc 0x1 + CmpDone-901585603: + invokevirtual java/io/PrintStream/println(Z)V + + .line 4 + getstatic java/lang/System/out Ljava/io/PrintStream; + ldc 0x1 + ldc 0x1 + if_icmpne Cmp1522577937 + ldc 0x0 + goto CmpDone1522577937 + Cmp1522577937: + ldc 0x1 + CmpDone1522577937: + invokevirtual java/io/PrintStream/println(Z)V + + .line 5 + getstatic java/lang/System/out Ljava/io/PrintStream; + ldc 0x1 + ldc 0x0 + if_icmpne Cmp-1653028684 + ldc 0x0 + goto CmpDone-1653028684 + Cmp-1653028684: + ldc 0x1 + CmpDone-1653028684: + invokevirtual java/io/PrintStream/println(Z)V + +EndGlobal: +return +.end method + diff --git a/samples/Objective-J/AppController.j b/samples/Objective-J/AppController.j new file mode 100644 index 00000000..4870ab75 --- /dev/null +++ b/samples/Objective-J/AppController.j @@ -0,0 +1,434 @@ +// +// AppController.j +// FlickrPhoto +// +// Created by Ross Boucher. +// Copyright 2008 - 2010, 280 North, Inc. All rights reserved. + +@import +@import + +var SliderToolbarItemIdentifier = "SliderToolbarItemIdentifier", + AddToolbarItemIdentifier = "AddToolbarItemIdentifier", + RemoveToolbarItemIdentifier = "RemoveToolbarItemIdentifier"; + +/* + Important note about CPJSONPConnection: CPJSONPConnection is ONLY for JSONP APIs. + If aren't sure you NEED JSONP (see http://ajaxian.com/archives/jsonp-json-with-padding ), + you most likely don't want to use CPJSONPConnection, but rather the more standard + CPURLConnection. CPJSONPConnection is designed for cross-domain + connections, and if you are making requests to the same domain (as most web + applications do), you do not need it. +*/ + +@implementation AppController : CPObject +{ + CPString lastIdentifier; + CPDictionary photosets; + + CPCollectionView listCollectionView; + CPCollectionView photosCollectionView; +} + +- (void)applicationDidFinishLaunching:(CPNotification)aNotification +{ + //the first thing we need to do is create a window to take up the full screen + //we'll also create a toolbar to go with it, and grab its size for future reference + + var theWindow = [[CPWindow alloc] initWithContentRect:CGRectMakeZero() styleMask:CPBorderlessBridgeWindowMask], + contentView = [theWindow contentView], + toolbar = [[CPToolbar alloc] initWithIdentifier:"Photos"], + bounds = [contentView bounds]; + + //we tell the toolbar that we want to be its delegate and attach it to theWindow + [toolbar setDelegate:self]; + [toolbar setVisible:true]; + [theWindow setToolbar:toolbar]; + + photosets = [CPDictionary dictionary]; //storage for our sets of photos return from Flickr + + //now we create a scroll view to contain the list of collections of photos (photosets) + //inside the scroll view, we'll place our collection view, which manages a collection of "cells" + //each cell will represent one photo collection, and choosing cells will select that collection + + var listScrollView = [[CPScrollView alloc] initWithFrame:CGRectMake(0, 0, 200, CGRectGetHeight(bounds) - 58)]; + [listScrollView setAutohidesScrollers:YES]; + [listScrollView setAutoresizingMask:CPViewHeightSizable]; + [[listScrollView contentView] setBackgroundColor:[CPColor colorWithRed:213.0 / 255.0 green:221.0 / 255.0 blue:230.0 / 255.0 alpha:1.0]]; + + //we create the collection view cells by creating a single prototype (CPCollectionViewItem) and setting its view. + //the CPCollectionView class will then duplicate this item as many times as it needs + + var photosListItem = [[CPCollectionViewItem alloc] init]; + [photosListItem setView:[[PhotosListCell alloc] initWithFrame:CGRectMakeZero()]]; + + listCollectionView = [[CPCollectionView alloc] initWithFrame:CGRectMake(0, 0, 200, 0)]; + + [listCollectionView setDelegate:self]; //we want delegate methods + [listCollectionView setItemPrototype:photosListItem]; //set the item prototype + + [listCollectionView setMinItemSize:CGSizeMake(20.0, 45.0)]; + [listCollectionView setMaxItemSize:CGSizeMake(1000.0, 45.0)]; + [listCollectionView setMaxNumberOfColumns:1]; //setting a single column will make this appear as a vertical list + + [listCollectionView setVerticalMargin:0.0]; + [listCollectionView setAutoresizingMask:CPViewWidthSizable]; + + //finally, we put our collection view inside the scroll view as it's document view, so it can be scrolled + [listScrollView setDocumentView:listCollectionView]; + + //and we add it to the window's content view, so it will show up on the screen + [contentView addSubview:listScrollView]; + + //repeat the process with another collection view for the actual photos + //this time we'll use a different view for the prototype (PhotoCell) + + var photoItem = [[CPCollectionViewItem alloc] init]; + [photoItem setView:[[PhotoCell alloc] initWithFrame:CGRectMake(0, 0, 150, 150)]]; + + var scrollView = [[CPScrollView alloc] initWithFrame:CGRectMake(200, 0, CGRectGetWidth(bounds) - 200, CGRectGetHeight(bounds) - 58)]; + + photosCollectionView = [[CPCollectionView alloc] initWithFrame:CGRectMake(0, 0, CGRectGetWidth(bounds) - 200, 0)]; + + [photosCollectionView setDelegate:self]; + [photosCollectionView setItemPrototype:photoItem]; + + [photosCollectionView setMinItemSize:CGSizeMake(150, 150)]; + [photosCollectionView setMaxItemSize:CGSizeMake(150, 150)]; + [photosCollectionView setAutoresizingMask:CPViewWidthSizable]; + + [scrollView setAutoresizingMask:CPViewHeightSizable | CPViewWidthSizable]; + [scrollView setDocumentView:photosCollectionView]; + [scrollView setAutohidesScrollers:YES]; + + [[scrollView contentView] setBackgroundColor:[CPColor colorWithCalibratedWhite:0.25 alpha:1.0]]; + + [contentView addSubview:scrollView]; + + //bring forward the window to display it + [theWindow orderFront:self]; + + //get the most interesting photos on flickr + var request = [CPURLRequest requestWithURL:"http://www.flickr.com/services/rest/?method=flickr.interestingness.getList&per_page=20&format=json&api_key=ca4dd89d3dfaeaf075144c3fdec76756"]; + + // see important note about CPJSONPConnection above + var connection = [CPJSONPConnection sendRequest:request callback:"jsoncallback" delegate:self]; + + lastIdentifier = "Interesting Photos"; +} + +- (void)add:(id)sender +{ + var string = prompt("Enter a tag to search Flickr for photos."); + + if (string) + { + //create a new request for the photos with the tag returned from the javascript prompt + var request = [CPURLRequest requestWithURL:"http://www.flickr.com/services/rest/?"+ + "method=flickr.photos.search&tags="+encodeURIComponent(string)+ + "&media=photos&machine_tag_mode=any&per_page=20&format=json&api_key=ca4dd89d3dfaeaf075144c3fdec76756"]; + + // see important note about CPJSONPConnection above + [CPJSONPConnection sendRequest:request callback:"jsoncallback" delegate:self]; + + lastIdentifier = string; + } +} + +- (void)remove:(id)sender +{ + //remove this photo + [self removeImageListWithIdentifier:[[photosets allKeys] objectAtIndex:[[listCollectionView selectionIndexes] firstIndex]]]; +} + +- (void)addImageList:(CPArray)images withIdentifier:(CPString)aString +{ + [photosets setObject:images forKey:aString]; + + [listCollectionView setContent:[[photosets allKeys] copy]]; + [listCollectionView setSelectionIndexes:[CPIndexSet indexSetWithIndex:[[photosets allKeys] indexOfObject:aString]]]; +} + +- (void)removeImageListWithIdentifier:(CPString)aString +{ + var nextIndex = MAX([[listCollectionView content] indexOfObject:aString] - 1, 0); + + [photosets removeObjectForKey:aString]; + + [listCollectionView setContent:[[photosets allKeys] copy]]; + [listCollectionView setSelectionIndexes:[CPIndexSet indexSetWithIndex:nextIndex]]; +} + +- (void)adjustImageSize:(id)sender +{ + var newSize = [sender value]; + + [photosCollectionView setMinItemSize:CGSizeMake(newSize, newSize)]; + [photosCollectionView setMaxItemSize:CGSizeMake(newSize, newSize)]; +} + +- (void)collectionViewDidChangeSelection:(CPCollectionView)aCollectionView +{ + if (aCollectionView == listCollectionView) + { + var listIndex = [[listCollectionView selectionIndexes] firstIndex]; + + if (listIndex === CPNotFound) + return; + + var key = [listCollectionView content][listIndex]; + + [photosCollectionView setContent:[photosets objectForKey:key]]; + [photosCollectionView setSelectionIndexes:[CPIndexSet indexSet]]; + } +} + +- (void)connection:(CPJSONPConnection)aConnection didReceiveData:(CPString)data +{ + //this method is called when the network request returns. the data is the returned + //information from flickr. we set the array of photo urls as the data to our collection view + + [self addImageList:data.photos.photo withIdentifier:lastIdentifier]; +} + +- (void)connection:(CPJSONPConnection)aConnection didFailWithError:(CPString)error +{ + alert(error); //a network error occurred +} + +//these two methods are the toolbar delegate methods, and tell the toolbar what it should display to the user + +- (CPArray)toolbarAllowedItemIdentifiers:(CPToolbar)aToolbar +{ + return [self toolbarDefaultItemIdentifiers:aToolbar]; +} + +- (CPArray)toolbarDefaultItemIdentifiers:(CPToolbar)aToolbar +{ + return [AddToolbarItemIdentifier, RemoveToolbarItemIdentifier, CPToolbarFlexibleSpaceItemIdentifier, SliderToolbarItemIdentifier]; +} + +//this delegate method returns the actual toolbar item for the given identifier + +- (CPToolbarItem)toolbar:(CPToolbar)aToolbar itemForItemIdentifier:(CPString)anItemIdentifier willBeInsertedIntoToolbar:(BOOL)aFlag +{ + var toolbarItem = [[CPToolbarItem alloc] initWithItemIdentifier:anItemIdentifier]; + + if (anItemIdentifier == SliderToolbarItemIdentifier) + { + [toolbarItem setView:[[PhotoResizeView alloc] initWithFrame:CGRectMake(0, 0, 180, 32)]]; + [toolbarItem setMinSize:CGSizeMake(180, 32)]; + [toolbarItem setMaxSize:CGSizeMake(180, 32)]; + [toolbarItem setLabel:"Scale"]; + } + else if (anItemIdentifier == AddToolbarItemIdentifier) + { + var image = [[CPImage alloc] initWithContentsOfFile:[[CPBundle mainBundle] pathForResource:"add.png"] size:CPSizeMake(30, 25)], + highlighted = [[CPImage alloc] initWithContentsOfFile:[[CPBundle mainBundle] pathForResource:"addHighlighted.png"] size:CPSizeMake(30, 25)]; + + [toolbarItem setImage:image]; + [toolbarItem setAlternateImage:highlighted]; + + [toolbarItem setTarget:self]; + [toolbarItem setAction:@selector(add:)]; + [toolbarItem setLabel:"Add Photo List"]; + + [toolbarItem setMinSize:CGSizeMake(32, 32)]; + [toolbarItem setMaxSize:CGSizeMake(32, 32)]; + } + else if (anItemIdentifier == RemoveToolbarItemIdentifier) + { + var image = [[CPImage alloc] initWithContentsOfFile:[[CPBundle mainBundle] pathForResource:"remove.png"] size:CPSizeMake(30, 25)], + highlighted = [[CPImage alloc] initWithContentsOfFile:[[CPBundle mainBundle] pathForResource:"removeHighlighted.png"] size:CPSizeMake(30, 25)]; + + [toolbarItem setImage:image]; + [toolbarItem setAlternateImage:highlighted]; + + [toolbarItem setTarget:self]; + [toolbarItem setAction:@selector(remove:)]; + [toolbarItem setLabel:"Remove Photo List"]; + + [toolbarItem setMinSize:CGSizeMake(32, 32)]; + [toolbarItem setMaxSize:CGSizeMake(32, 32)]; + } + + return toolbarItem; +} + +@end + +/* + This code demonstrates how to add a category to an existing class. + In this case, we are adding the class method +flickr_labelWithText: to + the CPTextField class. Later on, we can call [CPTextField flickr_labelWithText:"foo"] + to return a new text field with the string foo. + Best practices suggest prefixing category methods with your unique prefix, to prevent collisions. +*/ + +@implementation CPTextField (CreateLabel) + ++ (CPTextField)flickr_labelWithText:(CPString)aString +{ + var label = [[CPTextField alloc] initWithFrame:CGRectMakeZero()]; + + [label setStringValue:aString]; + [label sizeToFit]; + [label setTextShadowColor:[CPColor whiteColor]]; + [label setTextShadowOffset:CGSizeMake(0, 1)]; + + return label; +} + +@end + +// This class wraps our slider + labels combo + +@implementation PhotoResizeView : CPView +{ +} + +- (id)initWithFrame:(CGRect)aFrame +{ + self = [super initWithFrame:aFrame]; + + var slider = [[CPSlider alloc] initWithFrame:CGRectMake(30, CGRectGetHeight(aFrame) / 2.0 - 8, CGRectGetWidth(aFrame) - 65, 24)]; + + [slider setMinValue:50.0]; + [slider setMaxValue:250.0]; + [slider setIntValue:150.0]; + [slider setAction:@selector(adjustImageSize:)]; + + [self addSubview:slider]; + + var label = [CPTextField flickr_labelWithText:"50"]; + [label setFrameOrigin:CGPointMake(0, CGRectGetHeight(aFrame) / 2.0 - 4.0)]; + [self addSubview:label]; + + label = [CPTextField flickr_labelWithText:"250"]; + [label setFrameOrigin:CGPointMake(CGRectGetWidth(aFrame) - CGRectGetWidth([label frame]), CGRectGetHeight(aFrame) / 2.0 - 4.0)]; + [self addSubview:label]; + + return self; +} + +@end + +// This class displays a single photo collection inside our list of photo collecitions + +@implementation PhotosListCell : CPView +{ + CPTextField label; + CPView highlightView; +} + +- (void)setRepresentedObject:(JSObject)anObject +{ + if (!label) + { + label = [[CPTextField alloc] initWithFrame:CGRectInset([self bounds], 4, 4)]; + + [label setFont:[CPFont systemFontOfSize:16.0]]; + [label setTextShadowColor:[CPColor whiteColor]]; + [label setTextShadowOffset:CGSizeMake(0, 1)]; + + [self addSubview:label]; + } + + [label setStringValue:anObject]; + [label sizeToFit]; + + [label setFrameOrigin:CGPointMake(10,CGRectGetHeight([label bounds]) / 2.0)]; +} + +- (void)setSelected:(BOOL)flag +{ + if (!highlightView) + { + highlightView = [[CPView alloc] initWithFrame:CGRectCreateCopy([self bounds])]; + [highlightView setBackgroundColor:[CPColor blueColor]]; + } + + if (flag) + { + [self addSubview:highlightView positioned:CPWindowBelow relativeTo:label]; + [label setTextColor:[CPColor whiteColor]]; + [label setTextShadowColor:[CPColor blackColor]]; + } + else + { + [highlightView removeFromSuperview]; + [label setTextColor:[CPColor blackColor]]; + [label setTextShadowColor:[CPColor whiteColor]]; + } +} + +@end + +// This class displays a single photo from our collection + +@implementation PhotoCell : CPView +{ + CPImage image; + CPImageView imageView; + CPView highlightView; +} + +- (void)setRepresentedObject:(JSObject)anObject +{ + if (!imageView) + { + imageView = [[CPImageView alloc] initWithFrame:CGRectMakeCopy([self bounds])]; + [imageView setAutoresizingMask:CPViewWidthSizable | CPViewHeightSizable]; + [imageView setImageScaling:CPScaleProportionally]; + [imageView setHasShadow:YES]; + [self addSubview:imageView]; + } + + [image setDelegate:nil]; + + image = [[CPImage alloc] initWithContentsOfFile:thumbForFlickrPhoto(anObject)]; + + [image setDelegate:self]; + + if ([image loadStatus] == CPImageLoadStatusCompleted) + [imageView setImage:image]; + else + [imageView setImage:nil]; +} + +- (void)imageDidLoad:(CPImage)anImage +{ + [imageView setImage:anImage]; +} + +- (void)setSelected:(BOOL)flag +{ + if (!highlightView) + { + highlightView = [[CPView alloc] initWithFrame:[self bounds]]; + [highlightView setBackgroundColor:[CPColor colorWithCalibratedWhite:0.8 alpha:0.6]]; + [highlightView setAutoresizingMask:CPViewWidthSizable | CPViewHeightSizable]; + } + + if (flag) + { + [highlightView setFrame:[self bounds]]; + [self addSubview:highlightView positioned:CPWindowBelow relativeTo:imageView]; + } + else + [highlightView removeFromSuperview]; +} + +@end + +// helper javascript functions for turning a Flickr photo object into a URL for getting the image + +function urlForFlickrPhoto(photo) +{ + return "http://farm" + photo.farm + ".static.flickr.com/" + photo.server + "/" + photo.id+"_" + photo.secret + ".jpg"; +} + +function thumbForFlickrPhoto(photo) +{ + return "http://farm" + photo.farm + ".static.flickr.com/" + photo.server + "/" + photo.id + "_" + photo.secret + "_m.jpg"; +} \ No newline at end of file diff --git a/samples/Objective-J/LightsOff.j b/samples/Objective-J/LightsOff.j new file mode 100644 index 00000000..70959136 --- /dev/null +++ b/samples/Objective-J/LightsOff.j @@ -0,0 +1,88 @@ +@import +@import +@import +@import +@import "LOBoard.j" + +@implementation LOInfoView : CPView +{ +} + +- (void)drawRect:(CGRect)r +{ + [[CPColor whiteColor] setFill] + var path = [CPBezierPath bezierPath]; + [path appendBezierPathWithRoundedRect:CGRectMake(5, 0, CGRectGetWidth([self bounds]) - 10.0, CGRectGetHeight([self bounds])) xRadius:10 yRadius:10]; + [path fill]; +} + +@end + +@implementation AppController : CPObject +{ +} + +- (CPPanel)initInfoWindow +{ + var infoWindow = [[CPPanel alloc] initWithContentRect:CGRectMake(400, 50, 320, 480) styleMask:CPHUDBackgroundWindowMask | CPResizableWindowMask]; + [infoWindow setFloatingPanel:YES]; + + var _infoContent = [infoWindow contentView], + _iconImage = [[CPImage alloc] initWithContentsOfFile:"Resources/icon.png" size:CPSizeMake(59, 60)], + _iconView = [[CPImageView alloc] initWithFrame:CGRectMake(125, 0, 59, 60)]; + + [_iconView setImage:_iconImage]; + [_infoContent addSubview:_iconView]; + + var _infoView = [[LOInfoView alloc] initWithFrame:CGRectMake(0, 65, 320, 395)], + _webView = [[CPWebView alloc] initWithFrame:CGRectMake(20, 0, 270, 370)]; + + [_webView loadHTMLString:@"

Lights Off

Lights Off is a fantastic game exclusively for iPhone and iPod touch and inspired by Tiger Electronic's 'Lights Out'.

The goal of the game is simply to switch all of the lights off, but it's harder than it looks! Give the first few levels a try in the playable demo to the left.

"]; + + [_infoView addSubview:_webView]; + + [_infoContent addSubview:_infoView]; + + return infoWindow; +} + +- (void)applicationDidFinishLaunching:(CPNotification)aNotification +{ + /* Enable Logging (DEBUG) */ + // CPLogRegister(CPLogPopup); + + var rootWindow = [[CPWindow alloc] initWithContentRect:CGRectMakeZero() styleMask:CPBorderlessBridgeWindowMask]; + [rootWindow setBackgroundColor:[CPColor grayColor]]; + [rootWindow orderFront:self]; + + var infoWindow = [self initInfoWindow], + gameWindow = [[CPPanel alloc] initWithContentRect:CGRectMake(50, 50, 324, 482) styleMask:CPHUDBackgroundWindowMask]; + [gameWindow setFloatingPanel:YES]; + [gameWindow setTitle:@"Lights Off"]; + + contentView = [gameWindow contentView]; + + var _board = [[LOBoard alloc] initWithFrame:CGRectMake(2, 0, 320, 480)], + _bgImage = [[CPImage alloc] initWithContentsOfFile:"Resources/lo-background.png" size:CPSizeMake(320, 480)]; + [_board setImage:_bgImage]; + [_board resetBoard]; + + var _buttonImage = [[CPImage alloc] initWithContentsOfFile:"Resources/button-reset.png" size:CPSizeMake(90, 28)], + _buttonPressImage = [[CPImage alloc] initWithContentsOfFile:"Resources/button-reset-press.png" size:CPSizeMake(90, 28)], + _resetButton = [[CPButton alloc] initWithFrame:CGRectMake(195, 422, 90, 28)]; + + [_resetButton setImage:_buttonImage]; + [_resetButton setAlternateImage:_buttonPressImage]; + [_resetButton setBordered:NO]; + + [contentView addSubview:_board]; + [contentView addSubview:_resetButton]; + + [_resetButton setTarget:_board]; + [_resetButton setAction:@selector(resetBoard)]; + + [gameWindow orderFront:self]; + [infoWindow orderFront:self]; +} + +@end \ No newline at end of file diff --git a/samples/Objective-J/iTunesLayout.j b/samples/Objective-J/iTunesLayout.j new file mode 100644 index 00000000..c1ffb2e9 --- /dev/null +++ b/samples/Objective-J/iTunesLayout.j @@ -0,0 +1,47 @@ + +@import + + +@implementation AppController : CPObject +{ +} + +- (void)applicationDidFinishLaunching:(CPNotification)aNotification +{ + // The end result of this layout will be the kind of master/detail/auxilliary view + // found in iTunes, Mail, and many other apps. + + var theWindow = [[CPWindow alloc] initWithContentRect:CGRectMakeZero() styleMask:CPBorderlessBridgeWindowMask], + contentView = [theWindow contentView]; + + var navigationArea = [[CPView alloc] initWithFrame:CGRectMake(0.0, 0.0, 150.0, CGRectGetHeight([contentView bounds]) - 150.0)]; + + [navigationArea setBackgroundColor:[CPColor redColor]]; + + // This view will grow in height, but stay fixed width attached to the left side of the screen. + [navigationArea setAutoresizingMask:CPViewHeightSizable | CPViewMaxXMargin]; + + [contentView addSubview:navigationArea]; + + var metaDataArea = [[CPView alloc] initWithFrame:CGRectMake(0.0, CGRectGetMaxY([navigationArea frame]), 150.0, 150.0)]; + + [metaDataArea setBackgroundColor:[CPColor greenColor]]; + + // This view will stay the same size in both directions, and fixed to the lower left corner. + [metaDataArea setAutoresizingMask:CPViewMinYMargin | CPViewMaxXMargin]; + + [contentView addSubview:metaDataArea]; + + var contentArea = [[CPView alloc] initWithFrame:CGRectMake(150.0, 0.0, CGRectGetWidth([contentView bounds]) - 150.0, CGRectGetHeight([contentView bounds]))]; + + [contentArea setBackgroundColor:[CPColor blueColor]]; + + // This view will grow in both height an width. + [contentArea setAutoresizingMask:CPViewWidthSizable | CPViewHeightSizable]; + + [contentView addSubview:contentArea]; + + [theWindow orderFront:self]; +} + +@end \ No newline at end of file diff --git a/samples/Public Key/gpg_key.asc b/samples/Public Key/gpg_key.asc new file mode 100644 index 00000000..b6e37bf1 --- /dev/null +++ b/samples/Public Key/gpg_key.asc @@ -0,0 +1,76 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v2 + +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 +=xJ8l +-----END PGP PUBLIC KEY BLOCK----- diff --git a/samples/Public Key/id.pub b/samples/Public Key/id.pub new file mode 100644 index 00000000..db965884 --- /dev/null +++ b/samples/Public Key/id.pub @@ -0,0 +1 @@ +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQConqV+vS0WfY9swk8St+JcRuhft0jTg4IrAEfmxahSLurkbf54jbe8mrNn96Nm2gkRzs2RNVQ9r4dZzdhKTUk395Vs3LbX3cfdRNaCrs3udqhRZK7Go69DQECnEHFNczBxSrhT5DoO4nuzVimHgSsX7rHKHo6J7SDNowf83/nLUr7SAJvOeQo5yZQqqZQi5NXqH6pEOQtWPILdbZWuhq8s4JIXc38I+w3IXEJ0ttsfkyShv85bhwSFzrOlq2oGY37YVWeXPREXg9ksA6rlxe29SIdAQbINlgJ/ELzDVMYiaQkI5opAvI2EzPVd4325PcMgyFM/weO9F6bKZaGCNyt3 diff --git a/samples/Public Key/id_rsa.pub b/samples/Public Key/id_rsa.pub new file mode 100644 index 00000000..4c936646 --- /dev/null +++ b/samples/Public Key/id_rsa.pub @@ -0,0 +1 @@ +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQCw3QQtYgRViVH8ZpkQ2A7BuCeyPYC4hB9kKNhxwUfJ2hFgW8soGMBhsLN+vOeAJ2IXDMsezJO2/qhoZFQMvHoWpWTRTLPeNtBsKD+nhOZX28A4D+QRzVZ6hdWoh9W+mIP69MIT3aX35oLb86IycbNdRJlEK4FAUt7tjezNkU7boQ== root@use1-2.nitrousbox.com diff --git a/samples/Public Key/sunCert.asc b/samples/Public Key/sunCert.asc new file mode 100644 index 00000000..32f204b1 --- /dev/null +++ b/samples/Public Key/sunCert.asc @@ -0,0 +1,15 @@ +Type Bits/KeyID Date User ID +pub 1024/79949ADD 2005/08/07 sun + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: 2.6.3i + +mQCNA0L2Km8AAAEEANRAVMn8HBxfYaGhLqtQ3IZJArn9wpcQ+7sH/F9PaXIjzHRQ +rfFkfmxxp9lVjCk0LM/BnnlnUmyz6F8K7V0Gi40Am4+ln1zHvZZIQJYGrDhDnjb7 +I5TVeD4Ib5bQ1CoUbIhv2LocCeR6OjefQgGmerC5RQ3d5ci7uB0pVpd5lJrdAAUR +tBhzdW4gPHN1bi5zdHJvbmdzd2FuLm9yZz6JAJUDBRBC9ipvHSlWl3mUmt0BAUZR +A/43nuZbxADMSviu54Mj8pvQbYeGLQVabiWT6h7L0ZPX4MWpFH3dTixBfRrZRSsj +0AgiMMuZAMebfOe+Xf9uDQv7p1yumEiNg43tg85zyawkARWNTZZ04woxtvAqNwXn +lQotGz7YA6JMxry9RQo5yI4Y4dPnVZ/o8eDpP0+I88cOhQ== +=lLvB +-----END PGP PUBLIC KEY BLOCK----- diff --git a/samples/PureBasic/Example_Sine.pb b/samples/PureBasic/Example_Sine.pb new file mode 100644 index 00000000..4170ff6c --- /dev/null +++ b/samples/PureBasic/Example_Sine.pb @@ -0,0 +1,137 @@ +EnableExplicit + +; ##################################################### Includes #################################################### + +XIncludeFile "Includes/AudioOut.pbi" + +; ##################################################### Prototypes ################################################## + +; ##################################################### Structures ################################################## + +; ##################################################### Constants ################################################### + +#Samplerate = 44100 + +; ##################################################### Structures ################################################## + +Structure Main + *AudioOut + + Quit.i +EndStructure +Global Main.Main + +Structure Main_Window + ID.i + + TrackBar.i [10] +EndStructure +Global Main_Window.Main_Window + +; ##################################################### Variables ################################################### + +Global Frequency.d = 1000 +Global Amplitude.d = 0.25 + +; ##################################################### Procedures ################################################## + +Procedure Main_Window_Open() + Main_Window\ID = OpenWindow(#PB_Any, 0, 0, 800, 100, "AudioOut Example", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered) + + If Main_Window\ID + + Main_Window\TrackBar[0] = TrackBarGadget(#PB_Any, 10, 10, 780, 30, 0, 20000) + SetGadgetState(Main_Window\TrackBar[0], Frequency) + + Main_Window\TrackBar[1] = TrackBarGadget(#PB_Any, 10, 40, 780, 30, 0, 1000) + SetGadgetState(Main_Window\TrackBar[1], Amplitude*1000) + + EndIf +EndProcedure + +Procedure Notifier_CallBack(*AudioOut) + Protected *Temp, Temp_Size.i + Static Rotation.d + + While AudioOut::GetQueuedBlocks(*AudioOut) <= 3 + + Temp_Size = AudioOut::GetBufferBlocksize(*AudioOut) + If Temp_Size > 0 + *Temp = AllocateMemory(Temp_Size) + + Define Left.d, Right.d, i + For i = 0 To Temp_Size / 4 - 1 + Left = Sin(Rotation) * Amplitude + Right = Sin(Rotation) * Amplitude + + PokeW(*Temp + i*4 , Left*32767) + PokeW(*Temp + i*4 + 2, Right*32767) + + Rotation + 2.0*#PI / #Samplerate * Frequency + Next + + AudioOut::Write_Data(Main\AudioOut, *Temp, Temp_Size) + + FreeMemory(*Temp) + EndIf + + Wend +EndProcedure + +; ##################################################### Initialisation ############################################## + +Main_Window_Open() + +AudioOut::GetDevices() + +ForEach AudioOut::Device() + Debug PeekS(AudioOut::@Device()\szPname) +Next + +Main\AudioOut = AudioOut::Initialize(#WAVE_MAPPER, #Samplerate, 2, 16, @Notifier_CallBack()) + +If Not Main\AudioOut + Debug AudioOut::GetError() + End +EndIf + +Notifier_CallBack(Main\AudioOut) + +; ##################################################### Main ######################################################## + +Repeat + + Repeat + Select WaitWindowEvent(100) + Case #PB_Event_Gadget + Select EventGadget() + Case Main_Window\TrackBar[0] + Frequency = GetGadgetState(Main_Window\TrackBar[0]) + Debug Frequency + + Case Main_Window\TrackBar[1] + Amplitude = GetGadgetState(Main_Window\TrackBar[1]) / 1000 + + EndSelect + + Case #PB_Event_CloseWindow + Main\Quit = #True + + Case 0 + Break + EndSelect + ForEver + +Until Main\Quit + +; ##################################################### End ######################################################### + +AudioOut::Deinitialize(Main\AudioOut) + +; IDE Options = PureBasic 5.30 Beta 2 (Windows - x64) +; CursorPosition = 109 +; FirstLine = 79 +; Folding = - +; EnableUnicode +; EnableThread +; EnableXP diff --git a/samples/PureBasic/Memory.pbi b/samples/PureBasic/Memory.pbi new file mode 100644 index 00000000..75cc95df --- /dev/null +++ b/samples/PureBasic/Memory.pbi @@ -0,0 +1,203 @@ + +Structure Memory_Operation + Src_Offset.q + Src_Size.q + + Dst_Offset.q + Dst_Size.q + + Copy_Size.q +EndStructure + +; #### Cuts the Offset's / Sizes of the memory operation to prevent memory violations +Procedure Memory_Operation_Check(*Memory_Operation.Memory_Operation) + Protected Temp.q + + If *Memory_Operation\Src_Offset < 0 + *Memory_Operation\Copy_Size + *Memory_Operation\Src_Offset + *Memory_Operation\Dst_Offset - *Memory_Operation\Src_Offset + *Memory_Operation\Src_Offset - *Memory_Operation\Src_Offset + EndIf + + If *Memory_Operation\Dst_Offset < 0 + *Memory_Operation\Copy_Size + *Memory_Operation\Dst_Offset + *Memory_Operation\Src_Offset - *Memory_Operation\Dst_Offset + *Memory_Operation\Dst_Offset - *Memory_Operation\Dst_Offset + EndIf + + Temp = *Memory_Operation\Src_Size - *Memory_Operation\Src_Offset + If *Memory_Operation\Copy_Size > Temp + *Memory_Operation\Copy_Size = Temp + EndIf + + Temp = *Memory_Operation\Dst_Size - *Memory_Operation\Dst_Offset + If *Memory_Operation\Copy_Size > Temp + *Memory_Operation\Copy_Size = Temp + EndIf + + If *Memory_Operation\Copy_Size < 0 + *Memory_Operation\Copy_Size = 0 + EndIf + + ProcedureReturn #True +EndProcedure + +; #### Fills a *Destination with a specified amount of data. +; #### It cuts everything, to prevent memory violations +Procedure Memory_Range_Fill(Ascii.a, Fill_Size.q, *Dst, Dst_Offset.q, Dst_Size.q=-1) + Protected Temp.q + + If Not *Dst + ProcedureReturn #False + EndIf + + If Dst_Size = -1 + Dst_Size.q = MemorySize(*Dst) + EndIf + + If Dst_Offset < 0 + Fill_Size + Dst_Offset + Dst_Offset - Dst_Offset + EndIf + + Temp = Dst_Size - Dst_Offset + If Fill_Size > Temp + Fill_Size = Temp + EndIf + + If Fill_Size > 0 + FillMemory(*Dst+Dst_Offset, Fill_Size, Ascii) + EndIf + + ProcedureReturn #True +EndProcedure + +; #### Copies a specified amount of data (Copy_Size) from the source to the destination. +; #### It cuts everything, to prevent memory violations +Procedure Memory_Range_Copy(*Src, Src_Offset.q, *Dst, Dst_Offset.q, Copy_Size.q, Src_Size.q=-1, Dst_Size.q=-1) + Protected Temp.q + If Not *Src + ProcedureReturn #False + EndIf + + If Not *Dst + ProcedureReturn #False + EndIf + + If Src_Size = -1 + Src_Size.q = MemorySize(*Src) + EndIf + If Dst_Size = -1 + Dst_Size.q = MemorySize(*Dst) + EndIf + + If Src_Offset < 0 + Copy_Size + Src_Offset + Dst_Offset - Src_Offset + Src_Offset - Src_Offset + EndIf + + If Dst_Offset < 0 + Copy_Size + Dst_Offset + Src_Offset - Dst_Offset + Dst_Offset - Dst_Offset + EndIf + + Temp = Src_Size - Src_Offset + If Copy_Size > Temp + Copy_Size = Temp + EndIf + + Temp = Dst_Size - Dst_Offset + If Copy_Size > Temp + Copy_Size = Temp + EndIf + + If Copy_Size > 0 + CopyMemory(*Src+Src_Offset, *Dst+Dst_Offset, Copy_Size) + EndIf + + ProcedureReturn #True +EndProcedure + +; #### Copies (MoveMemory) a specified amount of data (Copy_Size) from the source to the destination. +; #### It cuts everything, to prevent memory violations +Procedure Memory_Range_Move(*Src, Src_Offset.q, *Dst, Dst_Offset.q, Copy_Size.q, Src_Size.q=-1, Dst_Size.q=-1) + Protected Temp.q + If Not *Src + ProcedureReturn #False + EndIf + + If Not *Dst + ProcedureReturn #False + EndIf + + If Src_Size = -1 + Src_Size.q = MemorySize(*Src) + EndIf + If Dst_Size = -1 + Dst_Size.q = MemorySize(*Dst) + EndIf + + If Src_Offset < 0 + Copy_Size + Src_Offset + Dst_Offset - Src_Offset + Src_Offset - Src_Offset + EndIf + + If Dst_Offset < 0 + Copy_Size + Dst_Offset + Src_Offset - Dst_Offset + Dst_Offset - Dst_Offset + EndIf + + Temp = Src_Size - Src_Offset + If Copy_Size > Temp + Copy_Size = Temp + EndIf + + Temp = Dst_Size - Dst_Offset + If Copy_Size > Temp + Copy_Size = Temp + EndIf + + If Copy_Size > 0 + MoveMemory(*Src+Src_Offset, *Dst+Dst_Offset, Copy_Size) + EndIf + + ProcedureReturn #True +EndProcedure + +; #### Mirrors the memory, usable for little/big endian switching +Procedure Memory_Mirror(*Memory, Memory_Size) + Protected Elements, i + Protected Temp.a, *A.Ascii, *B.Ascii + + If Not *Memory + ProcedureReturn #False + EndIf + + If Memory_Size < 1 + ProcedureReturn #True + EndIf + + Elements = Memory_Size/2 + *A = *Memory + *B = *Memory + Memory_Size - 1 + + For i = 0 To Elements - 1 + Temp = *A\a + *A\a = *B\a + *B\a = Temp + *A + 1 + *B - 1 + Next + + ProcedureReturn #True +EndProcedure +; IDE Options = PureBasic 5.31 (Windows - x64) +; CursorPosition = 190 +; FirstLine = 177 +; Folding = - +; EnableXP +; DisableDebugger diff --git a/samples/SAS/detect_phi.sas b/samples/SAS/detect_phi.sas new file mode 100644 index 00000000..5784d74f --- /dev/null +++ b/samples/SAS/detect_phi.sas @@ -0,0 +1,275 @@ +%macro check_dataset(dset =, obs_lim = max, eldest_age = 89) ; + %local i ; + %local inset_name ; + %let inset_name = &dset ; + + %if %lowcase(&obs_lim) = max %then %do ; + %** Nothing ; + %end ; + %else %do ; + proc surveyselect + data = &inset_name + out = __sub_dset + method = srs + sampsize = &obs_lim SELECTALL + seed = 1234567 + noprint + ; + run; + %let dset = __sub_dset ; + %end ; + + %macro check_varname(regx, msg) ; + create table possible_bad_vars as + select name, label + from these_vars + where prxmatch(compress("/(®x)/i"), name) + ; + + %if &sqlobs > 0 %then %do ; + insert into phi_warnings(dset, variable, label, warning) + select "&inset_name" as dset, name, label, "&msg" + from possible_bad_vars + ; + %end ; + + %mend check_varname ; + + %macro check_vars_for_mrn(length_limit = 6, obs_lim = max) ; + %local char ; + %let char = 2 ; + proc sql noprint ; + select name + into :mrn_array separated by ' ' + from these_vars + where type = &char and length ge &length_limit + ; + quit ; + %if &sqlobs > 0 %then %do ; + %put Checking these vars for possible MRN contents: &mrn_array ; + data __gnu ; + retain + mrn_regex_handle + badcount + ; + set &inset_name (obs = &obs_lim keep = &mrn_array) ; + if _n_ = 1 then do ; + mrn_regex_handle = prxparse("/&mrn_regex/") ; + badcount = 0 ; + end ; + array p &mrn_array ; + do i = 1 to dim(p) ; + if prxmatch(mrn_regex_handle, p{i}) then do ; + badvar = vname(p{i}) ; + badvalue = p{i} ; + badcount = _n_ ; + output ; + end ; + keep badvar badvalue badcount ; + end ; + run ; + proc sql noprint ; + select compress(put(max(badcount), best.)) + into :badcount + from __gnu + ; + insert into phi_warnings(dset, variable, warning) + select distinct "&inset_name", badvar, "Could this var hold MRN values? Contents of %trim(&badcount) records match the pattern given for MRN values. MRNs should never move across sites." + from __gnu ; + drop table __gnu ; + quit ; + %end ; + %mend check_vars_for_mrn ; + + %macro check_vars_for_oldsters(eldest_age = 89, obs_lim = max) ; + %local dtfmts ; + %let dtfmts = 'B8601DA','B8601DN','B8601DT','B8601DZ','B8601LZ','B8601TM','B8601TZ','DATE','DATEAMPM','DATETIME','DAY','DDMMYY', + 'DDMMYYB','DDMMYYC','DDMMYYD','DDMMYYN','DDMMYYP','DDMMYYS','DOWNAME','DTDATE','DTMONYY','DTWKDATX','DTYEAR', + 'DTYYQC','E8601DA','E8601DN','E8601DT','E8601DZ','E8601LZ','E8601TM','E8601TZ','HHMM','HOUR','JULDAY','JULIAN', + 'MMDDYY','MMDDYYB','MMDDYYC','MMDDYYD','MMDDYYN','MMDDYYP','MMDDYYS','MMSS','MMYY','MMYY','MONNAME','MONTH','MONYY', + 'PDJULG','PDJULI','QTR','QTRR','WEEKDATE','WEEKDATX','WEEKDAY','WEEKU','WEEKV','WEEKW','WORDDATE','WORDDATX', + 'YEAR','YYMM','YYMMC','YYMMD','YYMMN','YYMMP','YYMMS','YYMMDD','YYMMDDB','YYMMDDC','YYMMDDD','YYMMDDN','YYMMDDP', + 'YYMMDDS','YYMON','YYQ','YYQC','YYQD','YYQN','YYQP','YYQS','YYQR','YYQRC','YYQRD','YYQRN','YYQRP','YYQRS' ; + + %local num ; + %let num = 1 ; + + proc sql noprint ; + select name + into :dat_array separated by ' ' + from these_vars + where type = &num and (format in (&dtfmts) or lowcase(name) like '%date%') + ; + /* added by cb to shorten the process of looking at all dates */ + %if &sqlobs > 0 %then %do ; + %put Checking these vars for possible DOB contents: &dat_array ; + select 'min(' || trim(name) || ') as ' || name into :var_list separated by ',' + from these_vars + where type = &num and (format in (&dtfmts) or lowcase(name) like '%date%') + ; + create table __gnu as + select &var_list from &inset_name + ; + /* end cb additions */ + quit ; + data __gnu ; + set __gnu (obs = &obs_lim keep = &dat_array) ; + array d &dat_array ; + do i = 1 to dim(d) ; + if n(d{i}) then maybe_age = %calcage(bdtvar = d{i}, refdate = "&sysdate9."d) ; + if maybe_age ge &eldest_age then do ; + badvar = vname(d{i}) ; + badvalue = d{i} ; + output ; + end ; + keep badvar badvalue maybe_age ; + end ; + run ; + proc sql outobs = 30 nowarn ; + insert into phi_warnings(dset, variable, warning) + select distinct "&inset_name", badvar, "If this is a date, at least one value is " || compress(put(maybe_age, best.)) || " years ago, which is older than &eldest_age.. " || + "If this date applies to a person, the record is probably PHI." + from __gnu ; + drop table __gnu ; + quit ; + %end ; + %else %do ; + %put No obvious date variables found in &inset_name.--skipping age checks. ; + %end ; + %mend check_vars_for_oldsters ; + + proc contents noprint data = &inset_name out = these_vars ; + run ; + + proc sql noprint ; + create table phi_warnings (dset char(50), variable char(256), label char(256), warning char(200)) ; + + %check_varname(regx = mrn|hrn , msg = %str(Name suggests this var may be an MRN, which should never move across sites.)) ; + %check_varname(regx = birth_date|BirthDate|DOB|BDate , msg = %str(Name suggests this var may be a date of birth.)) ; + %check_varname(regx = SSN|SocialSecurityNumber|social_security_number|socsec, msg = %str(Name suggests this var may be a social security number.)) ; + + %if %symexist(locally_forbidden_varnames) %then %do ; + %check_varname(regx = &locally_forbidden_varnames, msg = %str(May be on the locally defined list of variables not allowed to be sent to other sites.)) ; + %end ; + + quit ; + + %check_vars_for_mrn(obs_lim = &obs_lim) ; + %check_vars_for_oldsters(obs_lim = &obs_lim, eldest_age = &eldest_age) ; + + title3 "WARNINGS for dataset &inset_name:" ; + + proc sql noprint ; + select count(*) as num_warns into :num_warns from phi_warnings ; + + %if &num_warns = 0 %then %do ; + reset print outobs = 5 NOWARN ; + select "No obvious PHI-like data elements in &inset_name--BUT PLEASE INSPECT THE CONTENTS AND PRINTs TO FOLLOW" as x label = "No warnings for &inset_name" + from &inset_name + ; + %do i = 1 %to 5 ; + %put No obvious phi-like data elements in &inset_name. BUT PLEASE INSPECT THE CONTENTS AND PRINTs CAREFULLY TO MAKE SURE OF THIS! ; + %end ; + %end ; + %else %do ; + reset print ; + select variable, warning from phi_warnings + order by variable, warning + ; + quit ; + %end ; + title3 "Dataset &inset_name" ; + proc contents data = &inset_name varnum ; + run ; + /* + proc print data = &inset_name (obs = 20) ; + run ; + */ + ** TODO: make the print print out recs that trip the value warnings. ; + proc sql number ; + select * + from &inset_name (obs = 20) + ; + quit ; + + quit ; + + %RemoveDset(dset = __sub_dset) ; + %RemoveDset(dset = possible_bad_vars) ; + %RemoveDset(dset = phi_warnings) ; + %RemoveDset(dset = these_vars) ; + +%mend check_dataset ; + +%macro detect_phi(transfer_lib, obs_lim = max, eldest_age = 89) ; + + %put ; + %put ; + %put ============================================================== ; + %put ; + %put Macro detect_phi: ; + %put ; + %put Checking all datasets found in %sysfunc(pathname(&transfer_lib)) for the following signs of PHI: ; + %put - Variable names signifying sensitive items like 'MRN', 'birth_date', 'SSN' and so forth. ; + %if %symexist(locally_forbidden_varnames) %then %do ; + %put - Variable names on the list defined in the standard macro variable locally_forbidden_varnames (here those names are: &locally_forbidden_varnames). ; + %end ; + %put - Contents of CHARACTER variables that match the pattern given in the standard macro variable mrn_regex (here that var is &mrn_regex) ; + %put Please note that numeric variables ARE NOT CHECKED FOR MRN-LIKE CONTENT. ; + %put - The contents of date variables (as divined by their formats) for values that, if they were DOBs, would indicate a person older than &eldest_age years. ; + %put ; + %put THIS IS BETA SOFTWARE-PLEASE SCRUTINIZE THE RESULTS AND REPORT PROBLEMS TO pardee.r@ghc.org. ; + %put ; + %put THIS MACRO IS NOT A SUBSTITUTE FOR HUMAN INSPECTION AND THOUGHT--PLEASE CAREFULLY INSPECT ALL VARIABLES--WHETHER ; + %put OR NOT THEY TRIP A WARNING--TO MAKE SURE THE DATA COMPORTS WITH YOUR DATA SHARING AGREEMENT!!! ; + %put THIS MACRO IS NOT A SUBSTITUTE FOR HUMAN INSPECTION AND THOUGHT--PLEASE CAREFULLY INSPECT ALL VARIABLES--WHETHER ; + %put OR NOT THEY TRIP A WARNING--TO MAKE SURE THE DATA COMPORTS WITH YOUR DATA SHARING AGREEMENT!!! ; + %put ; + %put THIS MACRO IS NOT A SUBSTITUTE FOR HUMAN INSPECTION AND THOUGHT--PLEASE CAREFULLY INSPECT ALL VARIABLES--WHETHER ; + %put OR NOT THEY TRIP A WARNING--TO MAKE SURE THE DATA COMPORTS WITH YOUR DATA SHARING AGREEMENT!!! ; + %put THIS MACRO IS NOT A SUBSTITUTE FOR HUMAN INSPECTION AND THOUGHT--PLEASE CAREFULLY INSPECT ALL VARIABLES--WHETHER ; + %put OR NOT THEY TRIP A WARNING--TO MAKE SURE THE DATA COMPORTS WITH YOUR DATA SHARING AGREEMENT!!! ; + %put ; + %put THIS MACRO IS NOT A SUBSTITUTE FOR HUMAN INSPECTION AND THOUGHT--PLEASE CAREFULLY INSPECT ALL VARIABLES--WHETHER ; + %put OR NOT THEY TRIP A WARNING--TO MAKE SURE THE DATA COMPORTS WITH YOUR DATA SHARING AGREEMENT!!! ; + %put THIS MACRO IS NOT A SUBSTITUTE FOR HUMAN INSPECTION AND THOUGHT--PLEASE CAREFULLY INSPECT ALL VARIABLES--WHETHER ; + %put OR NOT THEY TRIP A WARNING--TO MAKE SURE THE DATA COMPORTS WITH YOUR DATA SHARING AGREEMENT!!! ; + %put ; + %put THIS MACRO IS NOT A SUBSTITUTE FOR HUMAN INSPECTION AND THOUGHT--PLEASE CAREFULLY INSPECT ALL VARIABLES--WHETHER ; + %put OR NOT THEY TRIP A WARNING--TO MAKE SURE THE DATA COMPORTS WITH YOUR DATA SHARING AGREEMENT!!! ; + %put THIS MACRO IS NOT A SUBSTITUTE FOR HUMAN INSPECTION AND THOUGHT--PLEASE CAREFULLY INSPECT ALL VARIABLES--WHETHER ; + %put OR NOT THEY TRIP A WARNING--TO MAKE SURE THE DATA COMPORTS WITH YOUR DATA SHARING AGREEMENT!!! ; + %put ; + %put ; + %put ============================================================== ; + %put ; + %put ; + + title1 "PHI-Detection Report for the datasets in %sysfunc(pathname(&transfer_lib))." ; + title2 "please inspect all output carefully to make sure it comports with your data sharing agreement!!!" ; + + proc sql noprint ; + ** describe table dictionary.tables ; + + select trim(libname) || '.' || memname as dset + into :d1-:d999 + from dictionary.tables + where libname = "%upcase(&transfer_lib)" AND + memtype = 'DATA' + ; + %local num_dsets ; + %let num_dsets = &sqlobs ; + quit ; + + %local i ; + + %if &num_dsets = 0 %then %do i = 1 %to 10 ; + %put ERROR: NO DATASETS FOUND IN &transfer_lib!!!! ; + %end ; + + %do i = 1 %to &num_dsets ; + %put about to check &&d&i ; + %check_dataset(dset = &&d&i, obs_lim = &obs_lim, eldest_age = &eldest_age) ; + %end ; + +%mend detect_phi ; diff --git a/samples/Shell/filenames/9fs b/samples/Shell/filenames/9fs new file mode 100644 index 00000000..70c49617 --- /dev/null +++ b/samples/Shell/filenames/9fs @@ -0,0 +1,55 @@ +#!/bin/rc +# 9fs filesystem [mountpoint] - srv & mount filesystem, usually from plan 9 + +rfork e +switch($1){ +case '' + echo usage: 9fs service '[mountpoint]' >[1=2] + exit usage +case kfs + if(! test -f /srv/kfs) + disk/kfs + mount -c /srv/kfs /n/kfs +case dump + mount /srv/boot /n/dump dump >[2]/dev/null || + mount /srv/boot /n/dump main/archive || + mount /srv/boot /n/dump dump # again to print error +case snap + mount /srv/boot /n/snap main/snapshot +case other + mount -C /srv/boot /n/other other +case juke # ye olde file server + srv -q il!jukefs && mount /srv/il!jukefs /n/juke +case sources + srv -nq tcp!sources.cs.bell-labs.com sources /n/sources +case sourcesdump + 9fs sources + mount -n /srv/sources /n/sourcesdump main/archive +case sourcessnap + 9fs sources + mount -n /srv/sources /n/sourcessnap main/snapshot +# arbitrary venti archives +case vac:* + vacfs <{echo $1} +case *.vac + if (test -e $1) + score=$1 + if not if (! ~ $1 /* && test -e $home/lib/vac/$1) + score=$home/lib/vac/$1 + if not if (! ~ $1 /* && test -e /lib/vac/$1) + score=/lib/vac/$1 + if not { + echo $0: $1: no such score file >[1=2] + exit 'no score file' + } + vacfs -m /n/`{basename $1 .vac} `{cat $score} +case wiki + srv -m 'net!plan9.bell-labs.com!wiki' wiki /mnt/wiki +case * + switch($#*){ + case 1 + srv -m $1 + case * + srv -m $1 $1 $2 + } +} diff --git a/samples/Shell/filenames/man b/samples/Shell/filenames/man new file mode 100644 index 00000000..37043d16 --- /dev/null +++ b/samples/Shell/filenames/man @@ -0,0 +1,149 @@ +#!/bin/rc +# man - print manual pages +rfork e + +. /sys/man/fonts + +cmd=n +sec=() +S=/sys/man +d=0 + +fn roff { + preproc=() + postproc=cat + x=`{doctype $2} + if (~ $1 t) { + if(~ $x *grap*) + preproc=($preproc grap) + if(~ $x *pic*) + preproc=($preproc pic) + Nflag=-Tutf + } + if not { + Nflag='-N' + Lflag='-rL1000i' + # setting L changes page length to infinity (sed script removes empty lines) + if (grep -s '^\.(2C|sp *[0-9]*\.)' $2) + postproc=col + } + if(~ $x *eqn*) + preproc=($preproc eqn) + if(~ $x *tbl*) + preproc=($preproc tbl) + {echo -n $FONTS; cat $2 [1=2] + exit + } + if(test -d $S/$1){ + sec=($sec $1) + shift + } + if not + switch($1) { + case -b ; cmd=b ; shift + case -n ; cmd=n ; shift + case -P ; cmd=P ; shift + case -p ; cmd=p ; shift + case -S ; search=no ; shift + case -t ; cmd=t ; shift + case -w ; cmd=w ; shift + case * ; d=1 + } +} +if(~ $#sec 0) { + sec=`{ls -pd $S/[0-9]* } +} +ix=$S/$sec/INDEX +if(~ $#* 1) pat='^'^$1^' ' +if not pat='^('^`{echo $* | sed 's/ /|/g'}^') ' +fils=() +if(~ $search yes) +for(i in $S/$sec){ + if(/bin/test -f $i/INDEX){ + try=`{grep -i $pat $i/INDEX | sed 's/^[^ ]* //' | sort -u} + if(! ~ $#try 0) + fils=($fils $i/$try) + } +} +# bug: should also do following loop if not all pages found +if(~ $#fils 0) { + # nothing in INDEX. try for file of given name + for(i) { + if(~ $i intro) i=0intro + for(n in $sec) { + try=`{echo $S/$n/$i | tr A-Z a-z} + if (/bin/test -f $try) + fils=($fils $try) + } + } + if(~ $#fils 0) { + echo 'man: no manual page' >[1=2] + exit 'no man' + } +} +for(i in $fils) { + if(! /bin/test -f $i) + echo need $i >[1=2] + if not { + switch($cmd) { + case w + echo $i + + case t + roff t $i + + case p + roff t $i | grep -v '^x X html' | proof + + case P + roff t $i | page + + case n + roff n $i | sed ' + ${ + /^$/p + } + //N + /^\n$/D' + + case b + x=`{echo $i | sed 's;/sys/man/(.*)/(.*);\1 \2;'} + if(~ $x(2) 0intro) x=($x(1) intro) + roff n $i | sed ' + ${ + /^$/p + } + //N + /^\n$/D' | + plumb -i -d edit -a 'action=showdata filename=/man/'$x(2)^'('$x(1)^')' + } + } +} diff --git a/samples/Smalltalk/Booleans.cs b/samples/Smalltalk/Booleans.cs new file mode 100644 index 00000000..551f22a0 --- /dev/null +++ b/samples/Smalltalk/Booleans.cs @@ -0,0 +1 @@ +'From Pharo4.0 of 18 March 2013 [Latest update: #40152] on 6 August 2014 at 10:12:19.27738 pm'! Object subclass: #Boolean instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'Kernel-Objects'! Boolean subclass: #False instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'Kernel-Objects'! Boolean subclass: #True instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'Kernel-Objects'! !Boolean methodsFor: '*monticellofiletree-core' stamp: 'dkh 4/6/2012 15:56:14'! writeCypressJsonOn: aStream forHtml: forHtml indent: startIndent "by default ignore ... is used for Dictionary and Array, i.e., container objects and String which actually encodes itself differently for HTML" aStream nextPutAll: self printString! ! !Boolean methodsFor: 'copying' stamp: 'tk 8/20/1998 16:07'! veryDeepCopyWith: deepCopier "Return self. I can't be copied. Do not record me."! ! !Boolean methodsFor: 'copying'! deepCopy "Receiver has two concrete subclasses, True and False. Only one instance of each should be made, so return self."! ! !Boolean methodsFor: 'copying'! shallowCopy "Receiver has two concrete subclasses, True and False. Only one instance of each should be made, so return self."! ! !Boolean methodsFor: 'logical operations'! not "Negation. Answer true if the receiver is false, answer false if the receiver is true." self subclassResponsibility! ! !Boolean methodsFor: 'logical operations'! & aBoolean "Evaluating conjunction. Evaluate the argument. Then answer true if both the receiver and the argument are true." self subclassResponsibility! ! !Boolean methodsFor: 'logical operations'! | aBoolean "Evaluating disjunction (OR). Evaluate the argument. Then answer true if either the receiver or the argument is true." self subclassResponsibility! ! !Boolean methodsFor: 'logical operations' stamp: 'stephane.ducasse 5/20/2009 21:28'! ==> aBlock "The material conditional, also known as the material implication or truth functional conditional. Correspond to not ... or ... and does not correspond to the English if...then... construction. known as: b if a a implies b if a then b b is a consequence of a a therefore b (but note: 'it is raining therefore it is cloudy' is implication; 'it is autumn therefore the leaves are falling' is equivalence). Here is the truth table for material implication: p | q | p ==> q -------|-------|------------- T | T | T T | F | F F | T | T F | F | T " ^self not or: [aBlock value]! ! !Boolean methodsFor: 'logical operations'! eqv: aBoolean "Answer true if the receiver is equivalent to aBoolean." ^self == aBoolean! ! !Boolean methodsFor: 'controlling'! or: alternativeBlock "Nonevaluating disjunction. If the receiver is false, answer the value of the argument, alternativeBlock; otherwise answer true without evaluating the argument." self subclassResponsibility! ! !Boolean methodsFor: 'controlling'! ifFalse: alternativeBlock "If the receiver is true (i.e., the condition is true), then the value is the true alternative, which is nil. Otherwise answer the result of evaluating the argument, alternativeBlock. Create an error notification if the receiver is nonBoolean. Execution does not actually reach here because the expression is compiled in-line." self subclassResponsibility! ! !Boolean methodsFor: 'controlling'! ifTrue: trueAlternativeBlock ifFalse: falseAlternativeBlock "If the receiver is true (i.e., the condition is true), then answer the value of the argument trueAlternativeBlock. If the receiver is false, answer the result of evaluating the argument falseAlternativeBlock. If the receiver is a nonBoolean then create an error notification. Execution does not actually reach here because the expression is compiled in-line." self subclassResponsibility! ! !Boolean methodsFor: 'controlling'! ifFalse: falseAlternativeBlock ifTrue: trueAlternativeBlock "Same as ifTrue:ifFalse:." self subclassResponsibility! ! !Boolean methodsFor: 'controlling'! ifTrue: alternativeBlock "If the receiver is false (i.e., the condition is false), then the value is the false alternative, which is nil. Otherwise answer the result of evaluating the argument, alternativeBlock. Create an error notification if the receiver is nonBoolean. Execution does not actually reach here because the expression is compiled in-line." self subclassResponsibility! ! !Boolean methodsFor: 'controlling'! and: alternativeBlock "Nonevaluating conjunction. If the receiver is true, answer the value of the argument, alternativeBlock; otherwise answer false without evaluating the argument." self subclassResponsibility! ! !Boolean methodsFor: '*Fuel' stamp: 'MartinDias 2/21/2013 12:49'! fuelAccept: aGeneralMapper ^aGeneralMapper visitHookPrimitive: self! ! !Boolean methodsFor: '*Fuel' stamp: 'MartinDias 2/21/2013 12:49'! serializeOn: anEncoder "Do nothing"! ! !Boolean methodsFor: '*NativeBoost-Core' stamp: 'cb 4/22/2013 14:15'! asNBExternalType: gen "boolean value in argument description array defines a simple 0 or 1 constant #( true false ) - turned into a 1 and 0 " ^ NBFFIConst value: self asBit! ! !Boolean methodsFor: 'printing'! storeOn: aStream "Refer to the comment in Object|storeOn:." self printOn: aStream! ! !Boolean methodsFor: 'printing' stamp: 'apb 4/21/2006 09:22'! isLiteral ^ true! ! !Boolean methodsFor: 'self evaluating' stamp: 'sd 7/31/2005 21:45'! isSelfEvaluating ^ true! ! !Boolean methodsFor: 'converting' stamp: 'CamilloBruni 3/27/2012 17:20'! asBit "convert myself to an Integer representing 1 for true and 0 for false" self subclassResponsibility! ! !Boolean class methodsFor: '*System-Settings-Browser' stamp: 'alain.plantec 3/18/2009 14:48'! settingInputWidgetForNode: aSettingNode ^ aSettingNode inputWidgetForBoolean! ! !Boolean class methodsFor: '*NativeBoost-Core' stamp: 'IgorStasenko 8/13/2013 16:47'! asNBExternalType: gen ^ NBBool asNBExternalType: gen! ! !Boolean class methodsFor: 'instance creation'! new self error: 'You may not create any more Booleans - this is two-valued logic'! ! !False methodsFor: 'printing'! printOn: aStream aStream nextPutAll: 'false'! ! !False methodsFor: 'logical operations'! not "Negation -- answer true since the receiver is false." ^true! ! !False methodsFor: 'logical operations' stamp: 'md 7/30/2005 18:05'! & aBoolean "Evaluating conjunction -- answer false since receiver is false." ^self! ! !False methodsFor: 'logical operations'! | aBoolean "Evaluating disjunction (OR) -- answer with the argument, aBoolean." ^aBoolean! ! !False methodsFor: 'logical operations' stamp: 'CamilloBruni 8/1/2012 16:25'! xor: aBoolean ^aBoolean value! ! !False methodsFor: 'controlling'! or: alternativeBlock "Nonevaluating disjunction -- answer value of alternativeBlock." ^alternativeBlock value! ! !False methodsFor: 'controlling'! ifFalse: alternativeBlock "Answer the value of alternativeBlock. Execution does not actually reach here because the expression is compiled in-line." ^alternativeBlock value! ! !False methodsFor: 'controlling'! ifTrue: trueAlternativeBlock ifFalse: falseAlternativeBlock "Answer the value of falseAlternativeBlock. Execution does not actually reach here because the expression is compiled in-line." ^falseAlternativeBlock value! ! !False methodsFor: 'controlling'! ifFalse: falseAlternativeBlock ifTrue: trueAlternativeBlock "Answer the value of falseAlternativeBlock. Execution does not actually reach here because the expression is compiled in-line." ^falseAlternativeBlock value! ! !False methodsFor: 'controlling'! ifTrue: alternativeBlock "Since the condition is false, answer the value of the false alternative, which is nil. Execution does not actually reach here because the expression is compiled in-line." ^nil! ! !False methodsFor: 'controlling'! and: alternativeBlock "Nonevaluating conjunction -- answer with false since the receiver is false." ^self! ! !False methodsFor: 'converting' stamp: 'IgorStasenko 12/28/2012 15:09'! asBit ^ 0! ! !True methodsFor: 'controlling'! or: alternativeBlock "Nonevaluating disjunction -- answer true since the receiver is true." ^self! ! !True methodsFor: 'controlling'! ifFalse: alternativeBlock "Since the condition is true, the value is the true alternative, which is nil. Execution does not actually reach here because the expression is compiled in-line." ^nil! ! !True methodsFor: 'controlling'! ifTrue: trueAlternativeBlock ifFalse: falseAlternativeBlock "Answer with the value of trueAlternativeBlock. Execution does not actually reach here because the expression is compiled in-line." ^trueAlternativeBlock value! ! !True methodsFor: 'controlling'! ifFalse: falseAlternativeBlock ifTrue: trueAlternativeBlock "Answer the value of trueAlternativeBlock. Execution does not actually reach here because the expression is compiled in-line." ^trueAlternativeBlock value! ! !True methodsFor: 'controlling'! ifTrue: alternativeBlock "Answer the value of alternativeBlock. Execution does not actually reach here because the expression is compiled in-line." ^alternativeBlock value! ! !True methodsFor: 'controlling'! and: alternativeBlock "Nonevaluating conjunction -- answer the value of alternativeBlock since the receiver is true." ^alternativeBlock value! ! !True methodsFor: 'converting' stamp: 'IgorStasenko 12/28/2012 15:09'! asBit ^ 1! ! !True methodsFor: 'printing'! printOn: aStream aStream nextPutAll: 'true'! ! !True methodsFor: 'logical operations'! not "Negation--answer false since the receiver is true." ^false! ! !True methodsFor: 'logical operations' stamp: 'md 7/30/2005 18:04'! & aBoolean "Evaluating conjunction -- answer aBoolean since receiver is true." ^aBoolean! ! !True methodsFor: 'logical operations'! | aBoolean "Evaluating disjunction (OR) -- answer true since the receiver is true." ^self! ! !True methodsFor: 'logical operations' stamp: 'CamilloBruni 8/1/2012 16:25'! xor: aBoolean ^aBoolean value not! ! !True class methodsFor: '*Fuel' stamp: 'MartinDias 2/21/2013 12:51'! materializeFrom: aDecoder "Answer my unique instance" ^ true! ! !False class methodsFor: '*Fuel' stamp: 'MartinDias 2/21/2013 12:51'! materializeFrom: aDecoder "Answer my unique instance" ^ false! ! \ No newline at end of file diff --git a/samples/Smalltalk/Collections.cs b/samples/Smalltalk/Collections.cs new file mode 100644 index 00000000..e0a79e72 --- /dev/null +++ b/samples/Smalltalk/Collections.cs @@ -0,0 +1 @@ +'From Pharo4.0 of 18 March 2013 [Latest update: #40152] on 7 August 2014 at 2:21:37.309017 pm'! Object subclass: #Collection instanceVariableNames: '' classVariableNames: 'MutexForPicking RandomForPicking' poolDictionaries: '' category: 'Collections-Abstract'! HashedCollection subclass: #Dictionary instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'Collections-Unordered'! Collection class instanceVariableNames: ''! Dictionary class instanceVariableNames: ''! String subclass: #Symbol instanceVariableNames: '' classVariableNames: 'NewSymbols OneCharacterSymbols SymbolTable' poolDictionaries: '' category: 'Collections-Strings'! Symbol class instanceVariableNames: ''! SequenceableCollection subclass: #OrderedCollection instanceVariableNames: 'array firstIndex lastIndex' classVariableNames: '' poolDictionaries: '' category: 'Collections-Sequenceable'! OrderedCollection class uses: TSortable classTrait instanceVariableNames: ''! Object subclass: #Stream instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'Collections-Streams'! Stream class instanceVariableNames: ''! !Collection methodsFor: '*metacello-core-scripting' stamp: 'dkh 9/5/2012 06:26:03.064'! execute: projectSpecBlock against: aScriptExecutor aScriptExecutor executeCollection: self do: projectSpecBlock! ! !Collection methodsFor: 'testing' stamp: 'EstebanLorenzano 8/17/2012 16:40'! includesSubstringAnywhere: testString "Answer whether the receiver includes, anywhere in its nested structure, a string that has testString as a substring" self do: [:element | (element isString) ifTrue: [(element includesSubstring: testString) ifTrue: [^ true]]. (element isCollection) ifTrue: [(element includesSubstringAnywhere: testString) ifTrue: [^ true]]]. ^ false "#(first (second third) ((allSentMessages ('Elvis' includes:)))) includesSubstringAnywhere: 'lvi'"! ! !Collection methodsFor: 'testing'! contains: aBlock "VW compatibility" ^self anySatisfy: aBlock! ! !Collection methodsFor: 'testing' stamp: 'ClementBera 12/2/2013 12:41'! includesAllOf: aCollection self flag: 'use includesAll: instead'. ^ self includesAll: aCollection.! ! !Collection methodsFor: 'testing' stamp: 'CamilloBruni 9/8/2011 14:18'! includesAny: aCollection "Answer whether any element of aCollection is one of the receiver's elements." aCollection do: [:elem | (self includes: elem) ifTrue: [^ true]]. ^ false! ! !Collection methodsFor: 'testing' stamp: 'ls 3/27/2000 17:25'! identityIncludes: anObject "Answer whether anObject is one of the receiver's elements." self do: [:each | anObject == each ifTrue: [^true]]. ^false! ! !Collection methodsFor: 'testing' stamp: 'StephaneDucasse 7/3/2010 22:15'! ifEmpty: aBlock "Evaluate the given block with the receiver as argument, answering its value if the receiver is empty, otherwise answer the receiver." "Note that the fact that this method returns its argument in case the receiver is not empty allows one to write expressions like the following ones: self classifyMethodAs: (myProtocol ifEmpty: ['As yet unclassified'])" ^ self isEmpty ifTrue: [ ^aBlock value ] ifFalse: [ self ]! ! !Collection methodsFor: 'testing' stamp: 'HenrikSperreJohansen 6/28/2010 12:13'! ifEmpty: emptyBlock ifNotEmpty: notEmptyBlock "Evaluate emptyBlock if I'm empty, notEmptyBlock otherwise" " If the notEmptyBlock has an argument, eval with the receiver as its argument" self isEmpty ifTrue: [ ^emptyBlock value ]. ^notEmptyBlock cull: self! ! !Collection methodsFor: 'testing' stamp: 'StephaneDucasse 7/3/2010 22:10'! ifNotEmpty: aBlock "Evaluate the given block with the receiver as argument, answering its value unless the receiver is empty, in which case answer the receiver If the block has an argument, eval with the receiver as its argument, but it might be better to use ifNotEmptyDo: to make the code easier to understand" "Note that the fact that this method returns its argument in case the receiver is empty allows one to write expressions like the following ones: self classifyMethodAs: (myProtocol ifEmpty: ['As yet unclassified']" ^self isEmpty ifTrue: [self] ifFalse: [aBlock cull: self] ! ! !Collection methodsFor: 'testing' stamp: 'ar 11/21/2009 00:36'! ifNotEmptyDo: aBlock "Evaluate the given block with the receiver as its argument." self isEmpty ifFalse: [^ aBlock value: self]. ! ! !Collection methodsFor: 'testing' stamp: 'sma 5/12/2000 14:07'! includes: anObject "Answer whether anObject is one of the receiver's elements." ^ self anySatisfy: [:each | each = anObject]! ! !Collection methodsFor: 'testing' stamp: 'ul 11/11/2009 16:24'! ifEmpty: emptyBlock ifNotEmptyDo: notEmptyBlock "Evaluate emptyBlock if I'm empty, notEmptyBlock otherwise" "Evaluate the notEmptyBlock with the receiver as its argument" self isEmpty ifTrue: [ ^emptyBlock value ]. ^notEmptyBlock value: self! ! !Collection methodsFor: 'testing'! isEmpty "Answer whether the receiver contains any elements." ^self size = 0! ! !Collection methodsFor: 'testing' stamp: 'bf 3/10/2000 09:29'! isEmptyOrNil "Answer whether the receiver contains any elements, or is nil. Useful in numerous situations where one wishes the same reaction to an empty collection or to nil" ^ self isEmpty! ! !Collection methodsFor: 'testing'! occurrencesOf: anObject "Answer how many of the receiver's elements are equal to anObject." | tally | tally := 0. self do: [:each | anObject = each ifTrue: [tally := tally + 1]]. ^tally! ! !Collection methodsFor: 'testing' stamp: 'di 11/6/1998 09:16'! isSequenceable ^ false! ! !Collection methodsFor: 'testing' stamp: 'ul 11/11/2009 16:25'! ifNotEmptyDo: notEmptyBlock ifEmpty: emptyBlock "Evaluate emptyBlock if I'm empty, notEmptyBlock otherwise Evaluate the notEmptyBlock with the receiver as its argument" self isEmpty ifFalse: [ ^notEmptyBlock value: self ]. ^emptyBlock value! ! !Collection methodsFor: 'testing' stamp: 'CamilloBruni 9/8/2011 14:20'! includesAnyOf: aCollection self flag: 'use includesAny: instead'. ^ self includesAny: aCollection. ! ! !Collection methodsFor: 'testing' stamp: 'MarcusDenker 7/17/2013 13:15'! isNotEmpty "Answer whether the receiver contains any elements." ^ self isEmpty not! ! !Collection methodsFor: 'testing' stamp: 'CamilloBruni 9/8/2011 14:18'! includesAll: aCollection "Answer whether all the elements of aCollection are in the receiver." aCollection do: [:elem | (self includes: elem) ifFalse: [^ false]]. ^ true! ! !Collection methodsFor: 'testing' stamp: 'ar 8/17/1999 19:43'! isCollection "Return true if the receiver is some sort of Collection and responds to basic collection messages such as #size and #do:" ^true! ! !Collection methodsFor: 'testing' stamp: 'MarcusDenker 7/17/2013 13:16'! notEmpty "Answer whether the receiver contains any elements." "use isNotEmpty for consistency with isEmpty" ^ self isEmpty not! ! !Collection methodsFor: 'testing' stamp: 'HenrikSperreJohansen 6/28/2010 12:14'! ifNotEmpty: notEmptyBlock ifEmpty: emptyBlock "Evaluate emptyBlock if I'm empty, notEmptyBlock otherwise If the notEmptyBlock has an argument, eval with the receiver as its argument" self isEmpty ifFalse: [ ^notEmptyBlock cull: self ]. ^emptyBlock value! ! !Collection methodsFor: '*Morphic-Base-Basic' stamp: 'CamilloBruni 10/21/2012 23:39'! asDraggableMorph ^ (String streamContents: [ :s| self do: [ :each | s print: each ] separatedBy: [ s space ]]) asStringMorph! ! !Collection methodsFor: 'comparing' stamp: 'SqR 8/3/2000 13:36'! hash "Answer an integer hash value for the receiver such that, -- the hash value of an unchanged object is constant over time, and -- two equal objects have equal hash values" | hash | hash := self species hash. self size <= 10 ifTrue: [self do: [:elem | hash := hash bitXor: elem hash]]. ^hash bitXor: self size hash! ! !Collection methodsFor: 'enumerating' stamp: 'CamilloBruni 3/23/2013 10:46'! reject: rejectBlock thenDo: doBlock "Utility method to improve readability." (self reject: rejectBlock) do: doBlock! ! !Collection methodsFor: 'enumerating' stamp: 'SebastianTleye 6/25/2013 18:41'! flattened "Flattens a collection of collections (no matter how many levels of collections exist). Strings are considered atoms and, as such, won't be flattened Examples: #(1 #(2 3) #(4 (#5))) flattened returns #(1 2 3 4 5) #('string1' #('string2' 'string3')) flattened returns #('string1' 'string2' 'string3')" ^ Array streamContents: [ :stream | self flattenOn: stream].! ! !Collection methodsFor: 'enumerating' stamp: 'nice 1/5/2010 15:59'! detectMin: aBlock "Evaluate aBlock with each of the receiver's elements as the argument. Answer the element for which aBlock evaluates to the lowest number. If collection empty, return nil." | minElement minValue | self do: [:each | | val | minValue == nil ifFalse: [ (val := aBlock value: each) < minValue ifTrue: [ minElement := each. minValue := val]] ifTrue: ["first element" minElement := each. minValue := aBlock value: each]. "Note that there is no way to get the first element that works for all kinds of Collections. Must test every one."]. ^ minElement! ! !Collection methodsFor: 'enumerating' stamp: 'GabrielOmarCotelli 11/26/2013 17:15'! detect: aBlock ifNone: exceptionBlock "Evaluate aBlock with each of the receiver's elements as the argument. Answer the first element for which aBlock evaluates to true. If none evaluate to true, then evaluate the argument, exceptionBlock." ^ self detect: aBlock ifFound: [ :element | element ] ifNone: exceptionBlock! ! !Collection methodsFor: 'enumerating' stamp: 'sma 5/12/2000 11:57'! do: elementBlock separatedBy: separatorBlock "Evaluate the elementBlock for all elements in the receiver, and evaluate the separatorBlock between." | beforeFirst | beforeFirst := true. self do: [:each | beforeFirst ifTrue: [beforeFirst := false] ifFalse: [separatorBlock value]. elementBlock value: each]! ! !Collection methodsFor: 'enumerating' stamp: 'sma 4/30/2000 11:17'! anySatisfy: aBlock "Evaluate aBlock with the elements of the receiver. If aBlock returns true for any element return true. Otherwise return false." self do: [:each | (aBlock value: each) ifTrue: [^ true]]. ^ false! ! !Collection methodsFor: 'enumerating' stamp: 'TudorGirba 3/20/2012 09:07'! intersection: aCollection "Answer the set theoretic intersection of two collections." | set outputSet | set := self asSet. outputSet := Set new. aCollection do: [ :each| ((set includes: each) and: [(outputSet includes: each) not]) ifTrue: [ outputSet add: each]]. ^ self species withAll: outputSet asArray! ! !Collection methodsFor: 'enumerating' stamp: 'nice 12/9/2009 15:37'! findFirstInByteString: aByteString startingAt: start "Find the index of first character starting at start in aByteString that is included in the receiver. Default is to use a naive algorithm. Subclasses might want to implement a more efficient scheme" start to: aByteString size do: [:index | (self includes: (aByteString at: index)) ifTrue: [^ index]]. ^ 0! ! !Collection methodsFor: 'enumerating' stamp: 'CamilloBruni 3/22/2013 22:09'! reject: rejectBlock thenCollect: collectBlock "Utility method to improve readability." ^ (self reject: rejectBlock) collect: collectBlock! ! !Collection methodsFor: 'enumerating' stamp: 'sma 4/30/2000 11:17'! allSatisfy: aBlock "Evaluate aBlock with the elements of the receiver. If aBlock returns false for any element return false. Otherwise return true." self do: [:each | (aBlock value: each) ifFalse: [^ false]]. ^ true! ! !Collection methodsFor: 'enumerating' stamp: 'CamilloBruni 3/22/2013 22:30'! collect: collectBlock thenReject: selectBlock "Utility method to improve readability." ^ (self collect: collectBlock) reject: selectBlock! ! !Collection methodsFor: 'enumerating' stamp: 'StephaneDucasse 1/3/2010 20:15'! groupBy: keyBlock having: selectBlock "This message is deprecated. Please use groupedBy:having:. But we let it right now without warning because we are not sure to remove in the next iteration." ^ self groupedBy: keyBlock having: selectBlock ! ! !Collection methodsFor: 'enumerating' stamp: 'StephaneDucasse 1/2/2012 21:08'! reduce: aBlock "Fold the result of the receiver into aBlock. The argument aBlock must take two or more arguments. It applies the argument, binaryBlock cumulatively to the elements of the receiver. For sequenceable collections the elements will be used in order, for unordered collections the order is unspecified." "#(1 2 3) asSet reduce: [ :a :b | a + b ] --> 1 + 2 + 3 = 6 #(1 2 3 4 5) asSet reduce: [ :a :b :c | a + b + c ] --> 1 + 2 + 3 + 4 + 5 = 15" ^self asOrderedCollection reduce: aBlock! ! !Collection methodsFor: 'enumerating' stamp: 'CamilloBruni 3/22/2013 22:32'! reject: aBlock "Evaluate aBlock with each of the receiver's elements as the argument. Collect into a new collection like the receiver only those elements for which aBlock evaluates to false. Answer the new collection." ^self select: [ :element | (aBlock value: element) == false ]! ! !Collection methodsFor: 'enumerating' stamp: 'jannik.laval 8/27/2010 15:54'! flatCollect: aBlock as: aCollectionClass "Evaluate aBlock for each of the receiver's elements and answer the list of all resulting values flatten one level. Assumes that aBlock returns some kind of collection for each element. Equivalent to the lisp's mapcan" | col | self isEmpty ifTrue: [^self copy ]. col := aCollectionClass new: self size. self do: [ :each | col addAll: (aBlock value: each) ]. ^col! ! !Collection methodsFor: 'enumerating' stamp: 'ST 6/23/2013 11:33'! gather: aBlock "This method is kept for compatibility reasons, use flatCollect instead." ^ self flatCollect: aBlock.! ! !Collection methodsFor: 'enumerating' stamp: 'TudorGirba 11/3/2013 12:12'! flatCollect: aBlock "Evaluate aBlock for each of the receiver's elements and answer the list of all resulting values flatten one level. Assumes that aBlock returns some kind of collection for each element. Equivalent to the lisp's mapcan" | stream | self isEmpty ifTrue: [ ^ self copy ]. stream := (self species new: 0) writeStream. self do: [ :each | stream nextPutAll: (aBlock value: each) ]. ^ stream contents! ! !Collection methodsFor: 'enumerating'! detectSum: aBlock "Evaluate aBlock with each of the receiver's elements as the argument. Return the sum of the answers." | sum | sum := 0. self do: [:each | sum := (aBlock value: each) + sum]. ^ sum! ! !Collection methodsFor: 'enumerating' stamp: 'AdrianKuhn 12/30/2009 09:37'! groupedBy: aBlock having: aSelectionBlock "Like in SQL operation - Split the recievers contents into collections of elements for which keyBlock returns the same results, and return those collections allowed by selectBlock." ^ (self groupedBy: aBlock) select: aSelectionBlock ! ! !Collection methodsFor: 'enumerating' stamp: 'CamilloBruni 9/7/2011 19:24'! \ aCollection ^ self difference: aCollection! ! !Collection methodsFor: 'enumerating' stamp: 'BenComan 3/20/2014 00:00'! do: aBlock displayingProgress: aStringOrBlock every: msecs "Enumerate aBlock displaying progress information. If the argument is a string, use a static label for the process. If the argument is a block, evaluate it with the element to retrieve the label. The msecs argument ensures that updates happen at most every msecs. Example: Smalltalk allClasses do:[:aClass| (Delay forMilliseconds: 1) wait] displayingProgress:[:aClass| 'Processing ', aClass name] every: 0." | size labelBlock count oldLabel lastUpdate | self isEmpty ifTrue: [ ^ self ]. oldLabel := nil. count := lastUpdate := 0. size := self size. '' displayProgressFrom: 0 to: size during: [:bar | labelBlock := aStringOrBlock isString ifTrue: [ bar label: aStringOrBlock. [ :dummyItem | aStringOrBlock]] ifFalse: [aStringOrBlock]. self do: [:each| | newLabel | "Special handling for first and last element" (count = 0 or: [count+1 = size or: [(Time millisecondsSince: lastUpdate) >= msecs]]) ifTrue: [ bar current: count. oldLabel = (newLabel := (labelBlock cull: each) ifNil: [oldLabel]) ifFalse: [ bar label: newLabel. ProgressNotification signal: '' extra: (oldLabel := newLabel) ]. lastUpdate := Time millisecondClockValue ]. aBlock value: each. count := count + 1]]! ! !Collection methodsFor: 'enumerating'! associationsDo: aBlock "Evaluate aBlock for each of the receiver's elements (key/value associations). If any non-association is within, the error is not caught now, but later, when a key or value message is sent to it." self do: aBlock! ! !Collection methodsFor: 'enumerating' stamp: 'AdrianKuhn 12/30/2009 09:36'! groupedBy: aBlock "Answer a dictionary whose keys are the result of evaluating aBlock for all my elements, and the value for each key is the selection of my elements that evaluated to that key. Uses species." | groups | groups := PluggableDictionary integerDictionary. self do: [ :each | (groups at: (aBlock value: each) ifAbsentPut: [ OrderedCollection new ]) add: each ]. self species ~~ OrderedCollection ifTrue: [ groups associationsDo: [ :association | association value: (self species withAll: association value) ]]. ^ groups ! ! !Collection methodsFor: 'enumerating' stamp: 'ST 6/19/2013 18:29'! flattenOn: aStream self do: [ :each | (each isCollection and: [each isString not]) ifTrue: [each flattenOn: aStream] ifFalse: [aStream nextPut: each]].! ! !Collection methodsFor: 'enumerating'! do: aBlock "Evaluate aBlock with each of the receiver's elements as the argument." self subclassResponsibility! ! !Collection methodsFor: 'enumerating' stamp: 'GabrielOmarCotelli 11/26/2013 16:53'! detect: aBlock ifFound: foundBlock "Evaluate aBlock with each of the receiver's elements as the argument. If some element evaluates aBlock to true, then cull this element into foundBlock. If no element matches the criteria then do nothing. Always returns self to avoid misuse and a potential isNil check on the sender." self detect: aBlock ifFound: foundBlock ifNone: [ "Do nothing on purpose" ]! ! !Collection methodsFor: 'enumerating' stamp: 'StephaneDucasse 2/4/2010 15:34'! do: aBlock displayingProgress: aStringOrBlock "Enumerate aBlock displaying progress information. If the argument is a string, use a static label for the process. If the argument is a block, evaluate it with the element to retrieve the label. Smalltalk allClasses do:[:aClass| (Delay forMilliseconds: 1) wait] displayingProgress: 'Processing...'. Smalltalk allClasses do:[:aClass| (Delay forMilliseconds: 1) wait] displayingProgress:[:aClass| 'Processing ', aClass name]. " ^self do: aBlock displayingProgress: aStringOrBlock every: 20! ! !Collection methodsFor: 'enumerating' stamp: 'sma 5/12/2000 11:45'! collect: aBlock "Evaluate aBlock with each of the receiver's elements as the argument. Collect the resulting values into a collection like the receiver. Answer the new collection." | newCollection | newCollection := self species new. self do: [:each | newCollection add: (aBlock value: each)]. ^ newCollection! ! !Collection methodsFor: 'enumerating' stamp: 'nice 1/5/2010 15:59'! detectMax: aBlock "Evaluate aBlock with each of the receiver's elements as the argument. Answer the element for which aBlock evaluates to the highest magnitude. If collection empty, return nil. This method might also be called elect:." | maxElement maxValue | self do: [:each | | val | maxValue == nil ifFalse: [ (val := aBlock value: each) > maxValue ifTrue: [ maxElement := each. maxValue := val]] ifTrue: ["first element" maxElement := each. maxValue := aBlock value: each]. "Note that there is no way to get the first element that works for all kinds of Collections. Must test every one."]. ^ maxElement! ! !Collection methodsFor: 'enumerating' stamp: 'sma 5/12/2000 11:51'! collect: collectBlock thenSelect: selectBlock "Utility method to improve readability." ^ (self collect: collectBlock) select: selectBlock! ! !Collection methodsFor: 'enumerating' stamp: 'CamilloBruni 9/7/2011 19:23'! & aCollection ^ self intersection: aCollection! ! !Collection methodsFor: 'enumerating' stamp: 'CamilloBruni 3/22/2013 22:18'! collect: collectBlock thenDo: doBlock "Utility method to improve readability." ^ self do: [ :each| doBlock value: (collectBlock value: each)]! ! !Collection methodsFor: 'enumerating' stamp: 'gh 9/18/2001 15:59'! noneSatisfy: aBlock "Evaluate aBlock with the elements of the receiver. If aBlock returns false for all elements return true. Otherwise return false" self do: [:item | (aBlock value: item) ifTrue: [^ false]]. ^ true! ! !Collection methodsFor: 'enumerating' stamp: 'sma 5/12/2000 11:59'! select: selectBlock thenCollect: collectBlock "Utility method to improve readability." ^ (self select: selectBlock) collect: collectBlock! ! !Collection methodsFor: 'enumerating' stamp: 'ul 11/21/2009 01:16'! collect: aBlock as: aClass "Evaluate aBlock with each of the receiver's elements as the argument. Collect the resulting values into an instance of aClass. Answer the resulting collection." ^(aClass new: self size) fillFrom: self with: aBlock! ! !Collection methodsFor: 'enumerating' stamp: 'sma 5/12/2000 11:20'! detect: aBlock "Evaluate aBlock with each of the receiver's elements as the argument. Answer the first element for which aBlock evaluates to true." ^ self detect: aBlock ifNone: [self errorNotFound: aBlock]! ! !Collection methodsFor: 'enumerating' stamp: 'GabrielOmarCotelli 11/26/2013 16:53'! detect: aBlock ifFound: foundBlock ifNone: exceptionBlock "Evaluate aBlock with each of the receiver's elements as the argument. If some element evaluates aBlock to true, then cull this element into foundBlock and answer the result of this evaluation. If none evaluate to true, then evaluate exceptionBlock." self do: [ :each | (aBlock value: each) ifTrue: [ ^ foundBlock cull: each ] ]. ^ exceptionBlock value ! ! !Collection methodsFor: 'enumerating' stamp: 'StephaneDucasse 2/1/2011 07:34'! fold: binaryBlock "Evaluate the block with the first two elements of the receiver, then with the result of the first evaluation and the next element, and so on. Answer the result of the final evaluation. If the receiver is empty, raise an error. If the receiver has a single element, answer that element." "#('if' 'it' 'is' 'to' 'be' 'it' 'is' 'up' 'to' 'me') fold: [:a :b | a, ' ', b]" ^self reduce: binaryBlock! ! !Collection methodsFor: 'enumerating' stamp: 'sma 5/12/2000 11:52'! count: aBlock "Evaluate aBlock with each of the receiver's elements as the argument. Answer the number of elements that answered true." | sum | sum := 0. self do: [:each | (aBlock value: each) ifTrue: [sum := sum + 1]]. ^ sum! ! !Collection methodsFor: 'enumerating' stamp: 'sma 5/12/2000 11:59'! do: aBlock without: anItem "Enumerate all elements in the receiver. Execute aBlock for those elements that are not equal to the given item" ^ self do: [:each | anItem = each ifFalse: [aBlock value: each]]! ! !Collection methodsFor: 'enumerating' stamp: 'CamilloBruni 9/7/2011 19:24'! | aCollection ^ self union: aCollection! ! !Collection methodsFor: 'enumerating' stamp: 'StephaneDucasse 5/20/2012 18:50'! piecesCutWhere: binaryBlock do: pieceBlock "Evaluate pieceBlock with substrings of the receiver derived from cutting the receiver at points where binaryBlock answers true for adjacent elements." | size lastCut this next | (size := self size) <= 1 ifTrue: [size = 1 ifTrue: [pieceBlock value: self]. ^self]. lastCut := 1. this := self at: 1. 2 to: size do: [:i| next := self at: i. (binaryBlock value: this value: next) ifTrue: [pieceBlock value: (self copyFrom: lastCut to: i - 1). lastCut := i]. this := next]. pieceBlock value: (self copyFrom: lastCut to: size)! ! !Collection methodsFor: 'enumerating' stamp: 'TudorGirba 3/20/2012 09:06'! union: aCollection "Answer the set theoretic union of two collections." | set | set := self asSet addAll: aCollection; yourself. ^ self species withAll: set asArray! ! !Collection methodsFor: 'enumerating' stamp: 'TudorGirba 11/3/2013 12:12'! flatCollectAsSet: aBlock "Evaluate aBlock for each of the receiver's elements and answer the list of all resulting values flatten one level. Assumes that aBlock returns some kind of collection for each element. Equivalent to the lisp's mapcan" ^ self flatCollect: aBlock as: Set! ! !Collection methodsFor: 'enumerating' stamp: 'CamilloBruni 3/22/2013 22:20'! piecesCutWhere: binaryBlock "Answer substrings of the receiver derived from cutting the receiver at points where binaryBlock answers true for adjacent elements." | pieces | pieces := OrderedCollection new. self piecesCutWhere: binaryBlock do: [ :piece | pieces add: piece ]. ^pieces "'Now is the time for all good people to come to the aid of the cause of world peace. It is just fine, even desirable, to love your country, if that means wanting it to play a beneficial role in the course of world events and be the best possible example of a good society. But if it means wanting dominion over the rest of the world, it is not love but defensiveness or self-glorification, and will lead only to oblivion.' piecesCutWhere: [:a :b| a = $. and: [b isSeparator]]"! ! !Collection methodsFor: 'enumerating' stamp: 'hfm 2/12/2009 13:38'! select: selectBlock thenDo: doBlock "Utility method to improve readability. Do not create the intermediate collection." self do: [: each | ( selectBlock value: each ) ifTrue: [ doBlock value: each ] ].! ! !Collection methodsFor: 'enumerating' stamp: 'ul 11/21/2009 01:16'! collect: aBlock into: aCollection "Evaluate aBlock with each of the receiver's elements as the argument. Collect the resulting values into aCollection. Answer aCollection." ^aCollection fillFrom: self with: aBlock! ! !Collection methodsFor: 'enumerating' stamp: 'CamilloBruni 10/20/2012 21:50'! select: aBlock "Evaluate aBlock with each of the receiver's elements as the argument. Collect into a new collection like the receiver, only those elements for which aBlock evaluates to true. Answer the new collection." | newCollection | newCollection := self copyEmpty. self do: [ :each | (aBlock value: each) ifTrue: [ newCollection add: each ]]. ^newCollection! ! !Collection methodsFor: 'enumerating'! inject: thisValue into: binaryBlock "Accumulate a running value associated with evaluating the argument, binaryBlock, with the current value of the argument, thisValue, and the receiver as block arguments. For instance, to sum the numeric elements of a collection, aCollection inject: 0 into: [:subTotal :next | subTotal + next]." | nextValue | nextValue := thisValue. self do: [:each | nextValue := binaryBlock value: nextValue value: each]. ^nextValue! ! !Collection methodsFor: 'enumerating' stamp: 'StephaneDucasse 3/14/2014 20:54'! difference: aCollection "Answer the set theoretic difference of two collections." "#(a b c d e f) difference: #(a b z k) => #(#f #d #e #c) #(a b z k) difference: #(a b c d e f) => #(#k #z) " | set | set := self asSet. aCollection do: [ :each | set remove: each ifAbsent: [ ] ]. ^ self species withAll: set asArray! ! !Collection methodsFor: '*metacello-mc' stamp: 'dkh 6/8/2012 14:04:22'! mergeIntoMetacelloRepositories: aMetacelloRepositoriesSpec self do: [:each | each mergeIntoMetacelloRepositories: aMetacelloRepositoriesSpec ] ! ! !Collection methodsFor: '*metacello-mc' stamp: 'dkh 6/8/2012 14:04:22'! removeFromMetacelloRepositories: aMetacelloRepositoriesSpec self do: [:each | each removeFromMetacelloRepositories: aMetacelloRepositoriesSpec ] ! ! !Collection methodsFor: '*metacello-mc' stamp: 'dkh 6/8/2012 14:04:22'! loadRequiredForMetacelloMCVersion: aMetacelloMCVersion ^aMetacelloMCVersion doLoadRequiredFromArray: self.! ! !Collection methodsFor: '*metacello-mc' stamp: 'dkh 6/8/2012 14:04:22'! resolvePackageSpecsNamedForMetacelloMCVersion: aMetacelloMCVersion visited: visited ifAbsent: aBlock ^ aMetacelloMCVersion allPackagesForSpecs: (self collect: [ :ea | aMetacelloMCVersion packageNamed: ea ifAbsent: aBlock ]) visited: visited! ! !Collection methodsFor: '*metacello-mc' stamp: 'dkh 6/8/2012 14:04:22'! recordRequiredForMetacelloMCVersion: aMetacelloMCVersion ^aMetacelloMCVersion doRecordRequiredFromArray: self.! ! !Collection methodsFor: '*metacello-mc' stamp: 'dkh 6/8/2012 14:04:22'! fetchRequiredForMetacelloMCVersion: aMetacelloMCVersion ^aMetacelloMCVersion doFetchRequiredFromArray: self.! ! !Collection methodsFor: '*metacello-mc' stamp: 'dkh 6/8/2012 14:04:22'! addToMetacelloRepositories: aMetacelloRepositoriesSpec self do: [:each | each addToMetacelloRepositories: aMetacelloRepositoriesSpec ] ! ! !Collection methodsFor: 'adding' stamp: 'sma 5/12/2000 17:23'! addIfNotPresent: anObject "Include anObject as one of the receiver's elements, but only if there is no such element already. Anwser anObject." (self includes: anObject) ifFalse: [self add: anObject]. ^ anObject! ! !Collection methodsFor: 'adding' stamp: 'sma 5/12/2000 17:21'! add: newObject withOccurrences: anInteger "Add newObject anInteger times to the receiver. Answer newObject." anInteger timesRepeat: [self add: newObject]. ^ newObject! ! !Collection methodsFor: 'adding'! add: newObject "Include newObject as one of the receiver's elements. Answer newObject. ArrayedCollections cannot respond to this message." self subclassResponsibility! ! !Collection methodsFor: 'adding' stamp: 'sma 5/12/2000 17:26'! addAll: aCollection "Include all the elements of aCollection as the receiver's elements. Answer aCollection. Actually, any object responding to #do: can be used as argument." aCollection do: [:each | self add: each]. ^ aCollection! ! !Collection methodsFor: 'adapting' stamp: 'di 11/6/1998 13:37'! adaptToString: rcvr andSend: selector "If I am involved in arithmetic with a String, convert it to a Number." ^ rcvr asNumber perform: selector with: self! ! !Collection methodsFor: 'adapting' stamp: 'di 11/6/1998 13:37'! adaptToPoint: rcvr andSend: selector "If I am involved in arithmetic with a scalar, return a Collection of the results of each element combined with the scalar in that expression." ^ self collect: [:element | rcvr perform: selector with: element]! ! !Collection methodsFor: 'adapting' stamp: 'di 11/9/1998 12:16'! adaptToNumber: rcvr andSend: selector "If I am involved in arithmetic with a scalar, return a Collection of the results of each element combined with the scalar in that expression." ^ self collect: [:element | rcvr perform: selector with: element]! ! !Collection methodsFor: 'adapting' stamp: 'ClementBera 9/30/2013 10:59'! adaptToCollection: rcvr andSend: selector "If I am involved in arithmetic with another Collection, return a Collection of the results of each element combined with the scalar in that expression." (rcvr isSequenceable and: [ self isSequenceable ]) ifFalse: [self error: 'Only sequenceable collections may be combined arithmetically']. ^ rcvr with: self collect: [:rcvrElement :myElement | rcvrElement perform: selector with: myElement]! ! !Collection methodsFor: 'printing' stamp: 'gk 1/14/2005 08:27'! asStringOn: aStream delimiter: delimString "Print elements on a stream separated with a delimiter String like: 'a, b, c' Uses #asString instead of #print:." self do: [:elem | aStream nextPutAll: elem asString] separatedBy: [aStream nextPutAll: delimString]! ! !Collection methodsFor: 'printing' stamp: 'gk 1/14/2005 08:20'! asCommaStringAnd "Return collection printed as 'a, b and c' " ^String streamContents: [:s | self asStringOn: s delimiter: ', ' last: ' and '] ! ! !Collection methodsFor: 'printing' stamp: 'gk 1/14/2005 08:27'! asStringOn: aStream delimiter: delimString last: lastDelimString "Print elements on a stream separated with a delimiter between all the elements and with a special one before the last like: 'a, b and c'. Uses #asString instead of #print: Note: Feel free to improve the code to detect the last element." | n sz | n := 1. sz := self size. self do: [:elem | n := n + 1. aStream nextPutAll: elem asString] separatedBy: [ aStream nextPutAll: (n = sz ifTrue: [lastDelimString] ifFalse: [delimString])]! ! !Collection methodsFor: 'printing' stamp: 'sma 6/1/2000 09:41'! printNameOn: aStream super printOn: aStream! ! !Collection methodsFor: 'printing' stamp: 'fbs 1/14/2005 10:54'! printOn: aStream delimiter: delimString last: lastDelimString "Print elements on a stream separated with a delimiter between all the elements and with a special one before the last like: 'a, b and c' Note: Feel free to improve the code to detect the last element." | n sz | n := 1. sz := self size. self do: [:elem | n := n + 1. aStream print: elem] separatedBy: [ n = sz ifTrue: [aStream print: lastDelimString] ifFalse: [aStream print: delimString]]! ! !Collection methodsFor: 'printing'! storeOn: aStream "Refer to the comment in Object|storeOn:." | noneYet | aStream nextPutAll: '(('. aStream nextPutAll: self class name. aStream nextPutAll: ' new)'. noneYet := true. self do: [:each | noneYet ifTrue: [noneYet := false] ifFalse: [aStream nextPut: $;]. aStream nextPutAll: ' add: '. aStream store: each]. noneYet ifFalse: [aStream nextPutAll: '; yourself']. aStream nextPut: $)! ! !Collection methodsFor: 'printing' stamp: 'apb 4/21/2006 09:37'! printElementsOn: aStream "The original code used #skip:, but some streams do not support that, and we don't really need it." aStream nextPut: $(. self do: [:element | aStream print: element] separatedBy: [aStream space]. aStream nextPut: $)! ! !Collection methodsFor: 'printing' stamp: 'gk 1/14/2005 08:19'! asCommaString "Return collection printed as 'a, b, c' " ^String streamContents: [:s | self asStringOn: s delimiter: ', '] ! ! !Collection methodsFor: 'printing' stamp: 'gk 1/14/2005 08:01'! printOn: aStream delimiter: delimString "Print elements on a stream separated with a delimiter String like: 'a, b, c' " self do: [:elem | aStream print: elem] separatedBy: [aStream print: delimString] ! ! !Collection methodsFor: 'printing' stamp: 'sma 6/1/2000 09:41'! printOn: aStream "Append a sequence of characters that identify the receiver to aStream." self printNameOn: aStream. self printElementsOn: aStream! ! !Collection methodsFor: '*zinc-resource-meta-core' stamp: 'SvenVanCaekenberghe 3/16/2013 20:24'! addedToZnUrl: url ^ url withPathSegments: self! ! !Collection methodsFor: 'accessing' stamp: 'nice 4/19/2011 00:26'! atRandom: aGenerator "Answer a random element of the receiver. Uses aGenerator which     should be kept by the user in a variable and used every time. Use     this instead of #atRandom for better uniformity of random numbers because only you use the generator. Causes an error if self has no elements." | rand index | self emptyCheck. rand := aGenerator nextInt: self size. index := 1. self do: [:each | index = rand ifTrue: [^each]. index := index + 1]. ^ self errorEmptyCollection ! ! !Collection methodsFor: 'accessing' stamp: 'sma 5/12/2000 11:34'! size "Answer how many elements the receiver contains." | tally | tally := 0. self do: [:each | tally := tally + 1]. ^ tally! ! !Collection methodsFor: 'accessing' stamp: 'sd 11/4/2003 22:05'! atRandom "Answer a random element of the receiver. Uses a shared random number generator owned by class Collection. If you use this a lot, define your own instance of Random and use #atRandom:. Causes an error if self has no elements." ^ self class mutexForPicking critical: [ self atRandom: self class randomForPicking ] "Examples: #('one' 'or' 'the' 'other') atRandom (1 to: 10) atRandom 'Just pick one of these letters at random' atRandom #(3 7 4 9 21) asSet atRandom (just to show it also works for Sets) "! ! !Collection methodsFor: 'accessing' stamp: 'sma 5/12/2000 11:41'! capacity "Answer the current capacity of the receiver." ^ self size! ! !Collection methodsFor: 'accessing' stamp: 'sma 5/12/2000 11:33'! anyOne "Answer a representative sample of the receiver. This method can be helpful when needing to preinfer the nature of the contents of semi-homogeneous collections." self emptyCheck. self do: [:each | ^ each]! ! !Collection methodsFor: '*Fuel' stamp: 'MartinDias 5/19/2011 23:41'! addIfNotPresent: anObject ifPresentDo: aBlock "Include anObject as one of the receiver's elements and then value aBlock, but only if there is no such element already. Anwser anObject." (self includes: anObject) ifFalse: [ self add: anObject ] ifTrue: [ aBlock value ]. ^ anObject! ! !Collection methodsFor: '*Keymapping-KeyCombinations' stamp: 'GuillermoPolito 6/28/2013 13:02'! asShortcut ^ self asKeyCombination! ! !Collection methodsFor: '*Keymapping-KeyCombinations' stamp: 'GuillermoPolito 3/19/2013 19:12'! asKeyCombination | shortcut | self size = 1 ifTrue: [ ^self first asKeyCombination ]. shortcut := KMKeyCombinationSequence new. self do: [ :each | shortcut addShortcut: each asKeyCombination ]. ^shortcut.! ! !Collection methodsFor: 'filter streaming' stamp: 'sma 5/12/2000 12:07'! contents ^ self! ! !Collection methodsFor: 'filter streaming' stamp: 'sma 5/12/2000 12:07'! write: anObject ^ self add: anObject! ! !Collection methodsFor: 'copying' stamp: 'ar 2/11/2001 01:55'! copyWithDependent: newElement "Answer a new collection with newElement added (as last element if sequenceable)." ^self copyWith: newElement! ! !Collection methodsFor: 'copying' stamp: 'sma 5/12/2000 18:08'! copyWithoutAll: aCollection "Answer a copy of the receiver that does not contain any elements equal to those in aCollection." ^ self reject: [:each | aCollection includes: each]! ! !Collection methodsFor: 'copying' stamp: 'CamilloBruni 10/20/2012 21:49'! copyEmpty ^ self species new! ! !Collection methodsFor: 'copying' stamp: 'sma 5/12/2000 14:43'! copyWithout: oldElement "Answer a copy of the receiver that does not contain any elements equal to oldElement." ^ self reject: [:each | each = oldElement] "Examples: 'fred the bear' copyWithout: $e #(2 3 4 5 5 6) copyWithout: 5 "! ! !Collection methodsFor: 'copying' stamp: 'al 12/12/2003 14:31'! , aCollection ^self copy addAll: aCollection; yourself! ! !Collection methodsFor: 'copying' stamp: 'sma 5/12/2000 14:41'! copyWith: newElement "Answer a new collection with newElement added (as last element if sequenceable)." ^ self copy add: newElement; yourself! ! !Collection methodsFor: 'math functions' stamp: 'TAG 11/6/1998 16:00'! median ^ self asSortedCollection median! ! !Collection methodsFor: 'math functions' stamp: 'TudorGirba 11/19/2013 21:37'! sumNumbers: aBlock "This is implemented using a variant of the normal inject:into: pattern that is specific to handling numbers. aBlock is expected to return a number for every element in the collection. Different from the sum: implementation, the default value is zero. While sum: is more general, sumNumbers: is meant to support the most often encountered use case of dealing with numbers." ^ self inject: 0 into: [ :sum :each | sum + (aBlock value: each) ]! ! !Collection methodsFor: 'math functions' stamp: 'MarcusDenker 8/15/2010 11:01'! stdev | avg sample sum | avg := self average. "see comment in self sum" sample := self anyOne. sum := self inject: sample into: [:accum :each | accum + (each - avg) squared]. sum := sum - sample. ^ (sum / (self size - 1)) sqrt! ! !Collection methodsFor: 'math functions' stamp: 'JuanVuletich 10/11/2010 20:15'! sum: aBlock "This is implemented using a variant of the normal inject:into: pattern. The reason for this is that it is not known whether we're in the normal number line, i.e. whether 0 is a good initial value for the sum. Consider a collection of measurement objects, 0 would be the unitless value and would not be appropriate to add with the unit-ed objects." | sum sample | sample := aBlock value: self anyOne. sum := self inject: sample into: [ :previousValue :each | previousValue + (aBlock value: each) ]. ^ sum - sample! ! !Collection methodsFor: '*Tool-Explorer' stamp: 'yo 8/27/2008 23:29'! explorerContentsWithIndexCollect: twoArgBlock ^ self asOrderedCollection withIndexCollect: twoArgBlock ! ! !Collection methodsFor: '*Tool-Explorer' stamp: 'yo 8/27/2008 23:45'! explorerContents ^self explorerContentsWithIndexCollect: [:value :index | ObjectExplorerWrapper with: value name: index printString model: self]! ! !Collection methodsFor: 'removing' stamp: 'nice 9/14/2009 20:30'! removeAll "Remove each element from the receiver and leave it empty. ArrayedCollections cannot respond to this message. There are two good reasons why a subclass should override this message: 1) the subclass does not support being modified while being iterated 2) the subclass provides a much faster way than iterating through each element" self do: [:each | self remove: each].! ! !Collection methodsFor: 'removing' stamp: 'sma 5/12/2000 11:19'! removeAllSuchThat: aBlock "Evaluate aBlock for each element and remove all that elements from the receiver for that aBlock evaluates to true. Use a copy to enumerate collections whose order changes when an element is removed (i.e. Sets)." self copy do: [:each | (aBlock value: each) ifTrue: [self remove: each]]! ! !Collection methodsFor: 'removing' stamp: 'nice 1/10/2009 00:01'! removeAll: aCollection "Remove each element of aCollection from the receiver. If successful for each, answer aCollection. Otherwise create an error notification. ArrayedCollections cannot respond to this message." aCollection == self ifTrue: [^self removeAll]. aCollection do: [:each | self remove: each]. ^ aCollection! ! !Collection methodsFor: 'removing' stamp: 'sma 5/12/2000 11:22'! remove: oldObject "Remove oldObject from the receiver's elements. Answer oldObject unless no element is equal to oldObject, in which case, raise an error. ArrayedCollections cannot respond to this message." ^ self remove: oldObject ifAbsent: [self errorNotFound: oldObject]! ! !Collection methodsFor: 'removing' stamp: 'sma 5/12/2000 11:14'! remove: oldObject ifAbsent: anExceptionBlock "Remove oldObject from the receiver's elements. If several of the elements are equal to oldObject, only one is removed. If no element is equal to oldObject, answer the result of evaluating anExceptionBlock. Otherwise, answer the argument, oldObject. ArrayedCollections cannot respond to this message." self subclassResponsibility! ! !Collection methodsFor: 'removing' stamp: 'sma 5/12/2000 11:16'! removeAllFoundIn: aCollection "Remove each element of aCollection which is present in the receiver from the receiver. Answer aCollection. No error is raised if an element isn't found. ArrayedCollections cannot respond to this message." aCollection do: [:each | self remove: each ifAbsent: []]. ^ aCollection! ! !Collection methodsFor: 'private' stamp: 'ul 11/21/2009 01:14'! fillFrom: aCollection with: aBlock "Evaluate aBlock with each of aCollections's elements as the argument. Collect the resulting values into self. Answer self." aCollection do: [ :each | self add: (aBlock value: each) ]! ! !Collection methodsFor: 'private' stamp: 'SvenVanCaekenberghe 4/18/2011 14:37'! errorNotFound: anObject "Raise a NotFound exception." NotFound signalFor: anObject! ! !Collection methodsFor: 'private' stamp: 'SvenVanCaekenberghe 4/18/2011 14:58'! errorNoMatch "Signal a SizeMismatch exception" SizeMismatch signal! ! !Collection methodsFor: 'private'! toBraceStack: itsSize "Push receiver's elements onto the stack of thisContext sender. Error if receiver does not have itsSize elements or if receiver is unordered. Do not call directly: this is called by {a. b} := ... constructs." self size ~= itsSize ifTrue: [self error: 'Trying to store ', self size printString, ' values into ', itsSize printString, ' variables.']. thisContext sender push: itsSize fromIndexable: self! ! !Collection methodsFor: 'private' stamp: 'SvenVanCaekenberghe 4/18/2011 14:59'! errorEmptyCollection "Signal a CollectionIsEmpty exception" CollectionIsEmpty signalWith: self! ! !Collection methodsFor: 'private' stamp: 'yo 6/29/2004 13:14'! errorNotKeyed self error: ('Instances of {1} do not respond to keyed accessing messages.' translated format: {self class name}) ! ! !Collection methodsFor: 'private'! emptyCheck self isEmpty ifTrue: [self errorEmptyCollection]! ! !Collection methodsFor: '*Collections-arithmetic-collectors' stamp: 'raok 10/22/2002 00:20'! arcTan ^self collect: [:each | each arcTan]! ! !Collection methodsFor: '*Collections-arithmetic-collectors' stamp: 'raok 10/22/2002 00:22'! tan ^self collect: [:each | each tan]! ! !Collection methodsFor: '*Collections-arithmetic-collectors' stamp: 'TAG 11/6/1998 15:53'! reciprocal "Return the reciever full of reciprocated elements" ^ self collect: [:a | a reciprocal]! ! !Collection methodsFor: '*Collections-arithmetic-collectors' stamp: 'TAG 11/6/1998 15:51'! ceiling ^ self collect: [:a | a ceiling]! ! !Collection methodsFor: '*Collections-arithmetic-collectors' stamp: 'raok 10/22/2002 00:21'! ln ^self collect: [:each | each ln]! ! !Collection methodsFor: '*Collections-arithmetic-collectors' stamp: 'TAG 11/6/1998 15:54'! truncated ^ self collect: [:a | a truncated]! ! !Collection methodsFor: '*Collections-arithmetic-collectors' stamp: 'raok 10/22/2002 00:20'! arcCos ^self collect: [:each | each arcCos]! ! !Collection methodsFor: '*Collections-arithmetic-collectors' stamp: 'raok 10/22/2002 00:20'! cos ^self collect: [:each | each cos]! ! !Collection methodsFor: '*Collections-arithmetic-collectors' stamp: 'raok 10/22/2002 00:22'! sin ^self collect: [:each | each sin]! ! !Collection methodsFor: '*Collections-arithmetic-collectors' stamp: 'raok 10/22/2002 00:21'! exp ^self collect: [:each | each exp]! ! !Collection methodsFor: '*Collections-arithmetic-collectors' stamp: 'TAG 11/6/1998 15:53'! rounded ^ self collect: [:a | a rounded]! ! !Collection methodsFor: '*Collections-arithmetic-collectors' stamp: 'TAG 11/6/1998 15:52'! log ^ self collect: [:each | each log]! ! !Collection methodsFor: '*Collections-arithmetic-collectors' stamp: 'TAG 11/6/1998 15:53'! sqrt ^ self collect: [:each | each sqrt]! ! !Collection methodsFor: '*Collections-arithmetic-collectors' stamp: 'TAG 11/6/1998 15:51'! abs "Absolute value of all elements in the collection" ^ self collect: [:a | a abs]! ! !Collection methodsFor: '*Collections-arithmetic-collectors' stamp: 'raok 10/22/2002 00:20'! arcSin ^self collect: [:each | each arcSin]! ! !Collection methodsFor: '*Collections-arithmetic-collectors' stamp: 'nk 12/30/2003 15:47'! roundTo: quantum ^self collect: [ :ea | ea roundTo: quantum ]! ! !Collection methodsFor: '*Collections-arithmetic-collectors' stamp: 'TAG 11/6/1998 15:52'! negated "Negated value of all elements in the collection" ^ self collect: [:a | a negated]! ! !Collection methodsFor: '*Collections-arithmetic-collectors' stamp: 'TAG 11/6/1998 15:53'! squared ^ self collect: [:each | each * each]! ! !Collection methodsFor: '*Collections-arithmetic-collectors' stamp: 'raok 10/22/2002 00:23'! sign ^self collect: [:each | each sign]! ! !Collection methodsFor: '*Collections-arithmetic-collectors' stamp: 'raok 10/22/2002 00:20'! degreeCos ^self collect: [:each | each degreeCos]! ! !Collection methodsFor: '*Collections-arithmetic-collectors' stamp: 'TAG 11/6/1998 15:51'! floor ^ self collect: [:a | a floor]! ! !Collection methodsFor: '*Collections-arithmetic-collectors' stamp: 'raok 10/22/2002 00:21'! degreeSin ^self collect: [:each | each degreeSin]! ! !Collection methodsFor: '*metacello-core' stamp: 'dkh 6/6/2009 11:42'! removeFromMetacelloPackages: aMetacelloPackagesSpec self do: [:each | each removeFromMetacelloPackages: aMetacelloPackagesSpec ] ! ! !Collection methodsFor: '*metacello-core' stamp: 'dkh 9/8/2012 05:30'! asMetacelloAttributePath ^ MetacelloMethodSectionPath withAll: self! ! !Collection methodsFor: '*metacello-core' stamp: 'dkh 6/6/2009 10:08'! setRequiresInMetacelloPackage: aMetacelloPackageSpec aMetacelloPackageSpec setRequires: self asArray.! ! !Collection methodsFor: '*metacello-core' stamp: 'dkh 9/7/2012 13:10'! asMetacelloAttributeList ^ self! ! !Collection methodsFor: '*metacello-core' stamp: 'dkh 9/5/2012 06:26:03.064'! setForVersion: aString withInMetacelloConfig: aMetacelloConstructore aMetacelloConstructore setFor: self version: aString! ! !Collection methodsFor: '*metacello-core' stamp: 'dkh 6/6/2009 11:45'! addToMetacelloPackages: aMetacelloPackagesSpec self do: [:each | each addToMetacelloPackages: aMetacelloPackagesSpec ] ! ! !Collection methodsFor: '*metacello-core' stamp: 'dkh 6/8/2009 19:02'! setLoadsInMetacelloProject: aMetacelloPackageSpec aMetacelloPackageSpec setLoads: self asArray.! ! !Collection methodsFor: '*metacello-core' stamp: 'dkh 6/6/2009 11:46'! mergeIntoMetacelloPackages: aMetacelloPackagesSpec self do: [:each | each mergeIntoMetacelloPackages: aMetacelloPackagesSpec ] ! ! !Collection methodsFor: '*metacello-core' stamp: 'dkh 9/5/2012 06:26:03.064'! setForDo: aBlock withInMetacelloConfig: aMetacelloConstructore aMetacelloConstructore setFor: self do: aBlock! ! !Collection methodsFor: '*metacello-core' stamp: 'dkh 9/23/2009 08:46'! setIncludesInMetacelloPackage: aMetacelloPackageSpec aMetacelloPackageSpec setIncludes: self asArray.! ! !Collection methodsFor: '*Collections-arithmetic' stamp: 'TAG 11/6/1998 15:57'! average ^ self sum / self size! ! !Collection methodsFor: '*Collections-arithmetic' stamp: 'di 11/6/1998 13:53'! / arg ^ arg adaptToCollection: self andSend: #/! ! !Collection methodsFor: '*Collections-arithmetic' stamp: 'raok 10/22/2002 00:17'! raisedTo: arg ^ arg adaptToCollection: self andSend: #raisedTo:! ! !Collection methodsFor: '*Collections-arithmetic' stamp: 'di 11/6/1998 13:54'! \\ arg ^ arg adaptToCollection: self andSend: #\\! ! !Collection methodsFor: '*Collections-arithmetic' stamp: 'di 11/6/1998 13:53'! - arg ^ arg adaptToCollection: self andSend: #-! ! !Collection methodsFor: '*Collections-arithmetic' stamp: 'di 11/6/1998 13:53'! + arg ^ arg adaptToCollection: self andSend: #+! ! !Collection methodsFor: '*Collections-arithmetic' stamp: 'G.C 10/23/2008 10:12'! * arg ^ arg adaptToCollection: self andSend: #*! ! !Collection methodsFor: '*Collections-arithmetic' stamp: 'di 11/6/1998 13:54'! // arg ^ arg adaptToCollection: self andSend: #//! ! !Collection methodsFor: '*Collections-arithmetic' stamp: 'TAG 11/6/1998 15:58'! max ^ self inject: self anyOne into: [:max :each | max max: each]! ! !Collection methodsFor: '*Collections-arithmetic' stamp: 'TAG 11/6/1998 16:02'! sum "This is implemented using a variant of the normal inject:into: pattern. The reason for this is that it is not known whether we're in the normal number line, i.e. whether 0 is a good initial value for the sum. Consider a collection of measurement objects, 0 would be the unitless value and would not be appropriate to add with the unit-ed objects." | sum sample | sample := self anyOne. sum := self inject: sample into: [:accum :each | accum + each]. ^ sum - sample! ! !Collection methodsFor: '*Collections-arithmetic' stamp: 'TAG 11/6/1998 16:00'! min ^ self inject: self anyOne into: [:min :each | min min: each]! ! !Collection methodsFor: '*Collections-arithmetic' stamp: 'TAG 11/6/1998 16:00'! range ^ self max - self min! ! !Collection methodsFor: 'sorting' stamp: 'LucFabresse 6/28/2013 12:58'! sorted "Return a new sequenceable collection which contains the same elements as self but its elements are sorted" ^self asArray sorted! ! !Collection methodsFor: 'sorting' stamp: 'StephaneDucasse 3/28/2010 22:42'! sorted: aSortBlockOrNil "Return a new sequenceable collection which contains the same elements as self but its elements are sorted by aSortBlockOrNil. The block should take two arguments and return true if the first element should preceed the second one. If aSortBlock is nil then <= is used for comparison." ^self asArray sort: aSortBlockOrNil! ! !Collection methodsFor: 'converting' stamp: 'sma 5/6/2000 20:22'! asArray "Answer an Array whose elements are the elements of the receiver. Implementation note: Cannot use ''Array withAll: self'' as that only works for SequenceableCollections which support the replacement primitive." | array index | array := Array new: self size. index := 0. self do: [:each | array at: (index := index + 1) put: each]. ^ array! ! !Collection methodsFor: 'converting' stamp: 'StephaneDucasse 3/28/2010 22:39'! asSortedCollection "Answer a SortedCollection whose elements are the elements of the receiver. The sort order is the default less than or equal. Note that you should use #sorted: if you don't really need a SortedCollection, but a sorted collection." ^ self as: SortedCollection! ! !Collection methodsFor: 'converting' stamp: 'sma 5/6/2000 20:29'! asSet "Answer a Set whose elements are the unique elements of the receiver." ^ Set withAll: self! ! !Collection methodsFor: 'converting' stamp: 'sma 5/6/2000 20:26'! asCharacterSet "Answer a CharacterSet whose elements are the unique elements of the receiver. The reciever should only contain characters." ^ CharacterSet newFrom: self! ! !Collection methodsFor: 'converting' stamp: 'StephaneDucasse 3/28/2010 22:41'! asSortedCollection: aSortBlock "Answer a SortedCollection whose elements are the elements of the receiver. The sort order is defined by the argument, aSortBlock. Note that this is better to use #sorted: if you don't really need a SortedCollection, but a sorted collection!!!!" | aSortedCollection | aSortedCollection := SortedCollection new: self size. aSortedCollection sortBlock: aSortBlock. aSortedCollection addAll: self. ^ aSortedCollection! ! !Collection methodsFor: 'converting' stamp: 'sma 5/12/2000 17:43'! asOrderedCollection "Answer an OrderedCollection whose elements are the elements of the receiver. The order in which elements are added depends on the order in which the receiver enumerates its elements. In the case of unordered collections, the ordering is not necessarily the same for multiple requests for the conversion." ^ self as: OrderedCollection! ! !Collection methodsFor: 'converting' stamp: 'sma 5/6/2000 20:22'! asByteArray "Answer a ByteArray whose elements are the elements of the receiver. Implementation note: Cannot use ''ByteArray withAll: self'' as that only works for SequenceableCollections which support the replacement primitive." | array index | array := ByteArray new: self size. index := 0. self do: [:each | array at: (index := index + 1) put: each]. ^ array! ! !Collection methodsFor: 'converting' stamp: 'MarcusDenker 11/28/2009 11:40'! asDictionary ^ self as: Dictionary! ! !Collection methodsFor: 'converting' stamp: 'ar 9/22/2000 10:12'! asIdentitySet ^(IdentitySet new: self size) addAll: self; yourself! ! !Collection methodsFor: 'converting' stamp: 'sma 5/6/2000 20:10'! asBag "Answer a Bag whose elements are the elements of the receiver." ^ Bag withAll: self! ! !Dictionary methodsFor: '*Fuel' stamp: 'MartinDias 2/25/2013 14:33'! fuelAfterMaterialization | class | "Since for Set and IdentitySet we are recreating the collection with #add: we do not need to rehash." class := self class. ^ (((class == Dictionary) or: [ class == IdentityDictionary ]) ) ifFalse: [ self rehash ] ifTrue: [ self ]! ! !Dictionary methodsFor: '*Fuel' stamp: 'MarianoMartinezPeck 7/30/2012 23:16'! fuelAccept: aGeneralMapper | class | "Since we have subclasses of Dictionary that behave differently, we cannot use the visitDictionary: for all of them. We could also use MethodDictionary for this case, but its materialization is much slower with this cluster than with the default action." class := self class. ^ (((class == Dictionary) or: [class == IdentityDictionary ])) ifTrue: [ aGeneralMapper visitDictionary: self ] ifFalse: [ super fuelAccept: aGeneralMapper ] ! ! !Dictionary methodsFor: 'adding'! add: anAssociation | index element | index := self findElementOrNil: anAssociation key. element := array at: index. element == nil ifTrue: [self atNewIndex: index put: anAssociation] ifFalse: [element value: anAssociation value]. ^ anAssociation! ! !Dictionary methodsFor: 'adding' stamp: 'raok 12/17/2003 16:01'! addAll: aKeyedCollection aKeyedCollection == self ifFalse: [ aKeyedCollection keysAndValuesDo: [:key :value | self at: key put: value]]. ^aKeyedCollection! ! !Dictionary methodsFor: 'private' stamp: 'nice 11/14/2009 16:33'! fixCollisionsFrom: start "The element at start has been removed and replaced by nil. This method moves forward from there, relocating any entries that had been placed below due to collisions with this one." | element index | index := start. [ (element := array at: (index := index \\ array size + 1)) == nil ] whileFalse: [ | newIndex | (newIndex := self findElementOrNil: element key) = index ifFalse: [ array swap: index with: newIndex ] ]! ! !Dictionary methodsFor: 'private' stamp: 'CamilloBruni 8/1/2012 16:12'! noCheckAdd: anObject "Must be defined separately for Dictionary because (self findElementOrNil:) expects a key, not an association." array at: (self findElementOrNil: anObject key) put: anObject. tally := tally + 1! ! !Dictionary methodsFor: 'private' stamp: 'SvenVanCaekenberghe 4/19/2011 19:41'! errorKeyNotFound: aKey KeyNotFound signalFor: aKey! ! !Dictionary methodsFor: 'private' stamp: 'md 10/5/2005 15:42'! scanFor: anObject "Scan the key array for the first slot containing either a nil (indicating an empty slot) or an element that matches anObject. Answer the index of that slot or zero if no slot is found. This method will be overridden in various subclasses that have different interpretations for matching elements." | element start finish | finish := array size. start := (anObject hash \\ finish) + 1. "Search from (hash mod size) to the end." start to: finish do: [:index | ((element := array at: index) == nil or: [element key = anObject]) ifTrue: [^ index ]]. "Search from 1 to where we started." 1 to: start-1 do: [:index | ((element := array at: index) == nil or: [element key = anObject]) ifTrue: [^ index ]]. ^ 0 "No match AND no empty slot"! ! !Dictionary methodsFor: 'private'! valueAtNewKey: aKey put: anObject atIndex: index declareFrom: aDictionary "Support for coordinating class variable and global declarations with variables that have been put in Undeclared so as to redirect all references to the undeclared variable." (aDictionary includesKey: aKey) ifTrue: [self atNewIndex: index put: ((aDictionary associationAt: aKey) value: anObject). aDictionary removeKey: aKey] ifFalse: [self atNewIndex: index put: (Association key: aKey value: anObject)]! ! !Dictionary methodsFor: 'private' stamp: 'ul 11/21/2009 01:15'! fillFrom: aCollection with: aBlock "Evaluate aBlock with each of aCollections's elements as the argument. Collect the resulting values into self. Answer self." aCollection keysAndValuesDo: [ :key :value | self at: key put: (aBlock value: value) ]! ! !Dictionary methodsFor: 'private' stamp: 'SvenVanCaekenberghe 4/19/2011 20:30'! errorValueNotFound: value ValueNotFound signalFor: value! ! !Dictionary methodsFor: 'private'! rehash "Smalltalk rehash." | newSelf | newSelf := self species new: self size. self associationsDo: [:each | newSelf noCheckAdd: each]. array := newSelf array! ! !Dictionary methodsFor: 'private' stamp: 'HenrikSperreJohansen 9/1/2010 23:17'! noCheckNoGrowFillFrom: anArray "Add the elements of anArray except nils to me assuming that I don't contain any of them, they are unique and I have more free space than they require." 1 to: anArray size do: [ :index | (anArray at: index) ifNotNil: [ :association | array at: (self scanForEmptySlotFor: association key) put: association ] ]! ! !Dictionary methodsFor: 'enumerating' stamp: 'nice 10/5/2009 10:16'! select: aBlock "Evaluate aBlock with each of my values as the argument. Collect into a new dictionary, only those associations for which aBlock evaluates to true." | newCollection | newCollection := self copyEmpty. self associationsDo: [ :each | (aBlock value: each value) ifTrue: [ newCollection add: each copy ] ]. ^newCollection! ! !Dictionary methodsFor: 'enumerating' stamp: 'MarianoMartinezPeck 8/24/2012 15:26'! keysAndValuesDo: aBlock ^self associationsDo:[:assoc| aBlock value: assoc key value: assoc value].! ! !Dictionary methodsFor: 'enumerating' stamp: 'dtl 2/17/2003 09:40'! associationsSelect: aBlock "Evaluate aBlock with each of my associations as the argument. Collect into a new dictionary, only those associations for which aBlock evaluates to true." | newCollection | newCollection := self species new. self associationsDo: [:each | (aBlock value: each) ifTrue: [newCollection add: each]]. ^newCollection! ! !Dictionary methodsFor: 'enumerating'! keysDo: aBlock "Evaluate aBlock for each of the receiver's keys." self associationsDo: [:association | aBlock value: association key]! ! !Dictionary methodsFor: 'enumerating' stamp: 'ar 6/13/2008 00:16'! collect: aBlock "Evaluate aBlock with each of my values as the argument. Collect the resulting values into a collection that is like me. Answer with the new collection." | newCollection | newCollection := self species new. self associationsDo:[:each | newCollection at: each key put: (aBlock value: each value). ]. ^newCollection! ! !Dictionary methodsFor: 'enumerating' stamp: 'CamilloBruni 9/9/2011 16:50'! difference: aCollection "Answer the set theoretic difference of two collections. This is a specialized version for Dictionaries keeping the keys of the objects. At a slightly higher price of an additional Set to track duplicates." | other result duplicates | other := aCollection asSet. duplicates := Set new. result := self class new: self size. self keysAndValuesDo: [ :key :value| ((other includes: value) not and: [ (duplicates includes: value) not ]) ifTrue: [ duplicates add: value. result at: key put: value]]. ^ result! ! !Dictionary methodsFor: 'enumerating' stamp: 'TristanBourgois 5/10/2010 10:41'! associationsDo: aBlock "Evaluate aBlock for each of the receiver's elements (key/value associations)." tally = 0 ifTrue: [^ self]. array do: [:each | each ifNotNil: [aBlock value: each]]! ! !Dictionary methodsFor: 'enumerating' stamp: 'MarcusDenker 7/2/2010 13:02'! do: aBlock ^self valuesDo: aBlock! ! !Dictionary methodsFor: 'enumerating' stamp: 'SqR 11/7/2013 12:12'! valuesDo: aBlock "Evaluate aBlock for each of the receiver's values. Implemented with == checks merely for the sake of maximum efficiency" tally = 0 ifTrue: [ ^self ]. 1 to: array size do: [ :eachIndex | | eachAssociation | eachAssociation := array at: eachIndex. nil == eachAssociation ifFalse: [ aBlock value: eachAssociation value ] ]! ! !Dictionary methodsFor: 'enumerating' stamp: 'ar 5/18/2003 20:33'! bindingsDo: aBlock ^self associationsDo: aBlock! ! !Dictionary methodsFor: 'removing'! removeKey: key ifAbsent: aBlock "Remove key (and its associated value) from the receiver. If key is not in the receiver, answer the result of evaluating aBlock. Otherwise, answer the value externally named by key." | index assoc | index := self findElementOrNil: key. assoc := array at: index. assoc == nil ifTrue: [ ^ aBlock value ]. array at: index put: nil. tally := tally - 1. self fixCollisionsFrom: index. ^ assoc value! ! !Dictionary methodsFor: 'removing'! removeUnreferencedKeys "Undeclared removeUnreferencedKeys" ^ self unreferencedKeys do: [:key | self removeKey: key].! ! !Dictionary methodsFor: 'removing' stamp: 'MarcusDenker 10/9/2013 11:29'! unreferencedKeys "| uk | (Time millisecondsToRun: [uk := TextConstants unreferencedKeys]) -> uk" ^'Scanning for references . . .' displayProgressFrom: 0 to: Smalltalk globals classNames size * 2 during: [:bar | | currentClass n associations referencedAssociations | currentClass := nil. n := 0. associations := self associations asIdentitySet. referencedAssociations := IdentitySet new: associations size. self systemNavigation allMethodsSelect: [:m| m methodClass ~~ currentClass ifTrue: [currentClass := m methodClass. bar current: (n := n + 1)]. m literalsDo: [:l| (l isVariableBinding and: [associations includes: l]) ifTrue: [referencedAssociations add: l]]. false]. ((associations reject: [:assoc | referencedAssociations includes: assoc]) collect: [:assoc| assoc key]) asSet]! ! !Dictionary methodsFor: 'removing' stamp: 'di 4/4/2000 11:47'! keysAndValuesRemove: keyValueBlock "Removes all entries for which keyValueBlock returns true." "When removing many items, you must not do it while iterating over the dictionary, since it may be changing. This method takes care of tallying the removals in a first pass, and then performing all the deletions afterward. Many places in the sytem could be simplified by using this method." | removals | removals := OrderedCollection new. self associationsDo: [:assoc | (keyValueBlock value: assoc key value: assoc value) ifTrue: [removals add: assoc key]]. removals do: [:aKey | self removeKey: aKey]! ! !Dictionary methodsFor: 'removing' stamp: 'CamilloBruni 4/11/2011 13:30'! removeKey: key "Remove key from the receiver. If key is not in the receiver, notify an error." ^ self removeKey: key ifAbsent: [self errorKeyNotFound: key]! ! !Dictionary methodsFor: 'removing'! remove: anObject self shouldNotImplement! ! !Dictionary methodsFor: 'removing'! remove: anObject ifAbsent: exceptionBlock self shouldNotImplement! ! !Dictionary methodsFor: 'copying' stamp: 'ul 9/22/2009 04:51'! postCopy "Must copy the associations, or later store will affect both the original and the copy" array := array collect: [ :association | association ifNotNil: [ association copy ] ]! ! !Dictionary methodsFor: 'printing'! storeOn: aStream | noneYet | aStream nextPutAll: '(('. aStream nextPutAll: self class name. aStream nextPutAll: ' new)'. noneYet := true. self associationsDo: [:each | noneYet ifTrue: [noneYet := false] ifFalse: [aStream nextPut: $;]. aStream nextPutAll: ' add: '. aStream store: each]. noneYet ifFalse: [aStream nextPutAll: '; yourself']. aStream nextPut: $)! ! !Dictionary methodsFor: 'printing' stamp: 'apb 7/14/2004 12:48'! printElementsOn: aStream aStream nextPut: $(. self size > 100 ifTrue: [aStream nextPutAll: 'size '. self size printOn: aStream] ifFalse: [self keysSortedSafely do: [:key | aStream print: key; nextPutAll: '->'; print: (self at: key); space]]. aStream nextPut: $)! ! !Dictionary methodsFor: 'comparing' stamp: 'cyrille.delaunay 7/17/2009 15:45'! = aDictionary "Two dictionaries are equal if (a) they are the same 'kind' of thing. (b) they have the same set of keys. (c) for each (common) key, they have the same value" self == aDictionary ifTrue: [ ^ true ]. (aDictionary isDictionary) ifFalse: [^false]. self size = aDictionary size ifFalse: [^false]. self associationsDo: [:assoc| (aDictionary at: assoc key ifAbsent: [^false]) = assoc value ifFalse: [^false]]. ^true ! ! !Dictionary methodsFor: '*monticellofiletree-core' stamp: 'dkh 4/6/2012 15:56:14'! writeCypressJsonForHtmlOn: aStream self writeCypressJsonOn: aStream forHtml: true indent: 0! ! !Dictionary methodsFor: '*monticellofiletree-core' stamp: 'dkh 4/6/2012 15:56:14'! writeCypressJsonOn: aStream self writeCypressJsonOn: aStream forHtml: false indent: 0. aStream lf! ! !Dictionary methodsFor: '*monticellofiletree-core' stamp: 'dkh 4/6/2012 15:56:14'! writeCypressJsonOn: aStream forHtml: forHtml indent: startIndent "by default ignore ... is used for Dictionary and Array, i.e., container objects and String which actually encodes itself differently for HTML" | indent keys | indent := startIndent. aStream nextPutAll: '{'; lf. indent := indent + 1. keys := self keys sort: [ :a :b | a <= b ]. 1 to: keys size do: [ :index | | key value | key := keys at: index. value := self at: key. aStream tab: indent. key writeCypressJsonOn: aStream forHtml: forHtml indent: indent. aStream nextPutAll: ' : '. value writeCypressJsonOn: aStream forHtml: forHtml indent: indent. index < self size ifTrue: [ aStream nextPutAll: ','; lf ] ]. self size = 0 ifTrue: [ aStream tab: indent ]. aStream nextPutAll: ' }'! ! !Dictionary methodsFor: '*Tool-Explorer' stamp: 'yo 8/27/2008 23:16'! customizeExplorerContents ^ true. ! ! !Dictionary methodsFor: '*Tool-Explorer' stamp: 'yo 8/27/2008 23:44'! explorerContentsWithIndexCollect: twoArgBlock | sortedKeys | sortedKeys := self keys asSortedCollection: [:x :y | ((x isString and: [y isString]) or: [x isNumber and: [y isNumber]]) ifTrue: [x < y] ifFalse: [x class == y class ifTrue: [x printString < y printString] ifFalse: [x class name < y class name]]]. ^ sortedKeys collect: [:k | twoArgBlock value: (self at: k) value: k]. ! ! !Dictionary methodsFor: 'kernel'! declare: key from: aDictionary "Add key to the receiver. If key already exists, do nothing. If aDictionary includes key, then remove it from aDictionary and use its association as the element of the receiver." (self includesKey: key) ifTrue: [^ self]. (aDictionary includesKey: key) ifTrue: [self add: (aDictionary associationAt: key). aDictionary removeKey: key] ifFalse: [self add: key -> nil]! ! !Dictionary methodsFor: 'kernel' stamp: 'MarcusDenker 7/29/2014 16:08'! declareVariable: newGlobal from: aDictionary "Add aGlobal to the receiver. If key already exists, do nothing. If aDictionary includes key, then remove it from aDictionary and use its association as the element of the receiver." | globalName | globalName := newGlobal key. self associationAt: globalName ifPresent: [:existingGlobal | "need to take care to migrate existing variables to new global if class if different" (existingGlobal class == newGlobal class) ifTrue: [^self]. newGlobal value: existingGlobal value. self removeKey: globalName. self add: newGlobal. ]. (aDictionary includesKey: globalName) ifTrue: [ self add: ((aDictionary associationAt: globalName) primitiveChangeClassTo: ClassVariable new). aDictionary removeKey: globalName] ifFalse: [ self add: newGlobal]! ! !Dictionary methodsFor: 'testing'! includes: anObject self do: [:each | anObject = each ifTrue: [^true]]. ^false! ! !Dictionary methodsFor: 'testing' stamp: 'SvenVanCaekenberghe 10/26/2013 12:24'! includesKey: key "Answer whether the receiver has a key equal to the argument, key." ^ (array at: (self scanFor: key)) ~~ nil "We could use #notNil here, but ProtoObject doesn't understand it."! ! !Dictionary methodsFor: 'testing' stamp: 'tween 9/13/2004 10:11'! hasBindingThatBeginsWith: aString "Answer true if the receiver has a key that begins with aString, false otherwise" self keysDo:[:each | (each beginsWith: aString) ifTrue:[^true]]. ^false! ! !Dictionary methodsFor: 'testing' stamp: 'sw 3/23/2000 01:12'! keyForIdentity: anObject "If anObject is one of the values of the receive, return its key, else return nil. Contrast #keyAtValue: in which there is only an equality check, here there is an identity check" self associationsDo: [:assoc | assoc value == anObject ifTrue: [^ assoc key]]. ^ nil! ! !Dictionary methodsFor: 'testing' stamp: 'StephaneDucasse 5/28/2011 14:01'! isHealthy "Test that object hashes match their positions stored in set's array, answer true if everything ok, false otherwise Dictionary allInstances select: [:dict | dict isHealthy not ] Dictionary allSubInstances select: [:dict | dict isHealthy not ] " array withIndexDo: [:elem :i | elem ifNotNil: [ (self scanFor: elem key) == i ifFalse: [ ^ false ] ] ]. ^ true! ! !Dictionary methodsFor: 'testing' stamp: 'md 8/11/2005 16:49'! isDictionary ^true! ! !Dictionary methodsFor: 'testing' stamp: 'sw 2/14/2000 14:34'! includesIdentity: anObject "Answer whether anObject is one of the values of the receiver. Contrast #includes: in which there is only an equality check, here there is an identity check" self do: [:each | anObject == each ifTrue: [^ true]]. ^ false! ! !Dictionary methodsFor: 'testing' stamp: 'ab 9/17/2004 00:39'! includesAssociation: anAssociation ^ (self associationAt: anAssociation key ifAbsent: [ ^ false ]) value = anAssociation value ! ! !Dictionary methodsFor: 'accessing' stamp: 'MarcusDenker 8/18/2010 19:17'! at: key ifAbsent: aBlock "Answer the value associated with the key or, if key isn't found, answer the result of evaluating aBlock." ^((array at: (self findElementOrNil: key)) ifNil: [aBlock] ifNotNil: [:assoc | assoc]) value.! ! !Dictionary methodsFor: 'accessing' stamp: 'SvenVanCaekenberghe 4/19/2011 20:31'! keyAtValue: value "Answer the key that is the external name for the argument, value. If there is none, signal an error." ^self keyAtValue: value ifAbsent: [self errorValueNotFound: value]! ! !Dictionary methodsFor: 'accessing' stamp: 'CamilloBruni 4/11/2011 13:30'! at: key "Answer the value associated with the key." ^ self at: key ifAbsent: [self errorKeyNotFound: key]! ! !Dictionary methodsFor: 'accessing' stamp: 'StephaneDucasse 5/13/2010 11:37'! at: key ifPresent: oneArgBlock ifAbsent: absentBlock "Lookup the given key in the receiver. If it is present, answer the value of evaluating the oneArgBlock with the value associated with the key, otherwise answer the value of absentBlock." self at: key ifPresent: [ :v | ^oneArgBlock value: v ]. ^absentBlock value! ! !Dictionary methodsFor: 'accessing' stamp: 'StephaneDucasse 12/25/2009 12:12'! associations "Answer a Collection containing the receiver's associations." "Suggested by l. Uzonyi" ^Array new: self size streamContents: [ :stream | self associationsDo: [ :each | stream nextPut: each ] ]! ! !Dictionary methodsFor: 'accessing' stamp: 'tk 2/18/97'! keyAtValue: value ifAbsent: exceptionBlock "Answer the key that is the external name for the argument, value. If there is none, answer the result of evaluating exceptionBlock. : Use =, not ==, so stings like 'this' can be found. Note that MethodDictionary continues to use == so it will be fast." self associationsDo: [:association | value = association value ifTrue: [^association key]]. ^exceptionBlock value! ! !Dictionary methodsFor: 'accessing' stamp: 'nice 10/20/2009 23:20'! keys "Answer an Array containing the receiver's keys." ^Array new: self size streamContents: [:s| self keysDo: [:key| s nextPut: key]]! ! !Dictionary methodsFor: 'accessing' stamp: 'SvenVanCaekenberghe 4/19/2011 20:31'! keyAtIdentityValue: value "Answer the key that is the external name for the argument, value. If there is none, answer nil. Note: There can be multiple keys with the same value. Only one is returned." ^self keyAtIdentityValue: value ifAbsent: [self errorValueNotFound: value]! ! !Dictionary methodsFor: 'accessing' stamp: 'StephaneDucasse 12/25/2009 12:15'! keysSortedSafely "Answer an Array containing the receiver's keys." "Suggested by l. Uzonyi" | sortedKeys | sortedKeys := Array new: self size streamContents: [ :stream | self keysDo: [ :each | stream nextPut: each ] ]. sortedKeys sort: [ :x :y | "Should really be use compareSafely..." ((x isString and: [ y isString ]) or: [ x isNumber and: [ y isNumber ] ]) ifTrue: [ x < y ] ifFalse: [ x class == y class ifTrue: [ x printString < y printString ] ifFalse: [ x class name < y class name ] ] ]. ^sortedKeys! ! !Dictionary methodsFor: 'accessing'! associationAt: key ifAbsent: aBlock "Answer the association with the given key. If key is not found, return the result of evaluating aBlock." | index assoc | index := self findElementOrNil: key. assoc := array at: index. nil == assoc ifTrue: [ ^ aBlock value ]. ^ assoc! ! !Dictionary methodsFor: 'accessing' stamp: 'PeterHugossonMiller 9/3/2009 01:13'! values "Answer a Collection containing the receiver's values." | out | out := (Array new: self size) writeStream. self valuesDo: [:value | out nextPut: value]. ^ out contents! ! !Dictionary methodsFor: 'accessing' stamp: 'ar 2/13/1999 21:16'! keyAtIdentityValue: value ifAbsent: exceptionBlock "Answer the key that is the external name for the argument, value. If there is none, answer the result of evaluating exceptionBlock. Note: There can be multiple keys with the same value. Only one is returned." self associationsDo: [:association | value == association value ifTrue: [^association key]]. ^exceptionBlock value! ! !Dictionary methodsFor: 'accessing' stamp: 'CamilloBruni 4/11/2011 13:30'! associationAt: key ^ self associationAt: key ifAbsent: [self errorKeyNotFound: key]! ! !Dictionary methodsFor: 'accessing' stamp: 'ar 5/17/2003 14:07'! bindingOf: varName ^self associationAt: varName ifAbsent:[nil]! ! !Dictionary methodsFor: 'accessing' stamp: 'sma 5/12/2000 15:00'! at: key put: anObject "Set the value at key to be anObject. If key is not found, create a new entry for key and set is value to anObject. Answer anObject." | index assoc | index := self findElementOrNil: key. assoc := array at: index. assoc ifNil: [self atNewIndex: index put: (Association key: key value: anObject)] ifNotNil: [assoc value: anObject]. ^ anObject! ! !Dictionary methodsFor: 'accessing' stamp: 'MarcusDenker 7/11/2014 18:34'! associationAt: key ifPresent: aBlock "Answer the association with the given key. If key is not found, return the result of evaluating aBlock." ^(array at: (self findElementOrNil: key)) ifNotNil: [:assoc | aBlock cull: assoc]! ! !Dictionary methodsFor: 'accessing' stamp: 'sma 5/12/2000 15:01'! at: key ifAbsentPut: aBlock "Return the value at the given key. If key is not included in the receiver store the result of evaluating aBlock as new value." ^ self at: key ifAbsent: [self at: key put: aBlock value]! ! !Dictionary methodsFor: 'accessing' stamp: 'nice 5/1/2011 18:29'! at: key ifPresent: aBlock "Lookup the given key in the receiver. If it is present, answer the value of evaluating the given block with the value associated with the key. Otherwise, answer nil." ^(array at: (self findElementOrNil: key)) ifNotNil: [:assoc | aBlock cull: assoc value]! ! !Dictionary methodsFor: '*NewValueHolder' stamp: 'BenjaminVanRyseghem 1/24/2014 16:07'! asValueHolder ^ DictionaryValueHolder value: self! ! !Collection class methodsFor: 'instance creation' stamp: 'sma 5/6/2000 20:07'! withAll: aCollection "Create a new collection containing all the elements from aCollection." ^ (self new: aCollection size) addAll: aCollection; yourself! ! !Collection class methodsFor: 'instance creation' stamp: 'sma 5/6/2000 20:06'! with: firstObject with: secondObject with: thirdObject with: fourthObject with: fifthObject with: sixthObject "Answer an instance of me, containing the six arguments as the elements." ^ self new add: firstObject; add: secondObject; add: thirdObject; add: fourthObject; add: fifthObject; add: sixthObject; yourself! ! !Collection class methodsFor: 'instance creation' stamp: 'sma 5/6/2000 20:06'! with: firstObject with: secondObject with: thirdObject with: fourthObject with: fifthObject "Answer an instance of me, containing the five arguments as the elements." ^ self new add: firstObject; add: secondObject; add: thirdObject; add: fourthObject; add: fifthObject; yourself! ! !Collection class methodsFor: 'instance creation' stamp: 'sma 5/6/2000 20:01'! with: firstObject with: secondObject "Answer an instance of me containing the two arguments as elements." ^ self new add: firstObject; add: secondObject; yourself! ! !Collection class methodsFor: 'instance creation' stamp: 'sma 5/6/2000 20:03'! with: firstObject with: secondObject with: thirdObject "Answer an instance of me containing the three arguments as elements." ^ self new add: firstObject; add: secondObject; add: thirdObject; yourself! ! !Collection class methodsFor: 'instance creation' stamp: 'sma 5/6/2000 20:06'! with: firstObject with: secondObject with: thirdObject with: fourthObject "Answer an instance of me, containing the four arguments as the elements." ^ self new add: firstObject; add: secondObject; add: thirdObject; add: fourthObject; yourself! ! !Collection class methodsFor: 'instance creation' stamp: 'sma 5/6/2000 19:58'! with: anObject "Answer an instance of me containing anObject." ^ self new add: anObject; yourself! ! !Collection class methodsFor: '*Tools-Debugger' stamp: 'SeanDeNigris 5/28/2013 17:47'! canonicalArgumentName ^ 'aCollection'.! ! !Collection class methodsFor: 'private' stamp: 'lr 11/4/2003 12:07'! initialize "Set up a Random number generator to be used by atRandom when the user does not feel like creating his own Random generator." RandomForPicking := Random new. MutexForPicking := Semaphore forMutualExclusion! ! !Collection class methodsFor: 'private' stamp: 'lr 11/4/2003 12:08'! mutexForPicking ^ MutexForPicking! ! !Collection class methodsFor: 'private' stamp: 'sma 5/12/2000 12:31'! randomForPicking ^ RandomForPicking! ! !Collection class methodsFor: '*Polymorph-Widgets-Themes' stamp: 'YuriyTymchuk 12/20/2013 11:17'! systemIcon ^ Smalltalk ui icons iconNamed: #collectionIcon! ! !Dictionary class methodsFor: '*Spec-Inspector' stamp: 'cb 6/25/2013 13:43'! inspectorClass ^ EyeDictionaryInspector! ! !Dictionary class methodsFor: 'instance creation'! newFrom: aDict "Answer an instance of me containing the same associations as aDict. Error if any key appears twice." | newDictionary | newDictionary := self new: aDict size. aDict associationsDo: [:x | (newDictionary includesKey: x key) ifTrue: [self error: 'Duplicate key: ', x key printString] ifFalse: [newDictionary add: x]]. ^ newDictionary " NewDictionary newFrom: {1->#a. 2->#b. 3->#c} {1->#a. 2->#b. 3->#c} as: NewDictionary NewDictionary newFrom: {1->#a. 2->#b. 1->#c} {1->#a. 2->#b. 1->#c} as: NewDictionary "! ! !Dictionary class methodsFor: 'instance creation' stamp: 'bgf 10/25/2006 17:08'! newFromPairs: anArray "Answer an instance of me associating (anArray at:i) to (anArray at: i+i) for each odd i. anArray must have an even number of entries." | newDictionary | newDictionary := self new: (anArray size/2). 1 to: (anArray size-1) by: 2 do: [ :i| newDictionary at: (anArray at: i) put: (anArray at: i+1). ]. ^ newDictionary " Dictionary newFromPairs: {'Red' . Color red . 'Blue' . Color blue . 'Green' . Color green}. "! ! !Symbol methodsFor: 'printing' stamp: 'BenjaminVanRyseghem 11/24/2010 14:43'! storeOn: aStream aStream nextPut: $#. (self isLiteralSymbol) ifTrue: [aStream nextPutAll: self] ifFalse: [super storeOn: aStream]! ! !Symbol methodsFor: 'printing' stamp: 'sw 8/19/1999 11:30'! isOrientedFill "Needs to be implemented here because symbols can occupy 'color' slots of morphs." ^ false! ! !Symbol methodsFor: '*metacello-core' stamp: 'DaleHenrichs 12/21/2010 13:55'! setPreLoadDoItInMetacelloSpec: aMetacelloSpec self precedence == 0 ifTrue: [ self error: 'Invalid selector' ]. aMetacelloSpec setPreLoadDoIt: (aMetacelloSpec project valueHolderSpec value: self; yourself)! ! !Symbol methodsFor: '*metacello-core' stamp: 'dkh 9/5/2012 06:26:03.064'! setForVersion: aString withInMetacelloConfig: aMetacelloConstructore aMetacelloConstructore setFor: {self} version: aString! ! !Symbol methodsFor: '*metacello-core' stamp: 'dkh 9/7/2012 13:44'! asMetacelloAttributePath ^ MetacelloMethodSectionPath with: {self}! ! !Symbol methodsFor: '*metacello-core' stamp: 'dkh 9/5/2012 06:26:03.064'! setForDo: aBlock withInMetacelloConfig: aMetacelloConstructore aMetacelloConstructore setFor: {self} do: aBlock! ! !Symbol methodsFor: '*metacello-core' stamp: 'dkh 9/7/2012 13:11'! asMetacelloAttributeList ^ {self}! ! !Symbol methodsFor: '*metacello-core' stamp: 'DaleHenrichs 12/21/2010 13:54'! setPostLoadDoItInMetacelloSpec: aMetacelloSpec self precedence == 0 ifTrue: [ self error: 'Invalid selector' ]. aMetacelloSpec setPostLoadDoIt: (aMetacelloSpec project valueHolderSpec value: self; yourself)! ! !Symbol methodsFor: '*Slot' stamp: 'MarcusDenker 6/26/2014 13:37'! asSlot ^ InstanceVariableSlot named: self.! ! !Symbol methodsFor: '*Slot' stamp: 'MarcusDenker 7/13/2014 11:56'! => aVariable aVariable isBehavior ifTrue: [ ^ aVariable named: self]. ^ aVariable name: self; yourself! ! !Symbol methodsFor: '*Slot' stamp: 'MartinDias 8/7/2012 01:31'! isPseudovariableName "Answer true if I am a pseudo-variable name. #self isPseudovariableName -> true " ^ self class pseudovariablesNames includes: self! ! !Symbol methodsFor: '*opalcompiler-core' stamp: 'MarcusDenker 6/21/2012 11:18'! asOneArgSelector ^ String streamContents: [:str| | parts | parts := (self findTokens: ':)'). str nextPutAll: parts first. parts allButFirst do: [:each | str nextPutAll: each capitalized] . str nextPutAll: ':']! ! !Symbol methodsFor: '*opalcompiler-core' stamp: 'MarcusDenker 10/11/2013 10:21'! asMethodPreamble self numArgs = 0 ifTrue: [ ^self asString]. ^ String streamContents: [ :str | self keywords doWithIndex: [ :each :index | str nextPutAll: each; nextPutAll: ' var' , index asString ] ]! ! !Symbol methodsFor: 'evaluating' stamp: 'HenrikSperreJohansen 2/18/2010 14:58'! cull: anObject ^anObject perform: self.! ! !Symbol methodsFor: 'evaluating' stamp: 'md 3/24/2006 12:09'! value: anObject ^anObject perform: self.! ! !Symbol methodsFor: 'copying' stamp: 'tk 8/19/1998 16:05'! veryDeepCopyWith: deepCopier "Return self. I am immutable in the Morphic world. Do not record me."! ! !Symbol methodsFor: 'copying'! copy "Answer with the receiver, because Symbols are unique."! ! !Symbol methodsFor: 'copying'! shallowCopy "Answer with the receiver, because Symbols are unique."! ! !Symbol methodsFor: 'sorting' stamp: 'DamienCassou 8/27/2013 21:06'! sorted: aSortBlockOrNil "Return a new sequenceable collection which contains the same elements as self but its elements are sorted by aSortBlockOrNil. The block should take two arguments and return true if the first element should preceed the second one. If aSortBlock is nil then <= is used for comparison. We convert the symbol to an array because symbols can't be changed." ^self asArray sort: aSortBlockOrNil! ! !Symbol methodsFor: 'system primitives' stamp: 'CamilloBruni 9/7/2011 16:21'! numArgs: n "Answer a string that can be used as a selector with n arguments. TODO: need to be extended to support shrinking and for selectors like #+ " | selector numArgs offs | selector := self. (numArgs := selector numArgs) >= n ifTrue: [ ^ self ]. ^ self class new: 16 streamContents: [ :stream| stream nextPutAll: self. (numArgs = 0) ifTrue: [ stream nextPut: $:. offs := 0] ifFalse: [ offs := 1 ]. 2 to: n - numArgs + offs do: [:i | stream nextPutAll: 'with:' ]]. ! ! !Symbol methodsFor: 'system primitives' stamp: 'MarcusDenker 2/29/2012 11:18'! flushCache "Tell the interpreter to remove all entries with this symbol as a selector from its method lookup cache, if it has one. This primitive must be called whenever a method is redefined or removed. NOTE: Only one of the two selective flush methods (Symbol or CompiledMethod) needs to be used." ! ! !Symbol methodsFor: 'announcements' stamp: 'StephaneDucasse 2/22/2013 18:21'! handlesAnnouncement: anAnnouncement "Anything else than the announcement identifier (in the case of symbol i.e. #foo for ... on: #foo send: #bar to: nil) will not be handled." "Announcer new on: #FOO send: #bar to: nil; announce: #FOO should raise DNU bar" ^ anAnnouncement == self! ! !Symbol methodsFor: 'testing' stamp: 'StephaneDucasse 5/28/2011 13:42'! isUnary "Answer whether the receiver is an unary message selector." ^ self precedence = 1! ! !Symbol methodsFor: 'testing' stamp: 'md 1/20/2006 16:16'! includesKey: sym ^self == sym.! ! !Symbol methodsFor: 'testing' stamp: 'md 8/27/2005 16:33'! isDoIt ^ (self == #DoIt) or: [self == #DoItIn:].! ! !Symbol methodsFor: 'testing' stamp: 'StephaneDucasse 5/28/2011 13:45'! isInfix "Answer whether the receiver is an infix message selector." ^ self precedence = 2! ! !Symbol methodsFor: 'testing' stamp: 'md 4/30/2003 15:31'! isSymbol ^ true ! ! !Symbol methodsFor: 'testing' stamp: 'StephaneDucasse 5/28/2011 13:45'! isBinary "Answer whether the receiver is a binary message selector." ^ self precedence = 2! ! !Symbol methodsFor: 'testing' stamp: 'StephaneDucasse 5/28/2011 13:47'! isKeyword "Answer whether the receiver is a message keyword." ^ self precedence = 3! ! !Symbol methodsFor: 'converting' stamp: 'st 11/22/2004 17:26'! asMutator "Return a setter message from a getter message. For example, #name asMutator returns #name:" ^ (self copyWith: $:) asSymbol! ! !Symbol methodsFor: 'converting'! asSymbol "Refer to the comment in String|asSymbol."! ! !Symbol methodsFor: 'converting' stamp: 'ar 4/10/2005 22:42'! asString "Refer to the comment in String|asString." | newString | newString := self species new: self size. newString replaceFrom: 1 to: newString size with: self startingAt: 1. ^newString! ! !Symbol methodsFor: 'converting' stamp: 'MarcusDenker 10/11/2013 10:07'! separateKeywords "#'foo:zork:' separateKeywords -> 'foo: zork:'" self isKeyword ifFalse: [ ^ self ]. ^ String streamContents: [ :stream | (self findTokens: $:) do: [ :each | stream nextPutAll: each; nextPut: $: ] separatedBy: [ stream nextPutAll: ' ' ] ]! ! !Symbol methodsFor: 'converting' stamp: 'md 8/10/2004 10:54'! withFirstCharacterDownshifted "Answer an object like the receiver but with first character downshifted if necesary" ^self asString withFirstCharacterDownshifted asSymbol.! ! !Symbol methodsFor: 'converting' stamp: 'StephaneDucasse 2/22/2013 18:18'! asAnnouncement ^ self! ! !Symbol methodsFor: 'converting' stamp: 'sw 1/28/98 18:18'! capitalized ^ self asString capitalized asSymbol! ! !Symbol methodsFor: '*System-Support' stamp: 'MarcusDenker 7/17/2014 19:07'! implementors ^SystemNavigation new allImplementorsOf: self! ! !Symbol methodsFor: '*System-Support' stamp: 'MarcusDenker 7/17/2014 19:11'! senders ^SystemNavigation new allSendersOf: self! ! !Symbol methodsFor: 'accessing'! replaceFrom: start to: stop with: replacement startingAt: repStart self errorNoModification! ! !Symbol methodsFor: 'accessing'! at: anInteger put: anObject "You cannot modify the receiver." self errorNoModification! ! !Symbol methodsFor: 'accessing' stamp: 'sma 2/5/2000 12:32'! precedence "Answer the receiver's precedence, assuming it is a valid Smalltalk message selector or 0 otherwise. The numbers are 1 for unary, 2 for binary and 3 for keyword selectors." self size = 0 ifTrue: [^ 0]. self first isLetter ifFalse: [^ 2]. self last = $: ifTrue: [^ 3]. ^ 1! ! !Symbol methodsFor: 'comparing' stamp: 'ar 4/10/2005 23:45'! = aSymbol "Compare the receiver and aSymbol." self == aSymbol ifTrue: [^ true]. self class == aSymbol class ifTrue: [^ false]. "Use String comparison otherwise" ^ super = aSymbol! ! !Symbol methodsFor: 'private'! string: aString 1 to: aString size do: [:j | super at: j put: (aString at: j)]. ^self ! ! !Symbol methodsFor: 'private'! errorNoModification self error: 'symbols can not be modified.'! ! !Symbol class methodsFor: 'initialization' stamp: 'RAA 5/29/2001 14:35'! allSymbolTablesDo: aBlock after: aSymbol NewSymbols do: aBlock after: aSymbol. SymbolTable do: aBlock after: aSymbol.! ! !Symbol class methodsFor: 'initialization' stamp: 'RAA 5/29/2001 09:04'! initialize "Symbol initialize" Symbol rehash. OneCharacterSymbols := nil. OneCharacterSymbols := (1 to: 256) collect: [ :i | (i - 1) asCharacter asSymbol]. Smalltalk addToShutDownList: self. ! ! !Symbol class methodsFor: 'initialization' stamp: 'RAA 5/29/2001 08:21'! allSymbolTablesDo: aBlock NewSymbols do: aBlock. SymbolTable do: aBlock.! ! !Symbol class methodsFor: 'initialization' stamp: 'RAA 12/17/2000 18:05'! compactSymbolTable "Reduce the size of the symbol table so that it holds all existing symbols + 25% (changed from 1000 since sets like to have 25% free and the extra space would grow back in a hurry)" | oldSize | Smalltalk garbageCollect. oldSize := SymbolTable array size. SymbolTable growTo: SymbolTable size * 4 // 3 + 100. ^oldSize printString,' ',(oldSize - SymbolTable array size) printString, ' slot(s) reclaimed'! ! !Symbol class methodsFor: 'accessing' stamp: 'CamilloBruni 9/5/2011 15:22'! streamSpecies ^ String! ! !Symbol class methodsFor: 'instance creation' stamp: 'MarcusDenker 7/23/2014 13:17'! findInterned: aString self hasInterned:aString ifTrue:[:symbol| ^symbol]. ^nil.! ! !Symbol class methodsFor: 'instance creation' stamp: 'BenjaminVanRyseghem 11/24/2010 14:44'! with: aCharacter ^self newFrom: aCharacter asOrderedCollection! ! !Symbol class methodsFor: 'instance creation' stamp: 'CamilloBruni 9/9/2011 12:57'! withAll: aCollection ^ self newFrom: aCollection! ! !Symbol class methodsFor: 'instance creation' stamp: 'ar 4/10/2005 23:04'! internCharacter: aCharacter aCharacter asciiValue > 256 ifTrue:[^self intern: aCharacter asString]. OneCharacterSymbols ifNil: [^self intern: aCharacter asString]. ^OneCharacterSymbols at: aCharacter asciiValue + 1 ! ! !Symbol class methodsFor: 'instance creation'! newFrom: aCollection "Answer an instance of me containing the same elements as aCollection." ^ (aCollection as: String) asSymbol " Symbol newFrom: {$P. $e. $n} {$P. $e. $n} as: Symbol "! ! !Symbol class methodsFor: 'instance creation' stamp: 'RAA 5/29/2001 08:09'! lookup: aStringOrSymbol ^(SymbolTable like: aStringOrSymbol) ifNil: [ NewSymbols like: aStringOrSymbol ]! ! !Symbol class methodsFor: 'instance creation' stamp: 'SheridanMahoney 11/12/2009 22:04'! new: aSize self shouldNotImplement .! ! !Symbol class methodsFor: 'instance creation' stamp: 'MarcusDenker 5/18/2013 15:44'! readFrom: strm "Symbol readFromString: '#abc'" strm peek = $# ifFalse: [self error: 'Symbols must be introduced by #']. ^ strm contents parseLiterals first. ! ! !Symbol class methodsFor: 'instance creation' stamp: 'SheridanMahoney 11/17/2009 13:23'! intern: aStringOrSymbol ^(self lookup: aStringOrSymbol) ifNil:[ | aClass aSymbol | aStringOrSymbol isSymbol ifTrue:[ aSymbol := aStringOrSymbol. ] ifFalse:[ aClass := aStringOrSymbol isOctetString ifTrue:[ByteSymbol] ifFalse:[WideSymbol]. aSymbol := aClass basicNew: aStringOrSymbol size. aSymbol string: aStringOrSymbol. ]. NewSymbols add: aSymbol. aSymbol].! ! !Symbol class methodsFor: 'private' stamp: 'RAA 5/29/2001 09:04'! shutDown: aboutToQuit SymbolTable addAll: NewSymbols. NewSymbols := WeakSet new.! ! !Symbol class methodsFor: 'private' stamp: 'MarcusDenker 10/9/2013 10:42'! hasInterned: aString ifTrue: symBlock "Answer with false if aString hasnt been interned (into a Symbol), otherwise supply the symbol to symBlock and return true." ^ (self lookup: aString) ifNil: [ false ] ifNotNil: [ :symbol | symBlock value: symbol. true ]! ! !Symbol class methodsFor: 'private' stamp: 'ar 9/27/2005 20:01'! rehash "Symbol rehash" "Rebuild the hash table, reclaiming unreferenced Symbols." SymbolTable := WeakSet withAll: self allSubInstances. NewSymbols := WeakSet new.! ! !Symbol class methodsFor: 'private' stamp: 'nice 1/5/2010 15:59'! possibleSelectorsFor: misspelled "Answer an ordered collection of possible corrections for the misspelled selector in order of likelyhood" | numArgs candidates lookupString best binary short long first | lookupString := misspelled asLowercase. "correct uppercase selectors to lowercase" numArgs := lookupString numArgs. (numArgs < 0 or: [lookupString size < 2]) ifTrue: [^ OrderedCollection new: 0]. first := lookupString first. short := lookupString size - (lookupString size // 4 max: 3) max: 2. long := lookupString size + (lookupString size // 4 max: 3). "First assemble candidates for detailed scoring" candidates := OrderedCollection new. self allSymbolTablesDo: [:s | | ss | (((ss := s size) >= short "not too short" and: [ss <= long "not too long" or: [(s at: 1) = first]]) "well, any length OK if starts w/same letter" and: [s numArgs = numArgs]) "and numArgs is the same" ifTrue: [candidates add: s]]. "Then further prune these by correctAgainst:" best := lookupString correctAgainst: candidates. ((misspelled last ~~ $:) and: [misspelled size > 1]) ifTrue: [ binary := misspelled, ':'. "try for missing colon" Symbol hasInterned: binary ifTrue: [:him | best addFirst: him]]. ^ best! ! !Symbol class methodsFor: 'cleanup' stamp: 'StephaneDucasse 3/9/2010 22:17'! cleanUp "Flush caches" self compactSymbolTable.! ! !Symbol class methodsFor: 'stream creation' stamp: 'CamilloBruni 9/5/2011 15:35'! new: size streamContents: aBlock ^ (super new: size streamContents: aBlock) asSymbol! ! !Symbol class methodsFor: 'access' stamp: 'tween 9/13/2004 10:09'! thatStartsCaseSensitive: leadingCharacters skipping: skipSym "Same as thatStarts:skipping: but caseSensitive" | size firstMatch key | size := leadingCharacters size. size = 0 ifTrue: [^skipSym ifNil: [#''] ifNotNil: [nil]]. firstMatch := leadingCharacters at: 1. size > 1 ifTrue: [key := leadingCharacters copyFrom: 2 to: size]. self allSymbolTablesDo: [:each | each size >= size ifTrue: [ ((each at: 1) == firstMatch and: [key == nil or: [(each findString: key startingAt: 2 caseSensitive: true) = 2]]) ifTrue: [^each] ] ] after: skipSym. ^nil ! ! !Symbol class methodsFor: 'access' stamp: 'StephaneDucasse 5/28/2011 13:45'! selectorsContaining: aString "Answer a list of selectors that contain aString within them. Case-insensitive. Does return symbols that begin with a capital letter." | size selectorList ascii | selectorList := OrderedCollection new. (size := aString size) = 0 ifTrue: [^selectorList]. aString size = 1 ifTrue: [ ascii := aString first asciiValue. ascii < 128 ifTrue: [selectorList add: (OneCharacterSymbols at: ascii+1)] ]. (aString first isAlphaNumeric) ifFalse: [ aString size = 2 ifTrue: [Symbol hasInterned: aString ifTrue: [:s | selectorList add: s]]. ^selectorList ]. selectorList := selectorList copyFrom: 2 to: selectorList size. self allSymbolTablesDo: [:each | each size >= size ifTrue: [(each findSubstring: aString in: each startingAt: 1 matchTable: CaseInsensitiveOrder) > 0 ifTrue: [selectorList add: each]]]. ^selectorList reject: [:each | "reject non-selectors, but keep ones that begin with an uppercase" each numArgs < 0 and: [each asString withFirstCharacterDownshifted numArgs < 0]]. "Symbol selectorsContaining: 'scon'"! ! !Symbol class methodsFor: 'access' stamp: 'ar 4/10/2005 22:49'! allSymbols "Answer all interned symbols" ^Array streamContents:[:s| s nextPutAll: NewSymbols. s nextPutAll: OneCharacterSymbols. s nextPutAll: SymbolTable. ]. ! ! !Symbol class methodsFor: 'access' stamp: 'RAA 5/29/2001 14:35'! thatStarts: leadingCharacters skipping: skipSym "Answer a selector symbol that starts with leadingCharacters. Symbols beginning with a lower-case letter handled directly here. Ignore case after first char. If skipSym is not nil, it is a previous answer; start searching after it. If no symbols are found, answer nil. Used by Alt-q (Command-q) routines" | size firstMatch key | size := leadingCharacters size. size = 0 ifTrue: [^skipSym ifNil: [#''] ifNotNil: [nil]]. firstMatch := leadingCharacters at: 1. size > 1 ifTrue: [key := leadingCharacters copyFrom: 2 to: size]. self allSymbolTablesDo: [:each | each size >= size ifTrue: [ ((each at: 1) == firstMatch and: [key == nil or: [(each findString: key startingAt: 2 caseSensitive: false) = 2]]) ifTrue: [^each] ] ] after: skipSym. ^nil "Symbol thatStarts: 'sf' skipping: nil" "Symbol thatStarts: 'sf' skipping: #sfpGetFile:with:with:with:with:with:with:with:with:" "Symbol thatStarts: 'candidate' skipping: nil" ! ! !Symbol class methodsFor: '*Slot' stamp: 'MartinDias 8/7/2012 01:18'! pseudovariablesNames ^#('self' 'true' 'false' 'nil' 'thisContext' 'super')! ! !OrderedCollection methodsFor: '*GroupManager' stamp: 'BenjaminVanRyseghem 4/14/2012 12:08'! removeDuplicates | iterator | "Remove the copies of elements, but keep the same order" self ifEmpty: [ ^ self ]. iterator := 1. [ iterator <= self size ] whileTrue: [ | each newIndex | each := self at: iterator. [ newIndex := (self indexOf: each startingAt: iterator+1). newIndex > 0 ] whileTrue: [ self removeAt: newIndex ]. iterator := iterator + 1. ]! ! !OrderedCollection methodsFor: '*Fuel' stamp: 'MarianoMartinezPeck 7/26/2012 17:42'! fuelAccept: aGeneralMapper "Since we have subclasses of OrderedCollection that behave differently, we cannot use the visitSimpleCollection: for all of them." ^ (self class == OrderedCollection ) ifTrue: [ aGeneralMapper visitSimpleCollection: self ] ifFalse: [ super fuelAccept: aGeneralMapper ] ! ! !OrderedCollection methodsFor: 'adding'! add: newObject after: oldObject "Add the argument, newObject, as an element of the receiver. Put it in the sequence just succeeding oldObject. Answer newObject." | index | index := self find: oldObject. self insert: newObject before: index + 1. ^newObject! ! !OrderedCollection methodsFor: 'adding' stamp: 'ar 7/15/2008 23:05'! add: newObject beforeIndex: index "Add the argument, newObject, as an element of the receiver. Put it in the sequence just before index. Answer newObject." (index between: 1 and: self size+1) ifFalse:[^self errorSubscriptBounds: index]. self insert: newObject before: firstIndex + index - 1. ^ newObject! ! !OrderedCollection methodsFor: 'adding'! add: newObject ^self addLast: newObject! ! !OrderedCollection methodsFor: 'adding' stamp: 'CamilloBruni 4/12/2011 13:52'! add: newObject afterIndex: index "Add the argument, newObject, as an element of the receiver. Put it in the sequence just after index. Answer newObject." (index between: 0 and: self size) ifFalse:[^self errorSubscriptBounds: index]. self insert: newObject before: firstIndex + index. ^ newObject! ! !OrderedCollection methodsFor: 'adding' stamp: 'sma 5/12/2000 11:26'! addAll: aCollection "Add each element of aCollection at my end. Answer aCollection." ^ self addAllLast: aCollection! ! !OrderedCollection methodsFor: 'adding'! addAllFirst: anOrderedCollection "Add each element of anOrderedCollection at the beginning of the receiver. Answer anOrderedCollection." anOrderedCollection reverseDo: [:each | self addFirst: each]. ^anOrderedCollection! ! !OrderedCollection methodsFor: 'adding' stamp: 'StephaneDucasse 12/25/2009 12:13'! addAllLast: aCollection "Add each element of aCollection at the end of the receiver. Answer aCollection." aCollection do: [:each | self addLast: each]. ^aCollection! ! !OrderedCollection methodsFor: 'adding' stamp: 'sw 3/1/2001 11:03'! addAllFirstUnlessAlreadyPresent: anOrderedCollection "Add each element of anOrderedCollection at the beginning of the receiver, preserving the order, but do not add any items that are already in the receiver. Answer anOrderedCollection." anOrderedCollection reverseDo: [:each | (self includes: each) ifFalse: [self addFirst: each]]. ^ anOrderedCollection! ! !OrderedCollection methodsFor: 'adding'! addFirst: newObject "Add newObject to the beginning of the receiver. Answer newObject." firstIndex = 1 ifTrue: [self makeRoomAtFirst]. firstIndex := firstIndex - 1. array at: firstIndex put: newObject. ^ newObject! ! !OrderedCollection methodsFor: 'adding'! add: newObject before: oldObject "Add the argument, newObject, as an element of the receiver. Put it in the sequence just preceding oldObject. Answer newObject." | index | index := self find: oldObject. self insert: newObject before: index. ^newObject! ! !OrderedCollection methodsFor: 'adding' stamp: 'ajh 5/22/2003 12:03'! at: index ifAbsentPut: block "Return value at index, however, if value does not exist (nil or out of bounds) then add block's value at index (growing self if necessary)" | v | index <= self size ifTrue: [ ^ (v := self at: index) ifNotNil: [v] ifNil: [self at: index put: block value] ]. [self size < index] whileTrue: [self add: nil]. ^ self at: index put: block value! ! !OrderedCollection methodsFor: 'adding'! addLast: newObject "Add newObject to the end of the receiver. Answer newObject." lastIndex = array size ifTrue: [self makeRoomAtLast]. lastIndex := lastIndex + 1. array at: lastIndex put: newObject. ^ newObject! ! !OrderedCollection methodsFor: 'accessing' stamp: 'sma 5/12/2000 11:39'! size "Answer how many elements the receiver contains." ^ lastIndex - firstIndex + 1! ! !OrderedCollection methodsFor: 'accessing' stamp: 'sma 5/12/2000 11:42'! capacity "Answer the current capacity of the receiver." ^ array size! ! !OrderedCollection methodsFor: 'accessing' stamp: 'CamilloBruni 4/11/2011 15:39'! at: anInteger put: anObject "Put anObject at element index anInteger. at:put: cannot be used to append, front or back, to an ordered collection; it is used by a knowledgeable client to replace an element." self ensureBoundsFrom: anInteger to: anInteger. ^array at: anInteger + firstIndex - 1 put: anObject! ! !OrderedCollection methodsFor: 'accessing' stamp: 'CamilloBruni 4/11/2011 15:36'! at: anInteger "Answer my element at index anInteger. at: is used by a knowledgeable client to access an existing element" self ensureBoundsFrom: anInteger to: anInteger. ^ array at: anInteger + firstIndex - 1! ! !OrderedCollection methodsFor: 'removing'! remove: oldObject ifAbsent: absentBlock | index | index := firstIndex. [index <= lastIndex] whileTrue: [oldObject = (array at: index) ifTrue: [self removeIndex: index. ^ oldObject] ifFalse: [index := index + 1]]. ^ absentBlock value! ! !OrderedCollection methodsFor: 'removing'! removeFirst "Remove the first element of the receiver and answer it. If the receiver is empty, create an error notification." | firstObject | self emptyCheck. firstObject := array at: firstIndex. array at: firstIndex put: nil. firstIndex := firstIndex + 1. ^ firstObject! ! !OrderedCollection methodsFor: 'removing' stamp: 'ar 5/22/2000 12:19'! removeAt: index | removed | removed := self at: index. self removeIndex: index + firstIndex - 1. ^removed! ! !OrderedCollection methodsFor: 'removing' stamp: 'cmm 10/25/2010 22:26'! removeAll "remove all the elements from this collection. Keep same amount of storage" self setCollection: (self class arrayType new: array size)! ! !OrderedCollection methodsFor: 'removing'! removeLast "Remove the last element of the receiver and answer it. If the receiver is empty, create an error notification." | lastObject | self emptyCheck. lastObject := array at: lastIndex. array at: lastIndex put: nil. lastIndex := lastIndex - 1. ^ lastObject! ! !OrderedCollection methodsFor: 'removing' stamp: 'StephaneDucasse 10/18/2010 14:51'! removeAllSuchThat: aBlock "Remove each element of the receiver for which aBlock evaluates to true. The method in Collection is O(N^2), this is O(N)." | n | n := firstIndex. firstIndex to: lastIndex do: [:index | (aBlock value: (array at: index)) ifFalse: [ array at: n put: (array at: index). n := n + 1]]. array from: n to: lastIndex put: nil. lastIndex := n - 1! ! !OrderedCollection methodsFor: 'removing' stamp: 'cmm 10/25/2010 22:26'! removeFirst: n "Remove first n object into an array" | list | list := self class arrayType new: n. 1 to: n do: [ : i | list at: i put: self removeFirst ]. ^ list! ! !OrderedCollection methodsFor: 'removing' stamp: 'ul 2/24/2011 14:33'! reset "Quickly remove all elements. The objects will be still referenced, but will not be accessible." self resetTo: 1! ! !OrderedCollection methodsFor: 'removing' stamp: 'cmm 10/25/2010 22:26'! removeLast: n "Remove last n object into an array with last in last position" | list | list := self class arrayType new: n. n to: 1 by: -1 do: [ : i | list at: i put: self removeLast ]. ^ list! ! !OrderedCollection methodsFor: 'enumerating' stamp: 'CamilloBruni 3/22/2013 23:51'! reject: rejectBlock thenCollect: collectBlock " Optimized version of Collection>>#reject:thenCollect: " | newCollection | newCollection := self copyEmpty. firstIndex to: lastIndex do: [ :index | | element | element := array at: index. (rejectBlock value: element) ifFalse: [ newCollection addLast: (collectBlock value: element) ]]. ^ newCollection! ! !OrderedCollection methodsFor: 'enumerating' stamp: 'CamilloBruni 3/22/2013 23:51'! select: selectBlock "Optimized version of Collection>>#select: " | newCollection element | newCollection := self copyEmpty. firstIndex to: lastIndex do: [ :index | (selectBlock value: (element := array at: index)) ifTrue: [ newCollection addLast: element ]]. ^ newCollection! ! !OrderedCollection methodsFor: 'enumerating'! reverseDo: aBlock "Override the superclass for performance reasons." | index | index := lastIndex. [index >= firstIndex] whileTrue: [aBlock value: (array at: index). index := index - 1]! ! !OrderedCollection methodsFor: 'enumerating' stamp: 'di 8/31/1999 13:13'! with: otherCollection collect: twoArgBlock "Collect and return the result of evaluating twoArgBlock with corresponding elements from this collection and otherCollection." | result | otherCollection size = self size ifFalse: [self error: 'otherCollection must be the same size']. result := self species new: self size. 1 to: self size do: [:index | result addLast: (twoArgBlock value: (self at: index) value: (otherCollection at: index))]. ^ result! ! !OrderedCollection methodsFor: 'enumerating' stamp: 'CamilloBruni 3/22/2013 23:52'! reject: rejectBlock "Optimized version of Collection>>#reject:" | newCollection element | newCollection := self copyEmpty. firstIndex to: lastIndex do: [ :index | (rejectBlock value: (element := array at: index)) ifFalse: [ newCollection addLast: element ]]. ^ newCollection! ! !OrderedCollection methodsFor: 'enumerating' stamp: 'CamilloBruni 3/22/2013 23:52'! collect: collectBlock thenSelect: selectBlock "Optimized version Collection>>#collect:thenSelect:" | newCollection newElement | newCollection := self copyEmpty. firstIndex to: lastIndex do: [ :index | newElement := collectBlock value: (array at: index). (selectBlock value: newElement) ifTrue: [ newCollection addLast: newElement ]]. ^ newCollection! ! !OrderedCollection methodsFor: 'enumerating' stamp: 'bf 5/16/2000 16:30'! withIndexCollect: elementAndIndexBlock "Just like with:collect: except that the iteration index supplies the second argument to the block. Override superclass in order to use addLast:, not at:put:." | newCollection | newCollection := self species new: self size. firstIndex to: lastIndex do: [:index | newCollection addLast: (elementAndIndexBlock value: (array at: index) value: index - firstIndex + 1)]. ^ newCollection! ! !OrderedCollection methodsFor: 'enumerating' stamp: 'sma 2/5/2000 15:22'! collect: aBlock "Evaluate aBlock with each of my elements as the argument. Collect the resulting values into a collection that is like me. Answer the new collection. Override superclass in order to use addLast:, not at:put:." | newCollection | newCollection := self species new: self size. firstIndex to: lastIndex do: [:index | newCollection addLast: (aBlock value: (array at: index))]. ^ newCollection! ! !OrderedCollection methodsFor: 'enumerating'! do: aBlock "Override the superclass for performance reasons." | index | index := firstIndex. [index <= lastIndex] whileTrue: [aBlock value: (array at: index). index := index + 1]! ! !OrderedCollection methodsFor: 'enumerating' stamp: 'CamilloBruni 3/22/2013 23:52'! select: selectBlock thenCollect: collectBlock " Optimized version Collection>>#select:thenCollect: " | newCollection element | newCollection := self copyEmpty. firstIndex to: lastIndex do: [ :index | element := array at: index. (selectBlock value: element) ifTrue: [ newCollection addLast: (collectBlock value: element) ]]. ^ newCollection! ! !OrderedCollection methodsFor: 'enumerating' stamp: 'CamilloBruni 4/11/2011 15:34'! collect: aBlock from: fromIndex to: toIndex "Override superclass in order to use addLast:, not at:put:." | result | self ensureBoundsFrom: fromIndex to: toIndex. result := self species new: toIndex - fromIndex + 1. firstIndex + fromIndex - 1 to: firstIndex + toIndex - 1 do: [:index | result addLast: (aBlock value: (array at: index))]. ^ result ! ! !OrderedCollection methodsFor: 'enumerating' stamp: 'pmm 3/13/2010 11:33'! sort: aSortBlock "Sort this array using aSortBlock. The block should take two arguments and return true if the first element should preceed the second one." self size <= 1 ifTrue: [^ self]. "nothing to do" array mergeSortFrom: firstIndex to: lastIndex src: array shallowCopy dst: array by: aSortBlock! ! !OrderedCollection methodsFor: 'testing' stamp: 'md 8/13/2008 21:40'! hasContentsInExplorer ^self notEmpty! ! !OrderedCollection methodsFor: 'converting' stamp: 'stephane.ducasse 8/8/2009 10:48'! asArray ^ (Array new: self size) replaceFrom: 1 to: self size with: array startingAt: firstIndex.! ! !OrderedCollection methodsFor: 'splitjoin' stamp: 'onierstrasz 4/12/2009 19:44'! join: aCollection | result | result := self class new. aCollection do: [:each | each appendTo: result] separatedBy: [self appendTo: result]. ^ result! ! !OrderedCollection methodsFor: 'private'! collector "Private" ^ array! ! !OrderedCollection methodsFor: 'private'! errorConditionNotSatisfied self error: 'no element satisfies condition'! ! !OrderedCollection methodsFor: 'private' stamp: 'MarianoMartinezPeck 8/3/2011 14:37'! makeRoomAtFirst "Make some empty slots at the front of the array. If we have more than 50% free space, then just move the elements, so that the first 50% of the slots are free, otherwise add new free slots to the front by growing. Precondition: firstIndex = 1" | tally newFirstIndex newLastIndex | tally := self size. tally * 2 >= array size ifTrue: [ ^self growAtFirst ]. tally = 0 ifTrue: [ ^self resetTo: array size + 1 ]. newFirstIndex := array size // 2 + 1. newLastIndex := newFirstIndex - firstIndex + lastIndex. 0 to: tally - 1 do: [ :offset | array at: newLastIndex - offset put: (array at: lastIndex - offset) ]. array from: firstIndex to: newFirstIndex - 1 put: nil. firstIndex := newFirstIndex. lastIndex := newLastIndex! ! !OrderedCollection methodsFor: 'private' stamp: 'CamilloBruni 4/11/2011 15:34'! ensureBoundsFrom: fromIndex to: toIndex (fromIndex < 1) ifTrue: [^self errorSubscriptBounds: fromIndex]. (toIndex + firstIndex - 1 > lastIndex) ifTrue: [^self errorSubscriptBounds: toIndex].! ! !OrderedCollection methodsFor: 'private' stamp: 'cmm 10/25/2010 22:27'! growAtFirst "Add new empty slots to the front of array, while keeping the empty slots at the end." | newArray newFirstIndex newLastIndex | newArray := self class arrayType new: (array size * 2 max: 1). newFirstIndex := newArray size - array size + firstIndex. newLastIndex := newFirstIndex + lastIndex - firstIndex. newArray replaceFrom: newFirstIndex to: newLastIndex with: array startingAt: firstIndex. array := newArray. firstIndex := newFirstIndex. lastIndex := newLastIndex! ! !OrderedCollection methodsFor: 'private' stamp: 'BG 1/9/2004 12:28'! removeIndex: removedIndex " removedIndex is an index in the range firstIndex .. lastIndex, such an index is not known from outside the collection. Never use this method in your code, it is meant for private use by OrderedCollection only. The method for public use is: #removeAt: " array replaceFrom: removedIndex to: lastIndex - 1 with: array startingAt: removedIndex+1. array at: lastIndex put: nil. lastIndex := lastIndex - 1.! ! !OrderedCollection methodsFor: 'private' stamp: 'MarianoMartinezPeck 8/3/2011 14:37'! makeRoomAtLast "Make some empty slots at the end of the array. If we have more than 50% free space, then just move the elements, so that the last 50% of the slots are free, otherwise add new free slots to the end by growing. Precondition: lastIndex = array size" | tally newFirstIndex newLastIndex | tally := self size. tally * 2 >= lastIndex ifTrue: [ ^self growAtLast ]. tally = 0 ifTrue: [ ^self resetTo: 1 ]. newLastIndex := lastIndex // 2. newFirstIndex := newLastIndex - lastIndex + firstIndex. array replaceFrom: newFirstIndex to: newLastIndex with: array startingAt: firstIndex. array from: newLastIndex + 1 to: lastIndex put: nil. firstIndex := newFirstIndex. lastIndex := newLastIndex! ! !OrderedCollection methodsFor: 'private' stamp: 'BG 1/9/2004 12:26'! find: oldObject " This method answers an index in the range firstIndex .. lastIndex, which is meant for internal use only. Never use this method in your code, the methods for public use are: #indexOf: #indexOf:ifAbsent: " | index | index := firstIndex. [index <= lastIndex] whileTrue: [(array at: index) = oldObject ifTrue: [^ index]. index := index + 1]. self errorNotFound: oldObject! ! !OrderedCollection methodsFor: 'private' stamp: 'cmm 10/25/2010 22:27'! growAtLast "Add new empty slots to the end of array, while keeping the empty slots at the front." | newArray | newArray := self class arrayType new: (array size * 2 max: 1). newArray replaceFrom: firstIndex to: lastIndex with: array startingAt: firstIndex. array := newArray! ! !OrderedCollection methodsFor: 'private' stamp: 'ar 4/16/1999 07:59'! resetTo: index firstIndex := index. lastIndex := firstIndex - 1! ! !OrderedCollection methodsFor: 'private' stamp: 'BG 1/9/2004 12:29'! insert: anObject before: spot " spot is an index in the range firstIndex .. lastIndex, such an index is not known from outside the collection. Never use this method in your code, it is meant for private use by OrderedCollection only. The methods for use are: #add:before: to insert an object before another object #add:beforeIndex: to insert an object before a given position. " | "index" delta spotIndex| spotIndex := spot. delta := spotIndex - firstIndex. firstIndex = 1 ifTrue: [self makeRoomAtFirst. spotIndex := firstIndex + delta]. firstIndex := firstIndex - 1. array replaceFrom: firstIndex to: spotIndex - 2 with: array startingAt: firstIndex + 1. array at: spotIndex - 1 put: anObject. " index := firstIndex := firstIndex - 1. [index < (spotIndex - 1)] whileTrue: [array at: index put: (array at: index + 1). index := index + 1]. array at: index put: anObject." ^ anObject! ! !OrderedCollection methodsFor: 'private' stamp: 'di 11/14/97 12:54'! setCollection: anArray array := anArray. self reset! ! !OrderedCollection methodsFor: 'private' stamp: 'apb 10/15/2000 18:10'! setContents: anArray array := anArray. firstIndex := 1. lastIndex := array size.! ! !OrderedCollection methodsFor: 'copying'! copyEmpty "Answer a copy of the receiver that contains no elements." ^self species new! ! !OrderedCollection methodsFor: 'copying' stamp: 'sw 1/26/96'! reversed "Answer a copy of the receiver with element order reversed. " | newCol | newCol := self species new. self reverseDo: [:elem | newCol addLast: elem]. ^ newCol "#(2 3 4 'fred') reversed"! ! !OrderedCollection methodsFor: 'copying'! copyReplaceFrom: start to: stop with: replacementCollection "Answer a copy of the receiver with replacementCollection's elements in place of the receiver's start'th to stop'th elements. This does not expect a 1-1 map from replacementCollection to the start to stop elements, so it will do an insert or append." | newOrderedCollection delta startIndex stopIndex | "if start is less than 1, ignore stop and assume this is inserting at the front. if start greater than self size, ignore stop and assume this is appending. otherwise, it is replacing part of me and start and stop have to be within my bounds. " delta := 0. startIndex := start. stopIndex := stop. start < 1 ifTrue: [startIndex := stopIndex := 0] ifFalse: [startIndex > self size ifTrue: [startIndex := stopIndex := self size + 1] ifFalse: [(stopIndex < (startIndex - 1) or: [stopIndex > self size]) ifTrue: [self errorOutOfBounds]. delta := stopIndex - startIndex + 1]]. newOrderedCollection := self species new: self size + replacementCollection size - delta. 1 to: startIndex - 1 do: [:index | newOrderedCollection add: (self at: index)]. 1 to: replacementCollection size do: [:index | newOrderedCollection add: (replacementCollection at: index)]. stopIndex + 1 to: self size do: [:index | newOrderedCollection add: (self at: index)]. ^newOrderedCollection! ! !OrderedCollection methodsFor: 'copying'! copyWith: newElement "Answer a copy of the receiver that is 1 bigger than the receiver and includes the argument, newElement, at the end." | newCollection | newCollection := self copy. newCollection add: newElement. ^newCollection! ! !OrderedCollection methodsFor: 'copying' stamp: 'nice 10/5/2009 08:50'! postCopy array := array copy! ! !OrderedCollection methodsFor: 'copying' stamp: 'nice 10/5/2009 10:18'! copyFrom: startIndex to: endIndex "Answer a copy of the receiver that contains elements from position startIndex to endIndex." ^self shallowCopy postCopyFrom: startIndex to: endIndex! ! !OrderedCollection methodsFor: 'copying' stamp: 'nice 5/28/2008 21:02'! postCopyFrom: startIndex to: endIndex "finish copying the array in a certain range." endIndex < startIndex ifFalse: [ "Because actual size of the array may be greater than used size, postCopyFrom:to: may fail to fail and answer an incorrect result if this sanity check were not applied" (startIndex between: 1 and: self size) ifFalse: [^self error: 'startIndex is out of bounds']. (endIndex between: 1 and: self size) ifFalse: [^self error: 'endIndex is out of bounds']]. "Add a protection that lacks in Array>>postcopy" array := array copyFrom: startIndex + firstIndex - 1 to: (endIndex max: startIndex - 1) + firstIndex - 1. firstIndex := 1. lastIndex := array size! ! !OrderedCollection class methodsFor: 'instance creation' stamp: 'cmm 10/25/2010 22:28'! new: anInteger withAll: anObject ^ self basicNew setContents: (self arrayType new: anInteger withAll: anObject)! ! !OrderedCollection class methodsFor: 'instance creation' stamp: 'cmm 10/25/2010 22:27'! new: anInteger ^ self basicNew setCollection: (self arrayType new: anInteger)! ! !OrderedCollection class methodsFor: 'instance creation' stamp: 'sma 5/12/2000 17:41'! new ^ self new: 10! ! !OrderedCollection class methodsFor: 'instance creation' stamp: 'apb 10/15/2000 22:02'! ofSize: n "Create a new collection of size n with nil as its elements. This method exists because OrderedCollection new: n creates an empty collection, not one of size n." | collection | collection := self new: n. collection setContents: (collection collector). ^ collection ! ! !OrderedCollection class methodsFor: 'instance creation'! newFrom: aCollection "Answer an instance of me containing the same elements as aCollection." | newCollection | newCollection := self new: aCollection size. newCollection addAll: aCollection. ^newCollection " OrderedCollection newFrom: {1. 2. 3} {1. 2. 3} as: OrderedCollection {4. 2. 7} as: SortedCollection "! ! !OrderedCollection class methodsFor: 'private' stamp: 'cmm 10/25/2010 22:26'! arrayType ^ Array! ! !OrderedCollection class methodsFor: 'accessing' stamp: 'CamilloBruni 9/5/2011 15:38'! streamSpecies ^ Array! ! !OrderedCollection class methodsFor: 'stream creation' stamp: 'CamilloBruni 9/5/2011 15:48'! new: size streamContents: aBlock ^ self withAll: (super new: size streamContents: aBlock)! ! !Stream methodsFor: 'accessing' stamp: 'nk 4/29/2004 10:40'! openReadOnly ^self! ! !Stream methodsFor: 'accessing' stamp: 'HenrikSperreJohansen 8/17/2012 11:30'! basicNext: anAmount putAll: aCollection startingAt: startIndex ^ self next: anAmount putAll: aCollection startingAt: startIndex. ! ! !Stream methodsFor: 'accessing' stamp: 'yo 8/30/2002 17:13'! basicNextPutAll: aCollection ^ self nextPutAll: aCollection. ! ! !Stream methodsFor: 'accessing'! nextMatchAll: aColl "Answer true if next N objects are the ones in aColl, else false. Advance stream of true, leave as was if false." | save | save := self position. aColl do: [:each | (self next) = each ifFalse: [ self position: save. ^ false] ]. ^ true! ! !Stream methodsFor: 'accessing' stamp: 'yo 8/30/2002 17:13'! basicNextPut: anObject ^ self nextPut: anObject! ! !Stream methodsFor: 'accessing' stamp: 'HenrikSperreJohansen 8/17/2012 11:30'! next: anInteger putAll: aCollection startingAt: startIndex "Store the next anInteger elements from the given collection." (startIndex = 1 and:[anInteger = aCollection size]) ifTrue:[^self nextPutAll: aCollection]. ^self nextPutAll: (aCollection copyFrom: startIndex to: startIndex+anInteger-1)! ! !Stream methodsFor: 'accessing' stamp: 'MarianoMartinezPeck 8/24/2012 15:30'! upToEnd "answer the remaining elements in the string" | elements | elements := OrderedCollection new. [ self atEnd ] whileFalse: [ elements add: self next ]. ^elements! ! !Stream methodsFor: 'accessing'! next: anInteger put: anObject "Make anObject be the next anInteger number of objects accessible by the receiver. Answer anObject." anInteger timesRepeat: [self nextPut: anObject]. ^anObject! ! !Stream methodsFor: 'accessing' stamp: 'MarianoMartinezPeck 8/24/2012 15:59'! next "Answer the next object accessible by the receiver." self subclassResponsibility ! ! !Stream methodsFor: 'accessing' stamp: 'MarianoMartinezPeck 8/24/2012 15:30'! next: anInteger "Answer the next anInteger number of objects accessible by the receiver." | aCollection | aCollection := OrderedCollection new. anInteger timesRepeat: [aCollection addLast: self next]. ^aCollection! ! !Stream methodsFor: 'accessing' stamp: 'MarianoMartinezPeck 8/24/2012 15:59'! flush "Do nothing by default" ! ! !Stream methodsFor: 'accessing' stamp: 'MarianoMartinezPeck 8/24/2012 15:59'! nextPut: anObject "Insert the argument, anObject, as the next object accessible by the receiver. Answer anObject." self subclassResponsibility ! ! !Stream methodsFor: 'accessing' stamp: 'MarianoMartinezPeck 8/24/2012 15:59'! binary "do nothing" ^self ! ! !Stream methodsFor: 'accessing' stamp: 'yo 8/30/2002 17:13'! basicNext ^ self next. ! ! !Stream methodsFor: 'accessing'! contents "Answer all of the contents of the receiver." self subclassResponsibility! ! !Stream methodsFor: 'accessing' stamp: 'MarianoMartinezPeck 8/24/2012 15:29'! nextPutAll: aCollection "Append the elements of aCollection to the sequence of objects accessible by the receiver. Answer aCollection." aCollection do: [:v | self nextPut: v]. ^aCollection! ! !Stream methodsFor: 'accessing' stamp: 'nk 4/29/2004 10:41'! readOnly ^self! ! !Stream methodsFor: 'accessing' stamp: 'nk 4/29/2004 10:38'! localName ^'a stream'! ! !Stream methodsFor: 'accessing'! nextMatchFor: anObject "Gobble the next object and answer whether it is equal to the argument, anObject." ^anObject = self next! ! !Stream methodsFor: 'filter streaming' stamp: 'MPW 1/1/1901 00:48'! write:encodedObject ^encodedObject putOn:self. ! ! !Stream methodsFor: '*Monticello' stamp: 'cwp 8/9/2003 12:02'! isMessageStream ^ false! ! !Stream methodsFor: 'printing' stamp: 'sma 6/1/2000 09:56'! print: anObject "Have anObject print itself on the receiver." anObject printOn: self! ! !Stream methodsFor: 'enumerating'! do: aBlock "Evaluate aBlock for each of the objects accessible by receiver." [self atEnd] whileFalse: [aBlock value: self next]! ! !Stream methodsFor: 'file open/close' stamp: 'MarianoMartinezPeck 8/24/2012 15:59'! close "Presumably sets the status of the receiver to be closed. This message does nothing at this level, but is included for FileStream compatibility." ^self ! ! !Stream methodsFor: 'readability' stamp: 'kph 9/27/2007 21:53'! << items items putOn: self. ^ self! ! !Stream methodsFor: 'testing' stamp: 'MarcusDenker 7/15/2012 15:43'! isBinary ^false! ! !Stream methodsFor: 'testing' stamp: 'ar 12/23/1999 15:43'! isStream "Return true if the receiver responds to the stream protocol" ^true! ! !Stream methodsFor: 'testing' stamp: 'MarianoMartinezPeck 8/24/2012 15:59'! atEnd "Answer whether the receiver can access any more objects." self subclassResponsibility ! ! !Stream methodsFor: 'testing' stamp: 'ab 8/28/2003 18:30'! closed ^ false! ! !Stream methodsFor: 'testing' stamp: 'ClementBera 9/30/2013 10:56'! nextWordsPutAll: aCollection "Write the argument a word-like object in big endian format on the receiver. May be used to write other than plain word-like objects (such as ColorArray)." (aCollection class isPointers or: [ aCollection class isWords not ]) ifTrue: [ ^ self error: aCollection class name,' is not word-like']. 1 to: aCollection basicSize do: [ :i | self nextNumber: 4 put: (aCollection basicAt: i) ]. ^ aCollection! ! !Stream methodsFor: '*Fuel' stamp: 'MartinDias 8/13/2011 14:29'! nextBytesPutAll: aCollection "Append the bytes of aCollection to the sequence of bytes accessible by the receiver. Answer aCollection." ^self nextPutAll: aCollection! ! !Stream class methodsFor: 'instance creation' stamp: 'MarianoMartinezPeck 8/24/2012 15:59'! new self error: 'Streams are created with on: and with:'! ! Symbol initialize! Collection initialize! \ No newline at end of file diff --git a/samples/Text/Visual_Battlers.rb b/samples/Text/Visual_Battlers.rb deleted file mode 100644 index 74bb0f2c..00000000 --- a/samples/Text/Visual_Battlers.rb +++ /dev/null @@ -1,703 +0,0 @@ -#============================================================================== -# -# ¥ Yanfly Engine Ace - Visual Battlers v1.01 -# -- Last Updated: 2012.07.24 -# -- Level: Easy -# -- Requires: n/a -# -# ¥ Modified by: -# -- Yami -# -- Kread-Ex -# -- Archeia_Nessiah -#============================================================================== - -$imported = {} if $imported.nil? -$imported["YEA-VisualBattlers"] = true - -#============================================================================== -# ¥ Updates -# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -# 2012.12.18 - Added preset views and able to change direction in-game. -# 2012.07.24 - Finished Script. -# 2012.01.05 - Started Script. -# -#============================================================================== -# ¥ Introduction -# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -# This script provides a visual for all actors by default charsets. The actions -# and movements are alike Final Fantasy 1, only move forward and backward when -# start and finish actions. -# -#============================================================================== -# ¥ Instructions -# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -# To change the player direction in-game, use the snippet below in a script -# call: -# -# $game_system.party_direction = n -# -# To install this script, open up your script editor and copy/paste this script -# to an open slot below ¥ Materials but above ¥ Main. Remember to save. -# -#============================================================================== -# ¥ Compatibility -# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -# This script is made strictly for RPG Maker VX Ace. It is highly unlikely that -# it will run with RPG Maker VX without adjusting. -# -#============================================================================== - -module YEA - module VISUAL_BATTLERS - - #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- - # - Party Location Setting - - #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- - # These settings are adjusted for Party Location. Each Actor will have - # coordinates calculated by below formula. There are two samples coordinates - # below, change PARTY_DIRECTION to the base index you want to use. - #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- - PARTY_DIRECTION = 6 # This direction is opposite from actual direction. - - PARTY_LOCATION_BASE_COORDINATES ={ - # Index => [base_x, base_y, mod_x, mod_y], - 2 => [ 250, 290, 40, 0], #UP - 4 => [ 150, 280, 20, -20], #LEFT - 3 => [ 460, 280, 30, -10], #RIGHT - 6 => [ 460, 230, 20, 20], #DEFAULT RIGHT - 8 => [ 260, 230, 40, 0], #DOWN - } # Do not remove this. - - PARTY_LOCATION_FORMULA_X = "base_x + index * mod_x" - PARTY_LOCATION_FORMULA_Y = "base_y + index * mod_y" - - end # VISUAL_BATTLERS -end # YEA - -#============================================================================== -# ¥ Editting anything past this point may potentially result in causing -# computer damage, incontinence, explosion of user's head, coma, death, and/or -# halitosis so edit at your own risk. -#============================================================================== - -#============================================================================== -# ? ¥ Direction -#============================================================================== - -module Direction - - #-------------------------------------------------------------------------- - # self.correct - #-------------------------------------------------------------------------- - def self.correct(direction) - case direction - when 1; return 4 - when 3; return 6 - when 7; return 4 - when 9; return 6 - else; return direction - end - end - - #-------------------------------------------------------------------------- - # self.opposite - #-------------------------------------------------------------------------- - def self.opposite(direction) - case direction - when 1; return 6 - when 2; return 8 - when 3; return 4 - when 4; return 6 - when 6; return 4 - when 7; return 6 - when 8; return 2 - when 9; return 4 - else; return direction - end - end - -end # Direction - -#============================================================================== -# ? ¥ Game_System -#============================================================================== - -class Game_System; attr_accessor :party_direction; end - -#============================================================================== -# ? ¥ Game_BattleCharacter -#============================================================================== - -class Game_BattleCharacter < Game_Character - - #-------------------------------------------------------------------------- - # initialize - #-------------------------------------------------------------------------- - def initialize(actor) - super() - setup_actor(actor) - @move_x_rate = 0 - @move_y_rate = 0 - end - - #-------------------------------------------------------------------------- - # setup_actor - #-------------------------------------------------------------------------- - def setup_actor(actor) - @actor = actor - @step_anime = true - set_graphic(@actor.character_name, @actor.character_index) - setup_coordinates - dr = $game_system.party_direction || YEA::VISUAL_BATTLERS::PARTY_DIRECTION - direction = Direction.opposite(dr) - set_direction(Direction.correct(direction)) - end - - #-------------------------------------------------------------------------- - # sprite= - #-------------------------------------------------------------------------- - def sprite=(sprite) - @sprite = sprite - end - - #-------------------------------------------------------------------------- - # setup_coordinates - #-------------------------------------------------------------------------- - def setup_coordinates - location = ($game_system.party_direction || - YEA::VISUAL_BATTLERS::PARTY_DIRECTION) - base_x = YEA::VISUAL_BATTLERS::PARTY_LOCATION_BASE_COORDINATES[location][0] - base_y = YEA::VISUAL_BATTLERS::PARTY_LOCATION_BASE_COORDINATES[location][1] - mod_x = YEA::VISUAL_BATTLERS::PARTY_LOCATION_BASE_COORDINATES[location][2] - mod_y = YEA::VISUAL_BATTLERS::PARTY_LOCATION_BASE_COORDINATES[location][3] - @actor.screen_x = eval(YEA::VISUAL_BATTLERS::PARTY_LOCATION_FORMULA_X) - @actor.screen_y = eval(YEA::VISUAL_BATTLERS::PARTY_LOCATION_FORMULA_Y) - @actor.origin_x = @actor.screen_x - @actor.origin_y = @actor.screen_y - @actor.create_move_to(screen_x, screen_y, 1) - end - - #-------------------------------------------------------------------------- - # index - #-------------------------------------------------------------------------- - def index - return @actor.index - end - - #-------------------------------------------------------------------------- - # screen_x - #-------------------------------------------------------------------------- - def screen_x - return @actor.screen_x - end - - #-------------------------------------------------------------------------- - # screen_y - #-------------------------------------------------------------------------- - def screen_y - return @actor.screen_y - end - - #-------------------------------------------------------------------------- - # screen_z - #-------------------------------------------------------------------------- - def screen_z - return @actor.screen_z - end - -end # Game_BattleCharacter - -#============================================================================== -# ? ¥ Game_Battler -#============================================================================== - -class Game_Battler < Game_BattlerBase - - #-------------------------------------------------------------------------- - # public instance variables - #-------------------------------------------------------------------------- - attr_accessor :moved_back - attr_accessor :origin_x - attr_accessor :origin_y - attr_accessor :screen_x - attr_accessor :screen_y - attr_accessor :started_turn - - #-------------------------------------------------------------------------- - # alias method: execute_damage - #-------------------------------------------------------------------------- - alias game_battler_execute_damage_vb execute_damage - def execute_damage(user) - game_battler_execute_damage_vb(user) - if @result.hp_damage > 0 - move_backward(24, 6) unless @moved_back - @moved_back = true - end - end - - #-------------------------------------------------------------------------- - # face_opposing_party - #-------------------------------------------------------------------------- - def face_opposing_party - direction = ($game_system.party_direction || - YEA::VISUAL_BATTLERS::PARTY_DIRECTION) - character.set_direction(Direction.correct(direction)) rescue 0 - end - - #-------------------------------------------------------------------------- - # new method: face_coordinate - #-------------------------------------------------------------------------- - def face_coordinate(destination_x, destination_y) - x1 = Integer(@screen_x) - x2 = Integer(destination_x) - y1 = Graphics.height - Integer(@screen_y) - y2 = Graphics.height - Integer(destination_y) - return if x1 == x2 and y1 == y2 - #--- - angle = Integer(Math.atan2((y2-y1),(x2-x1)) * 1800 / Math::PI) - if (0..225) === angle or (-225..0) === angle - direction = 6 - elsif (226..675) === angle - direction = 9 - elsif (676..1125) === angle - direction = 8 - elsif (1126..1575) === angle - direction = 7 - elsif (1576..1800) === angle or (-1800..-1576) === angle - direction = 4 - elsif (-1575..-1126) === angle - direction = 1 - elsif (-1125..-676) === angle - direction = 2 - elsif (-675..-226) === angle - direction = 3 - end - #--- - character.set_direction(Direction.correct(direction)) rescue 0 - end - - #-------------------------------------------------------------------------- - # create_move_to - #-------------------------------------------------------------------------- - def create_move_to(destination_x, destination_y, frames = 12) - @destination_x = destination_x - @destination_y = destination_y - frames = [frames, 1].max - @move_x_rate = [(@screen_x - @destination_x).abs / frames, 2].max - @move_y_rate = [(@screen_y - @destination_y).abs / frames, 2].max - end - - #-------------------------------------------------------------------------- - # update_move_to - #-------------------------------------------------------------------------- - def update_move_to - @move_x_rate = 0 if @screen_x == @destination_x || @move_x_rate.nil? - @move_y_rate = 0 if @screen_y == @destination_y || @move_y_rate.nil? - value = [(@screen_x - @destination_x).abs, @move_x_rate].min - @screen_x += (@destination_x > @screen_x) ? value : -value - value = [(@screen_y - @destination_y).abs, @move_y_rate].min - @screen_y += (@destination_y > @screen_y) ? value : -value - end - - #-------------------------------------------------------------------------- - # move_forward - #-------------------------------------------------------------------------- - def move_forward(distance = 24, frames = 12) - direction = forward_direction - move_direction(direction, distance, frames) - end - - #-------------------------------------------------------------------------- - # move_backward - #-------------------------------------------------------------------------- - def move_backward(distance = 24, frames = 12) - direction = Direction.opposite(forward_direction) - move_direction(direction, distance, frames) - end - - #-------------------------------------------------------------------------- - # move_direction - #-------------------------------------------------------------------------- - def move_direction(direction, distance = 24, frames = 12) - case direction - when 1; move_x = distance / -2; move_y = distance / 2 - when 2; move_x = distance * 0; move_y = distance * 1 - when 3; move_x = distance / -2; move_y = distance / 2 - when 4; move_x = distance * -1; move_y = distance * 0 - when 6; move_x = distance * 1; move_y = distance * 0 - when 7; move_x = distance / -2; move_y = distance / -2 - when 8; move_x = distance * 0; move_y = distance * -1 - when 9; move_x = distance / 2; move_y = distance / -2 - else; return - end - destination_x = @screen_x + move_x - destination_y = @screen_y + move_y - create_move_to(destination_x, destination_y, frames) - end - - #-------------------------------------------------------------------------- - # forward_direction - #-------------------------------------------------------------------------- - def forward_direction - return ($game_system.party_direction || - YEA::VISUAL_BATTLERS::PARTY_DIRECTION) - end - - #-------------------------------------------------------------------------- - # move_origin - #-------------------------------------------------------------------------- - def move_origin - create_move_to(@origin_x, @origin_y) - face_coordinate(@origin_x, @origin_y) - @moved_back = false - end - - #-------------------------------------------------------------------------- - # moving? - #-------------------------------------------------------------------------- - def moving? - return false if dead? || !exist? - return @move_x_rate != 0 || @move_y_rate != 0 - end - -end # Game_Battler - -#============================================================================== -# ? ¥ Game_Actor -#============================================================================== - -class Game_Actor < Game_Battler - - #-------------------------------------------------------------------------- - # overwrite method: use_sprite? - #-------------------------------------------------------------------------- - def use_sprite? - return true - end - - #-------------------------------------------------------------------------- - # new method: screen_x - #-------------------------------------------------------------------------- - def screen_x - return @screen_x rescue 0 - end - - #-------------------------------------------------------------------------- - # new method: screen_y - #-------------------------------------------------------------------------- - def screen_y - return @screen_y rescue 0 - end - - #-------------------------------------------------------------------------- - # new method: screen_z - #-------------------------------------------------------------------------- - def screen_z - return 100 - end - - #-------------------------------------------------------------------------- - # new method: sprite - #-------------------------------------------------------------------------- - def sprite - index = $game_party.battle_members.index(self) - return SceneManager.scene.spriteset.actor_sprites[index] - end - - #-------------------------------------------------------------------------- - # new method: character - #-------------------------------------------------------------------------- - def character - return sprite.character_base - end - - #-------------------------------------------------------------------------- - # face_opposing_party - #-------------------------------------------------------------------------- - def face_opposing_party - dr = $game_system.party_direction || YEA::VISUAL_BATTLERS::PARTY_DIRECTION - direction = Direction.opposite(dr) - character.set_direction(Direction.correct(direction)) rescue 0 - end - - #-------------------------------------------------------------------------- - # forward_direction - #-------------------------------------------------------------------------- - def forward_direction - return Direction.opposite(($game_system.party_direction || - YEA::VISUAL_BATTLERS::PARTY_DIRECTION)) - end - -end # Game_Actor - -#============================================================================== -# ? ¥ Game_Enemy -#============================================================================== - -class Game_Enemy < Game_Battler - - #-------------------------------------------------------------------------- - # new method: sprite - #-------------------------------------------------------------------------- - def sprite - return SceneManager.scene.spriteset.enemy_sprites.reverse[self.index] - end - - #-------------------------------------------------------------------------- - # new method: character - #-------------------------------------------------------------------------- - def character - return sprite - end - -end # Game_Enemy - -#============================================================================== -# ? ¥ Game_Troop -#============================================================================== - -class Game_Troop < Game_Unit - - #-------------------------------------------------------------------------- - # alias method: setup - #-------------------------------------------------------------------------- - alias game_troop_setup_vb setup - def setup(troop_id) - game_troop_setup_vb(troop_id) - set_coordinates - end - - #-------------------------------------------------------------------------- - # new method: set_coordinates - #-------------------------------------------------------------------------- - def set_coordinates - for member in members - member.origin_x = member.screen_x - member.origin_y = member.screen_y - member.create_move_to(member.screen_x, member.screen_y, 1) - end - end - -end # Game_Troop - -#============================================================================== -# ? ¥ Sprite_Battler -#============================================================================== - -class Sprite_Battler < Sprite_Base - - #-------------------------------------------------------------------------- - # public instance_variable - #-------------------------------------------------------------------------- - attr_accessor :character_base - attr_accessor :character_sprite - - #-------------------------------------------------------------------------- - # alias method: dispose - #-------------------------------------------------------------------------- - alias sprite_battler_dispose_vb dispose - def dispose - dispose_character_sprite - sprite_battler_dispose_vb - end - - #-------------------------------------------------------------------------- - # new method: dispose_character_sprite - #-------------------------------------------------------------------------- - def dispose_character_sprite - @character_sprite.dispose unless @character_sprite.nil? - end - - #-------------------------------------------------------------------------- - # alias method: update - #-------------------------------------------------------------------------- - alias sprite_battler_update_vb update - def update - sprite_battler_update_vb - return if @battler.nil? - update_move_to - update_character_base - update_character_sprite - end - - #-------------------------------------------------------------------------- - # new method: update_character_base - #-------------------------------------------------------------------------- - def update_character_base - return if @character_base.nil? - @character_base.update - end - - #-------------------------------------------------------------------------- - # new method: update_character_sprite - #-------------------------------------------------------------------------- - def update_character_sprite - return if @character_sprite.nil? - @character_sprite.update - end - - #-------------------------------------------------------------------------- - # new method: update_move_to - #-------------------------------------------------------------------------- - def update_move_to - @battler.update_move_to - end - - #-------------------------------------------------------------------------- - # new method: moving? - #-------------------------------------------------------------------------- - def moving? - return false if @battler.nil? - return @battler.moving? - end - -end # Sprite_Battler - -#============================================================================== -# ? ¥ Sprite_BattleCharacter -#============================================================================== - -class Sprite_BattleCharacter < Sprite_Character - - #-------------------------------------------------------------------------- - # initialize - #-------------------------------------------------------------------------- - def initialize(viewport, character = nil) - super(viewport, character) - character.sprite = self - end - -end # Sprite_BattleCharacter - -#============================================================================== -# ? ¥ Spriteset_Battle -#============================================================================== - -class Spriteset_Battle - - #-------------------------------------------------------------------------- - # public instance_variable - #-------------------------------------------------------------------------- - attr_accessor :actor_sprites - attr_accessor :enemy_sprites - - #-------------------------------------------------------------------------- - # overwrite method: create_actors - #-------------------------------------------------------------------------- - def create_actors - total = $game_party.max_battle_members - @current_party = $game_party.battle_members.clone - @actor_sprites = Array.new(total) { Sprite_Battler.new(@viewport1) } - for actor in $game_party.battle_members - @actor_sprites[actor.index].battler = actor - create_actor_sprite(actor) - end - end - - #-------------------------------------------------------------------------- - # new method: create_actor_sprite - #-------------------------------------------------------------------------- - def create_actor_sprite(actor) - character = Game_BattleCharacter.new(actor) - character_sprite = Sprite_BattleCharacter.new(@viewport1, character) - @actor_sprites[actor.index].character_base = character - @actor_sprites[actor.index].character_sprite = character_sprite - actor.face_opposing_party - end - - #-------------------------------------------------------------------------- - # alias method: update_actors - #-------------------------------------------------------------------------- - alias spriteset_battle_update_actors_vb update_actors - def update_actors - if @current_party != $game_party.battle_members - dispose_actors - create_actors - end - spriteset_battle_update_actors_vb - end - - #-------------------------------------------------------------------------- - # new method: moving? - #-------------------------------------------------------------------------- - def moving? - return battler_sprites.any? {|sprite| sprite.moving? } - end - -end # Spriteset_Battle - -#============================================================================== -# ? ¥ Scene_Battle -#============================================================================== - -class Scene_Battle < Scene_Base - - #-------------------------------------------------------------------------- - # public instance variables - #-------------------------------------------------------------------------- - attr_accessor :spriteset - - #-------------------------------------------------------------------------- - # alias method: process_action_end - #-------------------------------------------------------------------------- - alias scene_battle_process_action_end_vb process_action_end - def process_action_end - start_battler_move_origin - scene_battle_process_action_end_vb - end - - #-------------------------------------------------------------------------- - # alias method: execute_action - #-------------------------------------------------------------------------- - alias scene_battle_execute_action_vb execute_action - def execute_action - start_battler_move_forward - scene_battle_execute_action_vb - end - - #-------------------------------------------------------------------------- - # new method: start_battler_move_forward - #-------------------------------------------------------------------------- - def start_battler_move_forward - return if @subject.started_turn - @subject.started_turn = true - @subject.move_forward - wait_for_moving - end - - #-------------------------------------------------------------------------- - # new method: start_battler_move_origin - #-------------------------------------------------------------------------- - def start_battler_move_origin - @subject.started_turn = nil - move_battlers_origin - wait_for_moving - @subject.face_opposing_party rescue 0 - end - - #-------------------------------------------------------------------------- - # new method: move_battlers_origin - #-------------------------------------------------------------------------- - def move_battlers_origin - for member in all_battle_members - next if member.dead? - next unless member.exist? - member.move_origin - end - end - - #-------------------------------------------------------------------------- - # new method: wait_for_moving - #-------------------------------------------------------------------------- - def wait_for_moving - update_for_wait - update_for_wait while @spriteset.moving? - end - -end # Scene_Battle - -#============================================================================== -# -# ¥ End of File -# -#============================================================================== diff --git a/samples/Text/dump.sql b/samples/Text/dump.sql deleted file mode 100644 index 2e959c0d..00000000 --- a/samples/Text/dump.sql +++ /dev/null @@ -1 +0,0 @@ -DROP ALL TABLES diff --git a/samples/Text/file.json b/samples/Text/file.json deleted file mode 100644 index 6d959030..00000000 --- a/samples/Text/file.json +++ /dev/null @@ -1 +0,0 @@ -{"foo": "bar"} diff --git a/samples/Text/file.txt b/samples/Text/file.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/samples/Text/messages.fr b/samples/Text/messages.fr new file mode 100644 index 00000000..da0269bb --- /dev/null +++ b/samples/Text/messages.fr @@ -0,0 +1 @@ +the green potato=la pomme de terre verte diff --git a/samples/Text/readme.txt b/samples/Text/readme.txt new file mode 100644 index 00000000..a6e6af0d --- /dev/null +++ b/samples/Text/readme.txt @@ -0,0 +1 @@ +Read me now! diff --git a/samples/WebIDL/AnimationEvent.webidl b/samples/WebIDL/AnimationEvent.webidl new file mode 100644 index 00000000..e48ed571 --- /dev/null +++ b/samples/WebIDL/AnimationEvent.webidl @@ -0,0 +1,25 @@ +/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. + * + * The origin of this IDL file is + * http://www.w3.org/TR/css3-animations/#animation-events- + * http://dev.w3.org/csswg/css3-animations/#animation-events- + * + * Copyright © 2012 W3C® (MIT, ERCIM, Keio), All Rights Reserved. W3C + * liability, trademark and document use rules apply. + */ + +[Constructor(DOMString type, optional AnimationEventInit eventInitDict)] +interface AnimationEvent : Event { + readonly attribute DOMString animationName; + readonly attribute float elapsedTime; + readonly attribute DOMString pseudoElement; +}; + +dictionary AnimationEventInit : EventInit { + DOMString animationName = ""; + float elapsedTime = 0; + DOMString pseudoElement = ""; +}; diff --git a/samples/WebIDL/Fetch.webidl b/samples/WebIDL/Fetch.webidl new file mode 100644 index 00000000..fb022126 --- /dev/null +++ b/samples/WebIDL/Fetch.webidl @@ -0,0 +1,35 @@ +/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. + * + * The origin of this IDL file is + * http://fetch.spec.whatwg.org/ + */ + +typedef object JSON; +// FIXME(nsm): Bug 739173: FormData is not available in workers. +// typedef (ArrayBuffer or ArrayBufferView or Blob or FormData or USVString or URLSearchParams) BodyInit; +typedef (ArrayBuffer or ArrayBufferView or Blob or USVString or URLSearchParams) BodyInit; + +[NoInterfaceObject, Exposed=(Window,Worker)] +interface Body { + readonly attribute boolean bodyUsed; + [Throws] + Promise arrayBuffer(); + [Throws] + Promise blob(); + // FIXME(nsm): Bug 739173 FormData is not supported in workers. + // Promise formData(); + [Throws] + Promise json(); + [Throws] + Promise text(); +}; + +[NoInterfaceObject, Exposed=(Window,Worker)] +interface GlobalFetch { + [Throws, Func="mozilla::dom::Headers::PrefEnabled"] + Promise fetch(RequestInfo input, optional RequestInit init); +}; + diff --git a/samples/XML/pt_BR.ts b/samples/XML/pt_BR.ts new file mode 100644 index 00000000..bfaf0015 --- /dev/null +++ b/samples/XML/pt_BR.ts @@ -0,0 +1,47 @@ + + + + + MainWindow + + + United Kingdom + Reino Unido + + + + God save the Queen + Deus salve a Rainha + + + + England + Inglaterra + + + + Wales + Gales + + + + Scotland + Escócia + + + + Northern Ireland + Irlanda Norte + + + + Portuguese + Português + + + + English + Inglês + + + diff --git a/script/bootstrap b/script/bootstrap new file mode 100755 index 00000000..e86baee4 --- /dev/null +++ b/script/bootstrap @@ -0,0 +1,13 @@ +#!/bin/sh + +set -e + +cd "$(dirname "$0")/.." + +bundle config --local path vendor/gems + +bundle check > /dev/null 2>&1 || bundle install + +git submodule init +git submodule sync --quiet +script/fast-submodule-update diff --git a/script/cibuild b/script/cibuild index 4dbcf970..62cd4242 100755 --- a/script/cibuild +++ b/script/cibuild @@ -1,4 +1,7 @@ #!/bin/sh + +set -e + if [ -d /usr/share/rbenv/shims ]; then export PATH=/usr/share/rbenv/shims:$PATH export RBENV_VERSION=2.1.2-github @@ -11,11 +14,9 @@ ruby -v bundle -v set +x -mkdir -p ./vendor/gems - # Clean out any unversioned files git clean -fd -bundle install --local --path ./vendor/gems +script/bootstrap bundle exec rake samples bundle exec rake diff --git a/script/download-grammars b/script/download-grammars index e0dfe10c..3792f451 100755 --- a/script/download-grammars +++ b/script/download-grammars @@ -8,21 +8,28 @@ require 'tmpdir' require 'uri' require 'yaml' -GRAMMARS_PATH = File.expand_path("../../grammars", __FILE__) -SOURCES_FILE = File.expand_path("../../grammars.yml", __FILE__) -CSONC = File.expand_path("../../node_modules/.bin/csonc", __FILE__) +ROOT = File.expand_path("../..", __FILE__) +GRAMMARS_PATH = File.join(ROOT, "grammars") +SOURCES_FILE = File.join(ROOT, "grammars.yml") +CSONC = File.join(ROOT, "node_modules", ".bin", "csonc") -class TarballPackage - def self.fetch(tmp_dir, url) - `curl --silent --location --max-time 10 --output "#{tmp_dir}/archive" "#{url}"` - raise "Failed to fetch GH package: #{url} #{$?.to_s}" unless $?.success? +class SingleFile + def initialize(path) + @path = path + end - output = File.join(tmp_dir, 'extracted') - Dir.mkdir(output) - `tar -C "#{output}" -xf "#{tmp_dir}/archive"` - raise "Failed to uncompress tarball: #{tmp_dir}/archive (from #{url}) #{$?.to_s}" unless $?.success? + def url + @path + end - Dir["#{output}/**/*"].select do |path| + def fetch(tmp_dir) + [@path] + end +end + +class DirectoryPackage + def self.fetch(dir) + Dir["#{dir}/**/*"].select do |path| case File.extname(path.downcase) when '.plist' path.split('/')[-2] == 'Syntaxes' @@ -36,6 +43,32 @@ class TarballPackage end end + def initialize(directory) + @directory = directory + end + + def url + @directory + end + + def fetch(tmp_dir) + self.class.fetch(File.join(ROOT, @directory)) + end +end + +class TarballPackage + def self.fetch(tmp_dir, url) + `curl --silent --location --max-time 30 --output "#{tmp_dir}/archive" "#{url}"` + raise "Failed to fetch GH package: #{url} #{$?.to_s}" unless $?.success? + + output = File.join(tmp_dir, 'extracted') + Dir.mkdir(output) + `tar -C "#{output}" -xf "#{tmp_dir}/archive"` + raise "Failed to uncompress tarball: #{tmp_dir}/archive (from #{url}) #{$?.to_s}" unless $?.success? + + DirectoryPackage.fetch(output) + end + attr_reader :url def initialize(url) @@ -116,7 +149,16 @@ def load_grammar(path) end def install_grammar(tmp_dir, source, all_scopes) - p = if source.end_with?('.tmLanguage', '.plist') + is_url = source.start_with?("http:", "https:") + is_single_file = source.end_with?('.tmLanguage', '.plist') + + p = if !is_url + if is_single_file + SingleFile.new(source) + else + DirectoryPackage.new(source) + end + elsif is_single_file SingleGrammar.new(source) elsif source.start_with?('https://github.com') GitHubPackage.new(source) diff --git a/script/fast-submodule-update b/script/fast-submodule-update new file mode 100755 index 00000000..dff1be7d --- /dev/null +++ b/script/fast-submodule-update @@ -0,0 +1,67 @@ +#!/usr/bin/env ruby + +require "thread" + +ROOT = File.expand_path("../..", __FILE__).freeze +Dir.chdir(ROOT) + +SUBMODULES = `git config --list --file .gitmodules`.lines.grep(/\.path=/).map { |line| line.chomp.split("=", 2).last }.freeze +SLOW_SUBMODULES = %w[ + vendor/grammars/factor + vendor/grammars/fsharpbinding + vendor/grammars/ioke-outdated +] + +class TaskResult < Struct.new(:submodule, :output, :status); end + +def run_process(*args) + read, write = IO.pipe + pid = Process.spawn(*args, in: :close, out: write, err: [:child, :out]) + write.close + output = read.read + read.close + Process.wait(pid) + [output, $?] +end + +def update_submodule(submodule) + output, status = run_process("git", "submodule", "update", "--", submodule) + TaskResult.new(submodule, output, status) +end + +def run_thread(submodules, results) + loop do + begin + submodule = submodules.pop(true) + rescue ThreadError + # The queue is empty. + break + end + + results.push(update_submodule(submodule)) + end +end + +submodules = Queue.new +results = Queue.new + +# Update the slow submodules first so they can update in the background while +# the fast ones run. +SUBMODULES.partition { |submodule| SLOW_SUBMODULES.include?(submodule) }.flatten.each do |submodule| + submodules.push(submodule) +end + +8.times do + Thread.new { run_thread(submodules, results) } +end + +success = true +SUBMODULES.each do + result = results.pop + unless result.status.success? + success = false + puts "Error updating #{result.submodule}" + end + puts result.output if result.output =~ /\S/ +end +exit success ? 0 : 1 diff --git a/samples/Binary/cube.stl b/test/fixtures/Binary/cube.stl similarity index 100% rename from samples/Binary/cube.stl rename to test/fixtures/Binary/cube.stl diff --git a/samples/Binary/dog.o b/test/fixtures/Binary/dog.o similarity index 100% rename from samples/Binary/dog.o rename to test/fixtures/Binary/dog.o diff --git a/samples/Binary/foo bar.jar b/test/fixtures/Binary/foo bar.jar similarity index 100% rename from samples/Binary/foo bar.jar rename to test/fixtures/Binary/foo bar.jar diff --git a/samples/Binary/foo.bin b/test/fixtures/Binary/foo.bin similarity index 100% rename from samples/Binary/foo.bin rename to test/fixtures/Binary/foo.bin diff --git a/samples/Binary/foo.pdf b/test/fixtures/Binary/foo.pdf similarity index 100% rename from samples/Binary/foo.pdf rename to test/fixtures/Binary/foo.pdf diff --git a/samples/Binary/foo.png b/test/fixtures/Binary/foo.png similarity index 100% rename from samples/Binary/foo.png rename to test/fixtures/Binary/foo.png diff --git a/samples/Binary/git.deb b/test/fixtures/Binary/git.deb similarity index 100% rename from samples/Binary/git.deb rename to test/fixtures/Binary/git.deb diff --git a/samples/Binary/git.exe b/test/fixtures/Binary/git.exe similarity index 100% rename from samples/Binary/git.exe rename to test/fixtures/Binary/git.exe diff --git a/samples/Binary/github.po b/test/fixtures/Binary/github.po similarity index 100% rename from samples/Binary/github.po rename to test/fixtures/Binary/github.po diff --git a/samples/Binary/hello.pbc b/test/fixtures/Binary/hello.pbc similarity index 100% rename from samples/Binary/hello.pbc rename to test/fixtures/Binary/hello.pbc diff --git a/samples/Binary/linguist.gem b/test/fixtures/Binary/linguist.gem similarity index 100% rename from samples/Binary/linguist.gem rename to test/fixtures/Binary/linguist.gem diff --git a/samples/Binary/octocat.ai b/test/fixtures/Binary/octocat.ai similarity index 100% rename from samples/Binary/octocat.ai rename to test/fixtures/Binary/octocat.ai diff --git a/samples/Binary/octocat.png b/test/fixtures/Binary/octocat.png similarity index 100% rename from samples/Binary/octocat.png rename to test/fixtures/Binary/octocat.png diff --git a/samples/Binary/octocat.psd b/test/fixtures/Binary/octocat.psd similarity index 100% rename from samples/Binary/octocat.psd rename to test/fixtures/Binary/octocat.psd diff --git a/samples/Binary/zip b/test/fixtures/Binary/zip similarity index 100% rename from samples/Binary/zip rename to test/fixtures/Binary/zip diff --git a/samples/Text/README b/test/fixtures/Data/README similarity index 100% rename from samples/Text/README rename to test/fixtures/Data/README diff --git a/samples/Text/blank b/test/fixtures/Data/blank similarity index 100% rename from samples/Text/blank rename to test/fixtures/Data/blank diff --git a/test/fixtures/Data/bootstrap.css.map b/test/fixtures/Data/bootstrap.css.map new file mode 100644 index 00000000..23dc85ad --- /dev/null +++ b/test/fixtures/Data/bootstrap.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["bootstrap.css","less/normalize.less","less/print.less","less/glyphicons.less","less/scaffolding.less","less/mixins/vendor-prefixes.less","less/mixins/tab-focus.less","less/mixins/image.less","less/type.less","less/mixins/text-emphasis.less","less/mixins/background-variant.less","less/mixins/text-overflow.less","less/code.less","less/grid.less","less/mixins/grid.less","less/mixins/grid-framework.less","less/tables.less","less/mixins/table-row.less","less/forms.less","less/mixins/forms.less","less/buttons.less","less/mixins/buttons.less","less/mixins/opacity.less","less/component-animations.less","less/dropdowns.less","less/mixins/nav-divider.less","less/mixins/reset-filter.less","less/button-groups.less","less/mixins/border-radius.less","less/input-groups.less","less/navs.less","less/navbar.less","less/mixins/nav-vertical-align.less","less/utilities.less","less/breadcrumbs.less","less/pagination.less","less/mixins/pagination.less","less/pager.less","less/labels.less","less/mixins/labels.less","less/badges.less","less/jumbotron.less","less/thumbnails.less","less/alerts.less","less/mixins/alerts.less","less/progress-bars.less","less/mixins/gradients.less","less/mixins/progress-bar.less","less/media.less","less/list-group.less","less/mixins/list-group.less","less/panels.less","less/mixins/panels.less","less/responsive-embed.less","less/wells.less","less/close.less","less/modals.less","less/tooltip.less","less/popovers.less","less/carousel.less","less/mixins/clearfix.less","less/mixins/center-block.less","less/mixins/hide-text.less","less/responsive-utilities.less","less/mixins/responsive-visibility.less"],"names":[],"mappings":"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AAA;EHsR9C;AGrRmC;EAAW,kBAAA;EHwR9C;AGvRmC;EAAW,kBAAA;EH0R9C;AGzRmC;EAAW,kBAAA;EH4R9C;AG3RmC;EAAW,kBAAA;EH8R9C;AG7RmC;EAAW,kBAAA;EHgS9C;AG/RmC;EAAW,kBAAA;EHkS9C;AGjSmC;EAAW,kBAAA;EHoS9C;AGnSmC;EAAW,kBAAA;EHsS9C;AGrSmC;EAAW,kBAAA;EHwS9C;AGvSmC;EAAW,kBAAA;EH0S9C;AGzSmC;EAAW,kBAAA;EH4S9C;AG3SmC;EAAW,kBAAA;EH8S9C;AG7SmC;EAAW,kBAAA;EHgT9C;AG/SmC;EAAW,kBAAA;EHkT9C;AGjTmC;EAAW,kBAAA;EHoT9C;AGnTmC;EAAW,kBAAA;EHsT9C;AGrTmC;EAAW,kBAAA;EHwT9C;AGvTmC;EAAW,kBAAA;EH0T9C;AGzTmC;EAAW,kBAAA;EH4T9C;AG3TmC;EAAW,kBAAA;EH8T9C;AG7TmC;EAAW,kBAAA;EHgU9C;AG/TmC;EAAW,kBAAA;EHkU9C;AGjUmC;EAAW,kBAAA;EHoU9C;AGnUmC;EAAW,kBAAA;EHsU9C;AGrUmC;EAAW,kBAAA;EHwU9C;AGvUmC;EAAW,kBAAA;EH0U9C;AGzUmC;EAAW,kBAAA;EH4U9C;AG3UmC;EAAW,kBAAA;EH8U9C;AG7UmC;EAAW,kBAAA;EHgV9C;AG/UmC;EAAW,kBAAA;EHkV9C;AGjVmC;EAAW,kBAAA;EHoV9C;AGnVmC;EAAW,kBAAA;EHsV9C;AGrVmC;EAAW,kBAAA;EHwV9C;AGvVmC;EAAW,kBAAA;EH0V9C;AGzVmC;EAAW,kBAAA;EH4V9C;AG3VmC;EAAW,kBAAA;EH8V9C;AG7VmC;EAAW,kBAAA;EHgW9C;AG/VmC;EAAW,kBAAA;EHkW9C;AGjWmC;EAAW,kBAAA;EHoW9C;AGnWmC;EAAW,kBAAA;EHsW9C;AGrWmC;EAAW,kBAAA;EHwW9C;AGvWmC;EAAW,kBAAA;EH0W9C;AGzWmC;EAAW,kBAAA;EH4W9C;AG3WmC;EAAW,kBAAA;EH8W9C;AG7WmC;EAAW,kBAAA;EHgX9C;AG/WmC;EAAW,kBAAA;EHkX9C;AGjXmC;EAAW,kBAAA;EHoX9C;AGnXmC;EAAW,kBAAA;EHsX9C;AGrXmC;EAAW,kBAAA;EHwX9C;AGvXmC;EAAW,kBAAA;EH0X9C;AGzXmC;EAAW,kBAAA;EH4X9C;AG3XmC;EAAW,kBAAA;EH8X9C;AG7XmC;EAAW,kBAAA;EHgY9C;AG/XmC;EAAW,kBAAA;EHkY9C;AGjYmC;EAAW,kBAAA;EHoY9C;AGnYmC;EAAW,kBAAA;EHsY9C;AGrYmC;EAAW,kBAAA;EHwY9C;AGvYmC;EAAW,kBAAA;EH0Y9C;AGzYmC;EAAW,kBAAA;EH4Y9C;AG3YmC;EAAW,kBAAA;EH8Y9C;AG7YmC;EAAW,kBAAA;EHgZ9C;AG/YmC;EAAW,kBAAA;EHkZ9C;AGjZmC;EAAW,kBAAA;EHoZ9C;AGnZmC;EAAW,kBAAA;EHsZ9C;AGrZmC;EAAW,kBAAA;EHwZ9C;AGvZmC;EAAW,kBAAA;EH0Z9C;AGzZmC;EAAW,kBAAA;EH4Z9C;AG3ZmC;EAAW,kBAAA;EH8Z9C;AG7ZmC;EAAW,kBAAA;EHga9C;AG/ZmC;EAAW,kBAAA;EHka9C;AGjamC;EAAW,kBAAA;EHoa9C;AGnamC;EAAW,kBAAA;EHsa9C;AGramC;EAAW,kBAAA;EHwa9C;AGvamC;EAAW,kBAAA;EH0a9C;AGzamC;EAAW,kBAAA;EH4a9C;AG3amC;EAAW,kBAAA;EH8a9C;AG7amC;EAAW,kBAAA;EHgb9C;AG/amC;EAAW,kBAAA;EHkb9C;AGjbmC;EAAW,kBAAA;EHob9C;AGnbmC;EAAW,kBAAA;EHsb9C;AGrbmC;EAAW,kBAAA;EHwb9C;AGvbmC;EAAW,kBAAA;EH0b9C;AGzbmC;EAAW,kBAAA;EH4b9C;AG3bmC;EAAW,kBAAA;EH8b9C;AG7bmC;EAAW,kBAAA;EHgc9C;AG/bmC;EAAW,kBAAA;EHkc9C;AGjcmC;EAAW,kBAAA;EHoc9C;AGncmC;EAAW,kBAAA;EHsc9C;AGrcmC;EAAW,kBAAA;EHwc9C;AGvcmC;EAAW,kBAAA;EH0c9C;AGzcmC;EAAW,kBAAA;EH4c9C;AG3cmC;EAAW,kBAAA;EH8c9C;AG7cmC;EAAW,kBAAA;EHgd9C;AG/cmC;EAAW,kBAAA;EHkd9C;AGjdmC;EAAW,kBAAA;EHod9C;AGndmC;EAAW,kBAAA;EHsd9C;AGrdmC;EAAW,kBAAA;EHwd9C;AGvdmC;EAAW,kBAAA;EH0d9C;AGzdmC;EAAW,kBAAA;EH4d9C;AG3dmC;EAAW,kBAAA;EH8d9C;AG7dmC;EAAW,kBAAA;EHge9C;AG/dmC;EAAW,kBAAA;EHke9C;AGjemC;EAAW,kBAAA;EHoe9C;AGnemC;EAAW,kBAAA;EHse9C;AGremC;EAAW,kBAAA;EHwe9C;AGvemC;EAAW,kBAAA;EH0e9C;AGzemC;EAAW,kBAAA;EH4e9C;AG3emC;EAAW,kBAAA;EH8e9C;AG7emC;EAAW,kBAAA;EHgf9C;AG/emC;EAAW,kBAAA;EHkf9C;AGjfmC;EAAW,kBAAA;EHof9C;AGnfmC;EAAW,kBAAA;EHsf9C;AGrfmC;EAAW,kBAAA;EHwf9C;AGvfmC;EAAW,kBAAA;EH0f9C;AGzfmC;EAAW,kBAAA;EH4f9C;AG3fmC;EAAW,kBAAA;EH8f9C;AG7fmC;EAAW,kBAAA;EHggB9C;AG/fmC;EAAW,kBAAA;EHkgB9C;AGjgBmC;EAAW,kBAAA;EHogB9C;AGngBmC;EAAW,kBAAA;EHsgB9C;AGrgBmC;EAAW,kBAAA;EHwgB9C;AGvgBmC;EAAW,kBAAA;EH0gB9C;AGzgBmC;EAAW,kBAAA;EH4gB9C;AG3gBmC;EAAW,kBAAA;EH8gB9C;AG7gBmC;EAAW,kBAAA;EHghB9C;AG/gBmC;EAAW,kBAAA;EHkhB9C;AGjhBmC;EAAW,kBAAA;EHohB9C;AGnhBmC;EAAW,kBAAA;EHshB9C;AGrhBmC;EAAW,kBAAA;EHwhB9C;AGvhBmC;EAAW,kBAAA;EH0hB9C;AGzhBmC;EAAW,kBAAA;EH4hB9C;AG3hBmC;EAAW,kBAAA;EH8hB9C;AG7hBmC;EAAW,kBAAA;EHgiB9C;AG/hBmC;EAAW,kBAAA;EHkiB9C;AGjiBmC;EAAW,kBAAA;EHoiB9C;AGniBmC;EAAW,kBAAA;EHsiB9C;AGriBmC;EAAW,kBAAA;EHwiB9C;AGviBmC;EAAW,kBAAA;EH0iB9C;AGziBmC;EAAW,kBAAA;EH4iB9C;AG3iBmC;EAAW,kBAAA;EH8iB9C;AG7iBmC;EAAW,kBAAA;EHgjB9C;AG/iBmC;EAAW,kBAAA;EHkjB9C;AGjjBmC;EAAW,kBAAA;EHojB9C;AGnjBmC;EAAW,kBAAA;EHsjB9C;AGrjBmC;EAAW,kBAAA;EHwjB9C;AGvjBmC;EAAW,kBAAA;EH0jB9C;AGzjBmC;EAAW,kBAAA;EH4jB9C;AG3jBmC;EAAW,kBAAA;EH8jB9C;AG7jBmC;EAAW,kBAAA;EHgkB9C;AG/jBmC;EAAW,kBAAA;EHkkB9C;AGjkBmC;EAAW,kBAAA;EHokB9C;AGnkBmC;EAAW,kBAAA;EHskB9C;AGrkBmC;EAAW,kBAAA;EHwkB9C;AGvkBmC;EAAW,kBAAA;EH0kB9C;AGzkBmC;EAAW,kBAAA;EH4kB9C;AG3kBmC;EAAW,kBAAA;EH8kB9C;AG7kBmC;EAAW,kBAAA;EHglB9C;AG/kBmC;EAAW,kBAAA;EHklB9C;AGjlBmC;EAAW,kBAAA;EHolB9C;AGnlBmC;EAAW,kBAAA;EHslB9C;AGrlBmC;EAAW,kBAAA;EHwlB9C;AGvlBmC;EAAW,kBAAA;EH0lB9C;AGzlBmC;EAAW,kBAAA;EH4lB9C;AG3lBmC;EAAW,kBAAA;EH8lB9C;AG7lBmC;EAAW,kBAAA;EHgmB9C;AG/lBmC;EAAW,kBAAA;EHkmB9C;AGjmBmC;EAAW,kBAAA;EHomB9C;AGnmBmC;EAAW,kBAAA;EHsmB9C;AGrmBmC;EAAW,kBAAA;EHwmB9C;AGvmBmC;EAAW,kBAAA;EH0mB9C;AGzmBmC;EAAW,kBAAA;EH4mB9C;AG3mBmC;EAAW,kBAAA;EH8mB9C;AG7mBmC;EAAW,kBAAA;EHgnB9C;AG/mBmC;EAAW,kBAAA;EHknB9C;AGjnBmC;EAAW,kBAAA;EHonB9C;AGnnBmC;EAAW,kBAAA;EHsnB9C;AGrnBmC;EAAW,kBAAA;EHwnB9C;AGvnBmC;EAAW,kBAAA;EH0nB9C;AGznBmC;EAAW,kBAAA;EH4nB9C;AG3nBmC;EAAW,kBAAA;EH8nB9C;AG7nBmC;EAAW,kBAAA;EHgoB9C;AG/nBmC;EAAW,kBAAA;EHkoB9C;AGjoBmC;EAAW,kBAAA;EHooB9C;AGnoBmC;EAAW,kBAAA;EHsoB9C;AGroBmC;EAAW,kBAAA;EHwoB9C;AGvoBmC;EAAW,kBAAA;EH0oB9C;AGzoBmC;EAAW,mBAAA;EH4oB9C;AG3oBmC;EAAW,mBAAA;EH8oB9C;AG7oBmC;EAAW,kBAAA;EHgpB9C;AG/oBmC;EAAW,kBAAA;EHkpB9C;AGjpBmC;EAAW,kBAAA;EHopB9C;AGnpBmC;EAAW,kBAAA;EHspB9C;AGrpBmC;EAAW,kBAAA;EHwpB9C;AGvpBmC;EAAW,kBAAA;EH0pB9C;AGzpBmC;EAAW,kBAAA;EH4pB9C;AG3pBmC;EAAW,kBAAA;EH8pB9C;AG7pBmC;EAAW,kBAAA;EHgqB9C;AG/pBmC;EAAW,kBAAA;EHkqB9C;AGjqBmC;EAAW,kBAAA;EHoqB9C;AGnqBmC;EAAW,kBAAA;EHsqB9C;AGrqBmC;EAAW,kBAAA;EHwqB9C;AGvqBmC;EAAW,kBAAA;EH0qB9C;AGzqBmC;EAAW,kBAAA;EH4qB9C;AG3qBmC;EAAW,kBAAA;EH8qB9C;AG7qBmC;EAAW,kBAAA;EHgrB9C;AG/qBmC;EAAW,kBAAA;EHkrB9C;AGjrBmC;EAAW,kBAAA;EHorB9C;AGnrBmC;EAAW,kBAAA;EHsrB9C;AGrrBmC;EAAW,kBAAA;EHwrB9C;AGvrBmC;EAAW,kBAAA;EH0rB9C;AGzrBmC;EAAW,kBAAA;EH4rB9C;AG3rBmC;EAAW,kBAAA;EH8rB9C;AG7rBmC;EAAW,kBAAA;EHgsB9C;AG/rBmC;EAAW,kBAAA;EHksB9C;AGjsBmC;EAAW,kBAAA;EHosB9C;AGnsBmC;EAAW,kBAAA;EHssB9C;AGrsBmC;EAAW,kBAAA;EHwsB9C;AGvsBmC;EAAW,kBAAA;EH0sB9C;AGzsBmC;EAAW,kBAAA;EH4sB9C;AG3sBmC;EAAW,kBAAA;EH8sB9C;AG7sBmC;EAAW,kBAAA;EHgtB9C;AG/sBmC;EAAW,kBAAA;EHktB9C;AGjtBmC;EAAW,kBAAA;EHotB9C;AGntBmC;EAAW,kBAAA;EHstB9C;AGrtBmC;EAAW,kBAAA;EHwtB9C;AGvtBmC;EAAW,kBAAA;EH0tB9C;AGztBmC;EAAW,kBAAA;EH4tB9C;AG3tBmC;EAAW,kBAAA;EH8tB9C;AG7tBmC;EAAW,kBAAA;EHguB9C;AG/tBmC;EAAW,kBAAA;EHkuB9C;AGjuBmC;EAAW,kBAAA;EHouB9C;AGnuBmC;EAAW,kBAAA;EHsuB9C;AGruBmC;EAAW,kBAAA;EHwuB9C;AGvuBmC;EAAW,kBAAA;EH0uB9C;AGzuBmC;EAAW,kBAAA;EH4uB9C;AG3uBmC;EAAW,kBAAA;EH8uB9C;AG7uBmC;EAAW,kBAAA;EHgvB9C;AG/uBmC;EAAW,kBAAA;EHkvB9C;AGjvBmC;EAAW,kBAAA;EHovB9C;AGnvBmC;EAAW,kBAAA;EHsvB9C;AIjhCD;ECgEE,gCAAA;EACG,6BAAA;EACK,wBAAA;ELo9BT;AInhCD;;EC6DE,gCAAA;EACG,6BAAA;EACK,wBAAA;EL09BT;AIjhCD;EACE,iBAAA;EACA,+CAAA;EJmhCD;AIhhCD;EACE,6DAAA;EACA,iBAAA;EACA,yBAAA;EACA,gBAAA;EACA,2BAAA;EJkhCD;AI9gCD;;;;EAIE,sBAAA;EACA,oBAAA;EACA,sBAAA;EJghCD;AI1gCD;EACE,gBAAA;EACA,uBAAA;EJ4gCD;AI1gCC;;EAEE,gBAAA;EACA,4BAAA;EJ4gCH;AIzgCC;EErDA,sBAAA;EAEA,4CAAA;EACA,sBAAA;ENgkCD;AIngCD;EACE,WAAA;EJqgCD;AI//BD;EACE,wBAAA;EJigCD;AI7/BD;;;;;EGvEE,gBAAA;EACA,iBAAA;EACA,cAAA;EP2kCD;AIjgCD;EACE,oBAAA;EJmgCD;AI7/BD;EACE,cAAA;EACA,yBAAA;EACA,2BAAA;EACA,2BAAA;EACA,oBAAA;EC6FA,0CAAA;EACK,qCAAA;EACG,kCAAA;EEvLR,uBAAA;EACA,iBAAA;EACA,cAAA;EP2lCD;AI7/BD;EACE,oBAAA;EJ+/BD;AIz/BD;EACE,kBAAA;EACA,qBAAA;EACA,WAAA;EACA,+BAAA;EJ2/BD;AIn/BD;EACE,oBAAA;EACA,YAAA;EACA,aAAA;EACA,cAAA;EACA,YAAA;EACA,kBAAA;EACA,wBAAA;EACA,WAAA;EJq/BD;AI7+BC;;EAEE,kBAAA;EACA,aAAA;EACA,cAAA;EACA,WAAA;EACA,mBAAA;EACA,YAAA;EJ++BH;AQ1nCD;;;;;;;;;;;;EAEE,sBAAA;EACA,kBAAA;EACA,kBAAA;EACA,gBAAA;ERsoCD;AQ3oCD;;;;;;;;;;;;;;;;;;;;;;;;EASI,qBAAA;EACA,gBAAA;EACA,gBAAA;ER4pCH;AQxpCD;;;;;;EAGE,kBAAA;EACA,qBAAA;ER6pCD;AQjqCD;;;;;;;;;;;;EAQI,gBAAA;ERuqCH;AQpqCD;;;;;;EAGE,kBAAA;EACA,qBAAA;ERyqCD;AQ7qCD;;;;;;;;;;;;EAQI,gBAAA;ERmrCH;AQ/qCD;;EAAU,iBAAA;ERmrCT;AQlrCD;;EAAU,iBAAA;ERsrCT;AQrrCD;;EAAU,iBAAA;ERyrCT;AQxrCD;;EAAU,iBAAA;ER4rCT;AQ3rCD;;EAAU,iBAAA;ER+rCT;AQ9rCD;;EAAU,iBAAA;ERksCT;AQ5rCD;EACE,kBAAA;ER8rCD;AQ3rCD;EACE,qBAAA;EACA,iBAAA;EACA,kBAAA;EACA,kBAAA;ER6rCD;AQxrCD;EAAA;IAFI,iBAAA;IR8rCD;EACF;AQtrCD;;EAEE,gBAAA;ERwrCD;AQrrCD;;EAEE,2BAAA;EACA,eAAA;ERurCD;AQnrCD;EAAuB,kBAAA;ERsrCtB;AQrrCD;EAAuB,mBAAA;ERwrCtB;AQvrCD;EAAuB,oBAAA;ER0rCtB;AQzrCD;EAAuB,qBAAA;ER4rCtB;AQ3rCD;EAAuB,qBAAA;ER8rCtB;AQ3rCD;EAAuB,2BAAA;ER8rCtB;AQ7rCD;EAAuB,2BAAA;ERgsCtB;AQ/rCD;EAAuB,4BAAA;ERksCtB;AQ/rCD;EACE,gBAAA;ERisCD;AQ/rCD;ECrGE,gBAAA;ETuyCD;AStyCC;EACE,gBAAA;ETwyCH;AQlsCD;ECxGE,gBAAA;ET6yCD;AS5yCC;EACE,gBAAA;ET8yCH;AQrsCD;EC3GE,gBAAA;ETmzCD;ASlzCC;EACE,gBAAA;ETozCH;AQxsCD;EC9GE,gBAAA;ETyzCD;ASxzCC;EACE,gBAAA;ET0zCH;AQ3sCD;ECjHE,gBAAA;ET+zCD;AS9zCC;EACE,gBAAA;ETg0CH;AQ1sCD;EAGE,aAAA;EE3HA,2BAAA;EVs0CD;AUr0CC;EACE,2BAAA;EVu0CH;AQ3sCD;EE9HE,2BAAA;EV40CD;AU30CC;EACE,2BAAA;EV60CH;AQ9sCD;EEjIE,2BAAA;EVk1CD;AUj1CC;EACE,2BAAA;EVm1CH;AQjtCD;EEpIE,2BAAA;EVw1CD;AUv1CC;EACE,2BAAA;EVy1CH;AQptCD;EEvIE,2BAAA;EV81CD;AU71CC;EACE,2BAAA;EV+1CH;AQltCD;EACE,qBAAA;EACA,qBAAA;EACA,kCAAA;ERotCD;AQ5sCD;;EAEE,eAAA;EACA,qBAAA;ER8sCD;AQjtCD;;;;EAMI,kBAAA;ERitCH;AQ1sCD;EACE,iBAAA;EACA,kBAAA;ER4sCD;AQxsCD;EALE,iBAAA;EACA,kBAAA;EAMA,mBAAA;ER2sCD;AQ7sCD;EAKI,uBAAA;EACA,mBAAA;EACA,oBAAA;ER2sCH;AQtsCD;EACE,eAAA;EACA,qBAAA;ERwsCD;AQtsCD;;EAEE,yBAAA;ERwsCD;AQtsCD;EACE,mBAAA;ERwsCD;AQtsCD;EACE,gBAAA;ERwsCD;AQ/qCD;EAAA;IAVM,aAAA;IACA,cAAA;IACA,aAAA;IACA,mBAAA;IGtNJ,kBAAA;IACA,yBAAA;IACA,qBAAA;IXo5CC;EQzrCH;IAHM,oBAAA;IR+rCH;EACF;AQtrCD;;EAGE,cAAA;EACA,mCAAA;ERurCD;AQrrCD;EACE,gBAAA;EACA,2BAAA;ERurCD;AQnrCD;EACE,oBAAA;EACA,kBAAA;EACA,mBAAA;EACA,gCAAA;ERqrCD;AQhrCG;;;EACE,kBAAA;ERorCL;AQ9rCD;;;EAmBI,gBAAA;EACA,gBAAA;EACA,yBAAA;EACA,gBAAA;ERgrCH;AQ9qCG;;;EACE,wBAAA;ERkrCL;AQ1qCD;;EAEE,qBAAA;EACA,iBAAA;EACA,iCAAA;EACA,gBAAA;EACA,mBAAA;ER4qCD;AQtqCG;;;;;;EAAW,aAAA;ER8qCd;AQ7qCG;;;;;;EACE,wBAAA;ERorCL;AQ9qCD;EACE,qBAAA;EACA,oBAAA;EACA,yBAAA;ERgrCD;AYt9CD;;;;EAIE,gEAAA;EZw9CD;AYp9CD;EACE,kBAAA;EACA,gBAAA;EACA,gBAAA;EACA,2BAAA;EACA,oBAAA;EZs9CD;AYl9CD;EACE,kBAAA;EACA,gBAAA;EACA,gBAAA;EACA,2BAAA;EACA,oBAAA;EACA,wDAAA;UAAA,gDAAA;EZo9CD;AY19CD;EASI,YAAA;EACA,iBAAA;EACA,mBAAA;EACA,0BAAA;UAAA,kBAAA;EZo9CH;AY/8CD;EACE,gBAAA;EACA,gBAAA;EACA,kBAAA;EACA,iBAAA;EACA,yBAAA;EACA,uBAAA;EACA,uBAAA;EACA,gBAAA;EACA,2BAAA;EACA,2BAAA;EACA,oBAAA;EZi9CD;AY59CD;EAeI,YAAA;EACA,oBAAA;EACA,gBAAA;EACA,uBAAA;EACA,+BAAA;EACA,kBAAA;EZg9CH;AY38CD;EACE,mBAAA;EACA,oBAAA;EZ68CD;AavgDD;ECHE,oBAAA;EACA,mBAAA;EACA,oBAAA;EACA,qBAAA;Ed6gDD;AavgDC;EAAA;IAFE,cAAA;Ib6gDD;EACF;AazgDC;EAAA;IAFE,cAAA;Ib+gDD;EACF;Aa3gDD;EAAA;IAFI,eAAA;IbihDD;EACF;AaxgDD;ECvBE,oBAAA;EACA,mBAAA;EACA,oBAAA;EACA,qBAAA;EdkiDD;AargDD;ECvBE,oBAAA;EACA,qBAAA;Ed+hDD;Ae/hDG;EACE,oBAAA;EAEA,iBAAA;EAEA,oBAAA;EACA,qBAAA;Ef+hDL;Ae/gDG;EACE,aAAA;EfihDL;Ae1gDC;EACE,aAAA;Ef4gDH;Ae7gDC;EACE,qBAAA;Ef+gDH;AehhDC;EACE,qBAAA;EfkhDH;AenhDC;EACE,YAAA;EfqhDH;AethDC;EACE,qBAAA;EfwhDH;AezhDC;EACE,qBAAA;Ef2hDH;Ae5hDC;EACE,YAAA;Ef8hDH;Ae/hDC;EACE,qBAAA;EfiiDH;AeliDC;EACE,qBAAA;EfoiDH;AeriDC;EACE,YAAA;EfuiDH;AexiDC;EACE,qBAAA;Ef0iDH;Ae3iDC;EACE,oBAAA;Ef6iDH;Ae/hDC;EACE,aAAA;EfiiDH;AeliDC;EACE,qBAAA;EfoiDH;AeriDC;EACE,qBAAA;EfuiDH;AexiDC;EACE,YAAA;Ef0iDH;Ae3iDC;EACE,qBAAA;Ef6iDH;Ae9iDC;EACE,qBAAA;EfgjDH;AejjDC;EACE,YAAA;EfmjDH;AepjDC;EACE,qBAAA;EfsjDH;AevjDC;EACE,qBAAA;EfyjDH;Ae1jDC;EACE,YAAA;Ef4jDH;Ae7jDC;EACE,qBAAA;Ef+jDH;AehkDC;EACE,oBAAA;EfkkDH;Ae9jDC;EACE,aAAA;EfgkDH;AehlDC;EACE,YAAA;EfklDH;AenlDC;EACE,oBAAA;EfqlDH;AetlDC;EACE,oBAAA;EfwlDH;AezlDC;EACE,WAAA;Ef2lDH;Ae5lDC;EACE,oBAAA;Ef8lDH;Ae/lDC;EACE,oBAAA;EfimDH;AelmDC;EACE,WAAA;EfomDH;AermDC;EACE,oBAAA;EfumDH;AexmDC;EACE,oBAAA;Ef0mDH;Ae3mDC;EACE,WAAA;Ef6mDH;Ae9mDC;EACE,oBAAA;EfgnDH;AejnDC;EACE,mBAAA;EfmnDH;Ae/mDC;EACE,YAAA;EfinDH;AenmDC;EACE,mBAAA;EfqmDH;AetmDC;EACE,2BAAA;EfwmDH;AezmDC;EACE,2BAAA;Ef2mDH;Ae5mDC;EACE,kBAAA;Ef8mDH;Ae/mDC;EACE,2BAAA;EfinDH;AelnDC;EACE,2BAAA;EfonDH;AernDC;EACE,kBAAA;EfunDH;AexnDC;EACE,2BAAA;Ef0nDH;Ae3nDC;EACE,2BAAA;Ef6nDH;Ae9nDC;EACE,kBAAA;EfgoDH;AejoDC;EACE,2BAAA;EfmoDH;AepoDC;EACE,0BAAA;EfsoDH;AevoDC;EACE,iBAAA;EfyoDH;Aa7oDD;EE9BI;IACE,aAAA;If8qDH;EevqDD;IACE,aAAA;IfyqDD;Ee1qDD;IACE,qBAAA;If4qDD;Ee7qDD;IACE,qBAAA;If+qDD;EehrDD;IACE,YAAA;IfkrDD;EenrDD;IACE,qBAAA;IfqrDD;EetrDD;IACE,qBAAA;IfwrDD;EezrDD;IACE,YAAA;If2rDD;Ee5rDD;IACE,qBAAA;If8rDD;Ee/rDD;IACE,qBAAA;IfisDD;EelsDD;IACE,YAAA;IfosDD;EersDD;IACE,qBAAA;IfusDD;EexsDD;IACE,oBAAA;If0sDD;Ee5rDD;IACE,aAAA;If8rDD;Ee/rDD;IACE,qBAAA;IfisDD;EelsDD;IACE,qBAAA;IfosDD;EersDD;IACE,YAAA;IfusDD;EexsDD;IACE,qBAAA;If0sDD;Ee3sDD;IACE,qBAAA;If6sDD;Ee9sDD;IACE,YAAA;IfgtDD;EejtDD;IACE,qBAAA;IfmtDD;EeptDD;IACE,qBAAA;IfstDD;EevtDD;IACE,YAAA;IfytDD;Ee1tDD;IACE,qBAAA;If4tDD;Ee7tDD;IACE,oBAAA;If+tDD;Ee3tDD;IACE,aAAA;If6tDD;Ee7uDD;IACE,YAAA;If+uDD;EehvDD;IACE,oBAAA;IfkvDD;EenvDD;IACE,oBAAA;IfqvDD;EetvDD;IACE,WAAA;IfwvDD;EezvDD;IACE,oBAAA;If2vDD;Ee5vDD;IACE,oBAAA;If8vDD;Ee/vDD;IACE,WAAA;IfiwDD;EelwDD;IACE,oBAAA;IfowDD;EerwDD;IACE,oBAAA;IfuwDD;EexwDD;IACE,WAAA;If0wDD;Ee3wDD;IACE,oBAAA;If6wDD;Ee9wDD;IACE,mBAAA;IfgxDD;Ee5wDD;IACE,YAAA;If8wDD;EehwDD;IACE,mBAAA;IfkwDD;EenwDD;IACE,2BAAA;IfqwDD;EetwDD;IACE,2BAAA;IfwwDD;EezwDD;IACE,kBAAA;If2wDD;Ee5wDD;IACE,2BAAA;If8wDD;Ee/wDD;IACE,2BAAA;IfixDD;EelxDD;IACE,kBAAA;IfoxDD;EerxDD;IACE,2BAAA;IfuxDD;EexxDD;IACE,2BAAA;If0xDD;Ee3xDD;IACE,kBAAA;If6xDD;Ee9xDD;IACE,2BAAA;IfgyDD;EejyDD;IACE,0BAAA;IfmyDD;EepyDD;IACE,iBAAA;IfsyDD;EACF;AalyDD;EEvCI;IACE,aAAA;If40DH;Eer0DD;IACE,aAAA;Ifu0DD;Eex0DD;IACE,qBAAA;If00DD;Ee30DD;IACE,qBAAA;If60DD;Ee90DD;IACE,YAAA;Ifg1DD;Eej1DD;IACE,qBAAA;Ifm1DD;Eep1DD;IACE,qBAAA;Ifs1DD;Eev1DD;IACE,YAAA;Ify1DD;Ee11DD;IACE,qBAAA;If41DD;Ee71DD;IACE,qBAAA;If+1DD;Eeh2DD;IACE,YAAA;Ifk2DD;Een2DD;IACE,qBAAA;Ifq2DD;Eet2DD;IACE,oBAAA;Ifw2DD;Ee11DD;IACE,aAAA;If41DD;Ee71DD;IACE,qBAAA;If+1DD;Eeh2DD;IACE,qBAAA;Ifk2DD;Een2DD;IACE,YAAA;Ifq2DD;Eet2DD;IACE,qBAAA;Ifw2DD;Eez2DD;IACE,qBAAA;If22DD;Ee52DD;IACE,YAAA;If82DD;Ee/2DD;IACE,qBAAA;Ifi3DD;Eel3DD;IACE,qBAAA;Ifo3DD;Eer3DD;IACE,YAAA;Ifu3DD;Eex3DD;IACE,qBAAA;If03DD;Ee33DD;IACE,oBAAA;If63DD;Eez3DD;IACE,aAAA;If23DD;Ee34DD;IACE,YAAA;If64DD;Ee94DD;IACE,oBAAA;Ifg5DD;Eej5DD;IACE,oBAAA;Ifm5DD;Eep5DD;IACE,WAAA;Ifs5DD;Eev5DD;IACE,oBAAA;Ify5DD;Ee15DD;IACE,oBAAA;If45DD;Ee75DD;IACE,WAAA;If+5DD;Eeh6DD;IACE,oBAAA;Ifk6DD;Een6DD;IACE,oBAAA;Ifq6DD;Eet6DD;IACE,WAAA;Ifw6DD;Eez6DD;IACE,oBAAA;If26DD;Ee56DD;IACE,mBAAA;If86DD;Ee16DD;IACE,YAAA;If46DD;Ee95DD;IACE,mBAAA;Ifg6DD;Eej6DD;IACE,2BAAA;Ifm6DD;Eep6DD;IACE,2BAAA;Ifs6DD;Eev6DD;IACE,kBAAA;Ify6DD;Ee16DD;IACE,2BAAA;If46DD;Ee76DD;IACE,2BAAA;If+6DD;Eeh7DD;IACE,kBAAA;Ifk7DD;Een7DD;IACE,2BAAA;Ifq7DD;Eet7DD;IACE,2BAAA;Ifw7DD;Eez7DD;IACE,kBAAA;If27DD;Ee57DD;IACE,2BAAA;If87DD;Ee/7DD;IACE,0BAAA;Ifi8DD;Eel8DD;IACE,iBAAA;Ifo8DD;EACF;Aaz7DD;EE9CI;IACE,aAAA;If0+DH;Een+DD;IACE,aAAA;Ifq+DD;Eet+DD;IACE,qBAAA;Ifw+DD;Eez+DD;IACE,qBAAA;If2+DD;Ee5+DD;IACE,YAAA;If8+DD;Ee/+DD;IACE,qBAAA;Ifi/DD;Eel/DD;IACE,qBAAA;Ifo/DD;Eer/DD;IACE,YAAA;Ifu/DD;Eex/DD;IACE,qBAAA;If0/DD;Ee3/DD;IACE,qBAAA;If6/DD;Ee9/DD;IACE,YAAA;IfggED;EejgED;IACE,qBAAA;IfmgED;EepgED;IACE,oBAAA;IfsgED;Eex/DD;IACE,aAAA;If0/DD;Ee3/DD;IACE,qBAAA;If6/DD;Ee9/DD;IACE,qBAAA;IfggED;EejgED;IACE,YAAA;IfmgED;EepgED;IACE,qBAAA;IfsgED;EevgED;IACE,qBAAA;IfygED;Ee1gED;IACE,YAAA;If4gED;Ee7gED;IACE,qBAAA;If+gED;EehhED;IACE,qBAAA;IfkhED;EenhED;IACE,YAAA;IfqhED;EethED;IACE,qBAAA;IfwhED;EezhED;IACE,oBAAA;If2hED;EevhED;IACE,aAAA;IfyhED;EeziED;IACE,YAAA;If2iED;Ee5iED;IACE,oBAAA;If8iED;Ee/iED;IACE,oBAAA;IfijED;EeljED;IACE,WAAA;IfojED;EerjED;IACE,oBAAA;IfujED;EexjED;IACE,oBAAA;If0jED;Ee3jED;IACE,WAAA;If6jED;Ee9jED;IACE,oBAAA;IfgkED;EejkED;IACE,oBAAA;IfmkED;EepkED;IACE,WAAA;IfskED;EevkED;IACE,oBAAA;IfykED;Ee1kED;IACE,mBAAA;If4kED;EexkED;IACE,YAAA;If0kED;Ee5jED;IACE,mBAAA;If8jED;Ee/jED;IACE,2BAAA;IfikED;EelkED;IACE,2BAAA;IfokED;EerkED;IACE,kBAAA;IfukED;EexkED;IACE,2BAAA;If0kED;Ee3kED;IACE,2BAAA;If6kED;Ee9kED;IACE,kBAAA;IfglED;EejlED;IACE,2BAAA;IfmlED;EeplED;IACE,2BAAA;IfslED;EevlED;IACE,kBAAA;IfylED;Ee1lED;IACE,2BAAA;If4lED;Ee7lED;IACE,0BAAA;If+lED;EehmED;IACE,iBAAA;IfkmED;EACF;AgBtqED;EACE,+BAAA;EhBwqED;AgBtqED;EACE,kBAAA;EACA,qBAAA;EACA,gBAAA;EACA,kBAAA;EhBwqED;AgBtqED;EACE,kBAAA;EhBwqED;AgBlqED;EACE,aAAA;EACA,iBAAA;EACA,qBAAA;EhBoqED;AgBvqED;;;;;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","file":"bootstrap.css","sourcesContent":["/*! normalize.css v3.0.2 | MIT License | git.io/normalize */\nhtml {\n font-family: sans-serif;\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%;\n}\nbody {\n margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block;\n vertical-align: baseline;\n}\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n[hidden],\ntemplate {\n display: none;\n}\na {\n background-color: transparent;\n}\na:active,\na:hover {\n outline: 0;\n}\nabbr[title] {\n border-bottom: 1px dotted;\n}\nb,\nstrong {\n font-weight: bold;\n}\ndfn {\n font-style: italic;\n}\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\nmark {\n background: #ff0;\n color: #000;\n}\nsmall {\n font-size: 80%;\n}\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\nsup {\n top: -0.5em;\n}\nsub {\n bottom: -0.25em;\n}\nimg {\n border: 0;\n}\nsvg:not(:root) {\n overflow: hidden;\n}\nfigure {\n margin: 1em 40px;\n}\nhr {\n -moz-box-sizing: content-box;\n box-sizing: content-box;\n height: 0;\n}\npre {\n overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit;\n font: inherit;\n margin: 0;\n}\nbutton {\n overflow: visible;\n}\nbutton,\nselect {\n text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button;\n cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\ninput {\n line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box;\n padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: textfield;\n -moz-box-sizing: content-box;\n -webkit-box-sizing: content-box;\n box-sizing: content-box;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\nlegend {\n border: 0;\n padding: 0;\n}\ntextarea {\n overflow: auto;\n}\noptgroup {\n font-weight: bold;\n}\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\ntd,\nth {\n padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important;\n box-shadow: none !important;\n text-shadow: none !important;\n }\n a,\n a:visited {\n text-decoration: underline;\n }\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n img {\n max-width: 100% !important;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n select {\n background: #fff !important;\n }\n .navbar {\n display: none;\n }\n .btn > .caret,\n .dropup > .btn > .caret {\n border-top-color: #000 !important;\n }\n .label {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #ddd !important;\n }\n}\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('../fonts/glyphicons-halflings-regular.eot');\n src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');\n}\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n content: \"\\2a\";\n}\n.glyphicon-plus:before {\n content: \"\\2b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n content: \"\\270f\";\n}\n.glyphicon-glass:before {\n content: \"\\e001\";\n}\n.glyphicon-music:before {\n content: \"\\e002\";\n}\n.glyphicon-search:before {\n content: \"\\e003\";\n}\n.glyphicon-heart:before {\n content: \"\\e005\";\n}\n.glyphicon-star:before {\n content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n content: \"\\e007\";\n}\n.glyphicon-user:before {\n content: \"\\e008\";\n}\n.glyphicon-film:before {\n content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n content: \"\\e010\";\n}\n.glyphicon-th:before {\n content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n content: \"\\e012\";\n}\n.glyphicon-ok:before {\n content: \"\\e013\";\n}\n.glyphicon-remove:before {\n content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n content: \"\\e016\";\n}\n.glyphicon-off:before {\n content: \"\\e017\";\n}\n.glyphicon-signal:before {\n content: \"\\e018\";\n}\n.glyphicon-cog:before {\n content: \"\\e019\";\n}\n.glyphicon-trash:before {\n content: \"\\e020\";\n}\n.glyphicon-home:before {\n content: \"\\e021\";\n}\n.glyphicon-file:before {\n content: \"\\e022\";\n}\n.glyphicon-time:before {\n content: \"\\e023\";\n}\n.glyphicon-road:before {\n content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n content: \"\\e025\";\n}\n.glyphicon-download:before {\n content: \"\\e026\";\n}\n.glyphicon-upload:before {\n content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n content: \"\\e032\";\n}\n.glyphicon-lock:before {\n content: \"\\e033\";\n}\n.glyphicon-flag:before {\n content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n content: \"\\e040\";\n}\n.glyphicon-tag:before {\n content: \"\\e041\";\n}\n.glyphicon-tags:before {\n content: \"\\e042\";\n}\n.glyphicon-book:before {\n content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n content: \"\\e044\";\n}\n.glyphicon-print:before {\n content: \"\\e045\";\n}\n.glyphicon-camera:before {\n content: \"\\e046\";\n}\n.glyphicon-font:before {\n content: \"\\e047\";\n}\n.glyphicon-bold:before {\n content: \"\\e048\";\n}\n.glyphicon-italic:before {\n content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n content: \"\\e055\";\n}\n.glyphicon-list:before {\n content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n content: \"\\e059\";\n}\n.glyphicon-picture:before {\n content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n content: \"\\e063\";\n}\n.glyphicon-tint:before {\n content: \"\\e064\";\n}\n.glyphicon-edit:before {\n content: \"\\e065\";\n}\n.glyphicon-share:before {\n content: \"\\e066\";\n}\n.glyphicon-check:before {\n content: \"\\e067\";\n}\n.glyphicon-move:before {\n content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n content: \"\\e070\";\n}\n.glyphicon-backward:before {\n content: \"\\e071\";\n}\n.glyphicon-play:before {\n content: \"\\e072\";\n}\n.glyphicon-pause:before {\n content: \"\\e073\";\n}\n.glyphicon-stop:before {\n content: \"\\e074\";\n}\n.glyphicon-forward:before {\n content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n content: \"\\e077\";\n}\n.glyphicon-eject:before {\n content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n content: \"\\e101\";\n}\n.glyphicon-gift:before {\n content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n content: \"\\e103\";\n}\n.glyphicon-fire:before {\n content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n content: \"\\e107\";\n}\n.glyphicon-plane:before {\n content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n content: \"\\e109\";\n}\n.glyphicon-random:before {\n content: \"\\e110\";\n}\n.glyphicon-comment:before {\n content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n content: \"\\e122\";\n}\n.glyphicon-bell:before {\n content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n content: \"\\e134\";\n}\n.glyphicon-globe:before {\n content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n content: \"\\e137\";\n}\n.glyphicon-filter:before {\n content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n content: \"\\e143\";\n}\n.glyphicon-link:before {\n content: \"\\e144\";\n}\n.glyphicon-phone:before {\n content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n content: \"\\e146\";\n}\n.glyphicon-usd:before {\n content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n content: \"\\e149\";\n}\n.glyphicon-sort:before {\n content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n content: \"\\e157\";\n}\n.glyphicon-expand:before {\n content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n content: \"\\e161\";\n}\n.glyphicon-flash:before {\n content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n content: \"\\e164\";\n}\n.glyphicon-record:before {\n content: \"\\e165\";\n}\n.glyphicon-save:before {\n content: \"\\e166\";\n}\n.glyphicon-open:before {\n content: \"\\e167\";\n}\n.glyphicon-saved:before {\n content: \"\\e168\";\n}\n.glyphicon-import:before {\n content: \"\\e169\";\n}\n.glyphicon-export:before {\n content: \"\\e170\";\n}\n.glyphicon-send:before {\n content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n content: \"\\e179\";\n}\n.glyphicon-header:before {\n content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n content: \"\\e183\";\n}\n.glyphicon-tower:before {\n content: \"\\e184\";\n}\n.glyphicon-stats:before {\n content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n content: \"\\e200\";\n}\n.glyphicon-cd:before {\n content: \"\\e201\";\n}\n.glyphicon-save-file:before {\n content: \"\\e202\";\n}\n.glyphicon-open-file:before {\n content: \"\\e203\";\n}\n.glyphicon-level-up:before {\n content: \"\\e204\";\n}\n.glyphicon-copy:before {\n content: \"\\e205\";\n}\n.glyphicon-paste:before {\n content: \"\\e206\";\n}\n.glyphicon-door:before {\n content: \"\\1f6aa\";\n}\n.glyphicon-key:before {\n content: \"\\1F511\";\n}\n.glyphicon-alert:before {\n content: \"\\e209\";\n}\n.glyphicon-equalizer:before {\n content: \"\\e210\";\n}\n.glyphicon-king:before {\n content: \"\\e211\";\n}\n.glyphicon-queen:before {\n content: \"\\e212\";\n}\n.glyphicon-pawn:before {\n content: \"\\e213\";\n}\n.glyphicon-bishop:before {\n content: \"\\e214\";\n}\n.glyphicon-knight:before {\n content: \"\\e215\";\n}\n.glyphicon-baby-formula:before {\n content: \"\\e216\";\n}\n.glyphicon-tent:before {\n content: \"\\26fa\";\n}\n.glyphicon-blackboard:before {\n content: \"\\e218\";\n}\n.glyphicon-bed:before {\n content: \"\\e219\";\n}\n.glyphicon-apple:before {\n content: \"\\f8ff\";\n}\n.glyphicon-erase:before {\n content: \"\\e221\";\n}\n.glyphicon-hourglass:before {\n content: \"\\231b\";\n}\n.glyphicon-lamp:before {\n content: \"\\e223\";\n}\n.glyphicon-duplicate:before {\n content: \"\\e224\";\n}\n.glyphicon-piggy-bank:before {\n content: \"\\e225\";\n}\n.glyphicon-scissors:before {\n content: \"\\e226\";\n}\n.glyphicon-bitcoin:before {\n content: \"\\e227\";\n}\n.glyphicon-yen:before {\n content: \"\\00a5\";\n}\n.glyphicon-ruble:before {\n content: \"\\20bd\";\n}\n.glyphicon-scale:before {\n content: \"\\e230\";\n}\n.glyphicon-ice-lolly:before {\n content: \"\\e231\";\n}\n.glyphicon-ice-lolly-tasted:before {\n content: \"\\e232\";\n}\n.glyphicon-education:before {\n content: \"\\e233\";\n}\n.glyphicon-option-horizontal:before {\n content: \"\\e234\";\n}\n.glyphicon-option-vertical:before {\n content: \"\\e235\";\n}\n.glyphicon-menu-hamburger:before {\n content: \"\\e236\";\n}\n.glyphicon-modal-window:before {\n content: \"\\e237\";\n}\n.glyphicon-oil:before {\n content: \"\\e238\";\n}\n.glyphicon-grain:before {\n content: \"\\e239\";\n}\n.glyphicon-sunglasses:before {\n content: \"\\e240\";\n}\n.glyphicon-text-size:before {\n content: \"\\e241\";\n}\n.glyphicon-text-color:before {\n content: \"\\e242\";\n}\n.glyphicon-text-background:before {\n content: \"\\e243\";\n}\n.glyphicon-object-align-top:before {\n content: \"\\e244\";\n}\n.glyphicon-object-align-bottom:before {\n content: \"\\e245\";\n}\n.glyphicon-object-align-horizontal:before {\n content: \"\\e246\";\n}\n.glyphicon-object-align-left:before {\n content: \"\\e247\";\n}\n.glyphicon-object-align-vertical:before {\n content: \"\\e248\";\n}\n.glyphicon-object-align-right:before {\n content: \"\\e249\";\n}\n.glyphicon-triangle-right:before {\n content: \"\\e250\";\n}\n.glyphicon-triangle-left:before {\n content: \"\\e251\";\n}\n.glyphicon-triangle-bottom:before {\n content: \"\\e252\";\n}\n.glyphicon-triangle-top:before {\n content: \"\\e253\";\n}\n.glyphicon-console:before {\n content: \"\\e254\";\n}\n.glyphicon-superscript:before {\n content: \"\\e255\";\n}\n.glyphicon-subscript:before {\n content: \"\\e256\";\n}\n.glyphicon-menu-left:before {\n content: \"\\e257\";\n}\n.glyphicon-menu-right:before {\n content: \"\\e258\";\n}\n.glyphicon-menu-down:before {\n content: \"\\e259\";\n}\n.glyphicon-menu-up:before {\n content: \"\\e260\";\n}\n* {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n*:before,\n*:after {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 14px;\n line-height: 1.42857143;\n color: #333333;\n background-color: #ffffff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\na {\n color: #337ab7;\n text-decoration: none;\n}\na:hover,\na:focus {\n color: #23527c;\n text-decoration: underline;\n}\na:focus {\n outline: thin dotted;\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\nfigure {\n margin: 0;\n}\nimg {\n vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n display: block;\n max-width: 100%;\n height: auto;\n}\n.img-rounded {\n border-radius: 6px;\n}\n.img-thumbnail {\n padding: 4px;\n line-height: 1.42857143;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n border-radius: 4px;\n -webkit-transition: all 0.2s ease-in-out;\n -o-transition: all 0.2s ease-in-out;\n transition: all 0.2s ease-in-out;\n display: inline-block;\n max-width: 100%;\n height: auto;\n}\n.img-circle {\n border-radius: 50%;\n}\nhr {\n margin-top: 20px;\n margin-bottom: 20px;\n border: 0;\n border-top: 1px solid #eeeeee;\n}\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n font-family: inherit;\n font-weight: 500;\n line-height: 1.1;\n color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n font-weight: normal;\n line-height: 1;\n color: #777777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n margin-top: 20px;\n margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n margin-top: 10px;\n margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n font-size: 75%;\n}\nh1,\n.h1 {\n font-size: 36px;\n}\nh2,\n.h2 {\n font-size: 30px;\n}\nh3,\n.h3 {\n font-size: 24px;\n}\nh4,\n.h4 {\n font-size: 18px;\n}\nh5,\n.h5 {\n font-size: 14px;\n}\nh6,\n.h6 {\n font-size: 12px;\n}\np {\n margin: 0 0 10px;\n}\n.lead {\n margin-bottom: 20px;\n font-size: 16px;\n font-weight: 300;\n line-height: 1.4;\n}\n@media (min-width: 768px) {\n .lead {\n font-size: 21px;\n }\n}\nsmall,\n.small {\n font-size: 85%;\n}\nmark,\n.mark {\n background-color: #fcf8e3;\n padding: .2em;\n}\n.text-left {\n text-align: left;\n}\n.text-right {\n text-align: right;\n}\n.text-center {\n text-align: center;\n}\n.text-justify {\n text-align: justify;\n}\n.text-nowrap {\n white-space: nowrap;\n}\n.text-lowercase {\n text-transform: lowercase;\n}\n.text-uppercase {\n text-transform: uppercase;\n}\n.text-capitalize {\n text-transform: capitalize;\n}\n.text-muted {\n color: #777777;\n}\n.text-primary {\n color: #337ab7;\n}\na.text-primary:hover {\n color: #286090;\n}\n.text-success {\n color: #3c763d;\n}\na.text-success:hover {\n color: #2b542c;\n}\n.text-info {\n color: #31708f;\n}\na.text-info:hover {\n color: #245269;\n}\n.text-warning {\n color: #8a6d3b;\n}\na.text-warning:hover {\n color: #66512c;\n}\n.text-danger {\n color: #a94442;\n}\na.text-danger:hover {\n color: #843534;\n}\n.bg-primary {\n color: #fff;\n background-color: #337ab7;\n}\na.bg-primary:hover {\n background-color: #286090;\n}\n.bg-success {\n background-color: #dff0d8;\n}\na.bg-success:hover {\n background-color: #c1e2b3;\n}\n.bg-info {\n background-color: #d9edf7;\n}\na.bg-info:hover {\n background-color: #afd9ee;\n}\n.bg-warning {\n background-color: #fcf8e3;\n}\na.bg-warning:hover {\n background-color: #f7ecb5;\n}\n.bg-danger {\n background-color: #f2dede;\n}\na.bg-danger:hover {\n background-color: #e4b9b9;\n}\n.page-header {\n padding-bottom: 9px;\n margin: 40px 0 20px;\n border-bottom: 1px solid #eeeeee;\n}\nul,\nol {\n margin-top: 0;\n margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n margin-bottom: 0;\n}\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n.list-inline {\n padding-left: 0;\n list-style: none;\n margin-left: -5px;\n}\n.list-inline > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n}\ndl {\n margin-top: 0;\n margin-bottom: 20px;\n}\ndt,\ndd {\n line-height: 1.42857143;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0;\n}\n@media (min-width: 768px) {\n .dl-horizontal dt {\n float: left;\n width: 160px;\n clear: left;\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .dl-horizontal dd {\n margin-left: 180px;\n }\n}\nabbr[title],\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted #777777;\n}\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\nblockquote {\n padding: 10px 20px;\n margin: 0 0 20px;\n font-size: 17.5px;\n border-left: 5px solid #eeeeee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n display: block;\n font-size: 80%;\n line-height: 1.42857143;\n color: #777777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n content: '\\2014 \\00A0';\n}\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid #eeeeee;\n border-left: 0;\n text-align: right;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n content: '';\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n content: '\\00A0 \\2014';\n}\naddress {\n margin-bottom: 20px;\n font-style: normal;\n line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: #c7254e;\n background-color: #f9f2f4;\n border-radius: 4px;\n}\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: #ffffff;\n background-color: #333333;\n border-radius: 3px;\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none;\n}\npre {\n display: block;\n padding: 9.5px;\n margin: 0 0 10px;\n font-size: 13px;\n line-height: 1.42857143;\n word-break: break-all;\n word-wrap: break-word;\n color: #333333;\n background-color: #f5f5f5;\n border: 1px solid #cccccc;\n border-radius: 4px;\n}\npre code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n}\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n.container {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n}\n@media (min-width: 768px) {\n .container {\n width: 750px;\n }\n}\n@media (min-width: 992px) {\n .container {\n width: 970px;\n }\n}\n@media (min-width: 1200px) {\n .container {\n width: 1170px;\n }\n}\n.container-fluid {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n}\n.row {\n margin-left: -15px;\n margin-right: -15px;\n}\n.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {\n position: relative;\n min-height: 1px;\n padding-left: 15px;\n padding-right: 15px;\n}\n.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {\n float: left;\n}\n.col-xs-12 {\n width: 100%;\n}\n.col-xs-11 {\n width: 91.66666667%;\n}\n.col-xs-10 {\n width: 83.33333333%;\n}\n.col-xs-9 {\n width: 75%;\n}\n.col-xs-8 {\n width: 66.66666667%;\n}\n.col-xs-7 {\n width: 58.33333333%;\n}\n.col-xs-6 {\n width: 50%;\n}\n.col-xs-5 {\n width: 41.66666667%;\n}\n.col-xs-4 {\n width: 33.33333333%;\n}\n.col-xs-3 {\n width: 25%;\n}\n.col-xs-2 {\n width: 16.66666667%;\n}\n.col-xs-1 {\n width: 8.33333333%;\n}\n.col-xs-pull-12 {\n right: 100%;\n}\n.col-xs-pull-11 {\n right: 91.66666667%;\n}\n.col-xs-pull-10 {\n right: 83.33333333%;\n}\n.col-xs-pull-9 {\n right: 75%;\n}\n.col-xs-pull-8 {\n right: 66.66666667%;\n}\n.col-xs-pull-7 {\n right: 58.33333333%;\n}\n.col-xs-pull-6 {\n right: 50%;\n}\n.col-xs-pull-5 {\n right: 41.66666667%;\n}\n.col-xs-pull-4 {\n right: 33.33333333%;\n}\n.col-xs-pull-3 {\n right: 25%;\n}\n.col-xs-pull-2 {\n right: 16.66666667%;\n}\n.col-xs-pull-1 {\n right: 8.33333333%;\n}\n.col-xs-pull-0 {\n right: auto;\n}\n.col-xs-push-12 {\n left: 100%;\n}\n.col-xs-push-11 {\n left: 91.66666667%;\n}\n.col-xs-push-10 {\n left: 83.33333333%;\n}\n.col-xs-push-9 {\n left: 75%;\n}\n.col-xs-push-8 {\n left: 66.66666667%;\n}\n.col-xs-push-7 {\n left: 58.33333333%;\n}\n.col-xs-push-6 {\n left: 50%;\n}\n.col-xs-push-5 {\n left: 41.66666667%;\n}\n.col-xs-push-4 {\n left: 33.33333333%;\n}\n.col-xs-push-3 {\n left: 25%;\n}\n.col-xs-push-2 {\n left: 16.66666667%;\n}\n.col-xs-push-1 {\n left: 8.33333333%;\n}\n.col-xs-push-0 {\n left: auto;\n}\n.col-xs-offset-12 {\n margin-left: 100%;\n}\n.col-xs-offset-11 {\n margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n margin-left: 75%;\n}\n.col-xs-offset-8 {\n margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n margin-left: 50%;\n}\n.col-xs-offset-5 {\n margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n margin-left: 25%;\n}\n.col-xs-offset-2 {\n margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n margin-left: 0%;\n}\n@media (min-width: 768px) {\n .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {\n float: left;\n }\n .col-sm-12 {\n width: 100%;\n }\n .col-sm-11 {\n width: 91.66666667%;\n }\n .col-sm-10 {\n width: 83.33333333%;\n }\n .col-sm-9 {\n width: 75%;\n }\n .col-sm-8 {\n width: 66.66666667%;\n }\n .col-sm-7 {\n width: 58.33333333%;\n }\n .col-sm-6 {\n width: 50%;\n }\n .col-sm-5 {\n width: 41.66666667%;\n }\n .col-sm-4 {\n width: 33.33333333%;\n }\n .col-sm-3 {\n width: 25%;\n }\n .col-sm-2 {\n width: 16.66666667%;\n }\n .col-sm-1 {\n width: 8.33333333%;\n }\n .col-sm-pull-12 {\n right: 100%;\n }\n .col-sm-pull-11 {\n right: 91.66666667%;\n }\n .col-sm-pull-10 {\n right: 83.33333333%;\n }\n .col-sm-pull-9 {\n right: 75%;\n }\n .col-sm-pull-8 {\n right: 66.66666667%;\n }\n .col-sm-pull-7 {\n right: 58.33333333%;\n }\n .col-sm-pull-6 {\n right: 50%;\n }\n .col-sm-pull-5 {\n right: 41.66666667%;\n }\n .col-sm-pull-4 {\n right: 33.33333333%;\n }\n .col-sm-pull-3 {\n right: 25%;\n }\n .col-sm-pull-2 {\n right: 16.66666667%;\n }\n .col-sm-pull-1 {\n right: 8.33333333%;\n }\n .col-sm-pull-0 {\n right: auto;\n }\n .col-sm-push-12 {\n left: 100%;\n }\n .col-sm-push-11 {\n left: 91.66666667%;\n }\n .col-sm-push-10 {\n left: 83.33333333%;\n }\n .col-sm-push-9 {\n left: 75%;\n }\n .col-sm-push-8 {\n left: 66.66666667%;\n }\n .col-sm-push-7 {\n left: 58.33333333%;\n }\n .col-sm-push-6 {\n left: 50%;\n }\n .col-sm-push-5 {\n left: 41.66666667%;\n }\n .col-sm-push-4 {\n left: 33.33333333%;\n }\n .col-sm-push-3 {\n left: 25%;\n }\n .col-sm-push-2 {\n left: 16.66666667%;\n }\n .col-sm-push-1 {\n left: 8.33333333%;\n }\n .col-sm-push-0 {\n left: auto;\n }\n .col-sm-offset-12 {\n margin-left: 100%;\n }\n .col-sm-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-sm-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-sm-offset-9 {\n margin-left: 75%;\n }\n .col-sm-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-sm-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-sm-offset-6 {\n margin-left: 50%;\n }\n .col-sm-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-sm-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-sm-offset-3 {\n margin-left: 25%;\n }\n .col-sm-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-sm-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-sm-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 992px) {\n .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {\n float: left;\n }\n .col-md-12 {\n width: 100%;\n }\n .col-md-11 {\n width: 91.66666667%;\n }\n .col-md-10 {\n width: 83.33333333%;\n }\n .col-md-9 {\n width: 75%;\n }\n .col-md-8 {\n width: 66.66666667%;\n }\n .col-md-7 {\n width: 58.33333333%;\n }\n .col-md-6 {\n width: 50%;\n }\n .col-md-5 {\n width: 41.66666667%;\n }\n .col-md-4 {\n width: 33.33333333%;\n }\n .col-md-3 {\n width: 25%;\n }\n .col-md-2 {\n width: 16.66666667%;\n }\n .col-md-1 {\n width: 8.33333333%;\n }\n .col-md-pull-12 {\n right: 100%;\n }\n .col-md-pull-11 {\n right: 91.66666667%;\n }\n .col-md-pull-10 {\n right: 83.33333333%;\n }\n .col-md-pull-9 {\n right: 75%;\n }\n .col-md-pull-8 {\n right: 66.66666667%;\n }\n .col-md-pull-7 {\n right: 58.33333333%;\n }\n .col-md-pull-6 {\n right: 50%;\n }\n .col-md-pull-5 {\n right: 41.66666667%;\n }\n .col-md-pull-4 {\n right: 33.33333333%;\n }\n .col-md-pull-3 {\n right: 25%;\n }\n .col-md-pull-2 {\n right: 16.66666667%;\n }\n .col-md-pull-1 {\n right: 8.33333333%;\n }\n .col-md-pull-0 {\n right: auto;\n }\n .col-md-push-12 {\n left: 100%;\n }\n .col-md-push-11 {\n left: 91.66666667%;\n }\n .col-md-push-10 {\n left: 83.33333333%;\n }\n .col-md-push-9 {\n left: 75%;\n }\n .col-md-push-8 {\n left: 66.66666667%;\n }\n .col-md-push-7 {\n left: 58.33333333%;\n }\n .col-md-push-6 {\n left: 50%;\n }\n .col-md-push-5 {\n left: 41.66666667%;\n }\n .col-md-push-4 {\n left: 33.33333333%;\n }\n .col-md-push-3 {\n left: 25%;\n }\n .col-md-push-2 {\n left: 16.66666667%;\n }\n .col-md-push-1 {\n left: 8.33333333%;\n }\n .col-md-push-0 {\n left: auto;\n }\n .col-md-offset-12 {\n margin-left: 100%;\n }\n .col-md-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-md-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-md-offset-9 {\n margin-left: 75%;\n }\n .col-md-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-md-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-md-offset-6 {\n margin-left: 50%;\n }\n .col-md-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-md-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-md-offset-3 {\n margin-left: 25%;\n }\n .col-md-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-md-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-md-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 1200px) {\n .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {\n float: left;\n }\n .col-lg-12 {\n width: 100%;\n }\n .col-lg-11 {\n width: 91.66666667%;\n }\n .col-lg-10 {\n width: 83.33333333%;\n }\n .col-lg-9 {\n width: 75%;\n }\n .col-lg-8 {\n width: 66.66666667%;\n }\n .col-lg-7 {\n width: 58.33333333%;\n }\n .col-lg-6 {\n width: 50%;\n }\n .col-lg-5 {\n width: 41.66666667%;\n }\n .col-lg-4 {\n width: 33.33333333%;\n }\n .col-lg-3 {\n width: 25%;\n }\n .col-lg-2 {\n width: 16.66666667%;\n }\n .col-lg-1 {\n width: 8.33333333%;\n }\n .col-lg-pull-12 {\n right: 100%;\n }\n .col-lg-pull-11 {\n right: 91.66666667%;\n }\n .col-lg-pull-10 {\n right: 83.33333333%;\n }\n .col-lg-pull-9 {\n right: 75%;\n }\n .col-lg-pull-8 {\n right: 66.66666667%;\n }\n .col-lg-pull-7 {\n right: 58.33333333%;\n }\n .col-lg-pull-6 {\n right: 50%;\n }\n .col-lg-pull-5 {\n right: 41.66666667%;\n }\n .col-lg-pull-4 {\n right: 33.33333333%;\n }\n .col-lg-pull-3 {\n right: 25%;\n }\n .col-lg-pull-2 {\n right: 16.66666667%;\n }\n .col-lg-pull-1 {\n right: 8.33333333%;\n }\n .col-lg-pull-0 {\n right: auto;\n }\n .col-lg-push-12 {\n left: 100%;\n }\n .col-lg-push-11 {\n left: 91.66666667%;\n }\n .col-lg-push-10 {\n left: 83.33333333%;\n }\n .col-lg-push-9 {\n left: 75%;\n }\n .col-lg-push-8 {\n left: 66.66666667%;\n }\n .col-lg-push-7 {\n left: 58.33333333%;\n }\n .col-lg-push-6 {\n left: 50%;\n }\n .col-lg-push-5 {\n left: 41.66666667%;\n }\n .col-lg-push-4 {\n left: 33.33333333%;\n }\n .col-lg-push-3 {\n left: 25%;\n }\n .col-lg-push-2 {\n left: 16.66666667%;\n }\n .col-lg-push-1 {\n left: 8.33333333%;\n }\n .col-lg-push-0 {\n left: auto;\n }\n .col-lg-offset-12 {\n margin-left: 100%;\n }\n .col-lg-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-lg-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-lg-offset-9 {\n margin-left: 75%;\n }\n .col-lg-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-lg-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-lg-offset-6 {\n margin-left: 50%;\n }\n .col-lg-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-lg-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-lg-offset-3 {\n margin-left: 25%;\n }\n .col-lg-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-lg-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-lg-offset-0 {\n margin-left: 0%;\n }\n}\ntable {\n background-color: transparent;\n}\ncaption {\n padding-top: 8px;\n padding-bottom: 8px;\n color: #777777;\n text-align: left;\n}\nth {\n text-align: left;\n}\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n padding: 8px;\n line-height: 1.42857143;\n vertical-align: top;\n border-top: 1px solid #dddddd;\n}\n.table > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid #dddddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n border-top: 0;\n}\n.table > tbody + tbody {\n border-top: 2px solid #dddddd;\n}\n.table .table {\n background-color: #ffffff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n padding: 5px;\n}\n.table-bordered {\n border: 1px solid #dddddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n border: 1px solid #dddddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-child(odd) {\n background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-column;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-cell;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n background-color: #ebcccc;\n}\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%;\n}\n@media screen and (max-width: 767px) {\n .table-responsive {\n width: 100%;\n margin-bottom: 15px;\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid #dddddd;\n }\n .table-responsive > .table {\n margin-bottom: 0;\n }\n .table-responsive > .table > thead > tr > th,\n .table-responsive > .table > tbody > tr > th,\n .table-responsive > .table > tfoot > tr > th,\n .table-responsive > .table > thead > tr > td,\n .table-responsive > .table > tbody > tr > td,\n .table-responsive > .table > tfoot > tr > td {\n white-space: nowrap;\n }\n .table-responsive > .table-bordered {\n border: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:first-child,\n .table-responsive > .table-bordered > tbody > tr > th:first-child,\n .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n .table-responsive > .table-bordered > thead > tr > td:first-child,\n .table-responsive > .table-bordered > tbody > tr > td:first-child,\n .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:last-child,\n .table-responsive > .table-bordered > tbody > tr > th:last-child,\n .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n .table-responsive > .table-bordered > thead > tr > td:last-child,\n .table-responsive > .table-bordered > tbody > tr > td:last-child,\n .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n }\n .table-responsive > .table-bordered > tbody > tr:last-child > th,\n .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n .table-responsive > .table-bordered > tbody > tr:last-child > td,\n .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n border-bottom: 0;\n }\n}\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n min-width: 0;\n}\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: 20px;\n font-size: 21px;\n line-height: inherit;\n color: #333333;\n border: 0;\n border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n display: inline-block;\n max-width: 100%;\n margin-bottom: 5px;\n font-weight: bold;\n}\ninput[type=\"search\"] {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9;\n line-height: normal;\n}\ninput[type=\"file\"] {\n display: block;\n}\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\nselect[multiple],\nselect[size] {\n height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n outline: thin dotted;\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\noutput {\n display: block;\n padding-top: 7px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n}\n.form-control {\n display: block;\n width: 100%;\n height: 34px;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n background-color: #ffffff;\n background-image: none;\n border: 1px solid #cccccc;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n border-color: #66afe9;\n outline: 0;\n -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n.form-control::-moz-placeholder {\n color: #999999;\n opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n color: #999999;\n}\n.form-control::-webkit-input-placeholder {\n color: #999999;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n cursor: not-allowed;\n background-color: #eeeeee;\n opacity: 1;\n}\ntextarea.form-control {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: none;\n}\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"],\n input[type=\"time\"],\n input[type=\"datetime-local\"],\n input[type=\"month\"] {\n line-height: 34px;\n }\n input[type=\"date\"].input-sm,\n input[type=\"time\"].input-sm,\n input[type=\"datetime-local\"].input-sm,\n input[type=\"month\"].input-sm {\n line-height: 30px;\n }\n input[type=\"date\"].input-lg,\n input[type=\"time\"].input-lg,\n input[type=\"datetime-local\"].input-lg,\n input[type=\"month\"].input-lg {\n line-height: 46px;\n }\n}\n.form-group {\n margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.radio label,\n.checkbox label {\n min-height: 20px;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-left: -20px;\n margin-top: 4px \\9;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n vertical-align: middle;\n font-weight: normal;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n cursor: not-allowed;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n cursor: not-allowed;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n cursor: not-allowed;\n}\n.form-control-static {\n padding-top: 7px;\n padding-bottom: 7px;\n margin-bottom: 0;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n padding-left: 0;\n padding-right: 0;\n}\n.input-sm {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-sm {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-sm,\nselect[multiple].input-sm {\n height: auto;\n}\n.form-group-sm .form-control {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.form-group-sm .form-control {\n height: 30px;\n line-height: 30px;\n}\ntextarea.form-group-sm .form-control,\nselect[multiple].form-group-sm .form-control {\n height: auto;\n}\n.input-lg {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.33;\n border-radius: 6px;\n}\nselect.input-lg {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-lg,\nselect[multiple].input-lg {\n height: auto;\n}\n.form-group-lg .form-control {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.33;\n border-radius: 6px;\n}\nselect.form-group-lg .form-control {\n height: 46px;\n line-height: 46px;\n}\ntextarea.form-group-lg .form-control,\nselect[multiple].form-group-lg .form-control {\n height: auto;\n}\n.has-feedback {\n position: relative;\n}\n.has-feedback .form-control {\n padding-right: 42.5px;\n}\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n display: block;\n width: 34px;\n height: 34px;\n line-height: 34px;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback {\n width: 46px;\n height: 46px;\n line-height: 46px;\n}\n.input-sm + .form-control-feedback {\n width: 30px;\n height: 30px;\n line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n color: #3c763d;\n}\n.has-success .form-control {\n border-color: #3c763d;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-success .form-control:focus {\n border-color: #2b542c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n color: #3c763d;\n border-color: #3c763d;\n background-color: #dff0d8;\n}\n.has-success .form-control-feedback {\n color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n color: #8a6d3b;\n}\n.has-warning .form-control {\n border-color: #8a6d3b;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-warning .form-control:focus {\n border-color: #66512c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n color: #8a6d3b;\n border-color: #8a6d3b;\n background-color: #fcf8e3;\n}\n.has-warning .form-control-feedback {\n color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n color: #a94442;\n}\n.has-error .form-control {\n border-color: #a94442;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-error .form-control:focus {\n border-color: #843534;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n color: #a94442;\n border-color: #a94442;\n background-color: #f2dede;\n}\n.has-error .form-control-feedback {\n color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n top: 0;\n}\n.help-block {\n display: block;\n margin-top: 5px;\n margin-bottom: 10px;\n color: #737373;\n}\n@media (min-width: 768px) {\n .form-inline .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-static {\n display: inline-block;\n }\n .form-inline .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .form-inline .input-group .input-group-addon,\n .form-inline .input-group .input-group-btn,\n .form-inline .input-group .form-control {\n width: auto;\n }\n .form-inline .input-group > .form-control {\n width: 100%;\n }\n .form-inline .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio,\n .form-inline .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio label,\n .form-inline .checkbox label {\n padding-left: 0;\n }\n .form-inline .radio input[type=\"radio\"],\n .form-inline .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .form-inline .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n margin-top: 0;\n margin-bottom: 0;\n padding-top: 7px;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n min-height: 27px;\n}\n.form-horizontal .form-group {\n margin-left: -15px;\n margin-right: -15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .control-label {\n text-align: right;\n margin-bottom: 0;\n padding-top: 7px;\n }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n right: 15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-lg .control-label {\n padding-top: 14.3px;\n }\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-sm .control-label {\n padding-top: 6px;\n }\n}\n.btn {\n display: inline-block;\n margin-bottom: 0;\n font-weight: normal;\n text-align: center;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none;\n border: 1px solid transparent;\n white-space: nowrap;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n border-radius: 4px;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n outline: thin dotted;\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n color: #333333;\n text-decoration: none;\n}\n.btn:active,\n.btn.active {\n outline: 0;\n background-image: none;\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n cursor: not-allowed;\n pointer-events: none;\n opacity: 0.65;\n filter: alpha(opacity=65);\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-default {\n color: #333333;\n background-color: #ffffff;\n border-color: #cccccc;\n}\n.btn-default:hover,\n.btn-default:focus,\n.btn-default.focus,\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n color: #333333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n background-image: none;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n background-color: #ffffff;\n border-color: #cccccc;\n}\n.btn-default .badge {\n color: #ffffff;\n background-color: #333333;\n}\n.btn-primary {\n color: #ffffff;\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary:hover,\n.btn-primary:focus,\n.btn-primary.focus,\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n color: #ffffff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n background-image: none;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary .badge {\n color: #337ab7;\n background-color: #ffffff;\n}\n.btn-success {\n color: #ffffff;\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success:hover,\n.btn-success:focus,\n.btn-success.focus,\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n color: #ffffff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n background-image: none;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success .badge {\n color: #5cb85c;\n background-color: #ffffff;\n}\n.btn-info {\n color: #ffffff;\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info:hover,\n.btn-info:focus,\n.btn-info.focus,\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n color: #ffffff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n background-image: none;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info .badge {\n color: #5bc0de;\n background-color: #ffffff;\n}\n.btn-warning {\n color: #ffffff;\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning:hover,\n.btn-warning:focus,\n.btn-warning.focus,\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n color: #ffffff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n background-image: none;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning .badge {\n color: #f0ad4e;\n background-color: #ffffff;\n}\n.btn-danger {\n color: #ffffff;\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger:hover,\n.btn-danger:focus,\n.btn-danger.focus,\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n color: #ffffff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n background-image: none;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger .badge {\n color: #d9534f;\n background-color: #ffffff;\n}\n.btn-link {\n color: #337ab7;\n font-weight: normal;\n border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n background-color: transparent;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n color: #23527c;\n text-decoration: underline;\n background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n color: #777777;\n text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.33;\n border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n padding: 1px 5px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-block {\n display: block;\n width: 100%;\n}\n.btn-block + .btn-block {\n margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n.fade {\n opacity: 0;\n -webkit-transition: opacity 0.15s linear;\n -o-transition: opacity 0.15s linear;\n transition: opacity 0.15s linear;\n}\n.fade.in {\n opacity: 1;\n}\n.collapse {\n display: none;\n visibility: hidden;\n}\n.collapse.in {\n display: block;\n visibility: visible;\n}\ntr.collapse.in {\n display: table-row;\n}\ntbody.collapse.in {\n display: table-row-group;\n}\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n -webkit-transition-property: height, visibility;\n transition-property: height, visibility;\n -webkit-transition-duration: 0.35s;\n transition-duration: 0.35s;\n -webkit-transition-timing-function: ease;\n transition-timing-function: ease;\n}\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: 4px solid;\n border-right: 4px solid transparent;\n border-left: 4px solid transparent;\n}\n.dropdown {\n position: relative;\n}\n.dropdown-toggle:focus {\n outline: 0;\n}\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0;\n list-style: none;\n font-size: 14px;\n text-align: left;\n background-color: #ffffff;\n border: 1px solid #cccccc;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 4px;\n -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n background-clip: padding-box;\n}\n.dropdown-menu.pull-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu .divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: 1.42857143;\n color: #333333;\n white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n text-decoration: none;\n color: #262626;\n background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n color: #ffffff;\n text-decoration: none;\n outline: 0;\n background-color: #337ab7;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n color: #777777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n cursor: not-allowed;\n}\n.open > .dropdown-menu {\n display: block;\n}\n.open > a {\n outline: 0;\n}\n.dropdown-menu-right {\n left: auto;\n right: 0;\n}\n.dropdown-menu-left {\n left: 0;\n right: auto;\n}\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: 12px;\n line-height: 1.42857143;\n color: #777777;\n white-space: nowrap;\n}\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: 990;\n}\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n border-top: 0;\n border-bottom: 4px solid;\n content: \"\";\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n}\n@media (min-width: 768px) {\n .navbar-right .dropdown-menu {\n left: auto;\n right: 0;\n }\n .navbar-right .dropdown-menu-left {\n left: 0;\n right: auto;\n }\n}\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n z-index: 2;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n margin-left: -1px;\n}\n.btn-toolbar {\n margin-left: -5px;\n}\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n.btn-group > .btn:first-child {\n margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child > .btn:last-child,\n.btn-group > .btn-group:first-child > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group > .btn-group:last-child > .btn:first-child {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n.btn-group.open .dropdown-toggle {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn .caret {\n margin-left: 0;\n}\n.btn-lg .caret {\n border-width: 5px 5px 0;\n border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n border-top-right-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n border-bottom-left-radius: 4px;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n.input-group {\n position: relative;\n display: table;\n border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0;\n}\n.input-group .form-control {\n position: relative;\n z-index: 2;\n float: left;\n width: 100%;\n margin-bottom: 0;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.33;\n border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle;\n}\n.input-group-addon {\n padding: 6px 12px;\n font-size: 14px;\n font-weight: normal;\n line-height: 1;\n color: #555555;\n text-align: center;\n background-color: #eeeeee;\n border: 1px solid #cccccc;\n border-radius: 4px;\n}\n.input-group-addon.input-sm {\n padding: 5px 10px;\n font-size: 12px;\n border-radius: 3px;\n}\n.input-group-addon.input-lg {\n padding: 10px 16px;\n font-size: 18px;\n border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n.input-group-btn {\n position: relative;\n font-size: 0;\n white-space: nowrap;\n}\n.input-group-btn > .btn {\n position: relative;\n}\n.input-group-btn > .btn + .btn {\n margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n margin-left: -1px;\n}\n.nav {\n margin-bottom: 0;\n padding-left: 0;\n list-style: none;\n}\n.nav > li {\n position: relative;\n display: block;\n}\n.nav > li > a {\n position: relative;\n display: block;\n padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.nav > li.disabled > a {\n color: #777777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n color: #777777;\n text-decoration: none;\n background-color: transparent;\n cursor: not-allowed;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n background-color: #eeeeee;\n border-color: #337ab7;\n}\n.nav .nav-divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.nav > li > a > img {\n max-width: none;\n}\n.nav-tabs {\n border-bottom: 1px solid #dddddd;\n}\n.nav-tabs > li {\n float: left;\n margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n margin-right: 2px;\n line-height: 1.42857143;\n border: 1px solid transparent;\n border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n border-color: #eeeeee #eeeeee #dddddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n color: #555555;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n border-bottom-color: transparent;\n cursor: default;\n}\n.nav-tabs.nav-justified {\n width: 100%;\n border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n float: none;\n}\n.nav-tabs.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-tabs.nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs.nav-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n border: 1px solid #dddddd;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li > a {\n border-bottom: 1px solid #dddddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs.nav-justified > .active > a,\n .nav-tabs.nav-justified > .active > a:hover,\n .nav-tabs.nav-justified > .active > a:focus {\n border-bottom-color: #ffffff;\n }\n}\n.nav-pills > li {\n float: left;\n}\n.nav-pills > li > a {\n border-radius: 4px;\n}\n.nav-pills > li + li {\n margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n color: #ffffff;\n background-color: #337ab7;\n}\n.nav-stacked > li {\n float: none;\n}\n.nav-stacked > li + li {\n margin-top: 2px;\n margin-left: 0;\n}\n.nav-justified {\n width: 100%;\n}\n.nav-justified > li {\n float: none;\n}\n.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px;\n}\n.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs-justified {\n border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n border: 1px solid #dddddd;\n}\n@media (min-width: 768px) {\n .nav-tabs-justified > li > a {\n border-bottom: 1px solid #dddddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs-justified > .active > a,\n .nav-tabs-justified > .active > a:hover,\n .nav-tabs-justified > .active > a:focus {\n border-bottom-color: #ffffff;\n }\n}\n.tab-content > .tab-pane {\n display: none;\n visibility: hidden;\n}\n.tab-content > .active {\n display: block;\n visibility: visible;\n}\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.navbar {\n position: relative;\n min-height: 50px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n .navbar {\n border-radius: 4px;\n }\n}\n@media (min-width: 768px) {\n .navbar-header {\n float: left;\n }\n}\n.navbar-collapse {\n overflow-x: visible;\n padding-right: 15px;\n padding-left: 15px;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n -webkit-overflow-scrolling: touch;\n}\n.navbar-collapse.in {\n overflow-y: auto;\n}\n@media (min-width: 768px) {\n .navbar-collapse {\n width: auto;\n border-top: 0;\n box-shadow: none;\n }\n .navbar-collapse.collapse {\n display: block !important;\n visibility: visible !important;\n height: auto !important;\n padding-bottom: 0;\n overflow: visible !important;\n }\n .navbar-collapse.in {\n overflow-y: visible;\n }\n .navbar-fixed-top .navbar-collapse,\n .navbar-static-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n padding-left: 0;\n padding-right: 0;\n }\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n .navbar-fixed-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n max-height: 200px;\n }\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .container > .navbar-header,\n .container-fluid > .navbar-header,\n .container > .navbar-collapse,\n .container-fluid > .navbar-collapse {\n margin-right: 0;\n margin-left: 0;\n }\n}\n.navbar-static-top {\n z-index: 1000;\n border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n .navbar-static-top {\n border-radius: 0;\n }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n@media (min-width: 768px) {\n .navbar-fixed-top,\n .navbar-fixed-bottom {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0;\n border-width: 1px 0 0;\n}\n.navbar-brand {\n float: left;\n padding: 15px 15px;\n font-size: 18px;\n line-height: 20px;\n height: 50px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n text-decoration: none;\n}\n.navbar-brand > img {\n display: block;\n}\n@media (min-width: 768px) {\n .navbar > .container .navbar-brand,\n .navbar > .container-fluid .navbar-brand {\n margin-left: -15px;\n }\n}\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: 15px;\n padding: 9px 10px;\n margin-top: 8px;\n margin-bottom: 8px;\n background-color: transparent;\n background-image: none;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.navbar-toggle:focus {\n outline: 0;\n}\n.navbar-toggle .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n margin-top: 4px;\n}\n@media (min-width: 768px) {\n .navbar-toggle {\n display: none;\n }\n}\n.navbar-nav {\n margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: 20px;\n}\n@media (max-width: 767px) {\n .navbar-nav .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n }\n .navbar-nav .open .dropdown-menu > li > a,\n .navbar-nav .open .dropdown-menu .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n .navbar-nav .open .dropdown-menu > li > a {\n line-height: 20px;\n }\n .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-nav .open .dropdown-menu > li > a:focus {\n background-image: none;\n }\n}\n@media (min-width: 768px) {\n .navbar-nav {\n float: left;\n margin: 0;\n }\n .navbar-nav > li {\n float: left;\n }\n .navbar-nav > li > a {\n padding-top: 15px;\n padding-bottom: 15px;\n }\n}\n.navbar-form {\n margin-left: -15px;\n margin-right: -15px;\n padding: 10px 15px;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n margin-top: 8px;\n margin-bottom: 8px;\n}\n@media (min-width: 768px) {\n .navbar-form .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .navbar-form .form-control-static {\n display: inline-block;\n }\n .navbar-form .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .navbar-form .input-group .input-group-addon,\n .navbar-form .input-group .input-group-btn,\n .navbar-form .input-group .form-control {\n width: auto;\n }\n .navbar-form .input-group > .form-control {\n width: 100%;\n }\n .navbar-form .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio,\n .navbar-form .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio label,\n .navbar-form .checkbox label {\n padding-left: 0;\n }\n .navbar-form .radio input[type=\"radio\"],\n .navbar-form .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .navbar-form .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n@media (max-width: 767px) {\n .navbar-form .form-group {\n margin-bottom: 5px;\n }\n .navbar-form .form-group:last-child {\n margin-bottom: 0;\n }\n}\n@media (min-width: 768px) {\n .navbar-form {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n}\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.navbar-btn {\n margin-top: 8px;\n margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n margin-top: 14px;\n margin-bottom: 14px;\n}\n.navbar-text {\n margin-top: 15px;\n margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n .navbar-text {\n float: left;\n margin-left: 15px;\n margin-right: 15px;\n }\n}\n@media (min-width: 768px) {\n .navbar-left {\n float: left !important;\n }\n .navbar-right {\n float: right !important;\n margin-right: -15px;\n }\n .navbar-right ~ .navbar-right {\n margin-right: 0;\n }\n}\n.navbar-default {\n background-color: #f8f8f8;\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n color: #777777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n color: #5e5e5e;\n background-color: transparent;\n}\n.navbar-default .navbar-text {\n color: #777777;\n}\n.navbar-default .navbar-nav > li > a {\n color: #777777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n color: #333333;\n background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n color: #555555;\n background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n color: #cccccc;\n background-color: transparent;\n}\n.navbar-default .navbar-toggle {\n border-color: #dddddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n background-color: #dddddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n background-color: #888888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n background-color: #e7e7e7;\n color: #555555;\n}\n@media (max-width: 767px) {\n .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n color: #777777;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #333333;\n background-color: transparent;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #555555;\n background-color: #e7e7e7;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #cccccc;\n background-color: transparent;\n }\n}\n.navbar-default .navbar-link {\n color: #777777;\n}\n.navbar-default .navbar-link:hover {\n color: #333333;\n}\n.navbar-default .btn-link {\n color: #777777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n color: #333333;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n color: #cccccc;\n}\n.navbar-inverse {\n background-color: #222222;\n border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n color: #ffffff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n color: #ffffff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n color: #ffffff;\n background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n color: #444444;\n background-color: transparent;\n}\n.navbar-inverse .navbar-toggle {\n border-color: #333333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n background-color: #333333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n background-color: #ffffff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n border-color: #101010;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n background-color: #080808;\n color: #ffffff;\n}\n@media (max-width: 767px) {\n .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n border-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n color: #9d9d9d;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #ffffff;\n background-color: transparent;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #ffffff;\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #444444;\n background-color: transparent;\n }\n}\n.navbar-inverse .navbar-link {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n color: #ffffff;\n}\n.navbar-inverse .btn-link {\n color: #9d9d9d;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n color: #ffffff;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n color: #444444;\n}\n.breadcrumb {\n padding: 8px 15px;\n margin-bottom: 20px;\n list-style: none;\n background-color: #f5f5f5;\n border-radius: 4px;\n}\n.breadcrumb > li {\n display: inline-block;\n}\n.breadcrumb > li + li:before {\n content: \"/\\00a0\";\n padding: 0 5px;\n color: #cccccc;\n}\n.breadcrumb > .active {\n color: #777777;\n}\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: 20px 0;\n border-radius: 4px;\n}\n.pagination > li {\n display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n position: relative;\n float: left;\n padding: 6px 12px;\n line-height: 1.42857143;\n text-decoration: none;\n color: #337ab7;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n margin-left: -1px;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n margin-left: 0;\n border-bottom-left-radius: 4px;\n border-top-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n border-bottom-right-radius: 4px;\n border-top-right-radius: 4px;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n color: #23527c;\n background-color: #eeeeee;\n border-color: #dddddd;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n z-index: 2;\n color: #ffffff;\n background-color: #337ab7;\n border-color: #337ab7;\n cursor: default;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n color: #777777;\n background-color: #ffffff;\n border-color: #dddddd;\n cursor: not-allowed;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n padding: 10px 16px;\n font-size: 18px;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n border-bottom-left-radius: 6px;\n border-top-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n border-bottom-right-radius: 6px;\n border-top-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n padding: 5px 10px;\n font-size: 12px;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n border-bottom-left-radius: 3px;\n border-top-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n border-bottom-right-radius: 3px;\n border-top-right-radius: 3px;\n}\n.pager {\n padding-left: 0;\n margin: 20px 0;\n list-style: none;\n text-align: center;\n}\n.pager li {\n display: inline;\n}\n.pager li > a,\n.pager li > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.pager .next > a,\n.pager .next > span {\n float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n color: #777777;\n background-color: #ffffff;\n cursor: not-allowed;\n}\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: #ffffff;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n}\na.label:hover,\na.label:focus {\n color: #ffffff;\n text-decoration: none;\n cursor: pointer;\n}\n.label:empty {\n display: none;\n}\n.btn .label {\n position: relative;\n top: -1px;\n}\n.label-default {\n background-color: #777777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n background-color: #5e5e5e;\n}\n.label-primary {\n background-color: #337ab7;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n background-color: #286090;\n}\n.label-success {\n background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n background-color: #449d44;\n}\n.label-info {\n background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n background-color: #31b0d5;\n}\n.label-warning {\n background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n background-color: #ec971f;\n}\n.label-danger {\n background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n background-color: #c9302c;\n}\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: 12px;\n font-weight: bold;\n color: #ffffff;\n line-height: 1;\n vertical-align: baseline;\n white-space: nowrap;\n text-align: center;\n background-color: #777777;\n border-radius: 10px;\n}\n.badge:empty {\n display: none;\n}\n.btn .badge {\n position: relative;\n top: -1px;\n}\n.btn-xs .badge {\n top: 0;\n padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n color: #ffffff;\n text-decoration: none;\n cursor: pointer;\n}\n.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n color: #337ab7;\n background-color: #ffffff;\n}\n.list-group-item > .badge {\n float: right;\n}\n.list-group-item > .badge + .badge {\n margin-right: 5px;\n}\n.nav-pills > li > a > .badge {\n margin-left: 3px;\n}\n.jumbotron {\n padding: 30px 15px;\n margin-bottom: 30px;\n color: inherit;\n background-color: #eeeeee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n color: inherit;\n}\n.jumbotron p {\n margin-bottom: 15px;\n font-size: 21px;\n font-weight: 200;\n}\n.jumbotron > hr {\n border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n border-radius: 6px;\n}\n.jumbotron .container {\n max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n .jumbotron {\n padding: 48px 0;\n }\n .container .jumbotron,\n .container-fluid .jumbotron {\n padding-left: 60px;\n padding-right: 60px;\n }\n .jumbotron h1,\n .jumbotron .h1 {\n font-size: 63px;\n }\n}\n.thumbnail {\n display: block;\n padding: 4px;\n margin-bottom: 20px;\n line-height: 1.42857143;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n border-radius: 4px;\n -webkit-transition: border 0.2s ease-in-out;\n -o-transition: border 0.2s ease-in-out;\n transition: border 0.2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n margin-left: auto;\n margin-right: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n border-color: #337ab7;\n}\n.thumbnail .caption {\n padding: 9px;\n color: #333333;\n}\n.alert {\n padding: 15px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.alert h4 {\n margin-top: 0;\n color: inherit;\n}\n.alert .alert-link {\n font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n margin-bottom: 0;\n}\n.alert > p + p {\n margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n}\n.alert-success {\n background-color: #dff0d8;\n border-color: #d6e9c6;\n color: #3c763d;\n}\n.alert-success hr {\n border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n color: #2b542c;\n}\n.alert-info {\n background-color: #d9edf7;\n border-color: #bce8f1;\n color: #31708f;\n}\n.alert-info hr {\n border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n color: #245269;\n}\n.alert-warning {\n background-color: #fcf8e3;\n border-color: #faebcc;\n color: #8a6d3b;\n}\n.alert-warning hr {\n border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n color: #66512c;\n}\n.alert-danger {\n background-color: #f2dede;\n border-color: #ebccd1;\n color: #a94442;\n}\n.alert-danger hr {\n border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n@keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n.progress {\n overflow: hidden;\n height: 20px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: 12px;\n line-height: 20px;\n color: #ffffff;\n text-align: center;\n background-color: #337ab7;\n -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n -webkit-transition: width 0.6s ease;\n -o-transition: width 0.6s ease;\n transition: width 0.6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n -webkit-animation: progress-bar-stripes 2s linear infinite;\n -o-animation: progress-bar-stripes 2s linear infinite;\n animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-info {\n background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-warning {\n background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-danger {\n background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.media {\n margin-top: 15px;\n}\n.media:first-child {\n margin-top: 0;\n}\n.media,\n.media-body {\n zoom: 1;\n overflow: hidden;\n}\n.media-object {\n display: block;\n}\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n.media-middle {\n vertical-align: middle;\n}\n.media-bottom {\n vertical-align: bottom;\n}\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n.list-group {\n margin-bottom: 20px;\n padding-left: 0;\n}\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n margin-bottom: -1px;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n}\n.list-group-item:first-child {\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n}\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\na.list-group-item {\n color: #555555;\n}\na.list-group-item .list-group-item-heading {\n color: #333333;\n}\na.list-group-item:hover,\na.list-group-item:focus {\n text-decoration: none;\n color: #555555;\n background-color: #f5f5f5;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n background-color: #eeeeee;\n color: #777777;\n cursor: not-allowed;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n color: #777777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n z-index: 2;\n color: #ffffff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n color: #c7ddef;\n}\n.list-group-item-success {\n color: #3c763d;\n background-color: #dff0d8;\n}\na.list-group-item-success {\n color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-success:hover,\na.list-group-item-success:focus {\n color: #3c763d;\n background-color: #d0e9c6;\n}\na.list-group-item-success.active,\na.list-group-item-success.active:hover,\na.list-group-item-success.active:focus {\n color: #fff;\n background-color: #3c763d;\n border-color: #3c763d;\n}\n.list-group-item-info {\n color: #31708f;\n background-color: #d9edf7;\n}\na.list-group-item-info {\n color: #31708f;\n}\na.list-group-item-info .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-info:hover,\na.list-group-item-info:focus {\n color: #31708f;\n background-color: #c4e3f3;\n}\na.list-group-item-info.active,\na.list-group-item-info.active:hover,\na.list-group-item-info.active:focus {\n color: #fff;\n background-color: #31708f;\n border-color: #31708f;\n}\n.list-group-item-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n}\na.list-group-item-warning {\n color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-warning:hover,\na.list-group-item-warning:focus {\n color: #8a6d3b;\n background-color: #faf2cc;\n}\na.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus {\n color: #fff;\n background-color: #8a6d3b;\n border-color: #8a6d3b;\n}\n.list-group-item-danger {\n color: #a94442;\n background-color: #f2dede;\n}\na.list-group-item-danger {\n color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-danger:hover,\na.list-group-item-danger:focus {\n color: #a94442;\n background-color: #ebcccc;\n}\na.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus {\n color: #fff;\n background-color: #a94442;\n border-color: #a94442;\n}\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n.panel {\n margin-bottom: 20px;\n background-color: #ffffff;\n border: 1px solid transparent;\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.panel-body {\n padding: 15px;\n}\n.panel-heading {\n padding: 10px 15px;\n border-bottom: 1px solid transparent;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n color: inherit;\n}\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: 16px;\n color: inherit;\n}\n.panel-title > a {\n color: inherit;\n}\n.panel-footer {\n padding: 10px 15px;\n background-color: #f5f5f5;\n border-top: 1px solid #dddddd;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n border-top: 0;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n border-bottom: 0;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n border-top-width: 0;\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n padding-left: 15px;\n padding-right: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n border-bottom-left-radius: 3px;\n border-bottom-right-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n border-top: 1px solid #dddddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n border-bottom: 0;\n}\n.panel > .table-responsive {\n border: 0;\n margin-bottom: 0;\n}\n.panel-group {\n margin-bottom: 20px;\n}\n.panel-group .panel {\n margin-bottom: 0;\n border-radius: 4px;\n}\n.panel-group .panel + .panel {\n margin-top: 5px;\n}\n.panel-group .panel-heading {\n border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n border-top: 1px solid #dddddd;\n}\n.panel-group .panel-footer {\n border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n border-bottom: 1px solid #dddddd;\n}\n.panel-default {\n border-color: #dddddd;\n}\n.panel-default > .panel-heading {\n color: #333333;\n background-color: #f5f5f5;\n border-color: #dddddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #dddddd;\n}\n.panel-default > .panel-heading .badge {\n color: #f5f5f5;\n background-color: #333333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #dddddd;\n}\n.panel-primary {\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading {\n color: #ffffff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #337ab7;\n}\n.panel-primary > .panel-heading .badge {\n color: #337ab7;\n background-color: #ffffff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #337ab7;\n}\n.panel-success {\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n color: #dff0d8;\n background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #d6e9c6;\n}\n.panel-info {\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n color: #d9edf7;\n background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #bce8f1;\n}\n.panel-warning {\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n color: #fcf8e3;\n background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #faebcc;\n}\n.panel-danger {\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n color: #f2dede;\n background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0;\n}\n.embed-responsive.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n.embed-responsive.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border: 1px solid #e3e3e3;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.well blockquote {\n border-color: #ddd;\n border-color: rgba(0, 0, 0, 0.15);\n}\n.well-lg {\n padding: 24px;\n border-radius: 6px;\n}\n.well-sm {\n padding: 9px;\n border-radius: 3px;\n}\n.close {\n float: right;\n font-size: 21px;\n font-weight: bold;\n line-height: 1;\n color: #000000;\n text-shadow: 0 1px 0 #ffffff;\n opacity: 0.2;\n filter: alpha(opacity=20);\n}\n.close:hover,\n.close:focus {\n color: #000000;\n text-decoration: none;\n cursor: pointer;\n opacity: 0.5;\n filter: alpha(opacity=50);\n}\nbutton.close {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n}\n.modal-open {\n overflow: hidden;\n}\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1040;\n -webkit-overflow-scrolling: touch;\n outline: 0;\n}\n.modal.fade .modal-dialog {\n -webkit-transform: translate(0, -25%);\n -ms-transform: translate(0, -25%);\n -o-transform: translate(0, -25%);\n transform: translate(0, -25%);\n -webkit-transition: -webkit-transform 0.3s ease-out;\n -moz-transition: -moz-transform 0.3s ease-out;\n -o-transition: -o-transform 0.3s ease-out;\n transition: transform 0.3s ease-out;\n}\n.modal.in .modal-dialog {\n -webkit-transform: translate(0, 0);\n -ms-transform: translate(0, 0);\n -o-transform: translate(0, 0);\n transform: translate(0, 0);\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n.modal-content {\n position: relative;\n background-color: #ffffff;\n border: 1px solid #999999;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n background-clip: padding-box;\n outline: 0;\n}\n.modal-backdrop {\n position: absolute;\n top: 0;\n right: 0;\n left: 0;\n background-color: #000000;\n}\n.modal-backdrop.fade {\n opacity: 0;\n filter: alpha(opacity=0);\n}\n.modal-backdrop.in {\n opacity: 0.5;\n filter: alpha(opacity=50);\n}\n.modal-header {\n padding: 15px;\n border-bottom: 1px solid #e5e5e5;\n min-height: 16.42857143px;\n}\n.modal-header .close {\n margin-top: -2px;\n}\n.modal-title {\n margin: 0;\n line-height: 1.42857143;\n}\n.modal-body {\n position: relative;\n padding: 15px;\n}\n.modal-footer {\n padding: 15px;\n text-align: right;\n border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0;\n}\n.modal-footer .btn-group .btn + .btn {\n margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n margin-left: 0;\n}\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n@media (min-width: 768px) {\n .modal-dialog {\n width: 600px;\n margin: 30px auto;\n }\n .modal-content {\n -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n }\n .modal-sm {\n width: 300px;\n }\n}\n@media (min-width: 992px) {\n .modal-lg {\n width: 900px;\n }\n}\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n visibility: visible;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 12px;\n font-weight: normal;\n line-height: 1.4;\n opacity: 0;\n filter: alpha(opacity=0);\n}\n.tooltip.in {\n opacity: 0.9;\n filter: alpha(opacity=90);\n}\n.tooltip.top {\n margin-top: -3px;\n padding: 5px 0;\n}\n.tooltip.right {\n margin-left: 3px;\n padding: 0 5px;\n}\n.tooltip.bottom {\n margin-top: 3px;\n padding: 5px 0;\n}\n.tooltip.left {\n margin-left: -3px;\n padding: 0 5px;\n}\n.tooltip-inner {\n max-width: 200px;\n padding: 3px 8px;\n color: #ffffff;\n text-align: center;\n text-decoration: none;\n background-color: #000000;\n border-radius: 4px;\n}\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000000;\n}\n.tooltip.top-left .tooltip-arrow {\n bottom: 0;\n right: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000000;\n}\n.tooltip.top-right .tooltip-arrow {\n bottom: 0;\n left: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000000;\n}\n.tooltip.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: #000000;\n}\n.tooltip.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: #000000;\n}\n.tooltip.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n top: 0;\n right: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n top: 0;\n left: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000000;\n}\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: none;\n max-width: 276px;\n padding: 1px;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 14px;\n font-weight: normal;\n line-height: 1.42857143;\n text-align: left;\n background-color: #ffffff;\n background-clip: padding-box;\n border: 1px solid #cccccc;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n white-space: normal;\n}\n.popover.top {\n margin-top: -10px;\n}\n.popover.right {\n margin-left: 10px;\n}\n.popover.bottom {\n margin-top: 10px;\n}\n.popover.left {\n margin-left: -10px;\n}\n.popover-title {\n margin: 0;\n padding: 8px 14px;\n font-size: 14px;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-radius: 5px 5px 0 0;\n}\n.popover-content {\n padding: 9px 14px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.popover > .arrow {\n border-width: 11px;\n}\n.popover > .arrow:after {\n border-width: 10px;\n content: \"\";\n}\n.popover.top > .arrow {\n left: 50%;\n margin-left: -11px;\n border-bottom-width: 0;\n border-top-color: #999999;\n border-top-color: rgba(0, 0, 0, 0.25);\n bottom: -11px;\n}\n.popover.top > .arrow:after {\n content: \" \";\n bottom: 1px;\n margin-left: -10px;\n border-bottom-width: 0;\n border-top-color: #ffffff;\n}\n.popover.right > .arrow {\n top: 50%;\n left: -11px;\n margin-top: -11px;\n border-left-width: 0;\n border-right-color: #999999;\n border-right-color: rgba(0, 0, 0, 0.25);\n}\n.popover.right > .arrow:after {\n content: \" \";\n left: 1px;\n bottom: -10px;\n border-left-width: 0;\n border-right-color: #ffffff;\n}\n.popover.bottom > .arrow {\n left: 50%;\n margin-left: -11px;\n border-top-width: 0;\n border-bottom-color: #999999;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n top: -11px;\n}\n.popover.bottom > .arrow:after {\n content: \" \";\n top: 1px;\n margin-left: -10px;\n border-top-width: 0;\n border-bottom-color: #ffffff;\n}\n.popover.left > .arrow {\n top: 50%;\n right: -11px;\n margin-top: -11px;\n border-right-width: 0;\n border-left-color: #999999;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n.popover.left > .arrow:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: #ffffff;\n bottom: -10px;\n}\n.carousel {\n position: relative;\n}\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%;\n}\n.carousel-inner > .item {\n display: none;\n position: relative;\n -webkit-transition: 0.6s ease-in-out left;\n -o-transition: 0.6s ease-in-out left;\n transition: 0.6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n .carousel-inner > .item {\n -webkit-transition: -webkit-transform 0.6s ease-in-out;\n -moz-transition: -moz-transform 0.6s ease-in-out;\n -o-transition: -o-transform 0.6s ease-in-out;\n transition: transform 0.6s ease-in-out;\n -webkit-backface-visibility: hidden;\n -moz-backface-visibility: hidden;\n backface-visibility: hidden;\n -webkit-perspective: 1000;\n -moz-perspective: 1000;\n perspective: 1000;\n }\n .carousel-inner > .item.next,\n .carousel-inner > .item.active.right {\n -webkit-transform: translate3d(100%, 0, 0);\n transform: translate3d(100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.prev,\n .carousel-inner > .item.active.left {\n -webkit-transform: translate3d(-100%, 0, 0);\n transform: translate3d(-100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.next.left,\n .carousel-inner > .item.prev.right,\n .carousel-inner > .item.active {\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n left: 0;\n }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n display: block;\n}\n.carousel-inner > .active {\n left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n}\n.carousel-inner > .next {\n left: 100%;\n}\n.carousel-inner > .prev {\n left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n left: 0;\n}\n.carousel-inner > .active.left {\n left: -100%;\n}\n.carousel-inner > .active.right {\n left: 100%;\n}\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: 15%;\n opacity: 0.5;\n filter: alpha(opacity=50);\n font-size: 20px;\n color: #ffffff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-control.left {\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n}\n.carousel-control.right {\n left: auto;\n right: 0;\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n}\n.carousel-control:hover,\n.carousel-control:focus {\n outline: 0;\n color: #ffffff;\n text-decoration: none;\n opacity: 0.9;\n filter: alpha(opacity=90);\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n z-index: 5;\n display: inline-block;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n width: 20px;\n height: 20px;\n margin-top: -10px;\n font-family: serif;\n}\n.carousel-control .icon-prev:before {\n content: '\\2039';\n}\n.carousel-control .icon-next:before {\n content: '\\203a';\n}\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center;\n}\n.carousel-indicators li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid #ffffff;\n border-radius: 10px;\n cursor: pointer;\n background-color: #000 \\9;\n background-color: rgba(0, 0, 0, 0);\n}\n.carousel-indicators .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: #ffffff;\n}\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #ffffff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-caption .btn {\n text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-prev,\n .carousel-control .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -15px;\n font-size: 30px;\n }\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .icon-prev {\n margin-left: -15px;\n }\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-next {\n margin-right: -15px;\n }\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px;\n }\n .carousel-indicators {\n bottom: 20px;\n }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-footer:before,\n.modal-footer:after {\n content: \" \";\n display: table;\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-footer:after {\n clear: both;\n}\n.center-block {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n.hidden {\n display: none !important;\n visibility: hidden !important;\n}\n.affix {\n position: fixed;\n}\n@-ms-viewport {\n width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n@media (max-width: 767px) {\n .visible-xs {\n display: block !important;\n }\n table.visible-xs {\n display: table;\n }\n tr.visible-xs {\n display: table-row !important;\n }\n th.visible-xs,\n td.visible-xs {\n display: table-cell !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-block {\n display: block !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline {\n display: inline !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm {\n display: block !important;\n }\n table.visible-sm {\n display: table;\n }\n tr.visible-sm {\n display: table-row !important;\n }\n th.visible-sm,\n td.visible-sm {\n display: table-cell !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-block {\n display: block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline {\n display: inline !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md {\n display: block !important;\n }\n table.visible-md {\n display: table;\n }\n tr.visible-md {\n display: table-row !important;\n }\n th.visible-md,\n td.visible-md {\n display: table-cell !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-block {\n display: block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline {\n display: inline !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg {\n display: block !important;\n }\n table.visible-lg {\n display: table;\n }\n tr.visible-lg {\n display: table-row !important;\n }\n th.visible-lg,\n td.visible-lg {\n display: table-cell !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-block {\n display: block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline {\n display: inline !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline-block {\n display: inline-block !important;\n }\n}\n@media (max-width: 767px) {\n .hidden-xs {\n display: none !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .hidden-sm {\n display: none !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .hidden-md {\n display: none !important;\n }\n}\n@media (min-width: 1200px) {\n .hidden-lg {\n display: none !important;\n }\n}\n.visible-print {\n display: none !important;\n}\n@media print {\n .visible-print {\n display: block !important;\n }\n table.visible-print {\n display: table;\n }\n tr.visible-print {\n display: table-row !important;\n }\n th.visible-print,\n td.visible-print {\n display: table-cell !important;\n }\n}\n.visible-print-block {\n display: none !important;\n}\n@media print {\n .visible-print-block {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n}\n@media print {\n .visible-print-inline {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n}\n@media print {\n .visible-print-inline-block {\n display: inline-block !important;\n }\n}\n@media print {\n .hidden-print {\n display: none !important;\n }\n}\n/*# sourceMappingURL=bootstrap.css.map */","/*! normalize.css v3.0.2 | MIT License | git.io/normalize */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS text size adjust after orientation change, without disabling\n// user zoom.\n//\n\nhtml {\n font-family: sans-serif; // 1\n -ms-text-size-adjust: 100%; // 2\n -webkit-text-size-adjust: 100%; // 2\n}\n\n//\n// Remove default margin.\n//\n\nbody {\n margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined for any HTML5 element in IE 8/9.\n// Correct `block` display not defined for `details` or `summary` in IE 10/11\n// and Firefox.\n// Correct `block` display not defined for `main` in IE 11.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\n\n//\n// 1. Correct `inline-block` display not defined in IE 8/9.\n// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block; // 1\n vertical-align: baseline; // 2\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n\n//\n// Address `[hidden]` styling not present in IE 8/9/10.\n// Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22.\n//\n\n[hidden],\ntemplate {\n display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Remove the gray background color from active links in IE 10.\n//\n\na {\n background-color: transparent;\n}\n\n//\n// Improve readability when focused and also mouse hovered in all browsers.\n//\n\na:active,\na:hover {\n outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n//\n\nabbr[title] {\n border-bottom: 1px dotted;\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n//\n\nb,\nstrong {\n font-weight: bold;\n}\n\n//\n// Address styling not present in Safari and Chrome.\n//\n\ndfn {\n font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari, and Chrome.\n//\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n background: #ff0;\n color: #000;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsup {\n top: -0.5em;\n}\n\nsub {\n bottom: -0.25em;\n}\n\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9/10.\n//\n\nimg {\n border: 0;\n}\n\n//\n// Correct overflow not hidden in IE 9/10/11.\n//\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari.\n//\n\nfigure {\n margin: 1em 40px;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n -moz-box-sizing: content-box;\n box-sizing: content-box;\n height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n// Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit; // 1\n font: inherit; // 2\n margin: 0; // 3\n}\n\n//\n// Address `overflow` set to `hidden` in IE 8/9/10/11.\n//\n\nbutton {\n overflow: visible;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n// Correct `select` style inheritance in Firefox.\n//\n\nbutton,\nselect {\n text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n// and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n// `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button; // 2\n cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\ninput {\n line-height: normal;\n}\n\n//\n// It's recommended that you don't attempt to style these elements.\n// Firefox's implementation doesn't respect box-sizing, padding, or width.\n//\n// 1. Address box sizing set to `content-box` in IE 8/9/10.\n// 2. Remove excess padding in IE 8/9/10.\n//\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box; // 1\n padding: 0; // 2\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari and Chrome\n// (include `-moz` to future-proof).\n//\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield; // 1\n -moz-box-sizing: content-box;\n -webkit-box-sizing: content-box; // 2\n box-sizing: content-box;\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9/10/11.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n border: 0; // 1\n padding: 0; // 2\n}\n\n//\n// Remove default vertical scrollbar in IE 8/9/10/11.\n//\n\ntextarea {\n overflow: auto;\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ntd,\nth {\n padding: 0;\n}\n","/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request: h5bp.com/r\n// ==========================================================================\n\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important; // Black prints faster: h5bp.com/s\n box-shadow: none !important;\n text-shadow: none !important;\n }\n\n a,\n a:visited {\n text-decoration: underline;\n }\n\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n\n // Don't show links that are fragment identifiers,\n // or use the `javascript:` pseudo protocol\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n\n thead {\n display: table-header-group; // h5bp.com/t\n }\n\n tr,\n img {\n page-break-inside: avoid;\n }\n\n img {\n max-width: 100% !important;\n }\n\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n\n h2,\n h3 {\n page-break-after: avoid;\n }\n\n // Bootstrap specific changes start\n //\n // Chrome (OSX) fix for https://github.com/twbs/bootstrap/issues/11245\n // Once fixed, we can just straight up remove this.\n select {\n background: #fff !important;\n }\n\n // Bootstrap components\n .navbar {\n display: none;\n }\n .btn,\n .dropup > .btn {\n > .caret {\n border-top-color: #000 !important;\n }\n }\n .label {\n border: 1px solid #000;\n }\n\n .table {\n border-collapse: collapse !important;\n\n td,\n th {\n background-color: #fff !important;\n }\n }\n .table-bordered {\n th,\n td {\n border: 1px solid #ddd !important;\n }\n }\n\n // Bootstrap specific changes end\n}\n","//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n// Star\n\n// Import the fonts\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('@{icon-font-path}@{icon-font-name}.eot');\n src: url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype'),\n url('@{icon-font-path}@{icon-font-name}.woff') format('woff'),\n url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype'),\n url('@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}') format('svg');\n}\n\n// Catchall baseclass\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk { &:before { content: \"\\2a\"; } }\n.glyphicon-plus { &:before { content: \"\\2b\"; } }\n.glyphicon-euro,\n.glyphicon-eur { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil { &:before { content: \"\\270f\"; } }\n.glyphicon-glass { &:before { content: \"\\e001\"; } }\n.glyphicon-music { &:before { content: \"\\e002\"; } }\n.glyphicon-search { &:before { content: \"\\e003\"; } }\n.glyphicon-heart { &:before { content: \"\\e005\"; } }\n.glyphicon-star { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty { &:before { content: \"\\e007\"; } }\n.glyphicon-user { &:before { content: \"\\e008\"; } }\n.glyphicon-film { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large { &:before { content: \"\\e010\"; } }\n.glyphicon-th { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list { &:before { content: \"\\e012\"; } }\n.glyphicon-ok { &:before { content: \"\\e013\"; } }\n.glyphicon-remove { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out { &:before { content: \"\\e016\"; } }\n.glyphicon-off { &:before { content: \"\\e017\"; } }\n.glyphicon-signal { &:before { content: \"\\e018\"; } }\n.glyphicon-cog { &:before { content: \"\\e019\"; } }\n.glyphicon-trash { &:before { content: \"\\e020\"; } }\n.glyphicon-home { &:before { content: \"\\e021\"; } }\n.glyphicon-file { &:before { content: \"\\e022\"; } }\n.glyphicon-time { &:before { content: \"\\e023\"; } }\n.glyphicon-road { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt { &:before { content: \"\\e025\"; } }\n.glyphicon-download { &:before { content: \"\\e026\"; } }\n.glyphicon-upload { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt { &:before { content: \"\\e032\"; } }\n.glyphicon-lock { &:before { content: \"\\e033\"; } }\n.glyphicon-flag { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode { &:before { content: \"\\e040\"; } }\n.glyphicon-tag { &:before { content: \"\\e041\"; } }\n.glyphicon-tags { &:before { content: \"\\e042\"; } }\n.glyphicon-book { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark { &:before { content: \"\\e044\"; } }\n.glyphicon-print { &:before { content: \"\\e045\"; } }\n.glyphicon-camera { &:before { content: \"\\e046\"; } }\n.glyphicon-font { &:before { content: \"\\e047\"; } }\n.glyphicon-bold { &:before { content: \"\\e048\"; } }\n.glyphicon-italic { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify { &:before { content: \"\\e055\"; } }\n.glyphicon-list { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video { &:before { content: \"\\e059\"; } }\n.glyphicon-picture { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust { &:before { content: \"\\e063\"; } }\n.glyphicon-tint { &:before { content: \"\\e064\"; } }\n.glyphicon-edit { &:before { content: \"\\e065\"; } }\n.glyphicon-share { &:before { content: \"\\e066\"; } }\n.glyphicon-check { &:before { content: \"\\e067\"; } }\n.glyphicon-move { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward { &:before { content: \"\\e070\"; } }\n.glyphicon-backward { &:before { content: \"\\e071\"; } }\n.glyphicon-play { &:before { content: \"\\e072\"; } }\n.glyphicon-pause { &:before { content: \"\\e073\"; } }\n.glyphicon-stop { &:before { content: \"\\e074\"; } }\n.glyphicon-forward { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward { &:before { content: \"\\e077\"; } }\n.glyphicon-eject { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign { &:before { content: \"\\e101\"; } }\n.glyphicon-gift { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf { &:before { content: \"\\e103\"; } }\n.glyphicon-fire { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign { &:before { content: \"\\e107\"; } }\n.glyphicon-plane { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar { &:before { content: \"\\e109\"; } }\n.glyphicon-random { &:before { content: \"\\e110\"; } }\n.glyphicon-comment { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn { &:before { content: \"\\e122\"; } }\n.glyphicon-bell { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down { &:before { content: \"\\e134\"; } }\n.glyphicon-globe { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks { &:before { content: \"\\e137\"; } }\n.glyphicon-filter { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty { &:before { content: \"\\e143\"; } }\n.glyphicon-link { &:before { content: \"\\e144\"; } }\n.glyphicon-phone { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin { &:before { content: \"\\e146\"; } }\n.glyphicon-usd { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp { &:before { content: \"\\e149\"; } }\n.glyphicon-sort { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked { &:before { content: \"\\e157\"; } }\n.glyphicon-expand { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in { &:before { content: \"\\e161\"; } }\n.glyphicon-flash { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window { &:before { content: \"\\e164\"; } }\n.glyphicon-record { &:before { content: \"\\e165\"; } }\n.glyphicon-save { &:before { content: \"\\e166\"; } }\n.glyphicon-open { &:before { content: \"\\e167\"; } }\n.glyphicon-saved { &:before { content: \"\\e168\"; } }\n.glyphicon-import { &:before { content: \"\\e169\"; } }\n.glyphicon-export { &:before { content: \"\\e170\"; } }\n.glyphicon-send { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery { &:before { content: \"\\e179\"; } }\n.glyphicon-header { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt { &:before { content: \"\\e183\"; } }\n.glyphicon-tower { &:before { content: \"\\e184\"; } }\n.glyphicon-stats { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1 { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1 { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1 { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous { &:before { content: \"\\e200\"; } }\n.glyphicon-cd { &:before { content: \"\\e201\"; } }\n.glyphicon-save-file { &:before { content: \"\\e202\"; } }\n.glyphicon-open-file { &:before { content: \"\\e203\"; } }\n.glyphicon-level-up { &:before { content: \"\\e204\"; } }\n.glyphicon-copy { &:before { content: \"\\e205\"; } }\n.glyphicon-paste { &:before { content: \"\\e206\"; } }\n.glyphicon-door { &:before { content: \"\\1f6aa\"; } }\n.glyphicon-key { &:before { content: \"\\1F511\"; } }\n.glyphicon-alert { &:before { content: \"\\e209\"; } }\n.glyphicon-equalizer { &:before { content: \"\\e210\"; } }\n.glyphicon-king { &:before { content: \"\\e211\"; } }\n.glyphicon-queen { &:before { content: \"\\e212\"; } }\n.glyphicon-pawn { &:before { content: \"\\e213\"; } }\n.glyphicon-bishop { &:before { content: \"\\e214\"; } }\n.glyphicon-knight { &:before { content: \"\\e215\"; } }\n.glyphicon-baby-formula { &:before { content: \"\\e216\"; } }\n.glyphicon-tent { &:before { content: \"\\26fa\"; } }\n.glyphicon-blackboard { &:before { content: \"\\e218\"; } }\n.glyphicon-bed { &:before { content: \"\\e219\"; } }\n.glyphicon-apple { &:before { content: \"\\f8ff\"; } }\n.glyphicon-erase { &:before { content: \"\\e221\"; } }\n.glyphicon-hourglass { &:before { content: \"\\231b\"; } }\n.glyphicon-lamp { &:before { content: \"\\e223\"; } }\n.glyphicon-duplicate { &:before { content: \"\\e224\"; } }\n.glyphicon-piggy-bank { &:before { content: \"\\e225\"; } }\n.glyphicon-scissors { &:before { content: \"\\e226\"; } }\n.glyphicon-bitcoin { &:before { content: \"\\e227\"; } }\n.glyphicon-yen { &:before { content: \"\\00a5\"; } }\n.glyphicon-ruble { &:before { content: \"\\20bd\"; } }\n.glyphicon-scale { &:before { content: \"\\e230\"; } }\n.glyphicon-ice-lolly { &:before { content: \"\\e231\"; } }\n.glyphicon-ice-lolly-tasted { &:before { content: \"\\e232\"; } }\n.glyphicon-education { &:before { content: \"\\e233\"; } }\n.glyphicon-option-horizontal { &:before { content: \"\\e234\"; } }\n.glyphicon-option-vertical { &:before { content: \"\\e235\"; } }\n.glyphicon-menu-hamburger { &:before { content: \"\\e236\"; } }\n.glyphicon-modal-window { &:before { content: \"\\e237\"; } }\n.glyphicon-oil { &:before { content: \"\\e238\"; } }\n.glyphicon-grain { &:before { content: \"\\e239\"; } }\n.glyphicon-sunglasses { &:before { content: \"\\e240\"; } }\n.glyphicon-text-size { &:before { content: \"\\e241\"; } }\n.glyphicon-text-color { &:before { content: \"\\e242\"; } }\n.glyphicon-text-background { &:before { content: \"\\e243\"; } }\n.glyphicon-object-align-top { &:before { content: \"\\e244\"; } }\n.glyphicon-object-align-bottom { &:before { content: \"\\e245\"; } }\n.glyphicon-object-align-horizontal{ &:before { content: \"\\e246\"; } }\n.glyphicon-object-align-left { &:before { content: \"\\e247\"; } }\n.glyphicon-object-align-vertical { &:before { content: \"\\e248\"; } }\n.glyphicon-object-align-right { &:before { content: \"\\e249\"; } }\n.glyphicon-triangle-right { &:before { content: \"\\e250\"; } }\n.glyphicon-triangle-left { &:before { content: \"\\e251\"; } }\n.glyphicon-triangle-bottom { &:before { content: \"\\e252\"; } }\n.glyphicon-triangle-top { &:before { content: \"\\e253\"; } }\n.glyphicon-console { &:before { content: \"\\e254\"; } }\n.glyphicon-superscript { &:before { content: \"\\e255\"; } }\n.glyphicon-subscript { &:before { content: \"\\e256\"; } }\n.glyphicon-menu-left { &:before { content: \"\\e257\"; } }\n.glyphicon-menu-right { &:before { content: \"\\e258\"; } }\n.glyphicon-menu-down { &:before { content: \"\\e259\"; } }\n.glyphicon-menu-up { &:before { content: \"\\e260\"; } }\n","//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This reset may cause conflicts with some third-party widgets.\n// For recommendations on resolving such conflicts, see\n// http://getbootstrap.com/getting-started/#third-box-sizing\n* {\n .box-sizing(border-box);\n}\n*:before,\n*:after {\n .box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0,0,0,0);\n}\n\nbody {\n font-family: @font-family-base;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @text-color;\n background-color: @body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\n\n// Links\n\na {\n color: @link-color;\n text-decoration: none;\n\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n }\n\n &:focus {\n .tab-focus();\n }\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n margin: 0;\n}\n\n\n// Images\n\nimg {\n vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n .img-responsive();\n}\n\n// Rounded corners\n.img-rounded {\n border-radius: @border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n padding: @thumbnail-padding;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(all .2s ease-in-out);\n\n // Keep them at most 100% wide\n .img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n margin-top: @line-height-computed;\n margin-bottom: @line-height-computed;\n border: 0;\n border-top: 1px solid @hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: http://a11yproject.com/posts/how-to-hide-content/\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0,0,0,0);\n border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n// Useful for \"Skip to main content\" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable {\n &:active,\n &:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n }\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They will be removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility){\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // See https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// WebKit-style focus\n\n.tab-focus() {\n // Default\n outline: thin dotted;\n // WebKit\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n.img-responsive(@display: block) {\n display: @display;\n max-width: 100%; // Part 1: Set a maximum relative to the parent\n height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size. Note that the\n// spelling of `min--moz-device-pixel-ratio` is intentional.\n.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {\n background-image: url(\"@{file-1x}\");\n\n @media\n only screen and (-webkit-min-device-pixel-ratio: 2),\n only screen and ( min--moz-device-pixel-ratio: 2),\n only screen and ( -o-min-device-pixel-ratio: 2/1),\n only screen and ( min-device-pixel-ratio: 2),\n only screen and ( min-resolution: 192dpi),\n only screen and ( min-resolution: 2dppx) {\n background-image: url(\"@{file-2x}\");\n background-size: @width-1x @height-1x;\n }\n}\n","//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n font-family: @headings-font-family;\n font-weight: @headings-font-weight;\n line-height: @headings-line-height;\n color: @headings-color;\n\n small,\n .small {\n font-weight: normal;\n line-height: 1;\n color: @headings-small-color;\n }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n margin-top: @line-height-computed;\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 65%;\n }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n margin-top: (@line-height-computed / 2);\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 75%;\n }\n}\n\nh1, .h1 { font-size: @font-size-h1; }\nh2, .h2 { font-size: @font-size-h2; }\nh3, .h3 { font-size: @font-size-h3; }\nh4, .h4 { font-size: @font-size-h4; }\nh5, .h5 { font-size: @font-size-h5; }\nh6, .h6 { font-size: @font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n margin: 0 0 (@line-height-computed / 2);\n}\n\n.lead {\n margin-bottom: @line-height-computed;\n font-size: floor((@font-size-base * 1.15));\n font-weight: 300;\n line-height: 1.4;\n\n @media (min-width: @screen-sm-min) {\n font-size: (@font-size-base * 1.5);\n }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: (12px small font / 14px base font) * 100% = about 85%\nsmall,\n.small {\n font-size: floor((100% * @font-size-small / @font-size-base));\n}\n\nmark,\n.mark {\n background-color: @state-warning-bg;\n padding: .2em;\n}\n\n// Alignment\n.text-left { text-align: left; }\n.text-right { text-align: right; }\n.text-center { text-align: center; }\n.text-justify { text-align: justify; }\n.text-nowrap { white-space: nowrap; }\n\n// Transformation\n.text-lowercase { text-transform: lowercase; }\n.text-uppercase { text-transform: uppercase; }\n.text-capitalize { text-transform: capitalize; }\n\n// Contextual colors\n.text-muted {\n color: @text-muted;\n}\n.text-primary {\n .text-emphasis-variant(@brand-primary);\n}\n.text-success {\n .text-emphasis-variant(@state-success-text);\n}\n.text-info {\n .text-emphasis-variant(@state-info-text);\n}\n.text-warning {\n .text-emphasis-variant(@state-warning-text);\n}\n.text-danger {\n .text-emphasis-variant(@state-danger-text);\n}\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n // Given the contrast here, this is the only class to have its color inverted\n // automatically.\n color: #fff;\n .bg-variant(@brand-primary);\n}\n.bg-success {\n .bg-variant(@state-success-bg);\n}\n.bg-info {\n .bg-variant(@state-info-bg);\n}\n.bg-warning {\n .bg-variant(@state-warning-bg);\n}\n.bg-danger {\n .bg-variant(@state-danger-bg);\n}\n\n\n// Page header\n// -------------------------\n\n.page-header {\n padding-bottom: ((@line-height-computed / 2) - 1);\n margin: (@line-height-computed * 2) 0 @line-height-computed;\n border-bottom: 1px solid @page-header-border-color;\n}\n\n\n// Lists\n// -------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n margin-top: 0;\n margin-bottom: (@line-height-computed / 2);\n ul,\n ol {\n margin-bottom: 0;\n }\n}\n\n// List options\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n .list-unstyled();\n margin-left: -5px;\n\n > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n }\n}\n\n// Description Lists\ndl {\n margin-top: 0; // Remove browser default\n margin-bottom: @line-height-computed;\n}\ndt,\ndd {\n line-height: @line-height-base;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n.dl-horizontal {\n dd {\n &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present\n }\n\n @media (min-width: @grid-float-breakpoint) {\n dt {\n float: left;\n width: (@dl-horizontal-offset - 20);\n clear: left;\n text-align: right;\n .text-overflow();\n }\n dd {\n margin-left: @dl-horizontal-offset;\n }\n }\n}\n\n\n// Misc\n// -------------------------\n\n// Abbreviations and acronyms\nabbr[title],\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted @abbr-border-color;\n}\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\n\n// Blockquotes\nblockquote {\n padding: (@line-height-computed / 2) @line-height-computed;\n margin: 0 0 @line-height-computed;\n font-size: @blockquote-font-size;\n border-left: 5px solid @blockquote-border-color;\n\n p,\n ul,\n ol {\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n // Note: Deprecated small and .small as of v3.1.0\n // Context: https://github.com/twbs/bootstrap/issues/11660\n footer,\n small,\n .small {\n display: block;\n font-size: 80%; // back to default font-size\n line-height: @line-height-base;\n color: @blockquote-small-color;\n\n &:before {\n content: '\\2014 \\00A0'; // em dash, nbsp\n }\n }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid @blockquote-border-color;\n border-left: 0;\n text-align: right;\n\n // Account for citation\n footer,\n small,\n .small {\n &:before { content: ''; }\n &:after {\n content: '\\00A0 \\2014'; // nbsp, em dash\n }\n }\n}\n\n// Addresses\naddress {\n margin-bottom: @line-height-computed;\n font-style: normal;\n line-height: @line-height-base;\n}\n","// Typography\n\n.text-emphasis-variant(@color) {\n color: @color;\n a&:hover {\n color: darken(@color, 10%);\n }\n}\n","// Contextual backgrounds\n\n.bg-variant(@color) {\n background-color: @color;\n a&:hover {\n background-color: darken(@color, 10%);\n }\n}\n","// Text overflow\n// Requires inline-block or block for proper styling\n\n.text-overflow() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n font-family: @font-family-monospace;\n}\n\n// Inline code\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: @code-color;\n background-color: @code-bg;\n border-radius: @border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: @kbd-color;\n background-color: @kbd-bg;\n border-radius: @border-radius-small;\n box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);\n\n kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none;\n }\n}\n\n// Blocks of code\npre {\n display: block;\n padding: ((@line-height-computed - 1) / 2);\n margin: 0 0 (@line-height-computed / 2);\n font-size: (@font-size-base - 1); // 14px to 13px\n line-height: @line-height-base;\n word-break: break-all;\n word-wrap: break-word;\n color: @pre-color;\n background-color: @pre-bg;\n border: 1px solid @pre-border-color;\n border-radius: @border-radius-base;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: @pre-scrollable-max-height;\n overflow-y: scroll;\n}\n","//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n .container-fixed();\n\n @media (min-width: @screen-sm-min) {\n width: @container-sm;\n }\n @media (min-width: @screen-md-min) {\n width: @container-md;\n }\n @media (min-width: @screen-lg-min) {\n width: @container-lg;\n }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n .container-fixed();\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n .make-row();\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n.make-grid-columns();\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n.make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: @screen-sm-min) {\n .make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: @screen-md-min) {\n .make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: @screen-lg-min) {\n .make-grid(lg);\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n.container-fixed(@gutter: @grid-gutter-width) {\n margin-right: auto;\n margin-left: auto;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n &:extend(.clearfix all);\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n margin-left: (@gutter / -2);\n margin-right: (@gutter / -2);\n &:extend(.clearfix all);\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n float: left;\n width: percentage((@columns / @grid-columns));\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n}\n.make-xs-column-offset(@columns) {\n margin-left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-push(@columns) {\n left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-pull(@columns) {\n right: percentage((@columns / @grid-columns));\n}\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-sm-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-offset(@columns) {\n @media (min-width: @screen-sm-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-push(@columns) {\n @media (min-width: @screen-sm-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-pull(@columns) {\n @media (min-width: @screen-sm-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the medium columns\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-md-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-offset(@columns) {\n @media (min-width: @screen-md-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-push(@columns) {\n @media (min-width: @screen-md-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-pull(@columns) {\n @media (min-width: @screen-md-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the large columns\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-lg-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-offset(@columns) {\n @media (min-width: @screen-lg-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-push(@columns) {\n @media (min-width: @screen-lg-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-pull(@columns) {\n @media (min-width: @screen-lg-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `@grid-columns`.\n\n.make-grid-columns() {\n // Common styles for all sizes of grid columns, widths 1-12\n .col(@index) { // initial\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general; \"=<\" isn't a typo\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n position: relative;\n // Prevent columns from collapsing when empty\n min-height: 1px;\n // Inner gutter via padding\n padding-left: (@grid-gutter-width / 2);\n padding-right: (@grid-gutter-width / 2);\n }\n }\n .col(1); // kickstart it\n}\n\n.float-grid-columns(@class) {\n .col(@index) { // initial\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n float: left;\n }\n }\n .col(1); // kickstart it\n}\n\n.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {\n .col-@{class}-@{index} {\n width: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) {\n .col-@{class}-push-@{index} {\n left: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) {\n .col-@{class}-push-0 {\n left: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index > 0) {\n .col-@{class}-pull-@{index} {\n right: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index = 0) {\n .col-@{class}-pull-0 {\n right: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = offset) {\n .col-@{class}-offset-@{index} {\n margin-left: percentage((@index / @grid-columns));\n }\n}\n\n// Basic looping in LESS\n.loop-grid-columns(@index, @class, @type) when (@index >= 0) {\n .calc-grid-column(@index, @class, @type);\n // next iteration\n .loop-grid-columns((@index - 1), @class, @type);\n}\n\n// Create grid for specific class\n.make-grid(@class) {\n .float-grid-columns(@class);\n .loop-grid-columns(@grid-columns, @class, width);\n .loop-grid-columns(@grid-columns, @class, pull);\n .loop-grid-columns(@grid-columns, @class, push);\n .loop-grid-columns(@grid-columns, @class, offset);\n}\n","//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n background-color: @table-bg;\n}\ncaption {\n padding-top: @table-cell-padding;\n padding-bottom: @table-cell-padding;\n color: @text-muted;\n text-align: left;\n}\nth {\n text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: @line-height-computed;\n // Cells\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-cell-padding;\n line-height: @line-height-base;\n vertical-align: top;\n border-top: 1px solid @table-border-color;\n }\n }\n }\n // Bottom align for column headings\n > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid @table-border-color;\n }\n // Remove top border from thead by default\n > caption + thead,\n > colgroup + thead,\n > thead:first-child {\n > tr:first-child {\n > th,\n > td {\n border-top: 0;\n }\n }\n }\n // Account for multiple tbody instances\n > tbody + tbody {\n border-top: 2px solid @table-border-color;\n }\n\n // Nesting\n .table {\n background-color: @body-bg;\n }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-condensed-cell-padding;\n }\n }\n }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n border: 1px solid @table-border-color;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n border: 1px solid @table-border-color;\n }\n }\n }\n > thead > tr {\n > th,\n > td {\n border-bottom-width: 2px;\n }\n }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n > tbody > tr:nth-child(odd) {\n background-color: @table-bg-accent;\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n > tbody > tr:hover {\n background-color: @table-bg-hover;\n }\n}\n\n\n// Table cell sizing\n//\n// Reset default table behavior\n\ntable col[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9/10 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-column;\n}\ntable {\n td,\n th {\n &[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9/10 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-cell;\n }\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n.table-row-variant(active; @table-bg-active);\n.table-row-variant(success; @state-success-bg);\n.table-row-variant(info; @state-info-bg);\n.table-row-variant(warning; @state-warning-bg);\n.table-row-variant(danger; @state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)\n\n @media screen and (max-width: @screen-xs-max) {\n width: 100%;\n margin-bottom: (@line-height-computed * 0.75);\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid @table-border-color;\n\n // Tighten up spacing\n > .table {\n margin-bottom: 0;\n\n // Ensure the content doesn't wrap\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n white-space: nowrap;\n }\n }\n }\n }\n\n // Special overrides for the bordered tables\n > .table-bordered {\n border: 0;\n\n // Nuke the appropriate borders so that the parent can handle them\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n\n // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n // chances are there will be only one `tr` in a `thead` and that would\n // remove the border altogether.\n > tbody,\n > tfoot {\n > tr:last-child {\n > th,\n > td {\n border-bottom: 0;\n }\n }\n }\n\n }\n }\n}\n","// Tables\n\n.table-row-variant(@state; @background) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table > thead > tr,\n .table > tbody > tr,\n .table > tfoot > tr {\n > td.@{state},\n > th.@{state},\n &.@{state} > td,\n &.@{state} > th {\n background-color: @background;\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover > tbody > tr {\n > td.@{state}:hover,\n > th.@{state}:hover,\n &.@{state}:hover > td,\n &:hover > .@{state},\n &.@{state}:hover > th {\n background-color: darken(@background, 5%);\n }\n }\n}\n","//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n // Chrome and Firefox set a `min-width: min-content;` on fieldsets,\n // so we reset that to ensure it behaves more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359.\n min-width: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: @line-height-computed;\n font-size: (@font-size-base * 1.5);\n line-height: inherit;\n color: @legend-color;\n border: 0;\n border-bottom: 1px solid @legend-border-color;\n}\n\nlabel {\n display: inline-block;\n max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)\n margin-bottom: 5px;\n font-weight: bold;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n .box-sizing(border-box);\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9; // IE8-9\n line-height: normal;\n}\n\n// Set the height of file controls to match text inputs\ninput[type=\"file\"] {\n display: block;\n}\n\n// Make range inputs behave like textual form controls\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n height: auto;\n}\n\n// Focus for file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n .tab-focus();\n}\n\n// Adjust output element\noutput {\n display: block;\n padding-top: (@padding-base-vertical + 1);\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n display: block;\n width: 100%;\n height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n background-color: @input-bg;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid @input-border;\n border-radius: @input-border-radius;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\n .transition(~\"border-color ease-in-out .15s, box-shadow ease-in-out .15s\");\n\n // Customize the `:focus` state to imitate native WebKit styles.\n .form-control-focus();\n\n // Placeholder\n .placeholder();\n\n // Disabled and read-only inputs\n //\n // HTML5 says that controls under a fieldset > legend:first-child won't be\n // disabled if the fieldset is disabled. Due to implementation difficulty, we\n // don't honor that edge case; we style them as disabled anyway.\n &[disabled],\n &[readonly],\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n background-color: @input-bg-disabled;\n opacity: 1; // iOS fix for unreadable disabled content\n }\n\n // Reset height for `textarea`s\n textarea& {\n height: auto;\n }\n}\n\n\n// Search inputs in iOS\n//\n// This overrides the extra rounded corners on search inputs in iOS so that our\n// `.form-control` class can properly style them. Note that this cannot simply\n// be added to `.form-control` as it's not specific enough. For details, see\n// https://github.com/twbs/bootstrap/issues/11586.\n\ninput[type=\"search\"] {\n -webkit-appearance: none;\n}\n\n\n// Special styles for iOS temporal inputs\n//\n// In Mobile Safari, setting `display: block` on temporal inputs causes the\n// text within the input to become vertically misaligned. As a workaround, we\n// set a pixel line-height that matches the given height of the input, but only\n// for Safari.\n\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"],\n input[type=\"time\"],\n input[type=\"datetime-local\"],\n input[type=\"month\"] {\n line-height: @input-height-base;\n }\n input[type=\"date\"].input-sm,\n input[type=\"time\"].input-sm,\n input[type=\"datetime-local\"].input-sm,\n input[type=\"month\"].input-sm {\n line-height: @input-height-small;\n }\n input[type=\"date\"].input-lg,\n input[type=\"time\"].input-lg,\n input[type=\"datetime-local\"].input-lg,\n input[type=\"month\"].input-lg {\n line-height: @input-height-large;\n }\n}\n\n\n// Form groups\n//\n// Designed to help with the organization and spacing of vertical forms. For\n// horizontal forms, use the predefined grid classes.\n\n.form-group {\n margin-bottom: 15px;\n}\n\n\n// Checkboxes and radios\n//\n// Indent the labels to position radios/checkboxes as hanging controls.\n\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n\n label {\n min-height: @line-height-computed; // Ensure the input doesn't jump when there is no text\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer;\n }\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-left: -20px;\n margin-top: 4px \\9;\n}\n\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing\n}\n\n// Radios and checkboxes on same line\n.radio-inline,\n.checkbox-inline {\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n vertical-align: middle;\n font-weight: normal;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px; // space out consecutive inline controls\n}\n\n// Apply same disabled cursor tweak as for inputs\n// Some special care is needed because