From 3ed23f192a3f86dce310d1c78ce0c11626814cb5 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 22 Jul 2014 14:26:04 -0700 Subject: [PATCH 01/37] EMCC_ONLY_FORCED_STDLIBS option --- tests/test_other.py | 42 +++++++++++++++++++++++++++++++++++++++--- tools/system_libs.py | 8 +++++++- 2 files changed, 46 insertions(+), 4 deletions(-) diff --git a/tests/test_other.py b/tests/test_other.py index b7a7bd7a39152..32ae89234e963 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -3270,7 +3270,43 @@ class time_iterator { assert os.path.exists('a.out.js') # build should succeed self.assertContained('segmentation fault loading 4 bytes from address 0', run_js('a.out.js', assert_returncode=None, stderr=PIPE)) # program should segfault - def test_bad_lookup(self): - Popen([PYTHON, EMXX, path_from_root('tests', 'filesystem', 'bad_lookup.cpp')]).communicate() - self.assertContained('ok.', run_js('a.out.js')) + def test_only_force_stdlibs(self): + def test(name): + print name + Popen([PYTHON, EMXX, path_from_root('tests', 'hello_libcxx.cpp')], stderr=PIPE).communicate() + self.assertContained('hello, world!', run_js('a.out.js', stderr=PIPE)) + + test('normal') # normally is ok + + try: + os.environ['EMCC_FORCE_STDLIBS'] = 'libc,libcxxabi,libcxx' + test('forced libs is ok, they were there anyhow') + finally: + del os.environ['EMCC_FORCE_STDLIBS'] + + try: + os.environ['EMCC_FORCE_STDLIBS'] = 'libc' + test('partial list, but ok since we grab them as needed') + finally: + del os.environ['EMCC_FORCE_STDLIBS'] + + try: + os.environ['EMCC_FORCE_STDLIBS'] = 'libc' + os.environ['EMCC_ONLY_FORCED_STDLIBS'] = '1' + ok = False + test('fail! not enough stdlibs') + except: + ok = True + finally: + del os.environ['EMCC_FORCE_STDLIBS'] + del os.environ['EMCC_ONLY_FORCED_STDLIBS'] + assert ok + + try: + os.environ['EMCC_FORCE_STDLIBS'] = 'libc,libcxxabi,libcxx' + os.environ['EMCC_ONLY_FORCED_STDLIBS'] = '1' + test('force all the needed stdlibs, so this works even though we ignore the input file') + finally: + del os.environ['EMCC_FORCE_STDLIBS'] + del os.environ['EMCC_ONLY_FORCED_STDLIBS'] diff --git a/tools/system_libs.py b/tools/system_libs.py index 700f219ea50e1..9d46ae0f5139d 100644 --- a/tools/system_libs.py +++ b/tools/system_libs.py @@ -450,7 +450,7 @@ def create_gl(): if prev_cxx: os.environ['EMMAKEN_CXX'] = prev_cxx return o - # Settings this in the environment will avoid checking dependencies and make building big projects a little faster + # Setting this in the environment will avoid checking dependencies and make building big projects a little faster # 1 means include everything; otherwise it can be the name of a lib (libcxx, etc.) # You can provide 1 to include everything, or a comma-separated list with the ones you want force = os.environ.get('EMCC_FORCE_STDLIBS') @@ -458,6 +458,12 @@ def create_gl(): force = set((force or '').split(',') + forced) if force: logging.debug('forcing stdlibs: ' + str(force)) + # Setting this will only use the forced libs in EMCC_FORCE_STDLIBS. This avoids spending time checking + # for unresolved symbols in your project files, which can speed up linking, but if you do not have + # the proper list of actually needed libraries, errors can occur. + if os.environ.get('EMCC_ONLY_FORCED_STDLIBS'): + temp_files = [] + # Scan symbols symbolses = map(lambda temp_file: shared.Building.llvm_nm(temp_file), temp_files) From 1068519f7108bfaac1d4084502bcc16f9b93ae68 Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Tue, 22 Jul 2014 13:19:52 -0700 Subject: [PATCH 02/37] Implement compatibility. --- system/include/compat/sys/unistd.h | 1 + 1 file changed, 1 insertion(+) create mode 100644 system/include/compat/sys/unistd.h diff --git a/system/include/compat/sys/unistd.h b/system/include/compat/sys/unistd.h new file mode 100644 index 0000000000000..1e823fbd53c6d --- /dev/null +++ b/system/include/compat/sys/unistd.h @@ -0,0 +1 @@ +#include From a08f940413470312e2122935ac476da2cf761ae3 Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Tue, 22 Jul 2014 13:22:46 -0700 Subject: [PATCH 03/37] Update default environment variables and argv[0]. --- src/library.js | 10 +++++----- src/library_fs.js | 2 ++ src/postamble.js | 2 +- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/library.js b/src/library.js index a638e78af0115..75ad9823bd9a5 100644 --- a/src/library.js +++ b/src/library.js @@ -3182,12 +3182,12 @@ LibraryManager.library = { if (!___buildEnvironment.called) { ___buildEnvironment.called = true; // Set default values. Use string keys for Closure Compiler compatibility. - ENV['USER'] = 'root'; + ENV['USER'] = 'web_user'; ENV['PATH'] = '/'; ENV['PWD'] = '/'; - ENV['HOME'] = '/home/emscripten'; - ENV['LANG'] = 'en_US.UTF-8'; - ENV['_'] = './this.program'; + ENV['HOME'] = '/home/web_user'; + ENV['LANG'] = 'C'; + ENV['_'] = Module['thisProgram'] || './this.program'; // Allocate memory. poolPtr = allocate(TOTAL_ENV_SIZE, 'i8', ALLOC_STATIC); envPtr = allocate(MAX_ENV_VALUES * {{{ Runtime.QUANTUM_SIZE }}}, @@ -4900,7 +4900,7 @@ LibraryManager.library = { dladdr: function(addr, info) { // report all function pointers as coming from this program itself XXX not really correct in any way - var fname = allocate(intArrayFromString("/bin/this.program"), 'i8', ALLOC_NORMAL); // XXX leak + var fname = allocate(intArrayFromString(Module['thisProgram'] || './this.program'), 'i8', ALLOC_NORMAL); // XXX leak {{{ makeSetValue('addr', 0, 'fname', 'i32') }}}; {{{ makeSetValue('addr', QUANTUM_SIZE, '0', 'i32') }}}; {{{ makeSetValue('addr', QUANTUM_SIZE*2, '0', 'i32') }}}; diff --git a/src/library_fs.js b/src/library_fs.js index df89339d5d92f..6d51a7434efcc 100644 --- a/src/library_fs.js +++ b/src/library_fs.js @@ -1211,6 +1211,8 @@ mergeInto(LibraryManager.library, { }, createDefaultDirectories: function() { FS.mkdir('/tmp'); + FS.mkdir('/home'); + FS.mkdir('/home/web_user'); }, createDefaultDevices: function() { // create /dev diff --git a/src/postamble.js b/src/postamble.js index cd2060fd0cf70..8f2f228a4b09d 100644 --- a/src/postamble.js +++ b/src/postamble.js @@ -64,7 +64,7 @@ Module['callMain'] = Module.callMain = function callMain(args) { argv.push(0); } } - var argv = [allocate(intArrayFromString(Module['thisProgram'] || '/bin/this.program'), 'i8', ALLOC_NORMAL) ]; + var argv = [allocate(intArrayFromString(Module['thisProgram'] || './this.program'), 'i8', ALLOC_NORMAL) ]; pad(); for (var i = 0; i < argc-1; i = i + 1) { argv.push(allocate(intArrayFromString(args[i]), 'i8', ALLOC_NORMAL)); From e61582c9ae44efa76a724117dcaa8b224ade680c Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 22 Jul 2014 14:44:58 -0700 Subject: [PATCH 04/37] update test_env --- tests/env/output.txt | 8 ++++---- tests/test_core.py | 5 ++++- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/tests/env/output.txt b/tests/env/output.txt index 0ec9406491691..5ef902260f189 100644 --- a/tests/env/output.txt +++ b/tests/env/output.txt @@ -1,10 +1,10 @@ List: -USER=root +USER=web_user PATH=/ PWD=/ -HOME=/home/emscripten -LANG=en_US.UTF-8 -_=./this.program +HOME=/home/web_user +LANG=C +_={{{ THIS_PROGRAM }}} getenv(PATH): / getenv(NONEXISTENT): (null) diff --git a/tests/test_core.py b/tests/test_core.py index ac28023b3df02..88930cf0bdfe2 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -4542,7 +4542,10 @@ def test_uname(self): def test_env(self): src = open(path_from_root('tests', 'env', 'src.c'), 'r').read() expected = open(path_from_root('tests', 'env', 'output.txt'), 'r').read() - self.do_run(src, expected) + self.do_run(src, [ + expected.replace('{{{ THIS_PROGRAM }}}', './this.program'), # spidermonkey, v8 + expected.replace('{{{ THIS_PROGRAM }}}', self.get_dir() + '/src.cpp.o.js') # node, can find itself properly + ]) def test_systypes(self): src = open(path_from_root('tests', 'systypes', 'src.c'), 'r').read() From 768b56ca608e3035b4a9147329d1a33dcf9cfff0 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 22 Jul 2014 14:47:56 -0700 Subject: [PATCH 05/37] consolidate Module.thisProgram --- src/library.js | 2 +- src/postamble.js | 2 +- src/shell.js | 4 ++++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/library.js b/src/library.js index 75ad9823bd9a5..c9d1ab3506652 100644 --- a/src/library.js +++ b/src/library.js @@ -3187,7 +3187,7 @@ LibraryManager.library = { ENV['PWD'] = '/'; ENV['HOME'] = '/home/web_user'; ENV['LANG'] = 'C'; - ENV['_'] = Module['thisProgram'] || './this.program'; + ENV['_'] = Module['thisProgram']; // Allocate memory. poolPtr = allocate(TOTAL_ENV_SIZE, 'i8', ALLOC_STATIC); envPtr = allocate(MAX_ENV_VALUES * {{{ Runtime.QUANTUM_SIZE }}}, diff --git a/src/postamble.js b/src/postamble.js index 8f2f228a4b09d..49e352f40201a 100644 --- a/src/postamble.js +++ b/src/postamble.js @@ -64,7 +64,7 @@ Module['callMain'] = Module.callMain = function callMain(args) { argv.push(0); } } - var argv = [allocate(intArrayFromString(Module['thisProgram'] || './this.program'), 'i8', ALLOC_NORMAL) ]; + var argv = [allocate(intArrayFromString(Module['thisProgram']), 'i8', ALLOC_NORMAL) ]; pad(); for (var i = 0; i < argc-1; i = i + 1) { argv.push(allocate(intArrayFromString(args[i]), 'i8', ALLOC_NORMAL)); diff --git a/src/shell.js b/src/shell.js index 85b1333705789..7748ae72c704d 100644 --- a/src/shell.js +++ b/src/shell.js @@ -162,6 +162,10 @@ if (!Module['printErr']) { if (!Module['arguments']) { Module['arguments'] = []; } +if (!Module['thisProgram']) { + Module['thisProgram'] = './this.program'; +} + // *** Environment setup code *** // Closure helpers From a7479525153d57739c547158e3a5d87e33c8d2fd Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 22 Jul 2014 15:34:28 -0700 Subject: [PATCH 06/37] make environ work by itself; fixes #2557 --- src/library.js | 1 + tests/env/output-mini.txt | 6 ++++++ tests/env/src-mini.c | 13 +++++++++++++ tests/runner.py | 1 + tests/test_core.py | 8 ++++++++ 5 files changed, 29 insertions(+) create mode 100644 tests/env/output-mini.txt create mode 100644 tests/env/src-mini.c diff --git a/src/library.js b/src/library.js index c9d1ab3506652..26e4575ae1b34 100644 --- a/src/library.js +++ b/src/library.js @@ -3167,6 +3167,7 @@ LibraryManager.library = { {{{ makeStructuralReturn([makeGetTempDouble(0, 'i32'), makeGetTempDouble(1, 'i32')]) }}}; }, #endif + environ__deps: ['$ENV'], environ: 'allocate(1, "i32*", ALLOC_STATIC)', __environ__deps: ['environ'], __environ: 'environ', diff --git a/tests/env/output-mini.txt b/tests/env/output-mini.txt new file mode 100644 index 0000000000000..55a650d740beb --- /dev/null +++ b/tests/env/output-mini.txt @@ -0,0 +1,6 @@ +USER=web_user +PATH=/ +PWD=/ +HOME=/home/web_user +LANG=C +_={{{ THIS_PROGRAM }}} diff --git a/tests/env/src-mini.c b/tests/env/src-mini.c new file mode 100644 index 0000000000000..c8f02867d4318 --- /dev/null +++ b/tests/env/src-mini.c @@ -0,0 +1,13 @@ +#include +#include + +extern char **environ; + +int main(int argc, char *argv[]) +{ + int i; + for(i=0; environ[i] != NULL; i ++ ) { + printf("%s\n", environ[i]); + } +} + diff --git a/tests/runner.py b/tests/runner.py index 412f662cfa997..7c5548180e49a 100755 --- a/tests/runner.py +++ b/tests/runner.py @@ -466,6 +466,7 @@ def do_run(self, src, expected_output, args=[], output_nicerizer=None, output_pr js_engines = filter(lambda engine: engine not in self.banned_js_engines, js_engines) if len(js_engines) == 0: return self.skip('No JS engine present to run this test with. Check %s and the paths therein.' % EM_CONFIG) for engine in js_engines: + #print engine js_output = self.run_generated_code(engine, filename + '.o.js', args, output_nicerizer=output_nicerizer, assert_returncode=assert_returncode) self.assertContained(expected_output, js_output.replace('\r\n', '\n')) self.assertNotContained('ERROR', js_output) diff --git a/tests/test_core.py b/tests/test_core.py index 88930cf0bdfe2..f8ae02d0adde4 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -4547,6 +4547,14 @@ def test_env(self): expected.replace('{{{ THIS_PROGRAM }}}', self.get_dir() + '/src.cpp.o.js') # node, can find itself properly ]) + def test_environ(self): + src = open(path_from_root('tests', 'env', 'src-mini.c'), 'r').read() + expected = open(path_from_root('tests', 'env', 'output-mini.txt'), 'r').read() + self.do_run(src, [ + expected.replace('{{{ THIS_PROGRAM }}}', './this.program'), # spidermonkey, v8 + expected.replace('{{{ THIS_PROGRAM }}}', self.get_dir() + '/src.cpp.o.js') # node, can find itself properly + ]) + def test_systypes(self): src = open(path_from_root('tests', 'systypes', 'src.c'), 'r').read() expected = open(path_from_root('tests', 'systypes', 'output.txt'), 'r').read() From d6e755ea06d42d128dafc5121122d13bf5ac99a5 Mon Sep 17 00:00:00 2001 From: David Barksdale Date: Thu, 3 Jul 2014 18:09:52 -0500 Subject: [PATCH 07/37] Fix IDBFS for webworkers --- src/library_idbfs.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/library_idbfs.js b/src/library_idbfs.js index 8082c1968da5e..ebbaa7fc9d764 100644 --- a/src/library_idbfs.js +++ b/src/library_idbfs.js @@ -3,6 +3,7 @@ mergeInto(LibraryManager.library, { $IDBFS: { dbs: {}, indexedDB: function() { + if (typeof indexedDB !== 'undefined') return indexedDB; return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB; }, DB_VERSION: 21, From 2293efacacb0a8f6d61e239f78158365156721ee Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 22 Jul 2014 16:35:00 -0700 Subject: [PATCH 08/37] fix getFuncWrapper for aliased function pointers, fixes #2010 --- src/runtime.js | 10 +++++++--- tests/test_core.py | 22 ++++++++++++++++++++++ 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/runtime.js b/src/runtime.js index 96b122949b903..84ee4255f4f69 100644 --- a/src/runtime.js +++ b/src/runtime.js @@ -443,12 +443,16 @@ var Runtime = { getFuncWrapper: function(func, sig) { assert(sig); - if (!Runtime.funcWrappers[func]) { - Runtime.funcWrappers[func] = function dynCall_wrapper() { + if (!Runtime.funcWrappers[sig]) { + Runtime.funcWrappers[sig] = {}; + } + var sigCache = Runtime.funcWrappers[sig]; + if (!sigCache[func]) { + sigCache[func] = function dynCall_wrapper() { return Runtime.dynCall(sig, func, arguments); }; } - return Runtime.funcWrappers[func]; + return sigCache[func]; }, // Returns a processor of UTF. diff --git a/tests/test_core.py b/tests/test_core.py index f8ae02d0adde4..80f25a5e3f7b5 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -5872,6 +5872,28 @@ def test_add_function(self): self.emcc_args += ['--closure', '1'] self.do_run(src, expected) + def test_getFuncWrapper_sig_alias(self): + src = r''' + #include + #include + + void func1(int a) { + printf("func1\n"); + } + void func2(int a, int b) { + printf("func2\n"); + } + + int main() { + EM_ASM_INT({ + Runtime.getFuncWrapper($0, 'vi')(0); + Runtime.getFuncWrapper($1, 'vii')(0, 0); + }, func1, func2); + return 0; + } + ''' + self.do_run(src, 'func1\nfunc2\n') + def test_demangle_stacks(self): if Settings.ASM_JS: return self.skip('spidermonkey has stack trace issues') From 034362a6c77913ab8d4d68f47748f820831600ef Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 22 Jul 2014 16:43:02 -0700 Subject: [PATCH 09/37] give an error if IDBFS is used without IDB support --- src/library_idbfs.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/library_idbfs.js b/src/library_idbfs.js index ebbaa7fc9d764..0ce13db85025f 100644 --- a/src/library_idbfs.js +++ b/src/library_idbfs.js @@ -4,7 +4,10 @@ mergeInto(LibraryManager.library, { dbs: {}, indexedDB: function() { if (typeof indexedDB !== 'undefined') return indexedDB; - return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB; + var ret = null; + if (typeof window === 'object') ret = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB; + assert(ret, 'IDBFS used, but indexedDB not supported'); + return ret; }, DB_VERSION: 21, DB_STORE_NAME: 'FILE_DATA', From 4b795842aa4705e16e833b2c85ff458ba4d0ee86 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 22 Jul 2014 18:04:09 -0700 Subject: [PATCH 10/37] update test_fs_base --- tests/filesystem/output.txt | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/tests/filesystem/output.txt b/tests/filesystem/output.txt index 1262d1591c842..c5e088fe21a48 100644 --- a/tests/filesystem/output.txt +++ b/tests/filesystem/output.txt @@ -4,10 +4,10 @@ error: 0 path: / name: / - object.contents: ["tmp","dev","forbidden","abc","def"] + object.contents: ["tmp","home","dev","forbidden","abc","def"] parentExists: true parentPath: / - parentObject.contents: ["tmp","dev","forbidden","abc","def"] + parentObject.contents: ["tmp","home","dev","forbidden","abc","def"] . isRoot: false @@ -18,7 +18,7 @@ object.contents: ["123","456","deviceA","localLink","rootLink","relativeLink"] parentExists: true parentPath: / - parentObject.contents: ["tmp","dev","forbidden","abc","def"] + parentObject.contents: ["tmp","home","dev","forbidden","abc","def"] .. isRoot: true @@ -26,10 +26,10 @@ error: 0 path: / name: / - object.contents: ["tmp","dev","forbidden","abc","def"] + object.contents: ["tmp","home","dev","forbidden","abc","def"] parentExists: true parentPath: / - parentObject.contents: ["tmp","dev","forbidden","abc","def"] + parentObject.contents: ["tmp","home","dev","forbidden","abc","def"] ../.. isRoot: true @@ -37,10 +37,10 @@ error: 0 path: / name: / - object.contents: ["tmp","dev","forbidden","abc","def"] + object.contents: ["tmp","home","dev","forbidden","abc","def"] parentExists: true parentPath: / - parentObject.contents: ["tmp","dev","forbidden","abc","def"] + parentObject.contents: ["tmp","home","dev","forbidden","abc","def"] /abc isRoot: false @@ -51,7 +51,7 @@ object.contents: ["123","456","deviceA","localLink","rootLink","relativeLink"] parentExists: true parentPath: / - parentObject.contents: ["tmp","dev","forbidden","abc","def"] + parentObject.contents: ["tmp","home","dev","forbidden","abc","def"] /abc/123 isRoot: false @@ -103,10 +103,10 @@ error: 0 path: / name: / - object.contents: ["tmp","dev","forbidden","abc","def"] + object.contents: ["tmp","home","dev","forbidden","abc","def"] parentExists: true parentPath: / - parentObject.contents: ["tmp","dev","forbidden","abc","def"] + parentObject.contents: ["tmp","home","dev","forbidden","abc","def"] /abc/relativeLink isRoot: false @@ -117,7 +117,7 @@ object.contents: ["789","deviceB"] parentExists: true parentPath: / - parentObject.contents: ["tmp","dev","forbidden","abc","def"] + parentObject.contents: ["tmp","home","dev","forbidden","abc","def"] /abc/relativeLink/deviceB isRoot: false @@ -139,7 +139,7 @@ object.contents: null parentExists: true parentPath: / - parentObject.contents: ["tmp","dev","forbidden","abc","def"] + parentObject.contents: ["tmp","home","dev","forbidden","abc","def"] /abc/rootLink/abc/noexist isRoot: false @@ -161,7 +161,7 @@ object.contents: ["test"] parentExists: true parentPath: / - parentObject.contents: ["tmp","dev","forbidden","abc","def"] + parentObject.contents: ["tmp","home","dev","forbidden","abc","def"] /forbidden/test isRoot: false From 35263ecd5c2b2856c532ed2bcd242eea5e029213 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 22 Jul 2014 20:27:04 -0700 Subject: [PATCH 11/37] update other.test_mkdir_silly --- tests/test_other.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_other.py b/tests/test_other.py index 32ae89234e963..6b4e8e49e5942 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -2996,6 +2996,7 @@ def test_mkdir_silly(self): ., 4 .., 4 tmp, 4 + home, 4 dev, 4 ''', run_js('a.out.js', args=['/'])) # cannot create empty name, cannot open From ce11edd01291fd5cef34057a6689a16f3da7166a Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 23 Jul 2014 10:33:32 -0700 Subject: [PATCH 12/37] disable test_environ in non-fastcomp --- tests/test_core.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_core.py b/tests/test_core.py index 80f25a5e3f7b5..5a5b6a4b24ea1 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -4548,6 +4548,7 @@ def test_env(self): ]) def test_environ(self): + if os.environ.get('EMCC_FAST_COMPILER') == '0': return self.skip('needs fastcomp') src = open(path_from_root('tests', 'env', 'src-mini.c'), 'r').read() expected = open(path_from_root('tests', 'env', 'output-mini.txt'), 'r').read() self.do_run(src, [ From c20f95a32676a0395405dcc481cf068c211cc6e3 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 22 Jul 2014 17:54:53 -0700 Subject: [PATCH 13/37] keep a list of readdir() entries during read start; fixes #2528 --- src/library.js | 32 +++++++---- tests/test_other.py | 133 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 154 insertions(+), 11 deletions(-) diff --git a/src/library.js b/src/library.js index 26e4575ae1b34..704380bf4271c 100644 --- a/src/library.js +++ b/src/library.js @@ -60,6 +60,8 @@ LibraryManager.library = { // int closedir(DIR *dirp); // http://pubs.opengroup.org/onlinepubs/007908799/xsh/closedir.html var fd = _fileno(dirp); + var stream = FS.getStream(fd); + if (stream.currReading) stream.currReading = null; return _close(fd); }, telldir__deps: ['$FS', '__setErrNo', '$ERRNO_CODES'], @@ -85,6 +87,8 @@ LibraryManager.library = { // void rewinddir(DIR *dirp); // http://pubs.opengroup.org/onlinepubs/007908799/xsh/rewinddir.html _seekdir(dirp, 0); + var stream = FS.getStreamFromPtr(dirp); + if (stream.currReading) stream.currReading = null; }, readdir_r__deps: ['$FS', '__setErrNo', '$ERRNO_CODES'], readdir_r: function(dirp, entry, result) { @@ -94,25 +98,32 @@ LibraryManager.library = { if (!stream) { return ___setErrNo(ERRNO_CODES.EBADF); } - var entries; - try { - entries = FS.readdir(stream.path); - } catch (e) { - return FS.handleFSError(e); + if (!stream.currReading) { + try { + // load the list of entries now, then readdir will traverse that list, to ignore changes to files + stream.currReading = FS.readdir(stream.path); + } catch (e) { + return FS.handleFSError(e); + } } - if (stream.position < 0 || stream.position >= entries.length) { + if (stream.position < 0 || stream.position >= stream.currReading.length) { {{{ makeSetValue('result', '0', '0', 'i8*') }}}; return 0; } var id; var type; - var name = entries[stream.position]; - var offset = stream.position + 1; + var name = stream.currReading[stream.position++]; if (!name.indexOf('.')) { id = 1; type = 4; } else { - var child = FS.lookupNode(stream.node, name); + try { + // child may have been removed since we started to read this directory + var child = FS.lookupNode(stream.node, name); + } catch (e) { + // skip to the next entry (not infinite since position is incremented until currReading.length) + return _readdir_r(dirp, entry, result); + } id = child.id; type = FS.isChrdev(child.mode) ? 2 : // DT_CHR, character device. FS.isDir(child.mode) ? 4 : // DT_DIR, directory. @@ -120,7 +131,7 @@ LibraryManager.library = { 8; // DT_REG, regular file. } {{{ makeSetValue('entry', C_STRUCTS.dirent.d_ino, 'id', 'i32') }}}; - {{{ makeSetValue('entry', C_STRUCTS.dirent.d_off, 'offset', 'i32') }}}; + {{{ makeSetValue('entry', C_STRUCTS.dirent.d_off, 'stream.position', 'i32') }}}; {{{ makeSetValue('entry', C_STRUCTS.dirent.d_reclen, 'name.length + 1', 'i32') }}}; for (var i = 0; i < name.length; i++) { {{{ makeSetValue('entry + ' + C_STRUCTS.dirent.d_name, 'i', 'name.charCodeAt(i)', 'i8') }}}; @@ -128,7 +139,6 @@ LibraryManager.library = { {{{ makeSetValue('entry + ' + C_STRUCTS.dirent.d_name, 'i', '0', 'i8') }}}; {{{ makeSetValue('entry', C_STRUCTS.dirent.d_type, 'type', 'i8') }}}; {{{ makeSetValue('result', '0', 'entry', 'i8*') }}}; - stream.position++; return 0; }, readdir__deps: ['readdir_r', '__setErrNo', '$ERRNO_CODES'], diff --git a/tests/test_other.py b/tests/test_other.py index 6b4e8e49e5942..cc69981b22e04 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -3098,6 +3098,139 @@ def test_rename_silly(self): self.assertContained(r'''Failed to rename paths: 123, abc; errno=2''', run_js('a.out.js', args=['123', 'abc'])) self.assertContained(r'''Failed to rename paths: abc, ; errno=2''', run_js('a.out.js', args=['abc', ''])) + def test_readdir_r_silly(self): + open('src.cpp', 'w').write(r''' +#include +#include +#include +#include +#include +#include +#include +#include +#include +using std::endl; +namespace +{ + void check(const bool result) + { + if(not result) { + std::cout << "Check failed!" << endl; + throw "bad"; + } + } + // Do a recursive directory listing of the directory whose path is specified + // by \a name. + void ls(const std::string& name, std::size_t indent = 0) + { + ::DIR *dir; + struct ::dirent *entry; + if(indent == 0) { + std::cout << name << endl; + ++indent; + } + // Make sure we can open the directory. This should also catch cases where + // the empty string is passed in. + if (not (dir = ::opendir(name.c_str()))) { + const int error = errno; + std::cout + << "Failed to open directory: " << name << "; " << error << endl; + return; + } + // Just checking the sanity. + if (name.empty()) { + std::cout + << "Managed to open a directory whose name was the empty string.." + << endl; + check(::closedir(dir) != -1); + return; + } + // Iterate over the entries in the directory. + while ((entry = ::readdir(dir))) { + const std::string entryName(entry->d_name); + if (entryName == "." || entryName == "..") { + // Skip the dot entries. + continue; + } + const std::string indentStr(indent * 2, ' '); + if (entryName.empty()) { + std::cout + << indentStr << "\"\": Found empty string as a " + << (entry->d_type == DT_DIR ? "directory" : "file") + << " entry!" << endl; + continue; + } else { + std::cout << indentStr << entryName + << (entry->d_type == DT_DIR ? "/" : "") << endl; + } + if (entry->d_type == DT_DIR) { + // We found a subdirectory; recurse. + ls(std::string(name + (name == "/" ? "" : "/" ) + entryName), + indent + 1); + } + } + // Close our handle. + check(::closedir(dir) != -1); + } + void touch(const std::string &path) + { + const int fd = ::open(path.c_str(), O_CREAT | O_TRUNC, 0644); + check(fd != -1); + check(::close(fd) != -1); + } +} +int main() +{ + check(::mkdir("dir", 0755) == 0); + touch("dir/a"); + touch("dir/b"); + touch("dir/c"); + touch("dir/d"); + touch("dir/e"); + std::cout << "Before:" << endl; + ls("dir"); + std::cout << endl; + // Attempt to delete entries as we walk the (single) directory. + ::DIR * const dir = ::opendir("dir"); + check(dir != NULL); + struct ::dirent *entry; + while((entry = ::readdir(dir)) != NULL) { + const std::string name(entry->d_name); + // Skip "." and "..". + if(name == "." || name == "..") { + continue; + } + // Unlink it. + std::cout << "Unlinking " << name << endl; + check(::unlink(("dir/" + name).c_str()) != -1); + } + check(::closedir(dir) != -1); + std::cout << "After:" << endl; + ls("dir"); + std::cout << endl; + return 0; +} + ''') + Popen([PYTHON, EMCC, 'src.cpp']).communicate() + + # cannot symlink nonexistents + self.assertContained(r'''Before: +dir + a + b + c + d + e + +Unlinking a +Unlinking b +Unlinking c +Unlinking d +Unlinking e +After: +dir +''', run_js('a.out.js', args=['', 'abc'])) + def test_emversion(self): open('src.cpp', 'w').write(r''' #include From 48c839f2d2db6ef1e5620fe3f5087e58ce06a4c0 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 23 Jul 2014 10:55:04 -0700 Subject: [PATCH 14/37] docs improvements --- system/include/emscripten/emscripten.h | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/system/include/emscripten/emscripten.h b/system/include/emscripten/emscripten.h index b9f831972253b..a20e8d49cde21 100644 --- a/system/include/emscripten/emscripten.h +++ b/system/include/emscripten/emscripten.h @@ -311,14 +311,15 @@ inline void emscripten_async_call(em_arg_callback_func func, void *arg, int mill /* * Exits the program immediately, but leaves the runtime alive * so that you can continue to run code later (so global destructors - * etc. are not run). This is implicitly performed when you do - * an asynchronous operation like emscripten_async_call. + * etc. are not run). Note that the runtime is kept alive automatically + * when you do an asynchronous operation like emscripten_async_call, + * so you don't need to call this function in that case. */ extern void emscripten_exit_with_live_runtime(void); /* - * Shuts down the runtime and exits the program, as if you - * called exit(). The difference is that emscripten_force_exit + * Shuts down the runtime and exits (terminates) the program, as if + * you called exit(). The difference is that emscripten_force_exit * will shut down the runtime even if you previously called * emscripten_exit_with_live_runtime or otherwise kept the * runtime alive. In other words, this method gives you the From cf494983039c83036865782d639be041feb380ed Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 23 Jul 2014 12:00:17 -0700 Subject: [PATCH 15/37] update libcxxabi symbols --- system/lib/libcxxabi/symbols | 419 +++++++++++++++++++++++------------ 1 file changed, 272 insertions(+), 147 deletions(-) diff --git a/system/lib/libcxxabi/symbols b/system/lib/libcxxabi/symbols index 95d8d666aea90..f75f18834db83 100644 --- a/system/lib/libcxxabi/symbols +++ b/system/lib/libcxxabi/symbols @@ -1,78 +1,28 @@ - T _ZN10__cxxabiv116__enum_type_infoD0Ev - T _ZN10__cxxabiv116__enum_type_infoD1Ev - T _ZN10__cxxabiv116__enum_type_infoD2Ev - T _ZN10__cxxabiv116__shim_type_infoD0Ev - T _ZN10__cxxabiv116__shim_type_infoD1Ev - T _ZN10__cxxabiv116__shim_type_infoD2Ev - T _ZN10__cxxabiv117__array_type_infoD0Ev - T _ZN10__cxxabiv117__array_type_infoD1Ev - T _ZN10__cxxabiv117__array_type_infoD2Ev - T _ZN10__cxxabiv117__class_type_infoD0Ev - T _ZN10__cxxabiv117__class_type_infoD1Ev - T _ZN10__cxxabiv117__class_type_infoD2Ev - T _ZN10__cxxabiv117__pbase_type_infoD0Ev - T _ZN10__cxxabiv117__pbase_type_infoD1Ev - T _ZN10__cxxabiv117__pbase_type_infoD2Ev - T _ZN10__cxxabiv119__pointer_type_infoD0Ev - T _ZN10__cxxabiv119__pointer_type_infoD1Ev - T _ZN10__cxxabiv119__pointer_type_infoD2Ev - T _ZN10__cxxabiv120__function_type_infoD0Ev - T _ZN10__cxxabiv120__function_type_infoD1Ev - T _ZN10__cxxabiv120__function_type_infoD2Ev - T _ZN10__cxxabiv120__si_class_type_infoD0Ev - T _ZN10__cxxabiv120__si_class_type_infoD1Ev - T _ZN10__cxxabiv120__si_class_type_infoD2Ev - T _ZN10__cxxabiv121__vmi_class_type_infoD0Ev - T _ZN10__cxxabiv121__vmi_class_type_infoD1Ev - T _ZN10__cxxabiv121__vmi_class_type_infoD2Ev - T _ZN10__cxxabiv123__fundamental_type_infoD0Ev - T _ZN10__cxxabiv123__fundamental_type_infoD1Ev - T _ZN10__cxxabiv123__fundamental_type_infoD2Ev - T _ZN10__cxxabiv129__pointer_to_member_type_infoD0Ev - T _ZN10__cxxabiv129__pointer_to_member_type_infoD1Ev - T _ZN10__cxxabiv129__pointer_to_member_type_infoD2Ev - T _ZNK10__cxxabiv116__enum_type_info9can_catchEPKNS_16__shim_type_infoERPv - T _ZNK10__cxxabiv116__shim_type_info5noop1Ev - T _ZNK10__cxxabiv116__shim_type_info5noop2Ev - T _ZNK10__cxxabiv117__array_type_info9can_catchEPKNS_16__shim_type_infoERPv - T _ZNK10__cxxabiv117__class_type_info16search_above_dstEPNS_19__dynamic_cast_infoEPKvS4_ib - T _ZNK10__cxxabiv117__class_type_info16search_below_dstEPNS_19__dynamic_cast_infoEPKvib - T _ZNK10__cxxabiv117__class_type_info24process_found_base_classEPNS_19__dynamic_cast_infoEPvi - T _ZNK10__cxxabiv117__class_type_info27has_unambiguous_public_baseEPNS_19__dynamic_cast_infoEPvi - T _ZNK10__cxxabiv117__class_type_info29process_static_type_above_dstEPNS_19__dynamic_cast_infoEPKvS4_i - T _ZNK10__cxxabiv117__class_type_info29process_static_type_below_dstEPNS_19__dynamic_cast_infoEPKvi - T _ZNK10__cxxabiv117__class_type_info9can_catchEPKNS_16__shim_type_infoERPv - T _ZNK10__cxxabiv117__pbase_type_info9can_catchEPKNS_16__shim_type_infoERPv - T _ZNK10__cxxabiv119__pointer_type_info9can_catchEPKNS_16__shim_type_infoERPv - T _ZNK10__cxxabiv120__function_type_info9can_catchEPKNS_16__shim_type_infoERPv - T _ZNK10__cxxabiv120__si_class_type_info16search_above_dstEPNS_19__dynamic_cast_infoEPKvS4_ib - T _ZNK10__cxxabiv120__si_class_type_info16search_below_dstEPNS_19__dynamic_cast_infoEPKvib - T _ZNK10__cxxabiv120__si_class_type_info27has_unambiguous_public_baseEPNS_19__dynamic_cast_infoEPvi - T _ZNK10__cxxabiv121__vmi_class_type_info16search_above_dstEPNS_19__dynamic_cast_infoEPKvS4_ib - T _ZNK10__cxxabiv121__vmi_class_type_info16search_below_dstEPNS_19__dynamic_cast_infoEPKvib - T _ZNK10__cxxabiv121__vmi_class_type_info27has_unambiguous_public_baseEPNS_19__dynamic_cast_infoEPvi - T _ZNK10__cxxabiv122__base_class_type_info16search_above_dstEPNS_19__dynamic_cast_infoEPKvS4_ib - T _ZNK10__cxxabiv122__base_class_type_info16search_below_dstEPNS_19__dynamic_cast_infoEPKvib - T _ZNK10__cxxabiv122__base_class_type_info27has_unambiguous_public_baseEPNS_19__dynamic_cast_infoEPvi - T _ZNK10__cxxabiv123__fundamental_type_info9can_catchEPKNS_16__shim_type_infoERPv - T _ZNKSt10bad_typeid4whatEv - T _ZNKSt8bad_cast4whatEv - T _ZNSt10bad_typeidC1Ev - T _ZNSt10bad_typeidC2Ev - T _ZNSt10bad_typeidD0Ev - T _ZNSt10bad_typeidD1Ev - T _ZNSt10bad_typeidD2Ev - T _ZNSt8bad_castC1Ev - T _ZNSt8bad_castC2Ev - T _ZNSt8bad_castD0Ev - T _ZNSt8bad_castD1Ev - T _ZNSt8bad_castD2Ev - T _ZNSt9type_infoD0Ev - T _ZNSt9type_infoD1Ev - T _ZNSt9type_infoD2Ev + C __clang_call_terminate + C _ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv + C _ZNKSt3__121__basic_string_commonILb1EE20__throw_length_errorEv + C _ZNKSt3__121__basic_string_commonILb1EE20__throw_out_of_rangeEv + D __cxa_new_handler + D __cxa_terminate_handler + D __cxa_unexpected_handler + d _ZL5cause + d _ZN10__cxxabiv112_GLOBAL__N_14key_E + d _ZN10__cxxabiv112_GLOBAL__N_15flag_E + D _ZSt7nothrow + D _ZTIa + D _ZTIb + D _ZTIc + D _ZTId D _ZTIDi D _ZTIDn D _ZTIDs + D _ZTIe + D _ZTIf + D _ZTIh + D _ZTIi + D _ZTIj + D _ZTIl + D _ZTIm D _ZTIN10__cxxabiv116__enum_type_infoE D _ZTIN10__cxxabiv116__shim_type_infoE D _ZTIN10__cxxabiv117__array_type_infoE @@ -84,16 +34,25 @@ D _ZTIN10__cxxabiv121__vmi_class_type_infoE D _ZTIN10__cxxabiv123__fundamental_type_infoE D _ZTIN10__cxxabiv129__pointer_to_member_type_infoE + D _ZTIPa + D _ZTIPb + D _ZTIPc + D _ZTIPd D _ZTIPDi D _ZTIPDn D _ZTIPDs - D _ZTIPKDi - D _ZTIPKDn - D _ZTIPKDs + D _ZTIPe + D _ZTIPf + D _ZTIPh + D _ZTIPi + D _ZTIPj D _ZTIPKa D _ZTIPKb D _ZTIPKc D _ZTIPKd + D _ZTIPKDi + D _ZTIPKDn + D _ZTIPKDs D _ZTIPKe D _ZTIPKf D _ZTIPKh @@ -107,15 +66,6 @@ D _ZTIPKw D _ZTIPKx D _ZTIPKy - D _ZTIPa - D _ZTIPb - D _ZTIPc - D _ZTIPd - D _ZTIPe - D _ZTIPf - D _ZTIPh - D _ZTIPi - D _ZTIPj D _ZTIPl D _ZTIPm D _ZTIPs @@ -124,30 +74,43 @@ D _ZTIPw D _ZTIPx D _ZTIPy + D _ZTIs D _ZTISt10bad_typeid + D _ZTISt11logic_error + D _ZTISt11range_error + D _ZTISt12domain_error + D _ZTISt12length_error + D _ZTISt12out_of_range + D _ZTISt13bad_exception + D _ZTISt13runtime_error + D _ZTISt14overflow_error + D _ZTISt15underflow_error + D _ZTISt16bad_array_length + D _ZTISt16invalid_argument + D _ZTISt20bad_array_new_length D _ZTISt8bad_cast - C _ZTISt9exception + D _ZTISt9bad_alloc + D _ZTISt9exception D _ZTISt9type_info - D _ZTIa - D _ZTIb - D _ZTIc - D _ZTId - D _ZTIe - D _ZTIf - D _ZTIh - D _ZTIi - D _ZTIj - D _ZTIl - D _ZTIm - D _ZTIs D _ZTIt D _ZTIv D _ZTIw D _ZTIx D _ZTIy + D _ZTSa + D _ZTSb + D _ZTSc + D _ZTSd D _ZTSDi D _ZTSDn D _ZTSDs + D _ZTSe + D _ZTSf + D _ZTSh + D _ZTSi + D _ZTSj + D _ZTSl + D _ZTSm D _ZTSN10__cxxabiv116__enum_type_infoE D _ZTSN10__cxxabiv116__shim_type_infoE D _ZTSN10__cxxabiv117__array_type_infoE @@ -159,16 +122,25 @@ D _ZTSN10__cxxabiv121__vmi_class_type_infoE D _ZTSN10__cxxabiv123__fundamental_type_infoE D _ZTSN10__cxxabiv129__pointer_to_member_type_infoE + D _ZTSPa + D _ZTSPb + D _ZTSPc + D _ZTSPd D _ZTSPDi D _ZTSPDn D _ZTSPDs - D _ZTSPKDi - D _ZTSPKDn - D _ZTSPKDs + D _ZTSPe + D _ZTSPf + D _ZTSPh + D _ZTSPi + D _ZTSPj D _ZTSPKa D _ZTSPKb D _ZTSPKc D _ZTSPKd + D _ZTSPKDi + D _ZTSPKDn + D _ZTSPKDs D _ZTSPKe D _ZTSPKf D _ZTSPKh @@ -182,15 +154,6 @@ D _ZTSPKw D _ZTSPKx D _ZTSPKy - D _ZTSPa - D _ZTSPb - D _ZTSPc - D _ZTSPd - D _ZTSPe - D _ZTSPf - D _ZTSPh - D _ZTSPi - D _ZTSPj D _ZTSPl D _ZTSPm D _ZTSPs @@ -199,22 +162,24 @@ D _ZTSPw D _ZTSPx D _ZTSPy + D _ZTSs D _ZTSSt10bad_typeid + D _ZTSSt11logic_error + D _ZTSSt11range_error + D _ZTSSt12domain_error + D _ZTSSt12length_error + D _ZTSSt12out_of_range + D _ZTSSt13bad_exception + D _ZTSSt13runtime_error + D _ZTSSt14overflow_error + D _ZTSSt15underflow_error + D _ZTSSt16bad_array_length + D _ZTSSt16invalid_argument + D _ZTSSt20bad_array_new_length D _ZTSSt8bad_cast - C _ZTSSt9exception + D _ZTSSt9bad_alloc + D _ZTSSt9exception D _ZTSSt9type_info - D _ZTSa - D _ZTSb - D _ZTSc - D _ZTSd - D _ZTSe - D _ZTSf - D _ZTSh - D _ZTSi - D _ZTSj - D _ZTSl - D _ZTSm - D _ZTSs D _ZTSt D _ZTSv D _ZTSw @@ -232,52 +197,212 @@ D _ZTVN10__cxxabiv123__fundamental_type_infoE D _ZTVN10__cxxabiv129__pointer_to_member_type_infoE D _ZTVSt10bad_typeid + D _ZTVSt11logic_error + D _ZTVSt11range_error + D _ZTVSt12domain_error + D _ZTVSt12length_error + D _ZTVSt12out_of_range + D _ZTVSt13bad_exception + D _ZTVSt13runtime_error + D _ZTVSt14overflow_error + D _ZTVSt15underflow_error + D _ZTVSt16bad_array_length + D _ZTVSt16invalid_argument + D _ZTVSt20bad_array_new_length D _ZTVSt8bad_cast + D _ZTVSt9bad_alloc + D _ZTVSt9exception D _ZTVSt9type_info + d _ZZN10__cxxabiv112_GLOBAL__N_118parse_block_invokeINS0_2DbEEEPKcS4_S4_RT_E4test + T abort_message + T __cxa_bad_cast + T __cxa_bad_typeid + T __cxa_demangle + T __cxa_get_globals + T __cxa_get_globals_fast T __dynamic_cast - T _ZNSt9exceptionD1Ev - T _ZSt15get_new_handlerv - T _ZNSt9bad_allocD1Ev - T _ZTISt9bad_alloc - T _ZNSt9bad_allocC1Ev - W _ZdaPv - W _ZdaPvRKSt9nothrow_t - W _ZdlPv - W _ZdlPvRKSt9nothrow_t - W _Znaj - W _ZnajRKSt9nothrow_t - W _Znwj - W _ZnwjRKSt9nothrow_t + t _ZL25default_terminate_handlerv + t _ZL26default_unexpected_handlerv + t _ZN10__cxxabiv112_GLOBAL__N_110construct_Ev + t _ZN10__cxxabiv112_GLOBAL__N_110parse_nameINS0_2DbEEEPKcS4_S4_RT_ + t _ZN10__cxxabiv112_GLOBAL__N_110parse_typeINS0_2DbEEEPKcS4_S4_RT_ + t _ZN10__cxxabiv112_GLOBAL__N_111string_pairaSEOS1_ + t _ZN10__cxxabiv112_GLOBAL__N_114parse_decltypeINS0_2DbEEEPKcS4_S4_RT_ + t _ZN10__cxxabiv112_GLOBAL__N_114parse_encodingINS0_2DbEEEPKcS4_S4_RT_ + t _ZN10__cxxabiv112_GLOBAL__N_115parse_simple_idINS0_2DbEEEPKcS4_S4_RT_ + t _ZN10__cxxabiv112_GLOBAL__N_116parse_expressionINS0_2DbEEEPKcS4_S4_RT_ + t _ZN10__cxxabiv112_GLOBAL__N_117parse_source_nameINS0_2DbEEEPKcS4_S4_RT_ + t _ZN10__cxxabiv112_GLOBAL__N_118parse_builtin_typeINS0_2DbEEEPKcS4_S4_RT_ + t _ZN10__cxxabiv112_GLOBAL__N_118parse_expr_primaryINS0_2DbEEEPKcS4_S4_RT_ + t _ZN10__cxxabiv112_GLOBAL__N_118parse_substitutionINS0_2DbEEEPKcS4_S4_RT_ + t _ZN10__cxxabiv112_GLOBAL__N_118parse_template_argINS0_2DbEEEPKcS4_S4_RT_ + t _ZN10__cxxabiv112_GLOBAL__N_119parse_operator_nameINS0_2DbEEEPKcS4_S4_RT_ + t _ZN10__cxxabiv112_GLOBAL__N_119parse_template_argsINS0_2DbEEEPKcS4_S4_RT_ + t _ZN10__cxxabiv112_GLOBAL__N_120parse_function_paramINS0_2DbEEEPKcS4_S4_RT_ + t _ZN10__cxxabiv112_GLOBAL__N_120parse_template_paramINS0_2DbEEEPKcS4_S4_RT_ + t _ZN10__cxxabiv112_GLOBAL__N_121parse_integer_literalINS0_2DbEEEPKcS4_S4_RKNT_6StringERS5_ + t _ZN10__cxxabiv112_GLOBAL__N_121parse_unresolved_nameINS0_2DbEEEPKcS4_S4_RT_ + t _ZN10__cxxabiv112_GLOBAL__N_121parse_unresolved_typeINS0_2DbEEEPKcS4_S4_RT_ + t _ZN10__cxxabiv112_GLOBAL__N_122parse_unqualified_nameINS0_2DbEEEPKcS4_S4_RT_ + t _ZN10__cxxabiv112_GLOBAL__N_123parse_binary_expressionINS0_2DbEEEPKcS4_S4_RKNT_6StringERS5_ + t _ZN10__cxxabiv112_GLOBAL__N_123parse_prefix_expressionINS0_2DbEEEPKcS4_S4_RKNT_6StringERS5_ + t _ZN10__cxxabiv112_GLOBAL__N_126parse_base_unresolved_nameINS0_2DbEEEPKcS4_S4_RT_ + t _ZN10__cxxabiv112_GLOBAL__N_18demangleINS0_2DbEEEvPKcS4_RT_Ri + t _ZN10__cxxabiv112_GLOBAL__N_19base_nameINSt3__112basic_stringIcNS2_11char_traitsIcEENS0_12malloc_allocIcEEEEEET_RS9_ + t _ZN10__cxxabiv112_GLOBAL__N_19destruct_EPv + T _ZN10__cxxabiv116__enum_type_infoD0Ev + T _ZN10__cxxabiv116__enum_type_infoD1Ev + T _ZN10__cxxabiv116__enum_type_infoD2Ev + T _ZN10__cxxabiv116__shim_type_infoD0Ev + T _ZN10__cxxabiv116__shim_type_infoD1Ev + T _ZN10__cxxabiv116__shim_type_infoD2Ev + T _ZN10__cxxabiv117__array_type_infoD0Ev + T _ZN10__cxxabiv117__array_type_infoD1Ev + T _ZN10__cxxabiv117__array_type_infoD2Ev + T _ZN10__cxxabiv117__class_type_infoD0Ev + T _ZN10__cxxabiv117__class_type_infoD1Ev + T _ZN10__cxxabiv117__class_type_infoD2Ev + T _ZN10__cxxabiv117__pbase_type_infoD0Ev + T _ZN10__cxxabiv117__pbase_type_infoD1Ev + T _ZN10__cxxabiv117__pbase_type_infoD2Ev + T _ZN10__cxxabiv119__pointer_type_infoD0Ev + T _ZN10__cxxabiv119__pointer_type_infoD1Ev + T _ZN10__cxxabiv119__pointer_type_infoD2Ev + T _ZN10__cxxabiv120__function_type_infoD0Ev + T _ZN10__cxxabiv120__function_type_infoD1Ev + T _ZN10__cxxabiv120__function_type_infoD2Ev + T _ZN10__cxxabiv120__si_class_type_infoD0Ev + T _ZN10__cxxabiv120__si_class_type_infoD1Ev + T _ZN10__cxxabiv120__si_class_type_infoD2Ev + T _ZN10__cxxabiv121__vmi_class_type_infoD0Ev + T _ZN10__cxxabiv121__vmi_class_type_infoD1Ev + T _ZN10__cxxabiv121__vmi_class_type_infoD2Ev + T _ZN10__cxxabiv123__fundamental_type_infoD0Ev + T _ZN10__cxxabiv123__fundamental_type_infoD1Ev + T _ZN10__cxxabiv123__fundamental_type_infoD2Ev + T _ZN10__cxxabiv129__pointer_to_member_type_infoD0Ev + T _ZN10__cxxabiv129__pointer_to_member_type_infoD1Ev + T _ZN10__cxxabiv129__pointer_to_member_type_infoD2Ev + T _ZNK10__cxxabiv116__enum_type_info9can_catchEPKNS_16__shim_type_infoERPv + T _ZNK10__cxxabiv116__shim_type_info5noop1Ev + T _ZNK10__cxxabiv116__shim_type_info5noop2Ev + T _ZNK10__cxxabiv117__array_type_info9can_catchEPKNS_16__shim_type_infoERPv + T _ZNK10__cxxabiv117__class_type_info16search_above_dstEPNS_19__dynamic_cast_infoEPKvS4_ib + T _ZNK10__cxxabiv117__class_type_info16search_below_dstEPNS_19__dynamic_cast_infoEPKvib + T _ZNK10__cxxabiv117__class_type_info24process_found_base_classEPNS_19__dynamic_cast_infoEPvi + T _ZNK10__cxxabiv117__class_type_info27has_unambiguous_public_baseEPNS_19__dynamic_cast_infoEPvi + T _ZNK10__cxxabiv117__class_type_info29process_static_type_above_dstEPNS_19__dynamic_cast_infoEPKvS4_i + T _ZNK10__cxxabiv117__class_type_info29process_static_type_below_dstEPNS_19__dynamic_cast_infoEPKvi + T _ZNK10__cxxabiv117__class_type_info9can_catchEPKNS_16__shim_type_infoERPv + T _ZNK10__cxxabiv117__pbase_type_info9can_catchEPKNS_16__shim_type_infoERPv + T _ZNK10__cxxabiv119__pointer_type_info9can_catchEPKNS_16__shim_type_infoERPv + T _ZNK10__cxxabiv120__function_type_info9can_catchEPKNS_16__shim_type_infoERPv + T _ZNK10__cxxabiv120__si_class_type_info16search_above_dstEPNS_19__dynamic_cast_infoEPKvS4_ib + T _ZNK10__cxxabiv120__si_class_type_info16search_below_dstEPNS_19__dynamic_cast_infoEPKvib + T _ZNK10__cxxabiv120__si_class_type_info27has_unambiguous_public_baseEPNS_19__dynamic_cast_infoEPvi + T _ZNK10__cxxabiv121__vmi_class_type_info16search_above_dstEPNS_19__dynamic_cast_infoEPKvS4_ib + T _ZNK10__cxxabiv121__vmi_class_type_info16search_below_dstEPNS_19__dynamic_cast_infoEPKvib + T _ZNK10__cxxabiv121__vmi_class_type_info27has_unambiguous_public_baseEPNS_19__dynamic_cast_infoEPvi + T _ZNK10__cxxabiv122__base_class_type_info16search_above_dstEPNS_19__dynamic_cast_infoEPKvS4_ib + T _ZNK10__cxxabiv122__base_class_type_info16search_below_dstEPNS_19__dynamic_cast_infoEPKvib + T _ZNK10__cxxabiv122__base_class_type_info27has_unambiguous_public_baseEPNS_19__dynamic_cast_infoEPvi + T _ZNK10__cxxabiv123__fundamental_type_info9can_catchEPKNS_16__shim_type_infoERPv + T _ZNKSt10bad_typeid4whatEv + T _ZNKSt11logic_error4whatEv + T _ZNKSt13bad_exception4whatEv + T _ZNKSt13runtime_error4whatEv T _ZNKSt16bad_array_length4whatEv T _ZNKSt20bad_array_new_length4whatEv + T _ZNKSt8bad_cast4whatEv T _ZNKSt9bad_alloc4whatEv + T _ZNKSt9exception4whatEv + T _ZNSt10bad_typeidC1Ev + T _ZNSt10bad_typeidC2Ev + T _ZNSt10bad_typeidD0Ev + T _ZNSt10bad_typeidD1Ev + T _ZNSt10bad_typeidD2Ev + T _ZNSt11logic_errorD0Ev + T _ZNSt11logic_errorD1Ev + T _ZNSt11logic_errorD2Ev + T _ZNSt11range_errorD0Ev + T _ZNSt11range_errorD1Ev + T _ZNSt11range_errorD2Ev + T _ZNSt12domain_errorD0Ev + T _ZNSt12domain_errorD1Ev + T _ZNSt12domain_errorD2Ev + T _ZNSt12length_errorD0Ev + T _ZNSt12length_errorD1Ev + T _ZNSt12length_errorD2Ev + T _ZNSt12out_of_rangeD0Ev + T _ZNSt12out_of_rangeD1Ev + T _ZNSt12out_of_rangeD2Ev + T _ZNSt13bad_exceptionD0Ev + T _ZNSt13bad_exceptionD1Ev + T _ZNSt13bad_exceptionD2Ev + T _ZNSt13runtime_errorD0Ev + T _ZNSt13runtime_errorD1Ev + T _ZNSt13runtime_errorD2Ev + T _ZNSt14overflow_errorD0Ev + T _ZNSt14overflow_errorD1Ev + T _ZNSt14overflow_errorD2Ev + T _ZNSt15underflow_errorD0Ev + T _ZNSt15underflow_errorD1Ev + T _ZNSt15underflow_errorD2Ev T _ZNSt16bad_array_lengthC1Ev T _ZNSt16bad_array_lengthC2Ev T _ZNSt16bad_array_lengthD0Ev T _ZNSt16bad_array_lengthD1Ev T _ZNSt16bad_array_lengthD2Ev + T _ZNSt16invalid_argumentD0Ev + T _ZNSt16invalid_argumentD1Ev + T _ZNSt16invalid_argumentD2Ev T _ZNSt20bad_array_new_lengthC1Ev T _ZNSt20bad_array_new_lengthC2Ev T _ZNSt20bad_array_new_lengthD0Ev T _ZNSt20bad_array_new_lengthD1Ev T _ZNSt20bad_array_new_lengthD2Ev + t _ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE21__grow_by_and_replaceEjjjjjjPKc + t _ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendEPKcj + t _ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6appendIPKcEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueERS7_E4typeESC_SC_ + t _ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE6insertEjPKcj + t _ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEE9__grow_byEjjjjjj + t _ZNSt3__112basic_stringIcNS_11char_traitsIcEEN10__cxxabiv112_GLOBAL__N_112malloc_allocIcEEEaSERKS7_ + t _ZNSt3__113__vector_baseIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEED2Ev + t _ZNSt3__113__vector_baseINS_6vectorINS1_IN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEENS5_IS7_Lj4096EEEEENS5_IS9_Lj4096EEEED2Ev + t _ZNSt3__114__split_bufferINS_6vectorINS1_IN10__cxxabiv112_GLOBAL__N_111string_pairENS3_11short_allocIS4_Lj4096EEEEENS5_IS7_Lj4096EEEEERNS5_IS9_Lj4096EEEED2Ev + t _ZNSt3__16vectorIN10__cxxabiv112_GLOBAL__N_111string_pairENS2_11short_allocIS3_Lj4096EEEEC2EjRKS3_RKS5_ + T _ZNSt8bad_castC1Ev + T _ZNSt8bad_castC2Ev + T _ZNSt8bad_castD0Ev + T _ZNSt8bad_castD1Ev + T _ZNSt8bad_castD2Ev T _ZNSt9bad_allocC1Ev T _ZNSt9bad_allocC2Ev T _ZNSt9bad_allocD0Ev T _ZNSt9bad_allocD1Ev T _ZNSt9bad_allocD2Ev + T _ZNSt9exceptionD0Ev + T _ZNSt9exceptionD1Ev + T _ZNSt9exceptionD2Ev + T _ZNSt9type_infoD0Ev + T _ZNSt9type_infoD1Ev + T _ZNSt9type_infoD2Ev + T _ZSt10unexpectedv + T _ZSt11__terminatePFvvE + T _ZSt12__unexpectedPFvvE + T _ZSt13get_terminatev + T _ZSt13set_terminatePFvvE + T _ZSt14get_unexpectedv + T _ZSt14set_unexpectedPFvvE T _ZSt15get_new_handlerv T _ZSt15set_new_handlerPFvvE T _ZSt17__throw_bad_allocv - D _ZSt7nothrow - D _ZTISt16bad_array_length - D _ZTISt20bad_array_new_length - D _ZTISt9bad_alloc - C _ZTISt9exception - D _ZTSSt16bad_array_length - D _ZTSSt20bad_array_new_length - D _ZTSSt9bad_alloc - C _ZTSSt9exception - D _ZTVSt16bad_array_length - D _ZTVSt20bad_array_new_length - D _ZTVSt9bad_alloc + T _ZSt9terminatev + W _ZdaPv + W _ZdaPvRKSt9nothrow_t + W _ZdlPv + W _ZdlPvRKSt9nothrow_t + W _Znaj + W _ZnajRKSt9nothrow_t + W _Znwj + W _ZnwjRKSt9nothrow_t From ac641733e2b28e10fc128898137faa4d88f1f1b6 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 23 Jul 2014 12:07:12 -0700 Subject: [PATCH 16/37] run sanity checks with -v + an input file --- emcc | 1 + 1 file changed, 1 insertion(+) diff --git a/emcc b/emcc index 5c953f9ba890a..a4b2197fe4f21 100755 --- a/emcc +++ b/emcc @@ -1011,6 +1011,7 @@ try: newargs[i] = '' elif newargs[i] == '-v': shared.COMPILER_OPTS += ['-v'] + shared.check_sanity(force=True) newargs[i] = '' elif newargs[i].startswith('--shell-file'): check_bad_eq(newargs[i]) From e540fcf9d84eadb5127c2c53abad4c81257c19b5 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 23 Jul 2014 13:19:23 -0700 Subject: [PATCH 17/37] support strftime z|Z as best we can; fixes #2570 --- src/library.js | 21 ++++++++++--- tests/test_other.py | 77 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 94 insertions(+), 4 deletions(-) diff --git a/src/library.js b/src/library.js index 704380bf4271c..19d5e58b8e23d 100644 --- a/src/library.js +++ b/src/library.js @@ -5451,13 +5451,26 @@ LibraryManager.library = { // If tm_isdst is zero, the standard time offset is used. // If tm_isdst is greater than zero, the daylight savings time offset is used. // If tm_isdst is negative, no characters are returned. - // FIXME: we cannot determine time zone (or can we?) - return ''; + var ret = new Date().getTimezoneOffset(); + if (ret >= 0) { + ret = '' + ret; + while (ret.length < 4) ret = '0' + ret; + return '+' + ret; + } else { + ret = '' + ret; + ret = ret.substr(1); + while (ret.length < 4) ret = '0' + ret; + return '-' + ret; + } }, '%Z': function(date) { // Replaced by the timezone name or abbreviation, or by no bytes if no timezone information exists. [ tm_isdst] - // FIXME: we cannot determine time zone (or can we?) - return ''; + try { + // Date strings typically end in (PDT) or such. + return new Date().toString().split('(').slice(-1)[0].split(')')[0]; + } catch(e) { + return ''; // may not work in all browsers + } }, '%%': function() { return '%'; diff --git a/tests/test_other.py b/tests/test_other.py index cc69981b22e04..377a7408fd4d0 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -3444,3 +3444,80 @@ def test(name): del os.environ['EMCC_FORCE_STDLIBS'] del os.environ['EMCC_ONLY_FORCED_STDLIBS'] + def test_strftime_zZ(self): + open('src.cpp', 'w').write(r''' +#include +#include +#include +#include + +int main() +{ + // Buffer to hold the current hour of the day. Format is HH + nul + // character. + char hour[3]; + + // Buffer to hold our ISO 8601 formatted UTC offset for the current + // timezone. Format is [+-]hhmm + nul character. + char utcOffset[6]; + + // Buffer to hold the timezone name or abbreviation. Just make it + // sufficiently large to hold most timezone names. + char timezone[128]; + + std::tm tm; + + // Get the current timestamp. + const std::time_t now = std::time(NULL); + + // What time is that here? + if (::localtime_r(&now, &tm) == NULL) { + const int error = errno; + std::cout + << "Failed to get localtime for timestamp=" << now << "; errno=" << error + << "; " << std::strerror(error) << std::endl; + return 1; + } + + size_t result = 0; + + // Get the formatted hour of the day. + if ((result = std::strftime(hour, 3, "%H", &tm)) != 2) { + const int error = errno; + std::cout + << "Failed to format hour for timestamp=" << now << "; result=" + << result << "; errno=" << error << "; " << std::strerror(error) + << std::endl; + return 1; + } + std::cout << "The current hour of the day is: " << hour << std::endl; + + // Get the formatted UTC offset in ISO 8601 format. + if ((result = std::strftime(utcOffset, 6, "%z", &tm)) != 5) { + const int error = errno; + std::cout + << "Failed to format UTC offset for timestamp=" << now << "; result=" + << result << "; errno=" << error << "; " << std::strerror(error) + << std::endl; + return 1; + } + std::cout << "The current timezone offset is: " << utcOffset << std::endl; + + // Get the formatted timezone name or abbreviation. We don't know how long + // this will be, so just expect some data to be written to the buffer. + if ((result = std::strftime(timezone, 128, "%Z", &tm)) == 0) { + const int error = errno; + std::cout + << "Failed to format timezone for timestamp=" << now << "; result=" + << result << "; errno=" << error << "; " << std::strerror(error) + << std::endl; + return 1; + } + std::cout << "The current timezone is: " << timezone << std::endl; + + std::cout << "ok!\n"; +} +''') + Popen([PYTHON, EMCC, 'src.cpp']).communicate() + self.assertContained('ok!', run_js('a.out.js')) + From def1a97e075acb5fd23284d1a862e778366cf8ad Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 23 Jul 2014 13:37:48 -0700 Subject: [PATCH 18/37] fix truncate extending a file from size 0; fixes #2572 --- src/library_memfs.js | 4 +- tests/test_other.py | 116 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 119 insertions(+), 1 deletion(-) diff --git a/src/library_memfs.js b/src/library_memfs.js index 72ecdcfe6198e..857e9a1513d9d 100644 --- a/src/library_memfs.js +++ b/src/library_memfs.js @@ -155,7 +155,9 @@ mergeInto(LibraryManager.library, { if (!node.contents || node.contents.subarray) { // Resize a typed array if that is being used as the backing store. var oldContents = node.contents; node.contents = new Uint8Array(new ArrayBuffer(newSize)); // Allocate new storage. - node.contents.set(oldContents.subarray(0, Math.min(newSize, node.usedBytes))); // Copy old data over to the new storage. + if (oldContents) { + node.contents.set(oldContents.subarray(0, Math.min(newSize, node.usedBytes))); // Copy old data over to the new storage. + } node.usedBytes = newSize; return; } diff --git a/tests/test_other.py b/tests/test_other.py index 377a7408fd4d0..b492e7523c552 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -3521,3 +3521,119 @@ def test_strftime_zZ(self): Popen([PYTHON, EMCC, 'src.cpp']).communicate() self.assertContained('ok!', run_js('a.out.js')) + def test_truncate_from_0(self): + open('src.cpp', 'w').write(r''' +#include +#include +#include + +#include +#include +#include +#include + +using std::endl; + +//============================================================================ +// :: Helpers + +namespace +{ + // Returns the size of the regular file specified as 'path'. + ::off_t getSize(const char* const path) + { + // Stat the file and make sure that it's the expected size. + struct ::stat path_stat; + if (::stat(path, &path_stat) != 0) { + const int error = errno; + std::cout + << "Failed to lstat path: " << path << "; errno=" << error << "; " + << std::strerror(error) << endl; + return -1; + } + + std::cout + << "Size of file is: " << path_stat.st_size << endl; + return path_stat.st_size; + } + + // Causes the regular file specified in 'path' to have a size of 'length' + // bytes. + void resize(const char* const path, + const ::off_t length) + { + std::cout + << "Truncating file=" << path << " to length=" << length << endl; + if (::truncate(path, length) == -1) + { + const int error = errno; + std::cout + << "Failed to truncate file=" << path << "; errno=" << error + << "; " << std::strerror(error) << endl; + } + + const ::off_t size = getSize(path); + if (size != length) { + std::cout + << "Failed to truncate file=" << path << " to length=" << length + << "; got size=" << size << endl; + } + } + + // Helper to create a file with the given content. + void createFile(const std::string& path, const std::string& content) + { + std::cout + << "Creating file: " << path << " with content=" << content << endl; + + const int fd = ::open(path.c_str(), O_CREAT | O_WRONLY, 0644); + if (fd == -1) { + const int error = errno; + std::cout + << "Failed to open file for writing: " << path << "; errno=" << error + << "; " << std::strerror(error) << endl; + return; + } + + if (::write(fd, content.c_str(), content.size()) != content.size()) { + const int error = errno; + std::cout + << "Failed to write content=" << content << " to file=" << path + << "; errno=" << error << "; " << std::strerror(error) << endl; + + // Fall through to close FD. + } + + ::close(fd); + } +} + +//============================================================================ +// :: Entry Point +int main() +{ + const char* const file = "/tmp/file"; + createFile(file, "This is some content"); + getSize(file); + resize(file, 32); + resize(file, 17); + resize(file, 0); + + // This throws a JS exception. + resize(file, 32); + return 0; +} +''') + Popen([PYTHON, EMCC, 'src.cpp']).communicate() + self.assertContained(r'''Creating file: /tmp/file with content=This is some content +Size of file is: 20 +Truncating file=/tmp/file to length=32 +Size of file is: 32 +Truncating file=/tmp/file to length=17 +Size of file is: 17 +Truncating file=/tmp/file to length=0 +Size of file is: 0 +Truncating file=/tmp/file to length=32 +Size of file is: 32 +''', run_js('a.out.js')) + From 22a61be6749909e22917a4ba3e20722117eed5f9 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 23 Jul 2014 14:15:53 -0700 Subject: [PATCH 19/37] fix strftime z; #2570 --- src/library.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/library.js b/src/library.js index 19d5e58b8e23d..6e4c34a484f32 100644 --- a/src/library.js +++ b/src/library.js @@ -5452,6 +5452,10 @@ LibraryManager.library = { // If tm_isdst is greater than zero, the daylight savings time offset is used. // If tm_isdst is negative, no characters are returned. var ret = new Date().getTimezoneOffset(); + // convert from minutes into hhmm format (which means 60 minutes = 100 units) + var minutes = ret % 60; + ret = (100*(ret - minutes)/60) + minutes; + // add sign and adjust length to ?hhmm if (ret >= 0) { ret = '' + ret; while (ret.length < 4) ret = '0' + ret; From 0f87798a9b71fc635cbdde01e0aa3879e47bac21 Mon Sep 17 00:00:00 2001 From: Lu Wang Date: Wed, 23 Jul 2014 15:41:25 -0700 Subject: [PATCH 20/37] fix indent --- src/library_fs.js | 92 +++++++++++++++++++++++------------------------ 1 file changed, 46 insertions(+), 46 deletions(-) diff --git a/src/library_fs.js b/src/library_fs.js index 6d51a7434efcc..3e37718a69843 100644 --- a/src/library_fs.js +++ b/src/library_fs.js @@ -1549,61 +1549,61 @@ mergeInto(LibraryManager.library, { this.getter = getter; } LazyUint8Array.prototype.cacheLength = function LazyUint8Array_cacheLength() { - // Find length - var xhr = new XMLHttpRequest(); - xhr.open('HEAD', url, false); - xhr.send(null); - if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); - var datalength = Number(xhr.getResponseHeader("Content-length")); - var header; - var hasByteServing = (header = xhr.getResponseHeader("Accept-Ranges")) && header === "bytes"; + // Find length + var xhr = new XMLHttpRequest(); + xhr.open('HEAD', url, false); + xhr.send(null); + if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); + var datalength = Number(xhr.getResponseHeader("Content-length")); + var header; + var hasByteServing = (header = xhr.getResponseHeader("Accept-Ranges")) && header === "bytes"; #if SMALL_XHR_CHUNKS - var chunkSize = 1024; // Chunk size in bytes + var chunkSize = 1024; // Chunk size in bytes #else - var chunkSize = 1024*1024; // Chunk size in bytes + var chunkSize = 1024*1024; // Chunk size in bytes #endif - if (!hasByteServing) chunkSize = datalength; + if (!hasByteServing) chunkSize = datalength; - // Function to get a range from the remote URL. - var doXHR = (function(from, to) { - if (from > to) throw new Error("invalid range (" + from + ", " + to + ") or no bytes requested!"); - if (to > datalength-1) throw new Error("only " + datalength + " bytes available! programmer error!"); + // Function to get a range from the remote URL. + var doXHR = (function(from, to) { + if (from > to) throw new Error("invalid range (" + from + ", " + to + ") or no bytes requested!"); + if (to > datalength-1) throw new Error("only " + datalength + " bytes available! programmer error!"); - // TODO: Use mozResponseArrayBuffer, responseStream, etc. if available. - var xhr = new XMLHttpRequest(); - xhr.open('GET', url, false); - if (datalength !== chunkSize) xhr.setRequestHeader("Range", "bytes=" + from + "-" + to); + // TODO: Use mozResponseArrayBuffer, responseStream, etc. if available. + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, false); + if (datalength !== chunkSize) xhr.setRequestHeader("Range", "bytes=" + from + "-" + to); - // Some hints to the browser that we want binary data. - if (typeof Uint8Array != 'undefined') xhr.responseType = 'arraybuffer'; - if (xhr.overrideMimeType) { - xhr.overrideMimeType('text/plain; charset=x-user-defined'); - } + // Some hints to the browser that we want binary data. + if (typeof Uint8Array != 'undefined') xhr.responseType = 'arraybuffer'; + if (xhr.overrideMimeType) { + xhr.overrideMimeType('text/plain; charset=x-user-defined'); + } - xhr.send(null); - if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); - if (xhr.response !== undefined) { - return new Uint8Array(xhr.response || []); - } else { - return intArrayFromString(xhr.responseText || '', true); - } - }); - var lazyArray = this; - lazyArray.setDataGetter(function(chunkNum) { - var start = chunkNum * chunkSize; - var end = (chunkNum+1) * chunkSize - 1; // including this byte - end = Math.min(end, datalength-1); // if datalength-1 is selected, this is the last block - if (typeof(lazyArray.chunks[chunkNum]) === "undefined") { - lazyArray.chunks[chunkNum] = doXHR(start, end); - } - if (typeof(lazyArray.chunks[chunkNum]) === "undefined") throw new Error("doXHR failed!"); - return lazyArray.chunks[chunkNum]; - }); + xhr.send(null); + if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); + if (xhr.response !== undefined) { + return new Uint8Array(xhr.response || []); + } else { + return intArrayFromString(xhr.responseText || '', true); + } + }); + var lazyArray = this; + lazyArray.setDataGetter(function(chunkNum) { + var start = chunkNum * chunkSize; + var end = (chunkNum+1) * chunkSize - 1; // including this byte + end = Math.min(end, datalength-1); // if datalength-1 is selected, this is the last block + if (typeof(lazyArray.chunks[chunkNum]) === "undefined") { + lazyArray.chunks[chunkNum] = doXHR(start, end); + } + if (typeof(lazyArray.chunks[chunkNum]) === "undefined") throw new Error("doXHR failed!"); + return lazyArray.chunks[chunkNum]; + }); - this._length = datalength; - this._chunkSize = chunkSize; - this.lengthKnown = true; + this._length = datalength; + this._chunkSize = chunkSize; + this.lengthKnown = true; } if (typeof XMLHttpRequest !== 'undefined') { if (!ENVIRONMENT_IS_WORKER) throw 'Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc'; From 07ca8af723dfd9237a3fe584f7be05a2f9809c8a Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 23 Jul 2014 19:15:34 -0700 Subject: [PATCH 21/37] disable test_exceptions_alias in s_x_x --- tests/test_core.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/test_core.py b/tests/test_core.py index 5a5b6a4b24ea1..20395b00a657e 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -1479,6 +1479,8 @@ def test_exceptions_std(self): self.do_run_from_file(src, output) def test_exceptions_alias(self): + if self.emcc_args is None: return self.skip('requires emcc') + Settings.DISABLE_EXCEPTION_CATCHING = 0 test_path = path_from_root('tests', 'core', 'test_exceptions_alias') src, output = (test_path + s for s in ('.c', '.out')) From 7fb65262250d5cffe913122904d066fc1745d406 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 24 Jul 2014 12:46:54 -0700 Subject: [PATCH 22/37] warn on -s X=Y of invalid keys, and suggest corrections; fixes #2579 --- src/settings.js | 1 + tests/test_other.py | 10 ++++++++++ tools/shared.py | 8 ++++++++ 3 files changed, 19 insertions(+) diff --git a/src/settings.js b/src/settings.js index b7947ac874386..943d092b7fba4 100644 --- a/src/settings.js +++ b/src/settings.js @@ -349,6 +349,7 @@ var EXPORTED_FUNCTIONS = ['_main', '_malloc']; // have a main() function and want it to run, you must include it in this // list (as _main is by default in this value, and if you override it // without keeping it there, you are in effect removing it). +var ORIGINAL_EXPORTED_FUNCTIONS = []; // For internal use only var EXPORT_ALL = 0; // If true, we export all the symbols. Note that this does *not* affect LLVM, so it can // still eliminate functions as dead. This just exports them on the Module object. var EXPORT_BINDINGS = 0; // Export all bindings generator functions (prefixed with emscripten_bind_). This diff --git a/tests/test_other.py b/tests/test_other.py index b492e7523c552..c2172b7de426c 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -3637,3 +3637,13 @@ def test_truncate_from_0(self): Size of file is: 32 ''', run_js('a.out.js')) + def test_emcc_s_typo(self): + # with suggestions + out, err = Popen([PYTHON, EMCC, path_from_root('tests', 'hello_world.c'), '-s', 'RELOO=1'], stderr=PIPE).communicate() + self.assertContained(r'''Assigning a non-existent settings attribute "RELOO"''', err) + self.assertContained(r'''did you mean one of RELOOP, RELOOPER?''', err) + # no suggestions + out, err = Popen([PYTHON, EMCC, path_from_root('tests', 'hello_world.c'), '-s', 'CHEEZ=1'], stderr=PIPE).communicate() + self.assertContained(r'''perhaps a typo in emcc's -s X=Y notation?''', err) + self.assertContained(r'''(see src/settings.js for valid values)''', err) + diff --git a/tools/shared.py b/tools/shared.py index 0570d0a04c1f4..1d1f805f8b7b6 100644 --- a/tools/shared.py +++ b/tools/shared.py @@ -920,6 +920,14 @@ def __getattr__(self, attr): raise AttributeError def __setattr__(self, attr, value): + if not attr in self.attrs: + import difflib + logging.warning('''Assigning a non-existent settings attribute "%s"''' % attr) + suggestions = ', '.join(difflib.get_close_matches(attr, self.attrs.keys())) + if suggestions: + logging.warning(''' - did you mean one of %s?''' % suggestions) + logging.warning(''' - perhaps a typo in emcc's -s X=Y notation?''') + logging.warning(''' - (see src/settings.js for valid values)''') self.attrs[attr] = value __instance = None From 22adc057291b71f64ae0aef502fa695a9f618fb1 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 24 Jul 2014 13:58:50 -0700 Subject: [PATCH 23/37] allow creating read-only files; fixes #2573 --- src/library_fs.js | 14 ++++++--- tests/test_other.py | 77 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+), 4 deletions(-) diff --git a/src/library_fs.js b/src/library_fs.js index 3e37718a69843..ae89571537b60 100644 --- a/src/library_fs.js +++ b/src/library_fs.js @@ -975,6 +975,7 @@ mergeInto(LibraryManager.library, { } } // perhaps we need to create the node + var created = false; if ((flags & {{{ cDefine('O_CREAT') }}})) { if (node) { // if O_CREAT and O_EXCL are set, error out if the node already exists @@ -984,6 +985,7 @@ mergeInto(LibraryManager.library, { } else { // node doesn't exist, try to create it node = FS.mknod(path, mode, 0); + created = true; } } if (!node) { @@ -993,10 +995,14 @@ mergeInto(LibraryManager.library, { if (FS.isChrdev(node.mode)) { flags &= ~{{{ cDefine('O_TRUNC') }}}; } - // check permissions - var err = FS.mayOpen(node, flags); - if (err) { - throw new FS.ErrnoError(err); + // check permissions, if this is not a file we just created now (it is ok to + // create and write to a file with read-only permissions; it is read-only + // for later use) + if (!created) { + var err = FS.mayOpen(node, flags); + if (err) { + throw new FS.ErrnoError(err); + } } // do truncation if necessary if ((flags & {{{ cDefine('O_TRUNC')}}})) { diff --git a/tests/test_other.py b/tests/test_other.py index c2172b7de426c..464af16d4d3c5 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -3647,3 +3647,80 @@ def test_emcc_s_typo(self): self.assertContained(r'''perhaps a typo in emcc's -s X=Y notation?''', err) self.assertContained(r'''(see src/settings.js for valid values)''', err) + def test_create_readonly(self): + open('src.cpp', 'w').write(r''' +#include +#include +#include + +#include +#include + +using std::endl; + +//============================================================================ +// :: Helpers + +namespace +{ + // Helper to create a read-only file with content. + void readOnlyFile(const std::string& path, const std::string& content) + { + std::cout + << "Creating file: " << path << " with content of size=" + << content.size() << endl; + + const int fd = ::open(path.c_str(), O_CREAT | O_WRONLY, 0400); + if (fd == -1) { + const int error = errno; + std::cout + << "Failed to open file for writing: " << path << "; errno=" << error + << "; " << std::strerror(error) << endl; + return; + } + + // Write the content to the file. + ssize_t result = 0; + if ((result = ::write(fd, content.data(), content.size())) + != ssize_t(content.size())) + { + const int error = errno; + std::cout + << "Failed to write to file=" << path << "; errno=" << error + << "; " << std::strerror(error) << endl; + // Fall through to close the file. + } + else { + std::cout + << "Data written to file=" << path << "; successfully wrote " + << result << " bytes" << endl; + } + + ::close(fd); + } +} + +//============================================================================ +// :: Entry Point + +int main() +{ + const char* const file = "/tmp/file"; + unlink(file); + readOnlyFile(file, "This content should get written because the file " + "does not yet exist and so, only the mode of the " + "containing directory will influence my ability to " + "create and open the file. The mode of the file only " + "applies to opening of the stream, not subsequent stream " + "operations after stream has opened.\n\n"); + readOnlyFile(file, "This should not get written because the file already " + "exists and is read-only.\n\n"); +} +''') + Popen([PYTHON, EMCC, 'src.cpp']).communicate() + self.assertContained(r'''Creating file: /tmp/file with content of size=292 +Data written to file=/tmp/file; successfully wrote 292 bytes +Creating file: /tmp/file with content of size=79 +Failed to open file for writing: /tmp/file; errno=13; Permission denied +''', run_js('a.out.js')) + From 7286eaafc5ca7b0ee7c5ee737ece0c1f6d1554a4 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 24 Jul 2014 15:35:23 -0700 Subject: [PATCH 24/37] remove annoying unnecessary logging message of forced stdlibs when there are none --- tools/system_libs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/system_libs.py b/tools/system_libs.py index 9d46ae0f5139d..01b8ec0e40b09 100644 --- a/tools/system_libs.py +++ b/tools/system_libs.py @@ -455,7 +455,7 @@ def create_gl(): # You can provide 1 to include everything, or a comma-separated list with the ones you want force = os.environ.get('EMCC_FORCE_STDLIBS') force_all = force == '1' - force = set((force or '').split(',') + forced) + force = set((force.split(',') if force else []) + forced) if force: logging.debug('forcing stdlibs: ' + str(force)) # Setting this will only use the forced libs in EMCC_FORCE_STDLIBS. This avoids spending time checking From 424862ff20e0035186df58dc3812b40334b77825 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 24 Jul 2014 15:44:29 -0700 Subject: [PATCH 25/37] ignore empty functions in tools/find_bigfuncs --- tools/find_bigfuncs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/find_bigfuncs.py b/tools/find_bigfuncs.py index 79136343c7199..d2eb3bd240534 100644 --- a/tools/find_bigfuncs.py +++ b/tools/find_bigfuncs.py @@ -11,7 +11,7 @@ data = [] for line in open(filename): i += 1 - if line.startswith(('function ', 'define ')): + if line.startswith(('function ', 'define ')) and '}' not in line: start = i curr = line elif line.startswith('}') and curr: From fed28a40adc8f223e19284528279fddf52e26438 Mon Sep 17 00:00:00 2001 From: hamishwillee Date: Thu, 24 Jul 2014 21:15:24 +1000 Subject: [PATCH 26/37] Full site with API reference and default sphinx_rtd_theme --- site/.gitignore | 8 + site/Makefile | 177 ++ site/make.bat | 242 +++ site/source/_static/Emscripten_logo_full.png | Bin 0 -> 43854 bytes site/source/_static/Thumbs.db | Bin 0 -> 34816 bytes .../emscripten_sphinx_rtd_theme/__init__.py | 17 + .../breadcrumbs.html | 19 + .../emscripten_sphinx_rtd_theme/footer.html | 32 + .../emscripten_sphinx_rtd_theme/layout.html | 160 ++ .../layout_old.html | 205 ++ .../emscripten_sphinx_rtd_theme/search.html | 50 + .../searchbox.html | 7 + .../static/css/badge_only.css | 1 + .../static/css/theme.css | 4 + .../static/fonts/fontawesome-webfont.eot | Bin 0 -> 38205 bytes .../static/fonts/fontawesome-webfont.svg | 414 ++++ .../static/fonts/fontawesome-webfont.ttf | Bin 0 -> 80652 bytes .../static/fonts/fontawesome-webfont.woff | Bin 0 -> 44432 bytes .../static/js/theme.js | 47 + .../emscripten_sphinx_rtd_theme/theme.conf | 8 + .../emscripten_sphinx_rtd_theme/versions.html | 37 + site/source/api_items.py | 273 +++ site/source/conf.py | 394 ++++ .../docs/api_reference/advanced-apis.rst | 49 + .../docs/api_reference/emscripten.h.rst | 814 ++++++++ site/source/docs/api_reference/html5.h.rst | 1745 +++++++++++++++++ site/source/docs/api_reference/index.rst | 24 + .../source/docs/api_reference/preamble.js.rst | 416 ++++ site/source/docs/contributing/AUTHORS.rst | 14 + .../source/docs/contributing/contributing.rst | 60 + .../docs/contributing/developers_guide.rst | 6 + site/source/docs/contributing/index.rst | 16 + .../contributing/installing_from_source.rst | 103 + .../docs/getting_started/bug_reports.rst | 40 + site/source/docs/getting_started/contact.rst | 17 + .../source/docs/getting_started/downloads.rst | 212 ++ .../getting_started/emscripten_license.rst | 16 + site/source/docs/getting_started/index.rst | 15 + .../docs/getting_started/release_notes.rst | 20 + .../docs/getting_started/searching_site.rst | 5 + site/source/docs/index.rst | 13 + site/source/docs/site/about.rst | 6 + site/source/docs/site/blogs.rst | 14 + site/source/docs/site/index.rst | 13 + ...g-started-emscripten-wikiEmscriptenSDK.rst | 37 + site/source/get_api_items_py | 117 ++ site/source/get_wiki.py | 243 +++ site/source/home_page_layout.html | 35 + site/source/index.rst | 48 + 49 files changed, 6193 insertions(+) create mode 100644 site/.gitignore create mode 100644 site/Makefile create mode 100644 site/make.bat create mode 100644 site/source/_static/Emscripten_logo_full.png create mode 100644 site/source/_static/Thumbs.db create mode 100644 site/source/_themes/emscripten_sphinx_rtd_theme/__init__.py create mode 100644 site/source/_themes/emscripten_sphinx_rtd_theme/breadcrumbs.html create mode 100644 site/source/_themes/emscripten_sphinx_rtd_theme/footer.html create mode 100644 site/source/_themes/emscripten_sphinx_rtd_theme/layout.html create mode 100644 site/source/_themes/emscripten_sphinx_rtd_theme/layout_old.html create mode 100644 site/source/_themes/emscripten_sphinx_rtd_theme/search.html create mode 100644 site/source/_themes/emscripten_sphinx_rtd_theme/searchbox.html create mode 100644 site/source/_themes/emscripten_sphinx_rtd_theme/static/css/badge_only.css create mode 100644 site/source/_themes/emscripten_sphinx_rtd_theme/static/css/theme.css create mode 100644 site/source/_themes/emscripten_sphinx_rtd_theme/static/fonts/fontawesome-webfont.eot create mode 100644 site/source/_themes/emscripten_sphinx_rtd_theme/static/fonts/fontawesome-webfont.svg create mode 100644 site/source/_themes/emscripten_sphinx_rtd_theme/static/fonts/fontawesome-webfont.ttf create mode 100644 site/source/_themes/emscripten_sphinx_rtd_theme/static/fonts/fontawesome-webfont.woff create mode 100644 site/source/_themes/emscripten_sphinx_rtd_theme/static/js/theme.js create mode 100644 site/source/_themes/emscripten_sphinx_rtd_theme/theme.conf create mode 100644 site/source/_themes/emscripten_sphinx_rtd_theme/versions.html create mode 100644 site/source/api_items.py create mode 100644 site/source/conf.py create mode 100644 site/source/docs/api_reference/advanced-apis.rst create mode 100644 site/source/docs/api_reference/emscripten.h.rst create mode 100644 site/source/docs/api_reference/html5.h.rst create mode 100644 site/source/docs/api_reference/index.rst create mode 100644 site/source/docs/api_reference/preamble.js.rst create mode 100644 site/source/docs/contributing/AUTHORS.rst create mode 100644 site/source/docs/contributing/contributing.rst create mode 100644 site/source/docs/contributing/developers_guide.rst create mode 100644 site/source/docs/contributing/index.rst create mode 100644 site/source/docs/contributing/installing_from_source.rst create mode 100644 site/source/docs/getting_started/bug_reports.rst create mode 100644 site/source/docs/getting_started/contact.rst create mode 100644 site/source/docs/getting_started/downloads.rst create mode 100644 site/source/docs/getting_started/emscripten_license.rst create mode 100644 site/source/docs/getting_started/index.rst create mode 100644 site/source/docs/getting_started/release_notes.rst create mode 100644 site/source/docs/getting_started/searching_site.rst create mode 100644 site/source/docs/index.rst create mode 100644 site/source/docs/site/about.rst create mode 100644 site/source/docs/site/blogs.rst create mode 100644 site/source/docs/site/index.rst create mode 100644 site/source/docs/temp-fragments/getting-started-emscripten-wikiEmscriptenSDK.rst create mode 100644 site/source/get_api_items_py create mode 100644 site/source/get_wiki.py create mode 100644 site/source/home_page_layout.html create mode 100644 site/source/index.rst diff --git a/site/.gitignore b/site/.gitignore new file mode 100644 index 0000000000000..873d48e7dda69 --- /dev/null +++ b/site/.gitignore @@ -0,0 +1,8 @@ +*.diff +*.pyc +*~ +*.bc +*.md + +# Ignore generated files +build/ diff --git a/site/Makefile b/site/Makefile new file mode 100644 index 0000000000000..b23262afff318 --- /dev/null +++ b/site/Makefile @@ -0,0 +1,177 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +BUILDDIR = build + +# User-friendly check for sphinx-build +ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) +$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/) +endif + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source +# the i18n builder cannot share the environment and doctrees with the others +I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source + +.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext + +help: + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " singlehtml to make a single large HTML file" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " devhelp to make HTML files and a Devhelp project" + @echo " epub to make an epub" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " texinfo to make Texinfo files" + @echo " info to make Texinfo files and run them through makeinfo" + @echo " gettext to make PO message catalogs" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " xml to make Docutils-native XML files" + @echo " pseudoxml to make pseudoxml-XML files for display purposes" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + +clean: + rm -rf $(BUILDDIR)/* + +html: + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +dirhtml: + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +singlehtml: + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Emscripten.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Emscripten.qhc" + +devhelp: + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." + @echo "To view the help file:" + @echo "# mkdir -p $$HOME/.local/share/devhelp/Emscripten" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Emscripten" + @echo "# devhelp" + +epub: + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub + @echo + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make latexpdf' here to do that automatically)." + +latexpdf: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through pdflatex..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +latexpdfja: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through platex and dvipdfmx..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +text: + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/text." + +man: + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +texinfo: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo + @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." + @echo "Run \`make' in that directory to run these through makeinfo" \ + "(use \`make info' here to do that automatically)." + +info: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo "Running Texinfo files through makeinfo..." + make -C $(BUILDDIR)/texinfo info + @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." + +gettext: + $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale + @echo + @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." + +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +linkcheck: + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." + +xml: + $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml + @echo + @echo "Build finished. The XML files are in $(BUILDDIR)/xml." + +pseudoxml: + $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml + @echo + @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." diff --git a/site/make.bat b/site/make.bat new file mode 100644 index 0000000000000..cb8a1c0289463 --- /dev/null +++ b/site/make.bat @@ -0,0 +1,242 @@ +@ECHO OFF + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set BUILDDIR=build +set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% source +set I18NSPHINXOPTS=%SPHINXOPTS% source +if NOT "%PAPER%" == "" ( + set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% + set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% +) + +if "%1" == "" goto help + +if "%1" == "help" ( + :help + echo.Please use `make ^` where ^ is one of + echo. html to make standalone HTML files + echo. dirhtml to make HTML files named index.html in directories + echo. singlehtml to make a single large HTML file + echo. pickle to make pickle files + echo. json to make JSON files + echo. htmlhelp to make HTML files and a HTML help project + echo. qthelp to make HTML files and a qthelp project + echo. devhelp to make HTML files and a Devhelp project + echo. epub to make an epub + echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter + echo. text to make text files + echo. man to make manual pages + echo. texinfo to make Texinfo files + echo. gettext to make PO message catalogs + echo. changes to make an overview over all changed/added/deprecated items + echo. xml to make Docutils-native XML files + echo. pseudoxml to make pseudoxml-XML files for display purposes + echo. linkcheck to check all external links for integrity + echo. doctest to run all doctests embedded in the documentation if enabled + goto end +) + +if "%1" == "clean" ( + for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i + del /q /s %BUILDDIR%\* + goto end +) + + +%SPHINXBUILD% 2> nul +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +if "%1" == "html" ( + %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/html. + goto end +) + +if "%1" == "dirhtml" ( + %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. + goto end +) + +if "%1" == "singlehtml" ( + %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. + goto end +) + +if "%1" == "pickle" ( + %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can process the pickle files. + goto end +) + +if "%1" == "json" ( + %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can process the JSON files. + goto end +) + +if "%1" == "htmlhelp" ( + %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can run HTML Help Workshop with the ^ +.hhp project file in %BUILDDIR%/htmlhelp. + goto end +) + +if "%1" == "qthelp" ( + %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can run "qcollectiongenerator" with the ^ +.qhcp project file in %BUILDDIR%/qthelp, like this: + echo.^> qcollectiongenerator %BUILDDIR%\qthelp\Emscripten.qhcp + echo.To view the help file: + echo.^> assistant -collectionFile %BUILDDIR%\qthelp\Emscripten.ghc + goto end +) + +if "%1" == "devhelp" ( + %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. + goto end +) + +if "%1" == "epub" ( + %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The epub file is in %BUILDDIR%/epub. + goto end +) + +if "%1" == "latex" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "latexpdf" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + cd %BUILDDIR%/latex + make all-pdf + cd %BUILDDIR%/.. + echo. + echo.Build finished; the PDF files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "latexpdfja" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + cd %BUILDDIR%/latex + make all-pdf-ja + cd %BUILDDIR%/.. + echo. + echo.Build finished; the PDF files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "text" ( + %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The text files are in %BUILDDIR%/text. + goto end +) + +if "%1" == "man" ( + %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The manual pages are in %BUILDDIR%/man. + goto end +) + +if "%1" == "texinfo" ( + %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. + goto end +) + +if "%1" == "gettext" ( + %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The message catalogs are in %BUILDDIR%/locale. + goto end +) + +if "%1" == "changes" ( + %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes + if errorlevel 1 exit /b 1 + echo. + echo.The overview file is in %BUILDDIR%/changes. + goto end +) + +if "%1" == "linkcheck" ( + %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck + if errorlevel 1 exit /b 1 + echo. + echo.Link check complete; look for any errors in the above output ^ +or in %BUILDDIR%/linkcheck/output.txt. + goto end +) + +if "%1" == "doctest" ( + %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest + if errorlevel 1 exit /b 1 + echo. + echo.Testing of doctests in the sources finished, look at the ^ +results in %BUILDDIR%/doctest/output.txt. + goto end +) + +if "%1" == "xml" ( + %SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The XML files are in %BUILDDIR%/xml. + goto end +) + +if "%1" == "pseudoxml" ( + %SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml. + goto end +) + +:end diff --git a/site/source/_static/Emscripten_logo_full.png b/site/source/_static/Emscripten_logo_full.png new file mode 100644 index 0000000000000000000000000000000000000000..315b2e359f795b7790045c0c820eda1c19ee99a3 GIT binary patch literal 43854 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
  • _@2<7wk#YoroChjAB=rE< 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 literal 0 HcmV?d00001 diff --git a/site/source/_static/Thumbs.db b/site/source/_static/Thumbs.db new file mode 100644 index 0000000000000000000000000000000000000000..343ddf7375d47e9bb88fa0ca43b9f838a505a23b GIT binary patch literal 34816 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 + +
    + diff --git a/site/source/_themes/emscripten_sphinx_rtd_theme/footer.html b/site/source/_themes/emscripten_sphinx_rtd_theme/footer.html new file mode 100644 index 0000000000000..21a6b55d126a8 --- /dev/null +++ b/site/source/_themes/emscripten_sphinx_rtd_theme/footer.html @@ -0,0 +1,32 @@ +
    + {% if next or prev %} + + {% endif %} + +
    + +
    +

    + {%- if show_copyright %} + {%- if hasdoc('copyright') %} + {% trans path=pathto('copyright'), copyright=copyright|e %}© Copyright {{ copyright }}.{% endtrans %} + {%- else %} + {% trans copyright=copyright|e %}© Copyright {{ copyright }}.{% endtrans %} + {%- endif %} + {%- endif %} + + {%- if last_updated %} + {% trans last_updated=last_updated|e %}Last updated on {{ last_updated }}.{% endtrans %} + {%- endif %} +

    +
    + + {% trans %}Sphinx theme provided by Read the Docs{% endtrans %} +
    diff --git a/site/source/_themes/emscripten_sphinx_rtd_theme/layout.html b/site/source/_themes/emscripten_sphinx_rtd_theme/layout.html new file mode 100644 index 0000000000000..48b64f5966e97 --- /dev/null +++ b/site/source/_themes/emscripten_sphinx_rtd_theme/layout.html @@ -0,0 +1,160 @@ +{# TEMPLATE VAR SETTINGS #} +{%- set url_root = pathto('', 1) %} +{%- if url_root == '#' %}{% set url_root = '' %}{% endif %} +{%- if not embedded and docstitle %} + {%- set titlesuffix = " — "|safe + docstitle|e %} +{%- else %} + {%- set titlesuffix = "" %} +{%- endif %} + + + + + + + + {% block htmltitle %} + {{ title|striptags|e }}{{ titlesuffix }} + {% endblock %} + + {# FAVICON #} + {% if favicon %} + + {% endif %} + + {# CSS #} + + + {# OPENSEARCH #} + {% if not embedded %} + {% if use_opensearch %} + + {% endif %} + + {% endif %} + + {# RTD hosts this file, so just load on non RTD builds #} + {% if not READTHEDOCS %} + + {% endif %} + + {% for cssfile in css_files %} + + {% endfor %} + + {%- block linktags %} + {%- if hasdoc('about') %} + + {%- endif %} + {%- if hasdoc('genindex') %} + + {%- endif %} + {%- if hasdoc('search') %} + + {%- endif %} + {%- if hasdoc('copyright') %} + + {%- endif %} + + {%- if parents %} + + {%- endif %} + {%- if next %} + + {%- endif %} + {%- if prev %} + + {%- endif %} + {%- endblock %} + {%- block extrahead %} {% endblock %} + + {# Keep modernizr in head - http://modernizr.com/docs/#installing #} + + + + + + +
    + + {# SIDE NAV, TOGGLES ON MOBILE #} + + +
    + + {# MOBILE NAV, TRIGGLES SIDE NAV ON TOGGLE #} + + + + {# PAGE CONTENT #} +
    +
    + {% include "breadcrumbs.html" %} +
    + {% block body %}{% endblock %} +
    + {% include "footer.html" %} +
    +
    + +
    + +
    + {% include "versions.html" %} + + {% if not embedded %} + + + {%- for scriptfile in script_files %} + + {%- endfor %} + + {% endif %} + + {# RTD hosts this file, so just load on non RTD builds #} + {% if not READTHEDOCS %} + + {% endif %} + + {# STICKY NAVIGATION #} + {% if theme_sticky_navigation %} + + {% endif %} + + {%- block footer %} {% endblock %} + + + diff --git a/site/source/_themes/emscripten_sphinx_rtd_theme/layout_old.html b/site/source/_themes/emscripten_sphinx_rtd_theme/layout_old.html new file mode 100644 index 0000000000000..deb8df2a1a748 --- /dev/null +++ b/site/source/_themes/emscripten_sphinx_rtd_theme/layout_old.html @@ -0,0 +1,205 @@ +{# + basic/layout.html + ~~~~~~~~~~~~~~~~~ + + Master layout template for Sphinx themes. + + :copyright: Copyright 2007-2013 by the Sphinx team, see AUTHORS. + :license: BSD, see LICENSE for details. +#} +{%- block doctype -%} + +{%- endblock %} +{%- set reldelim1 = reldelim1 is not defined and ' »' or reldelim1 %} +{%- set reldelim2 = reldelim2 is not defined and ' |' or reldelim2 %} +{%- set render_sidebar = (not embedded) and (not theme_nosidebar|tobool) and + (sidebars != []) %} +{%- set url_root = pathto('', 1) %} +{# XXX necessary? #} +{%- if url_root == '#' %}{% set url_root = '' %}{% endif %} +{%- if not embedded and docstitle %} + {%- set titlesuffix = " — "|safe + docstitle|e %} +{%- else %} + {%- set titlesuffix = "" %} +{%- endif %} + +{%- macro relbar() %} + +{%- endmacro %} + +{%- macro sidebar() %} + {%- if render_sidebar %} +
    +
    + {%- block sidebarlogo %} + {%- if logo %} + + {%- endif %} + {%- endblock %} + {%- if sidebars != None %} + {#- new style sidebar: explicitly include/exclude templates #} + {%- for sidebartemplate in sidebars %} + {%- include sidebartemplate %} + {%- endfor %} + {%- else %} + {#- old style sidebars: using blocks -- should be deprecated #} + {%- block sidebartoc %} + {%- include "localtoc.html" %} + {%- endblock %} + {%- block sidebarrel %} + {%- include "relations.html" %} + {%- endblock %} + {%- block sidebarsourcelink %} + {%- include "sourcelink.html" %} + {%- endblock %} + {%- if customsidebar %} + {%- include customsidebar %} + {%- endif %} + {%- block sidebarsearch %} + {%- include "searchbox.html" %} + {%- endblock %} + {%- endif %} +
    +
    + {%- endif %} +{%- endmacro %} + +{%- macro script() %} + + {%- for scriptfile in script_files %} + + {%- endfor %} +{%- endmacro %} + +{%- macro css() %} + + + {%- for cssfile in css_files %} + + {%- endfor %} +{%- endmacro %} + + + + + {{ metatags }} + {%- block htmltitle %} + {{ title|striptags|e }}{{ titlesuffix }} + {%- endblock %} + {{ css() }} + {%- if not embedded %} + {{ script() }} + {%- if use_opensearch %} + + {%- endif %} + {%- if favicon %} + + {%- endif %} + {%- endif %} +{%- block linktags %} + {%- if hasdoc('about') %} + + {%- endif %} + {%- if hasdoc('genindex') %} + + {%- endif %} + {%- if hasdoc('search') %} + + {%- endif %} + {%- if hasdoc('copyright') %} + + {%- endif %} + + {%- if parents %} + + {%- endif %} + {%- if next %} + + {%- endif %} + {%- if prev %} + + {%- endif %} +{%- endblock %} +{%- block extrahead %} {% endblock %} + + +{%- block header %}{% endblock %} + +{%- block relbar1 %}{{ relbar() }}{% endblock %} + +{%- block content %} + {%- block sidebar1 %} {# possible location for sidebar #} {% endblock %} + +
    + {%- block document %} +
    + {%- if render_sidebar %} +
    + {%- endif %} +
    + {% block body %} {% endblock %} +
    + {%- if render_sidebar %} +
    + {%- endif %} +
    + {%- endblock %} + + {%- block sidebar2 %}{{ sidebar() }}{% endblock %} +
    +
    +{%- endblock %} + +{%- block relbar2 %}{{ relbar() }}{% endblock %} + +{%- block footer %} + +

    asdf asdf asdf asdf 22

    +{%- endblock %} + + + diff --git a/site/source/_themes/emscripten_sphinx_rtd_theme/search.html b/site/source/_themes/emscripten_sphinx_rtd_theme/search.html new file mode 100644 index 0000000000000..e3aa9b5c6e75b --- /dev/null +++ b/site/source/_themes/emscripten_sphinx_rtd_theme/search.html @@ -0,0 +1,50 @@ +{# + basic/search.html + ~~~~~~~~~~~~~~~~~ + + Template for the search page. + + :copyright: Copyright 2007-2013 by the Sphinx team, see AUTHORS. + :license: BSD, see LICENSE for details. +#} +{%- extends "layout.html" %} +{% set title = _('Search') %} +{% set script_files = script_files + ['_static/searchtools.js'] %} +{% block footer %} + + {# this is used when loading the search index using $.ajax fails, + such as on Chrome for documents on localhost #} + + {{ super() }} +{% endblock %} +{% block body %} + + + {% if search_performed %} +

    {{ _('Search Results') }}

    + {% if not search_results %} +

    {{ _('Your search did not match any documents. Please make sure that all words are spelled correctly and that you\'ve selected enough categories.') }}

    + {% endif %} + {% endif %} +
    + {% if search_results %} +
      + {% for href, caption, context in search_results %} +
    • + {{ caption }} +

      {{ context|e }}

      +
    • + {% endfor %} +
    + {% endif %} +
    +{% endblock %} diff --git a/site/source/_themes/emscripten_sphinx_rtd_theme/searchbox.html b/site/source/_themes/emscripten_sphinx_rtd_theme/searchbox.html new file mode 100644 index 0000000000000..24418d32bcb05 --- /dev/null +++ b/site/source/_themes/emscripten_sphinx_rtd_theme/searchbox.html @@ -0,0 +1,7 @@ +
    +
    + + + +
    +
    diff --git a/site/source/_themes/emscripten_sphinx_rtd_theme/static/css/badge_only.css b/site/source/_themes/emscripten_sphinx_rtd_theme/static/css/badge_only.css new file mode 100644 index 0000000000000..4868a00277d1c --- /dev/null +++ b/site/source/_themes/emscripten_sphinx_rtd_theme/static/css/badge_only.css @@ -0,0 +1 @@ +.fa:before{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-weight:normal;font-style:normal;src:url("../font/fontawesome_webfont.eot");src:url("../font/fontawesome_webfont.eot?#iefix") format("embedded-opentype"),url("../font/fontawesome_webfont.woff") format("woff"),url("../font/fontawesome_webfont.ttf") format("truetype"),url("../font/fontawesome_webfont.svg#FontAwesome") format("svg")}.fa:before{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;text-decoration:inherit}a .fa{display:inline-block;text-decoration:inherit}li .fa{display:inline-block}li .fa-large:before,li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-0.8em}ul.fas li .fa{width:0.8em}ul.fas li .fa-large:before,ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before{content:"\f02d"}.icon-book:before{content:"\f02d"}.fa-caret-down:before{content:"\f0d7"}.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;border-top:solid 10px #343131;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:before,.rst-versions .rst-current-version:after{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book{float:left}.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:gray;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:solid 1px #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px}.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge .fa-book{float:none}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book{float:left}.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge .rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width: 768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}img{width:100%;height:auto}} diff --git a/site/source/_themes/emscripten_sphinx_rtd_theme/static/css/theme.css b/site/source/_themes/emscripten_sphinx_rtd_theme/static/css/theme.css new file mode 100644 index 0000000000000..f595aab864dcd --- /dev/null +++ b/site/source/_themes/emscripten_sphinx_rtd_theme/static/css/theme.css @@ -0,0 +1,4 @@ +*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}[hidden]{display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:hover,a:active{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}blockquote{margin:0}dfn{font-style:italic}hr{display:block;height:1px;border:0;border-top:1px solid #ccc;margin:20px 0;padding:0}ins{background:#ff9;color:#000;text-decoration:none}mark{background:#ff0;color:#000;font-style:italic;font-weight:bold}pre,code,.rst-content tt,kbd,samp{font-family:monospace,serif;_font-family:"courier new",monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:before,q:after{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}ul,ol,dl{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure{margin:0}form{margin:0}fieldset{border:0;margin:0;padding:0}label{cursor:pointer}legend{border:0;*margin-left:-7px;padding:0;white-space:normal}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0;*width:13px;*height:13px}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top;resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:0.2em 0;background:#ccc;color:#000;padding:0.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none !important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{html,body,section{background:none !important}*{box-shadow:none !important;text-shadow:none !important;filter:none !important;-ms-filter:none !important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}.fa:before,.rst-content .admonition-title:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content dl dt .headerlink:before,.icon:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-alert,.rst-content .note,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .warning,.rst-content .seealso,.btn,input[type="text"],input[type="password"],input[type="email"],input[type="url"],input[type="date"],input[type="month"],input[type="time"],input[type="datetime"],input[type="datetime-local"],input[type="week"],input[type="number"],input[type="search"],input[type="tel"],input[type="color"],select,textarea,.wy-menu-vertical li.on a,.wy-menu-vertical li.current>a,.wy-side-nav-search>a,.wy-side-nav-search .wy-dropdown>a,.wy-nav-top a{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:""}.clearfix:after{clear:both}/*! + * Font Awesome 4.0.3 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url("../fonts/fontawesome-webfont.eot?v=4.0.3");src:url("../fonts/fontawesome-webfont.eot?#iefix&v=4.0.3") format("embedded-opentype"),url("../fonts/fontawesome-webfont.woff?v=4.0.3") format("woff"),url("../fonts/fontawesome-webfont.ttf?v=4.0.3") format("truetype"),url("../fonts/fontawesome-webfont.svg?v=4.0.3#fontawesomeregular") format("svg");font-weight:normal;font-style:normal}.fa,.rst-content .admonition-title,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink,.icon{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:0.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:0.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:solid 0.08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.rst-content .pull-left.admonition-title,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content dl dt .pull-left.headerlink,.pull-left.icon{margin-right:.3em}.fa.pull-right,.rst-content .pull-right.admonition-title,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content dl dt .pull-right.headerlink,.pull-right.icon{margin-left:.3em}.fa-spin{-webkit-animation:spin 2s infinite linear;-moz-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear}@-moz-keyframes spin{0%{-moz-transform:rotate(0deg)}100%{-moz-transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg)}}@-o-keyframes spin{0%{-o-transform:rotate(0deg)}100%{-o-transform:rotate(359deg)}}@-ms-keyframes spin{0%{-ms-transform:rotate(0deg)}100%{-ms-transform:rotate(359deg)}}@keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=$rotation);-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=$rotation);-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=$rotation);-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=$rotation);-webkit-transform:scale(-1, 1);-moz-transform:scale(-1, 1);-ms-transform:scale(-1, 1);-o-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=$rotation);-webkit-transform:scale(1, -1);-moz-transform:scale(1, -1);-ms-transform:scale(1, -1);-o-transform:scale(1, -1);transform:scale(1, -1)}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before,.icon-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before,.icon-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:"\f057"}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.rst-content .admonition-title:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before,.icon-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook:before{content:"\f09a"}.fa-github:before,.icon-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:"\f0a8"}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before,.icon-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before,.wy-dropdown .caret:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-asc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-desc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-reply-all:before{content:"\f122"}.fa-mail-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before,.icon-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa,.rst-content .admonition-title,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink,.icon,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context{font-family:inherit}.fa:before,.rst-content .admonition-title:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content dl dt .headerlink:before,.icon:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before{font-family:"FontAwesome";display:inline-block;font-style:normal;font-weight:normal;line-height:1;text-decoration:inherit}a .fa,a .rst-content .admonition-title,.rst-content a .admonition-title,a .rst-content h1 .headerlink,.rst-content h1 a .headerlink,a .rst-content h2 .headerlink,.rst-content h2 a .headerlink,a .rst-content h3 .headerlink,.rst-content h3 a .headerlink,a .rst-content h4 .headerlink,.rst-content h4 a .headerlink,a .rst-content h5 .headerlink,.rst-content h5 a .headerlink,a .rst-content h6 .headerlink,.rst-content h6 a .headerlink,a .rst-content dl dt .headerlink,.rst-content dl dt a .headerlink,a .icon{display:inline-block;text-decoration:inherit}.btn .fa,.btn .rst-content .admonition-title,.rst-content .btn .admonition-title,.btn .rst-content h1 .headerlink,.rst-content h1 .btn .headerlink,.btn .rst-content h2 .headerlink,.rst-content h2 .btn .headerlink,.btn .rst-content h3 .headerlink,.rst-content h3 .btn .headerlink,.btn .rst-content h4 .headerlink,.rst-content h4 .btn .headerlink,.btn .rst-content h5 .headerlink,.rst-content h5 .btn .headerlink,.btn .rst-content h6 .headerlink,.rst-content h6 .btn .headerlink,.btn .rst-content dl dt .headerlink,.rst-content dl dt .btn .headerlink,.btn .icon,.nav .fa,.nav .rst-content .admonition-title,.rst-content .nav .admonition-title,.nav .rst-content h1 .headerlink,.rst-content h1 .nav .headerlink,.nav .rst-content h2 .headerlink,.rst-content h2 .nav .headerlink,.nav .rst-content h3 .headerlink,.rst-content h3 .nav .headerlink,.nav .rst-content h4 .headerlink,.rst-content h4 .nav .headerlink,.nav .rst-content h5 .headerlink,.rst-content h5 .nav .headerlink,.nav .rst-content h6 .headerlink,.rst-content h6 .nav .headerlink,.nav .rst-content dl dt .headerlink,.rst-content dl dt .nav .headerlink,.nav .icon{display:inline}.btn .fa.fa-large,.btn .rst-content .fa-large.admonition-title,.rst-content .btn .fa-large.admonition-title,.btn .rst-content h1 .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.btn .rst-content dl dt .fa-large.headerlink,.rst-content dl dt .btn .fa-large.headerlink,.btn .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .fa-large.admonition-title,.rst-content .nav .fa-large.admonition-title,.nav .rst-content h1 .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.nav .rst-content dl dt .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.nav .fa-large.icon{line-height:0.9em}.btn .fa.fa-spin,.btn .rst-content .fa-spin.admonition-title,.rst-content .btn .fa-spin.admonition-title,.btn .rst-content h1 .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.btn .rst-content dl dt .fa-spin.headerlink,.rst-content dl dt .btn .fa-spin.headerlink,.btn .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .fa-spin.admonition-title,.rst-content .nav .fa-spin.admonition-title,.nav .rst-content h1 .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.nav .rst-content dl dt .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.nav .fa-spin.icon{display:inline-block}.btn.fa:before,.rst-content .btn.admonition-title:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content dl dt .btn.headerlink:before,.btn.icon:before{opacity:0.5;-webkit-transition:opacity 0.05s ease-in;-moz-transition:opacity 0.05s ease-in;transition:opacity 0.05s ease-in}.btn.fa:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.btn.icon:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .rst-content .admonition-title:before,.rst-content .btn-mini .admonition-title:before,.btn-mini .rst-content h1 .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.btn-mini .rst-content dl dt .headerlink:before,.rst-content dl dt .btn-mini .headerlink:before,.btn-mini .icon:before{font-size:14px;vertical-align:-15%}.wy-alert,.rst-content .note,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .warning,.rst-content .seealso{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.wy-alert-title,.rst-content .admonition-title{color:#fff;font-weight:bold;display:block;color:#fff;background:#6ab0de;margin:-12px;padding:6px 12px;margin-bottom:12px}.wy-alert.wy-alert-danger,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.rst-content .wy-alert-danger.seealso{background:#fdf3f2}.wy-alert.wy-alert-danger .wy-alert-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .danger .wy-alert-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .danger .admonition-title,.rst-content .error .admonition-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.seealso .admonition-title{background:#f29f97}.wy-alert.wy-alert-warning,.rst-content .wy-alert-warning.note,.rst-content .attention,.rst-content .caution,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.tip,.rst-content .warning,.rst-content .wy-alert-warning.seealso{background:#ffedcc}.wy-alert.wy-alert-warning .wy-alert-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .attention .wy-alert-title,.rst-content .caution .wy-alert-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .attention .admonition-title,.rst-content .caution .admonition-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .warning .admonition-title,.rst-content .wy-alert-warning.seealso .admonition-title{background:#f0b37e}.wy-alert.wy-alert-info,.rst-content .note,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.rst-content .seealso{background:#e7f2fa}.wy-alert.wy-alert-info .wy-alert-title,.rst-content .note .wy-alert-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .seealso .wy-alert-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.rst-content .note .admonition-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .seealso .admonition-title{background:#6ab0de}.wy-alert.wy-alert-success,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.warning,.rst-content .wy-alert-success.seealso{background:#dbfaf4}.wy-alert.wy-alert-success .wy-alert-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .hint .wy-alert-title,.rst-content .important .wy-alert-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .hint .admonition-title,.rst-content .important .admonition-title,.rst-content .tip .admonition-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.seealso .admonition-title{background:#1abc9c}.wy-alert.wy-alert-neutral,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.rst-content .wy-alert-neutral.seealso{background:#f3f6f6}.wy-alert.wy-alert-neutral .wy-alert-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.seealso .admonition-title{color:#404040;background:#e1e4e5}.wy-alert.wy-alert-neutral a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.rst-content .wy-alert-neutral.seealso a{color:#2980b9}.wy-alert p:last-child,.rst-content .note p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.rst-content .seealso p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0px;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,0.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:60px;overflow:hidden;-webkit-transition:all 0.3s ease-in;-moz-transition:all 0.3s ease-in;transition:all 0.3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:60px}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px 12px;color:#fff;border:1px solid rgba(0,0,0,0.1);background-color:#27ae60;text-decoration:none;font-weight:normal;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;box-shadow:0px 1px 2px -1px rgba(255,255,255,0.5) inset,0px -2px 0px 0px rgba(0,0,0,0.1) inset;outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all 0.1s linear;-moz-transition:all 0.1s linear;transition:all 0.1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:0px -1px 0px 0px rgba(0,0,0,0.05) inset,0px 2px 0px 0px rgba(0,0,0,0.1) inset;padding:8px 12px 6px 12px}.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:0.4;cursor:not-allowed;box-shadow:none}.btn-disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:0.4;cursor:not-allowed;box-shadow:none}.btn-disabled:hover,.btn-disabled:focus,.btn-disabled:active{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:0.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9 !important}.btn-info:hover{background-color:#2e8ece !important}.btn-neutral{background-color:#f3f6f6 !important;color:#404040 !important}.btn-neutral:hover{background-color:#e5ebeb !important;color:#404040}.btn-neutral:visited{color:#404040 !important}.btn-success{background-color:#27ae60 !important}.btn-success:hover{background-color:#295 !important}.btn-danger{background-color:#e74c3c !important}.btn-danger:hover{background-color:#ea6153 !important}.btn-warning{background-color:#e67e22 !important}.btn-warning:hover{background-color:#e98b39 !important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f !important}.btn-link{background-color:transparent !important;color:#2980b9;box-shadow:none;border-color:transparent !important}.btn-link:hover{background-color:transparent !important;color:#409ad5 !important;box-shadow:none}.btn-link:active{background-color:transparent !important;color:#409ad5 !important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:before,.wy-btn-group:after{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:solid 1px #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,0.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:solid 1px #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type="search"]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned input,.wy-form-aligned textarea,.wy-form-aligned select,.wy-form-aligned .wy-help-inline,.wy-form-aligned label{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:0.5em 1em 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:0.5em}fieldset{border:0;margin:0;padding:0}legend{display:block;width:100%;border:0;padding:0;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label{display:block;margin:0 0 0.3125em 0;color:#999;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;*zoom:1;max-width:68em;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:before,.wy-control-group:after{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group:before,.wy-control-group:after{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full input[type="text"],.wy-control-group .wy-form-full input[type="password"],.wy-control-group .wy-form-full input[type="email"],.wy-control-group .wy-form-full input[type="url"],.wy-control-group .wy-form-full input[type="date"],.wy-control-group .wy-form-full input[type="month"],.wy-control-group .wy-form-full input[type="time"],.wy-control-group .wy-form-full input[type="datetime"],.wy-control-group .wy-form-full input[type="datetime-local"],.wy-control-group .wy-form-full input[type="week"],.wy-control-group .wy-form-full input[type="number"],.wy-control-group .wy-form-full input[type="search"],.wy-control-group .wy-form-full input[type="tel"],.wy-control-group .wy-form-full input[type="color"],.wy-control-group .wy-form-halves input[type="text"],.wy-control-group .wy-form-halves input[type="password"],.wy-control-group .wy-form-halves input[type="email"],.wy-control-group .wy-form-halves input[type="url"],.wy-control-group .wy-form-halves input[type="date"],.wy-control-group .wy-form-halves input[type="month"],.wy-control-group .wy-form-halves input[type="time"],.wy-control-group .wy-form-halves input[type="datetime"],.wy-control-group .wy-form-halves input[type="datetime-local"],.wy-control-group .wy-form-halves input[type="week"],.wy-control-group .wy-form-halves input[type="number"],.wy-control-group .wy-form-halves input[type="search"],.wy-control-group .wy-form-halves input[type="tel"],.wy-control-group .wy-form-halves input[type="color"],.wy-control-group .wy-form-thirds input[type="text"],.wy-control-group .wy-form-thirds input[type="password"],.wy-control-group .wy-form-thirds input[type="email"],.wy-control-group .wy-form-thirds input[type="url"],.wy-control-group .wy-form-thirds input[type="date"],.wy-control-group .wy-form-thirds input[type="month"],.wy-control-group .wy-form-thirds input[type="time"],.wy-control-group .wy-form-thirds input[type="datetime"],.wy-control-group .wy-form-thirds input[type="datetime-local"],.wy-control-group .wy-form-thirds input[type="week"],.wy-control-group .wy-form-thirds input[type="number"],.wy-control-group .wy-form-thirds input[type="search"],.wy-control-group .wy-form-thirds input[type="tel"],.wy-control-group .wy-form-thirds input[type="color"]{width:100%}.wy-control-group .wy-form-full{display:block;float:left;margin-right:2.35765%;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{display:block;float:left;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child{margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(2n+1){clear:left}.wy-control-group .wy-form-thirds{display:block;float:left;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child{margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control{margin:0.5em 0 0 0;font-size:90%}.wy-control-group.fluid-input input[type="text"],.wy-control-group.fluid-input input[type="password"],.wy-control-group.fluid-input input[type="email"],.wy-control-group.fluid-input input[type="url"],.wy-control-group.fluid-input input[type="date"],.wy-control-group.fluid-input input[type="month"],.wy-control-group.fluid-input input[type="time"],.wy-control-group.fluid-input input[type="datetime"],.wy-control-group.fluid-input input[type="datetime-local"],.wy-control-group.fluid-input input[type="week"],.wy-control-group.fluid-input input[type="number"],.wy-control-group.fluid-input input[type="search"],.wy-control-group.fluid-input input[type="tel"],.wy-control-group.fluid-input input[type="color"]{width:100%}.wy-form-message-inline{display:inline-block;padding-left:0.3em;color:#666;vertical-align:middle;font-size:90%}.wy-form-message{display:block;color:#ccc;font-size:70%;margin-top:0.3125em;font-style:italic}input{line-height:normal}input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;*overflow:visible}input[type="text"],input[type="password"],input[type="email"],input[type="url"],input[type="date"],input[type="month"],input[type="time"],input[type="datetime"],input[type="datetime-local"],input[type="week"],input[type="number"],input[type="search"],input[type="tel"],input[type="color"]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border 0.3s linear;-moz-transition:border 0.3s linear;transition:border 0.3s linear}input[type="datetime-local"]{padding:0.34375em 0.625em}input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0;margin-right:0.3125em;*height:13px;*width:13px}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}input[type="text"]:focus,input[type="password"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus{outline:0;outline:thin dotted \9;border-color:#333}input.no-focus:focus{border-color:#ccc !important}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type="text"][disabled],input[type="password"][disabled],input[type="email"][disabled],input[type="url"][disabled],input[type="date"][disabled],input[type="month"][disabled],input[type="time"][disabled],input[type="datetime"][disabled],input[type="datetime-local"][disabled],input[type="week"][disabled],input[type="number"][disabled],input[type="search"][disabled],input[type="tel"][disabled],input[type="color"][disabled]{cursor:not-allowed;background-color:#f3f6f6;color:#cad2d3}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e74c3c}input[type="file"]:focus:invalid:focus,input[type="radio"]:focus:invalid:focus,input[type="checkbox"]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%}select,textarea{padding:0.5em 0.625em;display:inline-block;border:1px solid #ccc;font-size:0.8em;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border 0.3s linear;-moz-transition:border 0.3s linear;transition:border 0.3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#fff;color:#cad2d3;border-color:transparent}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{padding:6px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:solid 1px #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type="text"],.wy-control-group.wy-control-group-error input[type="password"],.wy-control-group.wy-control-group-error input[type="email"],.wy-control-group.wy-control-group-error input[type="url"],.wy-control-group.wy-control-group-error input[type="date"],.wy-control-group.wy-control-group-error input[type="month"],.wy-control-group.wy-control-group-error input[type="time"],.wy-control-group.wy-control-group-error input[type="datetime"],.wy-control-group.wy-control-group-error input[type="datetime-local"],.wy-control-group.wy-control-group-error input[type="week"],.wy-control-group.wy-control-group-error input[type="number"],.wy-control-group.wy-control-group-error input[type="search"],.wy-control-group.wy-control-group-error input[type="tel"],.wy-control-group.wy-control-group-error input[type="color"]{border:solid 1px #e74c3c}.wy-control-group.wy-control-group-error textarea{border:solid 1px #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:0.5em 0.625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width: 480px){.wy-form button[type="submit"]{margin:0.7em 0 0}.wy-form input[type="text"],.wy-form input[type="password"],.wy-form input[type="email"],.wy-form input[type="url"],.wy-form input[type="date"],.wy-form input[type="month"],.wy-form input[type="time"],.wy-form input[type="datetime"],.wy-form input[type="datetime-local"],.wy-form input[type="week"],.wy-form input[type="number"],.wy-form input[type="search"],.wy-form input[type="tel"],.wy-form input[type="color"]{margin-bottom:0.3em;display:block}.wy-form label{margin-bottom:0.3em;display:block}.wy-form input[type="password"],.wy-form input[type="email"],.wy-form input[type="url"],.wy-form input[type="date"],.wy-form input[type="month"],.wy-form input[type="time"],.wy-form input[type="datetime"],.wy-form input[type="datetime-local"],.wy-form input[type="week"],.wy-form input[type="number"],.wy-form input[type="search"],.wy-form input[type="tel"],.wy-form input[type="color"]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:0.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0 0}.wy-form .wy-help-inline,.wy-form-message-inline,.wy-form-message{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width: 768px){.tablet-hide{display:none}}@media screen and (max-width: 480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.wy-table,.rst-content table.docutils,.rst-content table.field-list{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.wy-table caption,.rst-content table.docutils caption,.rst-content table.field-list caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.wy-table td,.rst-content table.docutils td,.rst-content table.field-list td,.wy-table th,.rst-content table.docutils th,.rst-content table.field-list th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.wy-table td:first-child,.rst-content table.docutils td:first-child,.rst-content table.field-list td:first-child,.wy-table th:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list th:first-child{border-left-width:0}.wy-table thead,.rst-content table.docutils thead,.rst-content table.field-list thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.wy-table thead th,.rst-content table.docutils thead th,.rst-content table.field-list thead th{font-weight:bold;border-bottom:solid 2px #e1e4e5}.wy-table td,.rst-content table.docutils td,.rst-content table.field-list td{background-color:transparent;vertical-align:middle}.wy-table td p,.rst-content table.docutils td p,.rst-content table.field-list td p{line-height:18px;margin-bottom:0}.wy-table .wy-table-cell-min,.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min{width:1%;padding-right:0}.wy-table .wy-table-cell-min input[type=checkbox],.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox],.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:gray;font-size:90%}.wy-table-tertiary{color:gray;font-size:80%}.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td,.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td{background-color:#f3f6f6}.wy-table-backed{background-color:#f3f6f6}.wy-table-bordered-all,.rst-content table.docutils{border:1px solid #e1e4e5}.wy-table-bordered-all td,.rst-content table.docutils td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.wy-table-bordered-all tbody>tr:last-child td,.rst-content table.docutils tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px 0;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0 !important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%;overflow-x:hidden}body{font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;font-weight:normal;color:#404040;min-height:100%;overflow-x:hidden;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22 !important}a.wy-text-warning:hover{color:#eb9950 !important}.wy-text-info{color:#2980b9 !important}a.wy-text-info:hover{color:#409ad5 !important}.wy-text-success{color:#27ae60 !important}a.wy-text-success:hover{color:#36d278 !important}.wy-text-danger{color:#e74c3c !important}a.wy-text-danger:hover{color:#ed7669 !important}.wy-text-neutral{color:#404040 !important}a.wy-text-neutral:hover{color:#595959 !important}h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:"Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif}p{line-height:24px;margin:0;font-size:16px;margin-bottom:24px}h1{font-size:175%}h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}code,.rst-content tt{white-space:nowrap;max-width:100%;background:#fff;border:solid 1px #e1e4e5;font-size:75%;padding:0 5px;font-family:"Incosolata","Consolata","Monaco",monospace;color:#e74c3c;overflow-x:auto}code.code-large,.rst-content tt.code-large{font-size:90%}.wy-plain-list-disc,.rst-content .section ul,.rst-content .toctree-wrapper ul,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.wy-plain-list-disc li,.rst-content .section ul li,.rst-content .toctree-wrapper ul li,article ul li{list-style:disc;margin-left:24px}.wy-plain-list-disc li ul,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li ul,article ul li ul{margin-bottom:0}.wy-plain-list-disc li li,.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,article ul li li{list-style:circle}.wy-plain-list-disc li li li,.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,article ul li li li{list-style:square}.wy-plain-list-decimal,.rst-content .section ol,.rst-content ol.arabic,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.wy-plain-list-decimal li,.rst-content .section ol li,.rst-content ol.arabic li,article ol li{list-style:decimal;margin-left:24px}.codeblock-example{border:1px solid #e1e4e5;border-bottom:none;padding:24px;padding-top:48px;font-weight:500;background:#fff;position:relative}.codeblock-example:after{content:"Example";position:absolute;top:0px;left:0px;background:#9b59b6;color:#fff;padding:6px 12px}.codeblock-example.prettyprint-example-only{border:1px solid #e1e4e5;margin-bottom:24px}.codeblock,pre.literal-block,.rst-content .literal-block,.rst-content pre.literal-block,div[class^='highlight']{border:1px solid #e1e4e5;padding:0px;overflow-x:auto;background:#fff;margin:1px 0 24px 0}.codeblock div[class^='highlight'],pre.literal-block div[class^='highlight'],.rst-content .literal-block div[class^='highlight'],div[class^='highlight'] div[class^='highlight']{border:none;background:none;margin:0}div[class^='highlight'] td.code{width:100%}.linenodiv pre{border-right:solid 1px #e6e9ea;margin:0;padding:12px 12px;font-family:"Incosolata","Consolata","Monaco",monospace;font-size:12px;line-height:1.5;color:#d9d9d9}div[class^='highlight'] pre{white-space:pre;margin:0;padding:12px 12px;font-family:"Incosolata","Consolata","Monaco",monospace;font-size:12px;line-height:1.5;display:block;overflow:auto;color:#404040}@media print{.codeblock,pre.literal-block,.rst-content .literal-block,.rst-content pre.literal-block,div[class^='highlight'],div[class^='highlight'] pre{white-space:pre-wrap}}.hll{background-color:#ffc;margin:0 -12px;padding:0 12px;display:block}.c{color:#998;font-style:italic}.err{color:#a61717;background-color:#e3d2d2}.k{font-weight:bold}.o{font-weight:bold}.cm{color:#998;font-style:italic}.cp{color:#999;font-weight:bold}.c1{color:#998;font-style:italic}.cs{color:#999;font-weight:bold;font-style:italic}.gd{color:#000;background-color:#fdd}.gd .x{color:#000;background-color:#faa}.ge{font-style:italic}.gr{color:#a00}.gh{color:#999}.gi{color:#000;background-color:#dfd}.gi .x{color:#000;background-color:#afa}.go{color:#888}.gp{color:#555}.gs{font-weight:bold}.gu{color:purple;font-weight:bold}.gt{color:#a00}.kc{font-weight:bold}.kd{font-weight:bold}.kn{font-weight:bold}.kp{font-weight:bold}.kr{font-weight:bold}.kt{color:#458;font-weight:bold}.m{color:#099}.s{color:#d14}.n{color:#333}.na{color:teal}.nb{color:#0086b3}.nc{color:#458;font-weight:bold}.no{color:teal}.ni{color:purple}.ne{color:#900;font-weight:bold}.nf{color:#900;font-weight:bold}.nn{color:#555}.nt{color:navy}.nv{color:teal}.ow{font-weight:bold}.w{color:#bbb}.mf{color:#099}.mh{color:#099}.mi{color:#099}.mo{color:#099}.sb{color:#d14}.sc{color:#d14}.sd{color:#d14}.s2{color:#d14}.se{color:#d14}.sh{color:#d14}.si{color:#d14}.sx{color:#d14}.sr{color:#009926}.s1{color:#d14}.ss{color:#990073}.bp{color:#999}.vc{color:teal}.vg{color:teal}.vi{color:teal}.il{color:#099}.gc{color:#999;background-color:#eaf2f5}.wy-breadcrumbs li{display:inline-block}.wy-breadcrumbs li.wy-breadcrumbs-aside{float:right}.wy-breadcrumbs li a{display:inline-block;padding:5px}.wy-breadcrumbs li a:first-child{padding-left:0}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width: 480px){.wy-breadcrumbs-extra{display:none}.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:before,.wy-menu-horiz:after{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz ul,.wy-menu-horiz li{display:inline-block}.wy-menu-horiz li:hover{background:rgba(255,255,255,0.1)}.wy-menu-horiz li.divide-left{border-left:solid 1px #404040}.wy-menu-horiz li.divide-right{border-right:solid 1px #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical header{height:32px;display:inline-block;line-height:32px;padding:0 1.618em;display:block;font-weight:bold;text-transform:uppercase;font-size:80%;color:#2980b9;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:solid 1px #404040}.wy-menu-vertical li.divide-bottom{border-bottom:solid 1px #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:gray;border-right:solid 1px #c9c9c9;padding:0.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.wy-menu-vertical li.on a,.wy-menu-vertical li.current>a{color:#404040;padding:0.4045em 1.618em;font-weight:bold;position:relative;background:#fcfcfc;border:none;border-bottom:solid 1px #c9c9c9;border-top:solid 1px #c9c9c9;padding-left:1.618em -4px}.wy-menu-vertical li.on a:hover,.wy-menu-vertical li.current>a:hover{background:#fcfcfc}.wy-menu-vertical li.toctree-l2.current>a{background:#c9c9c9;padding:0.4045em 2.427em}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical .local-toc li ul{display:block}.wy-menu-vertical li ul li a{margin-bottom:0;color:#b3b3b3;font-weight:normal}.wy-menu-vertical a{display:inline-block;line-height:18px;padding:0.4045em 1.618em;display:block;position:relative;font-size:90%;color:#b3b3b3}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-side-nav-search{z-index:200;background-color:#2980b9;text-align:center;padding:0.809em;display:block;color:#fcfcfc;margin-bottom:0.809em}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto 0.809em auto;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search>a,.wy-side-nav-search .wy-dropdown>a{color:#fcfcfc;font-size:100%;font-weight:bold;display:inline-block;padding:4px 6px;margin-bottom:0.809em}.wy-side-nav-search>a:hover,.wy-side-nav-search .wy-dropdown>a:hover{background:rgba(255,255,255,0.1)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all 0.2s ease-in;-moz-transition:all 0.2s ease-in;transition:all 0.2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:left repeat-y #fcfcfc;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoxOERBMTRGRDBFMUUxMUUzODUwMkJCOThDMEVFNURFMCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoxOERBMTRGRTBFMUUxMUUzODUwMkJCOThDMEVFNURFMCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjE4REExNEZCMEUxRTExRTM4NTAyQkI5OEMwRUU1REUwIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjE4REExNEZDMEUxRTExRTM4NTAyQkI5OEMwRUU1REUwIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+EwrlwAAAAA5JREFUeNpiMDU0BAgwAAE2AJgB9BnaAAAAAElFTkSuQmCC);background-size:300px 1px}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:absolute;top:0;left:0;width:300px;overflow:hidden;min-height:100%;background:#343131;z-index:200}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:0.4045em 0.809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:before,.wy-nav-top:after{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:bold}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,0.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:#999}footer p{margin-bottom:12px}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:before,.rst-footer-buttons:after{display:table;content:""}.rst-footer-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:solid 1px #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:solid 1px #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:gray;font-size:90%}@media screen and (max-width: 768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width: 1400px){.wy-nav-content-wrap{background:rgba(0,0,0,0.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.wy-nav-side{display:none}.wy-nav-content-wrap{margin-left:0}}nav.stickynav{position:fixed;top:0}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;border-top:solid 10px #343131;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:before,.rst-versions .rst-current-version:after{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .icon{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:gray;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:solid 1px #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px}.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge .rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width: 768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}img{width:100%;height:auto}}.rst-content img{max-width:100%;height:auto !important}.rst-content div.figure{margin-bottom:24px}.rst-content div.figure.align-center{text-align:center}.rst-content .section>img{margin-bottom:24px}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content .note .last,.rst-content .attention .last,.rst-content .caution .last,.rst-content .danger .last,.rst-content .error .last,.rst-content .hint .last,.rst-content .important .last,.rst-content .tip .last,.rst-content .warning .last,.rst-content .seealso .last{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,0.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent !important;border-color:rgba(0,0,0,0.1) !important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha li{list-style:upper-alpha}.rst-content .section ol p,.rst-content .section ul p{margin-bottom:12px}.rst-content .line-block{margin-left:24px}.rst-content .topic-title{font-weight:bold;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0px 0px 24px 24px}.rst-content .align-left{float:left;margin:0px 24px 24px 0px}.rst-content .align-center{margin:auto;display:block}.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink{display:none;visibility:hidden;font-size:14px}.rst-content h1 .headerlink:after,.rst-content h2 .headerlink:after,.rst-content h3 .headerlink:after,.rst-content h4 .headerlink:after,.rst-content h5 .headerlink:after,.rst-content h6 .headerlink:after,.rst-content dl dt .headerlink:after{visibility:visible;content:"\f0c1";font-family:FontAwesome;display:inline-block}.rst-content h1:hover .headerlink,.rst-content h2:hover .headerlink,.rst-content h3:hover .headerlink,.rst-content h4:hover .headerlink,.rst-content h5:hover .headerlink,.rst-content h6:hover .headerlink,.rst-content dl dt:hover .headerlink{display:inline-block}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:solid 1px #e1e4e5}.rst-content .sidebar p,.rst-content .sidebar ul,.rst-content .sidebar dl{font-size:90%}.rst-content .sidebar .last{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:"Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif;font-weight:bold;background:#e1e4e5;padding:6px 12px;margin:-24px;margin-bottom:24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;display:inline-block;font-weight:bold;padding:0 6px}.rst-content .footnote-reference,.rst-content .citation-reference{vertical-align:super;font-size:90%}.rst-content table.docutils.citation,.rst-content table.docutils.footnote{background:none;border:none;color:#999}.rst-content table.docutils.citation td,.rst-content table.docutils.citation tr,.rst-content table.docutils.footnote td,.rst-content table.docutils.footnote tr{border:none;background-color:transparent !important;white-space:normal}.rst-content table.docutils.citation td.label,.rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}.rst-content table.field-list{border:none}.rst-content table.field-list td{border:none;padding-top:5px}.rst-content table.field-list td>strong{display:inline-block;margin-top:3px}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left;padding-left:0}.rst-content tt{color:#000}.rst-content tt big,.rst-content tt em{font-size:100% !important;line-height:normal}.rst-content tt .xref,a .rst-content tt{font-weight:bold}.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:bold}.rst-content dl p,.rst-content dl table,.rst-content dl ul,.rst-content dl ol{margin-bottom:12px !important}.rst-content dl dd{margin:0 0 12px 24px}.rst-content dl:not(.docutils){margin-bottom:24px}.rst-content dl:not(.docutils) dt{display:inline-block;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:solid 3px #6ab0de;padding:6px;position:relative}.rst-content dl:not(.docutils) dt:before{color:#6ab0de}.rst-content dl:not(.docutils) dt .headerlink{color:#404040;font-size:100% !important}.rst-content dl:not(.docutils) dl dt{margin-bottom:6px;border:none;border-left:solid 3px #ccc;background:#f0f0f0;color:gray}.rst-content dl:not(.docutils) dl dt .headerlink{color:#404040;font-size:100% !important}.rst-content dl:not(.docutils) dt:first-child{margin-top:0}.rst-content dl:not(.docutils) tt{font-weight:bold}.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) tt.descclassname{background-color:transparent;border:none;padding:0;font-size:100% !important}.rst-content dl:not(.docutils) tt.descname{font-weight:bold}.rst-content dl:not(.docutils) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:bold}.rst-content dl:not(.docutils) .property{display:inline-block;padding-right:8px}.rst-content .viewcode-link,.rst-content .viewcode-back{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}@media screen and (max-width: 480px){.rst-content .sidebar{width:100%}}span[id*='MathJax-Span']{color:#404040} diff --git a/site/source/_themes/emscripten_sphinx_rtd_theme/static/fonts/fontawesome-webfont.eot b/site/source/_themes/emscripten_sphinx_rtd_theme/static/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..7c79c6a6bc9a128a2a8eaffbe49a4338625fdbc2 GIT binary patch literal 38205 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 E0QL`y%>V!Z literal 0 HcmV?d00001 diff --git a/site/source/_themes/emscripten_sphinx_rtd_theme/static/fonts/fontawesome-webfont.svg b/site/source/_themes/emscripten_sphinx_rtd_theme/static/fonts/fontawesome-webfont.svg new file mode 100644 index 0000000000000..45fdf33830123 --- /dev/null +++ b/site/source/_themes/emscripten_sphinx_rtd_theme/static/fonts/fontawesome-webfont.svg @@ -0,0 +1,414 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/site/source/_themes/emscripten_sphinx_rtd_theme/static/fonts/fontawesome-webfont.ttf b/site/source/_themes/emscripten_sphinx_rtd_theme/static/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..e89738de5eaf8fca33a2f2cdc5cb4929caa62b71 GIT binary patch literal 80652 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 qx{Kk=rVu5YQ9XR<GPS>b$X_& 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 z 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
    V$fDV|Iw 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"); +}); + +window.SphinxRtdTheme = (function (jquery) { + var stickyNav = (function () { + var navBar, + win, + stickyNavCssClass = 'stickynav', + applyStickNav = function () { + if (navBar.height() <= win.height()) { + navBar.addClass(stickyNavCssClass); + } else { + navBar.removeClass(stickyNavCssClass); + } + }, + enable = function () { + applyStickNav(); + win.on('resize', applyStickNav); + }, + init = function () { + navBar = jquery('nav.wy-nav-side:first'); + win = jquery(window); + }; + jquery(init); + return { + enable : enable + }; + }()); + return { + StickyNav : stickyNav + }; +}($)); diff --git a/site/source/_themes/emscripten_sphinx_rtd_theme/theme.conf b/site/source/_themes/emscripten_sphinx_rtd_theme/theme.conf new file mode 100644 index 0000000000000..dcfbf8c2245fb --- /dev/null +++ b/site/source/_themes/emscripten_sphinx_rtd_theme/theme.conf @@ -0,0 +1,8 @@ +[theme] +inherit = basic +stylesheet = css/theme.css + +[options] +typekit_id = hiw1hhg +analytics_id = +sticky_navigation = False diff --git a/site/source/_themes/emscripten_sphinx_rtd_theme/versions.html b/site/source/_themes/emscripten_sphinx_rtd_theme/versions.html new file mode 100644 index 0000000000000..8b3eb79d2592e --- /dev/null +++ b/site/source/_themes/emscripten_sphinx_rtd_theme/versions.html @@ -0,0 +1,37 @@ +{% if READTHEDOCS %} +{# Add rst-badge after rst-versions for small badge style. #} +
    + + Read the Docs + v: {{ current_version }} + + +
    +
    +
    Versions
    + {% for slug, url in versions %} +
    {{ slug }}
    + {% endfor %} +
    +
    +
    Downloads
    + {% for type, url in downloads %} +
    {{ type }}
    + {% endfor %} +
    +
    +
    On Read the Docs
    +
    + Project Home +
    +
    + Builds +
    +
    +
    + Free document hosting provided by Read the Docs. + +
    +
    +{% endif %} + diff --git a/site/source/api_items.py b/site/source/api_items.py new file mode 100644 index 0000000000000..8a5beded8b62b --- /dev/null +++ b/site/source/api_items.py @@ -0,0 +1,273 @@ +# Auto-generated file (see get-api_items.py) +# + +def get_mapped_items(): + mapped_wiki_inline_code = dict() + mapped_wiki_inline_code['emscripten_set_visibilitychange_callback']=':c:func:`emscripten_set_visibilitychange_callback`' + mapped_wiki_inline_code['Pointer_stringify()']=':js:func:`Pointer_stringify`' + mapped_wiki_inline_code['emscripten_set_main_loop_arg()']=':c:func:`emscripten_set_main_loop_arg`' + mapped_wiki_inline_code['EMSCRIPTEN_RESULT_NO_DATA']=':c:macro:`EMSCRIPTEN_RESULT_NO_DATA`' + mapped_wiki_inline_code['em_worker_callback_func']=':c:type:`em_worker_callback_func`' + mapped_wiki_inline_code['EMSCRIPTEN_EVENT_BLUR']=':c:macro:`EMSCRIPTEN_EVENT_BLUR`' + mapped_wiki_inline_code['EMSCRIPTEN_EVENT_WEBGLCONTEXTLOST']=':c:macro:`EMSCRIPTEN_EVENT_WEBGLCONTEXTLOST`' + mapped_wiki_inline_code['emscripten_call_worker()']=':c:func:`emscripten_call_worker`' + mapped_wiki_inline_code['writeArrayToMemory()']=':js:func:`writeArrayToMemory`' + mapped_wiki_inline_code['emscripten_exit_pointerlock()']=':c:func:`emscripten_exit_pointerlock`' + mapped_wiki_inline_code['emscripten_set_visibilitychange_callback()']=':c:func:`emscripten_set_visibilitychange_callback`' + mapped_wiki_inline_code['emscripten_run_script()']=':c:func:`emscripten_run_script`' + mapped_wiki_inline_code['emscripten_get_devicemotion_status()']=':c:func:`emscripten_get_devicemotion_status`' + mapped_wiki_inline_code['emscripten_set_beforeunload_callback()']=':c:func:`emscripten_set_beforeunload_callback`' + mapped_wiki_inline_code['writeAsciiToMemory()']=':js:func:`writeAsciiToMemory`' + mapped_wiki_inline_code['emscripten_async_wget2()']=':c:func:`emscripten_async_wget2`' + mapped_wiki_inline_code['EMSCRIPTEN_EVENT_RESIZE']=':c:macro:`EMSCRIPTEN_EVENT_RESIZE`' + mapped_wiki_inline_code['writeAsciiToMemory']=':js:func:`writeAsciiToMemory`' + mapped_wiki_inline_code['EmscriptenKeyboardEvent']=':c:type:`EmscriptenKeyboardEvent`' + mapped_wiki_inline_code['EM_ASM']=':c:macro:`EM_ASM`' + mapped_wiki_inline_code['EMSCRIPTEN_EVENT_KEYPRESS']=':c:macro:`EMSCRIPTEN_EVENT_KEYPRESS`' + mapped_wiki_inline_code['DOM_KEY_LOCATION_STANDARD']=':c:macro:`DOM_KEY_LOCATION_STANDARD`' + mapped_wiki_inline_code['emscripten_get_now()']=':c:func:`emscripten_get_now`' + mapped_wiki_inline_code['emscripten_get_now']=':c:func:`emscripten_get_now`' + mapped_wiki_inline_code['emscripten_create_worker()']=':c:func:`emscripten_create_worker`' + mapped_wiki_inline_code['emscripten_cancel_main_loop()']=':c:func:`emscripten_cancel_main_loop`' + mapped_wiki_inline_code['EM_UTF8']=':c:macro:`EM_UTF8`' + mapped_wiki_inline_code['EMSCRIPTEN_VISIBILITY_UNLOADED']=':c:macro:`EMSCRIPTEN_VISIBILITY_UNLOADED`' + mapped_wiki_inline_code['emscripten_cancel_main_loop']=':c:func:`emscripten_cancel_main_loop`' + mapped_wiki_inline_code['emscripten_set_blur_callback()']=':c:func:`emscripten_set_blur_callback`' + mapped_wiki_inline_code['emscripten_get_deviceorientation_status']=':c:func:`emscripten_get_deviceorientation_status`' + mapped_wiki_inline_code['em_async_wget_onload_func']=':c:type:`em_async_wget_onload_func`' + mapped_wiki_inline_code['emscripten_get_battery_status()']=':c:func:`emscripten_get_battery_status`' + mapped_wiki_inline_code['EMSCRIPTEN_VISIBILITY_VISIBLE']=':c:macro:`EMSCRIPTEN_VISIBILITY_VISIBLE`' + mapped_wiki_inline_code['EmscriptenUiEvent']=':c:type:`EmscriptenUiEvent`' + mapped_wiki_inline_code['emscripten_lock_orientation']=':c:func:`emscripten_lock_orientation`' + mapped_wiki_inline_code['emscripten_async_prepare']=':c:func:`emscripten_async_prepare`' + mapped_wiki_inline_code['emscripten_async_load_script']=':c:func:`emscripten_async_load_script`' + mapped_wiki_inline_code['emscripten_get_visibility_status()']=':c:func:`emscripten_get_visibility_status`' + mapped_wiki_inline_code['emscripten_async_run_script()']=':c:func:`emscripten_async_run_script`' + mapped_wiki_inline_code['emscripten_hide_mouse']=':c:func:`emscripten_hide_mouse`' + mapped_wiki_inline_code['emscripten_get_gamepad_status']=':c:func:`emscripten_get_gamepad_status`' + mapped_wiki_inline_code['stackTrace']=':js:func:`stackTrace`' + mapped_wiki_inline_code['*emscripten_get_preloaded_image_data_from_FILE']=':c:func:`*emscripten_get_preloaded_image_data_from_FILE`' + mapped_wiki_inline_code['emscripten_set_devicemotion_callback']=':c:func:`emscripten_set_devicemotion_callback`' + mapped_wiki_inline_code['emscripten_set_wheel_callback()']=':c:func:`emscripten_set_wheel_callback`' + mapped_wiki_inline_code['emscripten_hide_mouse()']=':c:func:`emscripten_hide_mouse`' + mapped_wiki_inline_code['em_callback_func']=':c:type:`em_callback_func`' + mapped_wiki_inline_code['emscripten_get_compiler_setting']=':c:func:`emscripten_get_compiler_setting`' + mapped_wiki_inline_code['EmscriptenFullscreenChangeEvent']=':c:type:`EmscriptenFullscreenChangeEvent`' + mapped_wiki_inline_code['emscripten_exit_fullscreen()']=':c:func:`emscripten_exit_fullscreen`' + mapped_wiki_inline_code['emscripten_vibrate_pattern']=':c:func:`emscripten_vibrate_pattern`' + mapped_wiki_inline_code['em_async_wget2_data_onload_func']=':c:type:`em_async_wget2_data_onload_func`' + mapped_wiki_inline_code['em_async_wget2_data_onerror_func']=':c:type:`em_async_wget2_data_onerror_func`' + mapped_wiki_inline_code['stringToUTF32()']=':js:func:`stringToUTF32`' + mapped_wiki_inline_code['emscripten_set_main_loop_expected_blockers']=':c:func:`emscripten_set_main_loop_expected_blockers`' + mapped_wiki_inline_code['emscripten_unlock_orientation()']=':c:func:`emscripten_unlock_orientation`' + mapped_wiki_inline_code['addRunDependency()']=':js:func:`addRunDependency`' + mapped_wiki_inline_code['worker_handle']=':c:var:`worker_handle`' + mapped_wiki_inline_code['emscripten_unlock_orientation']=':c:func:`emscripten_unlock_orientation`' + mapped_wiki_inline_code['Pointer_stringify']=':js:func:`Pointer_stringify`' + mapped_wiki_inline_code['emscripten_get_devicemotion_status']=':c:func:`emscripten_get_devicemotion_status`' + mapped_wiki_inline_code['EM_LOG_NO_PATHS']=':c:macro:`EM_LOG_NO_PATHS`' + mapped_wiki_inline_code['EMSCRIPTEN_RESULT_FAILED']=':c:macro:`EMSCRIPTEN_RESULT_FAILED`' + mapped_wiki_inline_code['emscripten_vibrate_pattern()']=':c:func:`emscripten_vibrate_pattern`' + mapped_wiki_inline_code['EM_LOG_FUNC_PARAMS']=':c:macro:`EM_LOG_FUNC_PARAMS`' + mapped_wiki_inline_code['emscripten_get_visibility_status']=':c:func:`emscripten_get_visibility_status`' + mapped_wiki_inline_code['EMSCRIPTEN_ORIENTATION_PORTRAIT_SECONDARY']=':c:macro:`EMSCRIPTEN_ORIENTATION_PORTRAIT_SECONDARY`' + mapped_wiki_inline_code['EMSCRIPTEN_VISIBILITY_PRERENDER']=':c:macro:`EMSCRIPTEN_VISIBILITY_PRERENDER`' + mapped_wiki_inline_code['emscripten_exit_pointerlock']=':c:func:`emscripten_exit_pointerlock`' + mapped_wiki_inline_code['EM_BOOL']=':c:macro:`EM_BOOL`' + mapped_wiki_inline_code['emscripten_async_wget_data']=':c:func:`emscripten_async_wget_data`' + mapped_wiki_inline_code['stringToUTF16()']=':js:func:`stringToUTF16`' + mapped_wiki_inline_code['EMSCRIPTEN_RESULT_INVALID_TARGET']=':c:macro:`EMSCRIPTEN_RESULT_INVALID_TARGET`' + mapped_wiki_inline_code['intArrayFromString()']=':js:func:`intArrayFromString`' + mapped_wiki_inline_code['EmscriptenVisibilityChangeEvent']=':c:type:`EmscriptenVisibilityChangeEvent`' + mapped_wiki_inline_code['emscripten_create_worker']=':c:func:`emscripten_create_worker`' + mapped_wiki_inline_code['getValue']=':js:func:`getValue`' + mapped_wiki_inline_code['emscripten_call_worker']=':c:func:`emscripten_call_worker`' + mapped_wiki_inline_code['stackTrace()']=':js:func:`stackTrace`' + mapped_wiki_inline_code['em_str_callback_func']=':c:type:`em_str_callback_func`' + mapped_wiki_inline_code['EMSCRIPTEN_EVENT_TOUCHSTART']=':c:macro:`EMSCRIPTEN_EVENT_TOUCHSTART`' + mapped_wiki_inline_code['emscripten_set_keypress_callback()']=':c:func:`emscripten_set_keypress_callback`' + mapped_wiki_inline_code['EM_ASM_']=':c:macro:`EM_ASM_`' + mapped_wiki_inline_code['emscripten_set_orientationchange_callback()']=':c:func:`emscripten_set_orientationchange_callback`' + mapped_wiki_inline_code['HEAPF32']=':js:data:`HEAPF32`' + mapped_wiki_inline_code['EMSCRIPTEN_EVENT_VISIBILITYCHANGE']=':c:macro:`EMSCRIPTEN_EVENT_VISIBILITYCHANGE`' + mapped_wiki_inline_code['emscripten_get_orientation_status']=':c:func:`emscripten_get_orientation_status`' + mapped_wiki_inline_code['emscripten_exit_with_live_runtime']=':c:func:`emscripten_exit_with_live_runtime`' + mapped_wiki_inline_code['emscripten_exit_with_live_runtime()']=':c:func:`emscripten_exit_with_live_runtime`' + mapped_wiki_inline_code['emscripten_set_devicemotion_callback()']=':c:func:`emscripten_set_devicemotion_callback`' + mapped_wiki_inline_code['emscripten_get_pointerlock_status']=':c:func:`emscripten_get_pointerlock_status`' + mapped_wiki_inline_code['HEAP32']=':js:data:`HEAP32`' + mapped_wiki_inline_code['emscripten_get_num_gamepads()']=':c:func:`emscripten_get_num_gamepads`' + mapped_wiki_inline_code['*emscripten_get_preloaded_image_data']=':c:func:`*emscripten_get_preloaded_image_data`' + mapped_wiki_inline_code['EMSCRIPTEN_EVENT_BATTERYCHARGINGCHANGE']=':c:macro:`EMSCRIPTEN_EVENT_BATTERYCHARGINGCHANGE`' + mapped_wiki_inline_code['emscripten_get_mouse_status()']=':c:func:`emscripten_get_mouse_status`' + mapped_wiki_inline_code['HEAPF64']=':js:data:`HEAPF64`' + mapped_wiki_inline_code['setValue']=':js:func:`setValue`' + mapped_wiki_inline_code['EmscriptenPointerlockChangeEvent']=':c:type:`EmscriptenPointerlockChangeEvent`' + mapped_wiki_inline_code['EMSCRIPTEN_EVENT_GAMEPADCONNECTED']=':c:macro:`EMSCRIPTEN_EVENT_GAMEPADCONNECTED`' + mapped_wiki_inline_code['emscripten_set_deviceorientation_callback']=':c:func:`emscripten_set_deviceorientation_callback`' + mapped_wiki_inline_code['emscripten_set_fullscreenchange_callback()']=':c:func:`emscripten_set_fullscreenchange_callback`' + mapped_wiki_inline_code['emscripten_set_orientationchange_callback']=':c:func:`emscripten_set_orientationchange_callback`' + mapped_wiki_inline_code['emscripten_get_battery_status']=':c:func:`emscripten_get_battery_status`' + mapped_wiki_inline_code['emscripten_set_beforeunload_callback']=':c:func:`emscripten_set_beforeunload_callback`' + mapped_wiki_inline_code['emscripten_random()']=':c:func:`emscripten_random`' + mapped_wiki_inline_code['EMSCRIPTEN_RESULT']=':c:macro:`EMSCRIPTEN_RESULT`' + mapped_wiki_inline_code['emscripten_get_canvas_size']=':c:func:`emscripten_get_canvas_size`' + mapped_wiki_inline_code['emscripten_async_run_script']=':c:func:`emscripten_async_run_script`' + mapped_wiki_inline_code['emscripten_worker_respond()']=':c:func:`emscripten_worker_respond`' + mapped_wiki_inline_code['DOM_DELTA_PIXEL']=':c:macro:`DOM_DELTA_PIXEL`' + mapped_wiki_inline_code['emscripten_set_batterychargingchange_callback']=':c:func:`emscripten_set_batterychargingchange_callback`' + mapped_wiki_inline_code['EM_LOG_C_STACK']=':c:macro:`EM_LOG_C_STACK`' + mapped_wiki_inline_code['*emscripten_run_script_string']=':c:func:`*emscripten_run_script_string`' + mapped_wiki_inline_code['emscripten_get_fullscreen_status']=':c:func:`emscripten_get_fullscreen_status`' + mapped_wiki_inline_code['HEAP16']=':js:data:`HEAP16`' + mapped_wiki_inline_code['emscripten_random']=':c:func:`emscripten_random`' + mapped_wiki_inline_code['EM_LOG_ERROR']=':c:macro:`EM_LOG_ERROR`' + mapped_wiki_inline_code['EmscriptenGamepadEvent']=':c:type:`EmscriptenGamepadEvent`' + mapped_wiki_inline_code['emscripten_set_keypress_callback']=':c:func:`emscripten_set_keypress_callback`' + mapped_wiki_inline_code['emscripten_exit_fullscreen']=':c:func:`emscripten_exit_fullscreen`' + mapped_wiki_inline_code['UTF16ToString()']=':js:func:`UTF16ToString`' + mapped_wiki_inline_code['EMSCRIPTEN_EVENT_ORIENTATIONCHANGE']=':c:macro:`EMSCRIPTEN_EVENT_ORIENTATIONCHANGE`' + mapped_wiki_inline_code['emscripten_request_fullscreen()']=':c:func:`emscripten_request_fullscreen`' + mapped_wiki_inline_code['em_async_wget2_data_onprogress_func']=':c:type:`em_async_wget2_data_onprogress_func`' + mapped_wiki_inline_code['emscripten_get_worker_queue_size']=':c:func:`emscripten_get_worker_queue_size`' + mapped_wiki_inline_code['emscripten_destroy_worker']=':c:func:`emscripten_destroy_worker`' + mapped_wiki_inline_code['getValue()']=':js:func:`getValue`' + mapped_wiki_inline_code['cwrap']=':js:func:`cwrap`' + mapped_wiki_inline_code['EMSCRIPTEN_ORIENTATION_LANDSCAPE_SECONDARY']=':c:macro:`EMSCRIPTEN_ORIENTATION_LANDSCAPE_SECONDARY`' + mapped_wiki_inline_code['_emscripten_push_main_loop_blocker()']=':c:func:`_emscripten_push_main_loop_blocker`' + mapped_wiki_inline_code['EM_LOG_CONSOLE']=':c:macro:`EM_LOG_CONSOLE`' + mapped_wiki_inline_code['DOM_KEY_LOCATION']=':c:macro:`DOM_KEY_LOCATION`' + mapped_wiki_inline_code['emscripten_async_call()']=':c:func:`emscripten_async_call`' + mapped_wiki_inline_code['emscripten_async_wget']=':c:func:`emscripten_async_wget`' + mapped_wiki_inline_code['emscripten_async_call']=':c:func:`emscripten_async_call`' + mapped_wiki_inline_code['emscripten_get_worker_queue_size()']=':c:func:`emscripten_get_worker_queue_size`' + mapped_wiki_inline_code['intArrayToString()']=':js:func:`intArrayToString`' + mapped_wiki_inline_code['emscripten_async_wget()']=':c:func:`emscripten_async_wget`' + mapped_wiki_inline_code['EmscriptenDeviceOrientationEvent']=':c:type:`EmscriptenDeviceOrientationEvent`' + mapped_wiki_inline_code['writeStringToMemory']=':js:func:`writeStringToMemory`' + mapped_wiki_inline_code['emscripten_log()']=':c:func:`emscripten_log`' + mapped_wiki_inline_code['EmscriptenTouchPoint']=':c:type:`EmscriptenTouchPoint`' + mapped_wiki_inline_code['em_arg_callback_func']=':c:type:`em_arg_callback_func`' + mapped_wiki_inline_code['*emscripten_run_script_string()']=':c:func:`*emscripten_run_script_string`' + mapped_wiki_inline_code['emscripten_async_load_script()']=':c:func:`emscripten_async_load_script`' + mapped_wiki_inline_code['emscripten_request_pointerlock()']=':c:func:`emscripten_request_pointerlock`' + mapped_wiki_inline_code['emscripten_set_touchstart_callback()']=':c:func:`emscripten_set_touchstart_callback`' + mapped_wiki_inline_code['emscripten_get_orientation_status()']=':c:func:`emscripten_get_orientation_status`' + mapped_wiki_inline_code['EmscriptenOrientationChangeEvent']=':c:type:`EmscriptenOrientationChangeEvent`' + mapped_wiki_inline_code['ccall']=':js:func:`ccall`' + mapped_wiki_inline_code['emscripten_set_touchstart_callback']=':c:func:`emscripten_set_touchstart_callback`' + mapped_wiki_inline_code['emscripten_set_resize_callback()']=':c:func:`emscripten_set_resize_callback`' + mapped_wiki_inline_code['emscripten_get_num_gamepads']=':c:func:`emscripten_get_num_gamepads`' + mapped_wiki_inline_code['emscripten_get_pointerlock_status()']=':c:func:`emscripten_get_pointerlock_status`' + mapped_wiki_inline_code['emscripten_set_blur_callback']=':c:func:`emscripten_set_blur_callback`' + mapped_wiki_inline_code['*emscripten_get_preloaded_image_data()']=':c:func:`*emscripten_get_preloaded_image_data`' + mapped_wiki_inline_code['intArrayFromString']=':js:func:`intArrayFromString`' + mapped_wiki_inline_code['emscripten_set_pointerlockchange_callback()']=':c:func:`emscripten_set_pointerlockchange_callback`' + mapped_wiki_inline_code['emscripten_set_main_loop()']=':c:func:`emscripten_set_main_loop`' + mapped_wiki_inline_code['emscripten_set_resize_callback']=':c:func:`emscripten_set_resize_callback`' + mapped_wiki_inline_code['EmscriptenDeviceMotionEvent']=':c:type:`EmscriptenDeviceMotionEvent`' + mapped_wiki_inline_code['writeArrayToMemory']=':js:func:`writeArrayToMemory`' + mapped_wiki_inline_code['stringToUTF16']=':js:func:`stringToUTF16`' + mapped_wiki_inline_code['emscripten_set_gamepadconnected_callback()']=':c:func:`emscripten_set_gamepadconnected_callback`' + mapped_wiki_inline_code['emscripten_set_main_loop_expected_blockers()']=':c:func:`emscripten_set_main_loop_expected_blockers`' + mapped_wiki_inline_code['EmscriptenTouchEvent']=':c:type:`EmscriptenTouchEvent`' + mapped_wiki_inline_code['EMSCRIPTEN_RESULT_SUCCESS']=':c:macro:`EMSCRIPTEN_RESULT_SUCCESS`' + mapped_wiki_inline_code['intArrayToString']=':js:func:`intArrayToString`' + mapped_wiki_inline_code['emscripten_request_pointerlock']=':c:func:`emscripten_request_pointerlock`' + mapped_wiki_inline_code['emscripten_debugger']=':c:func:`emscripten_debugger`' + mapped_wiki_inline_code['EMSCRIPTEN_EVENT_CLICK']=':c:macro:`EMSCRIPTEN_EVENT_CLICK`' + mapped_wiki_inline_code['UTF32ToString']=':js:func:`UTF32ToString`' + mapped_wiki_inline_code['EMSCRIPTEN_KEEPALIVE']=':c:macro:`EMSCRIPTEN_KEEPALIVE`' + mapped_wiki_inline_code['emscripten_set_pointerlockchange_callback']=':c:func:`emscripten_set_pointerlockchange_callback`' + mapped_wiki_inline_code['UTF16ToString']=':js:func:`UTF16ToString`' + mapped_wiki_inline_code['EMSCRIPTEN_NETWORK_WEBSOCKETS']=':c:macro:`EMSCRIPTEN_NETWORK_WEBSOCKETS`' + mapped_wiki_inline_code['UTF32ToString()']=':js:func:`UTF32ToString`' + mapped_wiki_inline_code['emscripten_get_gamepad_status()']=':c:func:`emscripten_get_gamepad_status`' + mapped_wiki_inline_code['EMSCRIPTEN_RESULT_DEFERRED']=':c:macro:`EMSCRIPTEN_RESULT_DEFERRED`' + mapped_wiki_inline_code['EMSCRIPTEN_RESULT_UNKNOWN_TARGET']=':c:macro:`EMSCRIPTEN_RESULT_UNKNOWN_TARGET`' + mapped_wiki_inline_code['EMSCRIPTEN_EVENT_BEFOREUNLOAD']=':c:macro:`EMSCRIPTEN_EVENT_BEFOREUNLOAD`' + mapped_wiki_inline_code['EMSCRIPTEN_EVENT_POINTERLOCKCHANGE']=':c:macro:`EMSCRIPTEN_EVENT_POINTERLOCKCHANGE`' + mapped_wiki_inline_code['EMSCRIPTEN_ORIENTATION_PORTRAIT_PRIMARY']=':c:macro:`EMSCRIPTEN_ORIENTATION_PORTRAIT_PRIMARY`' + mapped_wiki_inline_code['EMSCRIPTEN_EVENT_WHEEL']=':c:macro:`EMSCRIPTEN_EVENT_WHEEL`' + mapped_wiki_inline_code['emscripten_async_prepare_data']=':c:func:`emscripten_async_prepare_data`' + mapped_wiki_inline_code['writeStringToMemory()']=':js:func:`writeStringToMemory`' + mapped_wiki_inline_code['emscripten_is_webgl_context_lost()']=':c:func:`emscripten_is_webgl_context_lost`' + mapped_wiki_inline_code['emscripten_worker_respond']=':c:func:`emscripten_worker_respond`' + mapped_wiki_inline_code['EmscriptenWheelEvent']=':c:type:`EmscriptenWheelEvent`' + mapped_wiki_inline_code['emscripten_request_fullscreen']=':c:func:`emscripten_request_fullscreen`' + mapped_wiki_inline_code['em_async_wget2_onstatus_func']=':c:type:`em_async_wget2_onstatus_func`' + mapped_wiki_inline_code['emscripten_set_click_callback']=':c:func:`emscripten_set_click_callback`' + mapped_wiki_inline_code['setValue()']=':js:func:`setValue`' + mapped_wiki_inline_code['emscripten_set_webglcontextlost_callback']=':c:func:`emscripten_set_webglcontextlost_callback`' + mapped_wiki_inline_code['emscripten_run_script']=':c:func:`emscripten_run_script`' + mapped_wiki_inline_code['emscripten_set_click_callback()']=':c:func:`emscripten_set_click_callback`' + mapped_wiki_inline_code['emscripten_set_gamepadconnected_callback']=':c:func:`emscripten_set_gamepadconnected_callback`' + mapped_wiki_inline_code['HEAPU16']=':js:data:`HEAPU16`' + mapped_wiki_inline_code['removeRunDependency()']=':js:func:`removeRunDependency`' + mapped_wiki_inline_code['EmscriptenMouseEvent']=':c:type:`EmscriptenMouseEvent`' + mapped_wiki_inline_code['emscripten_get_mouse_status']=':c:func:`emscripten_get_mouse_status`' + mapped_wiki_inline_code['emscripten_set_network_backend()']=':c:func:`emscripten_set_network_backend`' + mapped_wiki_inline_code['emscripten_pause_main_loop()']=':c:func:`emscripten_pause_main_loop`' + mapped_wiki_inline_code['emscripten_async_wget2_data()']=':c:func:`emscripten_async_wget2_data`' + mapped_wiki_inline_code['EM_LOG_JS_STACK']=':c:macro:`EM_LOG_JS_STACK`' + mapped_wiki_inline_code['EMSCRIPTEN_ORIENTATION_LANDSCAPE_PRIMARY']=':c:macro:`EMSCRIPTEN_ORIENTATION_LANDSCAPE_PRIMARY`' + mapped_wiki_inline_code['emscripten_async_wget2_data']=':c:func:`emscripten_async_wget2_data`' + mapped_wiki_inline_code['emscripten_pause_main_loop']=':c:func:`emscripten_pause_main_loop`' + mapped_wiki_inline_code['emscripten_set_main_loop_arg']=':c:func:`emscripten_set_main_loop_arg`' + mapped_wiki_inline_code['em_async_wget2_onload_func']=':c:type:`em_async_wget2_onload_func`' + mapped_wiki_inline_code['emscripten_set_deviceorientation_callback()']=':c:func:`emscripten_set_deviceorientation_callback`' + mapped_wiki_inline_code['emscripten_set_webglcontextlost_callback()']=':c:func:`emscripten_set_webglcontextlost_callback`' + mapped_wiki_inline_code['emscripten_get_callstack()']=':c:func:`emscripten_get_callstack`' + mapped_wiki_inline_code['emscripten_lock_orientation()']=':c:func:`emscripten_lock_orientation`' + mapped_wiki_inline_code['EMSCRIPTEN_EVENT_FULLSCREENCHANGE']=':c:macro:`EMSCRIPTEN_EVENT_FULLSCREENCHANGE`' + mapped_wiki_inline_code['DOM_DELTA_LINE']=':c:macro:`DOM_DELTA_LINE`' + mapped_wiki_inline_code['emscripten_set_network_backend']=':c:func:`emscripten_set_network_backend`' + mapped_wiki_inline_code['EMSCRIPTEN_RESULT_NOT_SUPPORTED']=':c:macro:`EMSCRIPTEN_RESULT_NOT_SUPPORTED`' + mapped_wiki_inline_code['emscripten_destroy_worker()']=':c:func:`emscripten_destroy_worker`' + mapped_wiki_inline_code['EM_LOG_WARN']=':c:macro:`EM_LOG_WARN`' + mapped_wiki_inline_code['emscripten_is_webgl_context_lost']=':c:func:`emscripten_is_webgl_context_lost`' + mapped_wiki_inline_code['emscripten_async_wget2']=':c:func:`emscripten_async_wget2`' + mapped_wiki_inline_code['emscripten_debugger()']=':c:func:`emscripten_debugger`' + mapped_wiki_inline_code['emscripten_vibrate']=':c:func:`emscripten_vibrate`' + mapped_wiki_inline_code['emscripten_set_batterychargingchange_callback()']=':c:func:`emscripten_set_batterychargingchange_callback`' + mapped_wiki_inline_code['ccall()']=':js:func:`ccall`' + mapped_wiki_inline_code['em_async_prepare_data_onload_func']=':c:type:`em_async_prepare_data_onload_func`' + mapped_wiki_inline_code['emscripten_async_wget_data()']=':c:func:`emscripten_async_wget_data`' + mapped_wiki_inline_code['EmscriptenBatteryEvent']=':c:type:`EmscriptenBatteryEvent`' + mapped_wiki_inline_code['emscripten_async_prepare()']=':c:func:`emscripten_async_prepare`' + mapped_wiki_inline_code['EmscriptenFocusEvent']=':c:type:`EmscriptenFocusEvent`' + mapped_wiki_inline_code['emscripten_jcache_printf']=':c:func:`emscripten_jcache_printf`' + mapped_wiki_inline_code['emscripten_async_prepare_data()']=':c:func:`emscripten_async_prepare_data`' + mapped_wiki_inline_code['removeRunDependency']=':js:func:`removeRunDependency`' + mapped_wiki_inline_code['EMSCRIPTEN_EVENT_DEVICEORIENTATION']=':c:macro:`EMSCRIPTEN_EVENT_DEVICEORIENTATION`' + mapped_wiki_inline_code['stringToUTF32']=':js:func:`stringToUTF32`' + mapped_wiki_inline_code['emscripten_get_compiler_setting()']=':c:func:`emscripten_get_compiler_setting`' + mapped_wiki_inline_code['emscripten_set_main_loop']=':c:func:`emscripten_set_main_loop`' + mapped_wiki_inline_code['HEAP8']=':js:data:`HEAP8`' + mapped_wiki_inline_code['EMSCRIPTEN_RESULT_FAILED_NOT_DEFERRED']=':c:macro:`EMSCRIPTEN_RESULT_FAILED_NOT_DEFERRED`' + mapped_wiki_inline_code['_emscripten_push_main_loop_blocker']=':c:func:`_emscripten_push_main_loop_blocker`' + mapped_wiki_inline_code['emscripten_set_fullscreenchange_callback']=':c:func:`emscripten_set_fullscreenchange_callback`' + mapped_wiki_inline_code['EMSCRIPTEN_EVENT_DEVICEMOTION']=':c:macro:`EMSCRIPTEN_EVENT_DEVICEMOTION`' + mapped_wiki_inline_code['HEAPU8']=':js:data:`HEAPU8`' + mapped_wiki_inline_code['emscripten_get_deviceorientation_status()']=':c:func:`emscripten_get_deviceorientation_status`' + mapped_wiki_inline_code['EM_LOG_DEMANGLE']=':c:macro:`EM_LOG_DEMANGLE`' + mapped_wiki_inline_code['emscripten_run_script_int()']=':c:func:`emscripten_run_script_int`' + mapped_wiki_inline_code['EMSCRIPTEN_RESULT_INVALID_PARAM']=':c:macro:`EMSCRIPTEN_RESULT_INVALID_PARAM`' + mapped_wiki_inline_code['cwrap()']=':js:func:`cwrap`' + mapped_wiki_inline_code['emscripten_vibrate()']=':c:func:`emscripten_vibrate`' + mapped_wiki_inline_code['emscripten_jcache_printf()']=':c:func:`emscripten_jcache_printf`' + mapped_wiki_inline_code['emscripten_get_fullscreen_status()']=':c:func:`emscripten_get_fullscreen_status`' + mapped_wiki_inline_code['emscripten_run_script_int']=':c:func:`emscripten_run_script_int`' + mapped_wiki_inline_code['EMSCRIPTEN_NETWORK_WEBRTC']=':c:macro:`EMSCRIPTEN_NETWORK_WEBRTC`' + mapped_wiki_inline_code['emscripten_log']=':c:func:`emscripten_log`' + mapped_wiki_inline_code['emscripten_set_wheel_callback']=':c:func:`emscripten_set_wheel_callback`' + mapped_wiki_inline_code['emscripten_set_canvas_size']=':c:func:`emscripten_set_canvas_size`' + mapped_wiki_inline_code['DOM_DELTA_PAGE']=':c:macro:`DOM_DELTA_PAGE`' + mapped_wiki_inline_code['emscripten_get_canvas_size()']=':c:func:`emscripten_get_canvas_size`' + mapped_wiki_inline_code['*emscripten_get_preloaded_image_data_from_FILE()']=':c:func:`*emscripten_get_preloaded_image_data_from_FILE`' + mapped_wiki_inline_code['emscripten_set_canvas_size()']=':c:func:`emscripten_set_canvas_size`' + mapped_wiki_inline_code['emscripten_get_callstack']=':c:func:`emscripten_get_callstack`' + mapped_wiki_inline_code['HEAPU32']=':js:data:`HEAPU32`' + mapped_wiki_inline_code['EMSCRIPTEN_VISIBILITY_HIDDEN']=':c:macro:`EMSCRIPTEN_VISIBILITY_HIDDEN`' + mapped_wiki_inline_code['addRunDependency']=':js:func:`addRunDependency`' + return mapped_wiki_inline_code \ No newline at end of file diff --git a/site/source/conf.py b/site/source/conf.py new file mode 100644 index 0000000000000..736cc3e261c68 --- /dev/null +++ b/site/source/conf.py @@ -0,0 +1,394 @@ +# -*- coding: utf-8 -*- +# +# Emscripten documentation build configuration file, created by +# sphinx-quickstart on Tue Jul 01 09:20:29 2014. +# +# This file is execfile()d with the current directory set to its +# containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +import sys +import os + + +# At the top. #HamishW https://pypi.python.org/pypi/sphinx-bootstrap-theme/ ... +import sphinx_bootstrap_theme + + +# At the top. #HamishW http://sphinx-better-theme.readthedocs.org/en/latest/installation.html easy_install sphinx_better_theme +from better import better_theme_path +#html_theme_path = [better_theme_path] + + +# At the top. #HamishW https://github.com/snide/sphinx_rtd_theme easy_install sphinx_rtd_theme +#import sphinx_rtd_theme +#html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] + +html_theme_path = ['_themes',] + + + + + + + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +#sys.path.insert(0, os.path.abspath('.')) + + +# -- General configuration ------------------------------------------------ + +# If your documentation needs a minimal Sphinx version, state it here. +#needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + 'sphinx.ext.autodoc', + 'sphinx.ext.doctest', + 'sphinx.ext.intersphinx', + 'sphinx.ext.todo', + 'sphinx.ext.coverage', + 'sphinx.ext.ifconfig', + 'sphinx.ext.viewcode', + # 'breathe', #added by HamishW +] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix of source filenames. +source_suffix = '.rst' + +# The encoding of source files. +#source_encoding = 'utf-8-sig' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = u'Emscripten' +copyright = u'2014, ' + # Note, theme was modified to allow this to display (fix breaks the translation code, which was breaking the above link and rendering it as text). + # Also so I could link to specific copyright page. + + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = '1.20' +# The full version, including alpha/beta/rc tags. +release = '1.20.0' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +#language = None + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +#today = '' +# Else, today_fmt is used as the format for a strftime call. +#today_fmt = '%B %d, %Y' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +exclude_patterns = [] + +# The reST default role (used for this markup: `text`) to use for all +# documents. +#default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +#add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +#add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +#show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# A list of ignored prefixes for module index sorting. +#modindex_common_prefix = [] + +# If true, keep warnings as "system message" paragraphs in the built documents. +#keep_warnings = False + + +# -- Options for HTML output ---------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +#html_theme = 'default' +#html_theme = 'sphinxdoc' +#html_theme = 'agogo' #like this +#html_theme = 'scrolls' +#html_theme = 'bootstrap' +#html_theme_path = sphinx_bootstrap_theme.get_html_theme_path() +#html_theme = 'better' +#html_theme = 'pyramid' +#html_theme = 'nature' +#html_theme = 'haiku' +#html_theme = "sphinx_rtd_theme" +html_theme = "emscripten_sphinx_rtd_theme" + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +#html_theme_options = { +# "rightsidebar": "true", +# "relbarbgcolor": "black" +#} + + +# Add any paths that contain custom themes here, relative to this directory. +#html_theme_path = [] + +# The name for this set of Sphinx documents. If None, it defaults to +# " v documentation". +#html_title = None + +# A shorter title for the navigation bar. Default is the same as html_title. +#html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +html_logo = '/_static/Emscripten_logo_full.png' + + +# The name of an image file (within the static path) to use as favicon of the +# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +#html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# Add any extra paths that contain custom files (such as robots.txt or +# .htaccess) here, relative to this directory. These files are copied +# directly to the root of the documentation. +#html_extra_path = [] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +#html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +#html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +#html_additional_pages = {} + +# If false, no module index is generated. +#html_domain_indices = True + +# If false, no index is generated. +#html_use_index = True + +# If true, the index is split into individual pages for each letter. +#html_split_index = False + +# If true, links to the reST sources are added to the pages. +#html_show_sourcelink = True + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +#html_show_sphinx = True + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +#html_show_copyright = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +#html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +#html_file_suffix = None + +# Output file base name for HTML help builder. +htmlhelp_basename = 'Emscriptendoc' + + +# -- Options for LaTeX output --------------------------------------------- + +latex_elements = { +# The paper size ('letterpaper' or 'a4paper'). +#'papersize': 'letterpaper', + +# The font size ('10pt', '11pt' or '12pt'). +#'pointsize': '10pt', + +# Additional stuff for the LaTeX preamble. +#'preamble': '', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + ('index', 'Emscripten.tex', u'Emscripten Documentation', + u'Hamish Willee', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +#latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +#latex_use_parts = False + +# If true, show page references after internal links. +#latex_show_pagerefs = False + +# If true, show URL addresses after external links. +#latex_show_urls = False + +# Documents to append as an appendix to all manuals. +#latex_appendices = [] + +# If false, no module index is generated. +#latex_domain_indices = True + + +# -- Options for manual page output --------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + ('index', 'emscripten', u'Emscripten Documentation', + [u'Hamish Willee'], 1) +] + +# If true, show URL addresses after external links. +#man_show_urls = False + + +# -- Options for Texinfo output ------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + ('index', 'Emscripten', u'Emscripten Documentation', + u'Hamish Willee', 'Emscripten', 'One line description of project.', + 'Miscellaneous'), +] + +# Documents to append as an appendix to all manuals. +#texinfo_appendices = [] + +# If false, no module index is generated. +#texinfo_domain_indices = True + +# How to display URL addresses: 'footnote', 'no', or 'inline'. +#texinfo_show_urls = 'footnote' + +# If true, do not generate a @detailmenu in the "Top" node's menu. +#texinfo_no_detailmenu = False + + +# -- Options for Epub output ---------------------------------------------- + +# Bibliographic Dublin Core info. +epub_title = u'Emscripten' +epub_author = u'Hamish Willee' +epub_publisher = u'Hamish Willee' +epub_copyright = u'2014, Emscripten Contributors' + +# The basename for the epub file. It defaults to the project name. +#epub_basename = u'Emscripten' + +# The HTML theme for the epub output. Since the default themes are not optimized +# for small screen space, using the same theme for HTML and epub output is +# usually not wise. This defaults to 'epub', a theme designed to save visual +# space. +#epub_theme = 'epub' + +# The language of the text. It defaults to the language option +# or en if the language is not set. +#epub_language = '' + +# The scheme of the identifier. Typical schemes are ISBN or URL. +#epub_scheme = '' + +# The unique identifier of the text. This can be a ISBN number +# or the project homepage. +#epub_identifier = '' + +# A unique identification for the text. +#epub_uid = '' + +# A tuple containing the cover image and cover page html template filenames. +#epub_cover = () + +# A sequence of (type, uri, title) tuples for the guide element of content.opf. +#epub_guide = () + +# HTML files that should be inserted before the pages created by sphinx. +# The format is a list of tuples containing the path and title. +#epub_pre_files = [] + +# HTML files shat should be inserted after the pages created by sphinx. +# The format is a list of tuples containing the path and title. +#epub_post_files = [] + +# A list of files that should not be packed into the epub file. +epub_exclude_files = ['search.html'] + +# The depth of the table of contents in toc.ncx. +#epub_tocdepth = 3 + +# Allow duplicate toc entries. +#epub_tocdup = True + +# Choose between 'default' and 'includehidden'. +#epub_tocscope = 'default' + +# Fix unsupported image types using the PIL. +#epub_fix_images = False + +# Scale large images. +#epub_max_image_width = 0 + +# How to display URL addresses: 'footnote', 'no', or 'inline'. +#epub_show_urls = 'inline' + +# If false, no index is generated. +#epub_use_index = True + + +# Example configuration for intersphinx: refer to the Python standard library. +intersphinx_mapping = {'http://docs.python.org/': None} + +# HamishW - set highlighting language. +highlight_language = 'cpp' + +# HamishW - set domain (cpp) +primary_domain = 'cpp' + +# HamishW - tell Breathe about projects. Breathe is tool to convert Doxygen to Python objects, for import into Sphinx. +#breathe_projects = { "myproject": "/home/me/docproj/doxyxml/", "nutshell":"./headers/xml/", } +# HamishW - Specify a default project: +#breathe_default_project = "nutshell" \ No newline at end of file diff --git a/site/source/docs/api_reference/advanced-apis.rst b/site/source/docs/api_reference/advanced-apis.rst new file mode 100644 index 0000000000000..2bf0125edfa19 --- /dev/null +++ b/site/source/docs/api_reference/advanced-apis.rst @@ -0,0 +1,49 @@ +========================================== +Advanced/Internal APIs (ready-for-review) +========================================== + +This section lists APIs which are not considered suitable for general use, but which may be useful to some developers in some circumstances. These include APIs that are difficult or complicated to use, or which are intended primarily for Emscripten developers. + +.. contents:: Table of Contents + :local: + :depth: 1 + + + + +settings.js +============ + +`settings.js `_ contains default values and options used in various places by the compiler. + +.. Warning :: Many **settings.js** options are highly brittle - certain combination of options and some options used with some source code, can cause Emscripten to fail badly. This is intended for use by "power users", and possibly even only people developing Emscripten itself. + +The options are normally set as command line parameters to *emcc*: :: + + emcc -s OPT=VALUE + + +While it is possible to edit **settings.js** manually, this is *highly discouraged*. In general **settings.js** defines low-level options that should not be modified. Note also that the compiler changes some options depending on other settings. For example, ``ASSERTIONS`` is disabled in optimized builds (``-O1+``), but enabled by default in default (non-optimized) builds. + +The small number of options that people do need to change should be modified when the tool is invoked. For example, ``EXPORTED_FUNCTIONS``: :: + + ./emcc tests/hello_function.cpp -o function.html -s EXPORTED_FUNCTIONS="['_int_sqrt']" + + +allocate() +=========== + +``allocate()`` is documented in `preamble.js `_ and marked as *internal* because it is difficult to use (it has been optimized for multiple syntaxes to save space in generated code). Normally developers should instead allocate memory using ``_malloc()``, initialize it with :js:func:`setValue`, etc., but this may be useful for advanced developers in certain cases. + + +Module.Runtime +================ + +``Module.Runtime`` gives access to some low-level things in the runtime. Some of these, for example ``Runtime.stackSave()`` and ``Runtime.stackRestore()`` may be useful for advanced users. + + + +emscripten_jcache_printf_() +=========================== + +``emscripten_jcache_printf_()`` is an internal API documented in `emscripten.h `_. \ No newline at end of file diff --git a/site/source/docs/api_reference/emscripten.h.rst b/site/source/docs/api_reference/emscripten.h.rst new file mode 100644 index 0000000000000..f43f05db3a946 --- /dev/null +++ b/site/source/docs/api_reference/emscripten.h.rst @@ -0,0 +1,814 @@ +================================ +Emscripten.h (ready-for-review) +================================ + +This page documents the public C++ APIs provided by `emscripten.h `_. + +Emscripten uses existing/familiar APIs where possible (for example: SDL). This API provides C++ support for capabilities that are specific to JavaScript or the browser environment, or for which there is no existing API. + +.. contents:: Table of Contents + :local: + :depth: 1 + + + +Inline assembly/JavaScript +========================== + +Defines +------- + +.. COMMENT (not rendered): **HamishW** This should be linked to section "Calling JavaScript From C/C++" when it exists. + +.. c:macro:: EM_ASM(...) + + Convenient syntax for inline assembly/JavaScript. + + This allows you to declare JavaScript in your C code "inline", which is then executed when your compiled code is run in the browser. For example, the following C code would display two alerts if it was compiled with Emscripten and run in the browser: :: + + EM_ASM( window.alert(‘hai’)); + window.alert(‘bai’)); ) + + .. note:: + - Double-quotes (") cannot be used in the inline assembly/JavaScript. Single-quotes (‘) can be used, as shown above. + - Newlines are supported + - This works with **asm.js** (it outlines the code and does a function call to reach it). + - You can’t access C variables with :c:macro:`EM_ASM`, nor receive a value back. Instead use :c:macro:`EM_ASM_INT` or :c:macro:`EM_ASM_DOUBLE`. + + +.. c:macro:: EM_ASM_(code, ...) + EM_ASM_ARGS(code, ...) + EM_ASM_INT(code, ...) + EM_ASM_DOUBLE(code, ...) + EM_ASM_INT_V(code) + EM_ASM_DOUBLE_V(code) + + Input-output versions of EM_ASM. + + :c:macro:`EM_ASM_` (an extra "_" is added) or :c:macro:`EM_ASM_ARGS` allow values (``int`` or ``double``) to be sent into the code. If you also want a return value, :c:macro:`EM_ASM_INT` receives arguments (of ``int`` or ``double`` type) and returns an ``int``; :c:macro:`EM_ASM_DOUBLE` does the same and returns a ``double``. + + Arguments arrive as ``$0``, ``$1`` etc. The output value should be returned: :: + + int x = EM_ASM_INT({ + console.log('I received: ' + [$0, $1]); + return $0 + $1; + }, calc(), otherCalc()); + + Note the { and }. If you just want to receive an output value (``int`` or ``double``) but not pass any values, you can use :c:macro:`EM_ASM_INT_V` and :c:macro:`EM_ASM_DOUBLE_V` respectively. + + + +Calling JavaScript From C/C++ +============================= + +Function pointer types for callbacks +------------------------------------- + +The following types are used to define function callback signatures used in a number of functions in this file. + +.. c:type:: em_callback_func + + General function pointer type for use in callbacks with no parameters. + + Defined as: :: + + typedef void (*em_callback_func)(void) + + +.. c:type:: em_arg_callback_func + + Generic function pointer type for use in callbacks with a single ``void*`` parameter. + + This type is used to define function callbacks that need to pass arbitrary data. For example, :c:func:`emscripten_set_main_loop_arg` sets user-defined data, and passes it to a callback of this type on completion. + + Defined as: :: + + typedef void (*em_arg_callback_func)(void*) + + +.. c:type:: em_str_callback_func + + General function pointer type for use in callbacks with a C string (``const char *``) parameter. + + This type is used for function callbacks that need to be passed a C string. For example, it is used in :c:func:`emscripten_async_wget` to pass the name of a file that has been asynchronously loaded. + + Defined as: :: + + typedef void (*em_str_callback_func)(const char *) + + +Functions +--------- + + +.. c:function:: void emscripten_run_script(const char *script) + + Interface to the underlying JavaScript engine. This function will ``eval()`` the given script. + + :param script: The script to evaluate. + :type script: const char* + :rtype: void + + +.. c:function:: int emscripten_run_script_int(const char *script) + + Interface to the underlying JavaScript engine. This function will ``eval()`` the given script. + + :param script: The script to evaluate. + :type script: const char* + :return: The result of the evaluation, as an integer. + :rtype: int + + +.. c:function:: char *emscripten_run_script_string(const char *script) + + Interface to the underlying JavaScript engine. This function will ``eval()`` the given script. Note that this overload uses a single buffer shared between calls. + + :param script: The script to evaluate. + :type script: const char* + :return: The result of the evaluation, as a string. + :rtype: char* + + +.. c:function:: void emscripten_async_run_script(const char *script, int millis) + + Asynchronously run a script, after a specified amount of time. + + :param script: The script to evaluate. + :type script: const char* + :param int millis: The amount of time before the script is run, in milliseconds. + :rtype: void + + +.. c:function:: void emscripten_async_load_script(const char *script, em_callback_func onload, em_callback_func onerror) + + Asynchronously loads a script from a URL. + + This integrates with the run dependencies system, so your script can call ``addRunDependency`` multiple times, prepare various asynchronous tasks, and call ``removeRunDependency`` on them; when all are complete (or there were no run dependencies to begin with), ``onload`` is called. An example use for this is to load an asset module, that is, the output of the file packager. + + :param script: The script to evaluate. + :type script: const char* + :param em_callback_func onload: A callback function, with no parameters, that is executed when the script has fully loaded. + :param em_callback_func onerror: A callback function, with no parameters, that is executed if there is an error in loading. + :rtype: void + + + +Browser Execution Environment +================================= + +Functions +--------- + + +.. c:function:: void emscripten_set_main_loop(em_callback_func func, int fps, int simulate_infinite_loop) + + Set a C function as the main event loop. + + If the main loop function needs to receive user-defined data, use :c:func:`emscripten_set_main_loop_arg` instead. + + The JavaScript environment will call that function at a specified number of frames per second. Setting 0 or a negative value as the ``fps`` will instead use the browser’s ``requestAnimationFrame`` mechanism to call the main loop function. This is **HIGHLY** recommended if you are doing rendering, as the browser’s ``requestAnimationFrame`` will make sure you render at a proper smooth rate that lines up with the the browser and monitor in a proper way. (If you do not render at all in your application, then you should pick a specific frame rate that makes sense for your code.) + + If ``simulate_infinite_loop`` is true, the function will throw an exception in order to stop execution of the caller. This will lead to the main loop being entered instead of code after the call to :c:func:`emscripten_set_main_loop` being run, which is the closest we can get to simulating an infinite loop (we do something similar in ``glutMainLoop`` in GLUT). If this parameter is false, then the behavior is the same as it was before this parameter was added to the API, which is that execution continues normally. Note that in both cases we do not run global destructors, ``atexit``, etc., since we know the main loop will still be running, but if we do not simulate an infinite loop then the stack will be unwound. That means that if ``simulate_infinite_loop`` is false, and you created an object on the stack, it will be cleaned up before the main loop is called for the first time. + + .. note:: See :c:func:`emscripten_set_main_loop_expected_blockers`, :c:func:`emscripten_pause_main_loop`, :c:func:`emscripten_resume_main_loop` and :c:func:`emscripten_cancel_main_loop` for information about blocking, pausing, and resuming the main loop. + + :param em_callback_func func: C function to set as main event loop. + :param int fps: Number of frames per second that the JavaScript will call the function. Setting ``int <=0`` (recommended) uses the browser’s ``requestAnimationFrame`` mechanism to call the function. + :param int simulate_infinite_loop: If true, this function will throw an exception in order to stop execution of the caller. + + .. COMMENT (not rendered): **HamishW** link to "Emscripten Browser Environment" doc when imported. + + +.. c:function:: void emscripten_set_main_loop_arg(em_arg_callback_func func, void *arg, int fps, int simulate_infinite_loop) + + Set a C function as the main event loop, passing it user-defined data. + + .. seealso:: The information in :c:func:`emscripten_set_main_loop` also applies to this function. + + :param em_arg_callback_func func: C function to set as main event loop. The function signature must have a ``void*`` parameter for passing the ``arg`` value. + :param void* arg: User-defined data passed to the main loop function, untouched by the API itself. + :param int fps: Number of frames per second at which the JavaScript will call the function. Setting ``int <=0`` (recommended) uses the browser’s ``requestAnimationFrame`` mechanism to call the function. + :param int simulate_infinite_loop: If true, this function will throw an exception in order to stop execution of the caller. + + .. COMMENT (not rendered): **HamishW** link to "Emscripten Browser Environment" doc when imported. + + +.. c:function:: void _emscripten_push_main_loop_blocker(em_arg_callback_func func, void *arg, const char *name) + void _emscripten_push_uncounted_main_loop_blocker(em_arg_callback_func func, void *arg, const char *name) + + Add a function that **blocks** the main loop. + + The function is added to the back of a queue of events to be blocked; the main loop will not run until all blockers in the queue complete. + + In the "counted" version, blockers are counted (internally) and ``Module.setStatus`` is called with some text to report progress (``setStatus`` is a general hook that a program can define in order to show processing updates). + + .. COMMENT (not rendered): **HamishW** Remember to cross link to "browser execution environment doc or similar when it exists". + + .. note:: + - When this function is called in a native build it is immediately executed; to keep semantics identical be careful to not push while the queue is being used. + - Main loop blockers block the main loop from running, and can be counted to show progress. In contrast, ``emscripten_async_calls`` are not counted, do not block the main loop, and can fire at specific time in the future. + + :param em_arg_callback_func func: The main loop blocker function. The function signature must have a ``void*`` parameter for passing the ``arg`` value. + :param void* arg: User-defined arguments to pass to the blocker function. + :param name: A name for the function blocker. Used to identify the functions during debugging. + :type name: const char* + :rtype: void + + +.. c:function:: void emscripten_pause_main_loop(void) + void emscripten_resume_main_loop(void) + + Pause and resume the main loop. + + Pausing and resuming the main loop is useful if your app needs to perform some synchronous operation, for example to load a file from the network. It might be wrong to run the main loop before that finishes (the original code assumes that), so you can break the code up into asynchronous callbacks, but you must pause the main loop until they complete. + + .. note:: These are fairly low-level functions. :c:func:`emscripten_push_main_loop_blocker` (and friends) provide more convenient alternatives. + + + +.. c:function:: void emscripten_cancel_main_loop(void) + + Cancels the main event loop. + + See also :c:func:`emscripten_set_main_loop` and :c:func:`emscripten_set_main_loop_arg` for information about setting and using the main loop. + + +.. c:function:: void emscripten_set_main_loop_expected_blockers(int num) + + Sets the number of blockers that are about to be pushed. + + The number is used for reporting the *relative progress* through a set of blockers, after which the main loop will continue. + + For example, a game might have to run 10 blockers before starting a new level. The operation would first set this value as '10' and then push the 10 blockers. When the 3\ :sup:`rd` blocker (say) completes, progress is displayed as 3/10. + + :param int num: The number of blockers that are about to be pushed. + + +.. c:function:: void emscripten_async_call(em_arg_callback_func func, void *arg, int millis); + + Call a C function asynchronously, that is, after returning control to the JavaScript event loop. + + This is done by a ``setTimeout``. + + When building natively this becomes a simple direct call, after ``SDL_Delay`` (you must include **SDL.h** for that). + + If ``millis`` is negative, the browser's ``requestAnimationFrame`` mechanism is used. + + :param em_arg_callback_func func: The C function to call asynchronously. The function signature must have a ``void*`` parameter for passing the ``arg`` value. + :param void* arg: User-defined argument to pass to the C function. + :param int millis: Timeout before function is called. + + +.. c:function:: void emscripten_exit_with_live_runtime(void) + + Exits the program immediately, but leaves the runtime alive so that you can continue to run code later (so global destructors etc., are not run). This is implicitly performed when you do an asynchronous operation like :c:func:`emscripten_async_call`. + + +.. c:function::void emscripten_hide_mouse(void) + + Hide the OS mouse cursor over the canvas. + + Note that SDL’s ``SDL_ShowCursor`` command shows and hides the SDL cursor, not the OS one. This command is useful to hide the OS cursor if your app draws its own cursor. + + +.. c:function:: void emscripten_set_canvas_size(int width, int height) + + Resizes the pixel width and height of the ```` element on the Emscripten web page. + + :param int width: New pixel width of canvas element. + :param int height: New pixel height of canvas element. + + +.. c:function:: void emscripten_get_canvas_size(int * width, int * height, int * isFullscreen) + + Gets the current pixel width and height of the ```` element as well as whether the canvas is fullscreen or not. + + :param int* width: Pixel width of canvas element. + :param int* height: New pixel height of canvas element. + :param int* isFullscreen: If True (``*int > 0``), ```` is full screen. + + +.. c:function:: double emscripten_get_now(void) + + Returns the highest-precision representation of the current time that the browser provides. + + This uses either ``Date.now`` or ``performance.now``. The result is not an absolute time, and is only meaningful in comparison to other calls to this function. + + :rtype: double + :return: The current time, in milliseconds (ms). + +.. c:function:: float emscripten_random(void) + + Generates a random number in the range 0-1. This maps to ``Math.random()``. + + :rtype: float + :return: A random number. + + + +Emscripten File System API +=========================== + +Typedefs +-------- + +.. c:type:: em_async_wget_onload_func + + Function pointer type for the ``onload`` callback of :c:func:`emscripten_async_wget_data` (specific values of the parameters documented in that method). + + Defined as: :: + + typedef void (*em_async_wget_onload_func)(void*, void*, int) + + + +.. c:type:: em_async_wget2_onload_func + + Function pointer type for the ``onload`` callback of :c:func:`emscripten_async_wget2` (specific values of the parameters documented in that method). + + Defined as: :: + + typedef void (*em_async_wget2_onload_func)(void*, const char*) + + + +.. c:type:: em_async_wget2_onstatus_func + + Function pointer type for the ``onerror`` and ``onprogress`` callbacks of :c:func:`emscripten_async_wget2` (specific values of the parameters documented in that method). + + Defined as: :: + + typedef void (*em_async_wget2_onstatus_func)(void*, int) + + + +.. c:type:: em_async_wget2_data_onload_func + + Function pointer type for the ``onload`` callback of :c:func:`emscripten_async_wget2_data` (specific values of the parameters documented in that method). + + Defined as: :: + + typedef void (*em_async_wget2_data_onload_func)(void*, void *, unsigned*) + + + +.. c:type:: em_async_wget2_data_onerror_func + + Function pointer type for the ``onerror`` callback of :c:func:`emscripten_async_wget2_data` (specific values of the parameters documented in that method). + + Defined as: :: + + typedef void (*em_async_wget2_data_onerror_func)(void*, int, const char*) + + +.. c:type:: em_async_wget2_data_onprogress_func + + Function pointer type for the ``onprogress`` callback of :c:func:`emscripten_async_wget2_data` (specific values of the parameters documented in that method). + + Defined as: :: + + typedef void (*em_async_wget2_data_onprogress_func)(void*, int, int) + + +.. c:type:: em_async_prepare_data_onload_func + + Function pointer type for the ``onload`` callback of :c:func:`emscripten_async_prepare_data` (specific values of the parameters documented in that method). + + Defined as: :: + + typedef void (*em_async_prepare_data_onload_func)(void*, const char*) + + + + +Functions +--------- + +.. c:function:: void emscripten_async_wget(const char* url, const char* file, em_str_callback_func onload, em_str_callback_func onerror) + + Loads a file from a URL asynchronously. + + In addition to fetching the URL from the network, the contents are prepared so that the data is usable in ``IMG_Load`` and so forth (we asynchronously do the work to make the browser decode the image or audio and so forth). + + When file is ready the ``onload`` callback will be called. If any error occurs ``onerror`` will be called. The callbacks are called with the file as their argument. + + :param const char* url: The URL to load. + :param const char* file: The name of the file created and loaded from the URL. If the file already exists it will be overwritten. + :param em_str_callback_func onload: Callback on successful load of the file. The callback function parameter value is: + + - *(const char*)* : The name of the ``file`` that was loaded from the URL. + + :param em_str_callback_func onerror: Callback in the event of failure. The callback function parameter value is: + + - *(const char*)* : The name of the ``file`` that failed to load from the URL. + + + +.. c:function:: void emscripten_async_wget_data(const char* url, void *arg, em_async_wget_onload_func onload, em_arg_callback_func onerror) + + Loads a buffer from a URL asynchronously. + + This is the "data" version of :c:func:`emscripten_async_wget`. + + Instead of writing to a file, this function writes to a buffer directly in memory. This avoids the overhead of using the emulated file system; note however that since files are not used, it cannot do the 'prepare' stage to set things up for ``IMG_Load`` and so forth (``IMG_Load`` etc. work on files). + + When file is ready then the ``onload`` callback will be called. If any error occurred ``onerror`` will be called. The callbacks are called with the file as their argument. + + :param url: The URL of the file to load. + :type url: const char* + :param void* arg: User-defined data that is passed to the callbacks, untouched by the API itself. This may be be used by a callback to identify the associated call. + :param em_async_wget_onload_func onload: Callback on successful load of the URL into the buffer. The callback function parameter values are: + + - *(void*)* : A pointer to ``arg`` (user defined data). + - *(void*)* : A pointer to a buffer with the data. Note that, as with the worker API, the data buffer only lives during the callback; it must be used or copied during that time. + - *(int)* : The size of the buffer, in bytes. + + :param em_arg_callback_func onerror: Callback in the event of failure. The callback function parameter values are: + + - *(void*)* : A pointer to ``arg`` (user defined data). + + +.. c:function:: void emscripten_async_wget2(const char* url, const char* file, const char* requesttype, const char* param, void *arg, em_async_wget2_onload_func onload, em_async_wget2_onstatus_func onerror, em_async_wget2_onstatus_func onprogress) + + Loads a file from a URL asynchronously. + + This is an **experimental** "more feature-complete" version of :c:func:`emscripten_async_wget`. + + In addition to fetching the URL from the network, the contents are prepared so that the data is usable in ``IMG_Load`` and so forth (we asynchronously do the work to make the browser decode the image, audio, etc.). + + When the file is ready the ``onload`` callback will be called with the object pointers given in ``arg`` and ``file``. During the download the ``onprogress`` callback is called. + + :param url: The URL of the file to load. + :type url: const char* + :param file: The name of the file created and loaded from the URL. If the file already exists it will be overwritten. + :type file: const char* + :param requesttype: 'GET' or 'POST'. + :type requesttype: const char* + :param param: Request parameters. If the ``requesttype`` is a POST request, this is a POST parameter like ``key=value&key2=value2``. + :type param: const char* + :param void* arg: User-defined data that is passed to the callbacks, untouched by the API itself. This may be be used by a callback to identify the associated call. + :param em_async_wget2_onload_func onload: Callback on successful load of the file. The callback function parameter values are: + + - *(void*)* : A pointer to ``arg`` (user defined data). + - *(const char*)* : The ``file`` passed to the original call. + + :param em_async_wget2_onstatus_func onerror: Callback in the event of failure. The callback function parameter values are: + + - *(void*)* : A pointer to ``arg`` (user defined data). + - *(int)* : The HTTP status code. + + :param em_async_wget2_onstatus_func onprogress: Callback during load of the file. The callback function parameter values are: + + - *(void*)* : A pointer to ``arg`` (user defined data). + - *(int)* : The progress (percentage completed). + + +.. c:function:: void emscripten_async_wget2_data(const char* url, const char* requesttype, const char* param, void *arg, int free, em_async_wget2_data_onload_func onload, em_async_wget2_data_onerror_func onerror, em_async_wget2_data_onprogress_func onprogress) + + Loads a buffer from a URL asynchronously. + + This is the "data" version of :c:func:`emscripten_async_wget2`. It is an **experimental** "more feature complete" version of :c:func:`emscripten_async_wget_data`. + + Instead of writing to a file, this function writes to a buffer directly in memory. This avoids the overhead of using the emulated file system; note however that since files are not used, it cannot do the 'prepare' stage to set things up for ``IMG_Load`` and so forth (``IMG_Load`` etc. work on files). + + In addition to fetching the URL from the network, the contents are prepared so that the data is usable in ``IMG_Load`` and so forth (we asynchronously do the work to make the browser decode the image or audio etc.). + + When the file is ready the ``onload`` callback will be called with the object pointers given in ``arg``, a pointer to the buffer in memory, and an unsigned integer containing the size of the buffer. During the download the ``onprogress`` callback is called with progress information. If an error occurs, ``onerror`` will be called with the HTTP status code and a string containing the status description. + + :param url: The URL of the file to load. + :type url: const char* + :param requesttype: 'GET' or 'POST'. + :type requesttype: const char* + :param param: Request parameters. If the ``requesttype`` is a POST request, this is a POST parameter like ``key=value&key2=value2``. + :type param: const char* + :param void* arg: User-defined data that is passed to the callbacks, untouched by the API itself. This may be be used by a callback to identify the associated call. + :param const int free: Tells the runtime whether to free the returned buffer after ``onload`` is complete. If ``false`` freeing the buffer is the receiver's responsibility. + :type free: const int + :param em_async_wget2_data_onload_func onload: Callback on successful load of the file. The callback function parameter values are: + + - *(void*)* : A pointer to ``arg`` (user defined data). + - *(void*)* : A pointer to the buffer in memory. + - *(unsigned)* : The size of the buffer (in bytes). + + :param em_async_wget2_data_onerror_func onerror: Callback in the event of failure. The callback function parameter values are: + + - *(void*)* : A pointer to ``arg`` (user defined data). + - *(int)* : The HTTP error code. + - *(const char*)* : A string with the status description. + + :param em_async_wget2_data_onprogress_func onprogress: Callback called (regularly) during load of the file to update progress. The callback function parameter values are: + + - *(void*)* : A pointer to ``arg`` (user defined data). + - *(int)* : The number of bytes loaded. + - *(int)* : The total size of the data in bytes, or zero if the size is unavailable. + + + +.. c:function:: int emscripten_async_prepare(const char* file, em_str_callback_func onload, em_str_callback_func onerror) + + Prepares a file asynchronously. + + This does just the preparation part of :c:func:`emscripten_async_wget`. That is, it works on file data already present and performs any required asynchronous operations (for example, decoding images for use in ``IMG_Load``, decoding audio for use in ``Mix_LoadWAV``, etc.). + + Once the operations are complete (the file is prepared), the ``onload`` callback will be called. If any error occurs ``onerror`` will be called. The callbacks are called with the file as their argument. + + :param file: The name of the file to prepare. + :type file: const char* + :param em_str_callback_func onload: Callback on successful preparation of the file. The callback function parameter value is: + + - *(const char*)* : The name of the ``file`` that was prepared. + + :param em_str_callback_func onerror: Callback in the event of failure. The callback function parameter value is: + + - *(const char*)* : The name of the ``file`` for which the prepare failed. + + :return: 0 if successful, -1 if the file does not exist + :rtype: int + + + +.. c:function:: void emscripten_async_prepare_data(char* data, int size, const char *suffix, void *arg, em_async_prepare_data_onload_func onload, em_arg_callback_func onerror) + + Prepares a buffer of data asynchronously. This is a "data" version of :c:func:`emscripten_async_prepare`, which receives raw data as input instead of a filename (this can prevent the need to write data to a file first). + + When file is loaded then the ``onload`` callback will be called. If any error occurs ``onerror`` will be called. + + ``onload`` also receives a second parameter, which is a 'fake' filename which you can pass into ``IMG_Load`` (it is not an actual file, but it identifies this image for ``IMG_Load`` to be able to process it). Note that the user of this API is responsible for ``free()`` ing the memory allocated for the fake filename. + + :param char* data: The buffer of data to prepare. + :param suffix: The file suffix, e.g. 'png' or 'jpg'. + :type suffix: const char* + :param void* arg: User-defined data that is passed to the callbacks, untouched by the API itself. This may be be used by a callback to identify the associated call. + :param em_async_prepare_data_onload_func onload: Callback on successful preparation of the file. The callback function parameter values are: + + - *(void*)* : A pointer to ``arg`` (user defined data). + - *(const char*)* : A 'fake' filename which you can pass into ``IMG_Load``. See above for more information. + + :param em_arg_callback_func onerror: Callback in the event of failure. The callback function parameter value is: + + - *(void*)* : A pointer to ``arg`` (user defined data). + + + +Compiling +================ + +.. c:macro:: EMSCRIPTEN_KEEPALIVE + + Forces LLVM to not dead-code-eliminate a function. + + This also exports the function, as if you added it to ``EXPORTED_FUNCTIONS``. + + For example: :: + + void EMSCRIPTEN_KEEPALIVE my_function() { printf("I am being kept alive\n"); } + + + + +Worker API +========== + +Typedefs +-------- + +.. c:var:: int worker_handle + + A wrapper around web workers that lets you create workers and communicate with them. + + Note that the current API is mainly focused on a main thread that sends jobs to workers and waits for responses, i.e., in an asymmetrical manner, there is no current API to send a message without being asked for it from a worker to the main thread. + + + +.. c:type:: em_worker_callback_func + + Function pointer type for the callback from :c:func:`emscripten_call_worker` (specific values of the parameters documented in that method). + + Defined as: :: + + typedef void (*em_worker_callback_func)(char*, int, void*) + + + + +Functions +--------- + +.. c:function:: worker_handle emscripten_create_worker(const char * url) + + Creates a worker. + + A worker must be compiled separately from the main program, and with the ``BUILD_AS_WORKER`` flag set to 1. + + :param url: The URL of the worker script. + :type url: const char* + :return: A handle to the newly created worker. + :rtype: worker_handle + + + +.. c:function:: void emscripten_destroy_worker(worker_handle worker) + + Destroys a worker. See :c:func:`emscripten_create_worker` + + :param worker_handle worker: A handle to the worker to be destroyed. + + +.. c:function:: void emscripten_call_worker(worker_handle worker, const char *funcname, char *data, int size, em_worker_callback_func callback, void *arg) + + Asynchronously calls a worker. + + The worker function will be called with two parameters: a data pointer, and a size. The data block defined by the pointer and size exists only during the callback: **it cannot be relied upon afterwards**. If you need to keep some of that information outside the callback, then it needs to be copied to a safe location. + + The called worker function can return data, by calling :c:func:`emscripten_worker_respond`. When the worker is called, if a callback was given it will be called with three arguments: a data pointer, a size, and an argument that was provided when calling :c:func:`emscripten_call_worker` (to more easily associate callbacks to calls). The data block defined by the data pointer and size behave like the data block in the worker function - it exists only during the callback. + + :param worker_handle worker: A handle to the worker to be called. + :param funcname: The name of the function in the worker. The function must be a C function (so no C++ name mangling), and must be exported (EXPORTED_FUNCTIONS). + :type funcname: const char* + :param char* data: The address of a block of memory to copy over. + :param int size: The size of the block of memory. + :param em_worker_callback_func callback: Worker callback with the response. This can be ``null``. The callback function parameter values are: + + - *(char*)* : The ``data`` pointer provided in :c:func:`emscripten_call_worker`. + - *(int)* : The ``size`` of the block of data. + - *(void*)* : A pointer to ``arg`` (user defined data). + + :param void* arg: An argument (user data) to be passed to the callback + + .. NOT-RENDERED-COMMENT : **HamishW** - need to add link to ``EXPORTED_FUNCTIONS`` information. There are some links on this around. + +.. c:function:: void emscripten_worker_respond(char *data, int size) + void emscripten_worker_respond_provisionally(char *data, int size) + + Sends a response when in a worker call. + + Both functions post a message back to the thread which called the worker. The :c:func:`emscripten_worker_respond_provisionally` variant can be invoked multiple times, which will queue up messages to be posted to the worker’s creator. Eventually, the _respond variant must be invoked, which will disallow further messages and free framework resources previously allocated for this worker call. + + .. note:: Calling the provisional version is optional, but you must call the non-provisional version to avoid leaks. + + :param char* data: The message to be posted. + :param int size: The size of the message, in bytes. + + +.. c:function:: int emscripten_get_worker_queue_size(worker_handle worker) + + Checks how many responses are being waited for from a worker. + + This only counts calls to :c:func:`emscripten_call_worker` that had a callback (calls with null callbacks are ignored), and where the response has not yet been received. It is a simple way to check on the status of the worker to see how busy it is, and do basic decisions about throttling. + + :param worker_handle worker: The handle to the relevant worker. + :return: The number of responses waited on from a worker. + :rtype: int + + +Logging utilities +================= + +Defines +------- + +.. c:macro:: EM_LOG_CONSOLE + + If specified, logs directly to the browser console/inspector window. If not specified, logs via the application Module. + +.. c:macro:: EM_LOG_WARN + + If specified, prints a warning message. + +.. c:macro:: EM_LOG_ERROR + + If specified, prints an error message. If neither :c:data:`EM_LOG_WARN` or :c:data:`EM_LOG_ERROR` is specified, an info message is printed. :c:data:`EM_LOG_WARN` and :c:data:`EM_LOG_ERROR` are mutually exclusive. + +.. c:macro:: EM_LOG_C_STACK + + If specified, prints a call stack that contains file names referring to original C sources using source map information. + +.. c:macro:: EM_LOG_JS_STACK + + If specified, prints a call stack that contains file names referring to lines in the built .js/.html file along with the message. The flags :c:data:`EM_LOG_C_STACK` and :c:data:`EM_LOG_JS_STACK` can be combined to output both untranslated and translated file and line information. + +.. c:macro:: EM_LOG_DEMANGLE + + If specified, C/C++ function names are de-mangled before printing. Otherwise, the mangled post-compilation JavaScript function names are displayed. + +.. c:macro:: EM_LOG_NO_PATHS + + If specified, the pathnames of the file information in the call stack will be omitted. + +.. c:macro:: EM_LOG_FUNC_PARAMS + + If specified, prints out the actual values of the parameters the functions were invoked with. + + +Functions +--------- + +.. c:function:: int emscripten_get_compiler_setting(const char *name) + + Returns the value of a compiler setting. + + For example, to return the integer representing the value of ``PRECISE_F32`` during compilation: :: + + emscripten_get_compiler_setting("PRECISE_F32") + + For values containing anything other than an integer, a string is returned (you will need to cast the ``int`` return value to a ``char*``). + + Some useful things this can do is provide the version of Emscripten (“EMSCRIPTEN_VERSION”), the optimization level (“OPT_LEVEL”), debug level (“DEBUG_LEVEL”), etc. + + For this command to work, you must build with the following compiler option (as we do not want to increase the build size with this metadata): :: + + -s RETAIN_COMPILER_SETTINGS=1 + + :param name: The compiler setting to return. + :type name: const char* + :returns: The value of the specified setting. Note that for values other than an integer, a string is returned (cast the ``int`` return value to a ``char*``). + :rtype: int + + +.. c:function:: void emscripten_debugger() + + Emits ``debugger``. + + This is inline in the code, which tells the JavaScript engine to invoke the debugger if it gets there. + + +.. c:function:: void emscripten_log(int flags, ...) + + Prints out a message to the console, optionally with the callstack information. + + :param int flags: A binary OR of items from the list of :c:data:`EM_LOG_xxx ` flags that specify printing options. + :param ...: A ``printf``-style "format, ..." parameter list that is parsed according to the ``printf`` formatting rules. + + +.. c:function:: int emscripten_get_callstack(int flags, char *out, int maxbytes) + + Programmatically obtains the current callstack. + + To query the amount of bytes needed for a callstack without writing it, pass 0 to ``out`` and ``maxbytes``, in which case the function will return the number of bytes (including the terminating zero) that will be needed to hold the full callstack. Note that this might be fully accurate since subsequent calls will carry different line numbers, so it is best to allocate a few bytes extra to be safe. + + :param int flags: A binary OR of items from the list of :c:data:`EM_LOG_xxx ` flags that specify printing options. The flags :c:data:`EM_LOG_CONSOLE`, :c:data:`EM_LOG_WARN` and :c:data:`EM_LOG_ERROR` do not apply in this function and are ignored. + :param char* out: A pointer to a memory region where the callstack string will be written to. The string outputted by this function will always be null-terminated. + :param int maxbytes: The maximum number of bytes that this function can write to the memory pointed to by ``out``. If there is not enough space, the output will be truncated (but always null-terminated). + :returns: The number of bytes written (not number of characters, so this will also include the terminating zero). + :rtype: int + + +.. c:function:: char *emscripten_get_preloaded_image_data(const char *path, int *w, int *h) + + Gets preloaded image data and the size of the image. + + The function returns pointer to loaded image or NULL - the pointer should be ``free()``'d. The width/height of the image are written to the ``w`` and ``h`` parameters if the data is valid. + + :param path: Full path/filename to the file containing the preloaded image. + :type: const char* + :param int* w: Width of the image (if data is valid). + :param int* h: Height of the image (if data is valid). + :returns: A pointer to the preloaded image or NULL. + :rtype: char* + + +.. c:function:: char *emscripten_get_preloaded_image_data_from_FILE(FILE *file, int *w, int *h) + + Gets preloaded image data from a C ``FILE*``. + + :param FILE* file: The ``FILE`` containing the preloaded image. + :type: const char* + :param int* w: Width of the image (if data is valid). + :param int* h: Height of the image (if data is valid). + :returns: A pointer to the preloaded image or NULL. + :rtype: char* + + + +Networking +========== + +Defines +------- + +.. c:macro:: EMSCRIPTEN_NETWORK_WEBSOCKETS + + Used to select the websockets networking backend in :c:func:`emscripten_set_network_backend` + +.. c:macro:: EMSCRIPTEN_NETWORK_WEBRTC + + Used to select the WebRTC networking backend in :c:func:`emscripten_set_network_backend` + + +Functions +--------- + +.. c:function:: void emscripten_set_network_backend(int backend) + + Selects the networking backend to use. + + .. note:: + - This function must be called before any network functions are called. + + By default Emscripten's socket/networking implementation will use websockets. With this function you can change that to WebRTC. + + :param int backend: The backend to use. One of :c:macro:`EMSCRIPTEN_NETWORK_WEBSOCKETS` and :c:macro:`EMSCRIPTEN_NETWORK_WEBRTC` + + + diff --git a/site/source/docs/api_reference/html5.h.rst b/site/source/docs/api_reference/html5.h.rst new file mode 100644 index 0000000000000..72f3cbbfdd220 --- /dev/null +++ b/site/source/docs/api_reference/html5.h.rst @@ -0,0 +1,1745 @@ +============================ +html5.h (ready-for-review) +============================ + +This page documents the C++ APIs provided by `html5.h `_. + +These APIs define the Emscripten low-level glue bindings for interfacing with the following HTML5 APIs: + + - `DOM Level 3 Events: Keyboard, Mouse, Mouse Wheel, Resize, Scroll, Focus `_. + - `Device Orientation Events for gyro and accelerometer `_. + - `Screen Orientation Events for portrait/landscape handling `_. + - `Fullscreen Events for browser canvas fullscreen modes transitioning `_. + - `Pointer Lock Events for relative-mode mouse motion control `_. + - `Vibration API for mobile device haptic vibration feedback control `_. + - `Page Visibility Events for power management control `_. + - `Touch Events `_. + - `Gamepad API `_. + - `Beforeunload event `_. + - `WebGL context events `_ + + + +.. contents:: Table of Contents + :local: + :depth: 1 + +How to use this API +=================== + +Most web APIs are event-based; functionality is accessed by registering a callback function that will be called when the event occurs. + +.. note:: The Gamepad API is currently an exception, as only a polling API is available. For some APIs, both an event-based and a polling-based API are exposed. + + +Registration functions +---------------------- + +The typical format of registration functions is as follows (some methods may omit some parameters): :: + + EMSCRIPTEN_RESULT emscripten_set_some_callback( + const char *target, // Target HTML element id. + void *userData, // User-defined data to be passed to the callback. + EM_BOOL useCapture, // Whether or not to use capture. + em_someevent_callback_func callback // Callback function. + ); + + +.. _target-parameter-html5-api: + +The ``target`` parameter is the HTML Element ID to which the callback registration is to be applied. This field has the following special meanings: + + - ``0`` or ``NULL``: A default element is chosen automatically based on the event type, which should be reasonable most of the time. + - ``#window``: The event listener is applied to the JavaScript 'window' object. + - ``#document``: The event listener is applied to the JavaScript 'document' object. + - ``#screen``: The event listener is applied to the JavaScript 'window.screen' object. + - ``#canvas``: The event listener is applied to the Emscripten default WebGL canvas element. + - Any other string without a leading hash "#" sign: The event listener is applied to the element by the given ID on the page. + +.. _userdata-parameter-html5-api: + +The ``userData`` parameter is a user-defined value that is passed (unchanged) to the registered event callback. This can be used to, for example, pass a pointer to a C++ class or similarly to enclose the C API in a clean object-oriented manner. + +.. _usecapture-parameter-html5-api: + +The ``useCapture`` parameter maps to ``useCapture`` in `EventTarget.addEventListener `_. It indicates whether or not to initiate *capture*: if ``true`` the callback will be invoked only for the DOM capture and target phases, if ``false`` the callback will be triggered during the target and bubbling phases. See `EventTarget.addEventListener `_ and `DOM Level 3 Events `_ for a more detailed explanation. + +Most functions return the result using the type :c:data:`EMSCRIPTEN_RESULT`. Nonzero and positive values denote success. Negative values signal failure. None of the functions fail or abort by throwing a JavaScript or C++ exception. If a particular browser does not support the given feature, the value :c:data:`EMSCRIPTEN_RESULT_NOT_SUPPORTED` will be returned at the time the callback is registered. + + +Callback functions +------------------ + +When the event occurs the callback is invoked with the relevant event "type" (for example :c:data:`EMSCRIPTEN_EVENT_CLICK`), a ``struct`` containing the details of the event that occurred, and the ``userData`` that was originally passed to the registration function. The general format of the callback function is: :: + + typedef EM_BOOL (*em_someevent_callback_func) // Callback function. Return true if event is "consumed". + ( + int eventType, // The type of event. + const EmscriptenSomeEvent *keyEvent, // Information about the event. + void *userData // User data passed from the registration function. + ); + + +.. _callback-handler-return-em_bool-html5-api: + +Callback handlers that return an :c:data:`EM_BOOL` may specify ``true`` to signal that the handler *consumed* the event (this suppresses the default action for that event by calling its ``.preventDefault();`` member). Returning ``false`` indicates that the event was not consumed - the default browser event action is carried out and the event is allowed to pass on/bubble up as normal. + +Calling a registration function with a ``null`` pointer for the callback causes a de-registration of that callback from the given ``target`` element. All event handlers are also automatically unregistered when the C ``exit()`` function is invoked during the ``atexit`` handler pass. Use either the function :c:func:`emscripten_set_main_loop` or set ``Module.noExitRuntime = true;`` to make sure that leaving ``main()`` will not immediately cause an ``exit()`` and clean up the event handlers. + +.. _web-security-functions-html5-api: + +Functions affected by web security +---------------------------------- + +Some functions, including :c:func:`emscripten_request_pointerlock` and :c:func:`emscripten_request_fullscreen`, are affected by web security. + +While the functions can be called anywhere, the actual "requests" can only be raised inside the handler for a user-generated event (for example a key, mouse or touch press/release). + +When porting code, it may be difficult to ensure that the functions are called inside appropriate event handlers (so that the requests are raised immediately). As a convenience, developers can set ``deferUntilInEventHandler=true`` to automatically defer insecure requests until the user next presses a keyboard or mouse button. This simplifies porting, but often results in a poorer user experience. For example, the user must click once on the canvas to hide the pointer or transition to full screen. + +Where possible, the functions should only be called inside appropriate event handlers. Setting ``deferUntilInEventHandler=false`` causes the functions to abort with an error if the request is refused due to a security restriction: this is a useful mechanism for discovering instances where the functions are called outside the handler for a user-generated event. + + +General types +============= + + +.. c:macro:: EM_BOOL + + This is the Emscripten type for a ``bool``. + + +.. c:macro:: EM_UTF8 + + This is the Emscripten type for a UTF8 string (maps to an ``char``). This is used for node names, element ids, etc. + + + +Function result values +====================== + +Most functions in this API return a result of type :c:data:`EMSCRIPTEN_RESULT`. None of the functions fail or abort by throwing a JavaScript or C++ exception. If a particular browser does not support the given feature, the value :c:data:`EMSCRIPTEN_RESULT_NOT_SUPPORTED` will be returned at the time the callback is registered. + + +.. c:macro:: EMSCRIPTEN_RESULT + + This type is used to return the result of most functions in this API. Positive values denote success, while zero and negative values signal failure. Possible values are listed below. + + +.. c:macro:: EMSCRIPTEN_RESULT_SUCCESS + + The operation succeeded + +.. c:macro:: EMSCRIPTEN_RESULT_DEFERRED + + The requested operation cannot be completed now for :ref:`web security reasons`. It was deferred for completion in the next event handler. + +.. c:macro:: EMSCRIPTEN_RESULT_NOT_SUPPORTED + + The given operation is not supported by this browser or the target element. This value will be returned at the time the callback is registered if the operation is not supported. + + +.. c:macro:: EMSCRIPTEN_RESULT_FAILED_NOT_DEFERRED + + The requested operation could not be completed now for :ref:`web security reasons`. It failed because the user requested the operation not be deferred. + +.. c:macro:: EMSCRIPTEN_RESULT_INVALID_TARGET + + The operation failed because the specified target element is invalid. + +.. c:macro:: EMSCRIPTEN_RESULT_UNKNOWN_TARGET + + The operation failed because the specified target element was not found. + +.. c:macro:: EMSCRIPTEN_RESULT_INVALID_PARAM + + The operation failed because an invalid parameter was passed to the function. + +.. c:macro:: EMSCRIPTEN_RESULT_FAILED + + The operation failed for some generic reason. + +.. c:macro:: EMSCRIPTEN_RESULT_NO_DATA + + The operation failed because no data is currently available. + + + +Keys +==== + +Defines +------- + +.. c:macro:: EMSCRIPTEN_EVENT_KEYPRESS + EMSCRIPTEN_EVENT_KEYDOWN + EMSCRIPTEN_EVENT_KEYUP + + Emscripten key events. + +.. c:macro:: DOM_KEY_LOCATION + + The location of the key on the keyboard; one of the :c:data:`DOM_KEY_LOCATION_XXX values `. + +.. c:macro:: DOM_KEY_LOCATION_STANDARD + DOM_KEY_LOCATION_LEFT + DOM_KEY_LOCATION_RIGHT + DOM_KEY_LOCATION_NUMPAD + + Locations of the key on the keyboard. + +Struct +------ + +.. c:type:: EmscriptenKeyboardEvent + + The event structure passed in `keyboard events `_: ``keypress``, ``keydown`` and ``keyup``. + + Note that since the `DOM Level 3 Events spec `_ is very recent at the time of writing (2014-03), uniform support for the different fields in the spec is still in flux. Be sure to check the results in multiple browsers. See the `unmerged pull request #2222 `_ for an example of how to interpret the legacy key events. + + + .. c:member:: EM_UTF8 key + + The printed representation of the pressed key. + + Maximum size 32 ``char`` (i.e. ``EM_UTF8 key[32]``). + + .. c:member:: EM_UTF8 code + + A string that identifies the physical key being pressed. The value is not affected by the current keyboard layout or modifier state, so a particular key will always return the same value. + + Maximum size 32 ``char`` (i.e. ``EM_UTF8 code[32]``). + + .. c:member:: unsigned long location + + Indicates the location of the key on the keyboard. One of the :c:data:`DOM_KEY_LOCATION ` values. + + .. c:member:: EM_BOOL ctrlKey + EM_BOOL shiftKey + EM_BOOL altKey + EM_BOOL metaKey + + Specifies which modifiers were active during the key event. + + .. c:member:: EM_BOOL repeat + + Specifies if this keyboard event represents a repeated press. + + .. c:member:: EM_UTF8 locale + + A locale string indicating the configured keyboard locale. This may be the empty string if the browser or device doesn't know the keyboard's locale. + + Maximum size 32 char (i.e. ``EM_UTF8 locale[32]``). + + .. c:member:: EM_UTF8 charValue + + The following fields are values from previous versions of the DOM key events specifications. See `the character representation of the key `_. This is the field ``char`` from the docs, but renamed to ``charValue`` to avoid a C reserved word. + + Maximum size 32 ``char`` (i.e. ``EM_UTF8 charValue[32]``). + + .. warning:: This attribute has been dropped from DOM Level 3 events. + + .. c:member:: unsigned long charCode + + The Unicode reference number of the key; this attribute is used only by the keypress event. For keys whose char attribute contains multiple characters, this is the Unicode value of the first character in that attribute. + + .. warning:: This attribute is deprecated, you should use the field ``key`` instead, if available. + + .. c:member:: unsigned long keyCode + + A system and implementation dependent numerical code identifying the unmodified value of the pressed key. + + .. warning:: This attribute is deprecated, you should use the field ``key`` instead, if available. + + + .. c:member:: unsigned long which + + A system and implementation dependent numeric code identifying the unmodified value of the pressed key; this is usually the same as ``keyCode``. + + .. warning:: This attribute is deprecated, you should use the field ``key`` instead, if available. + + +Callback functions +------------------ + +.. c:type:: em_key_callback_func + + Function pointer for the :c:func:`keypress callback functions `. + + Defined as: :: + + typedef EM_BOOL (*em_key_callback_func)(int eventType, const EmscriptenKeyboardEvent *keyEvent, void *userData); + + :param int eventType: The type of :c:data:`key event `. + :param keyEvent: Information about the key event that occurred. + :type keyEvent: const EmscriptenKeyboardEvent* + :param void* userData: The ``userData`` originally passed to the registration function. + :returns: |callback-handler-return-value-doc| + :rtype: |EM_BOOL| + + +Functions +--------- + +.. c:function:: EMSCRIPTEN_RESULT emscripten_set_keypress_callback(const char *target, void *userData, EM_BOOL useCapture, em_key_callback_func callback) + EMSCRIPTEN_RESULT emscripten_set_keydown_callback(const char *target, void *userData, EM_BOOL useCapture, em_key_callback_func callback) + EMSCRIPTEN_RESULT emscripten_set_keyup_callback(const char *target, void *userData, EM_BOOL useCapture, em_key_callback_func callback) + + Registers a callback function for receiving browser-generated keyboard input events. + + :param target: |target-parameter-doc| + :type target: const char* + :param void* userData: |userData-parameter-doc| + :param EM_BOOL useCapture: |useCapture-parameter-doc| + :param em_key_callback_func callback: |callback-function-parameter-doc| + :returns: :c:data:`EMSCRIPTEN_RESULT_SUCCESS`, or one of the other result values. + :rtype: |EMSCRIPTEN_RESULT| + + :seealso: + - https://developer.mozilla.org/en/DOM/Event/UIEvent/KeyEvent + - http://www.javascriptkit.com/jsref/eventkeyboardmouse.shtml + +Mouse +===== + +Defines +------- + +.. c:macro:: EMSCRIPTEN_EVENT_CLICK + EMSCRIPTEN_EVENT_MOUSEDOWN + EMSCRIPTEN_EVENT_MOUSEUP + EMSCRIPTEN_EVENT_DBLCLICK + EMSCRIPTEN_EVENT_MOUSEMOVE + + Emscripten mouse events. + + +Struct +------ + +.. c:type:: EmscriptenMouseEvent + + The event structure passed in `mouse events `_: `click `_, `mousedown `_, `mouseup `_, `dblclick `_ and `mousemove `_. + + + .. c:member:: double timestamp; + + A timestamp of when this data was generated by the browser. This is an absolute wallclock time in milliseconds. + + .. c:member:: long screenX + long screenY + + The coordinates relative to the browser screen coordinate system. + + .. c:member:: long clientX + long clientY + + The coordinates relative to the viewport associate with the event. + + + .. c:member:: EM_BOOL ctrlKey + EM_BOOL shiftKey + EM_BOOL altKey + EM_BOOL metaKey + + Specifies which modifiers were active during the mouse event. + + + .. c:member:: unsigned short button + + Identifies which pointer device button changed state (see `MouseEvent.button `_): + + - 0 : Left button + - 1 : Middle button (if present) + - 2 : Right button + + + .. c:member:: unsigned short buttons + + A bitmask that indicates which combinations of mouse buttons were being held down at the time of the event. + + .. c:member:: long movementX + long movementY; + + If pointer lock is active, these two extra fields give relative mouse movement since the last event. + + + .. c:member:: long canvasX + long canvasY + + These fields give the mouse coordinates mapped to the Emscripten canvas client area (Emscripten-specific extension). + + + .. c:member:: long padding + + Internal, and can be ignored (note for implementers: pad this struct to multiple of 8 bytes to make WheelEvent unambiguously align to 8 bytes). + + +Callback functions +------------------ + +.. c:type:: em_mouse_callback_func + + Function pointer for the :c:func:`mouse event callback functions `. + + Defined as: :: + + typedef EM_BOOL (*em_mouse_callback_func)(int eventType, const EmscriptenMouseEvent *keyEvent, void *userData); + + :param int eventType: The type of :c:data:`mouse event `. + :param keyEvent: Information about the mouse event that occurred. + :type keyEvent: const EmscriptenMouseEvent* + :param void* userData: The ``userData`` originally passed to the registration function. + :returns: |callback-handler-return-value-doc| + :rtype: |EM_BOOL| + + + +Functions +--------- + +.. c:function:: EMSCRIPTEN_RESULT emscripten_set_click_callback(const char *target, void *userData, EM_BOOL useCapture, em_mouse_callback_func callback) + EMSCRIPTEN_RESULT emscripten_set_mousedown_callback(const char *target, void *userData, EM_BOOL useCapture, em_mouse_callback_func callback) + EMSCRIPTEN_RESULT emscripten_set_mouseup_callback(const char *target, void *userData, EM_BOOL useCapture, em_mouse_callback_func callback) + EMSCRIPTEN_RESULT emscripten_set_dblclick_callback(const char *target, void *userData, EM_BOOL useCapture, em_mouse_callback_func callback) + EMSCRIPTEN_RESULT emscripten_set_mousemove_callback(const char *target, void *userData, EM_BOOL useCapture, em_mouse_callback_func callback) + + Registers a callback function for receiving browser-generated `mouse input events `_. + + :param target: |target-parameter-doc| + :type target: const char* + :param void* userData: |userData-parameter-doc| + :param EM_BOOL useCapture: |useCapture-parameter-doc| + :param em_mouse_callback_func callback: |callback-function-parameter-doc| + :returns: :c:data:`EMSCRIPTEN_RESULT_SUCCESS`, or one of the other result values. + :rtype: |EMSCRIPTEN_RESULT| + + + +.. c:function:: EMSCRIPTEN_RESULT emscripten_get_mouse_status(EmscriptenMouseEvent *mouseState) + + Returns the most recently received mouse event state. + + Note that for this function call to succeed, :c:func:`emscripten_set_xxx_callback ` must have first been called with one of the mouse event types and a non-zero callback function pointer to enable the Mouse state capture. + + :param EmscriptenMouseEvent* mouseState: The most recently received mouse event state. + :returns: :c:data:`EMSCRIPTEN_RESULT_SUCCESS`, or one of the other result values. + :rtype: |EMSCRIPTEN_RESULT| + + + +Wheel +===== + +Defines +------- + +.. c:macro:: EMSCRIPTEN_EVENT_WHEEL + + Emscripten wheel event. + +.. c:macro:: DOM_DELTA_PIXEL + + The units of measurement for the delta must be pixels (from `spec `_). + +.. c:macro:: DOM_DELTA_LINE + + The units of measurement for the delta must be individual lines of text (from `spec `_). + +.. c:macro:: DOM_DELTA_PAGE + + The units of measurement for the delta must be pages, either defined as a single screen or as a demarcated page (from `spec `_). + + +Struct +------ + +.. c:type:: EmscriptenWheelEvent + + The event structure passed in `mousewheel events `_. + + .. c:member:: EmscriptenMouseEvent mouse + + Specifies general mouse information related to this event. + + .. c:member:: double deltaX + double deltaY + double deltaZ + + Movement of the wheel on each of the axis. + + .. c:member:: unsigned long deltaMode + + One of the :c:data:`DOM_DELTA_` values that indicates the units of measurement for the delta values. + + +Callback functions +------------------ + +.. c:type:: em_wheel_callback_func + + Function pointer for the :c:func:`wheel event callback functions `. + + Defined as: :: + + typedef EM_BOOL (*em_wheel_callback_func)(int eventType, const EmscriptenWheelEvent *keyEvent, void *userData); + + :param int eventType: The type of wheel event (:c:data:`EMSCRIPTEN_EVENT_WHEEL`). + :param keyEvent: Information about the wheel event that occurred. + :type keyEvent: const EmscriptenWheelEvent* + :param void* userData: The ``userData`` originally passed to the registration function. + :returns: |callback-handler-return-value-doc| + :rtype: |EM_BOOL| + + + +Functions +--------- + +.. c:function:: EMSCRIPTEN_RESULT EMSCRIPTEN_RESULT emscripten_set_wheel_callback(const char *target, void *userData, EM_BOOL useCapture, em_wheel_callback_func callback) + + Registers a callback function for receiving browser-generated `mousewheel events `_. + + :param target: |target-parameter-doc| + :type target: const char* + :param void* userData: |userData-parameter-doc| + :param EM_BOOL useCapture: |useCapture-parameter-doc| + :param em_wheel_callback_func callback: |callback-function-parameter-doc| + :returns: :c:data:`EMSCRIPTEN_RESULT_SUCCESS`, or one of the other result values. + :rtype: |EMSCRIPTEN_RESULT| + + + +UI +== + +Defines +------- + +.. c:macro:: EMSCRIPTEN_EVENT_RESIZE + EMSCRIPTEN_EVENT_SCROLL + + Emscripten UI events. + + +Struct +------ + +.. c:type:: EmscriptenUiEvent + + The event structure passed in DOM element `UIEvent `_ events: `resize `_ and `scroll `_. + + + .. c:member:: long detail + + Specifies additional detail/information about this event. + + .. c:member:: int documentBodyClientWidth + int documentBodyClientHeight + + The clientWidth/clientHeight of the document.body element. + + .. c:member:: int windowInnerWidth + int windowInnerHeight + + The innerWidth/innerHeight of the window element. + + .. c:member:: int windowOuterWidth + int windowOuterHeight; + + The outerWidth/outerHeight of the window element. + + .. c:member:: int scrollTop + int scrollLeft + + The page scroll position. + + +Callback functions +------------------ + +.. c:type:: em_ui_callback_func + + Function pointer for the :c:func:`UI event callback functions `. + + Defined as: :: + + typedef EM_BOOL (*em_ui_callback_func)(int eventType, const EmscriptenUiEvent *keyEvent, void *userData); + + :param int eventType: The type of UI event (:c:data:`EMSCRIPTEN_EVENT_RESIZE`). + :param keyEvent: Information about the UI event that occurred. + :type keyEvent: const EmscriptenUiEvent* + :param void* userData: The ``userData`` originally passed to the registration function. + :returns: |callback-handler-return-value-doc| + :rtype: |EM_BOOL| + + +Functions +--------- + +.. c:function:: EMSCRIPTEN_RESULT emscripten_set_resize_callback(const char *target, void *userData, EM_BOOL useCapture, em_ui_callback_func callback) + EMSCRIPTEN_RESULT emscripten_set_scroll_callback(const char *target, void *userData, EM_BOOL useCapture, em_ui_callback_func callback) + + Registers a callback function for receiving DOM element `resize `_ and `scroll `_ events. + + :param target: |target-parameter-doc| + :type target: const char* + :param void* userData: |userData-parameter-doc| + :param EM_BOOL useCapture: |useCapture-parameter-doc| + :param em_ui_callback_func callback: |callback-function-parameter-doc| + :returns: :c:data:`EMSCRIPTEN_RESULT_SUCCESS`, or one of the other result values. + :rtype: |EMSCRIPTEN_RESULT| + + + + +Focus +===== + +Defines +------- + +.. c:macro:: EMSCRIPTEN_EVENT_BLUR + EMSCRIPTEN_EVENT_FOCUS + EMSCRIPTEN_EVENT_FOCUSIN + EMSCRIPTEN_EVENT_FOCUSOUT + + Emscripten focus events. + + +Struct +------ + +.. c:type:: EmscriptenFocusEvent + + The event structure passed in DOM element `blur `_, `focus `_, `focusin `_ and `focusout `_ events. + + .. c:member:: EM_UTF8 nodeName + + The `nodeName `_ of the target HTML Element. + + Maximum size 128 ``char`` (i.e. ``EM_UTF8 nodeName[128]``). + + .. c:member:: EM_UTF8 id + + The HTML Element ID of the target element. + + Maximum size 128 ``char`` (i.e. ``EM_UTF8 id[128]``). + + + +Callback functions +------------------ + +.. c:type:: em_focus_callback_func + + Function pointer for the :c:func:`focus event callback functions `. + + Defined as: :: + + typedef EM_BOOL (*em_focus_callback_func)(int eventType, const EmscriptenFocusEvent *keyEvent, void *userData); + + :param int eventType: The type of focus event (:c:data:`EMSCRIPTEN_EVENT_BLUR`). + :param keyEvent: Information about the focus event that occurred. + :type keyEvent: const EmscriptenFocusEvent* + :param void* userData: The ``userData`` originally passed to the registration function. + :returns: |callback-handler-return-value-doc| + :rtype: |EM_BOOL| + + + +Functions +--------- + +.. c:function:: EMSCRIPTEN_RESULT emscripten_set_blur_callback(const char *target, void *userData, EM_BOOL useCapture, em_focus_callback_func callback) + EMSCRIPTEN_RESULT emscripten_set_focus_callback(const char *target, void *userData, EM_BOOL useCapture, em_focus_callback_func callback) + EMSCRIPTEN_RESULT emscripten_set_focusin_callback(const char *target, void *userData, EM_BOOL useCapture, em_focus_callback_func callback) + EMSCRIPTEN_RESULT emscripten_set_focusout_callback(const char *target, void *userData, EM_BOOL useCapture, em_focus_callback_func callback) + + Registers a callback function for receiving DOM element `blur `_, `focus `_, `focusin `_ and `focusout `_ events. + + :param target: |target-parameter-doc| + :type target: const char* + :param void* userData: |userData-parameter-doc| + :param EM_BOOL useCapture: |useCapture-parameter-doc| + :param em_focus_callback_func callback: |callback-function-parameter-doc| + :returns: :c:data:`EMSCRIPTEN_RESULT_SUCCESS`, or one of the other result values. + :rtype: |EMSCRIPTEN_RESULT| + + + +Device orientation +================== + +Defines +------- + +.. c:macro:: EMSCRIPTEN_EVENT_DEVICEORIENTATION + + Emscripten ``deviceorientation`` events. + +Struct +------ + +.. c:type:: EmscriptenDeviceOrientationEvent + + The event structure passed in the `deviceorientation `_ event. + + + .. c:member:: double timestamp + + Absolute wallclock time when the event occurred (in milliseconds). + + .. c:member:: double alpha + double beta + double gamma + + The orientation of the device in terms of the transformation from a coordinate frame fixed on the Earth to a coordinate frame fixed in the device. + + + .. c:member:: EM_BOOL absolute + + If ``false``, the orientation is only relative to some other base orientation, not to the fixed coordinate frame. + + +Callback functions +------------------ + +.. c:type:: em_deviceorientation_callback_func + + Function pointer for the :c:func:`orientation event callback functions `. + + Defined as: :: + + typedef EM_BOOL (*em_deviceorientation_callback_func)(int eventType, const EmscriptenDeviceOrientationEvent *keyEvent, void *userData); + + :param int eventType: The type of orientation event (:c:data:`EMSCRIPTEN_EVENT_DEVICEORIENTATION`). + :param keyEvent: Information about the orientation event that occurred. + :type keyEvent: const EmscriptenDeviceOrientationEvent* + :param void* userData: The ``userData`` originally passed to the registration function. + :returns: |callback-handler-return-value-doc| + :rtype: |EM_BOOL| + + + +Functions +--------- + +.. c:function:: EMSCRIPTEN_RESULT emscripten_set_deviceorientation_callback(void *userData, EM_BOOL useCapture, em_deviceorientation_callback_func callback) + + Registers a callback function for receiving the `deviceorientation `_ event. + + :param void* userData: |userData-parameter-doc| + :param EM_BOOL useCapture: |useCapture-parameter-doc| + :param em_deviceorientation_callback_func callback: |callback-function-parameter-doc| + :returns: :c:data:`EMSCRIPTEN_RESULT_SUCCESS`, or one of the other result values. + :rtype: |EMSCRIPTEN_RESULT| + + +.. c:function:: EMSCRIPTEN_RESULT emscripten_get_deviceorientation_status(EmscriptenDeviceOrientationEvent *orientationState) + + Returns the most recently received ``deviceorientation`` event state. + + Note that for this function call to succeed, :c:func:`emscripten_set_deviceorientation_callback` must have first been called with one of the mouse event types and a non-zero callback function pointer to enable the ``deviceorientation`` state capture. + + :param EmscriptenDeviceOrientationEvent *orientationState: The most recently received deviceorientation event state. + :returns: :c:data:`EMSCRIPTEN_RESULT_SUCCESS`, or one of the other result values. + :rtype: |EMSCRIPTEN_RESULT| + + + +Device motion +============= + +Defines +------- + +.. c:macro:: EMSCRIPTEN_EVENT_DEVICEMOTION + + Emscripten `devicemotion `_ event. + + +Struct +------ + +.. c:type:: EmscriptenDeviceMotionEvent + + The event structure passed in the `devicemotion `_ event. + + .. c:member:: double timestamp + + Absolute wallclock time when the event occurred (milliseconds). + + + .. c:member:: double accelerationX + double accelerationY + double accelerationZ + + Acceleration of the device excluding gravity. + + + .. c:member:: double accelerationIncludingGravityX + double accelerationIncludingGravityY + double accelerationIncludingGravityZ + + Acceleration of the device including gravity. + + + .. c:member:: double rotationRateAlpha + double rotationRateBeta + double rotationRateGamma + + The rotational delta of the device. + + +Callback functions +------------------ + +.. c:type:: em_devicemotion_callback_func + + Function pointer for the :c:func:`devicemotion event callback functions `. + + Defined as: :: + + typedef EM_BOOL (*em_devicemotion_callback_func)(int eventType, const EmscriptenDeviceMotionEvent *keyEvent, void *userData); + + :param int eventType: The type of devicemotion event (:c:data:`EMSCRIPTEN_EVENT_DEVICEMOTION`). + :param keyEvent: Information about the devicemotion event that occurred. + :type keyEvent: const EmscriptenDeviceMotionEvent* + :param void* userData: The ``userData`` originally passed to the registration function. + :returns: |callback-handler-return-value-doc| + :rtype: |EM_BOOL| + + + + +Functions +--------- + +.. c:function:: EMSCRIPTEN_RESULT emscripten_set_devicemotion_callback(void *userData, EM_BOOL useCapture, em_devicemotion_callback_func callback) + + Registers a callback function for receiving the `devicemotion `_ event. + + :param void* userData: |userData-parameter-doc| + :param EM_BOOL useCapture: |useCapture-parameter-doc| + :param em_devicemotion_callback_func callback: |callback-function-parameter-doc| + :returns: :c:data:`EMSCRIPTEN_RESULT_SUCCESS`, or one of the other result values. + :rtype: |EMSCRIPTEN_RESULT| + + +.. c:function:: EMSCRIPTEN_RESULT emscripten_get_devicemotion_status(EmscriptenDeviceMotionEvent *motionState) + + Returns the most recently received `devicemotion `_ event state. + + Note that for this function call to succeed, :c:func:`emscripten_set_devicemotion_callback` must have first been called with one of the mouse event types and a non-zero callback function pointer to enable the ``devicemotion`` state capture. + + :param EmscriptenDeviceMotionEvent *motionState: The most recently received ``devicemotion`` event state. + :returns: :c:data:`EMSCRIPTEN_RESULT_SUCCESS`, or one of the other result values. + :rtype: |EMSCRIPTEN_RESULT| + + + +Orientation +=========== + +Defines +------- + +.. c:macro:: EMSCRIPTEN_EVENT_ORIENTATIONCHANGE + + Emscripten `orientationchange `_ event. + + +.. c:macro:: EMSCRIPTEN_ORIENTATION_PORTRAIT_PRIMARY + + Primary portrait mode orientation. + +.. c:macro:: EMSCRIPTEN_ORIENTATION_PORTRAIT_SECONDARY + + Secondary portrait mode orientation. + +.. c:macro:: EMSCRIPTEN_ORIENTATION_LANDSCAPE_PRIMARY + + Primary landscape mode orientation. + +.. c:macro:: EMSCRIPTEN_ORIENTATION_LANDSCAPE_SECONDARY + + Secondary landscape mode orientation. + + +Struct +------ + +.. c:type:: EmscriptenOrientationChangeEvent + + The event structure passed in the `orientationchange `_ event. + + + .. c:member:: int orientationIndex + + One of the :c:type:`EM_ORIENTATION_PORTRAIT_xxx ` fields, or -1 if unknown. + + .. c:member:: int orientationAngle + + Emscripten-specific extension: Some browsers refer to 'window.orientation', so report that as well. + + Orientation angle in degrees. 0: "default orientation", i.e. default upright orientation to hold the mobile device in. Could be either landscape or portrait. + + +Callback functions +------------------ + +.. c:type:: em_orientationchange_callback_func + + Function pointer for the :c:func:`orientationchange event callback functions `. + + Defined as: :: + + typedef EM_BOOL (*em_orientationchange_callback_func)(int eventType, const EmscriptenOrientationChangeEvent *keyEvent, void *userData); + + :param int eventType: The type of orientationchange event (:c:data:`EMSCRIPTEN_EVENT_ORIENTATIONCHANGE`). + :param keyEvent: Information about the orientationchange event that occurred. + :type keyEvent: const EmscriptenOrientationChangeEvent* + :param void* userData: The ``userData`` originally passed to the registration function. + :returns: |callback-handler-return-value-doc| + :rtype: |EM_BOOL| + + +Functions +--------- + +.. c:function:: EMSCRIPTEN_RESULT emscripten_set_orientationchange_callback(void *userData, EM_BOOL useCapture, em_orientationchange_callback_func callback) + + Registers a callback function for receiving the `orientationchange `_ event. + + :param void* userData: |userData-parameter-doc| + :param EM_BOOL useCapture: |useCapture-parameter-doc| + :param em_orientationchange_callback_func callback: |callback-function-parameter-doc| + :returns: :c:data:`EMSCRIPTEN_RESULT_SUCCESS`, or one of the other result values. + :rtype: |EMSCRIPTEN_RESULT| + + +.. c:function:: EMSCRIPTEN_RESULT emscripten_get_orientation_status(EmscriptenOrientationChangeEvent *orientationStatus) + + Returns the current device orientation state. + + :param EmscriptenOrientationChangeEvent *orientationStatus: The most recently received orientation state. + :returns: :c:data:`EMSCRIPTEN_RESULT_SUCCESS`, or one of the other result values. + :rtype: |EMSCRIPTEN_RESULT| + + +.. c:function:: EMSCRIPTEN_RESULT emscripten_lock_orientation(int allowedOrientations) + + Locks the screen orientation to the given set of allowed orientations. + + :param int allowedOrientations: A bitfield set of :c:data:`EMSCRIPTEN_ORIENTATION_xxx ` flags. + :returns: :c:data:`EMSCRIPTEN_RESULT_SUCCESS`, or one of the other result values. + :rtype: |EMSCRIPTEN_RESULT| + + +.. c:function:: EMSCRIPTEN_RESULT emscripten_unlock_orientation(void) + + Removes the orientation lock so the screen can turn to any orientation. + + :returns: :c:data:`EMSCRIPTEN_RESULT_SUCCESS`, or one of the other result values. + :rtype: |EMSCRIPTEN_RESULT| + + + +Fullscreen +========== + +Defines +------- + +.. c:macro:: EMSCRIPTEN_EVENT_FULLSCREENCHANGE + + Emscripten `fullscreenchange `_ event. + +Struct +------ + +.. c:type:: EmscriptenFullscreenChangeEvent + + The event structure passed in the `fullscreenchange `_ event. + + .. c:member:: EM_BOOL isFullscreen + + Specifies whether an element on the browser page is currently fullscreen. + + + .. c:member:: EM_BOOL fullscreenEnabled + + Specifies if the current page has the ability to display elements fullscreen. + + .. c:member:: EM_UTF8 nodeName + + The `nodeName `_ of the target HTML Element that is in full screen mode. + + Maximum size 128 ``char`` (i.e. ``EM_UTF8 nodeName[128]``). + + If ``isFullscreen`` is ``false``, then ``nodeName``, ``id`` and ``elementWidth`` and ``ElementHeight`` specify information about the element that just exited fullscreen mode. + + + .. c:member:: EM_UTF8 id + + The HTML Element ID of the target HTML element that is in full screen mode. + + Maximum size 128 ``char`` (i.e. ``EM_UTF8 id[128]``). + + + .. c:member:: int elementWidth + int elementHeight + + The new pixel size of the element that changed fullscreen status. + + + .. c:member:: int screenWidth + int screenHeight + + The size of the whole screen, in pixels. + + +Callback functions +------------------ + +.. c:type:: em_fullscreenchange_callback_func + + Function pointer for the :c:func:`fullscreen event callback functions `. + + Defined as: :: + + typedef EM_BOOL (*em_fullscreenchange_callback_func)(int eventType, const EmscriptenFullscreenChangeEvent *keyEvent, void *userData); + + :param int eventType: The type of fullscreen event (:c:data:`EMSCRIPTEN_EVENT_FULLSCREENCHANGE`). + :param keyEvent: Information about the fullscreen event that occurred. + :type keyEvent: const EmscriptenFullscreenChangeEvent* + :param void* userData: The ``userData`` originally passed to the registration function. + :returns: |callback-handler-return-value-doc| + :rtype: |EM_BOOL| + + + +Functions +--------- + +.. c:function:: EMSCRIPTEN_RESULT emscripten_set_fullscreenchange_callback(const char *target, void *userData, EM_BOOL useCapture, em_fullscreenchange_callback_func callback) + + Registers a callback function for receiving the `fullscreenchange `_ event. + + :param target: |target-parameter-doc| + :type target: const char* + :param void* userData: |userData-parameter-doc| + :param EM_BOOL useCapture: |useCapture-parameter-doc| + :param em_fullscreenchange_callback_func callback: |callback-function-parameter-doc| + :returns: :c:data:`EMSCRIPTEN_RESULT_SUCCESS`, or one of the other result values. + :rtype: |EMSCRIPTEN_RESULT| + + +.. c:function:: EMSCRIPTEN_RESULT emscripten_get_fullscreen_status(EmscriptenFullscreenChangeEvent *fullscreenStatus) + + Returns the current page `fullscreen `_ state. + + :param EmscriptenFullscreenChangeEvent *fullscreenStatus: The most recently received fullscreen state. + :returns: :c:data:`EMSCRIPTEN_RESULT_SUCCESS`, or one of the other result values. + :rtype: |EMSCRIPTEN_RESULT| + + +.. c:function:: EMSCRIPTEN_RESULT emscripten_request_fullscreen(const char *target, EM_BOOL deferUntilInEventHandler) + + Requests the given target element to transition to full screen mode. + + .. note:: This function can be called anywhere, but for web security reasons its associated *request* can only be raised inside the event handler for a user-generated event (for example a key, mouse or touch press/release). This has implications for porting and the value of ``deferUntilInEventHandler`` - see :ref:`web-security-functions-html5-api` for more information. + + :param target: |target-parameter-doc| + :type target: const char* + :param EM_BOOL deferUntilInEventHandler: If ``true`` requests made outside of a user-generated event handler are automatically deferred until the user next presses a keyboard or mouse button. If ``false`` the request will fail if called outside of a user-generated event handler. + + :returns: :c:data:`EMSCRIPTEN_RESULT_SUCCESS`, or one of the other result values. + :rtype: **EMSCRIPTEN_RESULT** + + +.. c:function:: EMSCRIPTEN_RESULT emscripten_exit_fullscreen(void) + + Returns back to windowed browsing mode. + + :returns: :c:data:`EMSCRIPTEN_RESULT_SUCCESS`, or one of the other result values. + :rtype: |EMSCRIPTEN_RESULT| + + + +Pointerlock +=========== + +Defines +------- + +.. c:macro:: EMSCRIPTEN_EVENT_POINTERLOCKCHANGE + + Emscripten `pointerlockchange `_ events. + + +Struct +------ + +.. c:type:: EmscriptenPointerlockChangeEvent + + The event structure passed in the `pointerlockchange `_ event. + + + .. c:member:: EM_BOOL isActive + + Specifies whether an element on the browser page currently has pointer lock enabled. + + .. c:member:: EM_UTF8 nodeName + + The `nodeName `_ of the target HTML Element that has the pointer lock active. + + Maximum size 128 ``char`` (i.e. ``EM_UTF8 nodeName[128]``). + + .. c:member:: EM_UTF8 id + + The HTML Element ID of the target HTML element that has the pointer lock active. + + Maximum size 128 ``char`` (i.e. ``EM_UTF8 id[128]``). + + +Callback functions +------------------ + +.. c:type:: em_pointerlockchange_callback_func + + Function pointer for the :c:func:`pointerlockchange event callback functions `. + + Defined as: :: + + typedef EM_BOOL (*em_pointerlockchange_callback_func)(int eventType, const EmscriptenPointerlockChangeEvent *keyEvent, void *userData); + + :param int eventType: The type of pointerlockchange event (:c:data:`EMSCRIPTEN_EVENT_POINTERLOCKCHANGE`). + :param keyEvent: Information about the pointerlockchange event that occurred. + :type keyEvent: const EmscriptenPointerlockChangeEvent* + :param void* userData: The ``userData`` originally passed to the registration function. + :returns: |callback-handler-return-value-doc| + :rtype: |EM_BOOL| + + + +Functions +--------- + +.. c:function:: EMSCRIPTEN_RESULT emscripten_set_pointerlockchange_callback(const char *target, void *userData, EM_BOOL useCapture, em_pointerlockchange_callback_func callback) + + Registers a callback function for receiving the `pointerlockchange `_ event. + + Pointer lock hides the mouse cursor and exclusively gives the target element relative mouse movement events via the `mousemove `_ event. + + :param target: |target-parameter-doc| + :type target: const char* + :param void* userData: |userData-parameter-doc| + :param EM_BOOL useCapture: |useCapture-parameter-doc| + :param em_pointerlockchange_callback_func callback: |callback-function-parameter-doc| + :returns: :c:data:`EMSCRIPTEN_RESULT_SUCCESS`, or one of the other result values. + :rtype: |EMSCRIPTEN_RESULT| + + + +.. c:function:: EMSCRIPTEN_RESULT emscripten_get_pointerlock_status(EmscriptenPointerlockChangeEvent *pointerlockStatus) + + Returns the current page pointerlock state. + + :param EmscriptenPointerlockChangeEvent* pointerlockStatus: The most recently received pointerlock state. + :returns: :c:data:`EMSCRIPTEN_RESULT_SUCCESS`, or one of the other result values. + :rtype: |EMSCRIPTEN_RESULT| + + +.. c:function:: EMSCRIPTEN_RESULT emscripten_request_pointerlock(const char *target, EM_BOOL deferUntilInEventHandler) + + Requests the given target element to grab pointerlock. + + .. note:: This function can be called anywhere, but for web security reasons its associated *request* can only be raised inside the event handler for a user-generated event (for example a key, mouse or touch press/release). This has implications for porting and the value of ``deferUntilInEventHandler`` - see :ref:`web-security-functions-html5-api` for more information. + + + :param target: |target-parameter-doc| + :type target: const char* + :param EM_BOOL deferUntilInEventHandler: If ``true`` requests made outside of a user-generated event handler are automatically deferred until the user next presses a keyboard or mouse button. If ``false`` the request will fail if called outside of a user-generated event handler. + :returns: :c:data:`EMSCRIPTEN_RESULT_SUCCESS`, or one of the other result values. + :rtype: |EMSCRIPTEN_RESULT| + + +.. c:function:: EMSCRIPTEN_RESULT emscripten_exit_pointerlock(void) + + Exits pointer lock state and restores the mouse cursor to be visible again. + + :returns: :c:data:`EMSCRIPTEN_RESULT_SUCCESS`, or one of the other result values. + :rtype: |EMSCRIPTEN_RESULT| + + + + +Visibility +========== + +Defines +------- + +.. c:macro:: EMSCRIPTEN_EVENT_VISIBILITYCHANGE + + Emscripten `visibilitychange `_ event. + + +.. c:macro:: EMSCRIPTEN_VISIBILITY_HIDDEN + + The document is `hidden `_ (not visible). + +.. c:macro:: EMSCRIPTEN_VISIBILITY_VISIBLE + + The document is at least partially `visible `_. + +.. c:macro:: EMSCRIPTEN_VISIBILITY_PRERENDER + + The document is loaded off screen and not visible (`prerender `_). + +.. c:macro:: EMSCRIPTEN_VISIBILITY_UNLOADED + + The document is to be `unloaded `_. + + +Struct +------ + +.. c:type:: EmscriptenVisibilityChangeEvent + + The event structure passed in the `visibilitychange `_ event. + + + .. c:member:: EM_BOOL hidden + + If true, the current browser page is now hidden. + + + .. c:member:: int visibilityState + + Specifies a more fine-grained state of the current page visibility status. One of the EMSCRIPTEN_VISIBILITY_ values. + + +Callback functions +------------------ + +.. c:type:: em_visibilitychange_callback_func + + Function pointer for the :c:func:`visibilitychange event callback functions `. + + Defined as: :: + + typedef EM_BOOL (*em_visibilitychange_callback_func)(int eventType, const EmscriptenVisibilityChangeEvent *keyEvent, void *userData); + + :param int eventType: The type of visibilitychange event (:c:data:`EMSCRIPTEN_VISIBILITY_HIDDEN`). + :param keyEvent: Information about the visibilitychange event that occurred. + :type keyEvent: const EmscriptenVisibilityChangeEvent* + :param void* userData: The ``userData`` originally passed to the registration function. + :returns: |callback-handler-return-value-doc| + :rtype: |EM_BOOL| + + +Functions +--------- + +.. c:function:: EMSCRIPTEN_RESULT emscripten_set_visibilitychange_callback(void *userData, EM_BOOL useCapture, em_visibilitychange_callback_func callback) + + Registers a callback function for receiving the `visibilitychange `_ event. + + :param void* userData: |userData-parameter-doc| + :param EM_BOOL useCapture: |useCapture-parameter-doc| + :param em_visibilitychange_callback_func callback: |callback-function-parameter-doc| + :returns: :c:data:`EMSCRIPTEN_RESULT_SUCCESS`, or one of the other result values. + :rtype: |EMSCRIPTEN_RESULT| + + +.. c:function:: EMSCRIPTEN_RESULT emscripten_get_visibility_status(EmscriptenVisibilityChangeEvent *visibilityStatus) + + Returns the current page visibility state. + + :param EmscriptenVisibilityChangeEvent* visibilityStatus: The most recently received page visibility state. + :returns: :c:data:`EMSCRIPTEN_RESULT_SUCCESS`, or one of the other result values. + :rtype: |EMSCRIPTEN_RESULT| + + + +Touch +===== + +Defines +------- + +.. c:macro:: EMSCRIPTEN_EVENT_TOUCHSTART + EMSCRIPTEN_EVENT_TOUCHEND + EMSCRIPTEN_EVENT_TOUCHMOVE + EMSCRIPTEN_EVENT_TOUCHCANCEL + + Emscripten touch events. + + +Struct +------ + +.. c:type:: EmscriptenTouchPoint + + Specifies the status of a single `touch point `_ on the page. + + .. c:member:: long identifier + + An identification number for each touch point. + + .. c:member:: long screenX + long screenY + + The touch coordinate relative to the whole screen origin, in pixels. + + .. c:member:: long clientX + long clientY + + The touch coordinate relative to the viewport, in pixels. + + .. c:member:: long pageX + long pageY + + The touch coordinate relative to the viewport, in pixels, and including any scroll offset. + + .. c:member:: EM_BOOL isChanged + + Specifies whether this touch point changed during this event. + + .. c:member:: EM_BOOL onTarget + + Specifies whether this touch point is still above the original target on which it was initially pressed against. + + .. c:member:: long canvasX + long canvasY + + The touch coordinates mapped to the Emscripten canvas client area, in pixels. + + + +.. c:type:: EmscriptenTouchEvent + + Specifies the data of a single `touchevent `_. + + .. c:member:: int numTouches + + The number of valid elements in the touches array. + + + .. c:member:: EM_BOOL ctrlKey + EM_BOOL shiftKey + EM_BOOL altKey + EM_BOOL metaKey + + Specifies which modifiers were active during the key event. + + .. c:member:: EmscriptenTouchPoint touches[32] + + An array of currently active touches, one for each finger. + + + +Callback functions +------------------ + + +.. c:type:: em_touch_callback_func + + Function pointer for the :c:func:`touch event callback functions `. + + Defined as: :: + + typedef EM_BOOL (*em_touch_callback_func)(int eventType, const EmscriptenTouchEvent *keyEvent, void *userData); + + :param int eventType: The type of touch event (:c:data:`EMSCRIPTEN_EVENT_TOUCHSTART`). + :param keyEvent: Information about the touch event that occurred. + :type keyEvent: const EmscriptenTouchEvent* + :param void* userData: The ``userData`` originally passed to the registration function. + :returns: |callback-handler-return-value-doc| + :rtype: |EM_BOOL| + + + +Functions +--------- + +.. c:function:: EMSCRIPTEN_RESULT emscripten_set_touchstart_callback(const char *target, void *userData, EM_BOOL useCapture, em_touch_callback_func callback) + EMSCRIPTEN_RESULT emscripten_set_touchend_callback(const char *target, void *userData, EM_BOOL useCapture, em_touch_callback_func callback) + EMSCRIPTEN_RESULT emscripten_set_touchmove_callback(const char *target, void *userData, EM_BOOL useCapture, em_touch_callback_func callback) + EMSCRIPTEN_RESULT emscripten_set_touchcancel_callback(const char *target, void *userData, EM_BOOL useCapture, em_touch_callback_func callback) + + Registers a callback function for receiving `touch events `_ : `touchstart `_, `touchend `_, `touchmove `_ and `touchcancel `_. + + :param target: |target-parameter-doc| + :type target: const char* + :param void* userData: |userData-parameter-doc| + :param EM_BOOL useCapture: |useCapture-parameter-doc| + :param em_touch_callback_func callback: |callback-function-parameter-doc| + :returns: :c:data:`EMSCRIPTEN_RESULT_SUCCESS`, or one of the other result values. + :rtype: |EMSCRIPTEN_RESULT| + + + +Gamepad +======= + +Defines +------- + +.. c:macro:: EMSCRIPTEN_EVENT_GAMEPADCONNECTED + EMSCRIPTEN_EVENT_GAMEPADDISCONNECTED + + Emscripten `gamepad `_ events. + + +Struct +------ + +.. c:type:: EmscriptenGamepadEvent + + Represents the current snapshot state of a `gamepad `_. + + + .. c:member:: double timestamp + + Absolute wallclock time when the data was recorded (milliseconds). + + .. c:member:: int numAxes + + The number of valid axes entries in the axis array. + + .. c:member:: int numButtons + + The number of valid button entries in the analogButton and digitalButton arrays. + + .. c:member:: double axis[64] + + The analog state of the gamepad axes, in the range [-1, 1]. + + + .. c:member:: double analogButton[64] + + The analog state of the gamepad buttons, in the range [0, 1]. + + + .. c:member:: EM_BOOL digitalButton[64] + + The digital state of the gamepad buttons, either 0 or 1. + + .. c:member:: EM_BOOL connected + + Specifies whether this gamepad is connected to the browser page. + + .. c:member:: long index + + An ordinal associated with this gamepad, zero-based. + + .. c:member:: EM_UTF8 id + + An ID for the brand or style of the connected gamepad device. Typically, this will include the USB vendor and a product ID. + + Maximum size 64 ``char`` (i.e. ``EM_UTF8 id[128]``). + + .. c:member:: EM_UTF8 mapping + + A string that identifies the layout or control mapping of this device. + + Maximum size 128 ``char`` (i.e. ``EM_UTF8 mapping[128]``). + + + +Callback functions +------------------ + +.. c:type:: em_gamepad_callback_func + + Function pointer for the :c:func:`gamepad event callback functions `. + + Defined as: :: + + typedef EM_BOOL (*em_gamepad_callback_func)(int eventType, const EmscriptenGamepadEvent *keyEvent, void *userData) + + :param int eventType: The type of gamepad event (:c:data:`EMSCRIPTEN_EVENT_GAMEPADCONNECTED`). + :param keyEvent: Information about the gamepad event that occurred. + :type keyEvent: const EmscriptenGamepadEvent* + :param void* userData: The ``userData`` originally passed to the registration function. + :returns: |callback-handler-return-value-doc| + :rtype: |EM_BOOL| + + + +Functions +--------- + +.. c:function:: EMSCRIPTEN_RESULT emscripten_set_gamepadconnected_callback(void *userData, EM_BOOL useCapture, em_gamepad_callback_func callback) + EMSCRIPTEN_RESULT emscripten_set_gamepaddisconnected_callback(void *userData, EM_BOOL useCapture, em_gamepad_callback_func callback) + + Registers a callback function for receiving the `gamepad `_ events: `gamepadconnected `_ and `gamepaddisconnected `_. + + :param void* userData: |userData-parameter-doc| + :param EM_BOOL useCapture: |useCapture-parameter-doc| + :param em_gamepad_callback_func callback: |callback-function-parameter-doc| + :returns: :c:data:`EMSCRIPTEN_RESULT_SUCCESS`, or one of the other result values. + :rtype: |EMSCRIPTEN_RESULT| + + +.. c:function:: int emscripten_get_num_gamepads(void) + + Returns the number of gamepads connected to the system or :c:type:`EMSCRIPTEN_RESULT_NOT_SUPPORTED` if the current browser does not support gamepads. + + .. note:: A gamepad does not show up as connected until a button on it is pressed. + + :returns: :c:data:`EMSCRIPTEN_RESULT_SUCCESS`, or one of the other result values. + :rtype: int + + +.. c:function:: EMSCRIPTEN_RESULT emscripten_get_gamepad_status(int index, EmscriptenGamepadEvent *gamepadState); + + Returns a snapshot of the current gamepad state. + + :param int index: The index of the gamepad to check (in the `array of connected gamepads `_). + :param EmscriptenGamepadEvent* gamepadState: The most recently received gamepad state. + :returns: :c:data:`EMSCRIPTEN_RESULT_SUCCESS`, or one of the other result values. + :rtype: |EMSCRIPTEN_RESULT| + + + +Battery +======= + +Defines +------- + +.. c:macro:: EMSCRIPTEN_EVENT_BATTERYCHARGINGCHANGE + EMSCRIPTEN_EVENT_BATTERYLEVELCHANGE + + Emscripten `batterymanager `_ events. + + +Struct +------ + +.. c:type:: EmscriptenBatteryEvent + + The event structure passed in the `batterymanager `_ events: ``chargingchange`` and ``levelchange``. + + + .. c:member:: double chargingTime + + Time remaining until the battery is fully charged (seconds). + + .. c:member:: double dischargingTime + + Time remaining until the battery is empty and the system will be suspended (seconds). + + .. c:member:: double level + + Current battery level, on a scale of 0 to 1.0. + + .. c:member:: EM_BOOL charging; + + ``true`` if the batter is charging, ``false`` otherwise. + + +Callback functions +------------------ + +.. c:type:: em_battery_callback_func + + Function pointer for the :c:func:`batterymanager event callback functions `. + + Defined as: :: + + typedef EM_BOOL (*em_battery_callback_func)(int eventType, const EmscriptenBatteryEvent *keyEvent, void *userData); + + :param int eventType: The type of batterymanager event (:c:data:`EMSCRIPTEN_EVENT_BATTERYCHARGINGCHANGE`). + :param keyEvent: Information about the batterymanager event that occurred. + :type keyEvent: const EmscriptenBatteryEvent* + :param void* userData: The ``userData`` originally passed to the registration function. + :returns: |callback-handler-return-value-doc| + :rtype: |EM_BOOL| + + + +Functions +--------- + +.. c:function:: EMSCRIPTEN_RESULT emscripten_set_batterychargingchange_callback(void *userData, em_battery_callback_func callback) + EMSCRIPTEN_RESULT emscripten_set_batterylevelchange_callback(void *userData, em_battery_callback_func callback) + + Registers a callback function for receiving the `batterymanager `_ events: ``chargingchange`` and ``levelchange``. + + :param void* userData: |userData-parameter-doc| + :param EM_BOOL useCapture: |useCapture-parameter-doc| + :param em_battery_callback_func callback: |callback-function-parameter-doc| + :returns: :c:data:`EMSCRIPTEN_RESULT_SUCCESS`, or one of the other result values. + :rtype: |EMSCRIPTEN_RESULT| + + +.. c:function:: EMSCRIPTEN_RESULT emscripten_get_battery_status(EmscriptenBatteryEvent *batteryState) + + Returns the current battery status. + + :param EmscriptenBatteryEvent *batteryState: The most recently received battery state. + :returns: :c:data:`EMSCRIPTEN_RESULT_SUCCESS`, or one of the other result values. + :rtype: |EMSCRIPTEN_RESULT| + + + +Vibration +========= + +Functions +--------- + + +.. c:function:: EMSCRIPTEN_RESULT emscripten_vibrate(int msecs) + + Produces a `vibration `_ for the specified time, in milliseconds. + + :param int msecs: The amount of time for which the vibration is required (milliseconds) + :returns: :c:data:`EMSCRIPTEN_RESULT_SUCCESS`, or one of the other result values. + :rtype: |EMSCRIPTEN_RESULT| + + +.. c:function:: EMSCRIPTEN_RESULT emscripten_vibrate_pattern(int *msecsArray, int numEntries) + + Produces a complex vibration feedback pattern. + + :param int* msecsArray: An array of timing entries [on, off, on, off, on, off, ...] where every second one specifies a duration of vibration, and every other one specifies a duration of silence. + :param int numEntries: The number of integers in the array ``msecsArray``. + :returns: :c:data:`EMSCRIPTEN_RESULT_SUCCESS`, or one of the other result values. + :rtype: |EMSCRIPTEN_RESULT| + + +Page unload +=========== + +Defines +------- + +.. c:macro:: EMSCRIPTEN_EVENT_BEFOREUNLOAD + + Emscripten `beforeunload `_ event. + + +Callback functions +------------------ + +.. c:type:: em_beforeunload_callback + + Function pointer for the :c:func:`beforeunload event callback functions `. + + Defined as: :: + + typedef const char *(*em_beforeunload_callback)(int eventType, const void *reserved, void *userData); + + :param int eventType: The type of beforeunload event (:c:data:`EMSCRIPTEN_EVENT_BEFOREUNLOAD`). + :param reserved: Reserved for future use; pass in 0. + :type reserved: const void* + :param void* userData: The ``userData`` originally passed to the registration function. + :returns: Return a string to be displayed to the user. + :rtype: char* + + + +Functions +--------- + + +.. c:function:: EMSCRIPTEN_RESULT emscripten_set_beforeunload_callback(void *userData, em_beforeunload_callback callback) + + Registers a callback function for receiving the page `beforeunload `_ event. + + Hook onto this event to perform actions immediately prior to page close (for example, to display a notification to ask if the user really wants to leave the page). + + :param void* userData: |userData-parameter-doc| + :param em_beforeunload_callback callback: |callback-function-parameter-doc| + :returns: :c:data:`EMSCRIPTEN_RESULT_SUCCESS`, or one of the other result values. + :rtype: |EMSCRIPTEN_RESULT| + + + +WebGL context +============= + +Defines +------- + +.. c:macro:: EMSCRIPTEN_EVENT_WEBGLCONTEXTLOST + EMSCRIPTEN_EVENT_WEBGLCONTEXTRESTORED + + Emscripten `WebGL context `_ events. + + +Callback functions +------------------ + + +.. c:type:: em_webgl_context_callback + + Function pointer for the :c:func:`WebGL Context event callback functions `. + + Defined as: :: + + typedef EM_BOOL (*em_webgl_context_callback)(int eventType, const void *reserved, void *userData); + + :param int eventType: The type of :c:data:`WebGL context event `. + :param reserved: Reserved for future use; pass in 0. + :type reserved: const void* + :param void* userData: The ``userData`` originally passed to the registration function. + :returns: |callback-handler-return-value-doc| + :rtype: |EM_BOOL| + + + +Functions +--------- + + +.. c:function:: EMSCRIPTEN_RESULT emscripten_set_webglcontextlost_callback(const char *target, void *userData, EM_BOOL useCapture, em_webgl_context_callback callback) + EMSCRIPTEN_RESULT emscripten_set_webglcontextrestored_callback(const char *target, void *userData, EM_BOOL useCapture, em_webgl_context_callback callback) + + Registers a callback function for the canvas `WebGL context `_ events: ``webglcontextlost`` and ``webglcontextrestored``. + + :param target: |target-parameter-doc| + :type target: const char* + :param void* userData: |userData-parameter-doc| + :param EM_BOOL useCapture: |useCapture-parameter-doc| + :param em_webgl_context_callback callback: |callback-function-parameter-doc| + :returns: :c:data:`EMSCRIPTEN_RESULT_SUCCESS`, or one of the other result values. + :rtype: |EMSCRIPTEN_RESULT| + + + +.. c:function:: EM_BOOL emscripten_is_webgl_context_lost(const char *target) + + Queries the given canvas element for whether its WebGL context is in a lost state. + + :param const char *target: Reserved for future use, pass in 0. + :returns: ``true`` if the WebGL context is in a lost state. + :rtype: |EM_BOOL| + + + +.. COMMENT (not rendered): Section below is automated copy and replace text. + +.. COMMENT (not rendered): The replace function return values with links (not created automatically) + +.. |EMSCRIPTEN_RESULT| replace:: :c:type:`EMSCRIPTEN_RESULT` +.. |EM_BOOL| replace:: :c:type:`EM_BOOL` + +.. COMMENT (not rendered): Following values are common to many functions, and currently only updated in one place (here). +.. COMMENT (not rendered): These can be properly replaced if required either wholesale or on an individual basis. + +.. |target-parameter-doc| replace:: :ref:`Target HTML element id `. +.. |userData-parameter-doc| replace:: :ref:`User-defined data ` to be passed to the callback (opaque to the API). +.. |useCapture-parameter-doc| replace:: Set ``true`` to :ref:`use capture `. +.. |callback-handler-return-value-doc| replace:: Return ``true`` (non zero) to indicate that the event was consumed by the :ref:`callback handler `. +.. |callback-function-parameter-doc| replace:: A callback function. The function is called with the type of event, information about the event, and user data passed from this registration function. The callback should return ``true`` if the event is consumed. + + + diff --git a/site/source/docs/api_reference/index.rst b/site/source/docs/api_reference/index.rst new file mode 100644 index 0000000000000..95f5896bb19fa --- /dev/null +++ b/site/source/docs/api_reference/index.rst @@ -0,0 +1,24 @@ +================================== +API Reference (under-construction) +================================== + +This section lists Emscripten's public API, organised by header file. At very high level it consists of: + +- **emscripten.h**: APIs for integrating with the browser environment. + Specifically: controlling application execution, calling JavaScript from C code, loading files, logging etc. +- **html5.h**: Low level glue bindings for interfacing with HTML5 APIs from your native code. + Includes events of all types, from key, mouse and touch events, through to screen and device orientation events, through to WebGL context events etc. +- **preamble.js**: APIs for working with compiled code. + Includes: calling compiled C functions, accessing memory, converting pointers to JavaScript ``Strings`` and ``Strings`` to pointers (with different encodings/formats), and other convenience functions. + +In addition to the public API, there are additional APIs which are intended only when developing Emscripten itself, or which are complicated to use and hence considered suitable for "advanced users". At time of writing are not documented individually, but are mentioned at high level in :doc:`advanced-apis`. + +.. toctree:: + :maxdepth: 1 + + emscripten.h + html5.h + preamble.js + advanced-apis + + diff --git a/site/source/docs/api_reference/preamble.js.rst b/site/source/docs/api_reference/preamble.js.rst new file mode 100644 index 0000000000000..45c96b682451f --- /dev/null +++ b/site/source/docs/api_reference/preamble.js.rst @@ -0,0 +1,416 @@ +======================================================= +preamble.js (ready-for-review) +======================================================= + +This page documents the public JavaScript APIs provided by `preamble.js `_. + +The APIs provide programmatic access for working with compiled code, including: calling compiled C functions, accessing memory, converting pointers to JavaScript ``Strings`` and ``Strings`` to pointers (with different encodings/formats), and other convenience functions. + +.. note:: All functions should be called though the ``Module`` object (for example: ``Module.functionName``) because calling the functions directly will fail at higher optimisation levels. This is because at optimisation ``-O2`` (and higher) function names are minified by the closure compiler and the ``Module`` object becomes the only way to access them. + + +.. contents:: Table of Contents + :local: + :depth: 1 + + + +Calling compiled C functions from JavaScript +============================================ + +.. js:function:: ccall(ident, returnType, argTypes, args) + + Call a compiled C function from JavaScript. + + The function calls/executes a compiled C function from JavaScript and returns the result. The C function can be defined in a C file, or be C-compatible C++ function defined using ``extern "C"`` (to prevent name mangling). + + .. code-block:: javascript + + // Call C from JavaScript + var result = Module.ccall('c_add', // name of C function + 'number', // return type + ['number', 'number'], // argument types + [10, 20]); // arguments + + // result is 30 + + .. COMMENT (not rendered): There is more complete documentation in the guide: **HamishW** - add link to guide when it exists (currently in wiki at "Interacting with code"). + + .. note:: + - ``ccall`` uses the C stack for temporary values. If you pass a string then it is only "alive" until the call is complete. If the code being called saves the pointer to be used later, it may point to invalid data. + - If you need a string to live forever, you can create it, for example, using ``malloc`` and js:func:`writeStringToMemory`. However you must later delete it manually! + - LLVM optimizations can inline and remove functions, after which you will not be able to call them. Closure can also do so. To avoid that, add your function to the exports using something like: :: + + -s EXPORTED_FUNCTIONS='["_main", "_myfunc"]' + + :param ident: The name of the C function to be called. + :param returnType: The return type of the function. This will be one of the JavaScript types ``number``, ``string`` or ``array`` (use ``number`` for any C pointer, and ``array`` for JavaScript arrays and typed arrays; note that arrays are 8-bit). + :param argTypes: An array of the types of arguments for the function (if there are no arguments, this can be omitted). Types are as in ``returnType``, except that ``array`` is not supported as there is no way for us to know the length of the array). + :param args: An array of the arguments to the function, as native JavaScript values (as in ``returnType``). Note that string arguments will be stored on the stack (the JavaScript string will become a C string on the stack). + :returns: The result of the function call as a native JavaScript value (as in ``returnType``). + + .. COMMENT (not rendered): The ccall/cwrap functions only work for C++ functions that use "extern C". In theory ordinary C++ names can be unmangled, but it would require tool to ship a fairly large amount of code just for this purpose. + + +.. js:function:: cwrap(ident, returnType, argTypes) + + Returns a native JavaScript wrapper for a C function. + + This is similar to :js:func:`ccall`, but returns a JavaScript function which can be reused as many time as needed. The C function can be defined in a C file, or be a C-compatible C++ function defined using ``extern "C"`` (to prevent name mangling). + + + .. code-block:: javascript + + // Call C from JavaScript + var c_javascript_add = Module.cwrap('c_add', // name of C function + 'number', // return type + ['number', 'number']); // argument types + + // Call c_javascript_add normally + console.log(c_javascript_add(10, 20)); // 30 + console.log(c_javascript_add(20, 30)); // 50 + + .. COMMENT (not rendered): There is more complete documentation in the guide: **HamishW** - add link to guide when it exists (currently in wiki at "Interacting with code"). + + .. note:: + - ``cwrap`` uses the C stack for temporary values. If you pass a string then it is only "alive" until the call is complete. If the code being called saves the pointer to be used later, it may point to invalid data. + - If you need a string to live forever, you can create it, for example, using ``malloc`` and :js:func:`writeStringToMemory`. However you must later delete it manually! + - LLVM optimizations can inline and remove functions, after which you will not be able to call them. Closure can also do so. To avoid that, add your function to the exports using something like: :: + + -s EXPORTED_FUNCTIONS='["_main", "_myfunc"]' + + :param ident: The name of the C function to be called. + :param returnType: The return type of the function. This will be one of the JavaScript types ``number``, ``string`` or ``array`` (use ``number`` for any C pointer, and ``array`` for JavaScript arrays and typed arrays; note that arrays are 8-bit). + :param argTypes: An array of the types of arguments for the function (if there are no arguments, this can be omitted). Types are as in ``returnType``, except that ``array`` is not supported as there is no way for us to know the length of the array). + :returns: A JavaScript function that can be used for running the C function. + + + + +Accessing memory +================ + + +.. js:function:: setValue(ptr, value, type[, noSafe]) + + Sets a value at a specific memory address at run-time. + + .. note:: + - :js:func:`setValue` and :js:func:`getValue` only do *aligned* writes and reads. + - The ``type` is an LLVM IR type (one of ``i8``,``i16``,``i32``,``i64``,``float``,``double`, or a pointer type like `i8*` or just *), not JavaScript types as used in :js:func:`ccall` or :js:func:`cwrap`. This is a lower-level operation, and we do need to care what specific type is being used. + + :param ptr: A pointer (number) representing the memory address. + :param value: The value to be stored + :param type: An LLVM IR type as a string (see "note" above). + :param noSafe: Developers should ignore this variable. It is on used in ``SAFE_HEAP`` compilation mode, where it can be avoid infinite recursion in some specialist use cases. + :type noSafe: bool + + + +.. js:function:: getValue(ptr, type[, noSafe]) + + Gets a value at a specific memory address at run-time. + + .. note:: + - :js:func:`setValue` and :js:func:`getValue` only do *aligned* writes and reads! + - The ``type` is an LLVM IR type (one of ``i8``,``i16``,``i32``,``i64``,``float``,``double`, or a pointer type like `i8*` or just *), not JavaScript types as used in :js:func:`ccall` or :js:func:`cwrap`. This is a lower-level operation, and we do need to care what specific type is being used. + + :param ptr: A pointer (number) representing the memory address. + :param type: An LLVM IR type as a string (see "note" above). + :param noSafe: Developers should ignore this variable. It is on used in ``SAFE_HEAP`` compilation mode, where it can be avoid infinite recursion in some specialist use cases. + :type noSafe: bool + :returns: The value stored at the specified memory address. + + + + +Conversion functions - strings, pointers and arrays +=================================================== + +.. js:function:: Pointer_stringify(ptr[, length]) + + Returns a JavaScript String from a pointer, for use in compiled code. + + :param ptr: The pointer to be converted to a ``String`. + :param length: The length of the data in the pointer (optional). + :returns: A JavaScript ``String`` containing the data from ``ptr``. + :rtype: String + + + +.. js:function:: UTF16ToString(ptr) + + Given a pointer ``ptr`` to a null-terminated UTF16LE-encoded string in the Emscripten HEAP, returns a copy of that string as a Javascript ``String`` object. + + :param ptr: A pointer to a null-terminated UTF16LE-encoded string in the Emscripten HEAP. + :returns: A Javascript ``String`` object + + + +.. js:function:: stringToUTF16(str, outPtr) + + Copies the given JavaScript ``String`` object ``str`` to the Emscripten HEAP at address ``outPtr``, null-terminated and encoded in UTF16LE form. + + The copy will require at most (str.length*2+1)*2 bytes of space in the HEAP. + + :param str: A JavaScript ``String`` object. + :type str: String + :param outPtr: Pointer to data copied from ``str``, encoded in encoded in UTF16LE format and null-terminated. + + + +.. js:function:: UTF32ToString(ptr) + + Given a pointer ``ptr`` to a null-terminated UTF32LE-encoded string in the Emscripten HEAP, returns a copy of that string as a JavaScript String object. + + :param ptr: A pointer to a null-terminated UTF16LE-encoded string in the Emscripten HEAP. + :returns: A Javascript ``String`` object + + +.. js:function:: stringToUTF32(str, outPtr) + + Copies the given JavaScript ``String`` object ``str`` to the Emscripten HEAP at address ``outPtr``, null-terminated and encoded in UTF32LE form. + + The copy will require at most (str.length+1)*4 bytes of space in the HEAP, but can use less, since ``str.length`` does not return the number of characters in the string, but the number of UTF-16 code units in the string. + + :param str: A JavaScript ``String`` object. + :type str: String + :param outPtr: Pointer to data copied from ``str``, encoded in encoded in UTF32LE format and null-terminated. + + + +.. js:function:: intArrayFromString(stringy, dontAddNull[, length]) + + This converts a JavaScript string into a C-line array of numbers, 0-terminated. + + :param stringy: The string to be converted. + :type stringy: String + :param dontAddNull: If ``true``, the new array is not zero-terminated. + :type dontAddNull: bool + :param length: The length of the array (optional). + :returns: The array created from ``stringy``. + + +.. js:function:: intArrayToString(array) + + This creates a JavaScript string from a zero-terminated C-line array of numbers. + + :param array: The array to convert. + :returns: A ``String``, containing the content of ``array``. + + + +.. js:function:: writeStringToMemory(string, buffer, dontAddNull) + + Write a JavaScript string to a specified address in the heap. + + .. code-block:: javascript + + // Allocate space for string and extra '0' at the end + var buffer = Module._malloc(myString.length+1); + + // Write the string to memory + Module.writeStringToMemory(myString, buffer); + + // We can now send buffer into a C function, it is just a normal char* pointer + + :param string: The string to write into memory. + :type string: String + :param buffer: The address (number) to write the string. + :type buffer: Number + :param dontAddNull: If ``true``, the new array is not zero-terminated. + :type dontAddNull: bool + + + +.. js:function:: writeArrayToMemory(array, buffer) + + Writes an array to a specified address in the heap. Note that needs to be allocated for this array first. + + :param array: The array to write to memory. + :param buffer: The address (number) to write the array. + :type buffer: Number + + + +.. js:function:: writeAsciiToMemory(str, buffer, dontAddNull) + + Writes an ASCII string to a specified address in the heap. Note that space to be allocated for this array first. + + The string is assumed to only have characters in the ASCII character set. If ASSERTIONS are enabled and this is not the case, it will fail. + + .. code-block:: javascript + + // Allocate space for string + var buffer = Module._malloc(myString.length); + + // Write the string to memory + Module.writeStringToMemory(myString, buffer); + + :param string: The string to write into memory. + :param buffer: The address to write the string. + :param dontAddNull: If ``true``, the new array is not zero-terminated. + :type dontAddNull: bool + + + +Run dependencies +===================================== + +Note that generally run dependencies are managed by the file packager and other parts of the system. It is rare for developers to use this API directly. + + +.. js:function:: addRunDependency(id) + + Adds an ``id`` to the list of run dependencies. + + This adds a run dependency and increments the run dependency counter. + + .. COMMENT (not rendered): **HamishW** Remember to link to Execution lifecycle in Browser environment or otherwise link to information on using this. Possibly its own topic. + + :param id: An arbitrary id representing the operation. + :type id: String + + + +.. js:function:: removeRunDependency(id) + + Removes a specified ``id`` from the list of run dependencies. + + .. COMMENT (not rendered): **HamishW** Remember to link to Execution lifecycle in Browser environment or otherwise link to information on using this. + + :param id: The identifier for the specific dependency (added with :js:func:`addRunDependency`) that has been met. + :type id: String + + + +Stack trace +===================== + +.. js:function:: stackTrace() + + Returns the current stack track. + + .. note:: The stack trace is not available at least on IE10 and Safari 6. + + :returns: The current stack trace, if available. + + + + +Type accessors for Typed Arrays Mode 2 +========================================== + +When using *Typed Arrays Mode 2* a type array buffer is used to represent memory, with different views into it giving access to the different types. The views for accessing different types of memory are listed below. + +.. COMMENT (not rendered): **HamishW** Link to TO TYPED ARRAYS MODE2 DOCUMENTATION when this is ported + + +.. js:data:: HEAP8 + + View for 8-bit signed memory. This is a view into the type array buffer used to represent memory in Typed Arrays Mode 2. + + +.. js:data:: HEAP16 + + View for 16-bit signed memory. This is a view into the type array buffer used to represent memory in Typed Arrays Mode 2. + + +.. js:data:: HEAP32 + + View for 32-bit signed memory. This is a view into the type array buffer used to represent memory in Typed Arrays Mode 2. + + +.. js:data:: HEAPU8 + + View for 32-bit unsigned memory. This is a view into the type array buffer used to represent memory in Typed Arrays Mode 2. + + +.. js:data:: HEAPU8 + + View for 32-bit unsigned memory. This is a view into the type array buffer used to represent memory in Typed Arrays Mode 2. + + +.. js:data:: HEAPU16 + + View for 16-bit unsigned memory. This is a view into the type array buffer used to represent memory in Typed Arrays Mode 2. + + +.. js:data:: HEAPU32 + + View for 32-bit unsigned memory. This is a view into the type array buffer used to represent memory in Typed Arrays Mode 2. + + +.. js:data:: HEAPF32 + + View for 32-bit float memory. This is a view into the type array buffer used to represent memory in Typed Arrays Mode 2. + + +.. js:data:: HEAPF64 + + View for 64-bit float memory. This is a view into the type array buffer used to represent memory in Typed Arrays Mode 2. + + + + + + +.. COMMENT (not rendered) : The following methods are explicitly not part of the public API and not documented. Note that in some case referred to by function name, other cases by Module assignment. + + function allocate(slab, types, allocator, ptr) - Internal and use is discouraged. Documentation can remain in source code but not here. + associated contants ALLOC_NORMAL, ALLOC_STACK, ALLOC_STATIC, ALLOC_DYNAMIC, ALLOC_NONE + + function addOnPreRun + function addOnInit + function addOnPreMain + function addOnExit + function addOnPostRun + Module['ALLOC_NORMAL'] = ALLOC_NORMAL; + Module['ALLOC_STACK'] = ALLOC_STACK; + Module['ALLOC_STATIC'] = ALLOC_STATIC; + Module['ALLOC_DYNAMIC'] = ALLOC_DYNAMIC; + Module['ALLOC_NONE'] = ALLOC_NONE; + Module['HEAP'] = HEAP; + Module['IHEAP'] = IHEAP; + Module['FHEAP'] = FHEAP; + function alignMemoryPage(x) + function enlargeMemory() + function demangle(func) + function demangleAll(text) + function parseJSFunc(jsfunc) + function callRuntimeCallbacks(callbacks) + function preRun() + function ensureInitRuntime() + function preMain() + function exitRuntime() + function postRun() + function getCFunc(ident) + function jsCall() + function SAFE_HEAP_CLEAR(dest) + function SAFE_HEAP_ACCESS(dest, type, store, ignore, storeValue) + function SAFE_HEAP_STORE(dest, value, type, ignore) + function SAFE_HEAP_LOAD(dest, type, unsigned, ignore) + function SAFE_HEAP_COPY_HISTORY(dest, src) + function SAFE_HEAP_FILL_HISTORY(from, to, type) + function getSafeHeapType(bytes, isFloat) + function SAFE_HEAP_STORE(dest, value, bytes, isFloat) + function SAFE_HEAP_LOAD(dest, bytes, isFloat, unsigned) + function SAFE_FT_MASK(value, mask) + function CHECK_ALIGN_8(addr) + function CHECK_ALIGN_4(addr) + function CHECK_ALIGN_2(addr) + function CHECK_OVERFLOW(value, bits, ignore, sig) + Module['PGOMonitor'] = PGOMonitor; - a bit confusing + Module["preloadedImages"] + Module["preloadedAudios"] + + +.. PRIVATE NOTES (not rendered) : + - In theory JavaScript exceptions could be thrown for very bad input (e.g., provide an integer instead of a string, and the function does .length on it). These are implied everywhere and not documented. + - noSafe parameter: It solves technical problem of infinite recursion in some cases where SAFE_HEAP is being used. Not really interesting for users. + + + + + + diff --git a/site/source/docs/contributing/AUTHORS.rst b/site/source/docs/contributing/AUTHORS.rst new file mode 100644 index 0000000000000..2aab2cf82a464 --- /dev/null +++ b/site/source/docs/contributing/AUTHORS.rst @@ -0,0 +1,14 @@ +============================ +AUTHORS (ready-for-review) +============================ + +The `AUTHORS `_ file lists everyone who has contributed to Emscripten. + +.. note :: Authors must add themselves to the `AUTHORS `_ file (**incoming** branch) before :doc:`contributing `. This act licenses their changes under the project’s :doc:`open source licenses (MIT/LLVM) `. Note that the developer retains copyright. + +The contributors for releases up to Emscripten |release| inclusive (|today|) are listed below. + +.. include:: ..\..\..\..\AUTHORS + :literal: + + diff --git a/site/source/docs/contributing/contributing.rst b/site/source/docs/contributing/contributing.rst new file mode 100644 index 0000000000000..0844cd99c2166 --- /dev/null +++ b/site/source/docs/contributing/contributing.rst @@ -0,0 +1,60 @@ +================================================ +Contributing (ready-for-review) +================================================ + +Anyone can contribute to Emscripten. Feel free to :doc:`join the discussion ` and share your suggestions, ideas, and `bug reports `_! + +If you find Emscripten useful and want to contribute, check out the information and suggestions below. + + +Getting started +=============== + +A good starting point is to work on the `open issues on Github `_. Many issues can be resolved without an in-depth knowledge of compiler internals, and this is a great way to learn more about the project. + +.. tip:: We really appreciate your help. Every closed issue means more time for experienced developers to work on compiler internals. + + +Branches of interest +==================== + +- **master** - The "master" branch. This is always safe to pull from and the test suite always passes. +- **incoming** - Branch for new code. Code in **incoming** is merged with the **master** only after it is code-reviewed and has passed all the automated tests. +- **llvmsvn** - Branch for work to support a new version of LLVM. Activity typically begins near the end of an LLVM 6-month dev cycle. When LLVM launches the new version, we merge this branch to master and incoming, at which point our support officially moves to that new LLVM version. Only one version of LVVM is supported at a time. + + +Submitting patches +===================== + +Patches should be submitted as *pull requests* to the **incoming** branch. + +.. note:: Before submitting your first patch, add yourself to the `AUTHORS `_ file. By doing so, you agree to license your code under the project's `open source licenses (MIT/LLVM) `_. + +When submitting patches, please: + +- Make pull requests to **incoming**, not master. +- Do not include merge commits in pull requests; include only commits with the new relevant code. +- Run all the automatic tests and make sure they pass **tests/runner.py**. Some tests might not be required for very simple patches (for example, when just adding tests for new library functions). +- If you add any new functionality or fix a bug, add an automatic test to **tests/runner.py**. +- Record the tests that were run in the pull request or issue. + + +Code reviews +============ + +`@kripken `_ reviews all pull requests before merging. + +Exceptions are sub-projects that are 'owned' by other people. These developer/owners can push to incoming directly: + +- OpenAL and audio in general: `@ehsan `_ +- embind: `@imvu `_ +- Windows stuff: `@juj `_ + + + +Next steps +========== + +After you've fixed some bugs and have a better understanding of the project, you may wish to contribute more "deeply". Please share your development ideas with the :doc:`community ` so that they can be evolved and planned. + +Emscripten internal developers should also read the :doc:`PLACEHOLDER Developer's-Guide`. \ No newline at end of file diff --git a/site/source/docs/contributing/developers_guide.rst b/site/source/docs/contributing/developers_guide.rst new file mode 100644 index 0000000000000..6477b77501636 --- /dev/null +++ b/site/source/docs/contributing/developers_guide.rst @@ -0,0 +1,6 @@ +================================= +Developer's Guide (placeholder) +================================= + +Document currently resides on the wiki: https://github.com/kripken/emscripten/wiki/Developer's-Guide + diff --git a/site/source/docs/contributing/index.rst b/site/source/docs/contributing/index.rst new file mode 100644 index 0000000000000..0aae60c317563 --- /dev/null +++ b/site/source/docs/contributing/index.rst @@ -0,0 +1,16 @@ +================================================== +Contributing to Emscripten (under-construction) +================================================== + + + +.. toctree:: + :maxdepth: 2 + + contributing + installing_from_source + developers_guide + AUTHORS + + + diff --git a/site/source/docs/contributing/installing_from_source.rst b/site/source/docs/contributing/installing_from_source.rst new file mode 100644 index 0000000000000..0f9f0b76e04eb --- /dev/null +++ b/site/source/docs/contributing/installing_from_source.rst @@ -0,0 +1,103 @@ +============================================ +Installing from Source (under-construction) +============================================ + +.. COMMENT : Cut out of the Downloading Page + +Instead of using the SDK, you can grab the code and dependencies yourself. This is a little more technical but lets you use the very latest development code. + + +Things you'll need +============================================ + +- The Emscripten code, from GitHub (git clone git://github.com/kripken/emscripten.git. The master branch is fine, it is guaranteed to always be stable. We merge to master only after all tests pass.) +- Emscripten's LLVM and Clang. Emscripten now has an LLVM backend ("fastcomp"), which means you need to use our LLVM+Clang. See `Getting Fastcomp `_ in the :doc:`LLVM Backend` page. + + .. note:: + + - The `LLVM Backend `__ page has instructions for building Emscripten's LLVM+Clang. After you build it, run ``emcc -v``, which should print out the version number as well as run some basic tests. + - It is possible but not recommended to disable fastcomp and use a stock version of LLVM (see the link for more information). + +- **Node.js** (0.8 or above; 0.10.17 or above to run websocket-using servers in node) +- Python 2.7.3 +- Optionally, if you want to use Closure Compiler to minify your code as much as possible, you will also need Java. + + + +Additional Notes +============================================ + +- Python is probably already installed if you are on Linux or OS X. +- Node.js and LLVM should have convenient binaries for your OS, but installing them from source is easy, just compile them in their directories, you don't need to bother with installing them systemwide (you will point Emscripten to them in the next step, where you set up directories). + + + + +Windows and OSX: guides for manual building +============================================ + +.. COMMENT - HAMISHW from the MDN - and I suspect no longer needed now we have LLVM Backend. Check and delete if needed. + +The following guides explain setting up Emscripten and its prerequisites manually on Windows and Mac OSX: + +- :doc:`Build Clang on Mac OS X`. +- :doc:`Download a prebuilt Clang on Mac OS X`. +- :doc:`Get Emscripten and Clang via brew` by nathanhammond. +- :doc:`Manual Emscripten setup on Windows`. + +Linux: guides for manual building +============================================ + +.. COMMENT - HAMISHW from the MDN - and I suspect no longer needed now we have LLVM Backend. Check and delete if needed. + + +The following guides explain setting up Emscripten and its prerequisites manually on Linux: + +- For help on Ubuntu, you can follow the :doc:`Getting Started on Ubuntu 12.10` guide for instructions on how to obtain the prerequisites and build Clang manually using CMake. +- For help on Debian, see this :doc:`guide by EarthServer`. +- rhelmer has provided a Vagrant VM for Emscripten, see :doc:`emscripten-vagrant`. +- Dirk Krause created an :doc:`Amazon EC2 image` for Emscripten. + + +Configuring the basic Emscripten settings file +============================================ + +.. COMMENT - HAMISHW from the MDN - and I suspect no longer needed now we have LLVM Backend. Check and delete if needed. + +The first time you run emcc (or any of the other Emscripten tools, for that matter), it will create a settings file at ``~/.emscripten`` (~ is your user's home directory) and exit. This file contains a number of settings that provide Emscripten with the Paths to all its requirements (LLVM, clang, etc.) amongst other things, and looks something like so: :: + + import os + LLVM_ROOT='C:/Program Files/Emscripten/clang/3.2_64bit/bin' + NODE_JS='C:/Program Files/Emscripten/node/0.10.17_64bit/node.exe' + PYTHON='C:/Program Files/Emscripten/python/2.7.5.3_64bit/python.exe' + JAVA='C:/Program Files/Emscripten/java/7.45_64bit/bin/java.exe' + EMSCRIPTEN_ROOT='C:/Program Files/Emscripten/emscripten/1.7.8' + CRUNCH='C:/Program Files/Emscripten/crunch/1.03/crunch.exe' + MINGW_ROOT='C:/Program Files/Emscripten/mingw/4.6.2_32bit' + SPIDERMONKEY_ENGINE = '' + V8_ENGINE = '' + TEMP_DIR = 'c:/users/cmills/appdata/local/temp' + COMPILER_ENGINE = NODE_JS + JS_ENGINES = [NODE_JS] + +If you used an emsdk installer to install Emscripten everything would be set up automatically, but since you probably built everything manually (since you are reading this section) you'll need to set the Emscripten settings yourself. + +1. If you haven't run Emscripten before, run it now with (assumes you are in ``emsdk`` and haven't set it's location in your PATH): + + :: + + ./Emscripten/1.7.8/emcc + + .. note:: This is for Mac/Linux; on Windows you would use emcc instead. + .. note:: If you are having trouble with python versions, you can also explicitly invoke + :: + + python emcc + + especially if python2 is not defined in your system. python2 allows python 2 and 3 to be installed together on one system, which is increasingly common; as an alternative to python emcc, you can also add a symlink to python from python2). In that case you should also update the PYTHON line in the ~/.emscripten settings file. + +#. Edit the ``~/.emscripten`` file now using your favourite text editor. + +#. Change the directory locations of ``LLVM_ROOT`` and ``NODE_JS`` to the right places in your setup (specifically, edit ``LLVM_ROOT`` and ``NODE_JS``). If those paths are not right, Emscripten will not find LLVM, Clang or Node.js and return a failure message. Look at the comments in the file that explain what the settings are and which ones you need to change. + +#. After setting those paths, run ``./Emscripten/1.7.8/emcc`` again. It should again perform the sanity checks to test the specified paths. If they don't all pass, you might have a typo somewhere. When everything is set up properly, running ``./Emscripten/1.7.8/emcc`` should return ``emcc: no input files``, and you should be ready to use it. \ No newline at end of file diff --git a/site/source/docs/getting_started/bug_reports.rst b/site/source/docs/getting_started/bug_reports.rst new file mode 100644 index 0000000000000..942fc7f950f73 --- /dev/null +++ b/site/source/docs/getting_started/bug_reports.rst @@ -0,0 +1,40 @@ +========================================= +Bug Reporting (ready-for-review) +========================================= + +All bugs should be filed in the GitHub `main `_ Emscripten repository `Issue Tracker `_. + +Please supply as much relevant information as possible, including: + +- original source code. +- generated **.ll** and **.js** files (in a gist, pastebin, or any other method). +- environment information - including *emcc* and *clang* versions. +- error symptoms. +- proposed solutions, ideally with a pull request. + +.. Tip:: Compile with ``EMCC_DEBUG=1`` and grab the **/tmp/emscripten_temp/emcc-\*** files (these include the bytecode, ll, and JavaScript in several stages). Note that the **emscripten_temp** should be emptied manually first, so it only contains new content! + + +Fastcomp LLVM-Backend and Clang bugs +===================================== + +:doc:`LLVM-Backend` bugs may instead be posted to the appropriate `Emscripten LLVM fork `_ or `Emscripten Clang fork `_ **if you are certain** that the bug is specific to these repositories. If uncertain, bugs must be posted to the `main repository `_. + +Pull requests must (of course) go to the proper repository. + + +Site and documentation bugs +======================== + +Documentation (site) bugs should be filed in the same `Issue Tracker `_. + +Include relevant information including: + +- the URL and title of the affected page(s), +- a description of the problem, +- suggestions for a possible solution. + +.. tip:: The `Page bug `_ link on the bottom-right of every page opens the Issue Tracker pre-seeded with the current page URL and title. + + + diff --git a/site/source/docs/getting_started/contact.rst b/site/source/docs/getting_started/contact.rst new file mode 100644 index 0000000000000..2c2d96802bf43 --- /dev/null +++ b/site/source/docs/getting_started/contact.rst @@ -0,0 +1,17 @@ +=========================================== +Get in touch (ready-for-review) +=========================================== + +The best channels to contact the development team (and the community) are the *mailing list* and *IRC*. Bug reports should be posted in the GitHub *Issue Tracker*: + +- Mailing list: `emscripten-discuss `_ +- IRC: **#emscripten** on `irc.mozilla.org `_ +- `Issue Tracker `_ (see :doc:`bug_reports`) + +Emscripten also has an *unofficial* presence on social media: + +- `Google+ page `_ +- `#emscripten `_ (Emscripten Hashtag on Twitter) +- `@kripken `_ (Emscripten Developer Account on Twitter) + + diff --git a/site/source/docs/getting_started/downloads.rst b/site/source/docs/getting_started/downloads.rst new file mode 100644 index 0000000000000..cd08d9532626d --- /dev/null +++ b/site/source/docs/getting_started/downloads.rst @@ -0,0 +1,212 @@ +====================================================== +Download and install (under-construction) +====================================================== + + +.. note:: The *Emscripten SDK* provides the whole Emscripten toolchain (*Clang*, *Python*, *Node.js* and *Visual Studio* integration) in a single easy-to-install package, with integrated support for updating to newer Emscripten versions as they are released. + + +Downloads +============== + +To get started with Emscripten development, grab one of the packages below: + +If you are :doc:`contributing <../contributing/contributing>` to Emscripten you can also set up Emscripten from source: see :doc:`../contributing/installing_from_source`. + + + + +Windows +---------- + +Emscripten SDK Web Installer is a NSIS installer that always gets you the latest Emscripten SDK from the web. + +- `emsdk-1.21.0-web-64bit.exe `_ +- ?32 bit + +Emscripten SDK Offline Installer is a NSIS installer that bundles together the Emscripten toolchain as an offline-installable package. + + +- `emsdk-1.21.0-full-64bit.exe `_ +- ?32 bit + + +Portable Emscripten SDK is a zipped package of the Emscripten SDK that does not require system installation privileges. Just unzip and go! + +- `emsdk-1.21.0-portable-64bit.zip `_ +- 32bit? + + + +Linux and Mac OS X +------------------- + +Emscripten SDK is available as a portable web-installer for Linux and OS X. This does not require system installation privileges. Just unzip and go! + +- `emsdk-portable.tar.gz `_ + + + +Package installation instructions for Mac OSX and Windows +=========================================================== +Check the relevant section below for what to do with the package you just downloaded, then check the Platform-specific notes at the end of the section to find out about and address any further prerequisites that exist for your system. + +Windows: Installing using an NSIS installer +-------------------------------------------- + +The NSIS installers register the Emscripten SDK as a 'standard' Windows application. To install the SDK, download an NSIS .exe file (see above), double-click on it, and run through the installer to perform the installation. After the installer finishes, the full Emscripten toolchain will be available in the directory that was chosen during the installation, and no other steps are necessary. If your system has Visual Studio 2010 installed, the vs-tool MSBuild plugin will be automatically installed as well. + + +Windows, OSX and Linux: Installing the Portable SDK +-------------------------------------------------------- + +The Portable Emscripten SDK is a no-installer version of the SDK package. It is identical to the NSIS installer, except that it does not interact with the Windows registry. This allows Emscripten to be used on a computer without administrative privileges, and enables us to migrate the installation from one location (directory or computer) to another by just copying/zipping up the directory contents. + +If you want to use the Portable Emscripten SDK, the initial setup process is as follows: + +1. Download and unzip the portable SDK package to a directory of your choice (see above). This directory will contain the Emscripten SDK. +#. Open a command prompt to the directory of the SDK. +#. Run ``emsdk update`` (``./emsdk update`` on OSX). This will fetch the latest registry of available tools. +#. Run ``emsdk install latest`` (``./emsdk install latest`` on OSX). This will download and install the latest SDK tools. +#. Run ``emsdk activate latest`` (``./emsdk activate latest`` on OSX). This will set up the necessary paths to point to the SDK correctly. + +Whenever you change the location of the Portable SDK (e.g. take it to another computer), re-run step 5. + + + +Platform-specific notes +---------------------------- + +Mac OS X +++++++++ + +- On OSX (and Linux), the git tool will not be installed automatically. Git is not a required core component, and is only needed if you want to use one of the development branches **emscripten-incoming** or **emscripten-master** directly, instead of the fixed releases. To install git on OSX, you can + + 1. Install XCode, and in XCode, install XCode Command Line Tools. This will provide git to the system PATH. For more help on this step, see http://stackoverflow.com/questions/9329243/xcode-4-4-command-line-tools + 2. Install git directly from http://git-scm.com/ + +- Also, on OSX, *Java* is not bundled with the Emscripten SDK. After installing emscripten via emsdk, typing 'emcc --help' should pop up a OSX dialog "Java is not installed. To open Java, you need a Java SE 6 runtime. Would you like to install one now?" that will automatically download a Java runtime to the system. +- Emscripten requires the command line tool 'python2' to be present on OSX. On default OSX installations, this does not exist. To manually work around this issue, see step 10 at :doc:`Getting-started-on-Mac-OS-X` + + +Linux +++++++++ + +- On Linux, prebuilt binaries of tools are not available. Installing a tool will automatically clone and build that tool from the sources inside **emsdk** directory. Emsdk does not interact with Linux package managers on the behalf of the user, nor does it install any tools to the system. All file changes are done inside the ``emsdk/`` directory. +- Because *emsdk* builds software from the source on Linux, the system must have a working compiler environment available. +- Emsdk does not provide *Python*, *node.js* or *Java* on Linux. The user is expected to install these beforehand with the system package manager. + + + +SDK concepts +============== + +The Emscripten SDK is effectively a small package manager for tools that are used in conjunction with Emscripten. The following glossary highlights the important concepts to help understanding the internals of the SDK. + +Tool + The basic unit of software bundled in the SDK. A Tool has a name and a version. For example, 'clang-3.2-32bit' is a Tool that contains the 32-bit version of the Clang v3.2 compiler. + +SDK + A set of tools. For example, 'sdk-1.5.6-32bit' is an SDK consisting of the tools clang-3.2-32bit, node-0.10.17-32bit, python-2.7.5.1-32bit and emscripten-1.5.6. + +Active Tool/SDK + Emscripten stores compiler configuration in a user-specific file **~/.emscripten**. This file points to paths for Emscripten, Python, Clang and so on. If the file ~/.emscripten is configured to point to a Tool in a specific directory, then that tool is denoted as being **active**. The Emscripten Command Prompt always gives access to the currently active Tools. This mechanism allows switching between different SDK versions easily. + +emsdk + This is the name of the manager script that Emscripten SDK is accessed through. Most operations are of the form ``emsdk command``. To access the *emsdk* script, launch the Emscripten Command Prompt. + + + +SDK maintenance +============================ + +The following tasks are common with the Emscripten SDK: + +How do I work the emsdk utility? + Run ``emsdk help`` or just ``emsdk`` to get information about all available commands. + +How do I check the installation status and version of the SDK and tools? + To get a list of all currently installed tools and SDK versions, and all available tools, run ``emsdk list``. *A line will be printed for each tool/SDK that is available for installation.* The text ``INSTALLED`` will be shown for each tool that has already been installed. If a tool/SDK is currently active, a star (\*) will be shown next to it. Run ``emsdk_env.bat`` (Windows) or ``source ./emsdk_env.sh`` (Linux and OSX) to set up the environment for the calling terminal. + +How do I install a tool/SDK version? + Run the command ``emsdk install `` to download and install a new tool or an SDK version. + +How do I remove a tool or an SDK? + Run the command ``emsdk uninstall `` to delete the given tool or SDK from the local harddrive completely. + +How do I check for updates to the Emscripten SDK? + The command ``emsdk update`` will fetch package information for all new tools and SDK versions. After that, run ``emsdk install `` to install a new version. + +How do I change the currently active SDK version? + You can toggle between different tools and SDK versions by running ``emsdk activate ``. Activating a tool will set up ``~/.emscripten`` to point to that particular tool. + +How do I install an old Emscripten compiler version? + Emsdk contains a history of old compiler versions that you can use to maintain your migration path. Type ``emsdk list --old`` to get a list of archived tool and SDK versions, and ``emsdk install `` to install it. + + On Windows, you can directly install an old SDK version by using one of the archived offline NSIS installers. See the `Archived releases`_ section down below. + + .. COMMENT HamishW This is new for MDN. Check if really should belong here. I think may already be up the top too. + +How do I track the latest Emscripten development with the SDK? + A common and supported use case of the Emscripten SDK is to enable the workflow where you directly interact with the github repositories. This allows you to obtain new features and latest fixes immediately as they are pushed to the github repository, without having to wait for release to be tagged. You do not need a github account or a fork of Emscripten to do this. To switch to using the latest upstream git development branch ``incoming``, run the following: + + :: + + emsdk install git-1.8.3 # Install git. Skip if the system already has it. + emsdk install sdk-incoming-64bit # Clone+pull the latest kripken/emscripten/incoming. + emsdk activate sdk-incoming-64bit # Set the incoming SDK as the currently active one. + + If you want to use the upstream stable branch ``master``, then replace ``-incoming-`` with ``-master-`` above. + + .. COMMENT HamishW This is new for MDN. Check if really should belong here. + + +How do I use my own Emscripten github fork with the SDK? + It is also possible to use your own fork of the Emscripten repository via the SDK. This is achieved with standard git machinery, so there if you are already acquainted with working on multiple remotes in a git clone, these steps should be familiar to you. This is useful in the case when you want to make your own modifications to the Emscripten toolchain, but still keep using the SDK environment and tools. To set up your own fork as the currently active Emscripten toolchain, first install the ``sdk-incoming`` SDK like shown in the previous section, and then run the following commands in the emsdk directory: + + :: + + cd emscripten/incoming + # Add a git remote link to your own repository. + git remote add myremote https://github.com/mygituseraccount/emscripten.git + # Obtain the changes in your link. + git fetch myremote + # Switch the emscripten-incoming tool to use your fork. + git checkout -b myincoming --track myremote/incoming + + In this way you can utilize the Emscripten SDK tools while using your own git fork. You can switch back and forth between remotes via the ``git checkout`` command as usual. + + .. COMMENT HamishW This is new for MDN. Check if really should belong here. + + + +Uninstalling the Emscripten SDK +======================================================== + +If you installed the SDK using a NSIS installer on Windows, launch 'Control Panel' -> 'Uninstall a program' -> 'Emscripten SDK'. + +If you want to remove a Portable SDK, just delete the directory containing the Portable SDK. + + + +Archived releases +================= + +You can always install old SDK and compiler toolchains via the latest emsdk. If you need to fall back to an old version, download the Portable SDK version and use that to install a previous version of a tool. All old tool versions are available by typing `emsdk list --old`. + +On Windows, you can install one of the **old versions** via an offline NSIS installer: + +- `emsdk-1.16.0-full-64bit.exe `_ (first stable fastcomp release) +- `emsdk-1.13.0-full-32bit.exe `_ (a unstable first fastcomp release with Clang 3.3) +- `emsdk-1.12.0-full-64bit.exe `_ (the last non-fastcomp version with Clang 3.2) +- `emsdk-1.12.0-full-32bit.exe `_ +- `emsdk-1.8.2-full-64bit.exe `_ +- `emsdk-1.8.2-full-32bit.exe `_ +- `emsdk-1.7.8-full-64bit.exe `_ +- `emsdk-1.7.8-full-32bit.exe `_ +- `emsdk-1.5.6.2-full-64bit.exe `_ +- `emsdk-1.5.6.2-full-32bit.exe `_ +- `emsdk-1.5.6.1-full.exe `_ (32-bit, first emsdk release) + + +A snapshot of all tagged releases (not SDKs) can be found in `emscripten/releases `_. diff --git a/site/source/docs/getting_started/emscripten_license.rst b/site/source/docs/getting_started/emscripten_license.rst new file mode 100644 index 0000000000000..d8910665f9f66 --- /dev/null +++ b/site/source/docs/getting_started/emscripten_license.rst @@ -0,0 +1,16 @@ +===================================== +Emscripten License (ready-for-review) +===================================== + +Emscripten is made available under two permissive open source licenses: the *MIT license* and the *University of Illinois/NCSA Open Source License*. + +There is little, if any, practical difference between the licenses. They are both offered because the: + +- *MIT license* is well known and understood. +- *University of Illinois/NCSA Open Source License* allows Emscripten's code to be integrated upstream into LLVM, should the opportunity arise. + +The license for Emscripten |release| (|today|) is reproduced below. The `current full licence `_ can be found on Github (and is also present in the root of the SDK). + +.. include:: ..\..\..\..\LICENSE + :literal: + \ No newline at end of file diff --git a/site/source/docs/getting_started/index.rst b/site/source/docs/getting_started/index.rst new file mode 100644 index 0000000000000..f22141f15f152 --- /dev/null +++ b/site/source/docs/getting_started/index.rst @@ -0,0 +1,15 @@ +===================================== +Getting Started (under-construction) +===================================== + + +.. toctree:: + :maxdepth: 2 + + downloads + contact + bug_reports + emscripten_license + release_notes + searching_site + diff --git a/site/source/docs/getting_started/release_notes.rst b/site/source/docs/getting_started/release_notes.rst new file mode 100644 index 0000000000000..cfc4644e2dd33 --- /dev/null +++ b/site/source/docs/getting_started/release_notes.rst @@ -0,0 +1,20 @@ +======================================== +Release Notes (ready-for-review) +======================================== + +Changes between tagged Emscripten versions are recorded in the `ChangeLog`_. This log includes information about new features, user-oriented fixes, options, command-line parameters, usage changes, deprecations, significant internal modifications and optimizations etc. At the end of the section for each version there are links changeset diff showing all the changes between incremental versions. + +In addition, the mailing list is used for informal "highlights" notification of SDK releases. The easiest way to find these posts is to use `this search `_. + + +ChangeLog +========= + + + +The changelog for Emscripten |release| (|today|) is listed below (master version `here `_). + +.. include:: ..\..\..\..\ChangeLog + :literal: + + diff --git a/site/source/docs/getting_started/searching_site.rst b/site/source/docs/getting_started/searching_site.rst new file mode 100644 index 0000000000000..7730d01f94373 --- /dev/null +++ b/site/source/docs/getting_started/searching_site.rst @@ -0,0 +1,5 @@ +Searching this site (under-construction) +========================================= + +.. warning:: + Under Construction: diff --git a/site/source/docs/index.rst b/site/source/docs/index.rst new file mode 100644 index 0000000000000..3437dc2d74eed --- /dev/null +++ b/site/source/docs/index.rst @@ -0,0 +1,13 @@ +========================================== +Documentation Home (under-construction) +========================================== + +Text + +.. toctree:: + :maxdepth: 2 + + getting_started/index + contributing/index + api_reference/index + diff --git a/site/source/docs/site/about.rst b/site/source/docs/site/about.rst new file mode 100644 index 0000000000000..6f4928998da77 --- /dev/null +++ b/site/source/docs/site/about.rst @@ -0,0 +1,6 @@ +About site (under-construction) +=============================== + +.. warning:: + Under Construction: + diff --git a/site/source/docs/site/blogs.rst b/site/source/docs/site/blogs.rst new file mode 100644 index 0000000000000..79bb5a31bb067 --- /dev/null +++ b/site/source/docs/site/blogs.rst @@ -0,0 +1,14 @@ +==================================== +Blogs (ready-for-review) +==================================== + +There are two main Emscripten blogs: + +- `Developer blog (azakai) `_. +- `Mozilla blog `_ (for sharing important "commercial" announcements and user stories). + +In addition, other interesting blogs and demos are regularly shared on Twitter by the development team `(@kripken) `_ and the broader community `(#emscripten) `_. + + +.. COMMENT BACKUP STUFF + Suggestion was to actually display RSS feeds from above links here. Perhaps including @kripen in feed. Not planning to do this at this time. diff --git a/site/source/docs/site/index.rst b/site/source/docs/site/index.rst new file mode 100644 index 0000000000000..186a14a74e240 --- /dev/null +++ b/site/source/docs/site/index.rst @@ -0,0 +1,13 @@ +Site Links (under-construction) +=================================================== + + +.. toctree:: + :maxdepth: 1 + + blogs + about + + + + diff --git a/site/source/docs/temp-fragments/getting-started-emscripten-wikiEmscriptenSDK.rst b/site/source/docs/temp-fragments/getting-started-emscripten-wikiEmscriptenSDK.rst new file mode 100644 index 0000000000000..1c7ef82ec9acd --- /dev/null +++ b/site/source/docs/temp-fragments/getting-started-emscripten-wikiEmscriptenSDK.rst @@ -0,0 +1,37 @@ +================================ +Getting Started with Emscripten +================================ + +.. note:: This is fragment from the wiki topic Emscripten SDK. Not yet got a home. + +The tools in the Emscripten toolchain can be accessed in various ways. + +Which one you use depends on your preference. + +Command line usage +------------------- + +The Emscripten compiler is available on the command line by invoking +``emcc`` or ``em++``. They are located in the folder +``emsdk/emscripten//`` in the SDK. + +The root directory of the Emscripten SDK contains scripts +``emsdk_env.bat`` (Windows) and ``emsdk_env.sh`` (Linux, OSX) which set +up ``PATH`` and other environment variables for the current terminal. +After calling these scripts, ``emcc``, ``clang``, etc. are all +accessible from the command line. + +Check out the tutorial! See the Emscripten `Tutorial `__ page for help on how to get going with the tools from command line. + +Windows: Emscripten Command Prompt +-------------------------------------- + +Start the Emscripten Command Prompt from Start Menu -> All Programs -> Emscripten -> Emscripten Command Prompt. This will spawn a new command prompt that has all the tools for the currently activated SDK version set to PATH. The Emscripten Command Prompt is analogous to the Visual Studio Command Prompt that ships with installations of Visual Studio. + +Windows: Use Visual Studio 2010 +-------------------------------------- + +After installing the vs-tool plugin, a new 'Emscripten' platform will appear to the list of all Solution Platforms in Visual Studio. To activate the Emscripten platform, right-click on the solution in the Solution Explorer, choose Configuration Manager... -> Active solution platform... -> New... -> Emscripten. After that, activating the Emscripten platform for the solution will make Visual Studio run the project build through Emscripten, producing .html or .js output, depending on the project properties you set up. + +Note: If you copied the Emscripten platform properties from the Win32 platform, be sure to go and clean up any leftover Win32-specific #defines and other configuration from the Emscripten platform! + diff --git a/site/source/get_api_items_py b/site/source/get_api_items_py new file mode 100644 index 0000000000000..2049286d24028 --- /dev/null +++ b/site/source/get_api_items_py @@ -0,0 +1,117 @@ +# +# This script gets all the API items defined in the emscripten documentation. These can then be used for automated adding of cross links in other scripts. It writes api_items.py which has function that is imported into get-wiki.py +# + +import re #for fixing links in the imported text + +import pprint + +#for options parsing +from optparse import OptionParser + +import shutil #file manipulation +import os +#import glob +import stat + +from time import gmtime, strftime +#import time +import time + + + +#the directory, relative to \source for the API reference +api_reference_directory = '.\\docs\\api_reference\\' + +#name to write API items to. Note, this is used by the get-wiki.py script, so if you change here, change everywhere. +api_item_filename = 'api_items.py' + +api_reference_items = dict() + + +def parseFiles(): + """ + Parse api-reference files to extract the code items. + + """ + + def addapiitems(matchobj): + #print 'matcobj0: %s' % matchobj.group(0) + #print 'matcobj1: %s' % matchobj.group(1) + #print 'matcobj2: %s' % matchobj.group(2) + #print 'matcobj3: %s' % matchobj.group(3) + #print 'matcobj4: %s' % matchobj.group(4) + + lang=matchobj.group(2) + data_type = matchobj.group(3) + if data_type=='function': + data_type='func' + api_item=matchobj.group(4) + api_item=api_item.strip() + api_item=api_item.split('(')[0] + try: + api_item=api_item.split(' ')[1] + except: + pass + + #print lang + #print data_type + #print api_item + + api_reference_items[api_item]=':%s:%s:`%s`' % (lang,data_type,api_item) + if data_type=='func': #Add additional index for functions declared as func() rather than just func + api_item_index=api_item+'()' + api_reference_items[api_item_index]=':%s:%s:`%s`' % (lang,data_type,api_item) + + #print api_reference_items[api_item] + + + for file in os.listdir(api_reference_directory): + if file.endswith(".rst"): + filepath=api_reference_directory+file + print file + #open file + infile=open(filepath,'r') + + for line in infile: + #parse line for API items + re.sub(r'^\.\.\s+((\w+)\:(\w+)\:\:(.*))', addapiitems, line) + infile.close() + + +def exportItems(): + """ + Export the API items into form for use in another script. + """ + infile=open(api_item_filename,'w') + #write function lead in + infile.write("# Auto-generated file (see get-api_items.py)\n#\n\ndef get_mapped_items():\n\tmapped_wiki_inline_code = dict()\n" ) + + for item in api_reference_items: + #Write out each API item to add + infile.write("\tmapped_wiki_inline_code['%s']='%s'\n" % (item, api_reference_items[item]) ) + + #write the return fucntion + infile.write("\treturn mapped_wiki_inline_code" ) + infile.close() + + +#parser options +parser = OptionParser(version="%prog 0.1.1", usage="Usage: %prog [options] version") +parser.add_option("-s", "--siteapi", dest="siteapi", default="http://www.developer.nokia.com/Community/Wiki/api.php", help="Location of API") + + +(options, args) = parser.parse_args() + +#print 'Site: %s' % options.siteapi + + + + +parseFiles() +exportItems() + + + + + diff --git a/site/source/get_wiki.py b/site/source/get_wiki.py new file mode 100644 index 0000000000000..4977c68c0cd3f --- /dev/null +++ b/site/source/get_wiki.py @@ -0,0 +1,243 @@ +# +# This script gets the Emscripten wiki, converts files from markdown to restructure text using pandoc (and also prepends the text with a title/heading based on the filename) +# It also fixes up inline code items to become links to api-reference +# +# It should be called prior to building the site. +# + +import re #for fixing links in the imported text + +import pprint + +#for options parsing +from optparse import OptionParser + +import shutil #file manipulation +import os +#import glob +import stat + +from time import gmtime, strftime +#import time +import time + + + +wiki_repo = 'https://github.com/kripken/emscripten.wiki.git' +wiki_directory = '.\\wiki_static\\' +logfilename='log-get-wiki.txt' + + + + +# Add the directory containing your module to the Python path (wants absolute paths) +#sys.path.append(os.path.abspath(scriptpath)) +from api_items import get_mapped_items +# GetmMap of code items from api_items.py +mapped_wiki_inline_code = get_mapped_items() +#Add any additional mapped items that seem reasonable. +mapped_wiki_inline_code['getValue(ptr, type)']=':js:func:`getValue(ptr, type) `' +mapped_wiki_inline_code['setValue(ptr, value, type)']=':js:func:`setValue(ptr, value, type) `' +""" + +""" + + + + +wiki_temp_directory = wiki_directory + 'temp\\' +temp_set_of_codemarkup=set() +logfile=open(logfilename,'w') +snapshot_version_information='.. note:: This is a **snapshot** of the wiki: %s\n\n' % strftime("%a, %d %b %Y %H:%M", gmtime()) + + + +def CleanWiki(): + """ + Delete the wiki clone directory and all contained files. + """ + + def errorhandler(func, path, exc_info): + # where func is os.listdir, os.remove, or os.rmdir; path is the argument to that function that caused it to fail; and exc_info is a tuple returned by sys.exc_info() + print func + print path + print exc_info + os.chmod(path, stat.S_IWRITE) + os.remove(path) + + try: + shutil.rmtree(wiki_directory, ignore_errors=False, onerror=errorhandler) + print 'Old wiki clone removed' + except: + print 'No directory to clean found' + + + + +def CloneWiki(): + """ + Clone the wiki into a temporary location (first cleaning) + """ + # Clean up existing repo + CleanWiki() + + # Create directory for output and temporary files + try: + os.makedirs(wiki_directory) + os.makedirs(wiki_temp_directory) + print 'Created directory' + except: + pass + + + # Clone + git_clone_command = 'git clone %s %s' % (wiki_repo, wiki_temp_directory) + #print git_clone_command + os.system(git_clone_command) + + + +def ConvertFilesToRst(): + """ + Add template to specified page object (wikitools) + """ + indexfiletext='============================\nWiki snapshot (ready-for-review)\n============================\n\n%s\n.. toctree::\n :maxdepth: 2\n' % snapshot_version_information + for file in os.listdir(wiki_temp_directory): + if file.endswith(".md"): + print file + #get name of file + filenamestripped=file.replace('.md','') + indexfiletext+='\n %s' % filenamestripped + inputfilename=wiki_temp_directory+file + outputfilename=wiki_directory+filenamestripped+'.rst' + # + command='pandoc -f markdown -t rst -o %s %s' % (outputfilename,inputfilename) + print command + os.system(command) + title=filenamestripped.replace('-',' ') + #print title + logfile.write('title from filename: %s \n' % title) + #add import message to title + title+=' (wiki-import)' + length=len(title) + #print length + headerbar='' + for number in range(length): + headerbar+='=' + titlebar=headerbar+'\n'+title+'\n'+headerbar+'\n' + textinfile='' + # Add titlebar to start of the file (from the filename) + textinfile+=titlebar + # Add wiki snapshot information + + textinfile+=snapshot_version_information + + infile=open(outputfilename,'r') + + for line in infile: + textinfile+=line + infile.close() + #print textinfile + + outfile=open(outputfilename,'w') + outfile.write(textinfile) + outfile.close() + #write the index + outfile=open(wiki_directory+'index.rst','w') + outfile.write(indexfiletext) + outfile.close() + + +def FixupConvertedRstFiles(): + """ + Add template to specified page object (wikitools) + """ + + def fixInternalWikiLinks(aOldText): + """ + Fixes wiki links in [[linkname]] format by changing this to a document link in current directory. + """ + def fixwikilinks(matchobj): + #print 'matcobj0: %s' % matchobj.group(0) + #print 'matcobj1: %s' % matchobj.group(1) + linktext=matchobj.group(1) + linktext=linktext.replace(' ','-') + linktext=':doc:`%s`' % linktext + #print 'linkdoc: %s' % linktext + logfile.write('linkdoc: %s \n' % linktext) + return linktext + #print 'fixing wiki links' + return re.sub(r'\[\[(.+?)\]\]', fixwikilinks, aOldText) + + + def fixWikiCodeMarkupToCodeLinks(aOldText): + """ + Links "known" code objects if they are found in wiki markup. + """ + def fixcodemarkuplinks(matchobj): + #print 'Inline code: %s' % matchobj.group(0) + #print 'matcobj1: %s' % matchobj.group(1) + temp_set_of_codemarkup.add(matchobj.group(0)) + linktext=matchobj.group(1) + if linktext in mapped_wiki_inline_code: + logfile.write('Replace: %s \n' % mapped_wiki_inline_code[linktext]) + return mapped_wiki_inline_code[linktext] + + return matchobj.group(0) #linktext + #print 'fixing up code markup to code reference' + return re.sub(r'``(.+?)``', fixcodemarkuplinks, aOldText) + + + + for file in os.listdir(wiki_directory): + if file.endswith(".rst"): + input_file=wiki_directory+file + #print input_file + infile=open(input_file,'r') + + textinfile='' + for line in infile: + textinfile+=line + infile.close() + #print textinfile + + #fix up broken wiki-page links in files + textinfile=fixInternalWikiLinks(textinfile) + + #convert codemarkup to links if possible + textinfile=fixWikiCodeMarkupToCodeLinks(textinfile) + + + outfile=open(input_file,'w') + outfile.write(textinfile) + outfile.close() + + + logfile.write('\n\nCODE MARKUP THAT WONT BE LINKED (add entry to mapped_wiki_inline_code if one of these need to be linked. The tool get-api-items.py can be used to generate the list of the documented API items. \n') + for item in temp_set_of_codemarkup: + logfile.write('%s\n' % item) + + + +#parser options +parser = OptionParser(version="%prog 0.1.1", usage="Usage: %prog [options] version") +parser.add_option("-c", "--clonewiki", dest="clonewiki", default=True, help="Clean and clone the latest wiki") + + +(options, args) = parser.parse_args() + +print 'Clone wiki: %s' % options.clonewiki + +if options.clonewiki==True: + CloneWiki() + input= raw_input('CHECK ALL files were cloned! (look for "error: unable to create file" )\n') + +ConvertFilesToRst() +FixupConvertedRstFiles() +print 'See LOG for details: %s ' % logfilename + + +logfile.close() + + + diff --git a/site/source/home_page_layout.html b/site/source/home_page_layout.html new file mode 100644 index 0000000000000..0eaed3009584c --- /dev/null +++ b/site/source/home_page_layout.html @@ -0,0 +1,35 @@ +

    Compile native code to the web

    + +_images/Emscripten_logo_full.png + +

    Emscripten takes LLVM bytecode generated from C/C++ and compiles it into asm.js (a highly optimisable strict subset of JavaScript). This can be run on the web without plugins.

    + +
    + + + + +
    + +
    +

    Ready to get started? Download and install the SDK and then proceed to the Tutorial!

    +
    + + + + diff --git a/site/source/index.rst b/site/source/index.rst new file mode 100644 index 0000000000000..627d6d51580f9 --- /dev/null +++ b/site/source/index.rst @@ -0,0 +1,48 @@ +.. Emscripten documentation master file, created by + sphinx-quickstart on Tue Jul 01 09:20:29 2014. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +.. warning:: This site is still under construction. We've imported many of the topics from the `wiki `_, but many have still not been checked and are subject to change. What is great though, is that we've already create a lot of :doc:`/docs/api_reference/index` and cross-linked it in the imported pages. Over the next few days wiki pages that have been imported will be deleted from the wiki, and this document will become the "master copy". + +.. raw:: html + :file: home_page_layout.html + + +----- + +News +==== + +- `Unity `_ blogs about WebGL support and launches `two public demos `_ (April 29, 2014). There is `more information `_ on the Mozilla blog. +- The new :doc:`fastcomp/LLVM backend ` has been merged to master and is present in the latest SDK release. +- `Unreal Engine 4 `_ ported to the web using Emscripten (Mar 19, 2014 ). There is `more information `_ on the Mozilla blog. + + + + +.. toctree:: + :hidden: + + docs/getting_started/index + docs/contributing/index + docs/api_reference/index + wiki_static/index + deleteme_scratchpad + deleteme_sitechanges + + + + + + + +.. COMMENTS Scratchpad + This DOC Contents + .. contents:: Table of Contents + :ref:`genindex` **HamishW** This needs to be added to the sidebar + This page not yet designed. Thought is to include: + * Introduction + * Quickstart Signpost - with prominent link to "Getting Started" Tutorial + * Signposts for: News, Top Demos, Contibuting, Github Project + * (Possibly) Signposts to: Twitter feed, Github issues (new, resolved) \ No newline at end of file From 5903bb793cf1a980950f251796dd107810d6bd7a Mon Sep 17 00:00:00 2001 From: hamishwillee Date: Thu, 24 Jul 2014 21:17:16 +1000 Subject: [PATCH 27/37] add updated theme files --- .../breadcrumbs.html | 24 +- .../emscripten_sphinx_rtd_theme/footer.html | 84 +++- .../emscripten_sphinx_rtd_theme/layout.html | 65 ++- .../static/css/theme - prior to centering.css | 331 +++++++++++++ .../static/css/theme.css | 438 +++++++++++++++++- .../emscripten_sphinx_rtd_theme/theme.conf | 3 +- 6 files changed, 911 insertions(+), 34 deletions(-) create mode 100644 site/source/_themes/emscripten_sphinx_rtd_theme/static/css/theme - prior to centering.css diff --git a/site/source/_themes/emscripten_sphinx_rtd_theme/breadcrumbs.html b/site/source/_themes/emscripten_sphinx_rtd_theme/breadcrumbs.html index d9b29371ebcc1..605cb9d2f5848 100644 --- a/site/source/_themes/emscripten_sphinx_rtd_theme/breadcrumbs.html +++ b/site/source/_themes/emscripten_sphinx_rtd_theme/breadcrumbs.html @@ -1,19 +1,11 @@
    - -
    -
    + + + + \ No newline at end of file diff --git a/site/source/_themes/emscripten_sphinx_rtd_theme/footer.html b/site/source/_themes/emscripten_sphinx_rtd_theme/footer.html index 21a6b55d126a8..0f422e5f108f9 100644 --- a/site/source/_themes/emscripten_sphinx_rtd_theme/footer.html +++ b/site/source/_themes/emscripten_sphinx_rtd_theme/footer.html @@ -10,15 +10,86 @@ {% endif %} -
    + + + + + + + + -
    + + {% set footer_links = [ + ('docs/site/bug_reports', 'Report Bug', 'Report Bug'), + ('docs/site/emscripten_license', 'Licensing', 'Licensing'), + ('docs/contributing/contributing', 'Contributing', 'Contributing'), + ('https://groups.google.com/forum/#!forum/emscripten-discuss', 'Mailing list', 'Mailing list'), + ('https://github.com/kripken/emscripten/wiki', 'Wiki', 'Wiki'), + ('https://plus.google.com/100622854474489221138', 'Google+', 'Google+'), + ('docs/getting_started/release_notes', 'Release notes', 'Release notes'), + ('docs/site/blogs', 'Blogs', 'Blogs'), +] -%} + + + + + + + + + + + - - {% trans %}Sphinx theme provided by Read the Docs{% endtrans %} + + diff --git a/site/source/_themes/emscripten_sphinx_rtd_theme/layout.html b/site/source/_themes/emscripten_sphinx_rtd_theme/layout.html index 48b64f5966e97..175d7830c5153 100644 --- a/site/source/_themes/emscripten_sphinx_rtd_theme/layout.html +++ b/site/source/_themes/emscripten_sphinx_rtd_theme/layout.html @@ -6,7 +6,7 @@ {%- else %} {%- set titlesuffix = "" %} {%- endif %} - + @@ -77,17 +77,25 @@ + +
    +
    + + {# SIDE NAV, TOGGLES ON MOBILE #} - +
    {# MOBILE NAV, TRIGGLES SIDE NAV ON TOGGLE #} - + + {# PAGE CONTENT #}
    - {% include "breadcrumbs.html" %} + + + + + {% set navigation_bar = [ + ('docs/index', 'Docs', 'Documentation'), + ('docs/getting_started/downloads', 'SDK', 'Downloads'), + ('docs/getting_started/contact', 'Help', 'Contact'), + ('https://github.com/kripken/emscripten', 'Github', 'Github Project') +] -%} + + + + + + + + +
    {% block body %}{% endblock %}
    @@ -155,6 +202,6 @@ {% endif %} {%- block footer %} {% endblock %} - +
    diff --git a/site/source/_themes/emscripten_sphinx_rtd_theme/static/css/theme - prior to centering.css b/site/source/_themes/emscripten_sphinx_rtd_theme/static/css/theme - prior to centering.css new file mode 100644 index 0000000000000..cbffe01a2a2eb --- /dev/null +++ b/site/source/_themes/emscripten_sphinx_rtd_theme/static/css/theme - prior to centering.css @@ -0,0 +1,331 @@ +*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}[hidden]{display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:hover,a:active{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}blockquote{margin:0}dfn{font-style:italic}hr{display:block;height:1px;border:0;border-top:1px solid #ccc;margin:20px 0;padding:0}ins{background:#ff9;color:#000;text-decoration:none}mark{background:#ff0;color:#000;font-style:italic;font-weight:bold}pre,code,.rst-content tt,kbd,samp{font-family:monospace,serif;_font-family:"courier new",monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:before,q:after{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}ul,ol,dl{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure{margin:0}form{margin:0}fieldset{border:0;margin:0;padding:0}label{cursor:pointer}legend{border:0;*margin-left:-7px;padding:0;white-space:normal}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0;*width:13px;*height:13px}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top;resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:0.2em 0;background:#ccc;color:#000;padding:0.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none !important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{html,body,section{background:none !important}*{box-shadow:none !important;text-shadow:none !important;filter:none !important;-ms-filter:none !important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}} +.fa:before,.rst-content .admonition-title:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content dl dt .headerlink:before,.icon:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-alert,.rst-content .note,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .warning,.rst-content .seealso,.btn,input[type="text"],input[type="password"],input[type="email"],input[type="url"],input[type="date"],input[type="month"],input[type="time"],input[type="datetime"],input[type="datetime-local"],input[type="week"],input[type="number"],input[type="search"],input[type="tel"],input[type="color"],select,textarea,.wy-menu-vertical li.on a,.wy-menu-vertical li.current>a,.wy-side-nav-search>a,.wy-side-nav-search .wy-dropdown>a,.wy-nav-top a{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1} +.clearfix:before,.clearfix:after{display:table;content:""}.clearfix:after{clear:both}/*! + * Font Awesome 4.0.3 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url("../fonts/fontawesome-webfont.eot?v=4.0.3");src:url("../fonts/fontawesome-webfont.eot?#iefix&v=4.0.3") format("embedded-opentype"),url("../fonts/fontawesome-webfont.woff?v=4.0.3") format("woff"),url("../fonts/fontawesome-webfont.ttf?v=4.0.3") format("truetype"),url("../fonts/fontawesome-webfont.svg?v=4.0.3#fontawesomeregular") format("svg");font-weight:normal;font-style:normal}.fa,.rst-content .admonition-title,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink,.icon{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:0.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:0.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:solid 0.08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.rst-content .pull-left.admonition-title,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content dl dt .pull-left.headerlink,.pull-left.icon{margin-right:.3em}.fa.pull-right,.rst-content .pull-right.admonition-title,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content dl dt .pull-right.headerlink,.pull-right.icon{margin-left:.3em}.fa-spin{-webkit-animation:spin 2s infinite linear;-moz-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear}@-moz-keyframes spin{0%{-moz-transform:rotate(0deg)}100%{-moz-transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg)}}@-o-keyframes spin{0%{-o-transform:rotate(0deg)}100%{-o-transform:rotate(359deg)}}@-ms-keyframes spin{0%{-ms-transform:rotate(0deg)}100%{-ms-transform:rotate(359deg)}}@keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=$rotation);-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=$rotation);-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=$rotation);-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=$rotation);-webkit-transform:scale(-1, 1);-moz-transform:scale(-1, 1);-ms-transform:scale(-1, 1);-o-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=$rotation);-webkit-transform:scale(1, -1);-moz-transform:scale(1, -1);-ms-transform:scale(1, -1);-o-transform:scale(1, -1);transform:scale(1, -1)}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before,.icon-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before,.icon-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:"\f057"}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.rst-content .admonition-title:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before,.icon-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook:before{content:"\f09a"}.fa-github:before,.icon-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:"\f0a8"}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before,.icon-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before,.wy-dropdown .caret:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-asc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-desc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-reply-all:before{content:"\f122"}.fa-mail-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before,.icon-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa,.rst-content .admonition-title,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink,.icon,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context{font-family:inherit}.fa:before,.rst-content .admonition-title:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content dl dt .headerlink:before,.icon:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before{font-family:"FontAwesome";display:inline-block;font-style:normal;font-weight:normal;line-height:1;text-decoration:inherit}a .fa,a .rst-content .admonition-title,.rst-content a .admonition-title,a .rst-content h1 .headerlink,.rst-content h1 a .headerlink,a .rst-content h2 .headerlink,.rst-content h2 a .headerlink,a .rst-content h3 .headerlink,.rst-content h3 a .headerlink,a .rst-content h4 .headerlink,.rst-content h4 a .headerlink,a .rst-content h5 .headerlink,.rst-content h5 a .headerlink,a .rst-content h6 .headerlink,.rst-content h6 a .headerlink,a .rst-content dl dt .headerlink,.rst-content dl dt a .headerlink,a .icon{display:inline-block;text-decoration:inherit}.btn .fa,.btn .rst-content .admonition-title,.rst-content .btn .admonition-title,.btn .rst-content h1 .headerlink,.rst-content h1 .btn .headerlink,.btn .rst-content h2 .headerlink,.rst-content h2 .btn .headerlink,.btn .rst-content h3 .headerlink,.rst-content h3 .btn .headerlink,.btn .rst-content h4 .headerlink,.rst-content h4 .btn .headerlink,.btn .rst-content h5 .headerlink,.rst-content h5 .btn .headerlink,.btn .rst-content h6 .headerlink,.rst-content h6 .btn .headerlink,.btn .rst-content dl dt .headerlink,.rst-content dl dt .btn .headerlink,.btn .icon,.nav .fa,.nav .rst-content .admonition-title,.rst-content .nav .admonition-title,.nav .rst-content h1 .headerlink,.rst-content h1 .nav .headerlink,.nav .rst-content h2 .headerlink,.rst-content h2 .nav .headerlink,.nav .rst-content h3 .headerlink,.rst-content h3 .nav .headerlink,.nav .rst-content h4 .headerlink,.rst-content h4 .nav .headerlink,.nav .rst-content h5 .headerlink,.rst-content h5 .nav .headerlink,.nav .rst-content h6 .headerlink,.rst-content h6 .nav .headerlink,.nav .rst-content dl dt .headerlink,.rst-content dl dt .nav .headerlink,.nav .icon{display:inline}.btn .fa.fa-large,.btn .rst-content .fa-large.admonition-title,.rst-content .btn .fa-large.admonition-title,.btn .rst-content h1 .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.btn .rst-content dl dt .fa-large.headerlink,.rst-content dl dt .btn .fa-large.headerlink,.btn .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .fa-large.admonition-title,.rst-content .nav .fa-large.admonition-title,.nav .rst-content h1 .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.nav .rst-content dl dt .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.nav .fa-large.icon{line-height:0.9em}.btn .fa.fa-spin,.btn .rst-content .fa-spin.admonition-title,.rst-content .btn .fa-spin.admonition-title,.btn .rst-content h1 .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.btn .rst-content dl dt .fa-spin.headerlink,.rst-content dl dt .btn .fa-spin.headerlink,.btn .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .fa-spin.admonition-title,.rst-content .nav .fa-spin.admonition-title,.nav .rst-content h1 .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.nav .rst-content dl dt .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.nav .fa-spin.icon{display:inline-block}.btn.fa:before,.rst-content .btn.admonition-title:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content dl dt .btn.headerlink:before,.btn.icon:before{opacity:0.5;-webkit-transition:opacity 0.05s ease-in;-moz-transition:opacity 0.05s ease-in;transition:opacity 0.05s ease-in}.btn.fa:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.btn.icon:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .rst-content .admonition-title:before,.rst-content .btn-mini .admonition-title:before,.btn-mini .rst-content h1 .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.btn-mini .rst-content dl dt .headerlink:before,.rst-content dl dt .btn-mini .headerlink:before,.btn-mini .icon:before{font-size:14px;vertical-align:-15%}.wy-alert,.rst-content .note,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .warning,.rst-content .seealso{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.wy-alert-title,.rst-content .admonition-title{color:#fff;font-weight:bold;display:block;color:#fff;background:#6ab0de;margin:-12px;padding:6px 12px;margin-bottom:12px}.wy-alert.wy-alert-danger,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.rst-content .wy-alert-danger.seealso{background:#fdf3f2}.wy-alert.wy-alert-danger .wy-alert-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .danger .wy-alert-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .danger .admonition-title,.rst-content .error .admonition-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.seealso .admonition-title{background:#f29f97}.wy-alert.wy-alert-warning,.rst-content .wy-alert-warning.note,.rst-content .attention,.rst-content .caution,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.tip,.rst-content .warning,.rst-content .wy-alert-warning.seealso{background:#ffedcc}.wy-alert.wy-alert-warning .wy-alert-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .attention .wy-alert-title,.rst-content .caution .wy-alert-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .attention .admonition-title,.rst-content .caution .admonition-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .warning .admonition-title,.rst-content .wy-alert-warning.seealso .admonition-title{background:#f0b37e}.wy-alert.wy-alert-info,.rst-content .note,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.rst-content .seealso{background:#e7f2fa}.wy-alert.wy-alert-info .wy-alert-title,.rst-content .note .wy-alert-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .seealso .wy-alert-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.rst-content .note .admonition-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .seealso .admonition-title{background:#6ab0de}.wy-alert.wy-alert-success,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.warning,.rst-content .wy-alert-success.seealso{background:#dbfaf4}.wy-alert.wy-alert-success .wy-alert-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .hint .wy-alert-title,.rst-content .important .wy-alert-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .hint .admonition-title,.rst-content .important .admonition-title,.rst-content .tip .admonition-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.seealso .admonition-title{background:#1abc9c}.wy-alert.wy-alert-neutral,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.rst-content .wy-alert-neutral.seealso{background:#f3f6f6}.wy-alert.wy-alert-neutral .wy-alert-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.seealso .admonition-title{color:#404040;background:#e1e4e5}.wy-alert.wy-alert-neutral a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.rst-content .wy-alert-neutral.seealso a{color:#2980b9}.wy-alert p:last-child,.rst-content .note p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.rst-content .seealso p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0px;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,0.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:60px;overflow:hidden;-webkit-transition:all 0.3s ease-in;-moz-transition:all 0.3s ease-in;transition:all 0.3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:60px}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px 12px;color:#fff;border:1px solid rgba(0,0,0,0.1);background-color:#27ae60;text-decoration:none;font-weight:normal;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;box-shadow:0px 1px 2px -1px rgba(255,255,255,0.5) inset,0px -2px 0px 0px rgba(0,0,0,0.1) inset;outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all 0.1s linear;-moz-transition:all 0.1s linear;transition:all 0.1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:0px -1px 0px 0px rgba(0,0,0,0.05) inset,0px 2px 0px 0px rgba(0,0,0,0.1) inset;padding:8px 12px 6px 12px}.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:0.4;cursor:not-allowed;box-shadow:none}.btn-disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:0.4;cursor:not-allowed;box-shadow:none}.btn-disabled:hover,.btn-disabled:focus,.btn-disabled:active{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:0.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9 !important}.btn-info:hover{background-color:#2e8ece !important}.btn-neutral{background-color:#f3f6f6 !important;color:#404040 !important}.btn-neutral:hover{background-color:#e5ebeb !important;color:#404040}.btn-neutral:visited{color:#404040 !important}.btn-success{background-color:#27ae60 !important}.btn-success:hover{background-color:#295 !important}.btn-danger{background-color:#e74c3c !important}.btn-danger:hover{background-color:#ea6153 !important}.btn-warning{background-color:#e67e22 !important}.btn-warning:hover{background-color:#e98b39 !important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f !important}.btn-link{background-color:transparent !important;color:#2980b9;box-shadow:none;border-color:transparent !important}.btn-link:hover{background-color:transparent !important;color:#409ad5 !important;box-shadow:none}.btn-link:active{background-color:transparent !important;color:#409ad5 !important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:before,.wy-btn-group:after{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:solid 1px #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,0.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:solid 1px #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type="search"]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned input,.wy-form-aligned textarea,.wy-form-aligned select,.wy-form-aligned .wy-help-inline,.wy-form-aligned label{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:0.5em 1em 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:0.5em}fieldset{border:0;margin:0;padding:0}legend{display:block;width:100%;border:0;padding:0;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label{display:block;margin:0 0 0.3125em 0;color:#999;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;*zoom:1;max-width:68em;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:before,.wy-control-group:after{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group:before,.wy-control-group:after{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full input[type="text"],.wy-control-group .wy-form-full input[type="password"],.wy-control-group .wy-form-full input[type="email"],.wy-control-group .wy-form-full input[type="url"],.wy-control-group .wy-form-full input[type="date"],.wy-control-group .wy-form-full input[type="month"],.wy-control-group .wy-form-full input[type="time"],.wy-control-group .wy-form-full input[type="datetime"],.wy-control-group .wy-form-full input[type="datetime-local"],.wy-control-group .wy-form-full input[type="week"],.wy-control-group .wy-form-full input[type="number"],.wy-control-group .wy-form-full input[type="search"],.wy-control-group .wy-form-full input[type="tel"],.wy-control-group .wy-form-full input[type="color"],.wy-control-group .wy-form-halves input[type="text"],.wy-control-group .wy-form-halves input[type="password"],.wy-control-group .wy-form-halves input[type="email"],.wy-control-group .wy-form-halves input[type="url"],.wy-control-group .wy-form-halves input[type="date"],.wy-control-group .wy-form-halves input[type="month"],.wy-control-group .wy-form-halves input[type="time"],.wy-control-group .wy-form-halves input[type="datetime"],.wy-control-group .wy-form-halves input[type="datetime-local"],.wy-control-group .wy-form-halves input[type="week"],.wy-control-group .wy-form-halves input[type="number"],.wy-control-group .wy-form-halves input[type="search"],.wy-control-group .wy-form-halves input[type="tel"],.wy-control-group .wy-form-halves input[type="color"],.wy-control-group .wy-form-thirds input[type="text"],.wy-control-group .wy-form-thirds input[type="password"],.wy-control-group .wy-form-thirds input[type="email"],.wy-control-group .wy-form-thirds input[type="url"],.wy-control-group .wy-form-thirds input[type="date"],.wy-control-group .wy-form-thirds input[type="month"],.wy-control-group .wy-form-thirds input[type="time"],.wy-control-group .wy-form-thirds input[type="datetime"],.wy-control-group .wy-form-thirds input[type="datetime-local"],.wy-control-group .wy-form-thirds input[type="week"],.wy-control-group .wy-form-thirds input[type="number"],.wy-control-group .wy-form-thirds input[type="search"],.wy-control-group .wy-form-thirds input[type="tel"],.wy-control-group .wy-form-thirds input[type="color"]{width:100%}.wy-control-group .wy-form-full{display:block;float:left;margin-right:2.35765%;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{display:block;float:left;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child{margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(2n+1){clear:left}.wy-control-group .wy-form-thirds{display:block;float:left;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child{margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control{margin:0.5em 0 0 0;font-size:90%}.wy-control-group.fluid-input input[type="text"],.wy-control-group.fluid-input input[type="password"],.wy-control-group.fluid-input input[type="email"],.wy-control-group.fluid-input input[type="url"],.wy-control-group.fluid-input input[type="date"],.wy-control-group.fluid-input input[type="month"],.wy-control-group.fluid-input input[type="time"],.wy-control-group.fluid-input input[type="datetime"],.wy-control-group.fluid-input input[type="datetime-local"],.wy-control-group.fluid-input input[type="week"],.wy-control-group.fluid-input input[type="number"],.wy-control-group.fluid-input input[type="search"],.wy-control-group.fluid-input input[type="tel"],.wy-control-group.fluid-input input[type="color"]{width:100%}.wy-form-message-inline{display:inline-block;padding-left:0.3em;color:#666;vertical-align:middle;font-size:90%}.wy-form-message{display:block;color:#ccc;font-size:70%;margin-top:0.3125em;font-style:italic}input{line-height:normal}input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;*overflow:visible}input[type="text"],input[type="password"],input[type="email"],input[type="url"],input[type="date"],input[type="month"],input[type="time"],input[type="datetime"],input[type="datetime-local"],input[type="week"],input[type="number"],input[type="search"],input[type="tel"],input[type="color"]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border 0.3s linear;-moz-transition:border 0.3s linear;transition:border 0.3s linear}input[type="datetime-local"]{padding:0.34375em 0.625em}input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0;margin-right:0.3125em;*height:13px;*width:13px}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}input[type="text"]:focus,input[type="password"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus{outline:0;outline:thin dotted \9;border-color:#333}input.no-focus:focus{border-color:#ccc !important}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type="text"][disabled],input[type="password"][disabled],input[type="email"][disabled],input[type="url"][disabled],input[type="date"][disabled],input[type="month"][disabled],input[type="time"][disabled],input[type="datetime"][disabled],input[type="datetime-local"][disabled],input[type="week"][disabled],input[type="number"][disabled],input[type="search"][disabled],input[type="tel"][disabled],input[type="color"][disabled]{cursor:not-allowed;background-color:#f3f6f6;color:#cad2d3}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e74c3c}input[type="file"]:focus:invalid:focus,input[type="radio"]:focus:invalid:focus,input[type="checkbox"]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%}select,textarea{padding:0.5em 0.625em;display:inline-block;border:1px solid #ccc;font-size:0.8em;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border 0.3s linear;-moz-transition:border 0.3s linear;transition:border 0.3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#fff;color:#cad2d3;border-color:transparent}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{padding:6px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:solid 1px #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type="text"],.wy-control-group.wy-control-group-error input[type="password"],.wy-control-group.wy-control-group-error input[type="email"],.wy-control-group.wy-control-group-error input[type="url"],.wy-control-group.wy-control-group-error input[type="date"],.wy-control-group.wy-control-group-error input[type="month"],.wy-control-group.wy-control-group-error input[type="time"],.wy-control-group.wy-control-group-error input[type="datetime"],.wy-control-group.wy-control-group-error input[type="datetime-local"],.wy-control-group.wy-control-group-error input[type="week"],.wy-control-group.wy-control-group-error input[type="number"],.wy-control-group.wy-control-group-error input[type="search"],.wy-control-group.wy-control-group-error input[type="tel"],.wy-control-group.wy-control-group-error input[type="color"]{border:solid 1px #e74c3c}.wy-control-group.wy-control-group-error textarea{border:solid 1px #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:0.5em 0.625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width: 480px){.wy-form button[type="submit"]{margin:0.7em 0 0}.wy-form input[type="text"],.wy-form input[type="password"],.wy-form input[type="email"],.wy-form input[type="url"],.wy-form input[type="date"],.wy-form input[type="month"],.wy-form input[type="time"],.wy-form input[type="datetime"],.wy-form input[type="datetime-local"],.wy-form input[type="week"],.wy-form input[type="number"],.wy-form input[type="search"],.wy-form input[type="tel"],.wy-form input[type="color"]{margin-bottom:0.3em;display:block}.wy-form label{margin-bottom:0.3em;display:block}.wy-form input[type="password"],.wy-form input[type="email"],.wy-form input[type="url"],.wy-form input[type="date"],.wy-form input[type="month"],.wy-form input[type="time"],.wy-form input[type="datetime"],.wy-form input[type="datetime-local"],.wy-form input[type="week"],.wy-form input[type="number"],.wy-form input[type="search"],.wy-form input[type="tel"],.wy-form input[type="color"]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:0.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0 0}.wy-form .wy-help-inline,.wy-form-message-inline,.wy-form-message{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width: 768px){.tablet-hide{display:none}}@media screen and (max-width: 480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.wy-table,.rst-content table.docutils,.rst-content table.field-list{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.wy-table caption,.rst-content table.docutils caption,.rst-content table.field-list caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.wy-table td,.rst-content table.docutils td,.rst-content table.field-list td,.wy-table th,.rst-content table.docutils th,.rst-content table.field-list th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.wy-table td:first-child,.rst-content table.docutils td:first-child,.rst-content table.field-list td:first-child,.wy-table th:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list th:first-child{border-left-width:0}.wy-table thead,.rst-content table.docutils thead,.rst-content table.field-list thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.wy-table thead th,.rst-content table.docutils thead th,.rst-content table.field-list thead th{font-weight:bold;border-bottom:solid 2px #e1e4e5}.wy-table td,.rst-content table.docutils td,.rst-content table.field-list td{background-color:transparent;vertical-align:middle}.wy-table td p,.rst-content table.docutils td p,.rst-content table.field-list td p{line-height:18px;margin-bottom:0}.wy-table .wy-table-cell-min,.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min{width:1%;padding-right:0}.wy-table .wy-table-cell-min input[type=checkbox],.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox],.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:gray;font-size:90%}.wy-table-tertiary{color:gray;font-size:80%}.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td,.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td{background-color:#f3f6f6}.wy-table-backed{background-color:#f3f6f6}.wy-table-bordered-all,.rst-content table.docutils{border:1px solid #e1e4e5}.wy-table-bordered-all td,.rst-content table.docutils td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.wy-table-bordered-all tbody>tr:last-child td,.rst-content table.docutils tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px 0;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0 !important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%;overflow-x:hidden}body{font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;font-weight:normal;color:#404040;min-height:100%;overflow-x:hidden;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22 !important}a.wy-text-warning:hover{color:#eb9950 !important}.wy-text-info{color:#2980b9 !important}a.wy-text-info:hover{color:#409ad5 !important}.wy-text-success{color:#27ae60 !important}a.wy-text-success:hover{color:#36d278 !important}.wy-text-danger{color:#e74c3c !important}a.wy-text-danger:hover{color:#ed7669 !important}.wy-text-neutral{color:#404040 !important}a.wy-text-neutral:hover{color:#595959 !important}h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:"Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif}p{line-height:24px;margin:0;font-size:16px;margin-bottom:24px}h1{font-size:175%}h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}code,.rst-content tt{white-space:nowrap;max-width:100%;background:#fff;border:solid 1px #e1e4e5;font-size:75%;padding:0 5px;font-family:"Incosolata","Consolata","Monaco",monospace;color:#e74c3c;overflow-x:auto}code.code-large,.rst-content tt.code-large{font-size:90%}.wy-plain-list-disc,.rst-content .section ul,.rst-content .toctree-wrapper ul,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.wy-plain-list-disc li,.rst-content .section ul li,.rst-content .toctree-wrapper ul li,article ul li{list-style:disc;margin-left:24px}.wy-plain-list-disc li ul,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li ul,article ul li ul{margin-bottom:0}.wy-plain-list-disc li li,.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,article ul li li{list-style:circle}.wy-plain-list-disc li li li,.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,article ul li li li{list-style:square}.wy-plain-list-decimal,.rst-content .section ol,.rst-content ol.arabic,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.wy-plain-list-decimal li,.rst-content .section ol li,.rst-content ol.arabic li,article ol li{list-style:decimal;margin-left:24px}.codeblock-example{border:1px solid #e1e4e5;border-bottom:none;padding:24px;padding-top:48px;font-weight:500;background:#fff;position:relative}.codeblock-example:after{content:"Example";position:absolute;top:0px;left:0px;background:#9b59b6;color:#fff;padding:6px 12px}.codeblock-example.prettyprint-example-only{border:1px solid #e1e4e5;margin-bottom:24px}.codeblock,pre.literal-block,.rst-content .literal-block,.rst-content pre.literal-block,div[class^='highlight']{border:1px solid #e1e4e5;padding:0px;overflow-x:auto;background:#fff;margin:1px 0 24px 0}.codeblock div[class^='highlight'],pre.literal-block div[class^='highlight'],.rst-content .literal-block div[class^='highlight'],div[class^='highlight'] div[class^='highlight']{border:none;background:none;margin:0}div[class^='highlight'] td.code{width:100%}.linenodiv pre{border-right:solid 1px #e6e9ea;margin:0;padding:12px 12px;font-family:"Incosolata","Consolata","Monaco",monospace;font-size:12px;line-height:1.5;color:#d9d9d9}div[class^='highlight'] pre{white-space:pre;margin:0;padding:12px 12px;font-family:"Incosolata","Consolata","Monaco",monospace;font-size:12px;line-height:1.5;display:block;overflow:auto;color:#404040}@media print{.codeblock,pre.literal-block,.rst-content .literal-block,.rst-content pre.literal-block,div[class^='highlight'],div[class^='highlight'] pre{white-space:pre-wrap}}.hll{background-color:#ffc;margin:0 -12px;padding:0 12px;display:block}.c{color:#998;font-style:italic}.err{color:#a61717;background-color:#e3d2d2}.k{font-weight:bold}.o{font-weight:bold}.cm{color:#998;font-style:italic}.cp{color:#999;font-weight:bold}.c1{color:#998;font-style:italic}.cs{color:#999;font-weight:bold;font-style:italic}.gd{color:#000;background-color:#fdd}.gd .x{color:#000;background-color:#faa}.ge{font-style:italic}.gr{color:#a00}.gh{color:#999}.gi{color:#000;background-color:#dfd}.gi .x{color:#000;background-color:#afa}.go{color:#888}.gp{color:#555}.gs{font-weight:bold}.gu{color:purple;font-weight:bold}.gt{color:#a00}.kc{font-weight:bold}.kd{font-weight:bold}.kn{font-weight:bold}.kp{font-weight:bold}.kr{font-weight:bold}.kt{color:#458;font-weight:bold}.m{color:#099}.s{color:#d14}.n{color:#333}.na{color:teal}.nb{color:#0086b3}.nc{color:#458;font-weight:bold}.no{color:teal}.ni{color:purple}.ne{color:#900;font-weight:bold}.nf{color:#900;font-weight:bold}.nn{color:#555}.nt{color:navy}.nv{color:teal}.ow{font-weight:bold}.w{color:#bbb}.mf{color:#099}.mh{color:#099}.mi{color:#099}.mo{color:#099}.sb{color:#d14}.sc{color:#d14}.sd{color:#d14}.s2{color:#d14}.se{color:#d14}.sh{color:#d14}.si{color:#d14}.sx{color:#d14}.sr{color:#009926}.s1{color:#d14}.ss{color:#990073}.bp{color:#999}.vc{color:teal}.vg{color:teal}.vi{color:teal}.il{color:#099}.gc{color:#999;background-color:#eaf2f5} + .wy-breadcrumbs li{display:inline-block} + .wy-breadcrumbs li.wy-breadcrumbs-aside { + float:right; + padding-left:5px; + font-size:0.8em; + } + + .wy-breadcrumbs li a{ + display:inline-block;padding:5px + } + + .wy-breadcrumbs li a:first-child{padding-left:0}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block} + + @media screen and (max-width: 480px) + {.wy-breadcrumbs-extra{display:none}.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:before,.wy-menu-horiz:after{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz ul,.wy-menu-horiz li{display:inline-block}.wy-menu-horiz li:hover{background:rgba(255,255,255,0.1)}.wy-menu-horiz li.divide-left{border-left:solid 1px #404040}.wy-menu-horiz li.divide-right{border-right:solid 1px #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical header{height:32px;display:inline-block;line-height:32px;padding:0 1.618em;display:block;font-weight:bold;text-transform:uppercase;font-size:80%;color:#2980b9;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:solid 1px #404040}.wy-menu-vertical li.divide-bottom{border-bottom:solid 1px #404040}.wy-menu-vertical li.current{background:#e3e3e3} + + .wy-menu-vertical li.current a{ + color:gray; + border-right:solid 1px #c9c9c9; + padding:0.4045em 2.427em + } + + .wy-menu-vertical li.current a:hover{background:#d6d6d6} + + .wy-menu-vertical li.on a { + color:#404040; + padding:0.4045em 1.618em; + font-weight:bold; + position:relative; + background:#fcfcfc; + border:none; + border-bottom:solid 1px #c9c9c9; + border-top:solid 1px #c9c9c9; + padding-left:1.618em -4px + } + + +.wy-menu-vertical li.current>a { + color:#404040; + padding:0.4045em 1.618em; + font-weight:bold; + position:relative; + background:#fcfcfc; + border:none; + border-bottom:solid 1px #c9c9c9; + border-top:solid 1px #c9c9c9; + padding-left:1.618em -4px + } + + .wy-menu-vertical li.on a:hover,.wy-menu-vertical li.current>a:hover{background:#fcfcfc} + .wy-menu-vertical li.toctree-l2.current>a{background:#c9c9c9;padding:0.4045em 2.427em}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical .local-toc li ul{display:block}.wy-menu-vertical li ul li a{margin-bottom:0;color:#b3b3b3;font-weight:normal}.wy-menu-vertical a{display:inline-block;line-height:18px;padding:0.4045em 1.618em;display:block;position:relative;font-size:90%;color:#b3b3b3}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff} + + .wy-side-nav-search {z-index:200; + background-color:#2980b9; + text-align:center; + /* padding:0.809em; */ + /* padding-top: 0.809em;*/ + padding-right: 0.809em; + padding-bottom: 0.809em; + padding-left: 0.809em; + display:block; + color:#fcfcfc; + margin-bottom:0.809em + } + + .wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4} + + + .wy-side-nav-search img{ + display:block; + margin:auto auto 0.809em auto; + /*height:45px;*/ + /*width:45px;*/ + width:200px; + /*background-color:#2980b9;*/ + padding:5px; + /*border-radius:100%*/ + } + + .wy-side-nav-search>a,.wy-side-nav-search .wy-dropdown>a { + color:#fcfcfc; + font-size:100%; + font-weight:bold; + display:inline-block; + padding-top: 4px; + padding-right: 6px; + /*padding-bottom: 4px;*/ + padding-left: 6px; + /* margin-bottom:0.809em */ + } + + .wy-side-nav-search>a:hover,.wy-side-nav-search .wy-dropdown>a:hover{background:rgba(255,255,255,0.1)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all 0.2s ease-in;-moz-transition:all 0.2s ease-in;transition:all 0.2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:left repeat-y #fcfcfc;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoxOERBMTRGRDBFMUUxMUUzODUwMkJCOThDMEVFNURFMCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoxOERBMTRGRTBFMUUxMUUzODUwMkJCOThDMEVFNURFMCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjE4REExNEZCMEUxRTExRTM4NTAyQkI5OEMwRUU1REUwIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjE4REExNEZDMEUxRTExRTM4NTAyQkI5OEMwRUU1REUwIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+EwrlwAAAAA5JREFUeNpiMDU0BAgwAAE2AJgB9BnaAAAAAElFTkSuQmCC);background-size:300px 1px}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:absolute;top:0;left:0;width:300px;overflow:hidden;min-height:100%;background:#343131;z-index:200} + + .wy-nav-top{ + display:none; + background:#2980b9; + color:#fff; + padding:0.4045em 0.809em; + position:relative; + line-height:50px; + text-align:center; + font-size:100%; + *zoom:1} + + .wy-nav-top:before,.wy-nav-top:after{display:table;content:""} + + .wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:bold} + + .wy-nav-top img{ + margin-right:12px; + /*height:45px; */ + /*width:45px;*/ + width:200px; + background-color:#2980b9; + padding:5px; + /*border-radius:100%*/ + } + + .wy-nav-top i{font-size:30px;float:left;cursor:pointer}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%} + + .wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,0.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:#999}footer p{margin-bottom:12px}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:before,.rst-footer-buttons:after{display:table;content:""}.rst-footer-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:solid 1px #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:solid 1px #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:gray;font-size:90%}@media screen and (max-width: 768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width: 1400px){.wy-nav-content-wrap{background:rgba(0,0,0,0.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.wy-nav-side{display:none}.wy-nav-content-wrap{margin-left:0}}nav.stickynav{position:absolute/* previously fixed hamishw */ ;top:0}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;border-top:solid 10px #343131;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:before,.rst-versions .rst-current-version:after{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .icon{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:gray;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:solid 1px #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px}.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge .rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width: 768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}img{width:100%;height:auto}}.rst-content img{max-width:100%;height:auto !important}.rst-content div.figure{margin-bottom:24px}.rst-content div.figure.align-center{text-align:center}.rst-content .section>img{margin-bottom:24px}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content .note .last,.rst-content .attention .last,.rst-content .caution .last,.rst-content .danger .last,.rst-content .error .last,.rst-content .hint .last,.rst-content .important .last,.rst-content .tip .last,.rst-content .warning .last,.rst-content .seealso .last{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,0.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent !important;border-color:rgba(0,0,0,0.1) !important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha li{list-style:upper-alpha}.rst-content .section ol p,.rst-content .section ul p{margin-bottom:12px}.rst-content .line-block{margin-left:24px}.rst-content .topic-title{font-weight:bold;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0px 0px 24px 24px}.rst-content .align-left{float:left;margin:0px 24px 24px 0px}.rst-content .align-center{margin:auto;display:block}.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink{display:none;visibility:hidden;font-size:14px}.rst-content h1 .headerlink:after,.rst-content h2 .headerlink:after,.rst-content h3 .headerlink:after,.rst-content h4 .headerlink:after,.rst-content h5 .headerlink:after,.rst-content h6 .headerlink:after,.rst-content dl dt .headerlink:after{visibility:visible;content:"\f0c1";font-family:FontAwesome;display:inline-block}.rst-content h1:hover .headerlink,.rst-content h2:hover .headerlink,.rst-content h3:hover .headerlink,.rst-content h4:hover .headerlink,.rst-content h5:hover .headerlink,.rst-content h6:hover .headerlink,.rst-content dl dt:hover .headerlink{display:inline-block}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:solid 1px #e1e4e5}.rst-content .sidebar p,.rst-content .sidebar ul,.rst-content .sidebar dl{font-size:90%}.rst-content .sidebar .last{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:"Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif;font-weight:bold;background:#e1e4e5;padding:6px 12px;margin:-24px;margin-bottom:24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;display:inline-block;font-weight:bold;padding:0 6px}.rst-content .footnote-reference,.rst-content .citation-reference{vertical-align:super;font-size:90%}.rst-content table.docutils.citation,.rst-content table.docutils.footnote{background:none;border:none;color:#999}.rst-content table.docutils.citation td,.rst-content table.docutils.citation tr,.rst-content table.docutils.footnote td,.rst-content table.docutils.footnote tr{border:none;background-color:transparent !important;white-space:normal}.rst-content table.docutils.citation td.label,.rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}.rst-content table.field-list{border:none}.rst-content table.field-list td{border:none;padding-top:5px}.rst-content table.field-list td>strong{display:inline-block;margin-top:3px}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left;padding-left:0}.rst-content tt{color:#000}.rst-content tt big,.rst-content tt em{font-size:100% !important;line-height:normal}.rst-content tt .xref,a .rst-content tt{font-weight:bold}.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:bold}.rst-content dl p,.rst-content dl table,.rst-content dl ul,.rst-content dl ol{margin-bottom:12px !important}.rst-content dl dd{margin:0 0 12px 24px}.rst-content dl:not(.docutils){margin-bottom:24px}.rst-content dl:not(.docutils) dt{display:inline-block;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:solid 3px #6ab0de;padding:6px;position:relative}.rst-content dl:not(.docutils) dt:before{color:#6ab0de}.rst-content dl:not(.docutils) dt .headerlink{color:#404040;font-size:100% !important}.rst-content dl:not(.docutils) dl dt{margin-bottom:6px;border:none;border-left:solid 3px #ccc;background:#f0f0f0;color:gray}.rst-content dl:not(.docutils) dl dt .headerlink{color:#404040;font-size:100% !important}.rst-content dl:not(.docutils) dt:first-child{margin-top:0}.rst-content dl:not(.docutils) tt{font-weight:bold}.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) tt.descclassname{background-color:transparent;border:none;padding:0;font-size:100% !important}.rst-content dl:not(.docutils) tt.descname{font-weight:bold}.rst-content dl:not(.docutils) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:bold}.rst-content dl:not(.docutils) .property{display:inline-block;padding-right:8px}.rst-content .viewcode-link,.rst-content .viewcode-back{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}@media screen and (max-width: 480px){.rst-content .sidebar{width:100%}}span[id*='MathJax-Span']{color:#404040} +/*! + * HamishW - some CSS for nav bar + */ + +.main-nav-bar { + display:block; + max-width: 1100px; + border-bottom: solid; + border-bottom-width: thin; + padding-bottom: 10px; + margin-bottom:20px; +} + + +#menu-options { + display: table; + background-color:#F8F8F8; + /*height: 87px;*/ + width: 100%; +} + +#menu-options li { + display: table-cell; + padding-left: 5px; + padding-right: 5px; + padding-top: 10px; + padding-bottom: 10px; + width: 5.0%; /*(100 / numItems)% */ + text-align: center; + font-weight:bold; + /*background: #ddd;*/ + white-space: nowrap; +}​ + + + +.navlink-long { + display:inline-block; + vertical-align: top; + padding:5px; +} + +.navlink-short { + display:none; + vertical-align: top; + padding:5px; +} + + +.footer-nav-bar { + display:block; + background-color:#F8F8F8; + max-width: 1100px; + /*border-bottom: solid;*/ + padding-bottom: 10px; + margin-top:15px; + border-top:solid; + /* border-top-width:thin; */ +} + +.footer-options { +/* display:block; +width:inherit; +font-size:0.8em; +font-weight:normal; +*/ +display:block; +text-align:justify; +font-size:0.8em; +width:inherit; +} + +.footer-navlink-long { + display: inline-block; + vertical-align: top; + padding:5px; +} + +.footer-navlink-short { + display:none; + padding:5px; +} + +.footer-options:after { + content: ""; + width: 100%; + line-height:1px; + line-spacing:1px; + display: inline-block; + } + +.copyright-box { + border-top:solid; + border-top-width:thin; + margin-top:10px; + background-color:#F8F8F8; + padding-bottom:5px; + +} + +.copyright-box p { + font-size:0.8em; +} + + +/* HamishW - some CSS for the breadcrumb (make elements inline blocks) */ + + +.breadcrumb-box { + margin-top:10px; + font-size:0.8em; + } + +.breadcrumb-box-item{ + display: inline-block; + } + +/* indent third level item +*/ + +/* set background to selected headings as dark */ + + +.wy-menu-vertical li.toctree-l2.current>a, +.wy-menu-vertical li.toctree-l2.current li.toctree-l3.current>a, +.wy-menu-vertical li.toctree-l2.current li.toctree-l3.current li.toctree-l4.current>a +.wy-menu-vertical li.toctree-l2.current li.toctree-l3.current li.toctree-l4.current li.toctree-l5.current>a + { +background: #c9c9c9; +} + + +/* .wy-menu-vertical li.current>a .wy-menu-vertical .current>a */ +/* +.wy-menu-vertical li.current>a { +background: purple; +} +*/ + +.wy-menu-vertical li.toctree-l2 li.toctree-l3>a { +display:none; +} + +.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a { +display:block; +font-size:0.8em; +/*padding-top: 0.4045em;*/ +padding-right: 2.427em; +padding-bottom: 0.4045em; +padding-left: 4.25em; +width:100%; +} + + + + +.wy-menu-vertical li.toctree-l2 li.toctree-l3 li.toctree-l4>a { +display:none; +} + +.wy-menu-vertical li.toctree-l2.current li.toctree-l3.current li.toctree-l4>a { +/* +background: #F0EEEE; +background: purple; */ +display:block; +font-size:0.8em; +/*padding-top: 0.4045em;*/ +padding-right: 2.427em; +padding-bottom: 0.4045em; +padding-left: 5.0em; +width:100%; +} + + { +background: #c9c9c9; +} + +.wy-menu-vertical a[href^="#"] { +background:#F0EEEE; +} + + +@media only screen +and (max-width : 480px) { +/* Styles */ + .navlink-long, .footer-navlink-long { + display:none; + } + + .navlink-short, .footer-navlink-short { + display:inline-block; + vertical-align: top;} + +} + +@media screen and (min-width: 480px) and (max-width: 768px) { + .navlink-long, .footer-navlink-long { + display:inline-block; + } + .navlink-short, .footer-navlink-short { + display:none; + } +} + diff --git a/site/source/_themes/emscripten_sphinx_rtd_theme/static/css/theme.css b/site/source/_themes/emscripten_sphinx_rtd_theme/static/css/theme.css index f595aab864dcd..ec711b0bedfd9 100644 --- a/site/source/_themes/emscripten_sphinx_rtd_theme/static/css/theme.css +++ b/site/source/_themes/emscripten_sphinx_rtd_theme/static/css/theme.css @@ -1,4 +1,438 @@ -*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}[hidden]{display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:hover,a:active{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}blockquote{margin:0}dfn{font-style:italic}hr{display:block;height:1px;border:0;border-top:1px solid #ccc;margin:20px 0;padding:0}ins{background:#ff9;color:#000;text-decoration:none}mark{background:#ff0;color:#000;font-style:italic;font-weight:bold}pre,code,.rst-content tt,kbd,samp{font-family:monospace,serif;_font-family:"courier new",monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:before,q:after{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}ul,ol,dl{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure{margin:0}form{margin:0}fieldset{border:0;margin:0;padding:0}label{cursor:pointer}legend{border:0;*margin-left:-7px;padding:0;white-space:normal}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0;*width:13px;*height:13px}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top;resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:0.2em 0;background:#ccc;color:#000;padding:0.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none !important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{html,body,section{background:none !important}*{box-shadow:none !important;text-shadow:none !important;filter:none !important;-ms-filter:none !important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}.fa:before,.rst-content .admonition-title:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content dl dt .headerlink:before,.icon:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-alert,.rst-content .note,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .warning,.rst-content .seealso,.btn,input[type="text"],input[type="password"],input[type="email"],input[type="url"],input[type="date"],input[type="month"],input[type="time"],input[type="datetime"],input[type="datetime-local"],input[type="week"],input[type="number"],input[type="search"],input[type="tel"],input[type="color"],select,textarea,.wy-menu-vertical li.on a,.wy-menu-vertical li.current>a,.wy-side-nav-search>a,.wy-side-nav-search .wy-dropdown>a,.wy-nav-top a{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:""}.clearfix:after{clear:both}/*! +*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}[hidden]{display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%} + +body{margin:0}a:hover,a:active{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}blockquote{margin:0}dfn{font-style:italic}hr{display:block;height:1px;border:0;border-top:1px solid #ccc;margin:20px 0;padding:0}ins{background:#ff9;color:#000;text-decoration:none}mark{background:#ff0;color:#000;font-style:italic;font-weight:bold}pre,code,.rst-content tt,kbd,samp{font-family:monospace,serif;_font-family:"courier new",monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:before,q:after{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}ul,ol,dl{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure{margin:0}form{margin:0}fieldset{border:0;margin:0;padding:0}label{cursor:pointer}legend{border:0;*margin-left:-7px;padding:0;white-space:normal}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0;*width:13px;*height:13px}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top;resize:vertical} +table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:0.2em 0;background:#ccc;color:#000;padding:0.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none !important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{html,body,section{background:none !important}*{box-shadow:none !important;text-shadow:none !important;filter:none !important;-ms-filter:none !important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}} +.fa:before,.rst-content .admonition-title:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content dl dt .headerlink:before,.icon:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-alert,.rst-content .note,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .warning,.rst-content .seealso,.btn,input[type="text"],input[type="password"],input[type="email"],input[type="url"],input[type="date"],input[type="month"],input[type="time"],input[type="datetime"],input[type="datetime-local"],input[type="week"],input[type="number"],input[type="search"],input[type="tel"],input[type="color"],select,textarea,.wy-menu-vertical li.on a,.wy-menu-vertical li.current>a,.wy-side-nav-search>a,.wy-side-nav-search .wy-dropdown>a,.wy-nav-top a{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1} +.clearfix:before,.clearfix:after{display:table;content:""}.clearfix:after{clear:both}/*! * Font Awesome 4.0.3 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */@font-face{font-family:'FontAwesome';src:url("../fonts/fontawesome-webfont.eot?v=4.0.3");src:url("../fonts/fontawesome-webfont.eot?#iefix&v=4.0.3") format("embedded-opentype"),url("../fonts/fontawesome-webfont.woff?v=4.0.3") format("woff"),url("../fonts/fontawesome-webfont.ttf?v=4.0.3") format("truetype"),url("../fonts/fontawesome-webfont.svg?v=4.0.3#fontawesomeregular") format("svg");font-weight:normal;font-style:normal}.fa,.rst-content .admonition-title,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink,.icon{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:0.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:0.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:solid 0.08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.rst-content .pull-left.admonition-title,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content dl dt .pull-left.headerlink,.pull-left.icon{margin-right:.3em}.fa.pull-right,.rst-content .pull-right.admonition-title,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content dl dt .pull-right.headerlink,.pull-right.icon{margin-left:.3em}.fa-spin{-webkit-animation:spin 2s infinite linear;-moz-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear}@-moz-keyframes spin{0%{-moz-transform:rotate(0deg)}100%{-moz-transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg)}}@-o-keyframes spin{0%{-o-transform:rotate(0deg)}100%{-o-transform:rotate(359deg)}}@-ms-keyframes spin{0%{-ms-transform:rotate(0deg)}100%{-ms-transform:rotate(359deg)}}@keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=$rotation);-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=$rotation);-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=$rotation);-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=$rotation);-webkit-transform:scale(-1, 1);-moz-transform:scale(-1, 1);-ms-transform:scale(-1, 1);-o-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=$rotation);-webkit-transform:scale(1, -1);-moz-transform:scale(1, -1);-ms-transform:scale(1, -1);-o-transform:scale(1, -1);transform:scale(1, -1)}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before,.icon-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before,.icon-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:"\f057"}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.rst-content .admonition-title:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before,.icon-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook:before{content:"\f09a"}.fa-github:before,.icon-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:"\f0a8"}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before,.icon-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before,.wy-dropdown .caret:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-asc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-desc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-reply-all:before{content:"\f122"}.fa-mail-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before,.icon-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa,.rst-content .admonition-title,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink,.icon,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context{font-family:inherit}.fa:before,.rst-content .admonition-title:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content dl dt .headerlink:before,.icon:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before{font-family:"FontAwesome";display:inline-block;font-style:normal;font-weight:normal;line-height:1;text-decoration:inherit}a .fa,a .rst-content .admonition-title,.rst-content a .admonition-title,a .rst-content h1 .headerlink,.rst-content h1 a .headerlink,a .rst-content h2 .headerlink,.rst-content h2 a .headerlink,a .rst-content h3 .headerlink,.rst-content h3 a .headerlink,a .rst-content h4 .headerlink,.rst-content h4 a .headerlink,a .rst-content h5 .headerlink,.rst-content h5 a .headerlink,a .rst-content h6 .headerlink,.rst-content h6 a .headerlink,a .rst-content dl dt .headerlink,.rst-content dl dt a .headerlink,a .icon{display:inline-block;text-decoration:inherit}.btn .fa,.btn .rst-content .admonition-title,.rst-content .btn .admonition-title,.btn .rst-content h1 .headerlink,.rst-content h1 .btn .headerlink,.btn .rst-content h2 .headerlink,.rst-content h2 .btn .headerlink,.btn .rst-content h3 .headerlink,.rst-content h3 .btn .headerlink,.btn .rst-content h4 .headerlink,.rst-content h4 .btn .headerlink,.btn .rst-content h5 .headerlink,.rst-content h5 .btn .headerlink,.btn .rst-content h6 .headerlink,.rst-content h6 .btn .headerlink,.btn .rst-content dl dt .headerlink,.rst-content dl dt .btn .headerlink,.btn .icon,.nav .fa,.nav .rst-content .admonition-title,.rst-content .nav .admonition-title,.nav .rst-content h1 .headerlink,.rst-content h1 .nav .headerlink,.nav .rst-content h2 .headerlink,.rst-content h2 .nav .headerlink,.nav .rst-content h3 .headerlink,.rst-content h3 .nav .headerlink,.nav .rst-content h4 .headerlink,.rst-content h4 .nav .headerlink,.nav .rst-content h5 .headerlink,.rst-content h5 .nav .headerlink,.nav .rst-content h6 .headerlink,.rst-content h6 .nav .headerlink,.nav .rst-content dl dt .headerlink,.rst-content dl dt .nav .headerlink,.nav .icon{display:inline}.btn .fa.fa-large,.btn .rst-content .fa-large.admonition-title,.rst-content .btn .fa-large.admonition-title,.btn .rst-content h1 .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.btn .rst-content dl dt .fa-large.headerlink,.rst-content dl dt .btn .fa-large.headerlink,.btn .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .fa-large.admonition-title,.rst-content .nav .fa-large.admonition-title,.nav .rst-content h1 .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.nav .rst-content dl dt .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.nav .fa-large.icon{line-height:0.9em}.btn .fa.fa-spin,.btn .rst-content .fa-spin.admonition-title,.rst-content .btn .fa-spin.admonition-title,.btn .rst-content h1 .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.btn .rst-content dl dt .fa-spin.headerlink,.rst-content dl dt .btn .fa-spin.headerlink,.btn .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .fa-spin.admonition-title,.rst-content .nav .fa-spin.admonition-title,.nav .rst-content h1 .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.nav .rst-content dl dt .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.nav .fa-spin.icon{display:inline-block}.btn.fa:before,.rst-content .btn.admonition-title:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content dl dt .btn.headerlink:before,.btn.icon:before{opacity:0.5;-webkit-transition:opacity 0.05s ease-in;-moz-transition:opacity 0.05s ease-in;transition:opacity 0.05s ease-in}.btn.fa:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.btn.icon:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .rst-content .admonition-title:before,.rst-content .btn-mini .admonition-title:before,.btn-mini .rst-content h1 .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.btn-mini .rst-content dl dt .headerlink:before,.rst-content dl dt .btn-mini .headerlink:before,.btn-mini .icon:before{font-size:14px;vertical-align:-15%}.wy-alert,.rst-content .note,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .warning,.rst-content .seealso{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.wy-alert-title,.rst-content .admonition-title{color:#fff;font-weight:bold;display:block;color:#fff;background:#6ab0de;margin:-12px;padding:6px 12px;margin-bottom:12px}.wy-alert.wy-alert-danger,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.rst-content .wy-alert-danger.seealso{background:#fdf3f2}.wy-alert.wy-alert-danger .wy-alert-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .danger .wy-alert-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .danger .admonition-title,.rst-content .error .admonition-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.seealso .admonition-title{background:#f29f97}.wy-alert.wy-alert-warning,.rst-content .wy-alert-warning.note,.rst-content .attention,.rst-content .caution,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.tip,.rst-content .warning,.rst-content .wy-alert-warning.seealso{background:#ffedcc}.wy-alert.wy-alert-warning .wy-alert-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .attention .wy-alert-title,.rst-content .caution .wy-alert-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .attention .admonition-title,.rst-content .caution .admonition-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .warning .admonition-title,.rst-content .wy-alert-warning.seealso .admonition-title{background:#f0b37e}.wy-alert.wy-alert-info,.rst-content .note,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.rst-content .seealso{background:#e7f2fa}.wy-alert.wy-alert-info .wy-alert-title,.rst-content .note .wy-alert-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .seealso .wy-alert-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.rst-content .note .admonition-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .seealso .admonition-title{background:#6ab0de}.wy-alert.wy-alert-success,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.warning,.rst-content .wy-alert-success.seealso{background:#dbfaf4}.wy-alert.wy-alert-success .wy-alert-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .hint .wy-alert-title,.rst-content .important .wy-alert-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .hint .admonition-title,.rst-content .important .admonition-title,.rst-content .tip .admonition-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.seealso .admonition-title{background:#1abc9c}.wy-alert.wy-alert-neutral,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.rst-content .wy-alert-neutral.seealso{background:#f3f6f6}.wy-alert.wy-alert-neutral .wy-alert-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.seealso .admonition-title{color:#404040;background:#e1e4e5}.wy-alert.wy-alert-neutral a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.rst-content .wy-alert-neutral.seealso a{color:#2980b9}.wy-alert p:last-child,.rst-content .note p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.rst-content .seealso p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0px;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,0.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:60px;overflow:hidden;-webkit-transition:all 0.3s ease-in;-moz-transition:all 0.3s ease-in;transition:all 0.3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:60px}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px 12px;color:#fff;border:1px solid rgba(0,0,0,0.1);background-color:#27ae60;text-decoration:none;font-weight:normal;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;box-shadow:0px 1px 2px -1px rgba(255,255,255,0.5) inset,0px -2px 0px 0px rgba(0,0,0,0.1) inset;outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all 0.1s linear;-moz-transition:all 0.1s linear;transition:all 0.1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:0px -1px 0px 0px rgba(0,0,0,0.05) inset,0px 2px 0px 0px rgba(0,0,0,0.1) inset;padding:8px 12px 6px 12px}.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:0.4;cursor:not-allowed;box-shadow:none}.btn-disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:0.4;cursor:not-allowed;box-shadow:none}.btn-disabled:hover,.btn-disabled:focus,.btn-disabled:active{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:0.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9 !important}.btn-info:hover{background-color:#2e8ece !important}.btn-neutral{background-color:#f3f6f6 !important;color:#404040 !important}.btn-neutral:hover{background-color:#e5ebeb !important;color:#404040}.btn-neutral:visited{color:#404040 !important}.btn-success{background-color:#27ae60 !important}.btn-success:hover{background-color:#295 !important}.btn-danger{background-color:#e74c3c !important}.btn-danger:hover{background-color:#ea6153 !important}.btn-warning{background-color:#e67e22 !important}.btn-warning:hover{background-color:#e98b39 !important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f !important}.btn-link{background-color:transparent !important;color:#2980b9;box-shadow:none;border-color:transparent !important}.btn-link:hover{background-color:transparent !important;color:#409ad5 !important;box-shadow:none}.btn-link:active{background-color:transparent !important;color:#409ad5 !important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:before,.wy-btn-group:after{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:solid 1px #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,0.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:solid 1px #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type="search"]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned input,.wy-form-aligned textarea,.wy-form-aligned select,.wy-form-aligned .wy-help-inline,.wy-form-aligned label{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:0.5em 1em 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:0.5em}fieldset{border:0;margin:0;padding:0}legend{display:block;width:100%;border:0;padding:0;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label{display:block;margin:0 0 0.3125em 0;color:#999;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;*zoom:1;max-width:68em;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:before,.wy-control-group:after{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group:before,.wy-control-group:after{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full input[type="text"],.wy-control-group .wy-form-full input[type="password"],.wy-control-group .wy-form-full input[type="email"],.wy-control-group .wy-form-full input[type="url"],.wy-control-group .wy-form-full input[type="date"],.wy-control-group .wy-form-full input[type="month"],.wy-control-group .wy-form-full input[type="time"],.wy-control-group .wy-form-full input[type="datetime"],.wy-control-group .wy-form-full input[type="datetime-local"],.wy-control-group .wy-form-full input[type="week"],.wy-control-group .wy-form-full input[type="number"],.wy-control-group .wy-form-full input[type="search"],.wy-control-group .wy-form-full input[type="tel"],.wy-control-group .wy-form-full input[type="color"],.wy-control-group .wy-form-halves input[type="text"],.wy-control-group .wy-form-halves input[type="password"],.wy-control-group .wy-form-halves input[type="email"],.wy-control-group .wy-form-halves input[type="url"],.wy-control-group .wy-form-halves input[type="date"],.wy-control-group .wy-form-halves input[type="month"],.wy-control-group .wy-form-halves input[type="time"],.wy-control-group .wy-form-halves input[type="datetime"],.wy-control-group .wy-form-halves input[type="datetime-local"],.wy-control-group .wy-form-halves input[type="week"],.wy-control-group .wy-form-halves input[type="number"],.wy-control-group .wy-form-halves input[type="search"],.wy-control-group .wy-form-halves input[type="tel"],.wy-control-group .wy-form-halves input[type="color"],.wy-control-group .wy-form-thirds input[type="text"],.wy-control-group .wy-form-thirds input[type="password"],.wy-control-group .wy-form-thirds input[type="email"],.wy-control-group .wy-form-thirds input[type="url"],.wy-control-group .wy-form-thirds input[type="date"],.wy-control-group .wy-form-thirds input[type="month"],.wy-control-group .wy-form-thirds input[type="time"],.wy-control-group .wy-form-thirds input[type="datetime"],.wy-control-group .wy-form-thirds input[type="datetime-local"],.wy-control-group .wy-form-thirds input[type="week"],.wy-control-group .wy-form-thirds input[type="number"],.wy-control-group .wy-form-thirds input[type="search"],.wy-control-group .wy-form-thirds input[type="tel"],.wy-control-group .wy-form-thirds input[type="color"]{width:100%}.wy-control-group .wy-form-full{display:block;float:left;margin-right:2.35765%;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{display:block;float:left;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child{margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(2n+1){clear:left}.wy-control-group .wy-form-thirds{display:block;float:left;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child{margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control{margin:0.5em 0 0 0;font-size:90%}.wy-control-group.fluid-input input[type="text"],.wy-control-group.fluid-input input[type="password"],.wy-control-group.fluid-input input[type="email"],.wy-control-group.fluid-input input[type="url"],.wy-control-group.fluid-input input[type="date"],.wy-control-group.fluid-input input[type="month"],.wy-control-group.fluid-input input[type="time"],.wy-control-group.fluid-input input[type="datetime"],.wy-control-group.fluid-input input[type="datetime-local"],.wy-control-group.fluid-input input[type="week"],.wy-control-group.fluid-input input[type="number"],.wy-control-group.fluid-input input[type="search"],.wy-control-group.fluid-input input[type="tel"],.wy-control-group.fluid-input input[type="color"]{width:100%}.wy-form-message-inline{display:inline-block;padding-left:0.3em;color:#666;vertical-align:middle;font-size:90%}.wy-form-message{display:block;color:#ccc;font-size:70%;margin-top:0.3125em;font-style:italic}input{line-height:normal}input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;*overflow:visible}input[type="text"],input[type="password"],input[type="email"],input[type="url"],input[type="date"],input[type="month"],input[type="time"],input[type="datetime"],input[type="datetime-local"],input[type="week"],input[type="number"],input[type="search"],input[type="tel"],input[type="color"]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border 0.3s linear;-moz-transition:border 0.3s linear;transition:border 0.3s linear}input[type="datetime-local"]{padding:0.34375em 0.625em}input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0;margin-right:0.3125em;*height:13px;*width:13px}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}input[type="text"]:focus,input[type="password"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus{outline:0;outline:thin dotted \9;border-color:#333}input.no-focus:focus{border-color:#ccc !important}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type="text"][disabled],input[type="password"][disabled],input[type="email"][disabled],input[type="url"][disabled],input[type="date"][disabled],input[type="month"][disabled],input[type="time"][disabled],input[type="datetime"][disabled],input[type="datetime-local"][disabled],input[type="week"][disabled],input[type="number"][disabled],input[type="search"][disabled],input[type="tel"][disabled],input[type="color"][disabled]{cursor:not-allowed;background-color:#f3f6f6;color:#cad2d3}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e74c3c}input[type="file"]:focus:invalid:focus,input[type="radio"]:focus:invalid:focus,input[type="checkbox"]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%}select,textarea{padding:0.5em 0.625em;display:inline-block;border:1px solid #ccc;font-size:0.8em;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border 0.3s linear;-moz-transition:border 0.3s linear;transition:border 0.3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#fff;color:#cad2d3;border-color:transparent}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{padding:6px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:solid 1px #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type="text"],.wy-control-group.wy-control-group-error input[type="password"],.wy-control-group.wy-control-group-error input[type="email"],.wy-control-group.wy-control-group-error input[type="url"],.wy-control-group.wy-control-group-error input[type="date"],.wy-control-group.wy-control-group-error input[type="month"],.wy-control-group.wy-control-group-error input[type="time"],.wy-control-group.wy-control-group-error input[type="datetime"],.wy-control-group.wy-control-group-error input[type="datetime-local"],.wy-control-group.wy-control-group-error input[type="week"],.wy-control-group.wy-control-group-error input[type="number"],.wy-control-group.wy-control-group-error input[type="search"],.wy-control-group.wy-control-group-error input[type="tel"],.wy-control-group.wy-control-group-error input[type="color"]{border:solid 1px #e74c3c}.wy-control-group.wy-control-group-error textarea{border:solid 1px #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:0.5em 0.625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width: 480px){.wy-form button[type="submit"]{margin:0.7em 0 0}.wy-form input[type="text"],.wy-form input[type="password"],.wy-form input[type="email"],.wy-form input[type="url"],.wy-form input[type="date"],.wy-form input[type="month"],.wy-form input[type="time"],.wy-form input[type="datetime"],.wy-form input[type="datetime-local"],.wy-form input[type="week"],.wy-form input[type="number"],.wy-form input[type="search"],.wy-form input[type="tel"],.wy-form input[type="color"]{margin-bottom:0.3em;display:block}.wy-form label{margin-bottom:0.3em;display:block}.wy-form input[type="password"],.wy-form input[type="email"],.wy-form input[type="url"],.wy-form input[type="date"],.wy-form input[type="month"],.wy-form input[type="time"],.wy-form input[type="datetime"],.wy-form input[type="datetime-local"],.wy-form input[type="week"],.wy-form input[type="number"],.wy-form input[type="search"],.wy-form input[type="tel"],.wy-form input[type="color"]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:0.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0 0}.wy-form .wy-help-inline,.wy-form-message-inline,.wy-form-message{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width: 768px){.tablet-hide{display:none}}@media screen and (max-width: 480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.wy-table,.rst-content table.docutils,.rst-content table.field-list{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.wy-table caption,.rst-content table.docutils caption,.rst-content table.field-list caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.wy-table td,.rst-content table.docutils td,.rst-content table.field-list td,.wy-table th,.rst-content table.docutils th,.rst-content table.field-list th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.wy-table td:first-child,.rst-content table.docutils td:first-child,.rst-content table.field-list td:first-child,.wy-table th:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list th:first-child{border-left-width:0}.wy-table thead,.rst-content table.docutils thead,.rst-content table.field-list thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.wy-table thead th,.rst-content table.docutils thead th,.rst-content table.field-list thead th{font-weight:bold;border-bottom:solid 2px #e1e4e5}.wy-table td,.rst-content table.docutils td,.rst-content table.field-list td{background-color:transparent;vertical-align:middle}.wy-table td p,.rst-content table.docutils td p,.rst-content table.field-list td p{line-height:18px;margin-bottom:0}.wy-table .wy-table-cell-min,.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min{width:1%;padding-right:0}.wy-table .wy-table-cell-min input[type=checkbox],.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox],.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:gray;font-size:90%}.wy-table-tertiary{color:gray;font-size:80%}.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td,.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td{background-color:#f3f6f6}.wy-table-backed{background-color:#f3f6f6}.wy-table-bordered-all,.rst-content table.docutils{border:1px solid #e1e4e5}.wy-table-bordered-all td,.rst-content table.docutils td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.wy-table-bordered-all tbody>tr:last-child td,.rst-content table.docutils tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px 0;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0 !important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%;overflow-x:hidden}body{font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;font-weight:normal;color:#404040;min-height:100%;overflow-x:hidden;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22 !important}a.wy-text-warning:hover{color:#eb9950 !important}.wy-text-info{color:#2980b9 !important}a.wy-text-info:hover{color:#409ad5 !important}.wy-text-success{color:#27ae60 !important}a.wy-text-success:hover{color:#36d278 !important}.wy-text-danger{color:#e74c3c !important}a.wy-text-danger:hover{color:#ed7669 !important}.wy-text-neutral{color:#404040 !important}a.wy-text-neutral:hover{color:#595959 !important}h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:"Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif}p{line-height:24px;margin:0;font-size:16px;margin-bottom:24px}h1{font-size:175%}h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}code,.rst-content tt{white-space:nowrap;max-width:100%;background:#fff;border:solid 1px #e1e4e5;font-size:75%;padding:0 5px;font-family:"Incosolata","Consolata","Monaco",monospace;color:#e74c3c;overflow-x:auto}code.code-large,.rst-content tt.code-large{font-size:90%}.wy-plain-list-disc,.rst-content .section ul,.rst-content .toctree-wrapper ul,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.wy-plain-list-disc li,.rst-content .section ul li,.rst-content .toctree-wrapper ul li,article ul li{list-style:disc;margin-left:24px}.wy-plain-list-disc li ul,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li ul,article ul li ul{margin-bottom:0}.wy-plain-list-disc li li,.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,article ul li li{list-style:circle}.wy-plain-list-disc li li li,.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,article ul li li li{list-style:square}.wy-plain-list-decimal,.rst-content .section ol,.rst-content ol.arabic,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.wy-plain-list-decimal li,.rst-content .section ol li,.rst-content ol.arabic li,article ol li{list-style:decimal;margin-left:24px}.codeblock-example{border:1px solid #e1e4e5;border-bottom:none;padding:24px;padding-top:48px;font-weight:500;background:#fff;position:relative}.codeblock-example:after{content:"Example";position:absolute;top:0px;left:0px;background:#9b59b6;color:#fff;padding:6px 12px}.codeblock-example.prettyprint-example-only{border:1px solid #e1e4e5;margin-bottom:24px}.codeblock,pre.literal-block,.rst-content .literal-block,.rst-content pre.literal-block,div[class^='highlight']{border:1px solid #e1e4e5;padding:0px;overflow-x:auto;background:#fff;margin:1px 0 24px 0}.codeblock div[class^='highlight'],pre.literal-block div[class^='highlight'],.rst-content .literal-block div[class^='highlight'],div[class^='highlight'] div[class^='highlight']{border:none;background:none;margin:0}div[class^='highlight'] td.code{width:100%}.linenodiv pre{border-right:solid 1px #e6e9ea;margin:0;padding:12px 12px;font-family:"Incosolata","Consolata","Monaco",monospace;font-size:12px;line-height:1.5;color:#d9d9d9}div[class^='highlight'] pre{white-space:pre;margin:0;padding:12px 12px;font-family:"Incosolata","Consolata","Monaco",monospace;font-size:12px;line-height:1.5;display:block;overflow:auto;color:#404040}@media print{.codeblock,pre.literal-block,.rst-content .literal-block,.rst-content pre.literal-block,div[class^='highlight'],div[class^='highlight'] pre{white-space:pre-wrap}}.hll{background-color:#ffc;margin:0 -12px;padding:0 12px;display:block}.c{color:#998;font-style:italic}.err{color:#a61717;background-color:#e3d2d2}.k{font-weight:bold}.o{font-weight:bold}.cm{color:#998;font-style:italic}.cp{color:#999;font-weight:bold}.c1{color:#998;font-style:italic}.cs{color:#999;font-weight:bold;font-style:italic}.gd{color:#000;background-color:#fdd}.gd .x{color:#000;background-color:#faa}.ge{font-style:italic}.gr{color:#a00}.gh{color:#999}.gi{color:#000;background-color:#dfd}.gi .x{color:#000;background-color:#afa}.go{color:#888}.gp{color:#555}.gs{font-weight:bold}.gu{color:purple;font-weight:bold}.gt{color:#a00}.kc{font-weight:bold}.kd{font-weight:bold}.kn{font-weight:bold}.kp{font-weight:bold}.kr{font-weight:bold}.kt{color:#458;font-weight:bold}.m{color:#099}.s{color:#d14}.n{color:#333}.na{color:teal}.nb{color:#0086b3}.nc{color:#458;font-weight:bold}.no{color:teal}.ni{color:purple}.ne{color:#900;font-weight:bold}.nf{color:#900;font-weight:bold}.nn{color:#555}.nt{color:navy}.nv{color:teal}.ow{font-weight:bold}.w{color:#bbb}.mf{color:#099}.mh{color:#099}.mi{color:#099}.mo{color:#099}.sb{color:#d14}.sc{color:#d14}.sd{color:#d14}.s2{color:#d14}.se{color:#d14}.sh{color:#d14}.si{color:#d14}.sx{color:#d14}.sr{color:#009926}.s1{color:#d14}.ss{color:#990073}.bp{color:#999}.vc{color:teal}.vg{color:teal}.vi{color:teal}.il{color:#099}.gc{color:#999;background-color:#eaf2f5}.wy-breadcrumbs li{display:inline-block}.wy-breadcrumbs li.wy-breadcrumbs-aside{float:right}.wy-breadcrumbs li a{display:inline-block;padding:5px}.wy-breadcrumbs li a:first-child{padding-left:0}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width: 480px){.wy-breadcrumbs-extra{display:none}.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:before,.wy-menu-horiz:after{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz ul,.wy-menu-horiz li{display:inline-block}.wy-menu-horiz li:hover{background:rgba(255,255,255,0.1)}.wy-menu-horiz li.divide-left{border-left:solid 1px #404040}.wy-menu-horiz li.divide-right{border-right:solid 1px #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical header{height:32px;display:inline-block;line-height:32px;padding:0 1.618em;display:block;font-weight:bold;text-transform:uppercase;font-size:80%;color:#2980b9;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:solid 1px #404040}.wy-menu-vertical li.divide-bottom{border-bottom:solid 1px #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:gray;border-right:solid 1px #c9c9c9;padding:0.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.wy-menu-vertical li.on a,.wy-menu-vertical li.current>a{color:#404040;padding:0.4045em 1.618em;font-weight:bold;position:relative;background:#fcfcfc;border:none;border-bottom:solid 1px #c9c9c9;border-top:solid 1px #c9c9c9;padding-left:1.618em -4px}.wy-menu-vertical li.on a:hover,.wy-menu-vertical li.current>a:hover{background:#fcfcfc}.wy-menu-vertical li.toctree-l2.current>a{background:#c9c9c9;padding:0.4045em 2.427em}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical .local-toc li ul{display:block}.wy-menu-vertical li ul li a{margin-bottom:0;color:#b3b3b3;font-weight:normal}.wy-menu-vertical a{display:inline-block;line-height:18px;padding:0.4045em 1.618em;display:block;position:relative;font-size:90%;color:#b3b3b3}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-side-nav-search{z-index:200;background-color:#2980b9;text-align:center;padding:0.809em;display:block;color:#fcfcfc;margin-bottom:0.809em}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto 0.809em auto;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search>a,.wy-side-nav-search .wy-dropdown>a{color:#fcfcfc;font-size:100%;font-weight:bold;display:inline-block;padding:4px 6px;margin-bottom:0.809em}.wy-side-nav-search>a:hover,.wy-side-nav-search .wy-dropdown>a:hover{background:rgba(255,255,255,0.1)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all 0.2s ease-in;-moz-transition:all 0.2s ease-in;transition:all 0.2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:left repeat-y #fcfcfc;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoxOERBMTRGRDBFMUUxMUUzODUwMkJCOThDMEVFNURFMCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoxOERBMTRGRTBFMUUxMUUzODUwMkJCOThDMEVFNURFMCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjE4REExNEZCMEUxRTExRTM4NTAyQkI5OEMwRUU1REUwIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjE4REExNEZDMEUxRTExRTM4NTAyQkI5OEMwRUU1REUwIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+EwrlwAAAAA5JREFUeNpiMDU0BAgwAAE2AJgB9BnaAAAAAElFTkSuQmCC);background-size:300px 1px}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:absolute;top:0;left:0;width:300px;overflow:hidden;min-height:100%;background:#343131;z-index:200}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:0.4045em 0.809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:before,.wy-nav-top:after{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:bold}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,0.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:#999}footer p{margin-bottom:12px}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:before,.rst-footer-buttons:after{display:table;content:""}.rst-footer-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:solid 1px #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:solid 1px #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:gray;font-size:90%}@media screen and (max-width: 768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width: 1400px){.wy-nav-content-wrap{background:rgba(0,0,0,0.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.wy-nav-side{display:none}.wy-nav-content-wrap{margin-left:0}}nav.stickynav{position:fixed;top:0}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;border-top:solid 10px #343131;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:before,.rst-versions .rst-current-version:after{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .icon{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:gray;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:solid 1px #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px}.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge .rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width: 768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}img{width:100%;height:auto}}.rst-content img{max-width:100%;height:auto !important}.rst-content div.figure{margin-bottom:24px}.rst-content div.figure.align-center{text-align:center}.rst-content .section>img{margin-bottom:24px}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content .note .last,.rst-content .attention .last,.rst-content .caution .last,.rst-content .danger .last,.rst-content .error .last,.rst-content .hint .last,.rst-content .important .last,.rst-content .tip .last,.rst-content .warning .last,.rst-content .seealso .last{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,0.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent !important;border-color:rgba(0,0,0,0.1) !important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha li{list-style:upper-alpha}.rst-content .section ol p,.rst-content .section ul p{margin-bottom:12px}.rst-content .line-block{margin-left:24px}.rst-content .topic-title{font-weight:bold;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0px 0px 24px 24px}.rst-content .align-left{float:left;margin:0px 24px 24px 0px}.rst-content .align-center{margin:auto;display:block}.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink{display:none;visibility:hidden;font-size:14px}.rst-content h1 .headerlink:after,.rst-content h2 .headerlink:after,.rst-content h3 .headerlink:after,.rst-content h4 .headerlink:after,.rst-content h5 .headerlink:after,.rst-content h6 .headerlink:after,.rst-content dl dt .headerlink:after{visibility:visible;content:"\f0c1";font-family:FontAwesome;display:inline-block}.rst-content h1:hover .headerlink,.rst-content h2:hover .headerlink,.rst-content h3:hover .headerlink,.rst-content h4:hover .headerlink,.rst-content h5:hover .headerlink,.rst-content h6:hover .headerlink,.rst-content dl dt:hover .headerlink{display:inline-block}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:solid 1px #e1e4e5}.rst-content .sidebar p,.rst-content .sidebar ul,.rst-content .sidebar dl{font-size:90%}.rst-content .sidebar .last{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:"Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif;font-weight:bold;background:#e1e4e5;padding:6px 12px;margin:-24px;margin-bottom:24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;display:inline-block;font-weight:bold;padding:0 6px}.rst-content .footnote-reference,.rst-content .citation-reference{vertical-align:super;font-size:90%}.rst-content table.docutils.citation,.rst-content table.docutils.footnote{background:none;border:none;color:#999}.rst-content table.docutils.citation td,.rst-content table.docutils.citation tr,.rst-content table.docutils.footnote td,.rst-content table.docutils.footnote tr{border:none;background-color:transparent !important;white-space:normal}.rst-content table.docutils.citation td.label,.rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}.rst-content table.field-list{border:none}.rst-content table.field-list td{border:none;padding-top:5px}.rst-content table.field-list td>strong{display:inline-block;margin-top:3px}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left;padding-left:0}.rst-content tt{color:#000}.rst-content tt big,.rst-content tt em{font-size:100% !important;line-height:normal}.rst-content tt .xref,a .rst-content tt{font-weight:bold}.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:bold}.rst-content dl p,.rst-content dl table,.rst-content dl ul,.rst-content dl ol{margin-bottom:12px !important}.rst-content dl dd{margin:0 0 12px 24px}.rst-content dl:not(.docutils){margin-bottom:24px}.rst-content dl:not(.docutils) dt{display:inline-block;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:solid 3px #6ab0de;padding:6px;position:relative}.rst-content dl:not(.docutils) dt:before{color:#6ab0de}.rst-content dl:not(.docutils) dt .headerlink{color:#404040;font-size:100% !important}.rst-content dl:not(.docutils) dl dt{margin-bottom:6px;border:none;border-left:solid 3px #ccc;background:#f0f0f0;color:gray}.rst-content dl:not(.docutils) dl dt .headerlink{color:#404040;font-size:100% !important}.rst-content dl:not(.docutils) dt:first-child{margin-top:0}.rst-content dl:not(.docutils) tt{font-weight:bold}.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) tt.descclassname{background-color:transparent;border:none;padding:0;font-size:100% !important}.rst-content dl:not(.docutils) tt.descname{font-weight:bold}.rst-content dl:not(.docutils) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:bold}.rst-content dl:not(.docutils) .property{display:inline-block;padding-right:8px}.rst-content .viewcode-link,.rst-content .viewcode-back{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}@media screen and (max-width: 480px){.rst-content .sidebar{width:100%}}span[id*='MathJax-Span']{color:#404040} + */@font-face{font-family:'FontAwesome';src:url("../fonts/fontawesome-webfont.eot?v=4.0.3");src:url("../fonts/fontawesome-webfont.eot?#iefix&v=4.0.3") format("embedded-opentype"),url("../fonts/fontawesome-webfont.woff?v=4.0.3") format("woff"),url("../fonts/fontawesome-webfont.ttf?v=4.0.3") format("truetype"),url("../fonts/fontawesome-webfont.svg?v=4.0.3#fontawesomeregular") format("svg");font-weight:normal;font-style:normal}.fa,.rst-content .admonition-title,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink,.icon{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:0.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:0.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:solid 0.08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.rst-content .pull-left.admonition-title,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content dl dt .pull-left.headerlink,.pull-left.icon{margin-right:.3em}.fa.pull-right,.rst-content .pull-right.admonition-title,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content dl dt .pull-right.headerlink,.pull-right.icon{margin-left:.3em}.fa-spin{-webkit-animation:spin 2s infinite linear;-moz-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear}@-moz-keyframes spin{0%{-moz-transform:rotate(0deg)}100%{-moz-transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg)}}@-o-keyframes spin{0%{-o-transform:rotate(0deg)}100%{-o-transform:rotate(359deg)}}@-ms-keyframes spin{0%{-ms-transform:rotate(0deg)}100%{-ms-transform:rotate(359deg)}}@keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=$rotation);-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=$rotation);-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=$rotation);-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=$rotation);-webkit-transform:scale(-1, 1);-moz-transform:scale(-1, 1);-ms-transform:scale(-1, 1);-o-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=$rotation);-webkit-transform:scale(1, -1);-moz-transform:scale(1, -1);-ms-transform:scale(1, -1);-o-transform:scale(1, -1);transform:scale(1, -1)}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before,.icon-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before,.icon-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:"\f057"}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.rst-content .admonition-title:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before,.icon-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook:before{content:"\f09a"}.fa-github:before,.icon-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:"\f0a8"}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before,.icon-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before,.wy-dropdown .caret:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-asc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-desc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-reply-all:before{content:"\f122"}.fa-mail-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before,.icon-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa,.rst-content .admonition-title,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink,.icon,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context{font-family:inherit}.fa:before,.rst-content .admonition-title:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content dl dt .headerlink:before,.icon:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before{font-family:"FontAwesome";display:inline-block;font-style:normal;font-weight:normal;line-height:1;text-decoration:inherit}a .fa,a .rst-content .admonition-title,.rst-content a .admonition-title,a .rst-content h1 .headerlink,.rst-content h1 a .headerlink,a .rst-content h2 .headerlink,.rst-content h2 a .headerlink,a .rst-content h3 .headerlink,.rst-content h3 a .headerlink,a .rst-content h4 .headerlink,.rst-content h4 a .headerlink,a .rst-content h5 .headerlink,.rst-content h5 a .headerlink,a .rst-content h6 .headerlink,.rst-content h6 a .headerlink,a .rst-content dl dt .headerlink,.rst-content dl dt a .headerlink,a .icon{display:inline-block;text-decoration:inherit}.btn .fa,.btn .rst-content .admonition-title,.rst-content .btn .admonition-title,.btn .rst-content h1 .headerlink,.rst-content h1 .btn .headerlink,.btn .rst-content h2 .headerlink,.rst-content h2 .btn .headerlink,.btn .rst-content h3 .headerlink,.rst-content h3 .btn .headerlink,.btn .rst-content h4 .headerlink,.rst-content h4 .btn .headerlink,.btn .rst-content h5 .headerlink,.rst-content h5 .btn .headerlink,.btn .rst-content h6 .headerlink,.rst-content h6 .btn .headerlink,.btn .rst-content dl dt .headerlink,.rst-content dl dt .btn .headerlink,.btn .icon,.nav .fa,.nav .rst-content .admonition-title,.rst-content .nav .admonition-title,.nav .rst-content h1 .headerlink,.rst-content h1 .nav .headerlink,.nav .rst-content h2 .headerlink,.rst-content h2 .nav .headerlink,.nav .rst-content h3 .headerlink,.rst-content h3 .nav .headerlink,.nav .rst-content h4 .headerlink,.rst-content h4 .nav .headerlink,.nav .rst-content h5 .headerlink,.rst-content h5 .nav .headerlink,.nav .rst-content h6 .headerlink,.rst-content h6 .nav .headerlink,.nav .rst-content dl dt .headerlink,.rst-content dl dt .nav .headerlink,.nav .icon{display:inline}.btn .fa.fa-large,.btn .rst-content .fa-large.admonition-title,.rst-content .btn .fa-large.admonition-title,.btn .rst-content h1 .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.btn .rst-content dl dt .fa-large.headerlink,.rst-content dl dt .btn .fa-large.headerlink,.btn .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .fa-large.admonition-title,.rst-content .nav .fa-large.admonition-title,.nav .rst-content h1 .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.nav .rst-content dl dt .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.nav .fa-large.icon{line-height:0.9em}.btn .fa.fa-spin,.btn .rst-content .fa-spin.admonition-title,.rst-content .btn .fa-spin.admonition-title,.btn .rst-content h1 .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.btn .rst-content dl dt .fa-spin.headerlink,.rst-content dl dt .btn .fa-spin.headerlink,.btn .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .fa-spin.admonition-title,.rst-content .nav .fa-spin.admonition-title,.nav .rst-content h1 .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.nav .rst-content dl dt .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.nav .fa-spin.icon{display:inline-block}.btn.fa:before,.rst-content .btn.admonition-title:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content dl dt .btn.headerlink:before,.btn.icon:before{opacity:0.5;-webkit-transition:opacity 0.05s ease-in;-moz-transition:opacity 0.05s ease-in;transition:opacity 0.05s ease-in}.btn.fa:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.btn.icon:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .rst-content .admonition-title:before,.rst-content .btn-mini .admonition-title:before,.btn-mini .rst-content h1 .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.btn-mini .rst-content dl dt .headerlink:before,.rst-content dl dt .btn-mini .headerlink:before,.btn-mini .icon:before{font-size:14px;vertical-align:-15%}.wy-alert,.rst-content .note,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .warning,.rst-content .seealso{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.wy-alert-title,.rst-content .admonition-title{color:#fff;font-weight:bold;display:block;color:#fff;background:#6ab0de;margin:-12px;padding:6px 12px;margin-bottom:12px}.wy-alert.wy-alert-danger,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.rst-content .wy-alert-danger.seealso{background:#fdf3f2}.wy-alert.wy-alert-danger .wy-alert-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .danger .wy-alert-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .danger .admonition-title,.rst-content .error .admonition-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.seealso .admonition-title{background:#f29f97}.wy-alert.wy-alert-warning,.rst-content .wy-alert-warning.note,.rst-content .attention,.rst-content .caution,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.tip,.rst-content .warning,.rst-content .wy-alert-warning.seealso{background:#ffedcc}.wy-alert.wy-alert-warning .wy-alert-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .attention .wy-alert-title,.rst-content .caution .wy-alert-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .attention .admonition-title,.rst-content .caution .admonition-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .warning .admonition-title,.rst-content .wy-alert-warning.seealso .admonition-title{background:#f0b37e}.wy-alert.wy-alert-info,.rst-content .note,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.rst-content .seealso{background:#e7f2fa}.wy-alert.wy-alert-info .wy-alert-title,.rst-content .note .wy-alert-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .seealso .wy-alert-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.rst-content .note .admonition-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .seealso .admonition-title{background:#6ab0de}.wy-alert.wy-alert-success,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.warning,.rst-content .wy-alert-success.seealso{background:#dbfaf4}.wy-alert.wy-alert-success .wy-alert-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .hint .wy-alert-title,.rst-content .important .wy-alert-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .hint .admonition-title,.rst-content .important .admonition-title,.rst-content .tip .admonition-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.seealso .admonition-title{background:#1abc9c}.wy-alert.wy-alert-neutral,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.rst-content .wy-alert-neutral.seealso{background:#f3f6f6}.wy-alert.wy-alert-neutral .wy-alert-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.seealso .admonition-title{color:#404040;background:#e1e4e5}.wy-alert.wy-alert-neutral a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.rst-content .wy-alert-neutral.seealso a{color:#2980b9}.wy-alert p:last-child,.rst-content .note p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.rst-content .seealso p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0px;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,0.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:60px;overflow:hidden;-webkit-transition:all 0.3s ease-in;-moz-transition:all 0.3s ease-in;transition:all 0.3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:60px}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px 12px;color:#fff;border:1px solid rgba(0,0,0,0.1);background-color:#27ae60;text-decoration:none;font-weight:normal;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;box-shadow:0px 1px 2px -1px rgba(255,255,255,0.5) inset,0px -2px 0px 0px rgba(0,0,0,0.1) inset;outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all 0.1s linear;-moz-transition:all 0.1s linear;transition:all 0.1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:0px -1px 0px 0px rgba(0,0,0,0.05) inset,0px 2px 0px 0px rgba(0,0,0,0.1) inset;padding:8px 12px 6px 12px}.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:0.4;cursor:not-allowed;box-shadow:none}.btn-disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:0.4;cursor:not-allowed;box-shadow:none}.btn-disabled:hover,.btn-disabled:focus,.btn-disabled:active{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:0.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9 !important}.btn-info:hover{background-color:#2e8ece !important}.btn-neutral{background-color:#f3f6f6 !important;color:#404040 !important}.btn-neutral:hover{background-color:#e5ebeb !important;color:#404040}.btn-neutral:visited{color:#404040 !important}.btn-success{background-color:#27ae60 !important}.btn-success:hover{background-color:#295 !important}.btn-danger{background-color:#e74c3c !important}.btn-danger:hover{background-color:#ea6153 !important}.btn-warning{background-color:#e67e22 !important}.btn-warning:hover{background-color:#e98b39 !important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f !important}.btn-link{background-color:transparent !important;color:#2980b9;box-shadow:none;border-color:transparent !important}.btn-link:hover{background-color:transparent !important;color:#409ad5 !important;box-shadow:none}.btn-link:active{background-color:transparent !important;color:#409ad5 !important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:before,.wy-btn-group:after{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:solid 1px #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,0.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:solid 1px #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type="search"]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned input,.wy-form-aligned textarea,.wy-form-aligned select,.wy-form-aligned .wy-help-inline,.wy-form-aligned label{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:0.5em 1em 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:0.5em}fieldset{border:0;margin:0;padding:0}legend{display:block;width:100%;border:0;padding:0;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label{display:block;margin:0 0 0.3125em 0;color:#999;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;*zoom:1;max-width:68em;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:before,.wy-control-group:after{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group:before,.wy-control-group:after{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full input[type="text"],.wy-control-group .wy-form-full input[type="password"],.wy-control-group .wy-form-full input[type="email"],.wy-control-group .wy-form-full input[type="url"],.wy-control-group .wy-form-full input[type="date"],.wy-control-group .wy-form-full input[type="month"],.wy-control-group .wy-form-full input[type="time"],.wy-control-group .wy-form-full input[type="datetime"],.wy-control-group .wy-form-full input[type="datetime-local"],.wy-control-group .wy-form-full input[type="week"],.wy-control-group .wy-form-full input[type="number"],.wy-control-group .wy-form-full input[type="search"],.wy-control-group .wy-form-full input[type="tel"],.wy-control-group .wy-form-full input[type="color"],.wy-control-group .wy-form-halves input[type="text"],.wy-control-group .wy-form-halves input[type="password"],.wy-control-group .wy-form-halves input[type="email"],.wy-control-group .wy-form-halves input[type="url"],.wy-control-group .wy-form-halves input[type="date"],.wy-control-group .wy-form-halves input[type="month"],.wy-control-group .wy-form-halves input[type="time"],.wy-control-group .wy-form-halves input[type="datetime"],.wy-control-group .wy-form-halves input[type="datetime-local"],.wy-control-group .wy-form-halves input[type="week"],.wy-control-group .wy-form-halves input[type="number"],.wy-control-group .wy-form-halves input[type="search"],.wy-control-group .wy-form-halves input[type="tel"],.wy-control-group .wy-form-halves input[type="color"],.wy-control-group .wy-form-thirds input[type="text"],.wy-control-group .wy-form-thirds input[type="password"],.wy-control-group .wy-form-thirds input[type="email"],.wy-control-group .wy-form-thirds input[type="url"],.wy-control-group .wy-form-thirds input[type="date"],.wy-control-group .wy-form-thirds input[type="month"],.wy-control-group .wy-form-thirds input[type="time"],.wy-control-group .wy-form-thirds input[type="datetime"],.wy-control-group .wy-form-thirds input[type="datetime-local"],.wy-control-group .wy-form-thirds input[type="week"],.wy-control-group .wy-form-thirds input[type="number"],.wy-control-group .wy-form-thirds input[type="search"],.wy-control-group .wy-form-thirds input[type="tel"],.wy-control-group .wy-form-thirds input[type="color"]{width:100%}.wy-control-group .wy-form-full{display:block;float:left;margin-right:2.35765%;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{display:block;float:left;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child{margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(2n+1){clear:left}.wy-control-group .wy-form-thirds{display:block;float:left;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child{margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control{margin:0.5em 0 0 0;font-size:90%}.wy-control-group.fluid-input input[type="text"],.wy-control-group.fluid-input input[type="password"],.wy-control-group.fluid-input input[type="email"],.wy-control-group.fluid-input input[type="url"],.wy-control-group.fluid-input input[type="date"],.wy-control-group.fluid-input input[type="month"],.wy-control-group.fluid-input input[type="time"],.wy-control-group.fluid-input input[type="datetime"],.wy-control-group.fluid-input input[type="datetime-local"],.wy-control-group.fluid-input input[type="week"],.wy-control-group.fluid-input input[type="number"],.wy-control-group.fluid-input input[type="search"],.wy-control-group.fluid-input input[type="tel"],.wy-control-group.fluid-input input[type="color"]{width:100%}.wy-form-message-inline{display:inline-block;padding-left:0.3em;color:#666;vertical-align:middle;font-size:90%}.wy-form-message{display:block;color:#ccc;font-size:70%;margin-top:0.3125em;font-style:italic}input{line-height:normal}input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;*overflow:visible}input[type="text"],input[type="password"],input[type="email"],input[type="url"],input[type="date"],input[type="month"],input[type="time"],input[type="datetime"],input[type="datetime-local"],input[type="week"],input[type="number"],input[type="search"],input[type="tel"],input[type="color"]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border 0.3s linear;-moz-transition:border 0.3s linear;transition:border 0.3s linear}input[type="datetime-local"]{padding:0.34375em 0.625em}input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0;margin-right:0.3125em;*height:13px;*width:13px}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}input[type="text"]:focus,input[type="password"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus{outline:0;outline:thin dotted \9;border-color:#333}input.no-focus:focus{border-color:#ccc !important}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type="text"][disabled],input[type="password"][disabled],input[type="email"][disabled],input[type="url"][disabled],input[type="date"][disabled],input[type="month"][disabled],input[type="time"][disabled],input[type="datetime"][disabled],input[type="datetime-local"][disabled],input[type="week"][disabled],input[type="number"][disabled],input[type="search"][disabled],input[type="tel"][disabled],input[type="color"][disabled]{cursor:not-allowed;background-color:#f3f6f6;color:#cad2d3}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e74c3c}input[type="file"]:focus:invalid:focus,input[type="radio"]:focus:invalid:focus,input[type="checkbox"]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%}select,textarea{padding:0.5em 0.625em;display:inline-block;border:1px solid #ccc;font-size:0.8em;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border 0.3s linear;-moz-transition:border 0.3s linear;transition:border 0.3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#fff;color:#cad2d3;border-color:transparent}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{padding:6px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:solid 1px #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type="text"],.wy-control-group.wy-control-group-error input[type="password"],.wy-control-group.wy-control-group-error input[type="email"],.wy-control-group.wy-control-group-error input[type="url"],.wy-control-group.wy-control-group-error input[type="date"],.wy-control-group.wy-control-group-error input[type="month"],.wy-control-group.wy-control-group-error input[type="time"],.wy-control-group.wy-control-group-error input[type="datetime"],.wy-control-group.wy-control-group-error input[type="datetime-local"],.wy-control-group.wy-control-group-error input[type="week"],.wy-control-group.wy-control-group-error input[type="number"],.wy-control-group.wy-control-group-error input[type="search"],.wy-control-group.wy-control-group-error input[type="tel"],.wy-control-group.wy-control-group-error input[type="color"]{border:solid 1px #e74c3c}.wy-control-group.wy-control-group-error textarea{border:solid 1px #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:0.5em 0.625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width: 480px){.wy-form button[type="submit"]{margin:0.7em 0 0}.wy-form input[type="text"],.wy-form input[type="password"],.wy-form input[type="email"],.wy-form input[type="url"],.wy-form input[type="date"],.wy-form input[type="month"],.wy-form input[type="time"],.wy-form input[type="datetime"],.wy-form input[type="datetime-local"],.wy-form input[type="week"],.wy-form input[type="number"],.wy-form input[type="search"],.wy-form input[type="tel"],.wy-form input[type="color"]{margin-bottom:0.3em;display:block}.wy-form label{margin-bottom:0.3em;display:block}.wy-form input[type="password"],.wy-form input[type="email"],.wy-form input[type="url"],.wy-form input[type="date"],.wy-form input[type="month"],.wy-form input[type="time"],.wy-form input[type="datetime"],.wy-form input[type="datetime-local"],.wy-form input[type="week"],.wy-form input[type="number"],.wy-form input[type="search"],.wy-form input[type="tel"],.wy-form input[type="color"]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:0.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0 0}.wy-form .wy-help-inline,.wy-form-message-inline,.wy-form-message{display:block;font-size:80%;padding:6px 0}} + + @media screen and (max-width: 768px){.tablet-hide{display:none}} + @media screen and (max-width: 480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.wy-table,.rst-content table.docutils,.rst-content table.field-list{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.wy-table caption,.rst-content table.docutils caption,.rst-content table.field-list caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.wy-table td,.rst-content table.docutils td,.rst-content table.field-list td,.wy-table th,.rst-content table.docutils th,.rst-content table.field-list th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.wy-table td:first-child,.rst-content table.docutils td:first-child,.rst-content table.field-list td:first-child,.wy-table th:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list th:first-child{border-left-width:0}.wy-table thead,.rst-content table.docutils thead,.rst-content table.field-list thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.wy-table thead th,.rst-content table.docutils thead th,.rst-content table.field-list thead th{font-weight:bold;border-bottom:solid 2px #e1e4e5}.wy-table td,.rst-content table.docutils td,.rst-content table.field-list td{background-color:transparent;vertical-align:middle}.wy-table td p,.rst-content table.docutils td p,.rst-content table.field-list td p{line-height:18px;margin-bottom:0}.wy-table .wy-table-cell-min,.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min{width:1%;padding-right:0}.wy-table .wy-table-cell-min input[type=checkbox],.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox],.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:gray;font-size:90%}.wy-table-tertiary{color:gray;font-size:80%}.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td,.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td{background-color:#f3f6f6}.wy-table-backed{background-color:#f3f6f6}.wy-table-bordered-all,.rst-content table.docutils{border:1px solid #e1e4e5}.wy-table-bordered-all td,.rst-content table.docutils td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.wy-table-bordered-all tbody>tr:last-child td,.rst-content table.docutils tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px 0;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0} + + .wy-table-responsive{ + margin-bottom:24px; + max-width:100%; + overflow:auto + } + +.wy-table-responsive table{ + margin-bottom:0 !important + } + +.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap} + +a{color:#2980b9;text-decoration:none}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%;overflow-x:hidden}body{font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;font-weight:normal;color:#404040;min-height:100%;overflow-x:hidden;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22 !important}a.wy-text-warning:hover{color:#eb9950 !important}.wy-text-info{color:#2980b9 !important}a.wy-text-info:hover{color:#409ad5 !important}.wy-text-success{color:#27ae60 !important}a.wy-text-success:hover{color:#36d278 !important}.wy-text-danger{color:#e74c3c !important}a.wy-text-danger:hover{color:#ed7669 !important}.wy-text-neutral{color:#404040 !important}a.wy-text-neutral:hover{color:#595959 !important}h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:"Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif}p{line-height:24px;margin:0;font-size:16px;margin-bottom:24px}h1{font-size:175%}h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}code,.rst-content tt{white-space:nowrap;max-width:100%;background:#fff;border:solid 1px #e1e4e5;font-size:75%;padding:0 5px;font-family:"Incosolata","Consolata","Monaco",monospace;color:#e74c3c;overflow-x:auto}code.code-large,.rst-content tt.code-large{font-size:90%}.wy-plain-list-disc,.rst-content .section ul,.rst-content .toctree-wrapper ul,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.wy-plain-list-disc li,.rst-content .section ul li,.rst-content .toctree-wrapper ul li,article ul li{list-style:disc;margin-left:24px}.wy-plain-list-disc li ul,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li ul,article ul li ul{margin-bottom:0}.wy-plain-list-disc li li,.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,article ul li li{list-style:circle}.wy-plain-list-disc li li li,.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,article ul li li li{list-style:square}.wy-plain-list-decimal,.rst-content .section ol,.rst-content ol.arabic,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.wy-plain-list-decimal li,.rst-content .section ol li,.rst-content ol.arabic li,article ol li{list-style:decimal;margin-left:24px}.codeblock-example{border:1px solid #e1e4e5;border-bottom:none;padding:24px;padding-top:48px;font-weight:500;background:#fff;position:relative}.codeblock-example:after{content:"Example";position:absolute;top:0px;left:0px;background:#9b59b6;color:#fff;padding:6px 12px}.codeblock-example.prettyprint-example-only{border:1px solid #e1e4e5;margin-bottom:24px}.codeblock,pre.literal-block,.rst-content .literal-block,.rst-content pre.literal-block,div[class^='highlight']{border:1px solid #e1e4e5;padding:0px;overflow-x:auto;background:#fff;margin:1px 0 24px 0}.codeblock div[class^='highlight'],pre.literal-block div[class^='highlight'],.rst-content .literal-block div[class^='highlight'],div[class^='highlight'] div[class^='highlight']{border:none;background:none;margin:0}div[class^='highlight'] td.code{width:100%}.linenodiv pre{border-right:solid 1px #e6e9ea;margin:0;padding:12px 12px;font-family:"Incosolata","Consolata","Monaco",monospace;font-size:12px;line-height:1.5;color:#d9d9d9}div[class^='highlight'] pre{white-space:pre;margin:0;padding:12px 12px;font-family:"Incosolata","Consolata","Monaco",monospace;font-size:12px;line-height:1.5;display:block;overflow:auto;color:#404040}@media print{.codeblock,pre.literal-block,.rst-content .literal-block,.rst-content pre.literal-block,div[class^='highlight'],div[class^='highlight'] pre{white-space:pre-wrap}}.hll{background-color:#ffc;margin:0 -12px;padding:0 12px;display:block}.c{color:#998;font-style:italic}.err{color:#a61717;background-color:#e3d2d2}.k{font-weight:bold}.o{font-weight:bold}.cm{color:#998;font-style:italic}.cp{color:#999;font-weight:bold}.c1{color:#998;font-style:italic}.cs{color:#999;font-weight:bold;font-style:italic}.gd{color:#000;background-color:#fdd}.gd .x{color:#000;background-color:#faa}.ge{font-style:italic}.gr{color:#a00}.gh{color:#999}.gi{color:#000;background-color:#dfd}.gi .x{color:#000;background-color:#afa}.go{color:#888}.gp{color:#555}.gs{font-weight:bold}.gu{color:purple;font-weight:bold}.gt{color:#a00}.kc{font-weight:bold}.kd{font-weight:bold}.kn{font-weight:bold}.kp{font-weight:bold}.kr{font-weight:bold}.kt{color:#458;font-weight:bold}.m{color:#099}.s{color:#d14}.n{color:#333}.na{color:teal}.nb{color:#0086b3}.nc{color:#458;font-weight:bold}.no{color:teal}.ni{color:purple}.ne{color:#900;font-weight:bold}.nf{color:#900;font-weight:bold}.nn{color:#555}.nt{color:navy}.nv{color:teal}.ow{font-weight:bold}.w{color:#bbb}.mf{color:#099}.mh{color:#099}.mi{color:#099}.mo{color:#099}.sb{color:#d14}.sc{color:#d14}.sd{color:#d14}.s2{color:#d14}.se{color:#d14}.sh{color:#d14}.si{color:#d14}.sx{color:#d14}.sr{color:#009926}.s1{color:#d14}.ss{color:#990073}.bp{color:#999}.vc{color:teal}.vg{color:teal}.vi{color:teal}.il{color:#099}.gc{color:#999;background-color:#eaf2f5} + .wy-breadcrumbs li{display:inline-block} + .wy-breadcrumbs li.wy-breadcrumbs-aside { + float:right; + padding-left:5px; + font-size:0.8em; + } + + .wy-breadcrumbs li a{ + display:inline-block;padding:5px + } + + .wy-breadcrumbs li a:first-child{padding-left:0}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block} + + @media screen and (max-width: 480px) + {.wy-breadcrumbs-extra{display:none}.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:before,.wy-menu-horiz:after{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz ul,.wy-menu-horiz li{display:inline-block}.wy-menu-horiz li:hover{background:rgba(255,255,255,0.1)}.wy-menu-horiz li.divide-left{border-left:solid 1px #404040}.wy-menu-horiz li.divide-right{border-right:solid 1px #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical header{height:32px;display:inline-block;line-height:32px;padding:0 1.618em;display:block;font-weight:bold;text-transform:uppercase;font-size:80%;color:#2980b9;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:solid 1px #404040}.wy-menu-vertical li.divide-bottom{border-bottom:solid 1px #404040}.wy-menu-vertical li.current{background:#e3e3e3} + + .wy-menu-vertical li.current a{ + color:gray; + border-right:solid 1px #c9c9c9; + padding:0.4045em 2.427em + } + + .wy-menu-vertical li.current a:hover{background:#d6d6d6} + + .wy-menu-vertical li.on a { + color:#404040; + padding:0.4045em 1.618em; + font-weight:bold; + position:relative; + background:#fcfcfc; + border:none; + border-bottom:solid 1px #c9c9c9; + border-top:solid 1px #c9c9c9; + padding-left:1.618em -4px + } + + +.wy-menu-vertical li.current>a { + color:#404040; + padding:0.4045em 1.618em; + font-weight:bold; + position:relative; + background:#fcfcfc; + border:none; + border-bottom:solid 1px #c9c9c9; + border-top:solid 1px #c9c9c9; + padding-left:1.618em -4px + } + + .wy-menu-vertical li.on a:hover,.wy-menu-vertical li.current>a:hover{background:#fcfcfc} + .wy-menu-vertical li.toctree-l2.current>a{background:#c9c9c9;padding:0.4045em 2.427em}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical .local-toc li ul{display:block}.wy-menu-vertical li ul li a{margin-bottom:0;color:#b3b3b3;font-weight:normal}.wy-menu-vertical a{display:inline-block;line-height:18px;padding:0.4045em 1.618em;display:block;position:relative;font-size:90%;color:#b3b3b3}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff} + + .wy-side-nav-search {z-index:200; + background-color:#2980b9; + text-align:center; + /* padding:0.809em; */ + /* padding-top: 0.809em;*/ + padding-right: 0.809em; + padding-bottom: 0.809em; + padding-left: 0.809em; + display:block; + color:#fcfcfc; + margin-bottom:0.809em + } + + .wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4} + + + .wy-side-nav-search img{ + display:block; + margin:auto auto 0.809em auto; + /*height:45px;*/ + /*width:45px;*/ + width:200px; + /*background-color:#2980b9;*/ + padding:5px; + /*border-radius:100%*/ + } + + .wy-side-nav-search>a,.wy-side-nav-search .wy-dropdown>a { + color:#fcfcfc; + font-size:100%; + font-weight:bold; + display:inline-block; + padding-top: 4px; + padding-right: 6px; + /*padding-bottom: 4px;*/ + padding-left: 6px; + /* margin-bottom:0.809em */ + } + + .wy-side-nav-search>a:hover,.wy-side-nav-search .wy-dropdown>a:hover{background:rgba(255,255,255,0.1)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all 0.2s ease-in;-moz-transition:all 0.2s ease-in;transition:all 0.2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0} + + .wy-body-for-nav{ + /* background:left repeat-y #F1F0F0; */ + background:left repeat-y rgb(97, 6, 6); + /* background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoxOERBMTRGRDBFMUUxMUUzODUwMkJCOThDMEVFNURFMCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoxOERBMTRGRTBFMUUxMUUzODUwMkJCOThDMEVFNURFMCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjE4REExNEZCMEUxRTExRTM4NTAyQkI5OEMwRUU1REUwIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjE4REExNEZDMEUxRTExRTM4NTAyQkI5OEMwRUU1REUwIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+EwrlwAAAAA5JREFUeNpiMDU0BAgwAAE2AJgB9BnaAAAAAElFTkSuQmCC); */ + background-size:300px 1px + } + + .wy-grid-for-nav { + /* position:absolute; */ + position:relative; /* Make left column full length */ + width:100%; + height:100% + } + + .wy-nav-side{position:absolute;top:0;left:0;width:300px;overflow:hidden;min-height:100%;background:#343131;z-index:200} + + .wy-nav-top{ + display:none; + background:#2980b9; + color:#fff; + padding:0.4045em 0.809em; + position:relative; + line-height:50px; + text-align:center; + font-size:100%; + *zoom:1} + + .wy-nav-top:before,.wy-nav-top:after{display:table;content:""} + + .wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:bold} + + .wy-nav-top img{ + margin-right:12px; + /*height:45px; */ + /*width:45px;*/ + width:200px; + background-color:#2980b9; + padding:5px; + /*border-radius:100%*/ + } + + .wy-nav-top i{font-size:30px;float:left;cursor:pointer} + .wy-nav-content-wrap{ + margin-left:300px; + /* background:#fcfcfc; */ + min-height:100% + } + + .wy-nav-content{ + /* padding:1.618em 3.236em; */ + /* padding-top: 1.618em; */ + padding-right: 3.236em; + padding-bottom: 1.618em; + padding-left: 3.236em; + height:100%; + min-height: 100vh; /* ensure is always full height of browser window */ + max-width:800px; + /* margin:auto; */ + margin-left:0px; + background: #fcfcfc; + } + + .wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,0.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:#999}footer p{margin-bottom:12px}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:before,.rst-footer-buttons:after{display:table;content:""}.rst-footer-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:solid 1px #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:solid 1px #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:gray;font-size:90%} + + @media screen and (max-width: 768px){ + .wy-body-for-nav{background:#fcfcfc} + .wy-nav-top{display:block}.wy-nav-side{left:-300px} + .wy-nav-side.shift{width:85%;left:0} + .wy-nav-content-wrap{margin-left:0} + .wy-nav-content-wrap .wy-nav-content { + /* padding:1.618em */ + /* padding-top: 1.618em; */ + padding-right: 1.618em; + padding-bottom: 1.618em; + padding-left: 1.618em; + } + .wy-nav-content-wrap.shift{ + position:relative; /* position:fixed; */ + min-width:100%; + left:85%; + top:0;height:100%; + overflow:hidden + } + } + + @media screen and (min-width: 1400px) { + /* .wy-nav-content-wrap{background:rgba(0,0,0,0.05)} */ + .wy-nav-content{ + /* margin:0; */ + background:#fcfcfc} + } + + @media print{.wy-nav-side{display:none}.wy-nav-content-wrap{margin-left:0}}nav.stickynav{position:absolute/* previously fixed hamishw */ ;top:0}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;border-top:solid 10px #343131;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:before,.rst-versions .rst-current-version:after{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .icon{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:gray;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:solid 1px #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px}.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge .rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center} + + @media screen and (max-width: 768px){ + .rst-versions{width:85%;display:none}.rst-versions.shift{display:block}img{width:100%;height:auto}}.rst-content img{max-width:100%;height:auto !important}.rst-content div.figure{margin-bottom:24px}.rst-content div.figure.align-center{text-align:center}.rst-content .section>img{margin-bottom:24px}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content .note .last,.rst-content .attention .last,.rst-content .caution .last,.rst-content .danger .last,.rst-content .error .last,.rst-content .hint .last,.rst-content .important .last,.rst-content .tip .last,.rst-content .warning .last,.rst-content .seealso .last{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,0.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent !important;border-color:rgba(0,0,0,0.1) !important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha li{list-style:upper-alpha}.rst-content .section ol p,.rst-content .section ul p{margin-bottom:12px}.rst-content .line-block{margin-left:24px}.rst-content .topic-title{font-weight:bold;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0px 0px 24px 24px}.rst-content .align-left{float:left;margin:0px 24px 24px 0px}.rst-content .align-center{margin:auto;display:block}.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink{display:none;visibility:hidden;font-size:14px}.rst-content h1 .headerlink:after,.rst-content h2 .headerlink:after,.rst-content h3 .headerlink:after,.rst-content h4 .headerlink:after,.rst-content h5 .headerlink:after,.rst-content h6 .headerlink:after,.rst-content dl dt .headerlink:after{visibility:visible;content:"\f0c1";font-family:FontAwesome;display:inline-block}.rst-content h1:hover .headerlink,.rst-content h2:hover .headerlink,.rst-content h3:hover .headerlink,.rst-content h4:hover .headerlink,.rst-content h5:hover .headerlink,.rst-content h6:hover .headerlink,.rst-content dl dt:hover .headerlink{display:inline-block}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:solid 1px #e1e4e5}.rst-content .sidebar p,.rst-content .sidebar ul,.rst-content .sidebar dl{font-size:90%}.rst-content .sidebar .last{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:"Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif;font-weight:bold;background:#e1e4e5;padding:6px 12px;margin:-24px;margin-bottom:24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;display:inline-block;font-weight:bold;padding:0 6px}.rst-content .footnote-reference,.rst-content .citation-reference{vertical-align:super;font-size:90%}.rst-content table.docutils.citation,.rst-content table.docutils.footnote{background:none;border:none;color:#999}.rst-content table.docutils.citation td,.rst-content table.docutils.citation tr,.rst-content table.docutils.footnote td,.rst-content table.docutils.footnote tr{border:none;background-color:transparent !important;white-space:normal}.rst-content table.docutils.citation td.label,.rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}.rst-content table.field-list{border:none}.rst-content table.field-list td{border:none;padding-top:5px}.rst-content table.field-list td>strong{display:inline-block;margin-top:3px}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left;padding-left:0}.rst-content tt{color:#000}.rst-content tt big,.rst-content tt em{font-size:100% !important;line-height:normal}.rst-content tt .xref,a .rst-content tt{font-weight:bold}.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:bold}.rst-content dl p,.rst-content dl table,.rst-content dl ul,.rst-content dl ol{margin-bottom:12px !important}.rst-content dl dd{margin:0 0 12px 24px}.rst-content dl:not(.docutils){margin-bottom:24px}.rst-content dl:not(.docutils) dt{display:inline-block;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:solid 3px #6ab0de;padding:6px;position:relative}.rst-content dl:not(.docutils) dt:before{color:#6ab0de}.rst-content dl:not(.docutils) dt .headerlink{color:#404040;font-size:100% !important}.rst-content dl:not(.docutils) dl dt{margin-bottom:6px;border:none;border-left:solid 3px #ccc;background:#f0f0f0;color:gray}.rst-content dl:not(.docutils) dl dt .headerlink{color:#404040;font-size:100% !important}.rst-content dl:not(.docutils) dt:first-child{margin-top:0}.rst-content dl:not(.docutils) tt{font-weight:bold}.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) tt.descclassname{background-color:transparent;border:none;padding:0;font-size:100% !important}.rst-content dl:not(.docutils) tt.descname{font-weight:bold}.rst-content dl:not(.docutils) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:bold}.rst-content dl:not(.docutils) .property{display:inline-block;padding-right:8px}.rst-content .viewcode-link,.rst-content .viewcode-back{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right} + + @media screen and (max-width: 480px){ + .rst-content .sidebar{width:100%}}span[id*='MathJax-Span']{color:#404040} +/*! + * HamishW - some CSS for nav bar + */ + +.main-nav-bar { + display:block; + max-width: 1100px; + border-bottom: solid; + border-bottom-width: thin; + padding-bottom: 10px; + margin-bottom:20px; + padding-top: 10px; +} + + +#menu-options { + display: table; + /* background-color:#F8F8F8; */ + /*height: 87px;*/ + + width: 100%; +} + +#menu-options li { + display: table-cell; + /* padding-left: 5px; + padding-right: 5px; */ + padding-top: 10px; + padding-bottom: 10px; + width: 5.0%; /*(100 / numItems)% */ + text-align: center; + font-weight:bold; + /*background: #ddd;*/ + white-space: nowrap; +}​ + + + +.navlink-long { + display:inline-block; + vertical-align: top; + padding:5px; +} + +.navlink-short { + display:none; + vertical-align: top; + padding:5px; +} + + +.footer-nav-bar { + display:block; + background-color:#F8F8F8; + max-width: 1100px; + /*border-bottom: solid;*/ + padding-bottom: 10px; + margin-top:15px; + border-top:solid; + /* border-top-width:thin; */ +} + +.footer-options { +/* display:block; +width:inherit; +font-size:0.8em; +font-weight:normal; +*/ +display:block; +text-align:justify; +font-size:0.8em; +width:inherit; +} + +.footer-navlink-long { + display: inline-block; + vertical-align: top; + padding:5px; +} + +.footer-navlink-short { + display:none; + padding:5px; +} + +.footer-options:after { + content: ""; + width: 100%; + line-height:1px; + line-spacing:1px; + display: inline-block; + } + +.copyright-box { + border-top:solid; + border-top-width:thin; + margin-top:10px; + background-color:#F8F8F8; + padding-bottom:5px; + +} + +.copyright-box p { + font-size:0.8em; +} + + +/* HamishW - some CSS for the breadcrumb (make elements inline blocks) */ + + +.breadcrumb-box { + margin-top:10px; + font-size:0.8em; + } + +.breadcrumb-box-item{ + display: inline-block; + } + +/* indent third level item +*/ + +/* set background to selected headings as dark */ + + +.wy-menu-vertical li.toctree-l2.current>a, +.wy-menu-vertical li.toctree-l2.current li.toctree-l3.current>a, +.wy-menu-vertical li.toctree-l2.current li.toctree-l3.current li.toctree-l4.current>a +.wy-menu-vertical li.toctree-l2.current li.toctree-l3.current li.toctree-l4.current li.toctree-l5.current>a + { +background: #c9c9c9; +} + + +/* .wy-menu-vertical li.current>a .wy-menu-vertical .current>a */ +/* +.wy-menu-vertical li.current>a { +background: purple; +} +*/ + +.wy-menu-vertical li.toctree-l2 li.toctree-l3>a { +display:none; +} + +.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a { +display:block; +font-size:0.8em; +/*padding-top: 0.4045em;*/ +padding-right: 2.427em; +padding-bottom: 0.4045em; +padding-left: 4.25em; +width:100%; +} + + + + +.wy-menu-vertical li.toctree-l2 li.toctree-l3 li.toctree-l4>a { +display:none; +} + +.wy-menu-vertical li.toctree-l2.current li.toctree-l3.current li.toctree-l4>a { +/* +background: #F0EEEE; +background: purple; */ +display:block; +font-size:0.8em; +/*padding-top: 0.4045em;*/ +padding-right: 2.427em; +padding-bottom: 0.4045em; +padding-left: 5.0em; +width:100%; +} + + { +background: #c9c9c9; +} + +.wy-menu-vertical a[href^="#"] { +background:#F0EEEE; +} + +.grid-to-center-rtd-theme { + margin-left:0; + margin-right:auto; + max-width: 1100px; + } + +@media only screen and (min-width : 1100px){ + +.grid-to-center-rtd-theme { + margin-left:auto; + /* max-width: 1100px; */ + } + +} + +@media only screen +and (max-width : 480px) { +/* Styles */ + .navlink-long, .footer-navlink-long { + display:none; + } + + .navlink-short, .footer-navlink-short { + display:inline-block; + vertical-align: top;} + +} + +@media screen and (min-width: 480px) and (max-width: 768px) { + .navlink-long, .footer-navlink-long { + display:inline-block; + } + .navlink-short, .footer-navlink-short { + display:none; + } +} + diff --git a/site/source/_themes/emscripten_sphinx_rtd_theme/theme.conf b/site/source/_themes/emscripten_sphinx_rtd_theme/theme.conf index dcfbf8c2245fb..a72f4546798b4 100644 --- a/site/source/_themes/emscripten_sphinx_rtd_theme/theme.conf +++ b/site/source/_themes/emscripten_sphinx_rtd_theme/theme.conf @@ -5,4 +5,5 @@ stylesheet = css/theme.css [options] typekit_id = hiw1hhg analytics_id = -sticky_navigation = False +sticky_navigation = True + From f7bf23d8886b57523cb02a5bdc8e245bcedd79d2 Mon Sep 17 00:00:00 2001 From: hamishwillee Date: Fri, 25 Jul 2014 09:24:35 +1000 Subject: [PATCH 28/37] updates --- .../_themes/emscripten_sphinx_rtd_theme/footer.html | 4 ++-- site/source/docs/getting_started/bug_reports.rst | 2 +- site/source/docs/getting_started/downloads.rst | 8 +++----- site/source/docs/getting_started/emscripten_license.rst | 6 +++--- site/source/home_page_layout.html | 2 +- 5 files changed, 10 insertions(+), 12 deletions(-) diff --git a/site/source/_themes/emscripten_sphinx_rtd_theme/footer.html b/site/source/_themes/emscripten_sphinx_rtd_theme/footer.html index 0f422e5f108f9..2e7da66cf4396 100644 --- a/site/source/_themes/emscripten_sphinx_rtd_theme/footer.html +++ b/site/source/_themes/emscripten_sphinx_rtd_theme/footer.html @@ -23,8 +23,8 @@ {% set footer_links = [ - ('docs/site/bug_reports', 'Report Bug', 'Report Bug'), - ('docs/site/emscripten_license', 'Licensing', 'Licensing'), + ('docs/getting_started/bug_reports', 'Report Bug', 'Report Bug'), + ('docs/getting_started/emscripten_license', 'Licensing', 'Licensing'), ('docs/contributing/contributing', 'Contributing', 'Contributing'), ('https://groups.google.com/forum/#!forum/emscripten-discuss', 'Mailing list', 'Mailing list'), ('https://github.com/kripken/emscripten/wiki', 'Wiki', 'Wiki'), diff --git a/site/source/docs/getting_started/bug_reports.rst b/site/source/docs/getting_started/bug_reports.rst index 942fc7f950f73..7cc8f712ad07a 100644 --- a/site/source/docs/getting_started/bug_reports.rst +++ b/site/source/docs/getting_started/bug_reports.rst @@ -8,7 +8,7 @@ Please supply as much relevant information as possible, including: - original source code. - generated **.ll** and **.js** files (in a gist, pastebin, or any other method). -- environment information - including *emcc* and *clang* versions. +- environment information - including *emcc* and *clang* versions (as reported by ``emcc -v``). - error symptoms. - proposed solutions, ideally with a pull request. diff --git a/site/source/docs/getting_started/downloads.rst b/site/source/docs/getting_started/downloads.rst index cd08d9532626d..ee7cb2fca6680 100644 --- a/site/source/docs/getting_started/downloads.rst +++ b/site/source/docs/getting_started/downloads.rst @@ -5,15 +5,13 @@ Download and install (under-construction) .. note:: The *Emscripten SDK* provides the whole Emscripten toolchain (*Clang*, *Python*, *Node.js* and *Visual Studio* integration) in a single easy-to-install package, with integrated support for updating to newer Emscripten versions as they are released. +.. tip:: If you are :doc:`contributing <../contributing/contributing>` to Emscripten you should :doc:`set up Emscripten from source <../contributing/installing_from_source>`. + Downloads ============== -To get started with Emscripten development, grab one of the packages below: - -If you are :doc:`contributing <../contributing/contributing>` to Emscripten you can also set up Emscripten from source: see :doc:`../contributing/installing_from_source`. - - +To get started with Emscripten development, grab one of the SDK packages below: Windows diff --git a/site/source/docs/getting_started/emscripten_license.rst b/site/source/docs/getting_started/emscripten_license.rst index d8910665f9f66..df01939e3e8a2 100644 --- a/site/source/docs/getting_started/emscripten_license.rst +++ b/site/source/docs/getting_started/emscripten_license.rst @@ -1,6 +1,6 @@ -===================================== -Emscripten License (ready-for-review) -===================================== +=================== +Open Source License +=================== Emscripten is made available under two permissive open source licenses: the *MIT license* and the *University of Illinois/NCSA Open Source License*. diff --git a/site/source/home_page_layout.html b/site/source/home_page_layout.html index 0eaed3009584c..c5340550f4617 100644 --- a/site/source/home_page_layout.html +++ b/site/source/home_page_layout.html @@ -1,6 +1,6 @@

    Compile native code to the web

    -_images/Emscripten_logo_full.png +./_static/Emscripten_logo_full.png

    Emscripten takes LLVM bytecode generated from C/C++ and compiles it into asm.js (a highly optimisable strict subset of JavaScript). This can be run on the web without plugins.

    From 13c81b721edb47551066d518d93dcff7b3f80b0c Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 24 Jul 2014 16:45:25 -0700 Subject: [PATCH 29/37] add hamishwillee to AUTHORS --- AUTHORS | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS b/AUTHORS index 8b5a4a8bcb196..69dbcd2aea9d3 100644 --- a/AUTHORS +++ b/AUTHORS @@ -149,4 +149,5 @@ a license to everyone to use it as detailed in LICENSE.) * Jonas Platte * Sebastien Ronsse * Glenn R. Wichman +* Hamish Willee (copyright owned by Mozilla Foundation) From 394f308b6f54f4e9da2dd2f35148fe47a685a773 Mon Sep 17 00:00:00 2001 From: Lu Wang Date: Fri, 4 Jul 2014 01:03:41 -0700 Subject: [PATCH 30/37] support ASYNCIFY --- emcc | 4 + emscripten.py | 12 +++ src/library_async.js | 106 +++++++++++++++++++++++++ src/modules.js | 2 +- src/settings.js | 15 ++++ system/include/emscripten/emscripten.h | 10 +++ tests/test_core.py | 25 ++++++ 7 files changed, 173 insertions(+), 1 deletion(-) create mode 100644 src/library_async.js diff --git a/emcc b/emcc index a4b2197fe4f21..72380d6ae6ecb 100755 --- a/emcc +++ b/emcc @@ -1309,6 +1309,10 @@ try: fastcomp_opts += ['-enable-emscripten-cxx-exceptions'] if shared.Settings.DISABLE_EXCEPTION_CATCHING == 2: fastcomp_opts += ['-emscripten-cxx-exceptions-whitelist=' + ','.join(shared.Settings.EXCEPTION_CATCHING_WHITELIST or ['fake'])] + if shared.Settings.ASYNCIFY: + fastcomp_opts += ['-emscripten-asyncify'] + fastcomp_opts += ['-emscripten-asyncify-functions=' + ','.join(shared.Settings.ASYNCIFY_FUNCTIONS)] + fastcomp_opts += ['-emscripten-asyncify-whitelist=' + ','.join(shared.Settings.ASYNCIFY_WHITELIST)] if shared.Settings.ASM_JS: assert opt_level >= 1 or fastcomp, 'asm.js requires -O1 or above' diff --git a/emscripten.py b/emscripten.py index 3350536aeaa0f..a8a4dbe783f83 100755 --- a/emscripten.py +++ b/emscripten.py @@ -1076,6 +1076,14 @@ def keyfunc(other): basic_vars += ['___rand_seed'] asm_runtime_funcs = ['stackAlloc', 'stackSave', 'stackRestore', 'setThrew', 'setTempRet0', 'getTempRet0'] + + # See if we need ASYNCIFY functions + # We might not need them even if ASYNCIFY is enabled + need_asyncify = '_emscripten_alloc_async_context' in exported_implemented_functions + if need_asyncify: + basic_vars += ['___async', '___async_unwind', '___async_retval', '___async_cur_frame'] + asm_runtime_funcs += ['setAsync'] + # function tables function_tables = ['dynCall_' + table for table in last_forwarded_json['Functions']['tables']] function_tables_impls = [] @@ -1203,6 +1211,10 @@ def math_fix(g): top = top|0; STACKTOP = top; } +''' + (''' + function setAsync() { + ___async = 1; + }''' if need_asyncify else '') + ''' function setThrew(threw, value) { threw = threw|0; value = value|0; diff --git a/src/library_async.js b/src/library_async.js new file mode 100644 index 0000000000000..55360a51080fb --- /dev/null +++ b/src/library_async.js @@ -0,0 +1,106 @@ +/* + * The layout of normal and async stack frames + * + * --------------------- <-- saved sp for the current function + * + * --------------------- + * pointer to the previous frame <-- __async_cur_frame + * saved sp + * callback function <-- ctx, returned by alloc/reallloc, used by the program + * saved local variable1 + * saved local variable2 + * ... + * --------------------- <-- STACKTOP + * + */ + +mergeInto(LibraryManager.library, { + __async: 0, // whether a truly async function has been called + __async_unwind: 1, // whether to unwind the async stack frame + __async_retval: 'allocate(2, "i32", ALLOC_STATIC)', // store the return value for async functions + __async_cur_frame: 0, // address to the current frame, which stores previous frame, stack pointer and async context + +#if ASYNCIFY + emscripten_async_resume__deps: ['__async', '__async_unwind', '__async_cur_frame'], +#else + emscripten_async_resume__deps: [ function(){ throw 'ERROR: Please compile your program with -s ASYNCIFY=1 in order to use asynchronous operations like emscripten_sleep'; } ], +#endif + emscripten_async_resume__sig: 'v', + emscripten_async_resume__asm: true, + emscripten_async_resume: function() { + var callback = 0; + ___async = 0; + ___async_unwind = 1; + while (1) { + if (!___async_cur_frame) return; + callback = {{{ makeGetValueAsm('___async_cur_frame', 8, 'i32') }}}; + // the signature of callback is always vi + // the only argument is ctx + dynCall_vi(callback, (___async_cur_frame + 8)|0); + if (___async) return; // that was an async call + if (!___async_unwind) { + // keep the async stack + ___async_unwind = 1; + continue; + } + // unwind normal stack frame + stackRestore({{{ makeGetValueAsm('___async_cur_frame', 4, 'i32') }}}); + // pop the last async stack frame + ___async_cur_frame = {{{ makeGetValueAsm('___async_cur_frame', 0, 'i32') }}}; + } + }, + + emscripten_sleep__deps: ['emscripten_async_resume'], + emscripten_sleep: function(ms) { + asm.setAsync(); // tell the scheduler that we have a callback on hold + Browser.safeSetTimeout(_emscripten_async_resume, ms); + }, + + emscripten_alloc_async_context__deps: ['__async_cur_frame'], + emscripten_alloc_async_context__sig: 'iii', + emscripten_alloc_async_context__asm: true, + emscripten_alloc_async_context: function(len, sp) { + len = len|0; + sp = sp|0; + // len is the size of ctx + // we also need to store prev_frame, stack pointer before ctx + var new_frame = 0; new_frame = stackAlloc((len + 8)|0)|0; + // save sp + {{{ makeSetValueAsm('new_frame', 4, 'sp', 'i32') }}}; + // link the frame with previous one + {{{ makeSetValueAsm('new_frame', 0, '___async_cur_frame', 'i32') }}}; + ___async_cur_frame = new_frame; + return (___async_cur_frame + 8)|0; + }, + + emscripten_realloc_async_context__deps: ['__async_cur_frame'], + emscripten_realloc_async_context__sig: 'ii', + emscripten_realloc_async_context__asm: true, + emscripten_realloc_async_context: function(len) { + len = len|0; + // assuming that we have on the stacktop + stackRestore(___async_cur_frame); + return ((stackAlloc((len + 8)|0)|0) + 8)|0; + }, + + emscripten_free_async_context__deps: ['__async_cur_frame'], + emscripten_free_async_context__sig: 'vi', + emscripten_free_async_context__asm: true, + emscripten_free_async_context: function(ctx) { + // this function is called when a possibly async function turned out to be sync + // just undo a recent emscripten_alloc_async_context + ctx = ctx|0; +#if ASSERTIONS + assert(___async_cur_frame + 8 == ctx); +#endif + stackRestore(___async_cur_frame); + ___async_cur_frame = {{{ makeGetValueAsm('___async_cur_frame', 0, 'i32') }}}; + }, + + emscripten_check_async: true, + emscripten_do_not_unwind: true, + emscripten_do_not_unwind_async: true, + + emscripten_get_async_return_value_addr__deps: ['__async_retval'], + emscripten_get_async_return_value_addr: true +}); diff --git a/src/modules.js b/src/modules.js index 0c1d24bce6b4c..0554498fd10da 100644 --- a/src/modules.js +++ b/src/modules.js @@ -425,7 +425,7 @@ var LibraryManager = { load: function() { if (this.library) return; - var libraries = ['library.js', 'library_path.js', 'library_fs.js', 'library_idbfs.js', 'library_memfs.js', 'library_nodefs.js', 'library_sockfs.js', 'library_tty.js', 'library_browser.js', 'library_sdl.js', 'library_gl.js', 'library_glut.js', 'library_xlib.js', 'library_egl.js', 'library_gc.js', 'library_jansson.js', 'library_openal.js', 'library_glfw.js', 'library_uuid.js', 'library_glew.js', 'library_html5.js'].concat(additionalLibraries); + var libraries = ['library.js', 'library_path.js', 'library_fs.js', 'library_idbfs.js', 'library_memfs.js', 'library_nodefs.js', 'library_sockfs.js', 'library_tty.js', 'library_browser.js', 'library_sdl.js', 'library_gl.js', 'library_glut.js', 'library_xlib.js', 'library_egl.js', 'library_gc.js', 'library_jansson.js', 'library_openal.js', 'library_glfw.js', 'library_uuid.js', 'library_glew.js', 'library_html5.js', 'library_async.js'].concat(additionalLibraries); for (var i = 0; i < libraries.length; i++) { var filename = libraries[i]; var src = read(filename); diff --git a/src/settings.js b/src/settings.js index 943d092b7fba4..98670dffd21dd 100644 --- a/src/settings.js +++ b/src/settings.js @@ -292,6 +292,21 @@ var DISABLE_EXCEPTION_CATCHING = 0; // Disables generating code to actually catc var EXCEPTION_CATCHING_WHITELIST = []; // Enables catching exception in the listed functions only, if // DISABLE_EXCEPTION_CATCHING = 2 is set +// For more explanations of this option, please visit +// https://github.com/kripken/emscripten/wiki/Asyncify +var ASYNCIFY = 0; // Whether to enable asyncify transformation + // This allows to inject some async functions to the C code that appear to be sync + // e.g. emscripten_sleep +var ASYNCIFY_FUNCTIONS = ['emscripten_sleep']; // Functions that call any funcion in the list, directly or indirectly + // will be transfromed +var ASYNCIFY_WHITELIST = ['qsort', // Functions in this list are never considered async, even if they appear in ASYNCIFY_FUNCTIONS + 'trinkle', // In the asyncify transformation, any function that calls a function pointer is considered async + '__toread', // This whitelist is useful when a function is known to be sync + '__uflow', // currently this link contains some functions in libc + '__fwritex', + 'MUSL_vfprintf']; + + var EXECUTION_TIMEOUT = -1; // Throw an exception after X seconds - useful to debug infinite loops var CHECK_OVERFLOWS = 0; // Add code that checks for overflows in integer math operations. // There is currently not much to do to handle overflows if they occur. diff --git a/system/include/emscripten/emscripten.h b/system/include/emscripten/emscripten.h index a20e8d49cde21..e54ad9c891ab1 100644 --- a/system/include/emscripten/emscripten.h +++ b/system/include/emscripten/emscripten.h @@ -727,6 +727,16 @@ void emscripten_asm_const(const char *code); int emscripten_asm_const_int(const char *code, ...); double emscripten_asm_const_double(const char *code, ...); +/* + * Sleep for `ms` milliseconds + * This function should only be used when ASYNCIFY is enabled + */ +#if __EMSCRIPTEN__ +void emscripten_sleep(unsigned int ms); +#else +#define emscripten_sleep SDL_Delay +#endif + #ifdef __cplusplus } #endif diff --git a/tests/test_core.py b/tests/test_core.py index 20395b00a657e..5d09f7a58aab2 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -6815,6 +6815,31 @@ def test_64bit_return_value(self): assert "low = 5678" in out assert "high = 1234" in out + def test_asyncify(self): + if not Settings.ASM_JS: + return self.skip('asyncify requires asm.js') + if os.environ.get('EMCC_FAST_COMPILER') == '0': + return self.skip('asyncify requires fastcomp') + + src = r''' +#include +#include +void f(void *p) { + *(int*)p = 99; + printf("!"); +} +int main() { + int i = 0; + printf("Hello"); + emscripten_async_call(f, &i, 1); + printf("World"); + emscripten_sleep(100); + printf("%d\n", i); +} +''' + Settings.ASYNCIFY = 1; + self.do_run(src, 'HelloWorld!99'); + # Generate tests for everything def make_run(fullname, name=-1, compiler=-1, embetter=0, quantum_size=0, typed_arrays=0, emcc_args=None, env=None): From 24c46cf6a8058e22ef04732d00090122e05835de Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 24 Jul 2014 20:26:57 -0700 Subject: [PATCH 31/37] make test_asyncify node-only --- tests/test_core.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/test_core.py b/tests/test_core.py index 5d09f7a58aab2..b4ca7155b4cd2 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -6821,6 +6821,8 @@ def test_asyncify(self): if os.environ.get('EMCC_FAST_COMPILER') == '0': return self.skip('asyncify requires fastcomp') + self.banned_js_engines = [SPIDERMONKEY_ENGINE, V8_ENGINE] # needs setTimeout which only node has + src = r''' #include #include From f0f423cf46dc940eb743f07eb6e76333dc5e5373 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 24 Jul 2014 20:30:45 -0700 Subject: [PATCH 32/37] remove some unnecessary warnings --- src/settings.js | 5 ++++- tests/test_core.py | 1 - 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/settings.js b/src/settings.js index 98670dffd21dd..c2d96bcb7e465 100644 --- a/src/settings.js +++ b/src/settings.js @@ -364,7 +364,6 @@ var EXPORTED_FUNCTIONS = ['_main', '_malloc']; // have a main() function and want it to run, you must include it in this // list (as _main is by default in this value, and if you override it // without keeping it there, you are in effect removing it). -var ORIGINAL_EXPORTED_FUNCTIONS = []; // For internal use only var EXPORT_ALL = 0; // If true, we export all the symbols. Note that this does *not* affect LLVM, so it can // still eliminate functions as dead. This just exports them on the Module object. var EXPORT_BINDINGS = 0; // Export all bindings generator functions (prefixed with emscripten_bind_). This @@ -556,6 +555,10 @@ var DEBUG_TAGS_SHOWING = []; // metadata // legalizer +// For internal use only +var ORIGINAL_EXPORTED_FUNCTIONS = []; +var CORRECT_OVERFLOWS_LINES = []; + // The list of defines (C_DEFINES) was moved into struct_info.json in the same directory. // That file is automatically parsed by tools/gen_struct_info.py. // If you modify the headers, just clear your cache and emscripten libc should see diff --git a/tests/test_core.py b/tests/test_core.py index b4ca7155b4cd2..1dd0222ae9e7f 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -6917,7 +6917,6 @@ def setUp(self): Settings.INCLUDE_FULL_LIBRARY = 0 Settings.BUILD_AS_SHARED_LIB = 0 Settings.RUNTIME_LINKED_LIBS = [] - Settings.EMULATE_UNALIGNED_ACCESSES = int(Settings.USE_TYPED_ARRAYS == 2 and Building.LLVM_OPTS == 2) Settings.DOUBLE_MODE = 1 if Settings.USE_TYPED_ARRAYS and Building.LLVM_OPTS == 0 else 0 Settings.PRECISE_I64_MATH = 0 Settings.NAMED_GLOBALS = 0 if not embetter else 1 From 5d7fc3eda57faa7943bce270c1e8328ffa4bdcdc Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 25 Jul 2014 11:02:26 -0700 Subject: [PATCH 33/37] make emscripten_sleep error a runtime thing, to avoid build errors on including the full library --- src/library_async.js | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/library_async.js b/src/library_async.js index 55360a51080fb..ee3d554c1cea7 100644 --- a/src/library_async.js +++ b/src/library_async.js @@ -15,16 +15,13 @@ */ mergeInto(LibraryManager.library, { +#if ASYNCIFY __async: 0, // whether a truly async function has been called __async_unwind: 1, // whether to unwind the async stack frame __async_retval: 'allocate(2, "i32", ALLOC_STATIC)', // store the return value for async functions __async_cur_frame: 0, // address to the current frame, which stores previous frame, stack pointer and async context -#if ASYNCIFY emscripten_async_resume__deps: ['__async', '__async_unwind', '__async_cur_frame'], -#else - emscripten_async_resume__deps: [ function(){ throw 'ERROR: Please compile your program with -s ASYNCIFY=1 in order to use asynchronous operations like emscripten_sleep'; } ], -#endif emscripten_async_resume__sig: 'v', emscripten_async_resume__asm: true, emscripten_async_resume: function() { @@ -103,4 +100,10 @@ mergeInto(LibraryManager.library, { emscripten_get_async_return_value_addr__deps: ['__async_retval'], emscripten_get_async_return_value_addr: true +#else // ASYNCIFY + emscripten_sleep: function() { + throw 'Please compile your program with -s ASYNCIFY=1 in order to use asynchronous operations like emscripten_sleep'; + } +#endif }); + From 641625ca9108dcdf94e2b7c30718585d294082a9 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 25 Jul 2014 11:05:29 -0700 Subject: [PATCH 34/37] update test_static_link --- tests/test_other.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/test_other.py b/tests/test_other.py index 464af16d4d3c5..f05a8249fdeec 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -623,8 +623,7 @@ def test(name, header, main, side, expected, args=[], suffix='cpp', first=True): open(os.path.join(self.get_dir(), 'side.' + suffix), 'w').write(side) side = ['side.' + suffix] Popen([PYTHON, EMCC] + side + ['-o', 'side.js', '-s', 'SIDE_MODULE=1', '-O2'] + args).communicate() - # TODO: test with and without DISABLE_GL_EMULATION, check that file sizes change - Popen([PYTHON, EMCC] + main + ['-o', 'main.js', '-s', 'MAIN_MODULE=1', '-O2', '-s', 'DISABLE_GL_EMULATION=1'] + args).communicate() + Popen([PYTHON, EMCC] + main + ['-o', 'main.js', '-s', 'MAIN_MODULE=1', '-O2', '-s', 'LEGACY_GL_EMULATION=0'] + args).communicate() Popen([PYTHON, EMLINK, 'main.js', 'side.js', 'together.js'], stdout=PIPE).communicate() assert os.path.exists('together.js') for engine in JS_ENGINES: From aa217b4597f1502d0e1bf924eeefd179c10221e4 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 25 Jul 2014 11:07:58 -0700 Subject: [PATCH 35/37] avoid some warnings on missing settings --- src/settings.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/settings.js b/src/settings.js index c2d96bcb7e465..2c98062c7d865 100644 --- a/src/settings.js +++ b/src/settings.js @@ -558,6 +558,9 @@ var DEBUG_TAGS_SHOWING = []; // For internal use only var ORIGINAL_EXPORTED_FUNCTIONS = []; var CORRECT_OVERFLOWS_LINES = []; +var CORRECT_SIGNS_LINES = []; +var CORRECT_ROUNDINGS_LINES = []; +var SAFE_HEAP_LINES = []; // The list of defines (C_DEFINES) was moved into struct_info.json in the same directory. // That file is automatically parsed by tools/gen_struct_info.py. From 265b4207640a094c5b3ffdb189b4212d1ecd3b71 Mon Sep 17 00:00:00 2001 From: hamishwillee Date: Fri, 25 Jul 2014 19:48:03 +1000 Subject: [PATCH 36/37] add in wiki topics. Fix bug in conf.py --- .../emscripten_sphinx_rtd_theme/footer.html | 6 +- .../emscripten_sphinx_rtd_theme/layout.html | 6 +- site/source/conf.py | 8 +- .../docs/api_reference/Filesystem-API.rst | 715 ++++++++++++++++++ site/source/docs/api_reference/index.rst | 3 + site/source/docs/coding/Asm-pointer-casts.rst | 129 ++++ .../docs/coding/Browser-limitations.rst | 38 + .../coding/CodeGuidelinesAndLimitations.rst | 128 ++++ .../coding/Emscripten-browser-environment.rst | 137 ++++ .../source/docs/coding/Garbage_Collection.rst | 51 ++ .../Interacting-with-code.rst | 343 +++++++++ .../WebIDL-Binder.rst | 320 ++++++++ .../connecting_cpp_and_javascript/embind.rst | 616 +++++++++++++++ .../connecting_cpp_and_javascript/index.rst | 13 + .../docs/coding/debugging/Debugging.rst | 236 ++++++ site/source/docs/coding/debugging/index.rst | 9 + site/source/docs/coding/index.rst | 22 + .../EGL-Support-in-Emscripten.rst | 211 ++++++ .../OpenGL-support.rst | 101 +++ .../coding/multimedia_and_graphics/index.rst | 12 + .../docs/compiling/Building-Projects.rst | 327 ++++++++ .../docs/compiling/Code-Generation-Modes.rst | 187 +++++ .../Running-html-files-with-emrun.rst | 202 +++++ site/source/docs/compiling/index.rst | 17 + .../source/docs/contributing/LLVM-Backend.rst | 235 ++++++ .../contributing/LLVM-Types-in-JavaScript.rst | 63 ++ .../Getting-started-on-Mac-OS-X.rst | 153 ++++ .../Using-Emscripten-on-Windows.rst | 229 ++++++ .../building_from_source/index.rst | 14 + .../installing_from_source.rst | 2 + .../docs/contributing/developers_guide.rst | 125 ++- site/source/docs/contributing/index.rst | 7 +- site/source/docs/getting_started/Tutorial.rst | 311 ++++++++ .../source/docs/getting_started/downloads.rst | 2 +- site/source/docs/getting_started/index.rst | 9 +- site/source/docs/index.rst | 8 +- .../docs/introducing_emscripten/FAQ.rst | 486 ++++++++++++ .../Talks-and-Publications.rst | 51 ++ .../bug_reports.rst | 0 .../contact.rst | 0 .../emscripten_license.rst | 0 .../docs/introducing_emscripten/index.rst | 15 + .../release_notes.rst | 0 .../searching_site.rst | 0 .../docs/optimizing/Optimizing-Code.rst | 254 +++++++ .../optimizing/Optimizing-the-source-code.rst | 30 + site/source/docs/optimizing/index.rst | 16 + .../docs/packaging/Filesystem-Guide.rst | 133 ++++ site/source/docs/packaging/index.rst | 9 + site/source/docs/site/about.rst | 90 ++- site/source/get_wiki.py | 11 +- site/source/index.rst | 6 +- 52 files changed, 6066 insertions(+), 30 deletions(-) create mode 100644 site/source/docs/api_reference/Filesystem-API.rst create mode 100644 site/source/docs/coding/Asm-pointer-casts.rst create mode 100644 site/source/docs/coding/Browser-limitations.rst create mode 100644 site/source/docs/coding/CodeGuidelinesAndLimitations.rst create mode 100644 site/source/docs/coding/Emscripten-browser-environment.rst create mode 100644 site/source/docs/coding/Garbage_Collection.rst create mode 100644 site/source/docs/coding/connecting_cpp_and_javascript/Interacting-with-code.rst create mode 100644 site/source/docs/coding/connecting_cpp_and_javascript/WebIDL-Binder.rst create mode 100644 site/source/docs/coding/connecting_cpp_and_javascript/embind.rst create mode 100644 site/source/docs/coding/connecting_cpp_and_javascript/index.rst create mode 100644 site/source/docs/coding/debugging/Debugging.rst create mode 100644 site/source/docs/coding/debugging/index.rst create mode 100644 site/source/docs/coding/index.rst create mode 100644 site/source/docs/coding/multimedia_and_graphics/EGL-Support-in-Emscripten.rst create mode 100644 site/source/docs/coding/multimedia_and_graphics/OpenGL-support.rst create mode 100644 site/source/docs/coding/multimedia_and_graphics/index.rst create mode 100644 site/source/docs/compiling/Building-Projects.rst create mode 100644 site/source/docs/compiling/Code-Generation-Modes.rst create mode 100644 site/source/docs/compiling/Running-html-files-with-emrun.rst create mode 100644 site/source/docs/compiling/index.rst create mode 100644 site/source/docs/contributing/LLVM-Backend.rst create mode 100644 site/source/docs/contributing/LLVM-Types-in-JavaScript.rst create mode 100644 site/source/docs/contributing/building_from_source/Getting-started-on-Mac-OS-X.rst create mode 100644 site/source/docs/contributing/building_from_source/Using-Emscripten-on-Windows.rst create mode 100644 site/source/docs/contributing/building_from_source/index.rst rename site/source/docs/contributing/{ => building_from_source}/installing_from_source.rst (99%) create mode 100644 site/source/docs/getting_started/Tutorial.rst create mode 100644 site/source/docs/introducing_emscripten/FAQ.rst create mode 100644 site/source/docs/introducing_emscripten/Talks-and-Publications.rst rename site/source/docs/{getting_started => introducing_emscripten}/bug_reports.rst (100%) rename site/source/docs/{getting_started => introducing_emscripten}/contact.rst (100%) rename site/source/docs/{getting_started => introducing_emscripten}/emscripten_license.rst (100%) create mode 100644 site/source/docs/introducing_emscripten/index.rst rename site/source/docs/{getting_started => introducing_emscripten}/release_notes.rst (100%) rename site/source/docs/{getting_started => introducing_emscripten}/searching_site.rst (100%) create mode 100644 site/source/docs/optimizing/Optimizing-Code.rst create mode 100644 site/source/docs/optimizing/Optimizing-the-source-code.rst create mode 100644 site/source/docs/optimizing/index.rst create mode 100644 site/source/docs/packaging/Filesystem-Guide.rst create mode 100644 site/source/docs/packaging/index.rst diff --git a/site/source/_themes/emscripten_sphinx_rtd_theme/footer.html b/site/source/_themes/emscripten_sphinx_rtd_theme/footer.html index 2e7da66cf4396..668c9f8566ac0 100644 --- a/site/source/_themes/emscripten_sphinx_rtd_theme/footer.html +++ b/site/source/_themes/emscripten_sphinx_rtd_theme/footer.html @@ -23,8 +23,8 @@ {% set footer_links = [ - ('docs/getting_started/bug_reports', 'Report Bug', 'Report Bug'), - ('docs/getting_started/emscripten_license', 'Licensing', 'Licensing'), + ('docs/introducing_emscripten/bug_reports', 'Report Bug', 'Report Bug'), + ('docs/introducing_emscripten/emscripten_license', 'Licensing', 'Licensing'), ('docs/contributing/contributing', 'Contributing', 'Contributing'), ('https://groups.google.com/forum/#!forum/emscripten-discuss', 'Mailing list', 'Mailing list'), ('https://github.com/kripken/emscripten/wiki', 'Wiki', 'Wiki'), @@ -73,7 +73,7 @@
  • {%- if hasdoc('docs/site/about') %} - About site + About site {%- endif %}
  • diff --git a/site/source/_themes/emscripten_sphinx_rtd_theme/layout.html b/site/source/_themes/emscripten_sphinx_rtd_theme/layout.html index 175d7830c5153..86306b04710b3 100644 --- a/site/source/_themes/emscripten_sphinx_rtd_theme/layout.html +++ b/site/source/_themes/emscripten_sphinx_rtd_theme/layout.html @@ -7,7 +7,7 @@ {%- set titlesuffix = "" %} {%- endif %} - + @@ -129,11 +129,11 @@ {% set navigation_bar = [ ('docs/index', 'Docs', 'Documentation'), ('docs/getting_started/downloads', 'SDK', 'Downloads'), - ('docs/getting_started/contact', 'Help', 'Contact'), + ('docs/introducing_emscripten/contact', 'Help', 'Contact'), ('https://github.com/kripken/emscripten', 'Github', 'Github Project') ] -%} - +